From 87f35e26bacd752c08aa5a9bc72ae9cca6aaecf0 Mon Sep 17 00:00:00 2001 From: Daniel Nishi Date: Mon, 22 Jan 2018 15:17:25 -0800 Subject: [PATCH] Migrate functionality to Me Card fragment. This adds in the preferences from the Device Info page into the Me Card page. By overriding the expanded children count, these preferences appear in the the overflow (reflecting their more power user-y status). Bug: 63819909 Test: Manual & Robotest Change-Id: Ic342babfb34db6343b11300eadb30b09a69f56f1 --- AndroidManifest.xml | 4 +- res/values/strings.xml | 11 +- res/xml/me_card.xml | 50 ------ res/xml/my_device_info.xml | 167 ++++++++++++++++++ .../aboutphone/MyDeviceInfoFragment.java} | 55 +++++- .../search/SearchIndexableResourcesImpl.java | 4 +- .../deviceinfo/MyDeviceInfoFragmentTest.java | 100 +++++++++++ 7 files changed, 326 insertions(+), 65 deletions(-) delete mode 100644 res/xml/me_card.xml create mode 100644 res/xml/my_device_info.xml rename src/com/android/settings/{MeCardFragment.java => deviceinfo/aboutphone/MyDeviceInfoFragment.java} (61%) create mode 100644 tests/robotests/src/com/android/settings/deviceinfo/MyDeviceInfoFragmentTest.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index a36ec8ba29c..368183d7496 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1011,7 +1011,7 @@ android:taskAffinity="com.android.settings" android:parentActivityName="Settings"> - + @@ -1027,7 +1027,7 @@ + android:value="com.android.settings.deviceinfo.aboutphone.MyDeviceInfoFragment" /> diff --git a/res/values/strings.xml b/res/values/strings.xml index eea6dddacde..3ab8e761674 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -6437,6 +6437,7 @@ + Account for content @@ -9230,14 +9231,14 @@ - My Phone + My Phone - My Tablet + My Tablet - My Device + My Device - Account + Account - Device name + Device name diff --git a/res/xml/me_card.xml b/res/xml/me_card.xml deleted file mode 100644 index 2d8c21f6073..00000000000 --- a/res/xml/me_card.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/res/xml/my_device_info.xml b/res/xml/my_device_info.xml new file mode 100644 index 00000000000..673b2a5722a --- /dev/null +++ b/res/xml/my_device_info.xml @@ -0,0 +1,167 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/com/android/settings/MeCardFragment.java b/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java similarity index 61% rename from src/com/android/settings/MeCardFragment.java rename to src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java index 9790fd5e3fb..a3018072c30 100644 --- a/src/com/android/settings/MeCardFragment.java +++ b/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.settings; +package com.android.settings.deviceinfo.aboutphone; import android.app.Activity; import android.app.Fragment; @@ -23,13 +23,32 @@ import android.content.pm.UserInfo; import android.os.Bundle; import android.os.UserManager; import android.provider.SearchIndexableResource; +import android.telephony.TelephonyManager; import android.view.View; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; +import com.android.settings.R; +import com.android.settings.SettingsActivity; +import com.android.settings.Utils; import com.android.settings.applications.LayoutPreference; import com.android.settings.dashboard.DashboardFragment; +import com.android.settings.deviceinfo.BluetoothAddressPreferenceController; import com.android.settings.deviceinfo.BrandedAccountPreferenceController; +import com.android.settings.deviceinfo.BuildNumberPreferenceController; +import com.android.settings.deviceinfo.DeviceModelPreferenceController; +import com.android.settings.deviceinfo.FccEquipmentIdPreferenceController; +import com.android.settings.deviceinfo.FeedbackPreferenceController; +import com.android.settings.deviceinfo.ImsStatusPreferenceController; +import com.android.settings.deviceinfo.IpAddressPreferenceController; +import com.android.settings.deviceinfo.ManualPreferenceController; import com.android.settings.deviceinfo.PhoneNumberPreferenceController; +import com.android.settings.deviceinfo.RegulatoryInfoPreferenceController; +import com.android.settings.deviceinfo.SafetyInfoPreferenceController; +import com.android.settings.deviceinfo.WifiMacAddressPreferenceController; +import com.android.settings.deviceinfo.firmwareversion.FirmwareVersionPreferenceController; +import com.android.settings.deviceinfo.imei.ImeiInfoPreferenceController; +import com.android.settings.deviceinfo.simstatus.SimStatusPreferenceController; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settings.widget.EntityHeaderController; @@ -40,10 +59,11 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -public class MeCardFragment extends DashboardFragment implements Indexable { +public class MyDeviceInfoFragment extends DashboardFragment { private static final String LOG_TAG = "MeCardFragment"; - private static final String KEY_ME_CARD_HEADER = "me_card_header"; + private static final String KEY_MY_DEVICE_INFO_HEADER = "my_device_info_header"; + private static final String KEY_LEGAL_CONTAINER = "legal_container"; @Override public int getMetricsCategory() { @@ -68,7 +88,7 @@ public class MeCardFragment extends DashboardFragment implements Indexable { @Override protected int getPreferenceScreenResId() { - return R.xml.me_card; + return R.xml.my_device_info; } @Override @@ -82,6 +102,21 @@ public class MeCardFragment extends DashboardFragment implements Indexable { final List controllers = new ArrayList<>(); controllers.add(new PhoneNumberPreferenceController(context)); controllers.add(new BrandedAccountPreferenceController(context)); + controllers.add(new SimStatusPreferenceController(context, fragment)); + controllers.add(new DeviceModelPreferenceController(context, fragment)); + controllers.add(new ImeiInfoPreferenceController(context, fragment)); + controllers.add(new FirmwareVersionPreferenceController(context, fragment)); + controllers.add(new ImsStatusPreferenceController(context, lifecycle)); + controllers.add(new IpAddressPreferenceController(context, lifecycle)); + controllers.add(new WifiMacAddressPreferenceController(context, lifecycle)); + controllers.add(new BluetoothAddressPreferenceController(context, lifecycle)); + controllers.add(new RegulatoryInfoPreferenceController(context)); + controllers.add(new SafetyInfoPreferenceController(context)); + controllers.add(new ManualPreferenceController(context)); + controllers.add(new FeedbackPreferenceController(fragment, context)); + controllers.add(new FccEquipmentIdPreferenceController(context)); + controllers.add( + new BuildNumberPreferenceController(context, activity, fragment, lifecycle)); // TODO: Add preference controller for getting the device name. return controllers; } @@ -89,7 +124,7 @@ public class MeCardFragment extends DashboardFragment implements Indexable { private void initHeader() { // TODO: Migrate into its own controller. final LayoutPreference headerPreference = - (LayoutPreference) getPreferenceScreen().findPreference(KEY_ME_CARD_HEADER); + (LayoutPreference) getPreferenceScreen().findPreference(KEY_MY_DEVICE_INFO_HEADER); final View appSnippet = headerPreference.findViewById(R.id.entity_header); final Activity context = getActivity(); final Bundle bundle = getArguments(); @@ -123,7 +158,7 @@ public class MeCardFragment extends DashboardFragment implements Indexable { public List getXmlResourcesToIndex( Context context, boolean enabled) { final SearchIndexableResource sir = new SearchIndexableResource(context); - sir.xmlResId = R.xml.me_card; + sir.xmlResId = R.xml.my_device_info; return Arrays.asList(sir); } @@ -133,5 +168,13 @@ public class MeCardFragment extends DashboardFragment implements Indexable { return buildPreferenceControllers(context, null /*activity */, null /* fragment */, null /* lifecycle */); } + + @Override + public List getNonIndexableKeys(Context context) { + List keys = super.getNonIndexableKeys(context); + // The legal container is duplicated, so we ignore it here. + keys.add(KEY_LEGAL_CONTAINER); + return keys; + } }; } diff --git a/src/com/android/settings/search/SearchIndexableResourcesImpl.java b/src/com/android/settings/search/SearchIndexableResourcesImpl.java index 4067e6b69af..034cbd0e06b 100644 --- a/src/com/android/settings/search/SearchIndexableResourcesImpl.java +++ b/src/com/android/settings/search/SearchIndexableResourcesImpl.java @@ -21,7 +21,7 @@ import android.support.annotation.VisibleForTesting; import com.android.settings.DateTimeSettings; import com.android.settings.DisplaySettings; import com.android.settings.LegalSettings; -import com.android.settings.MeCardFragment; +import com.android.settings.deviceinfo.aboutphone.MyDeviceInfoFragment; import com.android.settings.accessibility.AccessibilitySettings; import com.android.settings.accessibility.AccessibilityShortcutPreferenceFragment; import com.android.settings.accessibility.MagnificationPreferenceFragment; @@ -174,7 +174,7 @@ public class SearchIndexableResourcesImpl implements SearchIndexableResources { addIndex(ZenModeAutomationSettings.class); addIndex(NightDisplaySettings.class); addIndex(SmartBatterySettings.class); - addIndex(MeCardFragment.class); + addIndex(MyDeviceInfoFragment.class); } @Override diff --git a/tests/robotests/src/com/android/settings/deviceinfo/MyDeviceInfoFragmentTest.java b/tests/robotests/src/com/android/settings/deviceinfo/MyDeviceInfoFragmentTest.java new file mode 100644 index 00000000000..36f0662c2a8 --- /dev/null +++ b/tests/robotests/src/com/android/settings/deviceinfo/MyDeviceInfoFragmentTest.java @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2018 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.deviceinfo; + +import static com.android.settings.SettingsActivity.EXTRA_FRAGMENT_ARG_KEY; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.app.Activity; +import android.content.Context; +import android.os.Bundle; +import android.support.v7.preference.PreferenceScreen; +import android.telephony.TelephonyManager; + +import com.android.settings.deviceinfo.aboutphone.MyDeviceInfoFragment; +import com.android.settings.TestConfig; +import com.android.settings.testutils.FakeFeatureFactory; +import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.testutils.shadow.SettingsShadowResources; +import com.android.settings.testutils.shadow.SettingsShadowSystemProperties; +import com.android.settings.testutils.shadow.ShadowConnectivityManager; +import com.android.settings.testutils.shadow.ShadowUserManager; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; +import org.robolectric.shadows.ShadowApplication; + +@RunWith(SettingsRobolectricTestRunner.class) +@Config( + manifest = TestConfig.MANIFEST_PATH, + sdk = TestConfig.SDK_VERSION, + shadows = {ShadowConnectivityManager.class, ShadowUserManager.class} +) +public class MyDeviceInfoFragmentTest { + @Mock + private Activity mActivity; + @Mock + private PreferenceScreen mScreen; + @Mock + private TelephonyManager mTelephonyManager; + + private Context mContext; + private MyDeviceInfoFragment mSettings; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + FakeFeatureFactory.setupForTest(); + mContext = RuntimeEnvironment.application; + mSettings = spy(new MyDeviceInfoFragment()); + + when(mSettings.getActivity()).thenReturn(mActivity); + when(mSettings.getContext()).thenReturn(mContext); + when(mActivity.getTheme()).thenReturn(mContext.getTheme()); + when(mActivity.getResources()).thenReturn(mContext.getResources()); + doNothing().when(mSettings).onCreatePreferences(any(), any()); + + doReturn(mScreen).when(mSettings).getPreferenceScreen(); + when(mSettings.getPreferenceScreen()).thenReturn(mScreen); + ShadowApplication.getInstance().setSystemService(Context.TELEPHONY_SERVICE, + mTelephonyManager); + } + + @Test + @Config(shadows = {SettingsShadowResources.SettingsShadowTheme.class, + SettingsShadowSystemProperties.class}) + public void onCreate_fromSearch_shouldNotOverrideInitialExpandedCount() { + final Bundle args = new Bundle(); + args.putString(EXTRA_FRAGMENT_ARG_KEY, "search_key"); + mSettings.setArguments(args); + + mSettings.onCreate(null /* icicle */); + + verify(mScreen).setInitialExpandedChildrenCount(Integer.MAX_VALUE); + } +}