Merge "Add the support of preference group / category to the Settings Tile API" into udc-d1-dev
This commit is contained in:
@@ -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());
|
||||||
|
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);
|
screen.addPreference(pref);
|
||||||
|
}
|
||||||
registerDynamicDataObservers(observers);
|
registerDynamicDataObservers(observers);
|
||||||
mDashboardTilePrefKeys.put(key, observers);
|
mDashboardTilePrefKeys.put(key, observers);
|
||||||
}
|
}
|
||||||
@@ -569,15 +581,20 @@ 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 PrimarySwitchPreference(getPrefContext());
|
||||||
|
case GROUP:
|
||||||
|
return new PreferenceCategory((getPrefContext()));
|
||||||
|
case ACTION:
|
||||||
|
default:
|
||||||
return new Preference(getPrefContext());
|
return new Preference(getPrefContext());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user