diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java index b0abec47a3b..96d21ceeb04 100644 --- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java +++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java @@ -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); } } } diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java index ef907542714..2f4e6d857f1 100644 --- a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java @@ -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();