Fix NPE when rotating the screen

Rather than pass the "Manager" when creating the fragment,
use the usual pattern of a "Host" interface to request for
it when attached to the Activity.

Bug: 120560581
Change-Id: Ia91d8566b3373ca4c3d7b06905fd9ebd9dbceb35
diff --git a/src/com/android/customization/picker/CustomizationPickerActivity.java b/src/com/android/customization/picker/CustomizationPickerActivity.java
index 93339be..357b755 100644
--- a/src/com/android/customization/picker/CustomizationPickerActivity.java
+++ b/src/com/android/customization/picker/CustomizationPickerActivity.java
@@ -40,8 +40,11 @@
 import com.android.customization.model.theme.ThemeBundle;
 import com.android.customization.model.theme.ThemeManager;
 import com.android.customization.picker.clock.ClockFragment;
+import com.android.customization.picker.clock.ClockFragment.ClockFragmentHost;
 import com.android.customization.picker.grid.GridFragment;
+import com.android.customization.picker.grid.GridFragment.GridFragmentHost;
 import com.android.customization.picker.theme.ThemeFragment;
+import com.android.customization.picker.theme.ThemeFragment.ThemeFragmentHost;
 import com.android.wallpaper.R;
 import com.android.wallpaper.model.WallpaperInfo;
 import com.android.wallpaper.module.DailyLoggingAlarmScheduler;
@@ -67,7 +70,7 @@
  *  Fragments providing customization options.
  */
 public class CustomizationPickerActivity extends FragmentActivity implements WallpapersUiContainer,
-        CategoryFragmentHost {
+        CategoryFragmentHost, ThemeFragmentHost, GridFragmentHost, ClockFragmentHost {
 
     private static final String TAG = "CustomizationPickerActivity";
 
@@ -213,6 +216,24 @@
         return mDelegate;
     }
 
+    @Override
+    public ClockManager getClockManager() {
+        CustomizationSection section = mSections.get(R.id.nav_clock);
+        return section == null ? null : (ClockManager) section.customizationManager;
+    }
+
+    @Override
+    public GridOptionsManager getGridOptionsManager() {
+        CustomizationSection section = mSections.get(R.id.nav_grid);
+        return section == null ? null : (GridOptionsManager) section.customizationManager;
+    }
+
+    @Override
+    public ThemeManager getThemeManager() {
+        CustomizationSection section = mSections.get(R.id.nav_theme);
+        return section == null ? null : (ThemeManager) section.customizationManager;
+    }
+
     /**
      * Represents a section of the Picker (eg "ThemeBundle", "Clock", etc).
      * There should be a concrete subclass per available section, providing the corresponding
@@ -224,11 +245,11 @@
          * IdRes used to identify this section in the BottomNavigationView menu.
          */
         @IdRes final int id;
-        protected final CustomizationManager<T> mCustomizationManager;
+        protected final CustomizationManager<T> customizationManager;
 
         private CustomizationSection(@IdRes int id, CustomizationManager<T> manager) {
             this.id = id;
-            this.mCustomizationManager = manager;
+            this.customizationManager = manager;
         }
 
         /**
@@ -276,8 +297,7 @@
         @Override
         Fragment getFragment() {
             if (mFragment == null) {
-                mFragment = ThemeFragment.newInstance(getString(R.string.theme_title),
-                        (ThemeManager) mCustomizationManager);
+                mFragment = ThemeFragment.newInstance(getString(R.string.theme_title));
             }
             return mFragment;
         }
@@ -294,8 +314,7 @@
         @Override
         Fragment getFragment() {
             if (mFragment == null) {
-                mFragment = GridFragment.newInstance(getString(R.string.grid_title),
-                        (GridOptionsManager) mCustomizationManager);
+                mFragment = GridFragment.newInstance(getString(R.string.grid_title));
             }
             return mFragment;
         }
@@ -312,8 +331,7 @@
         @Override
         Fragment getFragment() {
             if (mFragment == null) {
-                mFragment = ClockFragment.newInstance(getString(R.string.clock_title),
-                        (ClockManager) mCustomizationManager);
+                mFragment = ClockFragment.newInstance(getString(R.string.clock_title));
             }
             return mFragment;
         }
diff --git a/src/com/android/customization/picker/clock/ClockFragment.java b/src/com/android/customization/picker/clock/ClockFragment.java
index 3436c22..7a6afe2 100644
--- a/src/com/android/customization/picker/clock/ClockFragment.java
+++ b/src/com/android/customization/picker/clock/ClockFragment.java
@@ -36,11 +36,20 @@
 import com.android.wallpaper.R;
 import com.android.wallpaper.picker.ToolbarFragment;
 
+/**
+ * Fragment that contains the main UI for selecting and applying a Clockface.
+ */
 public class ClockFragment extends ToolbarFragment {
 
-    public static ClockFragment newInstance(CharSequence title, ClockManager manager) {
+    /**
+     * Interface to be implemented by an Activity hosting a {@link ClockFragment}
+     */
+    public interface ClockFragmentHost {
+        ClockManager getClockManager();
+    }
+
+    public static ClockFragment newInstance(CharSequence title) {
         ClockFragment fragment = new ClockFragment();
-        fragment.setManager(manager);
         fragment.setArguments(ToolbarFragment.createArguments(title));
         return fragment;
     }
@@ -51,6 +60,12 @@
     private ClockManager mClockManager;
     private PreviewPager mPreviewPager;
 
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        mClockManager = ((ClockFragmentHost) context).getClockManager();
+    }
+
     @Nullable
     @Override
     public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@@ -68,10 +83,6 @@
         return view;
     }
 
-    private void setManager(ClockManager manager) {
-        mClockManager = manager;
-    }
-
     private void createAdapter() {
         mPreviewPager.setAdapter(new ClockPreviewAdapter(getContext(), mSelectedOption));
     }
diff --git a/src/com/android/customization/picker/grid/GridFragment.java b/src/com/android/customization/picker/grid/GridFragment.java
index 20fa720..a38d268 100644
--- a/src/com/android/customization/picker/grid/GridFragment.java
+++ b/src/com/android/customization/picker/grid/GridFragment.java
@@ -16,6 +16,7 @@
 package com.android.customization.picker.grid;
 
 import android.app.Activity;
+import android.content.Context;
 import android.content.res.Resources;
 import android.graphics.drawable.BitmapDrawable;
 import android.net.Uri;
@@ -53,26 +54,37 @@
  */
 public class GridFragment extends ToolbarFragment {
 
+    /**
+     * Interface to be implemented by an Activity hosting a {@link GridFragment}
+     */
+    public interface GridFragmentHost {
+        GridOptionsManager getGridOptionsManager();
+    }
+
+    public static GridFragment newInstance(CharSequence title) {
+        GridFragment fragment = new GridFragment();
+        fragment.setArguments(ToolbarFragment.createArguments(title));
+        return fragment;
+    }
+
     private boolean mIsWallpaperInfoReady;
     private WallpaperInfo mHomeWallpaper;
     private float mScreenAspectRatio;
     private int mPageHeight;
     private int mPageWidth;
     private GridPreviewAdapter mAdapter;
-
-    public static GridFragment newInstance(CharSequence title, GridOptionsManager manager) {
-        GridFragment fragment = new GridFragment();
-        fragment.setManager(manager);
-        fragment.setArguments(ToolbarFragment.createArguments(title));
-        return fragment;
-    }
-
     private RecyclerView mOptionsContainer;
     private OptionSelectorController mOptionsController;
     private GridOptionsManager mGridManager;
     private GridOption mSelectedOption;
     private PreviewPager mPreviewPager;
 
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        mGridManager = ((GridFragmentHost) context).getGridOptionsManager();
+    }
+
     @Nullable
     @Override
     public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@@ -114,10 +126,6 @@
         return view;
     }
 
-    private void setManager(GridOptionsManager manager) {
-        mGridManager = manager;
-    }
-
     private void createAdapter() {
         mAdapter = new GridPreviewAdapter(mSelectedOption);
         mPreviewPager.setAdapter(mAdapter);
diff --git a/src/com/android/customization/picker/theme/ThemeFragment.java b/src/com/android/customization/picker/theme/ThemeFragment.java
index 3ca2a52..f89df60 100644
--- a/src/com/android/customization/picker/theme/ThemeFragment.java
+++ b/src/com/android/customization/picker/theme/ThemeFragment.java
@@ -47,9 +47,15 @@
  */
 public class ThemeFragment extends ToolbarFragment {
 
-    public static ThemeFragment newInstance(CharSequence title, ThemeManager manager) {
+    /**
+     * Interface to be implemented by an Activity hosting a {@link ThemeFragment}
+     */
+    public interface ThemeFragmentHost {
+        ThemeManager getThemeManager();
+    }
+
+    public static ThemeFragment newInstance(CharSequence title) {
         ThemeFragment fragment = new ThemeFragment();
-        fragment.setManager(manager);
         fragment.setArguments(ToolbarFragment.createArguments(title));
         return fragment;
     }
@@ -61,6 +67,12 @@
     private PagerAdapter mAdapter;
     private PreviewPager mPreviewPager;
 
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        mThemeManager = ((ThemeFragmentHost) context).getThemeManager();
+    }
+
     @Nullable
     @Override
     public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@@ -80,10 +92,6 @@
         return view;
     }
 
-    private void setManager(ThemeManager manager) {
-        mThemeManager = manager;
-    }
-
     private void createAdapter() {
         mAdapter = new ThemePreviewAdapter(getContext(), mSelectedTheme);
         mPreviewPager.setAdapter(mAdapter);