Refresh time in style cover status bar
Listen for TIME_TICK events and update the time in the cover
to match the device's.
Fixes: 133438775
Change-Id: I5608ad462aadc2d92507341d6954ebae53b3c08a
diff --git a/src/com/android/customization/picker/TimeTicker.java b/src/com/android/customization/picker/TimeTicker.java
new file mode 100644
index 0000000..2cf5dbf
--- /dev/null
+++ b/src/com/android/customization/picker/TimeTicker.java
@@ -0,0 +1,41 @@
+package com.android.customization.picker;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+
+import androidx.annotation.Nullable;
+
+/**
+ * BroadcastReceiver that can notify a listener when the system time (minutes) changes.
+ * Use {@link #registerNewReceiver(Context, TimeListener)} to create a new instance that will be
+ * automatically registered using the given Context.
+ */
+public class TimeTicker extends BroadcastReceiver {
+
+ public interface TimeListener {
+ void onCurrentTimeChanged();
+ }
+
+ public static TimeTicker registerNewReceiver(Context context, TimeListener listener) {
+ TimeTicker receiver = new TimeTicker(listener);
+ // Register broadcast receiver for time tick
+ final IntentFilter filter = new IntentFilter(Intent.ACTION_TIME_TICK);
+ context.registerReceiver(receiver, filter);
+ return receiver;
+ }
+
+ @Nullable private TimeListener mListener;
+
+ private TimeTicker(TimeListener listener) {
+ mListener = listener;
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (mListener != null) {
+ mListener.onCurrentTimeChanged();
+ }
+ }
+}
diff --git a/src/com/android/customization/picker/theme/CustomThemeNameFragment.java b/src/com/android/customization/picker/theme/CustomThemeNameFragment.java
index f29c976..5f7381a 100644
--- a/src/com/android/customization/picker/theme/CustomThemeNameFragment.java
+++ b/src/com/android/customization/picker/theme/CustomThemeNameFragment.java
@@ -36,6 +36,7 @@
import androidx.cardview.widget.CardView;
import com.android.customization.model.theme.ThemeBundle.PreviewInfo;
+import com.android.customization.picker.TimeTicker;
import com.android.customization.picker.theme.ThemePreviewPage.ThemeCoverPage;
import com.android.wallpaper.R;
import com.android.wallpaper.asset.Asset;
@@ -76,7 +77,7 @@
private Asset mWallpaperAsset;
private ThemeCoverPage mCoverPage;
-
+ private TimeTicker mTicker;
private EditText mNameEditor;
@Override
@@ -108,6 +109,27 @@
return view;
}
+ @Override
+ public void onResume() {
+ super.onResume();
+ mTicker = TimeTicker.registerNewReceiver(getContext(), this::updateTime);
+ updateTime();
+ }
+
+ private void updateTime() {
+ if (mCoverPage != null) {
+ mCoverPage.updateTime();
+ }
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ if (getContext() != null) {
+ getContext().unregisterReceiver(mTicker);
+ }
+ }
+
private void bindCover(CardView card) {
Context context = getContext();
PreviewInfo previewInfo = mCustomThemeManager.buildCustomThemePreviewInfo(context);
diff --git a/src/com/android/customization/picker/theme/ThemeFragment.java b/src/com/android/customization/picker/theme/ThemeFragment.java
index 4494347..227dae5 100644
--- a/src/com/android/customization/picker/theme/ThemeFragment.java
+++ b/src/com/android/customization/picker/theme/ThemeFragment.java
@@ -17,6 +17,7 @@
import android.app.Activity;
import android.app.WallpaperColors;
+import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.res.ColorStateList;
@@ -51,7 +52,9 @@
import com.android.customization.model.theme.custom.CustomTheme;
import com.android.customization.module.ThemesUserEventLogger;
import com.android.customization.picker.BasePreviewAdapter;
+import com.android.customization.picker.TimeTicker;
import com.android.customization.picker.theme.ThemePreviewPage.ThemeCoverPage;
+import com.android.customization.picker.theme.ThemePreviewPage.TimeContainer;
import com.android.customization.widget.OptionSelectorController;
import com.android.customization.widget.PreviewPager;
import com.android.wallpaper.R;
@@ -94,6 +97,7 @@
private boolean mUseMyWallpaper;
private WallpaperInfo mCurrentHomeWallpaper;
private CurrentWallpaperInfoFactory mCurrentWallpaperFactory;
+ private TimeTicker mTicker;
@Override
public void onAttach(Context context) {
@@ -120,7 +124,6 @@
});
mUseMyWallpaperButton = view.findViewById(R.id.use_my_wallpaper);
mUseMyWallpaperButton.setOnCheckedChangeListener(this::onUseMyWallpaperCheckChanged);
-
setUpOptions(savedInstanceState);
return view;
@@ -148,7 +151,23 @@
@Override
public void onResume() {
super.onResume();
+ mTicker = TimeTicker.registerNewReceiver(getContext(), this::updateTime);
reloadWallpaper();
+ updateTime();
+ }
+
+ private void updateTime() {
+ if (mAdapter != null) {
+ mAdapter.updateTime();
+ }
+ }
+
+ @Override
+ public void onPause() {
+ super.onPause();
+ if (getContext() != null) {
+ getContext().unregisterReceiver(mTicker);
+ }
}
@Override
@@ -466,6 +485,14 @@
}
}
+ public void updateTime() {
+ for (ThemePreviewPage page : mPages) {
+ if (page instanceof TimeContainer) {
+ ((TimeContainer)page).updateTime();
+ }
+ }
+ }
+
private static class WallpaperPreviewLayoutListener implements OnLayoutChangeListener {
private final ThemeBundle mTheme;
private final PreviewInfo mPreviewInfo;
diff --git a/src/com/android/customization/picker/theme/ThemePreviewPage.java b/src/com/android/customization/picker/theme/ThemePreviewPage.java
index abecbd7..224a8f8 100644
--- a/src/com/android/customization/picker/theme/ThemePreviewPage.java
+++ b/src/com/android/customization/picker/theme/ThemePreviewPage.java
@@ -30,6 +30,11 @@
import java.util.TimeZone;
abstract class ThemePreviewPage extends PreviewPage {
+
+ public interface TimeContainer {
+ void updateTime();
+ }
+
@StringRes
final int nameResId;
@DrawableRes
@@ -71,7 +76,7 @@
protected abstract void bindBody(boolean forceRebind);
- static class ThemeCoverPage extends ThemePreviewPage {
+ static class ThemeCoverPage extends ThemePreviewPage implements TimeContainer {
/**
* Maps which icon from ResourceConstants#ICONS_FOR_PREVIEW to use for each icon in the
@@ -219,6 +224,14 @@
}
}
+ @Override
+ public void updateTime() {
+ if (card != null) {
+ ((TextView) card.findViewById(R.id.theme_preview_clock)).setText(
+ getFormattedTime());
+ }
+ }
+
private boolean useRoundedQSB(int cornerRadius) {
return cornerRadius >=
card.getResources().getDimensionPixelSize(R.dimen.roundCornerThreshold);