Merge "Use DashboardFeatureProvider to load homepage tiles."

This commit is contained in:
TreeHugger Robot
2016-09-29 21:19:30 +00:00
committed by Android (Google) Code Review
9 changed files with 185 additions and 39 deletions

View File

@@ -2275,6 +2275,8 @@
</intent-filter> </intent-filter>
<meta-data android:name="com.android.settings.category" <meta-data android:name="com.android.settings.category"
android:value="com.android.settings.category.device" /> android:value="com.android.settings.category.device" />
<meta-data android:name="com.android.settings.iacategory"
android:value="com.android.settings.category.homepage" />
<meta-data android:name="com.android.settings.FRAGMENT_CLASS" <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
android:value="com.android.settings.fuelgauge.PowerUsageSummary" /> android:value="com.android.settings.fuelgauge.PowerUsageSummary" />
</activity> </activity>
@@ -3030,6 +3032,22 @@
android:value="com.android.settings.deletionhelper.AutomaticStorageManagerSettings" /> android:value="com.android.settings.deletionhelper.AutomaticStorageManagerSettings" />
</activity> </activity>
<!-- Information architecture host activities -->
<activity
android:name=".Settings$SupportActivity"
android:label="@string/page_tab_title_support"
android:icon="@drawable/ic_help_24dp">
<intent-filter android:priority="-1">
<action android:name="com.android.settings.action.SETTINGS" />
</intent-filter>
<meta-data android:name="com.android.settings.iacategory"
android:value="com.android.settings.category.homepage" />
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
android:value="com.android.settings.dashboard.SupportFragment"/>
<meta-data android:name="com.android.settings.summary"
android:resource="@string/help_label" />
</activity>
<service <service
android:name=".SettingsDumpService" android:name=".SettingsDumpService"
android:exported="true" android:exported="true"

View File

@@ -159,4 +159,8 @@ public class Settings extends SettingsActivity {
public static class DeviceSettings extends SettingsActivity { /* empty */ } public static class DeviceSettings extends SettingsActivity { /* empty */ }
public static class PersonalSettings extends SettingsActivity { /* empty */ } public static class PersonalSettings extends SettingsActivity { /* empty */ }
public static class SystemSettings extends SettingsActivity { /* empty */ } public static class SystemSettings extends SettingsActivity { /* empty */ }
// Top level categories for new IA
public static class SupportActivity extends SettingsActivity {}
} }

View File

@@ -55,6 +55,7 @@ import com.android.settings.Settings.WifiSettingsActivity;
import com.android.settings.accessibility.AccessibilitySettings; import com.android.settings.accessibility.AccessibilitySettings;
import com.android.settings.accessibility.AccessibilitySettingsForSetupWizard; import com.android.settings.accessibility.AccessibilitySettingsForSetupWizard;
import com.android.settings.accessibility.CaptionPropertiesFragment; import com.android.settings.accessibility.CaptionPropertiesFragment;
import com.android.settings.accessibility.ToggleDaltonizerPreferenceFragment;
import com.android.settings.accounts.AccountSettings; import com.android.settings.accounts.AccountSettings;
import com.android.settings.accounts.AccountSyncSettings; import com.android.settings.accounts.AccountSyncSettings;
import com.android.settings.accounts.ChooseAccountActivity; import com.android.settings.accounts.ChooseAccountActivity;
@@ -74,7 +75,10 @@ import com.android.settings.applications.WriteSettingsDetails;
import com.android.settings.bluetooth.BluetoothSettings; import com.android.settings.bluetooth.BluetoothSettings;
import com.android.settings.core.instrumentation.SharedPreferencesLogger; import com.android.settings.core.instrumentation.SharedPreferencesLogger;
import com.android.settings.dashboard.DashboardContainerFragment; import com.android.settings.dashboard.DashboardContainerFragment;
import com.android.settings.dashboard.DashboardFeatureProvider;
import com.android.settings.dashboard.DashboardSummary;
import com.android.settings.dashboard.SearchResultsSummary; import com.android.settings.dashboard.SearchResultsSummary;
import com.android.settings.dashboard.SupportFragment;
import com.android.settings.datausage.DataUsageSummary; import com.android.settings.datausage.DataUsageSummary;
import com.android.settings.deletionhelper.AutomaticStorageManagerSettings; import com.android.settings.deletionhelper.AutomaticStorageManagerSettings;
import com.android.settings.deviceinfo.ImeiInformation; import com.android.settings.deviceinfo.ImeiInformation;
@@ -113,6 +117,7 @@ import com.android.settings.notification.ZenModePrioritySettings;
import com.android.settings.notification.ZenModeScheduleRuleSettings; import com.android.settings.notification.ZenModeScheduleRuleSettings;
import com.android.settings.notification.ZenModeSettings; import com.android.settings.notification.ZenModeSettings;
import com.android.settings.notification.ZenModeVisualInterruptionSettings; import com.android.settings.notification.ZenModeVisualInterruptionSettings;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.print.PrintJobSettingsFragment; import com.android.settings.print.PrintJobSettingsFragment;
import com.android.settings.print.PrintSettingsFragment; import com.android.settings.print.PrintSettingsFragment;
import com.android.settings.qstile.DevelopmentTiles; import com.android.settings.qstile.DevelopmentTiles;
@@ -294,7 +299,7 @@ public class SettingsActivity extends SettingsDrawerActivity
AccessibilitySettings.class.getName(), AccessibilitySettings.class.getName(),
AccessibilitySettingsForSetupWizard.class.getName(), AccessibilitySettingsForSetupWizard.class.getName(),
CaptionPropertiesFragment.class.getName(), CaptionPropertiesFragment.class.getName(),
com.android.settings.accessibility.ToggleDaltonizerPreferenceFragment.class.getName(), ToggleDaltonizerPreferenceFragment.class.getName(),
TextToSpeechSettings.class.getName(), TextToSpeechSettings.class.getName(),
StorageSettings.class.getName(), StorageSettings.class.getName(),
PrivateVolumeForget.class.getName(), PrivateVolumeForget.class.getName(),
@@ -357,7 +362,8 @@ public class SettingsActivity extends SettingsDrawerActivity
MasterClear.class.getName(), MasterClear.class.getName(),
NightDisplaySettings.class.getName(), NightDisplaySettings.class.getName(),
ManageDomainUrls.class.getName(), ManageDomainUrls.class.getName(),
AutomaticStorageManagerSettings.class.getName() AutomaticStorageManagerSettings.class.getName(),
SupportFragment.class.getName()
}; };
@@ -424,6 +430,7 @@ public class SettingsActivity extends SettingsDrawerActivity
private boolean mNeedToRevertToInitialFragment = false; private boolean mNeedToRevertToInitialFragment = false;
private DashboardFeatureProvider mDashboardFeatureProvider;
private Intent mResultIntentData; private Intent mResultIntentData;
private ComponentName mCurrentSuggestion; private ComponentName mCurrentSuggestion;
@@ -533,7 +540,8 @@ public class SettingsActivity extends SettingsDrawerActivity
protected void onCreate(Bundle savedState) { protected void onCreate(Bundle savedState) {
super.onCreate(savedState); super.onCreate(savedState);
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
mDashboardFeatureProvider =
FeatureFactory.getFactory(this).getDashboardFeatureProvider(this);
// Should happen before any call to getIntent() // Should happen before any call to getIntent()
getMetaData(); getMetaData();
@@ -643,9 +651,13 @@ public class SettingsActivity extends SettingsDrawerActivity
final Bundle args = new Bundle(); final Bundle args = new Bundle();
final String extraName = DashboardContainerFragment.EXTRA_SELECT_SETTINGS_TAB; final String extraName = DashboardContainerFragment.EXTRA_SELECT_SETTINGS_TAB;
args.putString(extraName, intent.getStringExtra(extraName)); args.putString(extraName, intent.getStringExtra(extraName));
if (isDashboardFeatureEnabled()) {
switchToFragment(DashboardContainerFragment.class.getName(), args, false, false, switchToFragment(DashboardSummary.class.getName(), args, false, false,
mInitialTitleResId, mInitialTitle, false); mInitialTitleResId, mInitialTitle, false);
} else {
switchToFragment(DashboardContainerFragment.class.getName(), args, false, false,
mInitialTitleResId, mInitialTitle, false);
}
} }
} }
@@ -1114,7 +1126,13 @@ public class SettingsActivity extends SettingsDrawerActivity
if (UserHandle.MU_ENABLED && !isAdmin) { if (UserHandle.MU_ENABLED && !isAdmin) {
// When on restricted users, disable all extra categories (but only the settings ones). // When on restricted users, disable all extra categories (but only the settings ones).
List<DashboardCategory> categories = getDashboardCategories(); List<DashboardCategory> categories;
if (isDashboardFeatureEnabled()) {
categories = mDashboardFeatureProvider.getAllCategories();
} else {
categories = getDashboardCategories();
}
for (DashboardCategory category : categories) { for (DashboardCategory category : categories) {
for (Tile tile : category.tiles) { for (Tile tile : category.tiles) {
ComponentName component = tile.intent.getComponent(); 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 // give subclasses access to the Next button
public boolean hasNextButton() { public boolean hasNextButton() {
return mNextButton != null; return mNextButton != null;

View File

@@ -15,12 +15,27 @@
*/ */
package com.android.settings.dashboard; 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). * FeatureProvider for dashboard (aka settings homepage).
*/ */
public interface DashboardFeatureProvider { 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<DashboardCategory> getAllCategories();
} }

View File

@@ -18,14 +18,38 @@ package com.android.settings.dashboard;
import android.content.Context; 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}. * Impl for {@code DashboardFeatureProvider}.
*/ */
public class DashboardFeatureProviderImpl implements DashboardFeatureProvider { public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
protected final Context mContext;
private final CategoryManager mCategoryManager;
public DashboardFeatureProviderImpl(Context context) {
mContext = context;
mCategoryManager = CategoryManager.get();
}
@Override @Override
public boolean shouldUseNewIALayout(Context context) { public boolean isEnabled() {
return false; return false;
} }
@Override
public DashboardCategory getTilesForHomepage() {
return mCategoryManager.getTilesByCategory(mContext, CategoryKey.CATEGORY_HOMEPAGE);
}
@Override
public List<DashboardCategory> getAllCategories() {
return mCategoryManager.getCategories(mContext);
}
} }

View File

@@ -36,6 +36,7 @@ import com.android.settings.dashboard.conditional.Condition;
import com.android.settings.dashboard.conditional.ConditionAdapterUtils; import com.android.settings.dashboard.conditional.ConditionAdapterUtils;
import com.android.settings.dashboard.conditional.ConditionManager; import com.android.settings.dashboard.conditional.ConditionManager;
import com.android.settings.dashboard.conditional.FocusRecyclerView; import com.android.settings.dashboard.conditional.FocusRecyclerView;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.SuggestionParser; import com.android.settingslib.SuggestionParser;
import com.android.settingslib.drawer.DashboardCategory; import com.android.settingslib.drawer.DashboardCategory;
import com.android.settingslib.drawer.SettingsDrawerActivity; import com.android.settingslib.drawer.SettingsDrawerActivity;
@@ -52,7 +53,7 @@ public class DashboardSummary extends InstrumentedFragment
private static final int MAX_WAIT_MILLIS = 700; private static final int MAX_WAIT_MILLIS = 700;
private static final String TAG = "DashboardSummary"; 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.WifiSettingsActivity.class.getName(),
Settings.BluetoothSettingsActivity.class.getName(), Settings.BluetoothSettingsActivity.class.getName(),
Settings.DataUsageSummaryActivity.class.getName(), Settings.DataUsageSummaryActivity.class.getName(),
@@ -78,6 +79,7 @@ public class DashboardSummary extends InstrumentedFragment
private SuggestionsChecks mSuggestionsChecks; private SuggestionsChecks mSuggestionsChecks;
private ArrayList<String> mSuggestionsShownLogged; private ArrayList<String> mSuggestionsShownLogged;
private ArrayList<String> mSuggestionsHiddenLogged; private ArrayList<String> mSuggestionsHiddenLogged;
private DashboardFeatureProvider mDashboardFeatureProvider;
@Override @Override
public int getMetricsCategory() { public int getMetricsCategory() {
@@ -88,10 +90,18 @@ public class DashboardSummary extends InstrumentedFragment
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
super.onCreate(savedInstanceState); 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<DashboardCategory> categories =
((SettingsActivity) getActivity()).getDashboardCategories();
mSummaryLoader = new SummaryLoader(getActivity(), categories);
Context context = getContext(); Context context = getContext();
mConditionManager = ConditionManager.get(context, false); mConditionManager = ConditionManager.get(context, false);
mSuggestionParser = new SuggestionParser(context, mSuggestionParser = new SuggestionParser(context,
@@ -106,8 +116,10 @@ public class DashboardSummary extends InstrumentedFragment
mSuggestionsHiddenLogged = mSuggestionsHiddenLogged =
savedInstanceState.getStringArrayList(EXTRA_SUGGESTION_HIDDEN_LOGGED); savedInstanceState.getStringArrayList(EXTRA_SUGGESTION_HIDDEN_LOGGED);
} }
if (DEBUG_TIMING) Log.d(TAG, "onCreate took " + (System.currentTimeMillis() - startTime) if (DEBUG_TIMING) {
+ " ms"); Log.d(TAG, "onCreate took " + (System.currentTimeMillis() - startTime)
+ " ms");
}
} }
@Override @Override
@@ -128,8 +140,10 @@ public class DashboardSummary extends InstrumentedFragment
mMetricsFeatureProvider.visible(getContext(), c.getMetricsConstant()); mMetricsFeatureProvider.visible(getContext(), c.getMetricsConstant());
} }
} }
if (DEBUG_TIMING) Log.d(TAG, "onResume took " + (System.currentTimeMillis() - startTime) if (DEBUG_TIMING) {
+ " ms"); Log.d(TAG, "onResume took " + (System.currentTimeMillis() - startTime)
+ " ms");
}
} }
@Override @Override
@@ -167,13 +181,15 @@ public class DashboardSummary extends InstrumentedFragment
} else { } else {
mConditionManager.remListener(this); mConditionManager.remListener(this);
} }
if (DEBUG_TIMING) Log.d(TAG, "onWindowFocusChanged took " if (DEBUG_TIMING) {
+ (System.currentTimeMillis() - startTime) + " ms"); Log.d(TAG, "onWindowFocusChanged took "
+ (System.currentTimeMillis() - startTime) + " ms");
}
} }
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) { Bundle savedInstanceState) {
return inflater.inflate(R.layout.dashboard, container, false); return inflater.inflate(R.layout.dashboard, container, false);
} }
@@ -208,8 +224,10 @@ public class DashboardSummary extends InstrumentedFragment
mDashboard.setAdapter(mAdapter); mDashboard.setAdapter(mAdapter);
mSummaryLoader.setAdapter(mAdapter); mSummaryLoader.setAdapter(mAdapter);
ConditionAdapterUtils.addDismiss(mDashboard); ConditionAdapterUtils.addDismiss(mDashboard);
if (DEBUG_TIMING) Log.d(TAG, "onViewCreated took " if (DEBUG_TIMING) {
+ (System.currentTimeMillis() - startTime) + " ms"); Log.d(TAG, "onViewCreated took "
+ (System.currentTimeMillis() - startTime) + " ms");
}
rebuildUI(); rebuildUI();
} }
@@ -274,9 +292,18 @@ public class DashboardSummary extends InstrumentedFragment
if (activity == null) { if (activity == null) {
return; return;
} }
List<DashboardCategory> categories =
((SettingsActivity) activity).getDashboardCategories(); if (mDashboardFeatureProvider.isEnabled()) {
mAdapter.setCategoriesAndSuggestions(categories, tiles); // Temporary hack to wrap homepage category into a list. Soon we will create adapter
// API that takes a single category.
List<DashboardCategory> categories = new ArrayList<>();
categories.add(mDashboardFeatureProvider.getTilesForHomepage());
mAdapter.setCategoriesAndSuggestions(categories, tiles);
} else {
mAdapter.setCategoriesAndSuggestions(
((SettingsActivity) activity).getDashboardCategories(), tiles);
}
} }
} }
} }

View File

@@ -30,6 +30,7 @@ import android.util.ArraySet;
import android.util.Log; import android.util.Log;
import com.android.settings.SettingsActivity; import com.android.settings.SettingsActivity;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.drawer.DashboardCategory; import com.android.settingslib.drawer.DashboardCategory;
import com.android.settingslib.drawer.SettingsDrawerActivity; import com.android.settingslib.drawer.SettingsDrawerActivity;
import com.android.settingslib.drawer.Tile; 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<Tile> 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() { public void release() {
mWorkerThread.quitSafely(); mWorkerThread.quitSafely();
// Make sure we aren't listening. // Make sure we aren't listening.
@@ -83,7 +97,7 @@ public class SummaryLoader {
} }
public void setSummary(SummaryProvider provider, final CharSequence summary) { public void setSummary(SummaryProvider provider, final CharSequence summary) {
final ComponentName component= mSummaryMap.get(provider); final ComponentName component = mSummaryMap.get(provider);
mHandler.post(new Runnable() { mHandler.post(new Runnable() {
@Override @Override
public void run() { public void run() {
@@ -95,9 +109,18 @@ public class SummaryLoader {
} }
return; return;
} }
final List<DashboardCategory> categories = final Tile tile;
((SettingsDrawerActivity) mActivity).getDashboardCategories(); final DashboardFeatureProvider dashboardFeatureProvider =
final Tile tile = getTileFromCategory(categories, component); FeatureFactory.getFactory(mActivity).getDashboardFeatureProvider(mActivity);
if (dashboardFeatureProvider.isEnabled()) {
tile = getTileFromCategory(dashboardFeatureProvider.getTilesForHomepage(),
component);
} else {
tile = getTileFromCategory(
((SettingsDrawerActivity) mActivity).getDashboardCategories(),
component);
}
if (tile == null) { if (tile == null) {
if (DEBUG) { if (DEBUG) {
Log.d(TAG, "Can't find tile for " + component); Log.d(TAG, "Can't find tile for " + component);
@@ -214,12 +237,20 @@ public class SummaryLoader {
final int categorySize = categories.size(); final int categorySize = categories.size();
for (int i = 0; i < categorySize; i++) { for (int i = 0; i < categorySize; i++) {
final DashboardCategory category = categories.get(i); final DashboardCategory category = categories.get(i);
final int tileCount = category.tiles.size(); final Tile tile = getTileFromCategory(category, component);
for (int j = 0; j < tileCount; j++) { if (tile != null) {
final Tile tile = category.tiles.get(j); return tile;
if (component.equals(tile.intent.getComponent())) { }
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; return null;

View File

@@ -68,7 +68,7 @@ public abstract class FeatureFactory {
public abstract PowerUsageFeatureProvider getPowerUsageFeatureProvider(); public abstract PowerUsageFeatureProvider getPowerUsageFeatureProvider();
public abstract DashboardFeatureProvider getDashboardFeatureProvider(); public abstract DashboardFeatureProvider getDashboardFeatureProvider(Context context);
public static final class FactoryNotFoundException extends RuntimeException { public static final class FactoryNotFoundException extends RuntimeException {
public FactoryNotFoundException(Throwable throwable) { public FactoryNotFoundException(Throwable throwable) {

View File

@@ -53,9 +53,9 @@ public final class FeatureFactoryImpl extends FeatureFactory {
} }
@Override @Override
public DashboardFeatureProvider getDashboardFeatureProvider() { public DashboardFeatureProvider getDashboardFeatureProvider(Context context) {
if (mDashboardFeatureProvider == null) { if (mDashboardFeatureProvider == null) {
mDashboardFeatureProvider = new DashboardFeatureProviderImpl(); mDashboardFeatureProvider = new DashboardFeatureProviderImpl(context);
} }
return mDashboardFeatureProvider; return mDashboardFeatureProvider;
} }