diff --git a/app/src/main/java/acr/browser/lightning/activity/BrowserActivity.java b/app/src/main/java/acr/browser/lightning/activity/BrowserActivity.java index 15b217a..b53b7a3 100644 --- a/app/src/main/java/acr/browser/lightning/activity/BrowserActivity.java +++ b/app/src/main/java/acr/browser/lightning/activity/BrowserActivity.java @@ -42,7 +42,6 @@ import android.support.v4.widget.DrawerLayout.DrawerListener; import android.support.v7.app.ActionBar; import android.support.v7.app.AlertDialog; import android.support.v7.graphics.Palette; -import android.support.v7.graphics.drawable.DrawerArrowDrawable; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.KeyEvent; @@ -60,7 +59,6 @@ import android.view.ViewGroup.LayoutParams; import android.view.Window; import android.view.WindowManager; import android.view.animation.Animation; -import android.view.animation.Animation.AnimationListener; import android.view.animation.DecelerateInterpolator; import android.view.animation.Transformation; import android.view.inputmethod.EditorInfo; @@ -82,6 +80,7 @@ import android.widget.TextView; import android.widget.TextView.OnEditorActionListener; import android.widget.VideoView; +import com.anthonycr.grant.PermissionsManager; import com.squareup.otto.Bus; import com.squareup.otto.Subscribe; @@ -110,13 +109,10 @@ import acr.browser.lightning.dialog.LightningDialogBuilder; import acr.browser.lightning.fragment.BookmarksFragment; import acr.browser.lightning.fragment.TabsFragment; import acr.browser.lightning.object.SearchAdapter; -import acr.browser.lightning.react.OnSubscribe; +import acr.browser.lightning.react.Observable; import acr.browser.lightning.react.Schedulers; import acr.browser.lightning.receiver.NetworkReceiver; - -import com.anthonycr.grant.PermissionsManager; - -import acr.browser.lightning.react.Observable; +import acr.browser.lightning.utils.DrawableUtils; import acr.browser.lightning.utils.ProxyUtils; import acr.browser.lightning.utils.ThemeUtils; import acr.browser.lightning.utils.UrlUtils; @@ -201,7 +197,6 @@ public abstract class BrowserActivity extends ThemableBrowserActivity implements private Bitmap mWebpageBitmap; private final ColorDrawable mBackground = new ColorDrawable(); private Drawable mDeleteIcon, mRefreshIcon, mClearIcon, mIcon; - private DrawerArrowDrawable mArrowDrawable; private BrowserPresenter mPresenter; @@ -319,9 +314,11 @@ public abstract class BrowserActivity extends ThemableBrowserActivity implements FrameLayout arrowButton = (FrameLayout) customView.findViewById(R.id.arrow_button); if (mShowTabsInDrawer) { // Use hardware acceleration for the animation - mArrowDrawable = new DrawerArrowDrawable(this); mArrowImage.setLayerType(View.LAYER_TYPE_HARDWARE, null); - mArrowImage.setImageDrawable(mArrowDrawable); + if (mArrowImage.getWidth() <= 0) { + mArrowImage.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); + } + updateTabNumber(0); } else { mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, mDrawerLeft); mArrowImage.setImageResource(R.drawable.ic_action_home); @@ -359,19 +356,8 @@ public abstract class BrowserActivity extends ThemableBrowserActivity implements WebIconDatabase.getInstance().open(getDir("icons", MODE_PRIVATE).getPath()); } - mTabsManager.initializeTabs(this, getIntent(), isIncognito()) - .subscribe(new OnSubscribe() { - @Override - public void onNext(Void item) {} - - @Override - public void onComplete() { - // At this point we always have at least a tab in the tab manager - showTab(mTabsManager.last()); - - mProxyUtils.checkForProxy(BrowserActivity.this); - } - }); + mPresenter.setupTabs(getIntent(), isIncognito()); + mProxyUtils.checkForProxy(BrowserActivity.this); } private class SearchListenerClass implements OnKeyListener, OnEditorActionListener, OnFocusChangeListener, OnTouchListener { @@ -434,55 +420,6 @@ public abstract class BrowserActivity extends ThemableBrowserActivity implements mIcon = mClearIcon; mSearch.setCompoundDrawables(null, null, mClearIcon, null); } - final Animation anim = new Animation() { - - @Override - protected void applyTransformation(float interpolatedTime, Transformation t) { - if (!hasFocus) { - mArrowDrawable.setProgress(1.0f - interpolatedTime); - } else { - mArrowDrawable.setProgress(interpolatedTime); - } - } - - @Override - public boolean willChangeBounds() { - return true; - } - - }; - anim.setDuration(300); - anim.setInterpolator(new DecelerateInterpolator()); - anim.setAnimationListener(new AnimationListener() { - - @Override - public void onAnimationStart(Animation animation) { - } - - @Override - public void onAnimationEnd(Animation animation) { - if (!hasFocus) { - mArrowDrawable.setProgress(0.0f); - } else { - mArrowDrawable.setProgress(1.0f); - } - } - - @Override - public void onAnimationRepeat(Animation animation) { - } - - }); - new Handler().postDelayed(new Runnable() { - - @Override - public void run() { - if (mArrowDrawable != null) { - mArrowImage.startAnimation(anim); - } - } - - }, 100); if (!hasFocus) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); @@ -1303,6 +1240,14 @@ public abstract class BrowserActivity extends ThemableBrowserActivity implements } } + @Override + public void updateTabNumber(int number) { + if (mArrowImage != null) { + mArrowImage.setImageBitmap(DrawableUtils.getRoundedNumberImage(number, Utils.dpToPx(24), + Utils.dpToPx(24), ThemeUtils.getIconThemeColor(this, mDarkTheme), Utils.dpToPx(2))); + } + } + @Override public void updateProgress(int n) { setIsLoading(n < 100); diff --git a/app/src/main/java/acr/browser/lightning/browser/BrowserPresenter.java b/app/src/main/java/acr/browser/lightning/browser/BrowserPresenter.java index 2a9c0d1..47dbd53 100644 --- a/app/src/main/java/acr/browser/lightning/browser/BrowserPresenter.java +++ b/app/src/main/java/acr/browser/lightning/browser/BrowserPresenter.java @@ -17,6 +17,7 @@ import acr.browser.lightning.app.BrowserApp; import acr.browser.lightning.bus.BrowserEvents; import acr.browser.lightning.constant.Constants; import acr.browser.lightning.preference.PreferenceManager; +import acr.browser.lightning.react.OnSubscribe; import acr.browser.lightning.utils.UrlUtils; import acr.browser.lightning.view.LightningView; @@ -45,6 +46,21 @@ public class BrowserPresenter { mIsIncognito = isIncognito; } + public void setupTabs(Intent intent, boolean isIncognito) { + mTabsModel.initializeTabs((Activity) mView, intent, isIncognito) + .subscribe(new OnSubscribe() { + @Override + public void onNext(Void item) {} + + @Override + public void onComplete() { + // At this point we always have at least a tab in the tab manager + tabChanged(mTabsModel.last()); + mView.updateTabNumber(mTabsModel.size()); + } + }); + } + private void onTabChanged(@Nullable LightningView newTab) { Log.d(TAG, "On tab changed"); if (newTab == null) { @@ -135,6 +151,8 @@ public class BrowserPresenter { mView.closeActivity(); } + mView.updateTabNumber(mTabsModel.size()); + Log.d(Constants.TAG, "deleted tab"); } @@ -195,6 +213,7 @@ public class BrowserPresenter { mView.showSnackbar(R.string.max_tabs); return false; } + mIsNewIntent = false; LightningView startingTab = mTabsModel.newTab((Activity) mView, url, mIsIncognito); if (mTabsModel.size() == 1) { @@ -214,6 +233,8 @@ public class BrowserPresenter { // } // }, 300); + mView.updateTabNumber(mTabsModel.size()); + return true; } diff --git a/app/src/main/java/acr/browser/lightning/browser/BrowserView.java b/app/src/main/java/acr/browser/lightning/browser/BrowserView.java index dc4fa55..ad642a6 100644 --- a/app/src/main/java/acr/browser/lightning/browser/BrowserView.java +++ b/app/src/main/java/acr/browser/lightning/browser/BrowserView.java @@ -15,6 +15,8 @@ public interface BrowserView { void updateProgress(int progress); + void updateTabNumber(int number); + void closeBrowser(); void closeActivity(); diff --git a/app/src/main/java/acr/browser/lightning/utils/DrawableUtils.java b/app/src/main/java/acr/browser/lightning/utils/DrawableUtils.java new file mode 100644 index 0000000..8864465 --- /dev/null +++ b/app/src/main/java/acr/browser/lightning/utils/DrawableUtils.java @@ -0,0 +1,52 @@ +package acr.browser.lightning.utils; + +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffXfermode; +import android.graphics.RectF; + +public class DrawableUtils { + + public static Bitmap getRoundedNumberImage(int number, int width, int height, int color, int thickness) { + String text; + + if (number > 99) { + text = "\u221E"; + } else { + text = String.valueOf(number); + } + + Bitmap image = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(image); + Paint paint = new Paint(); + paint.setColor(color); + paint.setTextSize(Utils.dpToPx(14)); + paint.setFakeBoldText(true); + paint.setAntiAlias(true); + paint.setTextAlign(Paint.Align.CENTER); + paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER)); + + int radius = Utils.dpToPx(2); + + RectF outer = new RectF(0, 0, canvas.getWidth(), canvas.getHeight()); + canvas.drawRoundRect(outer, radius, radius, paint); + + paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); + + radius--; + RectF inner = new RectF(thickness, thickness, canvas.getWidth() - thickness, canvas.getHeight() - thickness); + canvas.drawRoundRect(inner, radius, radius, paint); + + paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER)); + + int xPos = (canvas.getWidth() / 2); + int yPos = (int) ((canvas.getHeight() / 2) - ((paint.descent() + paint.ascent()) / 2)); + + canvas.drawText(String.valueOf(text), xPos, yPos, paint); + + return image; + } + +} diff --git a/app/src/main/java/acr/browser/lightning/utils/ThemeUtils.java b/app/src/main/java/acr/browser/lightning/utils/ThemeUtils.java index 3bcb5ff..8eceacd 100644 --- a/app/src/main/java/acr/browser/lightning/utils/ThemeUtils.java +++ b/app/src/main/java/acr/browser/lightning/utils/ThemeUtils.java @@ -54,6 +54,11 @@ public class ThemeUtils { return ContextCompat.getColor(context, R.color.icon_dark_theme); } + @ColorInt + public static int getIconThemeColor(@NonNull Context context, boolean dark) { + return (dark) ? getIconDarkThemeColor(context) : getIconLightThemeColor(context); + } + public static void themeImageView(@NonNull ImageView icon, @NonNull Context context, boolean dark) { int color = dark ? getIconDarkThemeColor(context) : getIconLightThemeColor(context); icon.setColorFilter(color, PorterDuff.Mode.SRC_IN); diff --git a/app/src/main/java/acr/browser/lightning/utils/Utils.java b/app/src/main/java/acr/browser/lightning/utils/Utils.java index 70458c1..bd55129 100644 --- a/app/src/main/java/acr/browser/lightning/utils/Utils.java +++ b/app/src/main/java/acr/browser/lightning/utils/Utils.java @@ -157,7 +157,7 @@ public final class Utils { * @param dp the number of density pixels to convert. * @return the number of pixels that the conversion generates. */ - public static int dpToPx(int dp) { + public static int dpToPx(float dp) { DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics(); return (int) (dp * metrics.density + 0.5f); }