Merge "Increase style_info_description char limit" into ub-launcher3-master
diff --git a/src/com/android/customization/picker/CustomizationPickerActivity.java b/src/com/android/customization/picker/CustomizationPickerActivity.java
index 2ee114b..0ce8ac1 100644
--- a/src/com/android/customization/picker/CustomizationPickerActivity.java
+++ b/src/com/android/customization/picker/CustomizationPickerActivity.java
@@ -126,10 +126,19 @@
 
         setContentView(R.layout.activity_customization_picker_main);
         setUpBottomNavView();
+        mBottomActionBar = findViewById(R.id.bottom_actionbar);
+        mBottomActionBar.addVisibilityChangeListener(
+                isBottomActionBarVisible -> {
+                    boolean isBottomNavVisible = mBottomNav.getVisibility() == View.VISIBLE;
+                    // Switch the visibility of BottomNav if visibility of BottomActionBar and
+                    // BottomNav are same.
+                    if (isBottomActionBarVisible == isBottomNavVisible) {
+                        mBottomNav.setVisibility(isBottomActionBarVisible
+                                ? View.GONE : View.VISIBLE);
+                    }
+                });
 
-        FragmentManager fm = getSupportFragmentManager();
-        Fragment fragment = fm.findFragmentById(R.id.fragment_container);
-
+        Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
         if (fragment == null) {
             // App launch specific logic: log the "app launched" event and set up daily logging.
             mUserEventLogger.logAppLaunched();
@@ -143,10 +152,6 @@
                     WALLPAPER_FOCUS.equals(getIntent().getStringExtra(WALLPAPER_FLAVOR_EXTRA))
                             ? R.id.nav_wallpaper : R.id.nav_theme);
         }
-
-        mBottomActionBar = findViewById(R.id.bottom_actionbar);
-        mBottomActionBar.addVisibilityChangeListener(
-                isVisible -> mBottomNav.setVisibility(isVisible ? View.GONE : View.VISIBLE));
     }
 
     @Override
diff --git a/src/com/android/customization/picker/WallpaperPreviewer.java b/src/com/android/customization/picker/WallpaperPreviewer.java
index 4993a56..9e56cec 100644
--- a/src/com/android/customization/picker/WallpaperPreviewer.java
+++ b/src/com/android/customization/picker/WallpaperPreviewer.java
@@ -176,14 +176,12 @@
                 }
 
                 // Load wallpaper color for static wallpaper.
-                WallpaperColorsLoader.getWallpaperColors(
-                        mActivity,
-                        mWallpaper.getThumbAsset(mActivity),
-                        colors -> {
-                            if (mWallpaperColorsListener != null) {
-                                mWallpaperColorsListener.onWallpaperColorsChanged(colors);
-                            }
-                        });
+                if (mWallpaperColorsListener != null) {
+                    WallpaperColorsLoader.getWallpaperColors(
+                            mActivity,
+                            mWallpaper.getThumbAsset(mActivity),
+                            mWallpaperColorsListener::onWallpaperColorsChanged);
+                }
             }
         }
     }
diff --git a/src/com/android/customization/picker/grid/GridFragment.java b/src/com/android/customization/picker/grid/GridFragment.java
index dbce456..98c7515 100644
--- a/src/com/android/customization/picker/grid/GridFragment.java
+++ b/src/com/android/customization/picker/grid/GridFragment.java
@@ -39,6 +39,7 @@
 
 import com.android.customization.model.CustomizationManager.Callback;
 import com.android.customization.model.CustomizationManager.OptionsFetchedListener;
+import com.android.customization.model.CustomizationOption;
 import com.android.customization.model.grid.GridOption;
 import com.android.customization.model.grid.GridOptionsManager;
 import com.android.customization.module.ThemesUserEventLogger;
@@ -63,8 +64,8 @@
 
     private static final int FULL_PREVIEW_REQUEST_CODE = 1000;
     private static final String KEY_STATE_SELECTED_OPTION = "GridFragment.selectedOption";
-    private static final String KEY_STATE_BOTTOM_ACTION_BAR_VISIBILITY =
-            "GridFragment.bottomActionBarVisibility";
+    private static final String KEY_STATE_BOTTOM_ACTION_BAR_VISIBLE =
+            "GridFragment.bottomActionBarVisible";
 
     private static final String TAG = "GridFragment";
 
@@ -177,8 +178,7 @@
             outState.putParcelable(KEY_STATE_SELECTED_OPTION, mSelectedOption);
         }
         if (mBottomActionBar != null) {
-            outState.putBoolean(KEY_STATE_BOTTOM_ACTION_BAR_VISIBILITY,
-                    mBottomActionBar.isVisible());
+            outState.putBoolean(KEY_STATE_BOTTOM_ACTION_BAR_VISIBLE, mBottomActionBar.isVisible());
         }
     }
 
@@ -211,14 +211,9 @@
             public void onOptionsLoaded(List<GridOption> options) {
                 mLoading.hide();
                 mOptionsController = new OptionSelectorController<>(mOptionsContainer, options);
-                mOptionsController.addListener(selected -> {
-                    mSelectedOption = (GridOption) selected;
-                    mBottomActionBar.show();
-                    mEventLogger.logGridSelected(mSelectedOption);
-                    mGridOptionPreviewer.setGridOption(mSelectedOption);
-                });
                 mOptionsController.initOptions(mGridManager);
 
+                // Find the selected Grid option.
                 GridOption previouslySelectedOption = null;
                 if (savedInstanceState != null) {
                     previouslySelectedOption = findEquivalent(
@@ -227,15 +222,15 @@
                 mSelectedOption = previouslySelectedOption != null
                         ? previouslySelectedOption
                         : getActiveOption(options);
-                // Will trigger selected listener.
+
                 mOptionsController.setSelectedOption(mSelectedOption);
-                boolean bottomActionBarVisibility = savedInstanceState != null
-                        && savedInstanceState.getBoolean(KEY_STATE_BOTTOM_ACTION_BAR_VISIBILITY);
-                if (bottomActionBarVisibility) {
+                onOptionSelected(mSelectedOption);
+                restoreBottomActionBarVisibility(savedInstanceState);
+
+                mOptionsController.addListener(selectedOption -> {
+                    onOptionSelected(selectedOption);
                     mBottomActionBar.show();
-                } else {
-                    mBottomActionBar.hide();
-                }
+                });
             }
 
             @Override
@@ -275,6 +270,22 @@
         mError.setVisibility(View.VISIBLE);
     }
 
+    private void onOptionSelected(CustomizationOption selectedOption) {
+        mSelectedOption = (GridOption) selectedOption;
+        mEventLogger.logGridSelected(mSelectedOption);
+        mGridOptionPreviewer.setGridOption(mSelectedOption);
+    }
+
+    private void restoreBottomActionBarVisibility(@Nullable Bundle savedInstanceState) {
+        boolean isBottomActionBarVisible = savedInstanceState != null
+                && savedInstanceState.getBoolean(KEY_STATE_BOTTOM_ACTION_BAR_VISIBLE);
+        if (isBottomActionBarVisible) {
+            mBottomActionBar.show();
+        } else {
+            mBottomActionBar.hide();
+        }
+    }
+
     private void showFullPreview() {
         Bundle bundle = new Bundle();
         bundle.putParcelable(EXTRA_WALLPAPER_INFO, mHomeWallpaper);
diff --git a/src/com/android/customization/picker/theme/ThemeFragment.java b/src/com/android/customization/picker/theme/ThemeFragment.java
index 077b733..4b77214 100644
--- a/src/com/android/customization/picker/theme/ThemeFragment.java
+++ b/src/com/android/customization/picker/theme/ThemeFragment.java
@@ -43,6 +43,7 @@
 
 import com.android.customization.model.CustomizationManager.Callback;
 import com.android.customization.model.CustomizationManager.OptionsFetchedListener;
+import com.android.customization.model.CustomizationOption;
 import com.android.customization.model.theme.ThemeBundle;
 import com.android.customization.model.theme.ThemeManager;
 import com.android.customization.model.theme.custom.CustomTheme;
@@ -68,8 +69,8 @@
 
     private static final String TAG = "ThemeFragment";
     private static final String KEY_SELECTED_THEME = "ThemeFragment.SelectedThemeBundle";
-    private static final String KEY_STATE_BOTTOM_ACTION_BAR_VISIBILITY =
-            "ThemeFragment.bottomActionBarVisibility";
+    private static final String KEY_STATE_BOTTOM_ACTION_BAR_VISIBLE =
+            "ThemeFragment.bottomActionBarVisible";
     private static final int FULL_PREVIEW_REQUEST_CODE = 1000;
 
     /**
@@ -221,8 +222,7 @@
             outState.putString(KEY_SELECTED_THEME, mSelectedTheme.getSerializedPackages());
         }
         if (mBottomActionBar != null) {
-            outState.putBoolean(KEY_STATE_BOTTOM_ACTION_BAR_VISIBILITY,
-                    mBottomActionBar.isVisible());
+            outState.putBoolean(KEY_STATE_BOTTOM_ACTION_BAR_VISIBLE, mBottomActionBar.isVisible());
         }
     }
 
@@ -275,30 +275,10 @@
             @Override
             public void onOptionsLoaded(List<ThemeBundle> options) {
                 mOptionsController = new OptionSelectorController<>(mOptionsContainer, options);
-                mOptionsController.addListener(selected -> {
-                    mLoading.hide();
-                    if (selected instanceof CustomTheme && !((CustomTheme) selected).isDefined()) {
-                        navigateToCustomTheme((CustomTheme) selected);
-                    } else {
-                        mSelectedTheme = (ThemeBundle) selected;
-                        mSelectedTheme.setOverrideThemeWallpaper(mCurrentHomeWallpaper);
-                        mEventLogger.logThemeSelected(mSelectedTheme,
-                                selected instanceof CustomTheme);
-                        mThemeOptionPreviewer.setPreviewInfo(mSelectedTheme.getPreviewInfo());
-                        if (mThemeInfoView != null && mSelectedTheme != null) {
-                            mThemeInfoView.populateThemeInfo(mSelectedTheme);
-                        }
-
-                        if (selected instanceof CustomTheme) {
-                            mBottomActionBar.showActionsOnly(INFORMATION, CUSTOMIZE, APPLY);
-                        } else {
-                            mBottomActionBar.showActionsOnly(INFORMATION, APPLY);
-                        }
-                        mBottomActionBar.show();
-                    }
-                });
                 mOptionsController.initOptions(mThemeManager);
 
+                // Find out the selected theme option.
+                // 1. Find previously selected theme.
                 String previouslySelected = savedInstanceState != null
                         ? savedInstanceState.getString(KEY_SELECTED_THEME) : null;
                 ThemeBundle previouslySelectedTheme = null;
@@ -312,22 +292,26 @@
                         activeTheme = theme;
                     }
                 }
+                // 2. Use active theme if no previously selected theme.
                 mSelectedTheme = previouslySelectedTheme != null
                         ? previouslySelectedTheme
                         : activeTheme;
-
+                // 3. Select the default theme if there is no matching custom enabled theme.
                 if (mSelectedTheme == null) {
-                    // Select the default theme if there is no matching custom enabled theme
                     mSelectedTheme = findDefaultThemeBundle(options);
                 }
+
                 mOptionsController.setSelectedOption(mSelectedTheme);
-                boolean bottomActionBarVisibility = savedInstanceState != null
-                        && savedInstanceState.getBoolean(KEY_STATE_BOTTOM_ACTION_BAR_VISIBILITY);
-                if (bottomActionBarVisibility) {
-                    mBottomActionBar.show();
-                } else {
-                    mBottomActionBar.hide();
-                }
+                onOptionSelected(mSelectedTheme);
+                restoreBottomActionBarVisibility(savedInstanceState);
+
+                mOptionsController.addListener(selectedOption -> {
+                    onOptionSelected(selectedOption);
+                    if (!isAddCustomThemeOption(selectedOption)) {
+                        mBottomActionBar.show();
+                    }
+                });
+                mLoading.hide();
             }
             @Override
             public void onError(@Nullable Throwable throwable) {
@@ -370,6 +354,41 @@
         return null;
     }
 
+    private void onOptionSelected(CustomizationOption selectedOption) {
+        if (isAddCustomThemeOption(selectedOption)) {
+            navigateToCustomTheme((CustomTheme) selectedOption);
+        } else {
+            mSelectedTheme = (ThemeBundle) selectedOption;
+            mSelectedTheme.setOverrideThemeWallpaper(mCurrentHomeWallpaper);
+            mEventLogger.logThemeSelected(mSelectedTheme,
+                    selectedOption instanceof CustomTheme);
+            mThemeOptionPreviewer.setPreviewInfo(mSelectedTheme.getPreviewInfo());
+            if (mThemeInfoView != null && mSelectedTheme != null) {
+                mThemeInfoView.populateThemeInfo(mSelectedTheme);
+            }
+
+            if (selectedOption instanceof CustomTheme) {
+                mBottomActionBar.showActionsOnly(INFORMATION, CUSTOMIZE, APPLY);
+            } else {
+                mBottomActionBar.showActionsOnly(INFORMATION, APPLY);
+            }
+        }
+    }
+
+    private void restoreBottomActionBarVisibility(@Nullable Bundle savedInstanceState) {
+        boolean isBottomActionBarVisible = savedInstanceState != null
+                && savedInstanceState.getBoolean(KEY_STATE_BOTTOM_ACTION_BAR_VISIBLE);
+        if (isBottomActionBarVisible) {
+            mBottomActionBar.show();
+        } else {
+            mBottomActionBar.hide();
+        }
+    }
+
+    private boolean isAddCustomThemeOption(CustomizationOption option) {
+        return option instanceof CustomTheme && !((CustomTheme) option).isDefined();
+    }
+
     private void navigateToCustomTheme(CustomTheme themeToEdit) {
         Intent intent = new Intent(getActivity(), CustomThemeActivity.class);
         intent.putExtra(CustomThemeActivity.EXTRA_THEME_TITLE, themeToEdit.getTitle());