Override homepage tile positions for silky home

Create configs to record the packages and orders of homepage tiles and
then according to these data to override homepage tile positions.

Bug: 168166015
Test: visual with turning on/off silky home
Change-Id: I3fcb54ac531a124101084bb40064b5a7227bf311
diff --git a/res/values/config.xml b/res/values/config.xml
index 9a6e486..d34c481 100755
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -473,4 +473,10 @@
 
     <!-- Authority of advanced device battery prediction -->
     <string name="config_battery_prediction_authority" translatable="false"></string>
+
+    <!-- Packages for overriding tile positions on the homepage -->
+    <string-array name="config_homepage_tile_packages" translatable="false"/>
+
+    <!-- Orders for overriding tile positions on the homepage -->
+    <integer-array name="config_homepage_tile_orders"/>
 </resources>
diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
index 0243b8a..9c00e4b 100644
--- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
+++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
@@ -184,6 +184,9 @@
                 pref.setOrder(order + baseOrder);
             }
         }
+
+        overrideTilePosition(tile, pref);
+
         return outObservers.isEmpty() ? null : outObservers;
     }
 
@@ -457,4 +460,25 @@
         }
         return eligibleUsers;
     }
+
+    private void overrideTilePosition(Tile tile, Preference pref) {
+        if (FeatureFlagUtils.isEnabled(mContext, FeatureFlags.SILKY_HOME)
+                && TextUtils.equals(tile.getCategory(), CategoryKey.CATEGORY_HOMEPAGE)) {
+            final String[] homepageTilePackages = mContext.getResources().getStringArray(
+                    R.array.config_homepage_tile_packages);
+            final int[] homepageTileOrders = mContext.getResources().getIntArray(
+                    R.array.config_homepage_tile_orders);
+            if (homepageTilePackages.length == 0
+                    || homepageTilePackages.length != homepageTileOrders.length) {
+                return;
+            }
+
+            for (int i = 0; i < homepageTilePackages.length; i++) {
+                if (TextUtils.equals(tile.getPackageName(), homepageTilePackages[i])) {
+                    pref.setOrder(homepageTileOrders[i]);
+                    return;
+                }
+            }
+        }
+    }
 }
diff --git a/tests/robotests/res/values-mcc999/config.xml b/tests/robotests/res/values-mcc999/config.xml
index b1d4be9..af02d45 100644
--- a/tests/robotests/res/values-mcc999/config.xml
+++ b/tests/robotests/res/values-mcc999/config.xml
@@ -100,4 +100,14 @@
 
     <!-- Uri to query non-public Slice Uris. -->
     <string name="config_non_public_slice_query_uri" translatable="false">content://com.android.settings.slices/test</string>
+
+    <!-- Packages for overriding tile positions on the homepage -->
+    <string-array name="config_homepage_tile_packages" translatable="false">
+        <item>com.android.settings</item>
+    </string-array>
+
+    <!-- Orders for overriding tile positions on the homepage -->
+    <integer-array name="config_homepage_tile_orders">
+        <item>100</item>
+    </integer-array>
 </resources>
diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
index 36bc376..a0024c0 100644
--- a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java
@@ -707,4 +707,18 @@
         assertThat(preference.getSummary()).isEqualTo(
                 mContext.getText(R.string.about_settings_summary));
     }
+
+    @Test
+    @Config(qualifiers = "mcc999")
+    public void bindPreference_specificHomepageTile_shouldOverridePosition() {
+        FeatureFlagUtils.setEnabled(mContext, FeatureFlags.SILKY_HOME, true);
+        final Preference preference = new Preference(RuntimeEnvironment.application);
+        final Tile tile = new ActivityTile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE);
+
+        mImpl.bindPreferenceToTileAndGetObservers(mActivity, mForceRoundedIcon,
+                MetricsEvent.VIEW_UNKNOWN, preference, tile, null /*key */,
+                Preference.DEFAULT_ORDER);
+
+        assertThat(preference.getOrder()).isEqualTo(100);
+    }
 }