diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/RootNavigationController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/RootNavigationController.java index 5ee3f217..6020e648 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/RootNavigationController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/RootNavigationController.java @@ -38,6 +38,8 @@ import org.floens.chan.ui.theme.ThemeHelper; import org.floens.chan.ui.toolbar.Toolbar; import org.floens.chan.utils.AndroidUtils; +import java.util.List; + import de.greenrobot.event.EventBus; import static org.floens.chan.utils.AndroidUtils.dp; @@ -79,6 +81,8 @@ public class RootNavigationController extends NavigationController implements Pi toolbar.setCallback(this); + updateBadge(); + AndroidUtils.waitForMeasure(drawer, new AndroidUtils.OnMeasuredCallback() { @Override public boolean onMeasured(View view) { @@ -181,20 +185,39 @@ public class RootNavigationController extends NavigationController implements Pi public void onEvent(WatchManager.PinAddedMessage message) { pinAdapter.onPinAdded(message.pin); drawerLayout.openDrawer(drawer); + updateBadge(); } public void onEvent(WatchManager.PinRemovedMessage message) { pinAdapter.onPinRemoved(message.pin); + updateBadge(); } public void onEvent(WatchManager.PinChangedMessage message) { pinAdapter.onPinChanged(recyclerView, message.pin); + updateBadge(); } private void setDrawerEnabled(boolean enabled) { drawerLayout.setDrawerLockMode(enabled ? DrawerLayout.LOCK_MODE_UNLOCKED : DrawerLayout.LOCK_MODE_LOCKED_CLOSED, Gravity.LEFT); } + private void updateBadge() { + List list = Chan.getWatchManager().getWatchingPins(); + int count = 0; + boolean color = false; + if (list.size() > 0) { + for (Pin p : list) { + count += p.getNewPostCount(); + if (p.getNewQuoteCount() > 0) { + color = true; + } + } + } + + toolbar.getArrowMenuDrawable().setBadge(count, color); + } + private boolean setDrawerWidth() { int width = Math.min(view.getWidth() - dp(56), dp(56) * 6); if (drawer.getWidth() != width) { diff --git a/Clover/app/src/main/java/org/floens/chan/ui/drawable/ArrowMenuDrawable.java b/Clover/app/src/main/java/org/floens/chan/ui/drawable/ArrowMenuDrawable.java index 0f863ad8..14bfa94d 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/drawable/ArrowMenuDrawable.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/drawable/ArrowMenuDrawable.java @@ -24,6 +24,7 @@ import android.graphics.Path; import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.drawable.Drawable; +import android.text.TextUtils; import static org.floens.chan.utils.AndroidUtils.dp; @@ -51,6 +52,11 @@ public class ArrowMenuDrawable extends Drawable { // The interpolated version of the original progress private float mProgress; + private String badgeText; + private boolean badgeRed = false; + private Paint badgePaint = new Paint(); + private Rect badgeTextBounds = new Rect(); + public ArrowMenuDrawable() { mPaint.setColor(0xffffffff); mPaint.setAntiAlias(true); @@ -67,10 +73,8 @@ public class ArrowMenuDrawable extends Drawable { mPaint.setStrokeWidth(mBarThickness); setProgress(0f); - } - boolean isLayoutRtl() { - return false; + badgePaint.setAntiAlias(true); } @Override @@ -120,6 +124,37 @@ public class ArrowMenuDrawable extends Drawable { canvas.drawPath(mPath, mPaint); canvas.restore(); + + // Draw a badge over the arrow/menu + if (badgeText != null) { + canvas.save(); + float badgeSize = mSize * 0.7f; + float badgeX = mSize - badgeSize / 2f; + float badgeY = badgeSize / 2f; + + if (badgeRed) { + badgePaint.setColor(0xddf44336); + } else { + badgePaint.setColor(0x89000000); + } + + canvas.drawCircle(badgeX, badgeY, badgeSize / 2f, badgePaint); + + float textSize; + if (badgeText.length() == 1) { + textSize = badgeSize * 0.7f; + } else if (badgeText.length() == 2) { + textSize = badgeSize * 0.6f; + } else { + textSize = badgeSize * 0.5f; + } + + badgePaint.setColor(0xffffffff); + badgePaint.setTextSize(textSize); + badgePaint.getTextBounds(badgeText, 0, badgeText.length(), badgeTextBounds); + canvas.drawText(badgeText, badgeX - badgeTextBounds.right / 2f, badgeY - badgeTextBounds.top / 2f, badgePaint); + canvas.restore(); + } } @Override @@ -152,13 +187,24 @@ public class ArrowMenuDrawable extends Drawable { } public void setProgress(float progress) { - if (progress == 1f) { - mVerticalMirror = true; - } else if (progress == 0f) { - mVerticalMirror = false; + if (progress != mProgress) { + if (progress == 1f) { + mVerticalMirror = true; + } else if (progress == 0f) { + mVerticalMirror = false; + } + mProgress = progress; + invalidateSelf(); + } + } + + public void setBadge(int count, boolean red) { + String text = count == 0 ? null : (count > 999 ? "1k+" : String.valueOf(count)); + if (badgeRed != red || !TextUtils.equals(text, badgeText)) { + badgeText = text; + badgeRed = red; + invalidateSelf(); } - mProgress = progress; - invalidateSelf(); } /** diff --git a/Clover/app/src/main/java/org/floens/chan/ui/toolbar/Toolbar.java b/Clover/app/src/main/java/org/floens/chan/ui/toolbar/Toolbar.java index f028b91f..fb919b13 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/toolbar/Toolbar.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/toolbar/Toolbar.java @@ -114,6 +114,10 @@ public class Toolbar extends LinearLayout implements View.OnClickListener, LoadV arrowMenuDrawable.setProgress(progress); } + public ArrowMenuDrawable getArrowMenuDrawable() { + return arrowMenuDrawable; + } + @Override public void onLoadViewRemoved(View view) { // TODO: this is kinda a hack