Add the support of preference group / category to the Settings Tile API

Test: robotest, manual
Bug: 281517110
Change-Id: Ie36b0b3eb8ed80766efa050f1f0aee1f784a5949
This commit is contained in:
Peter Zhang
2023-05-08 16:59:01 +02:00
parent 5b81bbfd02
commit baeca6fb53
2 changed files with 86 additions and 12 deletions

View File

@@ -31,6 +31,7 @@ import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import androidx.lifecycle.LifecycleObserver; import androidx.lifecycle.LifecycleObserver;
import androidx.preference.Preference; import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceGroup; import androidx.preference.PreferenceGroup;
import androidx.preference.PreferenceManager; import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
@@ -46,7 +47,6 @@ import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.PrimarySwitchPreference; import com.android.settingslib.PrimarySwitchPreference;
import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.drawer.ActivityTile;
import com.android.settingslib.drawer.DashboardCategory; import com.android.settingslib.drawer.DashboardCategory;
import com.android.settingslib.drawer.Tile; import com.android.settingslib.drawer.Tile;
import com.android.settingslib.search.Indexable; import com.android.settingslib.search.Indexable;
@@ -55,6 +55,7 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
@@ -504,6 +505,10 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
// Install dashboard tiles and collect pending observers. // Install dashboard tiles and collect pending observers.
final boolean forceRoundedIcons = shouldForceRoundedIcon(); final boolean forceRoundedIcons = shouldForceRoundedIcon();
final List<DynamicDataObserver> pendingObservers = new ArrayList<>(); final List<DynamicDataObserver> pendingObservers = new ArrayList<>();
// Move group tiles to the beginning of the list to ensure they are created before the
// other tiles.
tiles.sort(Comparator.comparingInt(tile -> tile.getType() == Tile.Type.GROUP ? 0 : 1));
for (Tile tile : tiles) { for (Tile tile : tiles) {
final String key = mDashboardFeatureProvider.getDashboardKeyForTile(tile); final String key = mDashboardFeatureProvider.getDashboardKeyForTile(tile);
if (TextUtils.isEmpty(key)) { if (TextUtils.isEmpty(key)) {
@@ -526,7 +531,14 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
observers = mDashboardFeatureProvider.bindPreferenceToTileAndGetObservers( observers = mDashboardFeatureProvider.bindPreferenceToTileAndGetObservers(
getActivity(), this, forceRoundedIcons, pref, tile, key, getActivity(), this, forceRoundedIcons, pref, tile, key,
mPlaceholderPreferenceController.getOrder()); mPlaceholderPreferenceController.getOrder());
screen.addPreference(pref); if (tile.hasGroupKey() && mDashboardTilePrefKeys.containsKey(tile.getGroupKey())) {
final Preference group = screen.findPreference(tile.getGroupKey());
if (group instanceof PreferenceCategory) {
((PreferenceCategory) group).addPreference(pref);
}
} else {
screen.addPreference(pref);
}
registerDynamicDataObservers(observers); registerDynamicDataObservers(observers);
mDashboardTilePrefKeys.put(key, observers); mDashboardTilePrefKeys.put(key, observers);
} }
@@ -569,16 +581,21 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment
} }
protected Preference createPreference(Tile tile) { protected Preference createPreference(Tile tile) {
if (tile.hasSwitch()) { switch (tile.getType()) {
return (tile instanceof ActivityTile || tile.hasPendingIntent()) case EXTERNAL_ACTION:
? new PrimarySwitchPreference(getPrefContext()) Preference externalActionPreference = new Preference(getPrefContext());
: new SwitchPreference(getPrefContext()); externalActionPreference
} else if (tile.hasPendingIntent()) { .setWidgetLayoutResource(R.layout.preference_external_action_icon);
Preference preference = new Preference(getPrefContext()); return externalActionPreference;
preference.setWidgetLayoutResource(R.layout.preference_external_action_icon); case SWITCH:
return preference; return new SwitchPreference(getPrefContext());
} else { case SWITCH_WITH_ACTION:
return new Preference(getPrefContext()); return new PrimarySwitchPreference(getPrefContext());
case GROUP:
return new PreferenceCategory((getPrefContext()));
case ACTION:
default:
return new Preference(getPrefContext());
} }
} }

View File

@@ -16,7 +16,9 @@
package com.android.settings.dashboard; package com.android.settings.dashboard;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.DASHBOARD_CONTAINER; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.DASHBOARD_CONTAINER;
import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_GROUP_KEY;
import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_KEYHINT; import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_KEYHINT;
import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_PENDING_INTENT;
import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_SWITCH_URI; import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_SWITCH_URI;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
@@ -43,6 +45,7 @@ import android.os.UserHandle;
import android.preference.PreferenceManager.OnActivityResultListener; import android.preference.PreferenceManager.OnActivityResultListener;
import androidx.preference.Preference; import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
import androidx.preference.PreferenceFragmentCompat; import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.PreferenceManager; import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
@@ -60,6 +63,7 @@ import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin;
import com.android.settingslib.drawer.ActivityTile; import com.android.settingslib.drawer.ActivityTile;
import com.android.settingslib.drawer.DashboardCategory; import com.android.settingslib.drawer.DashboardCategory;
import com.android.settingslib.drawer.ProviderTile; import com.android.settingslib.drawer.ProviderTile;
import com.android.settingslib.drawer.Tile;
import org.junit.Before; import org.junit.Before;
import org.junit.Ignore; import org.junit.Ignore;
@@ -180,6 +184,43 @@ public class DashboardFragmentTest {
verify(mTestFragment.mScreen, times(2)).addPreference(nullable(Preference.class)); verify(mTestFragment.mScreen, times(2)).addPreference(nullable(Preference.class));
} }
@Test
public void displayTilesAsPreference_withGroup_shouldAddTilesIntoGroup() {
final ProviderInfo providerInfo = new ProviderInfo();
providerInfo.packageName = "pkg";
providerInfo.name = "provider";
providerInfo.authority = "authority";
final Bundle groupTileMetaData = new Bundle();
groupTileMetaData.putString(META_DATA_PREFERENCE_KEYHINT, "injected_tile_group_key");
ProviderTile groupTile = new ProviderTile(providerInfo, mDashboardCategory.key,
groupTileMetaData);
mDashboardCategory.addTile(groupTile);
final Bundle subTileMetaData = new Bundle();
subTileMetaData.putString(META_DATA_PREFERENCE_KEYHINT, "injected_tile_key3");
subTileMetaData.putString(META_DATA_PREFERENCE_GROUP_KEY, "injected_tile_group_key");
subTileMetaData.putParcelable(
META_DATA_PREFERENCE_PENDING_INTENT,
PendingIntent.getActivity(mContext, 0, new Intent(), 0));
ProviderTile subTile = new ProviderTile(providerInfo, mDashboardCategory.key,
subTileMetaData);
mDashboardCategory.addTile(subTile);
PreferenceCategory groupPreference = mock(PreferenceCategory.class);
when(mFakeFeatureFactory.dashboardFeatureProvider
.getTilesForCategory(nullable(String.class)))
.thenReturn(mDashboardCategory);
when(mFakeFeatureFactory.dashboardFeatureProvider
.getDashboardKeyForTile(any(Tile.class)))
.then(invocation -> ((Tile) invocation.getArgument(0)).getKey(mContext));
when(mTestFragment.mScreen.findPreference("injected_tile_group_key"))
.thenReturn(groupPreference);
mTestFragment.onCreatePreferences(new Bundle(), "rootKey");
verify(mTestFragment.mScreen, times(3)).addPreference(nullable(Preference.class));
verify(groupPreference).addPreference(nullable(Preference.class));
}
@Test @Test
public void displayTilesAsPreference_shouldNotAddTilesWithoutIntent() { public void displayTilesAsPreference_shouldNotAddTilesWithoutIntent() {
mTestFragment.onCreatePreferences(new Bundle(), "rootKey"); mTestFragment.onCreatePreferences(new Bundle(), "rootKey");
@@ -405,6 +446,22 @@ public class DashboardFragmentTest {
assertThat(pref).isInstanceOf(PrimarySwitchPreference.class); assertThat(pref).isInstanceOf(PrimarySwitchPreference.class);
} }
@Test
public void createPreference_isGroupTile_returnPreferenceCategory() {
final ProviderInfo providerInfo = new ProviderInfo();
providerInfo.packageName = "pkg";
providerInfo.name = "provider";
providerInfo.authority = "authority";
final Bundle metaData = new Bundle();
metaData.putString(META_DATA_PREFERENCE_KEYHINT, "injected_tile_key2");
ProviderTile providerTile =
new ProviderTile(providerInfo, mDashboardCategory.key, metaData);
final Preference pref = mTestFragment.createPreference(providerTile);
assertThat(pref).isInstanceOf(PreferenceCategory.class);
}
@Test @Test
public void onActivityResult_test() { public void onActivityResult_test() {
final int requestCode = 10; final int requestCode = 10;