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