[ThemePicker 8/N] Load a default theme

Add a "Default" theme to the list of available themes in the picker.

Bug: 120559294

Change-Id: Ifb1fdbe9bb57969f3cbba6f47054a41f8197183f
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 5991826..a09afaa 100755
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -48,7 +48,9 @@
     <!-- Sample text used to show a preview of a selected font [CHAR LIMIT=3] -->
     <string name="theme_font_example">ABC</string>
 
-    <!-- Name of the card that previews a theme's font [CHAR LIMIT=20] -->
+    <!-- Name for the Android Theme that comes preset with the device [CHAR LIMIT=10]-->
+    <string name="default_theme_title">Default</string>
+
     <string name="preview_name_font">Font</string>
 
     <!-- Title text for previewing a font [CHAR LIMIT=30] -->
diff --git a/src/com/android/customization/model/theme/DefaultThemeProvider.java b/src/com/android/customization/model/theme/DefaultThemeProvider.java
index 25c7c72..0ab3bba 100644
--- a/src/com/android/customization/model/theme/DefaultThemeProvider.java
+++ b/src/com/android/customization/model/theme/DefaultThemeProvider.java
@@ -44,6 +44,8 @@
     private static final String FONT_PREFIX = "theme_overlay_font_";
     private static final String COLOR_PREFIX = "theme_overlay_color_";
 
+    private static final String DEFAULT_THEME_NAME= "default";
+
     private static final String ACCENT_COLOR_LIGHT_NAME = "accent_device_default_light";
     private static final String ACCENT_COLOR_DARK_NAME = "accent_device_default_dark";
     private static final String CONFIG_BODY_FONT_FAMILY = "config_bodyFontFamily";
@@ -61,6 +63,9 @@
     }
 
     private void init() {
+        if (TextUtils.isEmpty(mStubPackageName)) {
+            return;
+        }
         mStubApkResources = null;
         try {
             PackageManager pm = mContext.getPackageManager();
@@ -83,7 +88,7 @@
     public void fetch(OptionsFetchedListener<ThemeBundle> callback, boolean reload) {
         if (mThemes == null || reload) {
             mThemes = new ArrayList<>();
-            readThemesFromStub();
+            loadAll();
         }
 
         if(callback != null) {
@@ -91,12 +96,18 @@
         }
     }
 
-    private void readThemesFromStub() {
+    private void loadAll() {
+        addDefaultTheme();
+
         int themesListResId = mStubApkResources.getIdentifier(THEMES_ARRAY, "array",
                 mStubPackageName);
         String[] themeNames = mStubApkResources.getStringArray(themesListResId);
 
         for (String themeName : themeNames) {
+            // Default theme needs special treatment (see #addDefaultTheme())
+            if (DEFAULT_THEME_NAME.equals(themeName)) {
+                continue;
+            }
             ThemeBundle.Builder builder = new Builder();
             try {
                 builder.setTitle(mStubApkResources.getString(
@@ -133,6 +144,64 @@
         }
     }
 
+
+    /**
+     * Default theme requires different treatment: if there are overlay packages specified in the
+     * stub apk, we'll use those, otherwise we'll get the System default values. But we cannot skip
+     * the default theme.
+     */
+    private void addDefaultTheme() {
+        ThemeBundle.Builder builder = new Builder();
+        Resources system = Resources.getSystem();
+
+        int titleId = mStubApkResources.getIdentifier(TITLE_PREFIX + DEFAULT_THEME_NAME,
+                "string", mStubPackageName);
+        if (titleId > 0) {
+            builder.setTitle(mStubApkResources.getString(titleId));
+        } else {
+            builder.setTitle(mContext.getString(R.string.default_theme_title));
+        }
+
+        String colorOverlayPackage = getOverlayPackage(COLOR_PREFIX, DEFAULT_THEME_NAME);
+
+        try {
+            builder.setColorPackage(colorOverlayPackage)
+                    .setColorAccentLight(loadColor(ACCENT_COLOR_LIGHT_NAME, colorOverlayPackage))
+                    .setColorAccentDark(loadColor(ACCENT_COLOR_DARK_NAME, colorOverlayPackage));
+        } catch (NameNotFoundException | NotFoundException e) {
+            Log.i(TAG, "Didn't find color overlay for default theme, will use system default", e);
+            int colorAccentLight = system.getColor(
+                    system.getIdentifier(ACCENT_COLOR_LIGHT_NAME, "color", "android"), null);
+            builder.setColorAccentLight(colorAccentLight);
+
+            int colorAccentDark = system.getColor(
+                    system.getIdentifier(ACCENT_COLOR_DARK_NAME, "color", "android"), null);
+            builder.setColorAccentDark(colorAccentDark);
+            builder.setColorPackage(null);
+        }
+
+        String fontOverlayPackage = getOverlayPackage(FONT_PREFIX, DEFAULT_THEME_NAME);
+
+        try {
+            builder.setFontOverlayPackage(fontOverlayPackage)
+                    .setBodyFontFamily(loadTypeface(CONFIG_BODY_FONT_FAMILY,
+                            fontOverlayPackage))
+                    .setHeadlineFontFamily(loadTypeface(CONFIG_HEADLINE_FONT_FAMILY,
+                            fontOverlayPackage));
+        } catch (NameNotFoundException | NotFoundException e) {
+            Log.i(TAG, "Didn't find font overlay for default theme, will use system default", e);
+            String headlineFontFamily = system.getString(system.getIdentifier(
+                    CONFIG_HEADLINE_FONT_FAMILY,"string", "android"));
+            String bodyFontFamily = system.getString(system.getIdentifier(CONFIG_BODY_FONT_FAMILY,
+                    "string", "android"));
+            builder.setHeadlineFontFamily(Typeface.create(headlineFontFamily, Typeface.NORMAL))
+                    .setBodyFontFamily(Typeface.create(bodyFontFamily, Typeface.NORMAL));
+            builder.setFontOverlayPackage(null);
+        }
+
+        mThemes.add(builder.build());
+    }
+
     private String getOverlayPackage(String prefix, String themeName) {
         int overlayPackageResId = mStubApkResources.getIdentifier(prefix + themeName,
                 "string", mStubPackageName);
diff --git a/src/com/android/customization/model/theme/ThemeBundle.java b/src/com/android/customization/model/theme/ThemeBundle.java
index 9e6d2c5..6df7592 100644
--- a/src/com/android/customization/model/theme/ThemeBundle.java
+++ b/src/com/android/customization/model/theme/ThemeBundle.java
@@ -39,6 +39,8 @@
  */
 public class ThemeBundle implements CustomizationOption {
 
+    static final String DEFAULT_PACKAGE = "DEFAULT_PACKAGE";
+
     private final String mTitle;
     private final PreviewInfo mPreviewInfo;
 
diff --git a/src/com/android/customization/picker/theme/ThemeFragment.java b/src/com/android/customization/picker/theme/ThemeFragment.java
index 6cb03ff..2645576 100644
--- a/src/com/android/customization/picker/theme/ThemeFragment.java
+++ b/src/com/android/customization/picker/theme/ThemeFragment.java
@@ -102,6 +102,7 @@
             if (mSelectedTheme == null) {
                 mSelectedTheme = options.get(0);
             }
+            mOptionsController.setSelectedOption(mSelectedTheme);
         });
         createAdapter();
     }