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:
Doris Ling
2017-09-18 14:58:31 -07:00
parent 211ea46815
commit c879239238
2 changed files with 44 additions and 6 deletions

View File

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

View File

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