Merge "Update R accessibility assets and strings (5/n)" into rvc-dev
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 580ca88..6ff3a00 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -6157,13 +6157,13 @@
<!-- Title of Wi-Fi certificate [CHAR LIMIT=30] -->
<string name="wifi_certificate">Wi\u2011Fi certificate</string>
<!-- Title of warning shown to the user before they can install a CA certificate [CHAR LIMIT=NONE] -->
- <string name="ca_certificate_warning_title">Your privacy is at risk</string>
+ <string name="ca_certificate_warning_title">Your data won\u2019t be private</string>
<!-- Description of warning shown to the user before they can install a CA certificate [CHAR LIMIT=NONE] -->
- <string name="ca_certificate_warning_description">CA certificates are used by websites, apps, and VPNs for encryption. Only install CA certificates from organizations you trust. \n\n If you install a CA certificate, the certificate owner could access your information, such as passwords, messages, or credit card details, from websites you visit or apps you use - even if that information is encrypted.</string>
+ <string name="ca_certificate_warning_description">CA certificates are used by websites, apps, and VPNs for encryption. Only install CA certificates from organizations you trust. \n\n If you install a CA certificate, the certificate owner could access your data, such as passwords or credit card details, from websites you visit or apps you use – even if your data is encrypted.</string>
<!-- Label for button to not install a certificate [CHAR_LIMIT=50] -->
<string name="certificate_warning_dont_install">Don\u2019t install</string>
<!-- Label for button to continue installing a certificate [CHAR_LIMIT=50] -->
- <string name="certificate_warning_install_anyway">Install anyways</string>
+ <string name="certificate_warning_install_anyway">Install anyway</string>
<!-- Toast message that a certificate was not installed -->
<string name="cert_not_installed">Certificate not installed</string>
diff --git a/src/com/android/settings/IccLockSettings.java b/src/com/android/settings/IccLockSettings.java
index 6bb75a5..a9b496a 100644
--- a/src/com/android/settings/IccLockSettings.java
+++ b/src/com/android/settings/IccLockSettings.java
@@ -28,6 +28,8 @@
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
+import android.os.PersistableBundle;
+import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionInfo;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
@@ -53,6 +55,7 @@
import com.android.settings.network.ProxySubscriptionManager;
+import java.util.ArrayList;
import java.util.List;
/**
@@ -220,8 +223,30 @@
Bundle savedInstanceState) {
final int numSims = mProxySubscriptionMgr.getActiveSubscriptionInfoCountMax();
+ final List<SubscriptionInfo> subInfoList =
+ mProxySubscriptionMgr.getActiveSubscriptionsInfo();
mSlotId = 0;
- if (numSims > 1) {
+ final List<SubscriptionInfo> componenterList = new ArrayList<>();
+
+ for (int i = 0; i < numSims; ++i) {
+ final SubscriptionInfo subInfo =
+ getActiveSubscriptionInfoForSimSlotIndex(subInfoList, i);
+ final CarrierConfigManager carrierConfigManager = getContext().getSystemService(
+ CarrierConfigManager.class);
+ final PersistableBundle bundle = carrierConfigManager.getConfigForSubId(
+ subInfo.getSubscriptionId());
+ if (bundle != null
+ && !bundle.getBoolean(CarrierConfigManager.KEY_HIDE_SIM_LOCK_SETTINGS_BOOL)) {
+ componenterList.add(subInfo);
+ }
+ }
+
+ if (componenterList.size() == 0) {
+ Log.e(TAG, "onCreateView: no sim info");
+ return null;
+ }
+
+ if (componenterList.size() > 1) {
final View view = inflater.inflate(R.layout.icc_lock_tabs, container, false);
final ViewGroup prefs_container = (ViewGroup) view.findViewById(R.id.prefs_container);
Utils.prepareCustomPreferencesList(container, view, prefs_container, false);
@@ -236,25 +261,22 @@
mTabHost.setOnTabChangedListener(mTabListener);
mTabHost.clearAllTabs();
- final List<SubscriptionInfo> subInfoList =
- mProxySubscriptionMgr.getActiveSubscriptionsInfo();
- for (int i = 0; i < numSims; ++i) {
- final SubscriptionInfo subInfo =
- getActiveSubscriptionInfoForSimSlotIndex(subInfoList, i);
- mTabHost.addTab(buildTabSpec(String.valueOf(i),
+ for (SubscriptionInfo subInfo : componenterList) {
+ int slot = subInfo.getSimSlotIndex();
+ mTabHost.addTab(buildTabSpec(String.valueOf(slot),
String.valueOf(subInfo == null
- ? getContext().getString(R.string.sim_editor_title, i + 1)
- : subInfo.getDisplayName())));
+ ? getContext().getString(R.string.sim_editor_title, slot + 1)
+ : subInfo.getDisplayName())));
}
- final SubscriptionInfo sir = getActiveSubscriptionInfoForSimSlotIndex(
- subInfoList, mSlotId);
- mSubId = sir.getSubscriptionId();
+
+ mSubId = componenterList.get(0).getSubscriptionId();
if (savedInstanceState != null && savedInstanceState.containsKey(CURRENT_TAB)) {
mTabHost.setCurrentTabByTag(savedInstanceState.getString(CURRENT_TAB));
}
return view;
} else {
+ mSlotId = componenterList.get(0).getSimSlotIndex();
return super.onCreateView(inflater, container, savedInstanceState);
}
}
diff --git a/src/com/android/settings/fuelgauge/BatterySaverReceiver.java b/src/com/android/settings/fuelgauge/BatterySaverReceiver.java
index 300dc0f..bf5c51b 100644
--- a/src/com/android/settings/fuelgauge/BatterySaverReceiver.java
+++ b/src/com/android/settings/fuelgauge/BatterySaverReceiver.java
@@ -39,7 +39,7 @@
public void onReceive(Context context, Intent intent) {
if (DEBUG) Log.d(TAG, "Received " + intent.getAction());
String action = intent.getAction();
- if (PowerManager.ACTION_POWER_SAVE_MODE_CHANGING.equals(action)) {
+ if (PowerManager.ACTION_POWER_SAVE_MODE_CHANGED.equals(action)) {
if (mBatterySaverListener != null) {
mBatterySaverListener.onPowerSaveModeChanged();
}
@@ -55,7 +55,7 @@
public void setListening(boolean listening) {
if (listening && !mRegistered) {
final IntentFilter ifilter = new IntentFilter();
- ifilter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING);
+ ifilter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
ifilter.addAction(Intent.ACTION_BATTERY_CHANGED);
mContext.registerReceiver(this, ifilter);
mRegistered = true;
diff --git a/src/com/android/settings/network/telephony/MobileNetworkUtils.java b/src/com/android/settings/network/telephony/MobileNetworkUtils.java
index b505c2f..076a87b 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkUtils.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkUtils.java
@@ -26,6 +26,10 @@
import static com.android.settings.network.telephony.TelephonyConstants.RadioAccessFamily.RAF_TD_SCDMA;
import static com.android.settings.network.telephony.TelephonyConstants.RadioAccessFamily.RAF_UNKNOWN;
import static com.android.settings.network.telephony.TelephonyConstants.RadioAccessFamily.WCDMA;
+import static com.android.settings.network.telephony.TelephonyConstants.TelephonyManagerConstants.NETWORK_MODE_LTE_GSM_WCDMA;
+import static com.android.settings.network.telephony.TelephonyConstants.TelephonyManagerConstants.NETWORK_MODE_LTE_CDMA_EVDO;
+import static com.android.settings.network.telephony.TelephonyConstants.TelephonyManagerConstants.NETWORK_MODE_NR_LTE_CDMA_EVDO;
+import static com.android.settings.network.telephony.TelephonyConstants.TelephonyManagerConstants.NETWORK_MODE_NR_LTE_GSM_WCDMA;
import android.content.ContentResolver;
import android.content.Context;
@@ -379,8 +383,10 @@
context.getContentResolver(),
android.provider.Settings.Global.PREFERRED_NETWORK_MODE + subId,
TelephonyManager.DEFAULT_PREFERRED_NETWORK_MODE);
- if (settingsNetworkMode == TelephonyManagerConstants.NETWORK_MODE_LTE_GSM_WCDMA
- || settingsNetworkMode == TelephonyManagerConstants.NETWORK_MODE_LTE_CDMA_EVDO) {
+ if (settingsNetworkMode == NETWORK_MODE_LTE_GSM_WCDMA
+ || settingsNetworkMode == NETWORK_MODE_LTE_CDMA_EVDO
+ || settingsNetworkMode == NETWORK_MODE_NR_LTE_GSM_WCDMA
+ || settingsNetworkMode == NETWORK_MODE_NR_LTE_CDMA_EVDO) {
return true;
}
@@ -407,8 +413,10 @@
android.provider.Settings.Global.PREFERRED_NETWORK_MODE + subId,
TelephonyManager.DEFAULT_PREFERRED_NETWORK_MODE);
if (isWorldMode(context, subId)) {
- if (networkMode == TelephonyManagerConstants.NETWORK_MODE_LTE_CDMA_EVDO
- || networkMode == TelephonyManagerConstants.NETWORK_MODE_LTE_GSM_WCDMA) {
+ if (networkMode == NETWORK_MODE_LTE_CDMA_EVDO
+ || networkMode == NETWORK_MODE_LTE_GSM_WCDMA
+ || networkMode == NETWORK_MODE_NR_LTE_CDMA_EVDO
+ || networkMode == NETWORK_MODE_NR_LTE_GSM_WCDMA) {
return true;
} else if (shouldSpeciallyUpdateGsmCdma(context, subId)) {
return true;
diff --git a/src/com/android/settings/network/telephony/cdma/CdmaSystemSelectPreferenceController.java b/src/com/android/settings/network/telephony/cdma/CdmaSystemSelectPreferenceController.java
index e90a240..023f89e 100644
--- a/src/com/android/settings/network/telephony/cdma/CdmaSystemSelectPreferenceController.java
+++ b/src/com/android/settings/network/telephony/cdma/CdmaSystemSelectPreferenceController.java
@@ -16,6 +16,9 @@
package com.android.settings.network.telephony.cdma;
+import static com.android.settings.network.telephony.TelephonyConstants.TelephonyManagerConstants.NETWORK_MODE_LTE_GSM_WCDMA;
+import static com.android.settings.network.telephony.TelephonyConstants.TelephonyManagerConstants.NETWORK_MODE_NR_LTE_GSM_WCDMA;
+
import android.content.Context;
import android.provider.Settings;
import android.telephony.TelephonyManager;
@@ -53,8 +56,9 @@
mContext.getContentResolver(),
Settings.Global.PREFERRED_NETWORK_MODE + mSubId,
TelephonyManager.DEFAULT_PREFERRED_NETWORK_MODE);
- listPreference.setEnabled(
- settingsNetworkMode != TelephonyManagerConstants.NETWORK_MODE_LTE_GSM_WCDMA);
+ final boolean enableList = settingsNetworkMode != NETWORK_MODE_LTE_GSM_WCDMA
+ && settingsNetworkMode != NETWORK_MODE_NR_LTE_GSM_WCDMA;
+ listPreference.setEnabled(enableList);
}
@Override
diff --git a/src/com/android/settings/panel/MediaOutputGroupPanel.java b/src/com/android/settings/panel/MediaOutputGroupPanel.java
index 4a37c52..d98c0b1 100644
--- a/src/com/android/settings/panel/MediaOutputGroupPanel.java
+++ b/src/com/android/settings/panel/MediaOutputGroupPanel.java
@@ -148,7 +148,7 @@
@Override
public void onDeviceListUpdate(List<MediaDevice> devices) {
if (mCallback != null) {
- mCallback.onGroupChanged();
+ mCallback.onHeaderChanged();
}
}
diff --git a/src/com/android/settings/panel/MediaOutputPanel.java b/src/com/android/settings/panel/MediaOutputPanel.java
index 1145c42..2a9669a 100644
--- a/src/com/android/settings/panel/MediaOutputPanel.java
+++ b/src/com/android/settings/panel/MediaOutputPanel.java
@@ -82,20 +82,6 @@
private MediaOutputPanel(Context context, String packageName) {
mContext = context.getApplicationContext();
mPackageName = TextUtils.isEmpty(packageName) ? "" : packageName;
-
- if (!TextUtils.isEmpty(mPackageName)) {
- mMediaSessionManager = mContext.getSystemService(MediaSessionManager.class);
- for (MediaController controller : mMediaSessionManager.getActiveSessions(null)) {
- if (TextUtils.equals(controller.getPackageName(), mPackageName)) {
- mMediaController = controller;
- break;
- }
- }
- }
-
- if (mMediaController == null) {
- Log.e(TAG, "Unable to find " + mPackageName + " media controller");
- }
}
@Override
@@ -228,6 +214,19 @@
@OnLifecycleEvent(ON_START)
public void onStart() {
+ if (!TextUtils.isEmpty(mPackageName)) {
+ mMediaSessionManager = mContext.getSystemService(MediaSessionManager.class);
+ for (MediaController controller : mMediaSessionManager.getActiveSessions(null)) {
+ if (TextUtils.equals(controller.getPackageName(), mPackageName)) {
+ mMediaController = controller;
+ mMediaController.registerCallback(mCb);
+ break;
+ }
+ }
+ }
+ if (mMediaController == null) {
+ Log.d(TAG, "No media controller for " + mPackageName);
+ }
if (mLocalMediaManager == null) {
mLocalMediaManager = new LocalMediaManager(mContext, mPackageName, null);
}
@@ -237,6 +236,9 @@
@OnLifecycleEvent(ON_STOP)
public void onStop() {
+ if (mMediaController != null) {
+ mMediaController.unregisterCallback(mCb);
+ }
mLocalMediaManager.unregisterCallback(this);
mLocalMediaManager.stopScan();
}
@@ -245,4 +247,13 @@
public int getViewType() {
return PanelContent.VIEW_TYPE_SLIDER;
}
+
+ private final MediaController.Callback mCb = new MediaController.Callback() {
+ @Override
+ public void onMetadataChanged(MediaMetadata metadata) {
+ if (mCallback != null) {
+ mCallback.onHeaderChanged();
+ }
+ }
+ };
}
diff --git a/src/com/android/settings/panel/PanelContentCallback.java b/src/com/android/settings/panel/PanelContentCallback.java
index ce8ea22..989082f 100644
--- a/src/com/android/settings/panel/PanelContentCallback.java
+++ b/src/com/android/settings/panel/PanelContentCallback.java
@@ -28,8 +28,8 @@
void onCustomizedButtonStateChanged();
/**
- * It will be called when group content is changed. For example, to add/remove a device into
+ * It will be called when header content is changed. For example, to add/remove a device into
* a group
*/
- void onGroupChanged();
+ void onHeaderChanged();
}
diff --git a/src/com/android/settings/panel/PanelFragment.java b/src/com/android/settings/panel/PanelFragment.java
index 30cc2a8..ed5c755 100644
--- a/src/com/android/settings/panel/PanelFragment.java
+++ b/src/com/android/settings/panel/PanelFragment.java
@@ -426,8 +426,10 @@
}
@Override
- public void onGroupChanged() {
+ public void onHeaderChanged() {
ThreadUtils.postOnMainThread(() -> {
+ mTitleIcon.setImageIcon(mPanel.getIcon().toIcon(getContext()));
+ mHeaderTitle.setText(mPanel.getTitle());
mHeaderSubtitle.setText(mPanel.getSubTitle());
});
}
diff --git a/src/com/android/settings/password/ChooseLockGeneric.java b/src/com/android/settings/password/ChooseLockGeneric.java
index 6809f35..755d158 100644
--- a/src/com/android/settings/password/ChooseLockGeneric.java
+++ b/src/com/android/settings/password/ChooseLockGeneric.java
@@ -42,6 +42,7 @@
import android.os.UserHandle;
import android.os.UserManager;
import android.os.storage.StorageManager;
+import android.service.persistentdata.PersistentDataBlockManager;
import android.text.TextUtils;
import android.util.EventLog;
import android.util.Log;
@@ -281,7 +282,11 @@
}
protected boolean canRunBeforeDeviceProvisioned() {
- return false;
+ PersistentDataBlockManager pdbm = (PersistentDataBlockManager)
+ getSystemService(Context.PERSISTENT_DATA_BLOCK_SERVICE);
+
+ // Can only run during setup if factory reset protection has already been cleared
+ return (pdbm != null && pdbm.getDataBlockSize() == 0);
}
protected Class<? extends ChooseLockGeneric.InternalActivity> getInternalActivityClass() {
diff --git a/src/com/android/settings/password/SetNewPasswordActivity.java b/src/com/android/settings/password/SetNewPasswordActivity.java
index 4bffbf5..19f2941 100644
--- a/src/com/android/settings/password/SetNewPasswordActivity.java
+++ b/src/com/android/settings/password/SetNewPasswordActivity.java
@@ -110,7 +110,7 @@
@Override
public void launchChooseLock(Bundle chooseLockFingerprintExtras) {
- final boolean isInSetupWizard = !WizardManagerHelper.isDeviceProvisioned(this);
+ final boolean isInSetupWizard = WizardManagerHelper.isAnySetupWizard(getIntent());
Intent intent = isInSetupWizard ? new Intent(this, SetupChooseLockGeneric.class)
: new Intent(this, ChooseLockGeneric.class);
intent.setAction(mNewPasswordAction);
diff --git a/src/com/android/settings/search/SettingsSearchIndexablesProvider.java b/src/com/android/settings/search/SettingsSearchIndexablesProvider.java
index 237e58f..bb3c762 100644
--- a/src/com/android/settings/search/SettingsSearchIndexablesProvider.java
+++ b/src/com/android/settings/search/SettingsSearchIndexablesProvider.java
@@ -61,12 +61,14 @@
import androidx.annotation.Nullable;
import androidx.slice.SliceViewManager;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.dashboard.DashboardFeatureProvider;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.slices.SettingsSliceProvider;
import com.android.settingslib.drawer.ActivityTile;
+import com.android.settingslib.drawer.CategoryKey;
import com.android.settingslib.drawer.DashboardCategory;
import com.android.settingslib.drawer.Tile;
import com.android.settingslib.search.Indexable;
@@ -379,9 +381,7 @@
final String currentPackageName = context.getPackageName();
for (DashboardCategory category : dashboardFeatureProvider.getAllCategories()) {
for (Tile tile : category.getTiles()) {
- if (currentPackageName.equals(tile.getPackageName())
- && tile instanceof ActivityTile) {
- // Skip Settings injected items because they should be indexed in the sub-pages.
+ if (!isEligibleForIndexing(currentPackageName, tile)) {
continue;
}
final SearchIndexableRaw raw = new SearchIndexableRaw(context);
@@ -402,6 +402,20 @@
return rawList;
}
+ @VisibleForTesting
+ boolean isEligibleForIndexing(String packageName, Tile tile) {
+ if (TextUtils.equals(packageName, tile.getPackageName())
+ && tile instanceof ActivityTile) {
+ // Skip Settings injected items because they should be indexed in the sub-pages.
+ return false;
+ }
+ if (TextUtils.equals(tile.getCategory(), CategoryKey.CATEGORY_HOMEPAGE)) {
+ // Skip homepage injected items since we would like to index their target activity.
+ return false;
+ }
+ return true;
+ }
+
private static Object[] createIndexableRawColumnObjects(SearchIndexableRaw raw) {
final Object[] ref = new Object[INDEXABLES_RAW_COLUMNS.length];
ref[COLUMN_INDEX_RAW_TITLE] = raw.title;
diff --git a/src/com/android/settings/security/SimLockPreferenceController.java b/src/com/android/settings/security/SimLockPreferenceController.java
index ffc1d6b..03983b5 100644
--- a/src/com/android/settings/security/SimLockPreferenceController.java
+++ b/src/com/android/settings/security/SimLockPreferenceController.java
@@ -52,13 +52,19 @@
@Override
public int getAvailabilityStatus() {
- final PersistableBundle b = mCarrierConfigManager.getConfig();
- final boolean IsAdmin = mUserManager.isAdminUser();
- if (!IsAdmin || !isSimIccReady() ||
- b.getBoolean(CarrierConfigManager.KEY_HIDE_SIM_LOCK_SETTINGS_BOOL)) {
+ final List<SubscriptionInfo> subInfoList =
+ mSubscriptionManager.getActiveSubscriptionInfoList();
+
+ if (subInfoList == null) {
return DISABLED_FOR_USER;
}
- return AVAILABLE;
+
+ final boolean isAdmin = mUserManager.isAdminUser();
+ if (isAdmin && (!isHideSimLockSetting(subInfoList))) {
+ return AVAILABLE;
+ }
+
+ return DISABLED_FOR_USER;
}
@Override
@@ -78,34 +84,37 @@
private boolean isSimReady() {
final List<SubscriptionInfo> subInfoList =
mSubscriptionManager.getActiveSubscriptionInfoList();
- if (subInfoList != null) {
- for (SubscriptionInfo subInfo : subInfoList) {
- final int simState = mTelephonyManager.getSimState(subInfo.getSimSlotIndex());
- if ((simState != TelephonyManager.SIM_STATE_ABSENT) &&
- (simState != TelephonyManager.SIM_STATE_UNKNOWN)) {
- return true;
- }
+ if (subInfoList == null) {
+ return false;
+ }
+
+ for (SubscriptionInfo subInfo : subInfoList) {
+ final int simState = mTelephonyManager.getSimState(subInfo.getSimSlotIndex());
+ if ((simState != TelephonyManager.SIM_STATE_ABSENT)
+ && (simState != TelephonyManager.SIM_STATE_UNKNOWN)) {
+ return true;
}
}
return false;
}
- /**
- * Return true if a there is a Slot that has Icc
- */
- private boolean isSimIccReady() {
- final List<SubscriptionInfo> subInfoList =
- mSubscriptionManager.getActiveSubscriptionInfoList();
+ private boolean isHideSimLockSetting(List<SubscriptionInfo> subInfoList) {
+ if (subInfoList == null) {
+ return true;
+ }
- if (subInfoList != null) {
- for (SubscriptionInfo subInfo : subInfoList) {
- mTelephonyManager = mTelephonyManager
- .createForSubscriptionId(subInfo.getSimSlotIndex());
- if (mTelephonyManager.hasIccCard()) {
- return true;
- }
+ for (SubscriptionInfo subInfo : subInfoList) {
+ final TelephonyManager telephonyManager = mTelephonyManager
+ .createForSubscriptionId(subInfo.getSubscriptionId());
+ final PersistableBundle bundle = mCarrierConfigManager.getConfigForSubId(
+ subInfo.getSubscriptionId());
+ if (telephonyManager.hasIccCard() && bundle != null
+ && !bundle.getBoolean(CarrierConfigManager.KEY_HIDE_SIM_LOCK_SETTINGS_BOOL)) {
+ // one or more sims show sim lock setting UI.
+ return false;
}
}
- return false;
+
+ return true;
}
}
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverReceiverTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverReceiverTest.java
index ec6436a..e411531 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverReceiverTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/BatterySaverReceiverTest.java
@@ -68,7 +68,7 @@
@Test
public void testOnReceive_powerSaveModeChanged_invokeCallback() {
- Intent intent = new Intent(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING);
+ Intent intent = new Intent(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
mBatterySaverReceiver.onReceive(mContext, intent);
diff --git a/tests/robotests/src/com/android/settings/panel/FakePanelContent.java b/tests/robotests/src/com/android/settings/panel/FakePanelContent.java
index 4d91f52..bf2ac0d 100644
--- a/tests/robotests/src/com/android/settings/panel/FakePanelContent.java
+++ b/tests/robotests/src/com/android/settings/panel/FakePanelContent.java
@@ -42,6 +42,7 @@
public static final Intent INTENT = new Intent();
+ private CharSequence mTitle = TITLE;
private CharSequence mSubTitle;
private IconCompat mIcon;
private int mViewType;
@@ -51,22 +52,26 @@
return mIcon;
}
+ public void setIcon(IconCompat icon) {
+ mIcon = icon;
+ }
+
@Override
public CharSequence getSubTitle() {
return mSubTitle;
}
- public void setIcon(IconCompat icon) {
- mIcon = icon;
- }
-
public void setSubTitle(CharSequence subTitle) {
mSubTitle = subTitle;
}
@Override
public CharSequence getTitle() {
- return TITLE;
+ return mTitle;
+ }
+
+ public void setTitle(CharSequence title) {
+ mTitle = title;
}
@Override
diff --git a/tests/robotests/src/com/android/settings/panel/MediaOutputPanelTest.java b/tests/robotests/src/com/android/settings/panel/MediaOutputPanelTest.java
index b95c9d0..07f01fc 100644
--- a/tests/robotests/src/com/android/settings/panel/MediaOutputPanelTest.java
+++ b/tests/robotests/src/com/android/settings/panel/MediaOutputPanelTest.java
@@ -41,6 +41,7 @@
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
@@ -62,7 +63,6 @@
private MediaController mMediaController;
@Mock
private MediaMetadata mMediaMetadata;
-
@Mock
private LocalMediaManager mLocalMediaManager;
@Mock
@@ -71,6 +71,8 @@
private MediaOutputPanel mPanel;
private Context mContext;
private List<MediaController> mMediaControllers = new ArrayList<>();
+ private ArgumentCaptor<MediaController.Callback> mControllerCbs =
+ ArgumentCaptor.forClass(MediaController.Callback.class);
@Before
public void setUp() {
@@ -112,6 +114,7 @@
public void onStart_shouldRegisterCallback() {
mPanel.onStart();
+ verify(mMediaController).registerCallback(any());
verify(mLocalMediaManager).registerCallback(any());
verify(mLocalMediaManager).startScan();
}
@@ -167,6 +170,7 @@
@Test
public void getTitle_withMetadata_returnArtistName() {
+ mPanel.onStart();
when(mMediaMetadata.getString(MediaMetadata.METADATA_KEY_ARTIST)).thenReturn(TEST_ARTIST);
when(mMediaController.getMetadata()).thenReturn(mMediaMetadata);
@@ -201,6 +205,7 @@
@Test
public void getSubTitle_withMetadata_returnAlbumName() {
+ mPanel.onStart();
when(mMediaMetadata.getString(MediaMetadata.METADATA_KEY_ALBUM)).thenReturn(TEST_ALBUM);
when(mMediaController.getMetadata()).thenReturn(mMediaMetadata);
@@ -243,4 +248,15 @@
verify(mLocalMediaManager).releaseSession();
}
+
+ @Test
+ public void onMetadataChanged_verifyCallOnHeaderChanged() {
+ mPanel.onStart();
+ verify(mMediaController).registerCallback(mControllerCbs.capture());
+ final MediaController.Callback controllerCallbacks = mControllerCbs.getValue();
+
+ controllerCallbacks.onMetadataChanged(mMediaMetadata);
+
+ verify(mCallback).onHeaderChanged();
+ }
}
diff --git a/tests/robotests/src/com/android/settings/panel/PanelFragmentTest.java b/tests/robotests/src/com/android/settings/panel/PanelFragmentTest.java
index 1976557..07ca48b 100644
--- a/tests/robotests/src/com/android/settings/panel/PanelFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/panel/PanelFragmentTest.java
@@ -41,6 +41,7 @@
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
@@ -51,7 +52,10 @@
@RunWith(RobolectricTestRunner.class)
public class PanelFragmentTest {
+ private static final String TITLE = "title";
+ private static final String TITLE2 = "title2";
private static final String SUBTITLE = "subtitle";
+ private static final String SUBTITLE2 = "subtitle2";
private Context mContext;
private PanelFragment mPanelFragment;
@@ -59,6 +63,8 @@
private FakeFeatureFactory mFakeFeatureFactory;
private PanelFeatureProvider mPanelFeatureProvider;
private FakePanelContent mFakePanelContent;
+ private ArgumentCaptor<PanelContentCallback> mPanelContentCbs = ArgumentCaptor.forClass(
+ PanelContentCallback.class);
private final String FAKE_EXTRA = "fake_extra";
@@ -69,9 +75,11 @@
mPanelFeatureProvider = spy(new PanelFeatureProviderImpl());
mFakeFeatureFactory = FakeFeatureFactory.setupForTest();
mFakeFeatureFactory.panelFeatureProvider = mPanelFeatureProvider;
- mFakePanelContent = new FakePanelContent();
+ mFakePanelContent = spy(new FakePanelContent());
doReturn(mFakePanelContent).when(mPanelFeatureProvider).getPanel(any(), any());
+ }
+ private void initFakeActivity() {
mActivity = spy(Robolectric.buildActivity(FakeSettingsPanelActivity.class).setup().get());
mPanelFragment =
@@ -86,6 +94,7 @@
@Test
public void onCreateView_countdownLatch_setup() {
+ initFakeActivity();
mPanelFragment.onCreateView(LayoutInflater.from(mContext),
new LinearLayout(mContext), null);
PanelSlicesLoaderCountdownLatch countdownLatch =
@@ -99,6 +108,7 @@
@Test
public void onCreate_logsOpenEvent() {
+ initFakeActivity();
verify(mFakeFeatureFactory.metricsFeatureProvider).action(
0,
SettingsEnums.PAGE_VISIBLE,
@@ -109,6 +119,7 @@
@Test
public void onDestroy_logCloseEvent() {
+ initFakeActivity();
mPanelFragment.onDestroyView();
verify(mFakeFeatureFactory.metricsFeatureProvider).action(
0,
@@ -120,6 +131,7 @@
@Test
public void panelSeeMoreClick_logsCloseEvent() {
+ initFakeActivity();
final View.OnClickListener listener = mPanelFragment.getSeeMoreListener();
listener.onClick(null);
verify(mActivity).finish();
@@ -136,6 +148,7 @@
@Test
public void panelDoneClick_logsCloseEvent() {
+ initFakeActivity();
final View.OnClickListener listener = mPanelFragment.getCloseListener();
listener.onClick(null);
verify(mActivity).finish();
@@ -178,10 +191,49 @@
@Test
public void notSupportIcon_displayDefaultHeaderLayout() {
- final View titleView = mPanelFragment.mLayoutView.findViewById(R.id.panel_title);
- final View panelHeader = mPanelFragment.mLayoutView.findViewById(R.id.panel_header);
+ final ActivityController<FakeSettingsPanelActivity> activityController =
+ Robolectric.buildActivity(FakeSettingsPanelActivity.class);
+ activityController.setup();
+ final PanelFragment panelFragment = (PanelFragment)
+ Objects.requireNonNull(activityController
+ .get()
+ .getSupportFragmentManager()
+ .findFragmentById(R.id.main_content));
+
+ final View titleView = panelFragment.mLayoutView.findViewById(R.id.panel_title);
+ final View panelHeader = panelFragment.mLayoutView.findViewById(R.id.panel_header);
assertThat(panelHeader.getVisibility()).isEqualTo(View.GONE);
assertThat(titleView.getVisibility()).isEqualTo(View.VISIBLE);
}
+
+ @Test
+ public void onHeaderChanged_updateHeader_verifyTitle() {
+ mFakePanelContent.setIcon(IconCompat.createWithResource(mContext, R.drawable.ic_android));
+ mFakePanelContent.setTitle(TITLE);
+ mFakePanelContent.setSubTitle(SUBTITLE);
+ final ActivityController<FakeSettingsPanelActivity> activityController =
+ Robolectric.buildActivity(FakeSettingsPanelActivity.class);
+ activityController.setup();
+ final PanelFragment panelFragment = (PanelFragment)
+ Objects.requireNonNull(activityController
+ .get()
+ .getSupportFragmentManager()
+ .findFragmentById(R.id.main_content));
+ final TextView headerTitle = panelFragment.mLayoutView.findViewById(R.id.header_title);
+ final TextView headerSubtitle = panelFragment.mLayoutView.findViewById(
+ R.id.header_subtitle);
+
+ assertThat(headerTitle.getText()).isEqualTo(TITLE);
+ assertThat(headerSubtitle.getText()).isEqualTo(SUBTITLE);
+
+ mFakePanelContent.setTitle(TITLE2);
+ mFakePanelContent.setSubTitle(SUBTITLE2);
+ verify(mFakePanelContent).registerCallback(mPanelContentCbs.capture());
+ final PanelContentCallback panelContentCallbacks = mPanelContentCbs.getValue();
+ panelContentCallbacks.onHeaderChanged();
+
+ assertThat(headerTitle.getText()).isEqualTo(TITLE2);
+ assertThat(headerSubtitle.getText()).isEqualTo(SUBTITLE2);
+ }
}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java
index 1bdadb2..6b3fdf4 100644
--- a/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java
+++ b/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java
@@ -46,6 +46,7 @@
import com.android.settings.password.ChooseLockGeneric.ChooseLockGenericFragment;
import com.android.settings.search.SearchFeatureProvider;
import com.android.settings.testutils.shadow.ShadowLockPatternUtils;
+import com.android.settings.testutils.shadow.ShadowPersistentDataBlockManager;
import com.android.settings.testutils.shadow.ShadowStorageManager;
import com.android.settings.testutils.shadow.ShadowUserManager;
import com.android.settings.testutils.shadow.ShadowUtils;
@@ -63,6 +64,7 @@
@Config(
shadows = {
ShadowLockPatternUtils.class,
+ ShadowPersistentDataBlockManager.class,
ShadowStorageManager.class,
ShadowUserManager.class,
ShadowUtils.class
@@ -82,11 +84,13 @@
public void tearDown() {
Global.putInt(application.getContentResolver(), Global.DEVICE_PROVISIONED, 1);
ShadowStorageManager.reset();
+ ShadowPersistentDataBlockManager.reset();
}
@Test
- public void onCreate_deviceNotProvisioned_shouldFinishActivity() {
+ public void onCreate_deviceNotProvisioned_persistentDataExists_shouldFinishActivity() {
Global.putInt(application.getContentResolver(), Global.DEVICE_PROVISIONED, 0);
+ ShadowPersistentDataBlockManager.setDataBlockSize(1000);
initActivity(null);
assertThat(mActivity.isFinishing()).isTrue();
@@ -191,7 +195,18 @@
}
@Test
- public void updatePreferencesOrFinish_callingAppIsAdmin_footerInvisible() {
+ public void updatePreferencesOrFinish_callingAppIsAdmin_deviceProvisioned_footerInvisible() {
+ initActivity(new Intent().putExtra(EXTRA_KEY_IS_CALLING_APP_ADMIN, true));
+
+ mFragment.updatePreferencesOrFinish(/* isRecreatingActivity= */ false);
+
+ FooterPreference footer = mFragment.findPreference(KEY_LOCK_SETTINGS_FOOTER);
+ assertThat(footer.isVisible()).isFalse();
+ }
+
+ @Test
+ public void updatePreferencesOrFinish_callingAppIsAdmin_deviceNotProvisioned_footerInvisible() {
+ Global.putInt(application.getContentResolver(), Global.DEVICE_PROVISIONED, 0);
initActivity(new Intent().putExtra(EXTRA_KEY_IS_CALLING_APP_ADMIN, true));
mFragment.updatePreferencesOrFinish(/* isRecreatingActivity= */ false);
diff --git a/tests/robotests/src/com/android/settings/password/SetNewPasswordActivityTest.java b/tests/robotests/src/com/android/settings/password/SetNewPasswordActivityTest.java
index 04a2157..b36af98 100644
--- a/tests/robotests/src/com/android/settings/password/SetNewPasswordActivityTest.java
+++ b/tests/robotests/src/com/android/settings/password/SetNewPasswordActivityTest.java
@@ -45,6 +45,8 @@
import com.android.settings.testutils.shadow.ShadowPasswordUtils;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+import com.google.android.setupcompat.util.WizardManagerHelper;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -111,6 +113,7 @@
activity.launchChooseLock(new Bundle());
ShadowActivity shadowActivity = Shadows.shadowOf(activity);
Intent intent = getLaunchChooseLockIntent(shadowActivity);
+ intent.putExtra(WizardManagerHelper.EXTRA_IS_FIRST_RUN, true);
assertThat(intent.getComponent())
.isEqualTo(new ComponentName(activity, SetupChooseLockGeneric.class));
diff --git a/tests/robotests/src/com/android/settings/search/SettingsSearchIndexablesProviderTest.java b/tests/robotests/src/com/android/settings/search/SettingsSearchIndexablesProviderTest.java
index 0db684e..c9bff38 100644
--- a/tests/robotests/src/com/android/settings/search/SettingsSearchIndexablesProviderTest.java
+++ b/tests/robotests/src/com/android/settings/search/SettingsSearchIndexablesProviderTest.java
@@ -6,6 +6,7 @@
import static org.mockito.Mockito.spy;
import android.Manifest;
+import android.content.pm.ActivityInfo;
import android.content.pm.ProviderInfo;
import android.database.Cursor;
import android.net.Uri;
@@ -13,6 +14,8 @@
import com.android.settings.R;
import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settingslib.drawer.ActivityTile;
+import com.android.settingslib.drawer.CategoryKey;
import com.android.settingslib.search.SearchIndexableData;
import org.junit.After;
@@ -29,7 +32,8 @@
@RunWith(RobolectricTestRunner.class)
public class SettingsSearchIndexablesProviderTest {
- private static final String BASE_AUTHORITY = "com.android.settings";
+ private static final String PACKAGE_NAME = "com.android.settings";
+ private static final String BASE_AUTHORITY = "content://" + PACKAGE_NAME + "/";
private SettingsSearchIndexablesProvider mProvider;
private FakeFeatureFactory mFakeFeatureFactory;
@@ -40,7 +44,7 @@
ProviderInfo info = new ProviderInfo();
info.exported = true;
info.grantUriPermissions = true;
- info.authority = BASE_AUTHORITY;
+ info.authority = PACKAGE_NAME;
info.readPermission = Manifest.permission.READ_SEARCH_INDEXABLES;
mProvider.attachInfo(RuntimeEnvironment.application, info);
@@ -60,8 +64,7 @@
@Test
public void testRawColumnFetched() {
- Uri rawUri = Uri.parse("content://" + BASE_AUTHORITY + "/" +
- SearchIndexablesContract.INDEXABLES_RAW_PATH);
+ Uri rawUri = Uri.parse(BASE_AUTHORITY + SearchIndexablesContract.INDEXABLES_RAW_PATH);
final Cursor cursor = mProvider.query(rawUri,
SearchIndexablesContract.INDEXABLES_RAW_COLUMNS, null, null, null);
@@ -83,8 +86,7 @@
@Test
public void testResourcesColumnFetched() {
- Uri rawUri = Uri.parse("content://" + BASE_AUTHORITY + "/" +
- SearchIndexablesContract.INDEXABLES_XML_RES_PATH);
+ Uri rawUri = Uri.parse(BASE_AUTHORITY + SearchIndexablesContract.INDEXABLES_XML_RES_PATH);
final Cursor cursor = mProvider.query(rawUri,
SearchIndexablesContract.INDEXABLES_XML_RES_COLUMNS, null, null, null);
@@ -102,8 +104,8 @@
@Test
@Config(qualifiers = "mcc999")
public void testNonIndexablesColumnFetched() {
- final Uri rawUri = Uri.parse("content://" + BASE_AUTHORITY + "/" +
- SearchIndexablesContract.NON_INDEXABLES_KEYS_PATH);
+ final Uri rawUri = Uri.parse(
+ BASE_AUTHORITY + SearchIndexablesContract.NON_INDEXABLES_KEYS_PATH);
final List<String> keys = new ArrayList<>();
@@ -117,4 +119,37 @@
assertThat(keys).hasSize(3);
assertThat(keys).containsAllOf("pref_key_1", "pref_key_3", "pref_key_5");
}
+
+ @Test
+ public void testIsEligibleForIndexing_isSettingsInjectedItem_ShouldBeFalse() {
+ final ActivityInfo activityInfo = new ActivityInfo();
+ activityInfo.packageName = PACKAGE_NAME;
+ activityInfo.name = "class";
+ final ActivityTile activityTile = new ActivityTile(activityInfo,
+ CategoryKey.CATEGORY_SYSTEM);
+
+ assertThat(mProvider.isEligibleForIndexing(PACKAGE_NAME, activityTile)).isFalse();
+ }
+
+ @Test
+ public void testIsEligibleForIndexing_isHomepageInjectedItem_ShouldBeFalse() {
+ final ActivityInfo activityInfo = new ActivityInfo();
+ activityInfo.packageName = "pkg";
+ activityInfo.name = "class";
+ final ActivityTile activityTile = new ActivityTile(activityInfo,
+ CategoryKey.CATEGORY_HOMEPAGE);
+
+ assertThat(mProvider.isEligibleForIndexing(PACKAGE_NAME, activityTile)).isFalse();
+ }
+
+ @Test
+ public void testIsEligibleForIndexing_normalInjectedItem_ShouldBeTrue() {
+ final ActivityInfo activityInfo = new ActivityInfo();
+ activityInfo.packageName = "pkg";
+ activityInfo.name = "class";
+ final ActivityTile activityTile = new ActivityTile(activityInfo,
+ CategoryKey.CATEGORY_CONNECT);
+
+ assertThat(mProvider.isEligibleForIndexing(PACKAGE_NAME, activityTile)).isTrue();
+ }
}
diff --git a/tests/robotests/src/com/android/settings/security/SimLockPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/SimLockPreferenceControllerTest.java
index 89be17a..0ab4256 100644
--- a/tests/robotests/src/com/android/settings/security/SimLockPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/security/SimLockPreferenceControllerTest.java
@@ -103,7 +103,7 @@
setupMockIcc();
final PersistableBundle pb = new PersistableBundle();
pb.putBoolean(CarrierConfigManager.KEY_HIDE_SIM_LOCK_SETTINGS_BOOL, true);
- when(mCarrierManager.getConfig()).thenReturn(pb);
+ when(mCarrierManager.getConfigForSubId(anyInt())).thenReturn(pb);
assertThat(mController.getAvailabilityStatus())
.isEqualTo(BasePreferenceController.DISABLED_FOR_USER);
@@ -114,7 +114,7 @@
when(mUserManager.isAdminUser()).thenReturn(true);
setupMockIcc();
final PersistableBundle pb = new PersistableBundle();
- when(mCarrierManager.getConfig()).thenReturn(pb);
+ when(mCarrierManager.getConfigForSubId(anyInt())).thenReturn(pb);
assertThat(mController.getAvailabilityStatus())
.isEqualTo(BasePreferenceController.AVAILABLE);
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowPersistentDataBlockManager.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowPersistentDataBlockManager.java
new file mode 100644
index 0000000..dbbdd3d
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowPersistentDataBlockManager.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2020 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.testutils.shadow;
+
+import android.service.persistentdata.PersistentDataBlockManager;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+@Implements(PersistentDataBlockManager.class)
+public class ShadowPersistentDataBlockManager {
+ private static int sDataBlockSize = 0;
+
+ @Resetter
+ public static void reset() {
+ sDataBlockSize = 0;
+ }
+
+ @Implementation
+ protected int getDataBlockSize() {
+ return sDataBlockSize;
+ }
+
+ public static void setDataBlockSize(int dataBlockSize) {
+ sDataBlockSize = dataBlockSize;
+ }
+}