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);