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
This commit is contained in:
@@ -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"
|
||||
|
@@ -21,6 +21,14 @@
|
||||
android:title="@string/header_category_system"
|
||||
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"
|
||||
@@ -29,6 +37,14 @@
|
||||
android:fragment="com.android.settings.gestures.GestureSettings"
|
||||
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"
|
||||
@@ -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>
|
@@ -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.connecteddevice.usb.UsbDetailsFragment;
|
||||
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;
|
||||
|
@@ -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());
|
||||
}
|
||||
}
|
@@ -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.app.settings.SettingsEnums;
|
||||
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 @@ public class DateTimeSettings extends DashboardFragment implements
|
||||
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);
|
||||
}
|
@@ -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 "";
|
||||
}
|
||||
}
|
@@ -18,21 +18,13 @@ package com.android.settings.language;
|
||||
|
||||
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 @@ public class LanguageAndInputSettings extends DashboardFragment {
|
||||
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) {
|
||||
|
||||
|
@@ -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");
|
||||
}
|
||||
}
|
@@ -28,23 +28,17 @@ import static org.mockito.Mockito.when;
|
||||
|
||||
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 @@ public class LanguageAndInputSettingsTest {
|
||||
@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;
|
||||
|
||||
@@ -123,31 +113,6 @@ public class LanguageAndInputSettingsTest {
|
||||
assertThat(controllers.isEmpty()).isFalse();
|
||||
}
|
||||
|
||||
@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);
|
||||
|
Reference in New Issue
Block a user