From 8f06ab0774d44c49fbb5b122b7266192c49271c0 Mon Sep 17 00:00:00 2001 From: roger xue Date: Thu, 8 Dec 2016 14:09:50 -0800 Subject: [PATCH] making changes to settingsLib so we can create car setting using settingsLib Test: make -j40 RunSettingsLibRoboTests Change-Id: I4eff074ebbbf1d4a4325580d68a2123d3f5ff930 --- .../SettingsLib/res/layout/drawer_category.xml | 4 +-- packages/SettingsLib/res/layout/drawer_item.xml | 17 ++++++----- packages/SettingsLib/res/layout/drawer_spacer.xml | 2 +- .../res/layout/settings_with_drawer.xml | 2 +- packages/SettingsLib/res/values/dimens.xml | 7 ++++- packages/SettingsLib/res/values/styles.xml | 24 +++++++++++++++ .../settingslib/drawer/CategoryManager.java | 26 +++++++++++----- .../settingslib/drawer/SettingsDrawerActivity.java | 29 ++++++++++++++---- .../settingslib/drawer/SettingsDrawerAdapter.java | 4 +-- .../com/android/settingslib/drawer/TileUtils.java | 35 ++++++++++++---------- .../android/settingslib/drawer/TileUtilsTest.java | 33 ++++++++++++++++++-- 11 files changed, 137 insertions(+), 46 deletions(-) create mode 100644 packages/SettingsLib/res/values/styles.xml diff --git a/packages/SettingsLib/res/layout/drawer_category.xml b/packages/SettingsLib/res/layout/drawer_category.xml index 582821bdf6bb..72cfddb1a431 100644 --- a/packages/SettingsLib/res/layout/drawer_category.xml +++ b/packages/SettingsLib/res/layout/drawer_category.xml @@ -26,13 +26,13 @@ android:background="?android:attr/listDivider" /> + android:paddingStart="16dp" /> diff --git a/packages/SettingsLib/res/layout/drawer_item.xml b/packages/SettingsLib/res/layout/drawer_item.xml index e1f1ae5ef706..d492ddfee0fe 100644 --- a/packages/SettingsLib/res/layout/drawer_item.xml +++ b/packages/SettingsLib/res/layout/drawer_item.xml @@ -23,19 +23,22 @@ + android:tint="?android:attr/colorAccent"/> + android:textColor="?android:attr/colorControlNormal" /> diff --git a/packages/SettingsLib/res/layout/drawer_spacer.xml b/packages/SettingsLib/res/layout/drawer_spacer.xml index ee1835d7c231..98120cf904d0 100644 --- a/packages/SettingsLib/res/layout/drawer_spacer.xml +++ b/packages/SettingsLib/res/layout/drawer_spacer.xml @@ -17,4 +17,4 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/spacer" android:layout_width="match_parent" - android:layout_height="32dp" /> + android:layout_height="@dimen/drawer_spacer_height" /> diff --git a/packages/SettingsLib/res/layout/settings_with_drawer.xml b/packages/SettingsLib/res/layout/settings_with_drawer.xml index abe310a6e38a..af96d8b25e64 100644 --- a/packages/SettingsLib/res/layout/settings_with_drawer.xml +++ b/packages/SettingsLib/res/layout/settings_with_drawer.xml @@ -53,7 +53,7 @@ .75dp 7dp - + 24dp + 24dp + 24dp + 300dp + 4dp + 32dp diff --git a/packages/SettingsLib/res/values/styles.xml b/packages/SettingsLib/res/values/styles.xml new file mode 100644 index 000000000000..3f312f4efda3 --- /dev/null +++ b/packages/SettingsLib/res/values/styles.xml @@ -0,0 +1,24 @@ + + + + + + diff --git a/packages/SettingsLib/src/com/android/settingslib/drawer/CategoryManager.java b/packages/SettingsLib/src/com/android/settingslib/drawer/CategoryManager.java index 6ccba92e2e5f..fa5ba73b318f 100644 --- a/packages/SettingsLib/src/com/android/settingslib/drawer/CategoryManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/drawer/CategoryManager.java @@ -72,21 +72,30 @@ public class CategoryManager { } public synchronized DashboardCategory getTilesByCategory(Context context, String categoryKey) { - tryInitCategories(context); + return getTilesByCategory(context, categoryKey, TileUtils.SETTING_PKG); + } + + public synchronized DashboardCategory getTilesByCategory(Context context, String categoryKey, + String settingPkg) { + tryInitCategories(context, settingPkg); return mCategoryByKeyMap.get(categoryKey); } public synchronized List getCategories(Context context) { - tryInitCategories(context); + return getCategories(context, TileUtils.SETTING_PKG); + } + + public synchronized List getCategories(Context context, String settingPkg) { + tryInitCategories(context, settingPkg); return mCategories; } - public synchronized void reloadAllCategories(Context context) { + public synchronized void reloadAllCategories(Context context, String settingPkg) { final boolean forceClearCache = mInterestingConfigChanges.applyNewConfig( context.getResources()); mCategories = null; - tryInitCategories(context, forceClearCache); + tryInitCategories(context, forceClearCache, settingPkg); } public synchronized void updateCategoryFromBlacklist(Set tileBlacklist) { @@ -104,20 +113,21 @@ public class CategoryManager { } } - private synchronized void tryInitCategories(Context context) { + private synchronized void tryInitCategories(Context context, String settingPkg) { // Keep cached tiles by default. The cache is only invalidated when InterestingConfigChange // happens. - tryInitCategories(context, false /* forceClearCache */); + tryInitCategories(context, false /* forceClearCache */, settingPkg); } - private synchronized void tryInitCategories(Context context, boolean forceClearCache) { + private synchronized void tryInitCategories(Context context, boolean forceClearCache, + String settingPkg) { if (mCategories == null) { if (forceClearCache) { mTileByComponentCache.clear(); } mCategoryByKeyMap.clear(); mCategories = TileUtils.getCategories(context, mTileByComponentCache, - false /* categoryDefinedInManifest */, mExtraAction); + false /* categoryDefinedInManifest */, mExtraAction, settingPkg); for (DashboardCategory category : mCategories) { mCategoryByKeyMap.put(category.key, category); } diff --git a/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerActivity.java b/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerActivity.java index 5041e0dccc26..89ed110d3246 100644 --- a/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerActivity.java +++ b/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerActivity.java @@ -193,8 +193,9 @@ public class SettingsDrawerActivity extends Activity { } if (isDashboardFeatureEnabled()) { final DashboardCategory homepageCategories = CategoryManager.get(this) - .getTilesByCategory(this, CategoryKey.CATEGORY_HOMEPAGE); - return homepageCategories.containsComponent(componentName); + .getTilesByCategory(this, CategoryKey.CATEGORY_HOMEPAGE, getSettingPkg()); + return homepageCategories == + null ? false : homepageCategories.containsComponent(componentName); } else { // Look for a tile that has the same component as incoming intent final List categories = getDashboardCategories(); @@ -210,6 +211,14 @@ public class SettingsDrawerActivity extends Activity { } } + /** + * Gets the name of the intent action of the default setting app. Used to launch setting app + * when Settings Home is clicked. + */ + public String getSettingAction() { + return Settings.ACTION_SETTINGS; + } + public void addCategoryListener(CategoryListener listener) { mCategoryListeners.add(listener); } @@ -274,7 +283,7 @@ public class SettingsDrawerActivity extends Activity { } // TODO: Do this in the background with some loading. if (isDashboardFeatureEnabled()) { - mDrawerAdapter.updateHomepageCategories(); + mDrawerAdapter.updateHomepageCategories(getSettingPkg()); } else { mDrawerAdapter.updateCategories(); } @@ -317,8 +326,9 @@ public class SettingsDrawerActivity extends Activity { public boolean openTile(Tile tile) { closeDrawer(); if (tile == null) { - startActivity(new Intent(Settings.ACTION_SETTINGS).addFlags( - Intent.FLAG_ACTIVITY_CLEAR_TASK)); + Intent intent = new Intent(getSettingAction()).addFlags( + Intent.FLAG_ACTIVITY_CLEAR_TASK); + startActivity(intent); return true; } try { @@ -376,6 +386,10 @@ public class SettingsDrawerActivity extends Activity { } } + public String getSettingPkg() { + return TileUtils.SETTING_PKG; + } + public interface CategoryListener { void onCategoriesChanged(); } @@ -426,7 +440,7 @@ public class SettingsDrawerActivity extends Activity { @Override protected Void doInBackground(Void... params) { - mCategoryManager.reloadAllCategories(SettingsDrawerActivity.this); + mCategoryManager.reloadAllCategories(SettingsDrawerActivity.this, getSettingPkg()); return null; } @@ -437,6 +451,9 @@ public class SettingsDrawerActivity extends Activity { } } + /** + * @return {@code true} if IA (Information Architecture) is enabled. + */ protected boolean isDashboardFeatureEnabled() { return false; } diff --git a/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerAdapter.java b/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerAdapter.java index 602d135dd6c9..75942f93b67b 100644 --- a/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerAdapter.java +++ b/packages/SettingsLib/src/com/android/settingslib/drawer/SettingsDrawerAdapter.java @@ -68,9 +68,9 @@ public class SettingsDrawerAdapter extends BaseAdapter { notifyDataSetChanged(); } - public void updateHomepageCategories() { + public void updateHomepageCategories(String settingPkg) { final DashboardCategory category = CategoryManager.get(mActivity) - .getTilesByCategory(mActivity, CategoryKey.CATEGORY_HOMEPAGE); + .getTilesByCategory(mActivity, CategoryKey.CATEGORY_HOMEPAGE, settingPkg); mItems.clear(); // Spacer. mItems.add(null); diff --git a/packages/SettingsLib/src/com/android/settingslib/drawer/TileUtils.java b/packages/SettingsLib/src/com/android/settingslib/drawer/TileUtils.java index a0109e29831a..0cc5ab1900ba 100644 --- a/packages/SettingsLib/src/com/android/settingslib/drawer/TileUtils.java +++ b/packages/SettingsLib/src/com/android/settingslib/drawer/TileUtils.java @@ -147,7 +147,7 @@ public class TileUtils { public static final String META_DATA_PREFERENCE_SUMMARY_URI = "com.android.settings.summary_uri"; - private static final String SETTING_PKG = "com.android.settings"; + public static final String SETTING_PKG = "com.android.settings"; /** * Build a list of DashboardCategory. Each category must be defined in manifest. @@ -167,39 +167,43 @@ public class TileUtils { */ public static List getCategories(Context context, Map, Tile> cache, boolean categoryDefinedInManifest) { - return getCategories(context, cache, categoryDefinedInManifest, null); + return getCategories(context, cache, categoryDefinedInManifest, null, SETTING_PKG); } /** * Build a list of DashboardCategory. * @param categoryDefinedInManifest If true, an dummy activity must exists in manifest to * represent this category (eg: .Settings$DeviceSettings) - * @param extraAction additional intent filter action to be used to build the dashboard + * @param extraAction additional intent filter action to be usetileutild to build the dashboard * categories */ public static List getCategories(Context context, Map, Tile> cache, boolean categoryDefinedInManifest, - String extraAction) { + String extraAction, String settingPkg) { final long startTime = System.currentTimeMillis(); boolean setup = Global.getInt(context.getContentResolver(), Global.DEVICE_PROVISIONED, 0) != 0; ArrayList tiles = new ArrayList<>(); - UserManager userManager = UserManager.get(context); + UserManager userManager = (UserManager) context.getSystemService(Context.USER_SERVICE); for (UserHandle user : userManager.getUserProfiles()) { // TODO: Needs much optimization, too many PM queries going on here. if (user.getIdentifier() == ActivityManager.getCurrentUser()) { // Only add Settings for this user. - getTilesForAction(context, user, SETTINGS_ACTION, cache, null, tiles, true); + getTilesForAction(context, user, SETTINGS_ACTION, cache, null, tiles, true, + settingPkg); getTilesForAction(context, user, OPERATOR_SETTINGS, cache, - OPERATOR_DEFAULT_CATEGORY, tiles, false, true); + OPERATOR_DEFAULT_CATEGORY, tiles, false, true, settingPkg); getTilesForAction(context, user, MANUFACTURER_SETTINGS, cache, - MANUFACTURER_DEFAULT_CATEGORY, tiles, false, true); + MANUFACTURER_DEFAULT_CATEGORY, tiles, false, true, settingPkg); } if (setup) { - getTilesForAction(context, user, EXTRA_SETTINGS_ACTION, cache, null, tiles, false); - getTilesForAction(context, user, IA_SETTINGS_ACTION, cache, null, tiles, false); + getTilesForAction(context, user, EXTRA_SETTINGS_ACTION, cache, null, tiles, false, + settingPkg); + getTilesForAction(context, user, IA_SETTINGS_ACTION, cache, null, tiles, false, + settingPkg); if (extraAction != null) { - getTilesForAction(context, user, extraAction, cache, null, tiles, false); + getTilesForAction(context, user, extraAction, cache, null, tiles, false, + settingPkg); } } } @@ -263,18 +267,19 @@ public class TileUtils { private static void getTilesForAction(Context context, UserHandle user, String action, Map, Tile> addedCache, - String defaultCategory, ArrayList outTiles, boolean requireSettings) { + String defaultCategory, ArrayList outTiles, boolean requireSettings, + String settingPkg) { getTilesForAction(context, user, action, addedCache, defaultCategory, outTiles, - requireSettings, requireSettings); + requireSettings, requireSettings, settingPkg); } private static void getTilesForAction(Context context, UserHandle user, String action, Map, Tile> addedCache, String defaultCategory, ArrayList outTiles, boolean requireSettings, - boolean usePriority) { + boolean usePriority, String settingPkg) { Intent intent = new Intent(action); if (requireSettings) { - intent.setPackage(SETTING_PKG); + intent.setPackage(settingPkg); } getTilesForIntent(context, user, intent, addedCache, defaultCategory, outTiles, usePriority, true); diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileUtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileUtilsTest.java index eb99cac94e40..d8082c41b5ff 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileUtilsTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/drawer/TileUtilsTest.java @@ -16,6 +16,8 @@ package com.android.settingslib.drawer; +import android.app.ActivityManager; +import static org.mockito.Mockito.verify; import android.content.IContentProvider; import android.content.ContentResolver; import android.content.Context; @@ -36,6 +38,7 @@ import android.util.ArrayMap; import android.util.Pair; import com.android.settingslib.TestConfig; +import static org.mockito.Mockito.atLeastOnce; import org.junit.Before; import org.junit.Test; @@ -43,6 +46,7 @@ import org.junit.runner.RunWith; import org.mockito.ArgumentMatcher; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.robolectric.shadows.ShadowApplication; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; @@ -59,6 +63,8 @@ import static org.mockito.Matchers.argThat; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; +import org.mockito.ArgumentCaptor; + @RunWith(RobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) @@ -97,7 +103,7 @@ public class TileUtilsTest { List outTiles = new ArrayList<>(); List info = new ArrayList<>(); info.add(newInfo(true, testCategory)); - + Map, Tile> cache = new ArrayMap<>(); when(mPackageManager.queryIntentActivitiesAsUser(eq(intent), anyInt(), anyInt())) .thenReturn(info); @@ -169,12 +175,33 @@ public class TileUtilsTest { }), anyInt(), anyInt())).thenReturn(info); List categoryList = TileUtils.getCategories( - mContext, cache, false /* categoryDefinedInManifest */, testAction); - + mContext, cache, false /* categoryDefinedInManifest */, testAction, + TileUtils.SETTING_PKG); assertThat(categoryList.get(0).tiles.get(0).category).isEqualTo(testCategory); } @Test + public void getCategories_withPackageName() throws Exception { + ArgumentCaptor intentCaptor = ArgumentCaptor.forClass(Intent.class); + Map, Tile> cache = new ArrayMap<>(); + Global.putInt(mContext.getContentResolver(), Global.DEVICE_PROVISIONED, 1); + when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager); + List userHandleList = new ArrayList<>(); + + userHandleList.add(new UserHandle(ActivityManager.getCurrentUser())); + when(mUserManager.getUserProfiles()).thenReturn(userHandleList); + + TileUtils.getCategories( + mContext, cache, false /* categoryDefinedInManifest */, null /* action */, + TileUtils.SETTING_PKG); + verify(mPackageManager, atLeastOnce()).queryIntentActivitiesAsUser( + intentCaptor.capture(), anyInt(), anyInt()); + + assertThat(intentCaptor.getAllValues().get(0).getPackage()) + .isEqualTo(TileUtils.SETTING_PKG); + } + + @Test public void getTilesForIntent_shouldNotProcessInvalidUriContentSystemApp() throws RemoteException { Intent intent = new Intent(); -- 2.11.0