From 400e13cc110b69250288a5f25069c974df5efa6a Mon Sep 17 00:00:00 2001 From: jackqdyulei Date: Thu, 25 Oct 2018 17:16:49 -0700 Subject: [PATCH 1/4] Update the mobile activity 1. Add listener to ACTION_RADIO_TECHNOLOGY_CHANGED 2. Update fragment switch by using replace 3. Remove todo for sort because list is already sorted by sim slot 4. Make actiivty accept SUB_ID from intent 5. Add icon for multi-sim support Bug: 114749736 Test: RunSettingsRoboTests && Screenshot Change-Id: I11c472b1479ec9243266cb2a7ef4292370ac6894 --- .../telephony/MobileNetworkFragment.java | 3 +- .../telephony/MobileSettingsActivity.java | 136 ++++++++++++------ .../telephony/NetworkSelectSettings.java | 3 +- .../gsm/AutoSelectPreferenceController.java | 3 +- ...NetworkSelectPagePreferenceController.java | 3 +- .../telephony/MobileSettingsActivityTest.java | 35 +++-- 6 files changed, 124 insertions(+), 59 deletions(-) diff --git a/src/com/android/settings/network/telephony/MobileNetworkFragment.java b/src/com/android/settings/network/telephony/MobileNetworkFragment.java index df6c7ab24af..e6db51cc5a1 100644 --- a/src/com/android/settings/network/telephony/MobileNetworkFragment.java +++ b/src/com/android/settings/network/telephony/MobileNetworkFragment.java @@ -22,6 +22,7 @@ import android.content.Intent; import android.os.Bundle; import android.os.UserManager; import android.provider.SearchIndexableResource; +import android.provider.Settings; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.text.TextUtils; @@ -106,7 +107,7 @@ public class MobileNetworkFragment extends RestrictedDashboardFragment { @Override public void onAttach(Context context) { super.onAttach(context); - mSubId = getArguments().getInt(MobileSettingsActivity.KEY_SUBSCRIPTION_ID, + mSubId = getArguments().getInt(Settings.EXTRA_SUB_ID, SubscriptionManager.INVALID_SUBSCRIPTION_ID); use(MobileDataPreferenceController.class).init(getFragmentManager(), mSubId); diff --git a/src/com/android/settings/network/telephony/MobileSettingsActivity.java b/src/com/android/settings/network/telephony/MobileSettingsActivity.java index d712515d688..b2bceb9a69b 100644 --- a/src/com/android/settings/network/telephony/MobileSettingsActivity.java +++ b/src/com/android/settings/network/telephony/MobileSettingsActivity.java @@ -17,10 +17,15 @@ package com.android.settings.network.telephony; import android.app.ActionBar; +import android.content.BroadcastReceiver; +import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.os.Bundle; +import android.provider.Settings; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; +import android.util.Log; import android.view.Menu; import android.view.View; @@ -30,68 +35,83 @@ import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; +import com.android.internal.telephony.TelephonyIntents; import com.android.internal.util.CollectionUtils; import com.android.settings.R; import com.android.settings.core.SettingsBaseActivity; import com.google.android.material.bottomnavigation.BottomNavigationView; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.List; +import java.util.Objects; public class MobileSettingsActivity extends SettingsBaseActivity { + private static final String TAG = "MobileSettingsActivity"; @VisibleForTesting static final String MOBILE_SETTINGS_TAG = "mobile_settings:"; - public static final String KEY_SUBSCRIPTION_ID = "key_subscription_id"; - public static final String KEY_CUR_SUBSCRIPTION_ID = "key_cur_subscription_id"; + @VisibleForTesting + static final int SUB_ID_NULL = Integer.MIN_VALUE; - private SubscriptionManager mSubscriptionManager; @VisibleForTesting - Integer mCurSubscriptionId; + SubscriptionManager mSubscriptionManager; @VisibleForTesting - List mSubscriptionInfos; + int mCurSubscriptionId; + @VisibleForTesting + List mSubscriptionInfos = new ArrayList<>(); + private PhoneChangeReceiver mPhoneChangeReceiver; private final SubscriptionManager.OnSubscriptionsChangedListener mOnSubscriptionsChangeListener = new SubscriptionManager.OnSubscriptionsChangedListener() { @Override public void onSubscriptionsChanged() { - updateSubscriptions(null); + if (!Objects.equals(mSubscriptionInfos, + mSubscriptionManager.getActiveSubscriptionInfoList())) { + updateSubscriptions(null); + } } }; - @Override - protected void onNewIntent(Intent intent) { - super.onNewIntent(intent); - //TODO(b/114749736): update fragment by new intent, or at least make sure this page shows - // current tab for sim card - } - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - - //TODO(b/114749736): add phone change receiver here: ACTION_RADIO_TECHNOLOGY_CHANGED - setContentView(R.layout.mobile_settings_container); setActionBar(findViewById(R.id.mobile_action_bar)); + mPhoneChangeReceiver = new PhoneChangeReceiver(); mSubscriptionManager = getSystemService(SubscriptionManager.class); mSubscriptionInfos = mSubscriptionManager.getActiveSubscriptionInfoList(); mCurSubscriptionId = savedInstanceState != null - ? savedInstanceState.getInt(KEY_CUR_SUBSCRIPTION_ID) - : null; - - mSubscriptionManager.addOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener); + ? savedInstanceState.getInt(Settings.EXTRA_SUB_ID, SUB_ID_NULL) + : SUB_ID_NULL; final ActionBar actionBar = getActionBar(); if (actionBar != null) { - // android.R.id.home will be triggered in onOptionsItemSelected() actionBar.setDisplayHomeAsUpEnabled(true); } updateSubscriptions(savedInstanceState); } + @Override + protected void onStart() { + super.onStart(); + final IntentFilter intentFilter = new IntentFilter( + TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED); + registerReceiver(mPhoneChangeReceiver, intentFilter); + mSubscriptionManager.addOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener); + } + + @Override + protected void onStop() { + super.onStop(); + unregisterReceiver(mPhoneChangeReceiver); + mSubscriptionManager.removeOnSubscriptionsChangedListener(mOnSubscriptionsChangeListener); + } + @Override protected void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); @@ -100,24 +120,42 @@ public class MobileSettingsActivity extends SettingsBaseActivity { @VisibleForTesting void saveInstanceState(@NonNull Bundle outState) { - outState.putInt(KEY_CUR_SUBSCRIPTION_ID, mCurSubscriptionId); + outState.putInt(Settings.EXTRA_SUB_ID, mCurSubscriptionId); } @VisibleForTesting void updateSubscriptions(Bundle savedInstanceState) { - //TODO(b/114749736): Sort it by phoneId mSubscriptionInfos = mSubscriptionManager.getActiveSubscriptionInfoList(); - final int subId = CollectionUtils.isEmpty(mSubscriptionInfos) - ? SubscriptionManager.INVALID_SUBSCRIPTION_ID - : mSubscriptionInfos.get(0).getSubscriptionId(); updateBottomNavigationView(); if (savedInstanceState == null) { - switchFragment(new MobileNetworkFragment(), subId); + switchFragment(new MobileNetworkFragment(), getSubscriptionId()); } } + /** + * Get the current subId to display. First check whether intent has {@link + * Settings#EXTRA_SUB_ID}. If not, just display first one in list + * since it is already sorted by sim slot. + */ + @VisibleForTesting + int getSubscriptionId() { + final Intent intent = getIntent(); + if (intent != null) { + final int subId = intent.getIntExtra(Settings.EXTRA_SUB_ID, SUB_ID_NULL); + if (subId != SUB_ID_NULL && mSubscriptionManager.isActiveSubscriptionId(subId)) { + return subId; + } + } + + if (CollectionUtils.isEmpty(mSubscriptionInfos)) { + return SubscriptionManager.INVALID_SUBSCRIPTION_ID; + } + + return mSubscriptionInfos.get(0).getSubscriptionId(); + } + @VisibleForTesting void updateBottomNavigationView() { final BottomNavigationView navigation = findViewById(R.id.bottom_nav); @@ -130,7 +168,8 @@ public class MobileSettingsActivity extends SettingsBaseActivity { for (int i = 0, size = mSubscriptionInfos.size(); i < size; i++) { final SubscriptionInfo subscriptionInfo = mSubscriptionInfos.get(i); menu.add(0, subscriptionInfo.getSubscriptionId(), i, - subscriptionInfo.getDisplayName()); + subscriptionInfo.getDisplayName()) + .setIcon(R.drawable.ic_settings_sim); } navigation.setOnNavigationItemSelectedListener(item -> { switchFragment(new MobileNetworkFragment(), item.getItemId()); @@ -141,30 +180,23 @@ public class MobileSettingsActivity extends SettingsBaseActivity { @VisibleForTesting void switchFragment(Fragment fragment, int subscriptionId) { - if (mCurSubscriptionId != null && subscriptionId == mCurSubscriptionId) { + switchFragment(fragment, subscriptionId, false /* forceUpdate */); + } + + @VisibleForTesting + void switchFragment(Fragment fragment, int subscriptionId, boolean forceUpdate) { + if (mCurSubscriptionId != SUB_ID_NULL && subscriptionId == mCurSubscriptionId + && !forceUpdate) { return; } final FragmentManager fragmentManager = getSupportFragmentManager(); final FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); final Bundle bundle = new Bundle(); - bundle.putInt(KEY_SUBSCRIPTION_ID, subscriptionId); + bundle.putInt(Settings.EXTRA_SUB_ID, subscriptionId); - if (mCurSubscriptionId != null) { - final Fragment hideFragment = fragmentManager.findFragmentByTag( - buildFragmentTag(mCurSubscriptionId)); - if (hideFragment != null) { - fragmentTransaction.hide(hideFragment); - } - } - - Fragment showFragment = fragmentManager.findFragmentByTag(buildFragmentTag(subscriptionId)); - if (showFragment == null) { - fragment.setArguments(bundle); - fragmentTransaction.add(R.id.main_content, fragment, buildFragmentTag(subscriptionId)); - } else { - showFragment.setArguments(bundle); - fragmentTransaction.show(showFragment); - } + fragment.setArguments(bundle); + fragmentTransaction.replace(R.id.main_content, fragment, + buildFragmentTag(subscriptionId)); fragmentTransaction.commit(); mCurSubscriptionId = subscriptionId; } @@ -172,4 +204,16 @@ public class MobileSettingsActivity extends SettingsBaseActivity { private String buildFragmentTag(int subscriptionId) { return MOBILE_SETTINGS_TAG + subscriptionId; } + + private class PhoneChangeReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + // When the radio changes (ex: CDMA->GSM), refresh the fragment. + // This is very rare to happen. + if (mCurSubscriptionId != SUB_ID_NULL) { + switchFragment(new MobileNetworkFragment(), mCurSubscriptionId, + true /* forceUpdate */); + } + } + } } \ No newline at end of file diff --git a/src/com/android/settings/network/telephony/NetworkSelectSettings.java b/src/com/android/settings/network/telephony/NetworkSelectSettings.java index 3e42c70198c..dbab674f855 100644 --- a/src/com/android/settings/network/telephony/NetworkSelectSettings.java +++ b/src/com/android/settings/network/telephony/NetworkSelectSettings.java @@ -23,6 +23,7 @@ import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.PersistableBundle; +import android.provider.Settings; import android.telephony.AccessNetworkConstants; import android.telephony.CarrierConfigManager; import android.telephony.CellIdentity; @@ -93,7 +94,7 @@ public class NetworkSelectSettings extends DashboardFragment { mUseNewApi = getContext().getResources().getBoolean( com.android.internal.R.bool.config_enableNewAutoSelectNetworkUI); - mSubId = getArguments().getInt(MobileSettingsActivity.KEY_SUBSCRIPTION_ID); + mSubId = getArguments().getInt(Settings.EXTRA_SUB_ID); mConnectedPreferenceCategory = (PreferenceCategory) findPreference(PREF_KEY_CONNECTED_NETWORK_OPERATOR); diff --git a/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java b/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java index 72f69cd7310..d5c704ac02e 100644 --- a/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java +++ b/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java @@ -19,6 +19,7 @@ package com.android.settings.network.telephony.gsm; import android.content.Context; import android.os.Bundle; import android.os.PersistableBundle; +import android.provider.Settings; import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; @@ -96,7 +97,7 @@ public class AutoSelectPreferenceController extends TogglePreferenceController { == TelephonyManager.NETWORK_SELECTION_MODE_AUTO; } else { final Bundle bundle = new Bundle(); - bundle.putInt(MobileSettingsActivity.KEY_SUBSCRIPTION_ID, mSubId); + bundle.putInt(Settings.EXTRA_SUB_ID, mSubId); new SubSettingLauncher(mContext) .setDestination(NetworkSelectSettings.class.getName()) .setSourceMetricsCategory(MetricsProto.MetricsEvent.MOBILE_NETWORK_SELECT) diff --git a/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceController.java b/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceController.java index 9ea977ca36b..df5e151c5da 100644 --- a/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceController.java +++ b/src/com/android/settings/network/telephony/gsm/OpenNetworkSelectPagePreferenceController.java @@ -18,6 +18,7 @@ package com.android.settings.network.telephony.gsm; import android.content.Context; import android.os.Bundle; +import android.provider.Settings; import android.telephony.ServiceState; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; @@ -84,7 +85,7 @@ public class OpenNetworkSelectPagePreferenceController extends BasePreferenceCon public boolean handlePreferenceTreeClick(Preference preference) { if (TextUtils.equals(preference.getKey(), getPreferenceKey())) { final Bundle bundle = new Bundle(); - bundle.putInt(MobileSettingsActivity.KEY_SUBSCRIPTION_ID, mSubId); + bundle.putInt(Settings.EXTRA_SUB_ID, mSubId); new SubSettingLauncher(mContext) .setDestination(NetworkSelectSettings.class.getName()) .setSourceMetricsCategory(MetricsProto.MetricsEvent.MOBILE_NETWORK_SELECT) diff --git a/tests/robotests/src/com/android/settings/network/telephony/MobileSettingsActivityTest.java b/tests/robotests/src/com/android/settings/network/telephony/MobileSettingsActivityTest.java index c5ca4276f0f..ea184fde789 100644 --- a/tests/robotests/src/com/android/settings/network/telephony/MobileSettingsActivityTest.java +++ b/tests/robotests/src/com/android/settings/network/telephony/MobileSettingsActivityTest.java @@ -23,9 +23,12 @@ import static com.google.common.truth.Truth.assertThat; 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.content.Context; +import android.content.Intent; import android.os.Bundle; +import android.provider.Settings; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.view.Menu; @@ -69,6 +72,8 @@ public class MobileSettingsActivityTest { @Mock private SubscriptionInfo mSubscriptionInfo; @Mock + private SubscriptionInfo mSubscriptionInfo2; + @Mock private FragmentManager mFragmentManager; @Mock private FragmentTransaction mFragmentTransaction; @@ -85,6 +90,9 @@ public class MobileSettingsActivityTest { mShowFragment = new Fragment(); mHideFragment = new Fragment(); mMobileSettingsActivity.mSubscriptionInfos = mSubscriptionInfos; + mMobileSettingsActivity.mSubscriptionManager = mSubscriptionManager; + when(mSubscriptionInfo.getSubscriptionId()).thenReturn(PREV_SUB_ID); + when(mSubscriptionInfo2.getSubscriptionId()).thenReturn(CURRENT_SUB_ID); doReturn(mSubscriptionManager).when(mMobileSettingsActivity).getSystemService( SubscriptionManager.class); @@ -121,23 +129,32 @@ public class MobileSettingsActivityTest { } @Test - public void switchFragment_hidePreviousFragment() { + public void switchFragment_newFragment_replaceIt() { mMobileSettingsActivity.mCurSubscriptionId = PREV_SUB_ID; mMobileSettingsActivity.switchFragment(mShowFragment, CURRENT_SUB_ID); - verify(mFragmentTransaction).hide(mHideFragment); + verify(mFragmentTransaction).replace(R.id.main_content, mShowFragment, + MOBILE_SETTINGS_TAG + CURRENT_SUB_ID); } @Test - public void switchFragment_fragmentExist_showItWithArguments() { - mMobileSettingsActivity.mCurSubscriptionId = PREV_SUB_ID; + public void getSubscriptionId_hasIntent_getIdFromIntent() { + final Intent intent = new Intent(); + intent.putExtra(Settings.EXTRA_SUB_ID, CURRENT_SUB_ID); + doReturn(intent).when(mMobileSettingsActivity).getIntent(); + doReturn(true).when(mSubscriptionManager).isActiveSubscriptionId(CURRENT_SUB_ID); - mMobileSettingsActivity.switchFragment(mShowFragment, CURRENT_SUB_ID); + assertThat(mMobileSettingsActivity.getSubscriptionId()).isEqualTo(CURRENT_SUB_ID); + } - assertThat(mShowFragment.getArguments().getInt( - MobileSettingsActivity.KEY_SUBSCRIPTION_ID)).isEqualTo(CURRENT_SUB_ID); - verify(mFragmentTransaction).show(mShowFragment); + @Test + public void getSubscriptionId_noIntent_firstIdInList() { + doReturn(null).when(mMobileSettingsActivity).getIntent(); + mSubscriptionInfos.add(mSubscriptionInfo); + mSubscriptionInfos.add(mSubscriptionInfo2); + + assertThat(mMobileSettingsActivity.getSubscriptionId()).isEqualTo(PREV_SUB_ID); } @Test @@ -149,7 +166,7 @@ public class MobileSettingsActivityTest { mMobileSettingsActivity.saveInstanceState(bundle); - assertThat(bundle.getInt(MobileSettingsActivity.KEY_CUR_SUBSCRIPTION_ID)).isEqualTo( + assertThat(bundle.getInt(Settings.EXTRA_SUB_ID)).isEqualTo( PREV_SUB_ID); } } From 1d88f4c61b622f03ba5ba2cdf6911dcee5449e6a Mon Sep 17 00:00:00 2001 From: Raff Tsai Date: Mon, 29 Oct 2018 13:50:47 +0800 Subject: [PATCH 2/4] Fix Settings crash on changing device orientation - AppDataUsage assign preferences to Applist in loaderCallback. When device rotate we will assign preference to Applist second time which throw IllegalStateException Exception. We will use restartLoader which create new loader rather than use existed loader. Change-Id: I540d645e930a29f989c4fe374e2103ca201da198 Fixes: 118195540 Test: manual --- src/com/android/settings/datausage/AppDataUsage.java | 5 +++-- src/com/android/settings/datausage/AppDataUsageV2.java | 6 ++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/com/android/settings/datausage/AppDataUsage.java b/src/com/android/settings/datausage/AppDataUsage.java index 4dddeab6b2e..78aa6c27868 100644 --- a/src/com/android/settings/datausage/AppDataUsage.java +++ b/src/com/android/settings/datausage/AppDataUsage.java @@ -190,7 +190,8 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC if (mPackages.size() > 1) { mAppList = (PreferenceCategory) findPreference(KEY_APP_LIST); - getLoaderManager().initLoader(LOADER_APP_PREF, Bundle.EMPTY, mAppPrefCallbacks); + LoaderManager.getInstance(this).restartLoader(LOADER_APP_PREF, Bundle.EMPTY, + mAppPrefCallbacks); } else { removePreference(KEY_APP_LIST); } @@ -221,7 +222,7 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC mDataSaverBackend.addListener(this); } mPolicy = services.mPolicyEditor.getPolicy(mTemplate); - getLoaderManager().restartLoader(LOADER_CHART_DATA, + LoaderManager.getInstance(this).restartLoader(LOADER_CHART_DATA, ChartDataLoaderCompat.buildArgs(mTemplate, mAppItem), mChartDataCallbacks); updatePrefs(); } diff --git a/src/com/android/settings/datausage/AppDataUsageV2.java b/src/com/android/settings/datausage/AppDataUsageV2.java index 7515c51d5c5..6a31726ea06 100644 --- a/src/com/android/settings/datausage/AppDataUsageV2.java +++ b/src/com/android/settings/datausage/AppDataUsageV2.java @@ -177,7 +177,8 @@ public class AppDataUsageV2 extends DataUsageBaseFragment implements OnPreferenc if (mPackages.size() > 1) { mAppList = (PreferenceCategory) findPreference(KEY_APP_LIST); - getLoaderManager().initLoader(LOADER_APP_PREF, Bundle.EMPTY, mAppPrefCallbacks); + LoaderManager.getInstance(this).restartLoader(LOADER_APP_PREF, Bundle.EMPTY, + mAppPrefCallbacks); } else { removePreference(KEY_APP_LIST); } @@ -201,7 +202,8 @@ public class AppDataUsageV2 extends DataUsageBaseFragment implements OnPreferenc if (mDataSaverBackend != null) { mDataSaverBackend.addListener(this); } - getLoaderManager().restartLoader(LOADER_APP_USAGE_DATA, null /* args */, mUidDataCallbacks); + LoaderManager.getInstance(this).restartLoader(LOADER_APP_USAGE_DATA, null /* args */, + mUidDataCallbacks); updatePrefs(); } From 0023558ec34b964aaa21ddff72427c9af7581380 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Mon, 29 Oct 2018 15:42:06 -0700 Subject: [PATCH 3/4] Fix Display settings summary when there is no wallpaper. Change-Id: I715cef9dc42de1231491b5a7184f0f151d94af11 Fixes: 69905032 Test: robotests --- res/values/strings.xml | 4 + res/xml/display_settings.xml | 2 +- res/xml/top_level_settings.xml | 5 +- src/com/android/settings/DisplaySettings.java | 1 - .../TopLevelDisplayPreferenceController.java | 44 +++++++++ .../WallpaperPreferenceController.java | 24 ++--- ...pLevelDisplayPreferenceControllerTest.java | 92 +++++++++++++++++++ .../WallpaperPreferenceControllerTest.java | 10 +- 8 files changed, 157 insertions(+), 25 deletions(-) create mode 100644 src/com/android/settings/display/TopLevelDisplayPreferenceController.java create mode 100644 tests/robotests/src/com/android/settings/display/TopLevelDisplayPreferenceControllerTest.java diff --git a/res/values/strings.xml b/res/values/strings.xml index f2661bda11b..56dbc6b8e97 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -8920,6 +8920,10 @@ Sleep after %1$s of inactivity Wallpaper, sleep, font size + + + Sleep, font size + Sleep after 10 minutes of inactivity diff --git a/res/xml/display_settings.xml b/res/xml/display_settings.xml index db4e7d87838..b0e362c41a6 100644 --- a/res/xml/display_settings.xml +++ b/res/xml/display_settings.xml @@ -52,7 +52,7 @@ android:title="@string/wallpaper_settings_title" settings:keywords="@string/keywords_display_wallpaper" settings:useAdminDisabledSummary="true" - settings:searchable="false"> + settings:controller="com.android.settings.display.WallpaperPreferenceController"> diff --git a/res/xml/top_level_settings.xml b/res/xml/top_level_settings.xml index dbb106ec03d..889761bb134 100644 --- a/res/xml/top_level_settings.xml +++ b/res/xml/top_level_settings.xml @@ -59,10 +59,11 @@ + android:fragment="com.android.settings.DisplaySettings" + settings:controller="com.android.settings.display.TopLevelDisplayPreferenceController"/> resolveInfos = pm.queryIntentActivities(intent, 0 /* flags */); - return resolveInfos != null && resolveInfos.size() != 0; - } - - @Override - public String getPreferenceKey() { - return KEY_WALLPAPER; + return resolveInfos != null && !resolveInfos.isEmpty() + ? AVAILABLE_UNSEARCHABLE : CONDITIONALLY_UNAVAILABLE; } @Override diff --git a/tests/robotests/src/com/android/settings/display/TopLevelDisplayPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/TopLevelDisplayPreferenceControllerTest.java new file mode 100644 index 00000000000..fe4fcc8e225 --- /dev/null +++ b/tests/robotests/src/com/android/settings/display/TopLevelDisplayPreferenceControllerTest.java @@ -0,0 +1,92 @@ +/* + * 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.display; + +import static com.android.settings.core.BasePreferenceController.AVAILABLE; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; + +import com.android.settings.R; +import com.android.settings.testutils.SettingsRobolectricTestRunner; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.util.ArrayList; +import java.util.List; + +@RunWith(SettingsRobolectricTestRunner.class) +public class TopLevelDisplayPreferenceControllerTest { + @Mock + private Context mContext; + @Mock + private PackageManager mPackageManager; + + private TopLevelDisplayPreferenceController mController; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + when(mContext.getPackageManager()).thenReturn(mPackageManager); + when(mContext.getString(R.string.config_wallpaper_picker_package)) + .thenReturn("pkg"); + when(mContext.getString(R.string.config_wallpaper_picker_class)) + .thenReturn("cls"); + + mController = new TopLevelDisplayPreferenceController(mContext, "test_key"); + } + + @Test + public void getAvailability_alwaysAvailable() { + assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE); + } + + @Test + public void getSummary_hasWallpaper_shouldReturnWallpaperSummary() { + final List resolveInfos = new ArrayList<>(); + resolveInfos.add(mock(ResolveInfo.class)); + when(mPackageManager.queryIntentActivities(any(Intent.class), anyInt())) + .thenReturn(resolveInfos); + + assertThat(mController.getSummary()) + .isEqualTo(mContext.getText(R.string.display_dashboard_summary)); + } + + @Test + public void getSummary_hasWallpaper_shouldReturnNoWallpaperSummary() { + final List resolveInfos = new ArrayList<>(); + when(mPackageManager.queryIntentActivities(any(Intent.class), anyInt())) + .thenReturn(resolveInfos); + + assertThat(mController.getSummary()) + .isEqualTo(mContext.getText(R.string.display_dashboard_nowallpaper_summary)); + } + +} diff --git a/tests/robotests/src/com/android/settings/display/WallpaperPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/WallpaperPreferenceControllerTest.java index 8a24241d4f4..b4305b6e9d6 100644 --- a/tests/robotests/src/com/android/settings/display/WallpaperPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/display/WallpaperPreferenceControllerTest.java @@ -45,6 +45,7 @@ public class WallpaperPreferenceControllerTest { private static final String WALLPAPER_PACKAGE = "TestPkg"; private static final String WALLPAPER_CLASS = "TestCls"; + private static final String TEST_KEY = "test_key"; @Mock private Context mContext; @@ -54,7 +55,7 @@ public class WallpaperPreferenceControllerTest { private WallpaperPreferenceController mController; @Before - public void setUp() throws PackageManager.NameNotFoundException { + public void setUp() { MockitoAnnotations.initMocks(this); when(mContext.getString(R.string.config_wallpaper_picker_package)) .thenReturn(WALLPAPER_PACKAGE); @@ -62,11 +63,11 @@ public class WallpaperPreferenceControllerTest { .thenReturn(WALLPAPER_CLASS); when(mContext.getPackageManager()).thenReturn(mPackageManager); - mController = new WallpaperPreferenceController(mContext); + mController = new WallpaperPreferenceController(mContext, TEST_KEY); } @Test - public void isAvailable_wallpaerPickerEnabled_shouldReturnTrue() { + public void isAvailable_wallpaperPickerEnabled_shouldReturnTrue() { final List resolveInfos = new ArrayList<>(); resolveInfos.add(mock(ResolveInfo.class)); when(mPackageManager.queryIntentActivities(any(Intent.class), anyInt())) @@ -76,7 +77,7 @@ public class WallpaperPreferenceControllerTest { } @Test - public void isAvailable_wallpaerPickerDisbled_shouldReturnFalseAndNoCrash() { + public void isAvailable_wallpaperPickerDisabled_shouldReturnFalse() { when(mPackageManager.queryIntentActivities(any(Intent.class), anyInt())).thenReturn(null); assertThat(mController.isAvailable()).isFalse(); @@ -86,6 +87,5 @@ public class WallpaperPreferenceControllerTest { .thenReturn(resolveInfos); assertThat(mController.isAvailable()).isFalse(); - // should not crash } } From 13b60bb15ab1deed5600d88f44367c92947a4cb2 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Tue, 30 Oct 2018 12:48:44 -0700 Subject: [PATCH 4/4] Stop showing account based cards in homepage. Removed data usage/device info/emergency/storage cards Bug: 118691898 Test: robotests Change-Id: I9f1ef3f022be9ca37e3359a6820a716d4ebade0f --- .../contextualcards/ContextualCardLoader.java | 20 ------------- .../SettingsContextualCardProvider.java | 28 ------------------- .../ContextualCardLoaderTest.java | 19 ++++--------- .../SettingsContextualCardProviderTest.java | 5 +--- 4 files changed, 6 insertions(+), 66 deletions(-) diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java b/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java index bc1d0fa2fd4..f3fbf06310d 100644 --- a/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java +++ b/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java @@ -33,8 +33,6 @@ import androidx.annotation.VisibleForTesting; import androidx.slice.Slice; import com.android.settings.homepage.contextualcards.deviceinfo.BatterySlice; -import com.android.settings.homepage.contextualcards.deviceinfo.DataUsageSlice; -import com.android.settings.homepage.contextualcards.deviceinfo.DeviceInfoSlice; import com.android.settingslib.utils.AsyncLoaderCompat; import java.util.ArrayList; @@ -93,15 +91,6 @@ public class ContextualCardLoader extends AsyncLoaderCompat final String packageName = mContext.getPackageName(); final double rankingScore = 0.0; final List result = new ArrayList(); - result.add(new ContextualCard.Builder() - .setSliceUri(DataUsageSlice.DATA_USAGE_CARD_URI) - .setName(DataUsageSlice.PATH_DATA_USAGE) - .setPackageName(packageName) - .setRankingScore(rankingScore) - .setAppVersion(appVersionCode) - .setCardType(ContextualCard.CardType.SLICE) - .setIsHalfWidth(false) - .build()); result.add(new ContextualCard.Builder() .setSliceUri(BatterySlice.BATTERY_CARD_URI) .setName(BatterySlice.PATH_BATTERY_INFO) @@ -111,15 +100,6 @@ public class ContextualCardLoader extends AsyncLoaderCompat .setCardType(ContextualCard.CardType.SLICE) .setIsHalfWidth(false) .build()); - result.add(new ContextualCard.Builder() - .setSliceUri(DeviceInfoSlice.DEVICE_INFO_CARD_URI) - .setName(DeviceInfoSlice.PATH_DEVICE_INFO) - .setPackageName(packageName) - .setRankingScore(rankingScore) - .setAppVersion(appVersionCode) - .setCardType(ContextualCard.CardType.SLICE) - .setIsHalfWidth(false) - .build()); return result; } diff --git a/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProvider.java b/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProvider.java index 36c0a118023..e394c03a03b 100644 --- a/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProvider.java +++ b/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProvider.java @@ -21,10 +21,6 @@ import static android.provider.SettingsSlicesContract.KEY_WIFI; import android.annotation.Nullable; import com.android.settings.homepage.contextualcards.deviceinfo.BatterySlice; -import com.android.settings.homepage.contextualcards.deviceinfo.DataUsageSlice; -import com.android.settings.homepage.contextualcards.deviceinfo.DeviceInfoSlice; -import com.android.settings.homepage.contextualcards.deviceinfo.EmergencyInfoSlice; -import com.android.settings.homepage.contextualcards.deviceinfo.StorageSlice; import com.android.settings.homepage.contextualcards.slices.ConnectedDeviceSlice; import com.android.settings.intelligence.ContextualCardProto.ContextualCard; import com.android.settings.intelligence.ContextualCardProto.ContextualCardList; @@ -45,26 +41,6 @@ public class SettingsContextualCardProvider extends ContextualCardProvider { .setSliceUri(WifiSlice.WIFI_URI.toString()) .setCardName(KEY_WIFI) .build(); - final ContextualCard dataUsageCard = - ContextualCard.newBuilder() - .setSliceUri(DataUsageSlice.DATA_USAGE_CARD_URI.toString()) - .setCardName(DataUsageSlice.PATH_DATA_USAGE) - .build(); - final ContextualCard deviceInfoCard = - ContextualCard.newBuilder() - .setSliceUri(DeviceInfoSlice.DEVICE_INFO_CARD_URI.toString()) - .setCardName(DeviceInfoSlice.PATH_DEVICE_INFO) - .build(); - final ContextualCard storageInfoCard = - ContextualCard.newBuilder() - .setSliceUri(StorageSlice.STORAGE_CARD_URI.toString()) - .setCardName(StorageSlice.PATH_STORAGE_INFO) - .build(); - final ContextualCard emergencyInfoCard = - ContextualCard.newBuilder() - .setSliceUri(EmergencyInfoSlice.EMERGENCY_INFO_CARD_URI.toString()) - .setCardName(EmergencyInfoSlice.PATH_EMERGENCY_INFO_CARD) - .build(); final ContextualCard batteryInfoCard = ContextualCard.newBuilder() .setSliceUri(BatterySlice.BATTERY_CARD_URI.toSafeString()) @@ -77,10 +53,6 @@ public class SettingsContextualCardProvider extends ContextualCardProvider { .build(); final ContextualCardList cards = ContextualCardList.newBuilder() .addCard(wifiCard) - .addCard(dataUsageCard) - .addCard(deviceInfoCard) - .addCard(storageInfoCard) - .addCard(emergencyInfoCard) .addCard(batteryInfoCard) .addCard(connectedDeviceCard) .build(); diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java index 6aeb5c00f86..e98e36f56f4 100644 --- a/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java +++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/ContextualCardLoaderTest.java @@ -22,8 +22,6 @@ import android.content.Context; import android.net.Uri; import com.android.settings.homepage.contextualcards.deviceinfo.BatterySlice; -import com.android.settings.homepage.contextualcards.deviceinfo.DataUsageSlice; -import com.android.settings.homepage.contextualcards.deviceinfo.DeviceInfoSlice; import com.android.settings.slices.SettingsSliceProvider; import com.android.settings.testutils.SettingsRobolectricTestRunner; @@ -53,19 +51,10 @@ public class ContextualCardLoaderTest { mProvider); } - @Test - public void createStaticCards_shouldReturnFourCards() { - final List defaultData = mContextualCardLoader.createStaticCards(); - - assertThat(defaultData).hasSize(3); - } - @Test public void createStaticCards_shouldContainCorrectCards() { - final Uri dataUsage = DataUsageSlice.DATA_USAGE_CARD_URI; - final Uri deviceInfo = DeviceInfoSlice.DEVICE_INFO_CARD_URI; final Uri batteryInfo = BatterySlice.BATTERY_CARD_URI; - final List expectedUris = Arrays.asList(dataUsage, deviceInfo, batteryInfo); + final List expectedUris = Arrays.asList(batteryInfo); final List actualCardUris = mContextualCardLoader.createStaticCards().stream().map( ContextualCard::getSliceUri).collect(Collectors.toList()); @@ -90,7 +79,8 @@ public class ContextualCardLoaderTest { final String sliceUri = "contet://com.android.settings.slices/action/flashlight"; assertThat( - mContextualCardLoader.isCardEligibleToDisplay(getContextualCard(sliceUri))).isFalse(); + mContextualCardLoader.isCardEligibleToDisplay( + getContextualCard(sliceUri))).isFalse(); } @Test @@ -98,7 +88,8 @@ public class ContextualCardLoaderTest { final String sliceUri = "content://com.android.settings.test.slices/action/flashlight"; assertThat( - mContextualCardLoader.isCardEligibleToDisplay(getContextualCard(sliceUri))).isFalse(); + mContextualCardLoader.isCardEligibleToDisplay( + getContextualCard(sliceUri))).isFalse(); } private ContextualCard getContextualCard(String sliceUri) { diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProviderTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProviderTest.java index 2c42379f86e..1932ab95e08 100644 --- a/tests/robotests/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProviderTest.java +++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/SettingsContextualCardProviderTest.java @@ -20,7 +20,6 @@ package com.android.settings.homepage.contextualcards; import static com.google.common.truth.Truth.assertThat; import android.content.ContentResolver; -import android.content.Context; import android.net.Uri; import android.os.Bundle; @@ -38,15 +37,13 @@ import org.robolectric.RuntimeEnvironment; @RunWith(SettingsRobolectricTestRunner.class) public class SettingsContextualCardProviderTest { - private Context mContext; private ContentResolver mResolver; private Uri mUri; private SettingsContextualCardProvider mProvider; @Before public void setUp() { - mContext = RuntimeEnvironment.application; - mResolver = mContext.getContentResolver(); + mResolver = RuntimeEnvironment.application.getContentResolver(); mUri = new Uri.Builder() .scheme(ContentResolver.SCHEME_CONTENT) .authority(SettingsContextualCardProvider.CARD_AUTHORITY)