From 4e56cb291733b4f89904f966148a5af898dd3a2a Mon Sep 17 00:00:00 2001 From: Yanting Yang Date: Thu, 18 Apr 2019 21:37:31 +0800 Subject: [PATCH] Add a way to suppress injected tiles for OEMs Create a config resource for OEMs to add suppressed tile's key, then DashboardFragment will filter related tiles out from Settings. OEMs can use this way to suppress security patch injected tile if they don't use Google OTA. Fixes: 130734771 Test: visual, robotests Change-Id: I4cab79c8672048fa543d39b2a8f38ffe338189c8 --- res/values/config.xml | 3 +++ .../AccountDetailDashboardFragment.java | 3 +++ .../settings/dashboard/DashboardFragment.java | 11 +++++++++++ tests/robotests/res/values-mcc999/config.xml | 5 +++++ .../dashboard/DashboardFragmentTest.java | 18 ++++++++++++++++++ 5 files changed, 40 insertions(+) diff --git a/res/values/config.xml b/res/values/config.xml index 496b5d2145e..1dbe079c57b 100755 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -363,4 +363,7 @@ + + + diff --git a/src/com/android/settings/accounts/AccountDetailDashboardFragment.java b/src/com/android/settings/accounts/AccountDetailDashboardFragment.java index ad6ecaff6c0..1485500931b 100644 --- a/src/com/android/settings/accounts/AccountDetailDashboardFragment.java +++ b/src/com/android/settings/accounts/AccountDetailDashboardFragment.java @@ -150,6 +150,9 @@ public class AccountDetailDashboardFragment extends DashboardFragment { @Override protected boolean displayTile(Tile tile) { + if (!super.displayTile(tile)) { + return false; + } if (mAccountType == null) { return false; } diff --git a/src/com/android/settings/dashboard/DashboardFragment.java b/src/com/android/settings/dashboard/DashboardFragment.java index 16303116432..f2e3d73c8fe 100644 --- a/src/com/android/settings/dashboard/DashboardFragment.java +++ b/src/com/android/settings/dashboard/DashboardFragment.java @@ -24,12 +24,14 @@ import android.util.ArrayMap; import android.util.ArraySet; import android.util.Log; +import androidx.annotation.CallSuper; import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; import androidx.preference.PreferenceGroup; import androidx.preference.PreferenceManager; import androidx.preference.PreferenceScreen; +import com.android.settings.R; import com.android.settings.SettingsPreferenceFragment; import com.android.settings.core.BasePreferenceController; import com.android.settings.core.PreferenceControllerListHelper; @@ -43,6 +45,7 @@ import com.android.settingslib.drawer.DashboardCategory; import com.android.settingslib.drawer.Tile; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Map; @@ -65,12 +68,15 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment private DashboardTilePlaceholderPreferenceController mPlaceholderPreferenceController; private boolean mListeningToCategoryChange; private SummaryLoader mSummaryLoader; + private List mSuppressInjectedTileKeys; @VisibleForTesting UiBlockerController mBlockerController; @Override public void onAttach(Context context) { super.onAttach(context); + mSuppressInjectedTileKeys = Arrays.asList(context.getResources().getStringArray( + R.array.config_suppress_injected_tile_keys)); mDashboardFeatureProvider = FeatureFactory.getFactory(context). getDashboardFeatureProvider(context); final List controllers = new ArrayList<>(); @@ -283,7 +289,12 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment /** * Returns true if this tile should be displayed */ + @CallSuper protected boolean displayTile(Tile tile) { + if (mSuppressInjectedTileKeys != null && tile.hasKey()) { + // For suppressing injected tiles for OEMs. + return !mSuppressInjectedTileKeys.contains(tile.getKey(getContext())); + } return true; } diff --git a/tests/robotests/res/values-mcc999/config.xml b/tests/robotests/res/values-mcc999/config.xml index 78c3c088487..a6a84c9c376 100644 --- a/tests/robotests/res/values-mcc999/config.xml +++ b/tests/robotests/res/values-mcc999/config.xml @@ -88,4 +88,9 @@ intent:#Intent;action=test.test;end + + + + injected_tile_key + diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java index 438dfc18caf..9aae249c79b 100644 --- a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java @@ -16,6 +16,7 @@ package com.android.settings.dashboard; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.DASHBOARD_CONTAINER; +import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_KEYHINT; import static com.google.common.truth.Truth.assertThat; @@ -53,6 +54,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; import org.robolectric.util.ReflectionHelpers; import java.util.ArrayList; @@ -79,6 +81,8 @@ public class DashboardFragmentTest { mActivityInfo = new ActivityInfo(); mActivityInfo.packageName = "pkg"; mActivityInfo.name = "class"; + mActivityInfo.metaData = new Bundle(); + mActivityInfo.metaData.putString(META_DATA_PREFERENCE_KEYHINT, "injected_tile_key"); mFakeFeatureFactory = FakeFeatureFactory.setupForTest(); mDashboardCategory = new DashboardCategory("key"); mDashboardCategory.addTile(new Tile(mActivityInfo, mDashboardCategory.key)); @@ -143,6 +147,20 @@ public class DashboardFragmentTest { verify(mTestFragment.mScreen, never()).addPreference(nullable(Preference.class)); } + @Test + @Config(qualifiers = "mcc999") + public void displayTilesAsPreference_shouldNotAddSuppressedTiles() { + when(mFakeFeatureFactory.dashboardFeatureProvider + .getTilesForCategory(nullable(String.class))) + .thenReturn(mDashboardCategory); + when(mFakeFeatureFactory.dashboardFeatureProvider + .getDashboardKeyForTile(nullable(Tile.class))) + .thenReturn("test_key"); + mTestFragment.onCreatePreferences(new Bundle(), "rootKey"); + + verify(mTestFragment.mScreen, never()).addPreference(nullable(Preference.class)); + } + @Test public void onAttach_shouldCreatePlaceholderPreferenceController() { final AbstractPreferenceController controller = mTestFragment.use(