From a96a2d8d60b56525875ce710a085c9360b93bcde Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Tue, 27 Sep 2016 17:51:11 -0700 Subject: [PATCH] Use DashboardFeatureProvider to load homepage tiles. Adding support to homepage category. Test: SettingsRoboTests for regression. Will write tests for new feature soon once we are set on the data structure. Bug: 31781480 Change-Id: I25fa367fecb643f17e23f0182df7585bf1fcdd02 --- AndroidManifest.xml | 18 +++++++ src/com/android/settings/Settings.java | 4 ++ src/com/android/settings/SettingsActivity.java | 41 ++++++++++++--- .../dashboard/DashboardFeatureProvider.java | 19 ++++++- .../dashboard/DashboardFeatureProviderImpl.java | 26 +++++++++- .../settings/dashboard/DashboardSummary.java | 59 ++++++++++++++++------ .../android/settings/dashboard/SummaryLoader.java | 51 +++++++++++++++---- .../android/settings/overlay/FeatureFactory.java | 2 +- .../settings/overlay/FeatureFactoryImpl.java | 4 +- 9 files changed, 185 insertions(+), 39 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 7034dc3580..fd22c635b2 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -2275,6 +2275,8 @@ + @@ -3030,6 +3032,22 @@ android:value="com.android.settings.deletionhelper.AutomaticStorageManagerSettings" /> + + + + + + + + + + categories = getDashboardCategories(); + List categories; + if (isDashboardFeatureEnabled()) { + categories = mDashboardFeatureProvider.getAllCategories(); + } else { + categories = getDashboardCategories(); + } + for (DashboardCategory category : categories) { for (Tile tile : category.tiles) { ComponentName component = tile.intent.getComponent(); @@ -1165,6 +1183,15 @@ public class SettingsActivity extends SettingsDrawerActivity } } + @Override + protected boolean isDashboardFeatureEnabled() { + if (mDashboardFeatureProvider == null) { + mDashboardFeatureProvider = + FeatureFactory.getFactory(this).getDashboardFeatureProvider(this); + } + return mDashboardFeatureProvider.isEnabled(); + } + // give subclasses access to the Next button public boolean hasNextButton() { return mNextButton != null; diff --git a/src/com/android/settings/dashboard/DashboardFeatureProvider.java b/src/com/android/settings/dashboard/DashboardFeatureProvider.java index e4976f5209..c09374832a 100644 --- a/src/com/android/settings/dashboard/DashboardFeatureProvider.java +++ b/src/com/android/settings/dashboard/DashboardFeatureProvider.java @@ -15,12 +15,27 @@ */ package com.android.settings.dashboard; -import android.content.Context; +import com.android.settingslib.drawer.DashboardCategory; + +import java.util.List; /** * FeatureProvider for dashboard (aka settings homepage). */ public interface DashboardFeatureProvider { - boolean shouldUseNewIALayout(Context context); + /** + * Whether or not this feature is enabled. + */ + boolean isEnabled(); + + /** + * Get tiles (wrapped in {@link DashboardCategory}) for homepage. + */ + DashboardCategory getTilesForHomepage(); + + /** + * Get all tiles, grouped by category. + */ + List getAllCategories(); } diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java index d07729a286..1f0b7f24d4 100644 --- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java +++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java @@ -18,14 +18,38 @@ package com.android.settings.dashboard; import android.content.Context; +import com.android.settingslib.drawer.CategoryKey; +import com.android.settingslib.drawer.CategoryManager; +import com.android.settingslib.drawer.DashboardCategory; + +import java.util.List; + /** * Impl for {@code DashboardFeatureProvider}. */ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider { + protected final Context mContext; + + private final CategoryManager mCategoryManager; + + public DashboardFeatureProviderImpl(Context context) { + mContext = context; + mCategoryManager = CategoryManager.get(); + } + @Override - public boolean shouldUseNewIALayout(Context context) { + public boolean isEnabled() { return false; } + @Override + public DashboardCategory getTilesForHomepage() { + return mCategoryManager.getTilesByCategory(mContext, CategoryKey.CATEGORY_HOMEPAGE); + } + + @Override + public List getAllCategories() { + return mCategoryManager.getCategories(mContext); + } } diff --git a/src/com/android/settings/dashboard/DashboardSummary.java b/src/com/android/settings/dashboard/DashboardSummary.java index fb8c959ed8..d63eb0f617 100644 --- a/src/com/android/settings/dashboard/DashboardSummary.java +++ b/src/com/android/settings/dashboard/DashboardSummary.java @@ -35,6 +35,7 @@ import com.android.settings.dashboard.conditional.Condition; import com.android.settings.dashboard.conditional.ConditionAdapterUtils; import com.android.settings.dashboard.conditional.ConditionManager; import com.android.settings.dashboard.conditional.FocusRecyclerView; +import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.SuggestionParser; import com.android.settingslib.drawer.DashboardCategory; import com.android.settingslib.drawer.SettingsDrawerActivity; @@ -50,7 +51,7 @@ public class DashboardSummary extends InstrumentedFragment private static final boolean DEBUG_TIMING = false; private static final String TAG = "DashboardSummary"; - public static final String[] INITIAL_ITEMS = new String[] { + public static final String[] INITIAL_ITEMS = new String[]{ Settings.WifiSettingsActivity.class.getName(), Settings.BluetoothSettingsActivity.class.getName(), Settings.DataUsageSummaryActivity.class.getName(), @@ -74,6 +75,7 @@ public class DashboardSummary extends InstrumentedFragment private SuggestionsChecks mSuggestionsChecks; private ArrayList mSuggestionsShownLogged; private ArrayList mSuggestionsHiddenLogged; + private DashboardFeatureProvider mDashboardFeatureProvider; @Override public int getMetricsCategory() { @@ -84,10 +86,18 @@ public class DashboardSummary extends InstrumentedFragment public void onCreate(Bundle savedInstanceState) { long startTime = System.currentTimeMillis(); super.onCreate(savedInstanceState); + final Activity activity = getActivity(); + mDashboardFeatureProvider = FeatureFactory.getFactory(activity) + .getDashboardFeatureProvider(activity); + + if (mDashboardFeatureProvider.isEnabled()) { + mSummaryLoader = new SummaryLoader(activity, + mDashboardFeatureProvider.getTilesForHomepage()); + } else { + mSummaryLoader = new SummaryLoader(activity, + ((SettingsActivity) getActivity()).getDashboardCategories()); + } - List categories = - ((SettingsActivity) getActivity()).getDashboardCategories(); - mSummaryLoader = new SummaryLoader(getActivity(), categories); Context context = getContext(); mConditionManager = ConditionManager.get(context, false); mSuggestionParser = new SuggestionParser(context, @@ -102,8 +112,10 @@ public class DashboardSummary extends InstrumentedFragment mSuggestionsHiddenLogged = savedInstanceState.getStringArrayList(EXTRA_SUGGESTION_HIDDEN_LOGGED); } - if (DEBUG_TIMING) Log.d(TAG, "onCreate took " + (System.currentTimeMillis() - startTime) - + " ms"); + if (DEBUG_TIMING) { + Log.d(TAG, "onCreate took " + (System.currentTimeMillis() - startTime) + + " ms"); + } } @Override @@ -124,8 +136,10 @@ public class DashboardSummary extends InstrumentedFragment mMetricsFeatureProvider.visible(getContext(), c.getMetricsConstant()); } } - if (DEBUG_TIMING) Log.d(TAG, "onResume took " + (System.currentTimeMillis() - startTime) - + " ms"); + if (DEBUG_TIMING) { + Log.d(TAG, "onResume took " + (System.currentTimeMillis() - startTime) + + " ms"); + } } @Override @@ -163,13 +177,15 @@ public class DashboardSummary extends InstrumentedFragment } else { mConditionManager.remListener(this); } - if (DEBUG_TIMING) Log.d(TAG, "onWindowFocusChanged took " - + (System.currentTimeMillis() - startTime) + " ms"); + if (DEBUG_TIMING) { + Log.d(TAG, "onWindowFocusChanged took " + + (System.currentTimeMillis() - startTime) + " ms"); + } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { + Bundle savedInstanceState) { return inflater.inflate(R.layout.dashboard, container, false); } @@ -204,8 +220,10 @@ public class DashboardSummary extends InstrumentedFragment mDashboard.setAdapter(mAdapter); mSummaryLoader.setAdapter(mAdapter); ConditionAdapterUtils.addDismiss(mDashboard); - if (DEBUG_TIMING) Log.d(TAG, "onViewCreated took " - + (System.currentTimeMillis() - startTime) + " ms"); + if (DEBUG_TIMING) { + Log.d(TAG, "onViewCreated took " + + (System.currentTimeMillis() - startTime) + " ms"); + } rebuildUI(); } @@ -259,9 +277,18 @@ public class DashboardSummary extends InstrumentedFragment if (activity == null) { return; } - List categories = - ((SettingsActivity) activity).getDashboardCategories(); - mAdapter.setCategoriesAndSuggestions(categories, tiles); + + if (mDashboardFeatureProvider.isEnabled()) { + // Temporary hack to wrap homepage category into a list. Soon we will create adapter + // API that takes a single category. + List categories = new ArrayList<>(); + categories.add(mDashboardFeatureProvider.getTilesForHomepage()); + mAdapter.setCategoriesAndSuggestions(categories, tiles); + } else { + mAdapter.setCategoriesAndSuggestions( + ((SettingsActivity) activity).getDashboardCategories(), tiles); + } + } } } diff --git a/src/com/android/settings/dashboard/SummaryLoader.java b/src/com/android/settings/dashboard/SummaryLoader.java index 4232852661..d55ec06f10 100644 --- a/src/com/android/settings/dashboard/SummaryLoader.java +++ b/src/com/android/settings/dashboard/SummaryLoader.java @@ -30,6 +30,7 @@ import android.util.ArraySet; import android.util.Log; import com.android.settings.SettingsActivity; +import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.drawer.DashboardCategory; import com.android.settingslib.drawer.SettingsDrawerActivity; import com.android.settingslib.drawer.Tile; @@ -72,6 +73,19 @@ public class SummaryLoader { } } + public SummaryLoader(Activity activity, DashboardCategory categories) { + mHandler = new Handler(); + mWorkerThread = new HandlerThread("SummaryLoader", Process.THREAD_PRIORITY_BACKGROUND); + mWorkerThread.start(); + mWorker = new Worker(mWorkerThread.getLooper()); + mActivity = activity; + List tiles = categories.tiles; + for (int j = 0; j < tiles.size(); j++) { + Tile tile = tiles.get(j); + mWorker.obtainMessage(Worker.MSG_GET_PROVIDER, tile).sendToTarget(); + } + } + public void release() { mWorkerThread.quitSafely(); // Make sure we aren't listening. @@ -83,7 +97,7 @@ public class SummaryLoader { } public void setSummary(SummaryProvider provider, final CharSequence summary) { - final ComponentName component= mSummaryMap.get(provider); + final ComponentName component = mSummaryMap.get(provider); mHandler.post(new Runnable() { @Override public void run() { @@ -95,9 +109,18 @@ public class SummaryLoader { } return; } - final List categories = - ((SettingsDrawerActivity) mActivity).getDashboardCategories(); - final Tile tile = getTileFromCategory(categories, component); + final Tile tile; + final DashboardFeatureProvider dashboardFeatureProvider = + FeatureFactory.getFactory(mActivity).getDashboardFeatureProvider(mActivity); + if (dashboardFeatureProvider.isEnabled()) { + tile = getTileFromCategory(dashboardFeatureProvider.getTilesForHomepage(), + component); + } else { + tile = getTileFromCategory( + ((SettingsDrawerActivity) mActivity).getDashboardCategories(), + component); + } + if (tile == null) { if (DEBUG) { Log.d(TAG, "Can't find tile for " + component); @@ -214,12 +237,20 @@ public class SummaryLoader { final int categorySize = categories.size(); for (int i = 0; i < categorySize; i++) { final DashboardCategory category = categories.get(i); - final int tileCount = category.tiles.size(); - for (int j = 0; j < tileCount; j++) { - final Tile tile = category.tiles.get(j); - if (component.equals(tile.intent.getComponent())) { - return tile; - } + final Tile tile = getTileFromCategory(category, component); + if (tile != null) { + return tile; + } + } + return null; + } + + private Tile getTileFromCategory(DashboardCategory category, ComponentName component) { + final int tileCount = category.tiles.size(); + for (int j = 0; j < tileCount; j++) { + final Tile tile = category.tiles.get(j); + if (component.equals(tile.intent.getComponent())) { + return tile; } } return null; diff --git a/src/com/android/settings/overlay/FeatureFactory.java b/src/com/android/settings/overlay/FeatureFactory.java index 7099b3f2d3..dd3e9c8339 100644 --- a/src/com/android/settings/overlay/FeatureFactory.java +++ b/src/com/android/settings/overlay/FeatureFactory.java @@ -68,7 +68,7 @@ public abstract class FeatureFactory { public abstract PowerUsageFeatureProvider getPowerUsageFeatureProvider(); - public abstract DashboardFeatureProvider getDashboardFeatureProvider(); + public abstract DashboardFeatureProvider getDashboardFeatureProvider(Context context); public static final class FactoryNotFoundException extends RuntimeException { public FactoryNotFoundException(Throwable throwable) { diff --git a/src/com/android/settings/overlay/FeatureFactoryImpl.java b/src/com/android/settings/overlay/FeatureFactoryImpl.java index 8f7136358e..65015c32e4 100644 --- a/src/com/android/settings/overlay/FeatureFactoryImpl.java +++ b/src/com/android/settings/overlay/FeatureFactoryImpl.java @@ -53,9 +53,9 @@ public final class FeatureFactoryImpl extends FeatureFactory { } @Override - public DashboardFeatureProvider getDashboardFeatureProvider() { + public DashboardFeatureProvider getDashboardFeatureProvider(Context context) { if (mDashboardFeatureProvider == null) { - mDashboardFeatureProvider = new DashboardFeatureProviderImpl(); + mDashboardFeatureProvider = new DashboardFeatureProviderImpl(context); } return mDashboardFeatureProvider; } -- 2.11.0