ThemePicker: "Apply theme" initial implementation

Use the current API to apply the packages for a given theme.
Still pending is storing the applied overlay packages, and applying the
default theme.

Bug: 120559294

Change-Id: I7c15f8ab94b1dec8576141eaecd4f3e059249fb1
diff --git a/res/layout/fragment_theme_picker.xml b/res/layout/fragment_theme_picker.xml
index 0fd4044..ef40334 100644
--- a/res/layout/fragment_theme_picker.xml
+++ b/res/layout/fragment_theme_picker.xml
@@ -46,6 +46,7 @@
             android:layout_width="match_parent"
             android:layout_height="wrap_content">
             <Button
+                android:id="@+id/apply_button"
                 style="@style/ActionPrimaryButton"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
diff --git a/res/values/strings.xml b/res/values/strings.xml
index d87a354..7d94334 100755
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -65,4 +65,7 @@
 
     <!--Title for a grid option, describing the number of columns and rows, eg: 4x4 [CHAR LIMIT=10] -->
     <string name="grid_title_pattern"><xliff:g name="num_cols" example="1">%1$d</xliff:g>x<xliff:g name="num_rows" example="1">%2$d</xliff:g></string>
+
+    <!-- Message shown when a theme has been applied successfully in the system [CHAR LIMIT=NONE] -->
+    <string name="applied_theme_msg">Theme has been applied</string>
 </resources>
diff --git a/src/com/android/customization/model/theme/DefaultThemeProvider.java b/src/com/android/customization/model/theme/DefaultThemeProvider.java
index 33e4ee4..4330ec6 100644
--- a/src/com/android/customization/model/theme/DefaultThemeProvider.java
+++ b/src/com/android/customization/model/theme/DefaultThemeProvider.java
@@ -163,7 +163,7 @@
      * the default theme.
      */
     private void addDefaultTheme() {
-        ThemeBundle.Builder builder = new Builder();
+        ThemeBundle.Builder builder = new Builder().asDefault();
         Resources system = Resources.getSystem();
 
         int titleId = mStubApkResources.getIdentifier(TITLE_PREFIX + DEFAULT_THEME_NAME,
diff --git a/src/com/android/customization/model/theme/ThemeBundle.java b/src/com/android/customization/model/theme/ThemeBundle.java
index 15b9efc..d95828b 100644
--- a/src/com/android/customization/model/theme/ThemeBundle.java
+++ b/src/com/android/customization/model/theme/ThemeBundle.java
@@ -36,6 +36,7 @@
 import com.android.wallpaper.R;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -45,13 +46,23 @@
  */
 public class ThemeBundle implements CustomizationOption {
 
-    static final String DEFAULT_PACKAGE = "DEFAULT_PACKAGE";
-
     private final String mTitle;
     private final PreviewInfo mPreviewInfo;
+    private final String mFontOverlayPackage;
+    private final String mColorOverlayPackage;
+    private final String mShapeOverlayPackage;
+    private final List<String> mIconOverlayPackages;
+    private final boolean mIsDefault;
 
-    private ThemeBundle(String title, PreviewInfo previewInfo) {
+    private ThemeBundle(String title, @Nullable String fontOverlayPackage,
+            @Nullable String colorOverlayPackage, @Nullable String shapeOverlayPackage,
+            List<String> iconOverlayPackages, boolean isDefault, PreviewInfo previewInfo) {
         mTitle = title;
+        mFontOverlayPackage = fontOverlayPackage;
+        mColorOverlayPackage = colorOverlayPackage;
+        mShapeOverlayPackage = shapeOverlayPackage;
+        mIconOverlayPackages = Collections.unmodifiableList(iconOverlayPackages);
+        mIsDefault = isDefault;
         mPreviewInfo = previewInfo;
     }
 
@@ -96,6 +107,26 @@
         return mPreviewInfo;
     }
 
+    String getFontOverlayPackage() {
+        return mFontOverlayPackage;
+    }
+
+    String getColorOverlayPackage() {
+        return mColorOverlayPackage;
+    }
+
+    String getShapeOverlayPackage() {
+        return mShapeOverlayPackage;
+    }
+
+    List<String> getIconOverlayPackages() {
+        return mIconOverlayPackages;
+    }
+
+    boolean isDefault() {
+        return mIsDefault;
+    }
+
     public static class PreviewInfo {
         public final Typeface bodyFontFamily;
         public final Typeface headlineFontFamily;
@@ -128,6 +159,7 @@
         @ColorInt private int mColorAccentDark;
         private List<Drawable> mIcons = new ArrayList<>();
         private String mShapePath;
+        private boolean mIsDefault;
         @DrawableRes private int mWallpaperDrawableResId;
 
         private String mFontOverlayPackage;
@@ -144,7 +176,8 @@
                 shapeDrawable.setIntrinsicHeight((int) PATH_SIZE);
                 shapeDrawable.setIntrinsicWidth((int) PATH_SIZE);
             }
-            return new ThemeBundle(mTitle,
+            return new ThemeBundle(mTitle, mFontOverlayPackage, mColorsPackage, mShapePackage,
+                    mIconPackages, mIsDefault,
                     new PreviewInfo(mBodyFontFamily, mHeadlineFontFamily, mColorAccentLight,
                             mColorAccentDark, mIcons, shapeDrawable, mWallpaperDrawableResId));
         }
@@ -203,5 +236,10 @@
             mShapePath = path;
             return this;
         }
+
+        public Builder asDefault() {
+            mIsDefault = true;
+            return this;
+        }
     }
 }
diff --git a/src/com/android/customization/model/theme/ThemeManager.java b/src/com/android/customization/model/theme/ThemeManager.java
index a07d808..e3e4119 100644
--- a/src/com/android/customization/model/theme/ThemeManager.java
+++ b/src/com/android/customization/model/theme/ThemeManager.java
@@ -15,14 +15,24 @@
  */
 package com.android.customization.model.theme;
 
+import android.content.Context;
+import android.content.om.OverlayManager;
+import android.os.UserHandle;
+
 import com.android.customization.model.CustomizationManager;
 
+import java.util.ArrayList;
+import java.util.List;
+
 public class ThemeManager implements CustomizationManager<ThemeBundle> {
 
     private final ThemeBundleProvider mProvider;
+    private final OverlayManager mOverlayManager;
+    private boolean useThemeWallpaper;
 
-    public ThemeManager(ThemeBundleProvider provider) {
+    public ThemeManager(ThemeBundleProvider provider, Context context) {
         mProvider = provider;
+        mOverlayManager = context.getSystemService(OverlayManager.class);
     }
 
     @Override
@@ -32,7 +42,19 @@
 
     @Override
     public void apply(ThemeBundle theme) {
-        // TODO(santie) implement
+        if (theme.isDefault()) {
+            // TODO: Clear secure setting
+        }
+        List<String> packages = new ArrayList<>();
+        packages.add(theme.getFontOverlayPackage());
+        packages.add(theme.getColorOverlayPackage());
+        packages.add(theme.getShapeOverlayPackage());
+        packages.addAll(theme.getIconOverlayPackages());
+        for (String packageName : packages) {
+            mOverlayManager.setEnabledExclusiveInCategory(packageName, UserHandle.myUserId());
+        }
+        // TODO: store to secure setting
+        // TODO: set wallpaper
     }
 
     @Override
diff --git a/src/com/android/customization/picker/CustomizationPickerActivity.java b/src/com/android/customization/picker/CustomizationPickerActivity.java
index ab60166..93339be 100644
--- a/src/com/android/customization/picker/CustomizationPickerActivity.java
+++ b/src/com/android/customization/picker/CustomizationPickerActivity.java
@@ -117,7 +117,7 @@
 
     private void initSections() {
         //Theme
-        ThemeManager themeManager = new ThemeManager(new DefaultThemeProvider(this));
+        ThemeManager themeManager = new ThemeManager(new DefaultThemeProvider(this), this);
         if (themeManager.isAvailable()) {
             mSections.put(R.id.nav_theme, new ThemeSection(R.id.nav_theme, themeManager));
         }
diff --git a/src/com/android/customization/picker/theme/ThemeFragment.java b/src/com/android/customization/picker/theme/ThemeFragment.java
index aad4542..3ca2a52 100644
--- a/src/com/android/customization/picker/theme/ThemeFragment.java
+++ b/src/com/android/customization/picker/theme/ThemeFragment.java
@@ -22,6 +22,7 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.TextView;
+import android.widget.Toast;
 
 import androidx.annotation.ColorInt;
 import androidx.annotation.DrawableRes;
@@ -69,6 +70,11 @@
         setUpToolbar(view);
         mPreviewPager = view.findViewById(R.id.theme_preview_pager);
         mOptionsContainer = view.findViewById(R.id.options_container);
+        view.findViewById(R.id.apply_button).setOnClickListener(v -> {
+            mThemeManager.apply(mSelectedTheme);
+            Toast.makeText(getContext(), R.string.applied_theme_msg, Toast.LENGTH_LONG).show();
+            getActivity().finish();
+        });
         setUpOptions();
 
         return view;