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
This commit is contained in:
Yanting Yang
2019-04-18 21:37:31 +08:00
parent 3683a688f7
commit 4e56cb2917
5 changed files with 40 additions and 0 deletions

View File

@@ -363,4 +363,7 @@
<!-- Grayscale settings intent -->
<string name="config_grayscale_settings_intent" translate="false"></string>
<!-- List containing the injected tile keys which are suppressed. -->
<string-array name="config_suppress_injected_tile_keys" translatable="false"/>
</resources>

View File

@@ -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;
}

View File

@@ -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<String> 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<AbstractPreferenceController> 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;
}

View File

@@ -88,4 +88,9 @@
<!-- Grayscale settings intent -->
<string name="config_grayscale_settings_intent" translate="false">intent:#Intent;action=test.test;end</string>
<!-- List containing the injected tile keys which are suppressed. -->
<string-array name="config_suppress_injected_tile_keys" translatable="false">
<item>injected_tile_key</item>
</string-array>
</resources>

View File

@@ -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(