Add metadata handling for specifying tile order.
- if tile order is set in the metadata, it will be used as preference order instead of the intent priority specified. Change-Id: If1a09219ece7bb71fc476aad60dc66d7653dfd28 Fixes: 65172575 Test: make RunSettingsRoboTests
This commit is contained in:
@@ -62,6 +62,8 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
|
||||
|
||||
private static final String DASHBOARD_TILE_PREF_KEY_PREFIX = "dashboard_tile_pref_";
|
||||
private static final String META_DATA_KEY_INTENT_ACTION = "com.android.settings.intent.action";
|
||||
@VisibleForTesting
|
||||
static final String META_DATA_KEY_ORDER = "com.android.settings.order";
|
||||
|
||||
protected final Context mContext;
|
||||
|
||||
@@ -142,9 +144,14 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
|
||||
final Bundle metadata = tile.metaData;
|
||||
String clsName = null;
|
||||
String action = null;
|
||||
Integer order = null;
|
||||
if (metadata != null) {
|
||||
clsName = metadata.getString(SettingsActivity.META_DATA_KEY_FRAGMENT_CLASS);
|
||||
action = metadata.getString(META_DATA_KEY_INTENT_ACTION);
|
||||
if (metadata.containsKey(META_DATA_KEY_ORDER)
|
||||
&& metadata.get(META_DATA_KEY_ORDER) instanceof Integer) {
|
||||
order = metadata.getInt(META_DATA_KEY_ORDER);
|
||||
}
|
||||
}
|
||||
if (!TextUtils.isEmpty(clsName)) {
|
||||
pref.setFragment(clsName);
|
||||
@@ -160,19 +167,23 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
|
||||
});
|
||||
}
|
||||
final String skipOffsetPackageName = activity.getPackageName();
|
||||
// Use negated priority for order, because tile priority is based on intent-filter
|
||||
// (larger value has higher priority). However pref order defines smaller value has
|
||||
// higher priority.
|
||||
if (tile.priority != 0) {
|
||||
// If order is set in the meta data, use that order. Otherwise, check the intent priority.
|
||||
if (order == null && tile.priority != 0) {
|
||||
// Use negated priority for order, because tile priority is based on intent-filter
|
||||
// (larger value has higher priority). However pref order defines smaller value has
|
||||
// higher priority.
|
||||
order = -tile.priority;
|
||||
}
|
||||
if (order != null) {
|
||||
boolean shouldSkipBaseOrderOffset = false;
|
||||
if (tile.intent != null) {
|
||||
shouldSkipBaseOrderOffset = TextUtils.equals(
|
||||
skipOffsetPackageName, tile.intent.getComponent().getPackageName());
|
||||
}
|
||||
if (shouldSkipBaseOrderOffset || baseOrder == Preference.DEFAULT_ORDER) {
|
||||
pref.setOrder(-tile.priority);
|
||||
pref.setOrder(order);
|
||||
} else {
|
||||
pref.setOrder(-tile.priority + baseOrder);
|
||||
pref.setOrder(order + baseOrder);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -314,6 +314,33 @@ public class DashboardFeatureProviderImplTest {
|
||||
assertThat(preference.getOrder()).isEqualTo(-tile.priority + baseOrder);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void bindPreference_withOrderMetadata_shouldUseOrderInMetadata() {
|
||||
final Preference preference = new Preference(RuntimeEnvironment.application);
|
||||
final int testOrder = -30;
|
||||
final Tile tile = new Tile();
|
||||
tile.metaData = new Bundle();
|
||||
tile.metaData.putInt(mImpl.META_DATA_KEY_ORDER, testOrder);
|
||||
tile.priority = 10;
|
||||
mImpl.bindPreferenceToTile(mActivity, MetricsProto.MetricsEvent.VIEW_UNKNOWN,
|
||||
preference, tile, "123", Preference.DEFAULT_ORDER);
|
||||
|
||||
assertThat(preference.getOrder()).isEqualTo(testOrder);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void bindPreference_invalidOrderMetadata_shouldIgnore() {
|
||||
final Preference preference = new Preference(RuntimeEnvironment.application);
|
||||
final Tile tile = new Tile();
|
||||
tile.metaData = new Bundle();
|
||||
tile.metaData.putString(mImpl.META_DATA_KEY_ORDER, "hello");
|
||||
tile.priority = 10;
|
||||
mImpl.bindPreferenceToTile(mActivity, MetricsProto.MetricsEvent.VIEW_UNKNOWN,
|
||||
preference, tile, "123", Preference.DEFAULT_ORDER);
|
||||
|
||||
assertThat(preference.getOrder()).isEqualTo(-tile.priority);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void bindPreference_withIntentActionMetatdata_shouldSetLaunchAction() {
|
||||
Activity activity = Robolectric.buildActivity(Activity.class).get();
|
||||
|
Reference in New Issue
Block a user