Add fragment in xml instead of using injected way

- It can improve performance because we use less injected item
- Also remove summary provider from those fragments

Bug: 141653158
Test: robolectric
Change-Id: I6255f71b3b8300aea064a4fefd6711c1ff59e08a
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 310af0e..d0a2c05 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -592,14 +592,8 @@
                 <category android:name="android.intent.category.VOICE_LAUNCH" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
-            <intent-filter>
-                <action android:name="com.android.settings.action.SETTINGS" />
-            </intent-filter>
-            <meta-data android:name="com.android.settings.category"
-                android:value="com.android.settings.category.ia.system" />
-            <meta-data android:name="com.android.settings.order" android:value="-240"/>
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
-                android:value="com.android.settings.DateTimeSettings" />
+                android:value="com.android.settings.datetime.DateTimeSettings" />
             <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
                 android:value="true" />
         </activity>
@@ -640,12 +634,6 @@
                 <category android:name="android.intent.category.VOICE_LAUNCH" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
-            <intent-filter>
-                <action android:name="com.android.settings.action.SETTINGS"/>
-            </intent-filter>
-            <meta-data android:name="com.android.settings.order" android:value="-260"/>
-            <meta-data android:name="com.android.settings.category"
-                       android:value="com.android.settings.category.ia.system"/>
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                        android:value="com.android.settings.language.LanguageAndInputSettings"/>
             <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
@@ -2387,11 +2375,11 @@
             </intent-filter>
             <meta-data android:name="com.android.settings.order" android:value="-45"/>
             <meta-data android:name="com.android.settings.category"
-                android:value="com.android.settings.category.ia.system" />
+                       android:value="com.android.settings.category.ia.system" />
             <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
-                android:value="com.android.settings.users.UserSettings" />
+                       android:value="com.android.settings.users.UserSettings" />
             <meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
-                android:value="true" />
+                       android:value="true" />
         </activity>
 
         <activity
diff --git a/res/xml/system_dashboard_fragment.xml b/res/xml/system_dashboard_fragment.xml
index 6a753f2..88b8d2f 100644
--- a/res/xml/system_dashboard_fragment.xml
+++ b/res/xml/system_dashboard_fragment.xml
@@ -22,6 +22,14 @@
     settings:initialExpandedChildrenCount="4">
 
     <Preference
+        android:key="language_input_settings"
+        android:title="@string/language_settings"
+        android:icon="@drawable/ic_settings_language"
+        android:order="-260"
+        android:fragment="com.android.settings.language.LanguageAndInputSettings"
+        settings:controller="com.android.settings.language.LanguageAndInputPreferenceController"/>
+
+    <Preference
         android:key="gesture_settings"
         android:title="@string/gesture_preference_title"
         android:icon="@drawable/ic_settings_gestures"
@@ -30,6 +38,14 @@
         settings:controller="com.android.settings.gestures.GesturesSettingPreferenceController"/>
 
     <Preference
+        android:key="date_time_settings"
+        android:title="@string/date_and_time"
+        android:icon="@drawable/ic_settings_date_time"
+        android:order="-240"
+        android:fragment="com.android.settings.datetime.DateTimeSettings"
+        settings:controller="com.android.settings.datetime.DateTimePreferenceController"/>
+
+    <Preference
         android:key="reset_dashboard"
         android:title="@string/reset_dashboard_title"
         android:summary="@string/reset_dashboard_summary"
@@ -47,7 +63,7 @@
         android:order="-30"
         settings:keywords="@string/keywords_system_update_settings"
         settings:controller="com.android.settings.system.SystemUpdatePreferenceController">
-        <intent android:action="android.settings.SYSTEM_UPDATE_SETTINGS" />
+        <intent android:action="android.settings.SYSTEM_UPDATE_SETTINGS"/>
     </Preference>
 
     <Preference
@@ -57,7 +73,7 @@
         settings:controller="com.android.settings.system.AdditionalSystemUpdatePreferenceController">
         <intent android:action="android.intent.action.MAIN"
                 android:targetPackage="@string/additional_system_update"
-                android:targetClass="@string/additional_system_update_menu" />
+                android:targetClass="@string/additional_system_update_menu"/>
     </Preference>
 
 </PreferenceScreen>
\ No newline at end of file
diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java
index 945ac5c..aa96a02 100644
--- a/src/com/android/settings/core/gateway/SettingsGateway.java
+++ b/src/com/android/settings/core/gateway/SettingsGateway.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.core.gateway;
 
-import com.android.settings.DateTimeSettings;
 import com.android.settings.DisplaySettings;
 import com.android.settings.IccLockSettings;
 import com.android.settings.MasterClear;
@@ -63,6 +62,7 @@
 import com.android.settings.datausage.DataSaverSummary;
 import com.android.settings.datausage.DataUsageList;
 import com.android.settings.datausage.DataUsageSummary;
+import com.android.settings.datetime.DateTimeSettings;
 import com.android.settings.deletionhelper.AutomaticStorageManagerSettings;
 import com.android.settings.development.DevelopmentSettingsDashboardFragment;
 import com.android.settings.deviceinfo.PrivateVolumeForget;
diff --git a/src/com/android/settings/datetime/DateTimePreferenceController.java b/src/com/android/settings/datetime/DateTimePreferenceController.java
new file mode 100644
index 0000000..c2b2b00
--- /dev/null
+++ b/src/com/android/settings/datetime/DateTimePreferenceController.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.settings.datetime;
+
+import android.content.Context;
+
+import com.android.settings.core.BasePreferenceController;
+import com.android.settingslib.datetime.ZoneGetter;
+
+import java.util.Calendar;
+
+public class DateTimePreferenceController extends BasePreferenceController {
+
+    public DateTimePreferenceController(Context context, String key) {
+        super(context, key);
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return AVAILABLE;
+    }
+
+    @Override
+    public CharSequence getSummary() {
+        final Calendar now = Calendar.getInstance();
+        return ZoneGetter.getTimeZoneOffsetAndName(mContext,
+                now.getTimeZone(), now.getTime());
+    }
+}
diff --git a/src/com/android/settings/DateTimeSettings.java b/src/com/android/settings/datetime/DateTimeSettings.java
similarity index 73%
rename from src/com/android/settings/DateTimeSettings.java
rename to src/com/android/settings/datetime/DateTimeSettings.java
index dd489da..469a4c7 100644
--- a/src/com/android/settings/DateTimeSettings.java
+++ b/src/com/android/settings/datetime/DateTimeSettings.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2008 The Android Open Source Project
+ * Copyright (C) 2019 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -11,10 +11,10 @@
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
- * limitations under the License.
+ * limitations under the License
  */
 
-package com.android.settings;
+package com.android.settings.datetime;
 
 import android.app.Activity;
 import android.app.Dialog;
@@ -22,23 +22,13 @@
 import android.content.Context;
 import android.content.Intent;
 
+import com.android.settings.R;
 import com.android.settings.dashboard.DashboardFragment;
-import com.android.settings.dashboard.SummaryLoader;
-import com.android.settings.datetime.AutoTimeFormatPreferenceController;
-import com.android.settings.datetime.AutoTimePreferenceController;
-import com.android.settings.datetime.AutoTimeZonePreferenceController;
-import com.android.settings.datetime.DatePreferenceController;
-import com.android.settings.datetime.TimeChangeListenerMixin;
-import com.android.settings.datetime.TimeFormatPreferenceController;
-import com.android.settings.datetime.TimePreferenceController;
-import com.android.settings.datetime.TimeZonePreferenceController;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settingslib.core.AbstractPreferenceController;
-import com.android.settingslib.datetime.ZoneGetter;
 import com.android.settingslib.search.SearchIndexable;
 
 import java.util.ArrayList;
-import java.util.Calendar;
 import java.util.List;
 
 @SearchIndexable
@@ -144,36 +134,6 @@
         showDialog(DatePreferenceController.DIALOG_DATEPICKER);
     }
 
-    private static class SummaryProvider implements SummaryLoader.SummaryProvider {
-
-        private final Context mContext;
-        private final SummaryLoader mSummaryLoader;
-
-        public SummaryProvider(Context context, SummaryLoader summaryLoader) {
-            mContext = context;
-            mSummaryLoader = summaryLoader;
-        }
-
-        @Override
-        public void setListening(boolean listening) {
-            if (listening) {
-                final Calendar now = Calendar.getInstance();
-                mSummaryLoader.setSummary(this, ZoneGetter.getTimeZoneOffsetAndName(mContext,
-                        now.getTimeZone(), now.getTime()));
-            }
-        }
-    }
-
-    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
-            = new SummaryLoader.SummaryProviderFactory() {
-        @Override
-        public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
-                SummaryLoader summaryLoader) {
-            return new SummaryProvider(activity, summaryLoader);
-        }
-    };
-
-
     public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new BaseSearchIndexProvider(R.xml.date_time_prefs);
 }
diff --git a/src/com/android/settings/language/LanguageAndInputPreferenceController.java b/src/com/android/settings/language/LanguageAndInputPreferenceController.java
new file mode 100644
index 0000000..04bf622
--- /dev/null
+++ b/src/com/android/settings/language/LanguageAndInputPreferenceController.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.settings.language;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodManager;
+
+import com.android.settings.core.BasePreferenceController;
+
+import java.util.List;
+
+public class LanguageAndInputPreferenceController extends BasePreferenceController {
+
+    private PackageManager mPackageManager;
+    private InputMethodManager mInputMethodManager;
+
+    public LanguageAndInputPreferenceController(Context context, String key) {
+        super(context, key);
+        mPackageManager = mContext.getPackageManager();
+        mInputMethodManager = mContext.getSystemService(InputMethodManager.class);
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return AVAILABLE;
+    }
+
+    @Override
+    public CharSequence getSummary() {
+        final String flattenComponent = Settings.Secure.getString(
+                mContext.getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD);
+        if (!TextUtils.isEmpty(flattenComponent)) {
+            final String pkg = ComponentName.unflattenFromString(flattenComponent)
+                    .getPackageName();
+            final List<InputMethodInfo> imis = mInputMethodManager.getInputMethodList();
+            for (InputMethodInfo imi : imis) {
+                if (TextUtils.equals(imi.getPackageName(), pkg)) {
+                    return imi.loadLabel(mPackageManager);
+                }
+            }
+        }
+        return "";
+    }
+}
diff --git a/src/com/android/settings/language/LanguageAndInputSettings.java b/src/com/android/settings/language/LanguageAndInputSettings.java
index 4f45890..c896629 100644
--- a/src/com/android/settings/language/LanguageAndInputSettings.java
+++ b/src/com/android/settings/language/LanguageAndInputSettings.java
@@ -18,21 +18,13 @@
 
 import android.app.Activity;
 import android.app.settings.SettingsEnums;
-import android.content.ComponentName;
-import android.content.ContentResolver;
 import android.content.Context;
-import android.content.pm.PackageManager;
-import android.provider.Settings;
-import android.text.TextUtils;
-import android.view.inputmethod.InputMethodInfo;
-import android.view.inputmethod.InputMethodManager;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 
 import com.android.settings.R;
 import com.android.settings.dashboard.DashboardFragment;
-import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.inputmethod.PhysicalKeyboardPreferenceController;
 import com.android.settings.inputmethod.SpellCheckerPreferenceController;
 import com.android.settings.inputmethod.VirtualKeyboardPreferenceController;
@@ -122,44 +114,6 @@
         return controllers;
     }
 
-    private static class SummaryProvider implements SummaryLoader.SummaryProvider {
-
-        private final Context mContext;
-        private final SummaryLoader mSummaryLoader;
-
-        public SummaryProvider(Context context, SummaryLoader summaryLoader) {
-            mContext = context;
-            mSummaryLoader = summaryLoader;
-        }
-
-        @Override
-        public void setListening(boolean listening) {
-            final ContentResolver contentResolver = mContext.getContentResolver();
-            if (listening) {
-                final String flattenComponent = Settings.Secure.getString(
-                        contentResolver, Settings.Secure.DEFAULT_INPUT_METHOD);
-                if (!TextUtils.isEmpty(flattenComponent)) {
-                    final PackageManager packageManage = mContext.getPackageManager();
-                    final String pkg = ComponentName.unflattenFromString(flattenComponent)
-                            .getPackageName();
-                    final InputMethodManager imm = (InputMethodManager)
-                            mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
-                    final List<InputMethodInfo> imis = imm.getInputMethodList();
-                    for (InputMethodInfo imi : imis) {
-                        if (TextUtils.equals(imi.getPackageName(), pkg)) {
-                            mSummaryLoader.setSummary(this, imi.loadLabel(packageManage));
-                            return;
-                        }
-                    }
-                }
-                mSummaryLoader.setSummary(this, "");
-            }
-        }
-    }
-
-    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
-            = (activity, summaryLoader) -> new SummaryProvider(activity, summaryLoader);
-
     public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new BaseSearchIndexProvider(R.xml.language_and_input) {
 
diff --git a/tests/robotests/src/com/android/settings/language/LanguageAndInputPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/language/LanguageAndInputPreferenceControllerTest.java
new file mode 100644
index 0000000..3f27fdd
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/language/LanguageAndInputPreferenceControllerTest.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.settings.language;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.ComponentName;
+import android.content.ContentResolver;
+import android.content.Context;
+import android.provider.Settings;
+import android.view.inputmethod.InputMethodInfo;
+
+import com.android.settings.testutils.shadow.ShadowInputMethodManagerWithMethodList;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(shadows = ShadowInputMethodManagerWithMethodList.class)
+public class LanguageAndInputPreferenceControllerTest {
+    private Context mContext;
+
+    @Before
+    public void setUp() {
+        mContext = spy(RuntimeEnvironment.application);
+    }
+
+    @Test
+    public void getSummary_shouldSetToCurrentImeName() {
+        final ComponentName componentName = new ComponentName("name1", "cls");
+        final ContentResolver cr = mContext.getContentResolver();
+        Settings.Secure.putString(cr, Settings.Secure.DEFAULT_INPUT_METHOD,
+                componentName.flattenToString());
+        final List<InputMethodInfo> imis = new ArrayList<>();
+        imis.add(mock(InputMethodInfo.class));
+        when(imis.get(0).getPackageName()).thenReturn("name1");
+        when(imis.get(0).loadLabel(any())).thenReturn("label");
+        ShadowInputMethodManagerWithMethodList.getShadow().setInputMethodList(imis);
+
+        final LanguageAndInputPreferenceController controller =
+                new LanguageAndInputPreferenceController(mContext, "key");
+
+        assertThat(controller.getSummary().toString()).contains("label");
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java b/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java
index 19e62b1..a6a362e 100644
--- a/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java
@@ -28,23 +28,17 @@
 
 import android.app.Activity;
 import android.app.admin.DevicePolicyManager;
-import android.content.ComponentName;
-import android.content.ContentResolver;
 import android.content.Context;
-import android.content.pm.PackageManager;
 import android.content.res.Resources;
 import android.hardware.input.InputManager;
 import android.os.UserManager;
-import android.provider.Settings;
 import android.view.autofill.AutofillManager;
-import android.view.inputmethod.InputMethodInfo;
 import android.view.inputmethod.InputMethodManager;
 import android.view.textservice.TextServicesManager;
 
 import androidx.lifecycle.LifecycleObserver;
 
 import com.android.settings.R;
-import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.testutils.XmlTestUtils;
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -67,16 +61,12 @@
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private Activity mActivity;
     @Mock
-    private PackageManager mPackageManager;
-    @Mock
     private InputManager mIm;
     @Mock
     private InputMethodManager mImm;
     @Mock
     private DevicePolicyManager mDpm;
     @Mock
-    private InputMethodManager mInputMethodManager;
-    @Mock
     private AutofillManager mAutofillManager;
     private TestFragment mFragment;
 
@@ -124,31 +114,6 @@
     }
 
     @Test
-    public void testSummary_shouldSetToCurrentImeName() {
-        final Activity activity = mock(Activity.class);
-        final SummaryLoader loader = mock(SummaryLoader.class);
-        final ComponentName componentName = new ComponentName("pkg", "cls");
-        final ContentResolver cr = activity.getContentResolver();
-        Settings.Secure.putString(cr, Settings.Secure.DEFAULT_INPUT_METHOD,
-                componentName.flattenToString());
-        when(activity.getSystemService(Context.INPUT_METHOD_SERVICE))
-                .thenReturn(mInputMethodManager);
-        when(activity.getPackageManager()).thenReturn(mPackageManager);
-        final List<InputMethodInfo> imis = new ArrayList<>();
-        imis.add(mock(InputMethodInfo.class));
-        when(imis.get(0).getPackageName()).thenReturn(componentName.getPackageName());
-        when(mInputMethodManager.getInputMethodList()).thenReturn(imis);
-
-        SummaryLoader.SummaryProvider provider = LanguageAndInputSettings.SUMMARY_PROVIDER_FACTORY
-                .createSummaryProvider(activity, loader);
-
-        provider.setListening(true);
-
-        verify(imis.get(0)).loadLabel(mPackageManager);
-        verify(loader).setSummary(provider, null);
-    }
-
-    @Test
     public void testNonIndexableKeys_existInXmlLayout() {
         final Context context = spy(RuntimeEnvironment.application);
         final Resources res = spy(RuntimeEnvironment.application.getResources());