Merge "Prevent side channel package installation enumeration"
diff --git a/res/layout/select_account_list_item.xml b/res/layout/select_account_list_item.xml
index 716adff..2f71338 100644
--- a/res/layout/select_account_list_item.xml
+++ b/res/layout/select_account_list_item.xml
@@ -36,6 +36,5 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/title"
- android:textColor="?android:attr/textColorSecondary"
android:layout_alignStart="@id/title" />
</LinearLayout>
diff --git a/res/values-night/styles.xml b/res/values-night/styles.xml
index a388855..f69c952 100644
--- a/res/values-night/styles.xml
+++ b/res/values-night/styles.xml
@@ -28,6 +28,6 @@
<style name="TextAppearance.SimConfirmDialogList.Summary">
<item name="android:textAppearance">?android:attr/textAppearanceSmall</item>
<item name="android:fontFamily">@*android:string/config_headlineFontFamily</item>
- <item name="android:textColor">?android:attr/textColorPrimaryInverse</item>
+ <item name="android:textColor">?android:attr/textColorSecondaryInverse</item>
</style>
</resources>
\ No newline at end of file
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 2468db6..59d5980 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -456,4 +456,8 @@
<dimen name="chartview_trapezoid_radius">5dp</dimen>
<dimen name="chartview_trapezoid_margin_start">1dp</dimen>
<dimen name="chartview_trapezoid_margin_bottom">2dp</dimen>
+
+ <!-- Sims/Data mobile/Calls/SMS select dialog-->
+ <dimen name="sims_select_margin_bottom">24dp</dimen>
+ <dimen name="sims_select_margin_top">8dp</dimen>
</resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 395a3bc..21581cb 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -931,6 +931,7 @@
<style name="TextAppearance.SimConfirmDialogList.Summary">
<item name="android:textAppearance">?android:attr/textAppearanceSmall</item>
+ <item name="android:textColor">?android:attr/textColorSecondary</item>
</style>
<style name="SimConfirmDialog.OutlineButton" parent="@android:style/Widget.Material.Button">
diff --git a/res/xml/privacy_dashboard_settings.xml b/res/xml/privacy_dashboard_settings.xml
index cd7d798..7e1d5ce 100644
--- a/res/xml/privacy_dashboard_settings.xml
+++ b/res/xml/privacy_dashboard_settings.xml
@@ -49,7 +49,6 @@
android:key="privacy_permissions_usage"
android:title="@string/permissions_usage_title"
android:summary="@string/permissions_usage_summary"
- settings:searchable="false"
settings:controller="com.android.settings.privacy.PrivacyHubPreferenceController">
<intent android:action="android.intent.action.REVIEW_PERMISSION_USAGE"/>
</Preference>
@@ -58,8 +57,7 @@
<Preference
android:key="privacy_manage_perms"
android:title="@string/app_permissions"
- android:summary="@string/runtime_permissions_summary_control_app_access"
- settings:searchable="false">
+ android:summary="@string/runtime_permissions_summary_control_app_access">
<intent android:action="android.intent.action.MANAGE_PERMISSIONS"/>
</Preference>
diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java
index 1d6a48d..d3e1c49 100644
--- a/src/com/android/settings/SettingsPreferenceFragment.java
+++ b/src/com/android/settings/SettingsPreferenceFragment.java
@@ -54,6 +54,7 @@
import com.android.settingslib.widget.LayoutPreference;
import com.google.android.material.appbar.AppBarLayout;
+import com.google.android.setupcompat.util.WizardManagerHelper;
import java.util.UUID;
@@ -63,7 +64,7 @@
public abstract class SettingsPreferenceFragment extends InstrumentedPreferenceFragment
implements DialogCreatable, HelpResourceProvider, Indexable {
- private static final String TAG = "SettingsPreference";
+ private static final String TAG = "SettingsPreferenceFragment";
private static final String SAVE_HIGHLIGHTED_KEY = "android:preference_highlighted";
@@ -122,6 +123,15 @@
private boolean mPreferenceHighlighted = false;
@Override
+ public void onAttach(Context context) {
+ if (shouldSkipForInitialSUW() && !WizardManagerHelper.isDeviceProvisioned(getContext())) {
+ Log.w(TAG, "Skip " + getClass().getSimpleName() + " before SUW completed.");
+ finish();
+ }
+ super.onAttach(context);
+ }
+
+ @Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
@@ -267,6 +277,16 @@
|| (mAdapter.getPreferenceAdapterPosition(preference) != RecyclerView.NO_POSITION));
}
+ /**
+ * Whether UI should be skipped in the initial SUW flow.
+ *
+ * @return {@code true} when UI should be skipped in the initial SUW flow.
+ * {@code false} when UI should not be skipped in the initial SUW flow.
+ */
+ protected boolean shouldSkipForInitialSUW() {
+ return false;
+ }
+
protected void onDataSetChanged() {
highlightPreferenceIfNeeded();
updateEmptyView();
diff --git a/src/com/android/settings/accounts/AccountDashboardFragment.java b/src/com/android/settings/accounts/AccountDashboardFragment.java
index f57b124..a2b6182 100644
--- a/src/com/android/settings/accounts/AccountDashboardFragment.java
+++ b/src/com/android/settings/accounts/AccountDashboardFragment.java
@@ -84,6 +84,11 @@
return controllers;
}
+ @Override
+ protected boolean shouldSkipForInitialSUW() {
+ return true;
+ }
+
static void buildAutofillPreferenceControllers(
Context context, List<AbstractPreferenceController> controllers) {
controllers.add(new DefaultAutofillPreferenceController(context));
diff --git a/src/com/android/settings/accounts/WorkModePreferenceController.java b/src/com/android/settings/accounts/WorkModePreferenceController.java
index f3a6ed2..11a620b 100644
--- a/src/com/android/settings/accounts/WorkModePreferenceController.java
+++ b/src/com/android/settings/accounts/WorkModePreferenceController.java
@@ -58,7 +58,8 @@
@Override
public void onStart() {
- mContext.registerReceiver(mReceiver, mIntentFilter);
+ mContext.registerReceiver(mReceiver, mIntentFilter,
+ Context.RECEIVER_EXPORTED_UNAUDITED);
}
@Override
diff --git a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
index 159eec6..243dc56 100755
--- a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
+++ b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java
@@ -507,6 +507,11 @@
return true;
}
+ @Override
+ protected boolean shouldSkipForInitialSUW() {
+ return true;
+ }
+
private void uninstallPkg(String packageName, boolean allUsers, boolean andDisable) {
stopListeningToPackageRemove();
// Create new intent to launch Uninstaller activity
diff --git a/src/com/android/settings/bluetooth/AlwaysDiscoverable.java b/src/com/android/settings/bluetooth/AlwaysDiscoverable.java
index 7b94871..2ac4a18 100644
--- a/src/com/android/settings/bluetooth/AlwaysDiscoverable.java
+++ b/src/com/android/settings/bluetooth/AlwaysDiscoverable.java
@@ -52,7 +52,8 @@
if (mStarted) {
return;
}
- mContext.registerReceiver(this, mIntentFilter);
+ mContext.registerReceiver(this, mIntentFilter,
+ Context.RECEIVER_EXPORTED_UNAUDITED);
mStarted = true;
if (mBluetoothAdapter.getScanMode()
!= BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
diff --git a/src/com/android/settings/bluetooth/BluetoothEnabler.java b/src/com/android/settings/bluetooth/BluetoothEnabler.java
index d489198..483e46a 100644
--- a/src/com/android/settings/bluetooth/BluetoothEnabler.java
+++ b/src/com/android/settings/bluetooth/BluetoothEnabler.java
@@ -115,7 +115,8 @@
}
mSwitchController.startListening();
- mContext.registerReceiver(mReceiver, mIntentFilter);
+ mContext.registerReceiver(mReceiver, mIntentFilter,
+ Context.RECEIVER_EXPORTED_UNAUDITED);
mValidListener = true;
}
diff --git a/src/com/android/settings/connecteddevice/AddDevicePreferenceController.java b/src/com/android/settings/connecteddevice/AddDevicePreferenceController.java
index a2d477d..d2bc319 100644
--- a/src/com/android/settings/connecteddevice/AddDevicePreferenceController.java
+++ b/src/com/android/settings/connecteddevice/AddDevicePreferenceController.java
@@ -57,7 +57,8 @@
@Override
public void onStart() {
- mContext.registerReceiver(mReceiver, mIntentFilter);
+ mContext.registerReceiver(mReceiver, mIntentFilter,
+ Context.RECEIVER_EXPORTED_UNAUDITED);
}
@Override
diff --git a/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java b/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java
index 4469d26..afeca51 100644
--- a/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java
+++ b/src/com/android/settings/connecteddevice/PreviouslyConnectedDevicePreferenceController.java
@@ -111,7 +111,8 @@
public void onStart() {
mBluetoothDeviceUpdater.registerCallback();
mSavedDockUpdater.registerCallback();
- mContext.registerReceiver(mReceiver, mIntentFilter);
+ mContext.registerReceiver(mReceiver, mIntentFilter,
+ Context.RECEIVER_EXPORTED_UNAUDITED);
mBluetoothDeviceUpdater.refreshPreference();
}
diff --git a/src/com/android/settings/development/AdbQrcodeScannerFragment.java b/src/com/android/settings/development/AdbQrcodeScannerFragment.java
index 1035fbe..d53f649 100644
--- a/src/com/android/settings/development/AdbQrcodeScannerFragment.java
+++ b/src/com/android/settings/development/AdbQrcodeScannerFragment.java
@@ -189,7 +189,8 @@
restartCamera();
mAdbManager = IAdbManager.Stub.asInterface(ServiceManager.getService(Context.ADB_SERVICE));
- getActivity().registerReceiver(mReceiver, mIntentFilter);
+ getActivity().registerReceiver(mReceiver, mIntentFilter,
+ Context.RECEIVER_EXPORTED_UNAUDITED);
}
@Override
diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
index c02ae42..946e0d7 100644
--- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
+++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
@@ -215,6 +215,11 @@
}
}
+ @Override
+ protected boolean shouldSkipForInitialSUW() {
+ return true;
+ }
+
/**
* Long-pressing a developer options quick settings tile will by default (see
* QS_TILE_PREFERENCES in the manifest) take you to the developer options page.
diff --git a/src/com/android/settings/development/WirelessDebuggingFragment.java b/src/com/android/settings/development/WirelessDebuggingFragment.java
index fecdbfa..7c60069 100644
--- a/src/com/android/settings/development/WirelessDebuggingFragment.java
+++ b/src/com/android/settings/development/WirelessDebuggingFragment.java
@@ -227,7 +227,8 @@
public void onResume() {
super.onResume();
- getActivity().registerReceiver(mReceiver, mIntentFilter);
+ getActivity().registerReceiver(mReceiver, mIntentFilter,
+ Context.RECEIVER_EXPORTED_UNAUDITED);
}
@Override
diff --git a/src/com/android/settings/location/LocationInjectedServiceBasePreferenceController.java b/src/com/android/settings/location/LocationInjectedServiceBasePreferenceController.java
index 3b593b9..5ee83dd 100644
--- a/src/com/android/settings/location/LocationInjectedServiceBasePreferenceController.java
+++ b/src/com/android/settings/location/LocationInjectedServiceBasePreferenceController.java
@@ -99,7 +99,8 @@
};
}
mContext.registerReceiver(
- mInjectedSettingsReceiver, INTENT_FILTER_INJECTED_SETTING_CHANGED);
+ mInjectedSettingsReceiver, INTENT_FILTER_INJECTED_SETTING_CHANGED,
+ Context.RECEIVER_EXPORTED_UNAUDITED);
}
/** @OnLifecycleEvent(ON_PAUSE) */
diff --git a/src/com/android/settings/network/ActiveSubscriptionsListener.java b/src/com/android/settings/network/ActiveSubscriptionsListener.java
index 91a4c0a..b23b723 100644
--- a/src/com/android/settings/network/ActiveSubscriptionsListener.java
+++ b/src/com/android/settings/network/ActiveSubscriptionsListener.java
@@ -302,7 +302,8 @@
mSubscriptionChangeReceiver = getSubscriptionChangeReceiver();
}
mContext.registerReceiver(mSubscriptionChangeReceiver,
- mSubscriptionChangeIntentFilter, null, new Handler(mLooper));
+ mSubscriptionChangeIntentFilter, null, new Handler(mLooper),
+ Context.RECEIVER_EXPORTED_UNAUDITED);
registerForSubscriptionsChange();
mCacheState.compareAndSet(STATE_PREPARING, STATE_LISTENING);
return;
diff --git a/src/com/android/settings/network/InternetResetHelper.java b/src/com/android/settings/network/InternetResetHelper.java
index b4e67b5..3600a40 100644
--- a/src/com/android/settings/network/InternetResetHelper.java
+++ b/src/com/android/settings/network/InternetResetHelper.java
@@ -105,7 +105,8 @@
/** @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) */
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void onResume() {
- mContext.registerReceiver(mWifiStateReceiver, mWifiStateFilter);
+ mContext.registerReceiver(mWifiStateReceiver, mWifiStateFilter,
+ Context.RECEIVER_EXPORTED_UNAUDITED);
}
/** @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) */
diff --git a/src/com/android/settings/network/InternetUpdater.java b/src/com/android/settings/network/InternetUpdater.java
index 3d97e95..bc24f86 100644
--- a/src/com/android/settings/network/InternetUpdater.java
+++ b/src/com/android/settings/network/InternetUpdater.java
@@ -182,7 +182,8 @@
public void onResume() {
mAirplaneModeEnabler.start();
mConnectivityManager.registerDefaultNetworkCallback(mNetworkCallback);
- mContext.registerReceiver(mWifiStateReceiver, mWifiStateFilter);
+ mContext.registerReceiver(mWifiStateReceiver, mWifiStateFilter,
+ Context.RECEIVER_EXPORTED_UNAUDITED);
}
/** @OnLifecycleEvent(ON_PAUSE) */
diff --git a/src/com/android/settings/network/SwitchToEuiccSubscriptionSidecar.java b/src/com/android/settings/network/SwitchToEuiccSubscriptionSidecar.java
index 9b0105b..888e5b2 100644
--- a/src/com/android/settings/network/SwitchToEuiccSubscriptionSidecar.java
+++ b/src/com/android/settings/network/SwitchToEuiccSubscriptionSidecar.java
@@ -18,7 +18,6 @@
import android.app.FragmentManager;
import android.app.PendingIntent;
-import android.content.Intent;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.UiccCardInfo;
@@ -106,21 +105,8 @@
// Use INVALID_SUBSCRIPTION_ID to disable the esim profile.
// The SimSlotMapping is ready, then to execute activate/inactivate esim.
mIsDuringSimSlotMapping = true;
- EuiccManager.ResultListener callback = new EuiccManager.ResultListener() {
- @Override
- public void onComplete(int resultCode, Intent resultIntent) {
- Log.i(TAG, String.format("Result code : %d;", resultCode));
- if (resultCode == EuiccManager.EMBEDDED_SUBSCRIPTION_RESULT_OK) {
- mSwitchSlotSidecar.runSwitchToEuiccSlot(getTargetSlot(), mPort,
- removedSubInfo);
- } else {
- setState(State.ERROR, resultCode);
- }
- }
- };
mEuiccManager.switchToSubscription(SubscriptionManager.INVALID_SUBSCRIPTION_ID, mPort,
- getContext().getMainExecutor(),
- callback);
+ mCallbackIntent);
} else {
mSwitchSlotSidecar.runSwitchToEuiccSlot(getTargetSlot(), mPort, removedSubInfo);
}
@@ -187,19 +173,7 @@
private void switchToSubscription() {
// The SimSlotMapping is ready, then to execute activate/inactivate esim.
- EuiccManager.ResultListener callback = new EuiccManager.ResultListener() {
- @Override
- public void onComplete(int resultCode, Intent resultIntent) {
- Log.i(TAG, String.format("Result code : %d;", resultCode));
- if (resultCode == EuiccManager.EMBEDDED_SUBSCRIPTION_RESULT_OK) {
- setState(State.SUCCESS, Substate.UNUSED);
- } else {
- setState(State.ERROR, resultCode);
- }
- }
- };
- mEuiccManager.switchToSubscription(mSubId, mPort, getContext().getMainExecutor(),
- callback);
+ mEuiccManager.switchToSubscription(mSubId, mPort, mCallbackIntent);
}
@Override
diff --git a/src/com/android/settings/network/apn/ApnSettings.java b/src/com/android/settings/network/apn/ApnSettings.java
index 1791446..e319f55 100755
--- a/src/com/android/settings/network/apn/ApnSettings.java
+++ b/src/com/android/settings/network/apn/ApnSettings.java
@@ -267,7 +267,8 @@
return;
}
- getActivity().registerReceiver(mReceiver, mIntentFilter);
+ getActivity().registerReceiver(mReceiver, mIntentFilter,
+ Context.RECEIVER_EXPORTED_UNAUDITED);
restartPhoneStateListener(mSubId);
diff --git a/src/com/android/settings/nfc/BaseNfcEnabler.java b/src/com/android/settings/nfc/BaseNfcEnabler.java
index 0deaab6..48a87a9 100644
--- a/src/com/android/settings/nfc/BaseNfcEnabler.java
+++ b/src/com/android/settings/nfc/BaseNfcEnabler.java
@@ -59,7 +59,8 @@
return;
}
handleNfcStateChanged(mNfcAdapter.getAdapterState());
- mContext.registerReceiver(mReceiver, mIntentFilter);
+ mContext.registerReceiver(mReceiver, mIntentFilter,
+ Context.RECEIVER_EXPORTED_UNAUDITED);
}
public void pause() {
diff --git a/src/com/android/settings/panel/VolumePanel.java b/src/com/android/settings/panel/VolumePanel.java
index 3e6d1ce..e0d8a7f 100644
--- a/src/com/android/settings/panel/VolumePanel.java
+++ b/src/com/android/settings/panel/VolumePanel.java
@@ -74,7 +74,8 @@
public void onResume() {
final IntentFilter filter = new IntentFilter();
filter.addAction(MediaOutputConstants.ACTION_CLOSE_PANEL);
- mContext.registerReceiver(mReceiver, filter);
+ mContext.registerReceiver(mReceiver, filter,
+ Context.RECEIVER_EXPORTED_UNAUDITED);
}
/** Invoked when the panel is paused. */
diff --git a/src/com/android/settings/privacy/CameraToggleController.java b/src/com/android/settings/privacy/CameraToggleController.java
index 1a5da76..756553c 100644
--- a/src/com/android/settings/privacy/CameraToggleController.java
+++ b/src/com/android/settings/privacy/CameraToggleController.java
@@ -40,7 +40,7 @@
public int getAvailabilityStatus() {
return mSensorPrivacyManagerHelper.supportsSensorToggle(getSensor())
&& DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY, "camera_toggle_enabled",
- true) ? AVAILABLE_UNSEARCHABLE : UNSUPPORTED_ON_DEVICE;
+ true) ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
}
@Override
diff --git a/src/com/android/settings/privacy/MicToggleController.java b/src/com/android/settings/privacy/MicToggleController.java
index 23d41d6..c2389d2 100644
--- a/src/com/android/settings/privacy/MicToggleController.java
+++ b/src/com/android/settings/privacy/MicToggleController.java
@@ -40,7 +40,7 @@
public int getAvailabilityStatus() {
return mSensorPrivacyManagerHelper.supportsSensorToggle(getSensor())
&& DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY, "mic_toggle_enabled",
- true) ? AVAILABLE_UNSEARCHABLE : UNSUPPORTED_ON_DEVICE;
+ true) ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
}
@Override
diff --git a/src/com/android/settings/privacy/WorkPolicyInfoPreferenceController.java b/src/com/android/settings/privacy/WorkPolicyInfoPreferenceController.java
index 977d1bf..55ba064 100644
--- a/src/com/android/settings/privacy/WorkPolicyInfoPreferenceController.java
+++ b/src/com/android/settings/privacy/WorkPolicyInfoPreferenceController.java
@@ -37,9 +37,7 @@
@Override
public int getAvailabilityStatus() {
- return mEnterpriseProvider.hasWorkPolicyInfo()
- ? AVAILABLE_UNSEARCHABLE
- : UNSUPPORTED_ON_DEVICE;
+ return mEnterpriseProvider.hasWorkPolicyInfo() ? AVAILABLE : UNSUPPORTED_ON_DEVICE;
}
@Override
diff --git a/src/com/android/settings/security/CredentialStorage.java b/src/com/android/settings/security/CredentialStorage.java
index 090fdf6..ea33631 100644
--- a/src/com/android/settings/security/CredentialStorage.java
+++ b/src/com/android/settings/security/CredentialStorage.java
@@ -86,7 +86,7 @@
final String action = intent.getAction();
final UserManager userManager = (UserManager) getSystemService(Context.USER_SERVICE);
if (!userManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_CREDENTIALS)) {
- if (ACTION_RESET.equals(action)) {
+ if (ACTION_RESET.equals(action) && checkCallerIsSelf()) {
new ResetDialog();
} else {
if (ACTION_INSTALL.equals(action) && checkCallerIsCertInstallerOrSelfInProfile()) {
@@ -319,6 +319,19 @@
}
/**
+ * Check that the caller is Settings.
+ */
+ private boolean checkCallerIsSelf() {
+ try {
+ return Process.myUid() == android.app.ActivityManager.getService()
+ .getLaunchedFromUid(getActivityToken());
+ } catch (RemoteException re) {
+ // Error talking to ActivityManager, just give up
+ return false;
+ }
+ }
+
+ /**
* Check that the caller is either certinstaller or Settings running in a profile of this user.
*/
private boolean checkCallerIsCertInstallerOrSelfInProfile() {
diff --git a/src/com/android/settings/security/CryptKeeperSettings.java b/src/com/android/settings/security/CryptKeeperSettings.java
index 4fc17fb..2b65bf1 100644
--- a/src/com/android/settings/security/CryptKeeperSettings.java
+++ b/src/com/android/settings/security/CryptKeeperSettings.java
@@ -131,7 +131,8 @@
@Override
public void onResume() {
super.onResume();
- getActivity().registerReceiver(mIntentReceiver, mIntentFilter);
+ getActivity().registerReceiver(mIntentReceiver, mIntentFilter,
+ Context.RECEIVER_EXPORTED_UNAUDITED);
}
@Override
diff --git a/src/com/android/settings/sim/SimListDialogFragment.java b/src/com/android/settings/sim/SimListDialogFragment.java
index 629a087..b5bddb7 100644
--- a/src/com/android/settings/sim/SimListDialogFragment.java
+++ b/src/com/android/settings/sim/SimListDialogFragment.java
@@ -200,6 +200,16 @@
final TextView title = convertView.findViewById(R.id.title);
final TextView summary = convertView.findViewById(R.id.summary);
+ ViewGroup.MarginLayoutParams lp =
+ (ViewGroup.MarginLayoutParams) parent.getLayoutParams();
+ if (lp != null) {
+ lp.setMargins(0, mContext.getResources().getDimensionPixelSize(
+ R.dimen.sims_select_margin_top), 0,
+ mContext.getResources().getDimensionPixelSize(
+ R.dimen.sims_select_margin_bottom));
+ convertView.setLayoutParams(lp);
+ }
+
if (sub == null) {
if (position == 0) {
title.setText(R.string.sim_calls_ask_first_prefs_title);
diff --git a/src/com/android/settings/system/ResetDashboardFragment.java b/src/com/android/settings/system/ResetDashboardFragment.java
index e5fc8f1..c352b92 100644
--- a/src/com/android/settings/system/ResetDashboardFragment.java
+++ b/src/com/android/settings/system/ResetDashboardFragment.java
@@ -64,6 +64,11 @@
use(EraseEuiccDataController.class).setFragment(this);
}
+ @Override
+ protected boolean shouldSkipForInitialSUW() {
+ return true;
+ }
+
private static List<AbstractPreferenceController> buildPreferenceControllers(Context context,
Lifecycle lifecycle) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java
index c3f0439..767a328 100644
--- a/src/com/android/settings/users/UserSettings.java
+++ b/src/com/android/settings/users/UserSettings.java
@@ -309,7 +309,8 @@
mAddSupervisedUser.setOnPreferenceClickListener(this);
activity.registerReceiverAsUser(
- mUserChangeReceiver, UserHandle.ALL, USER_REMOVED_INTENT_FILTER, null, mHandler);
+ mUserChangeReceiver, UserHandle.ALL, USER_REMOVED_INTENT_FILTER, null, mHandler,
+ Context.RECEIVER_EXPORTED_UNAUDITED);
updateUI();
mShouldUpdateUserList = false;
diff --git a/src/com/android/settings/wifi/WifiEnabler.java b/src/com/android/settings/wifi/WifiEnabler.java
index dc5be42..794587d 100644
--- a/src/com/android/settings/wifi/WifiEnabler.java
+++ b/src/com/android/settings/wifi/WifiEnabler.java
@@ -118,7 +118,8 @@
public void resume(Context context) {
mContext = context;
// Wi-Fi state is sticky, so just let the receiver update UI
- mContext.registerReceiver(mReceiver, mIntentFilter);
+ mContext.registerReceiver(mReceiver, mIntentFilter,
+ Context.RECEIVER_EXPORTED_UNAUDITED);
if (!mListeningToOnSwitchChange) {
mSwitchWidget.startListening();
mListeningToOnSwitchChange = true;
diff --git a/src/com/android/settings/wifi/WifiStatusTest.java b/src/com/android/settings/wifi/WifiStatusTest.java
index 249cd71..b4f3ab6 100644
--- a/src/com/android/settings/wifi/WifiStatusTest.java
+++ b/src/com/android/settings/wifi/WifiStatusTest.java
@@ -125,7 +125,8 @@
mWifiStateFilter.addAction(WifiManager.RSSI_CHANGED_ACTION);
mWifiStateFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
- registerReceiver(mWifiStateReceiver, mWifiStateFilter);
+ registerReceiver(mWifiStateReceiver, mWifiStateFilter,
+ Context.RECEIVER_EXPORTED_UNAUDITED);
setContentView(R.layout.wifi_status_test);
@@ -157,7 +158,8 @@
@Override
protected void onResume() {
super.onResume();
- registerReceiver(mWifiStateReceiver, mWifiStateFilter);
+ registerReceiver(mWifiStateReceiver, mWifiStateFilter,
+ Context.RECEIVER_EXPORTED_UNAUDITED);
}
@Override
diff --git a/src/com/android/settings/wifi/WifiSummaryUpdater.java b/src/com/android/settings/wifi/WifiSummaryUpdater.java
index 19ef200..93bbe0f 100644
--- a/src/com/android/settings/wifi/WifiSummaryUpdater.java
+++ b/src/com/android/settings/wifi/WifiSummaryUpdater.java
@@ -76,7 +76,8 @@
if (register) {
mWifiTracker.fetchInitialState();
notifyChangeIfNeeded();
- mContext.registerReceiver(mReceiver, INTENT_FILTER);
+ mContext.registerReceiver(mReceiver, INTENT_FILTER,
+ Context.RECEIVER_EXPORTED_UNAUDITED);
} else {
mContext.unregisterReceiver(mReceiver);
}
diff --git a/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java b/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java
index 19664be..749af3e 100644
--- a/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java
+++ b/src/com/android/settings/wifi/calling/WifiCallingSettingsForSub.java
@@ -429,7 +429,8 @@
mValidListener = true;
}
- context.registerReceiver(mIntentReceiver, mIntentFilter);
+ context.registerReceiver(mIntentReceiver, mIntentFilter,
+ Context.RECEIVER_EXPORTED_UNAUDITED);
final Intent intent = getActivity().getIntent();
if (intent.getBooleanExtra(Phone.EXTRA_KEY_ALERT_SHOW, false)) {
diff --git a/src/com/android/settings/wifi/tether/WifiTetherSettings.java b/src/com/android/settings/wifi/tether/WifiTetherSettings.java
index 23601fa..4f2f3c0 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherSettings.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherSettings.java
@@ -147,7 +147,8 @@
}
final Context context = getContext();
if (context != null) {
- context.registerReceiver(mTetherChangeReceiver, TETHER_STATE_CHANGE_FILTER);
+ context.registerReceiver(mTetherChangeReceiver, TETHER_STATE_CHANGE_FILTER,
+ Context.RECEIVER_EXPORTED_UNAUDITED);
}
}
diff --git a/src/com/android/settings/wifi/tether/WifiTetherSwitchBarController.java b/src/com/android/settings/wifi/tether/WifiTetherSwitchBarController.java
index 3d8cd3e..cad56e3 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherSwitchBarController.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherSwitchBarController.java
@@ -83,7 +83,8 @@
public void onStart() {
mDataSaverBackend.addListener(this);
mSwitch.setOnClickListener(this);
- mContext.registerReceiver(mReceiver, WIFI_INTENT_FILTER);
+ mContext.registerReceiver(mReceiver, WIFI_INTENT_FILTER,
+ Context.RECEIVER_EXPORTED_UNAUDITED);
}
@Override
diff --git a/tests/robotests/src/com/android/settings/SettingsPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/SettingsPreferenceFragmentTest.java
index cb53f69..6489311 100644
--- a/tests/robotests/src/com/android/settings/SettingsPreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/SettingsPreferenceFragmentTest.java
@@ -23,11 +23,13 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.os.Bundle;
+import android.provider.Settings;
import android.view.View;
import android.widget.FrameLayout;
@@ -41,6 +43,7 @@
import com.android.settings.testutils.shadow.ShadowFragment;
import com.android.settings.widget.WorkOnlyCategory;
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -64,7 +67,9 @@
private PreferenceScreen mPreferenceScreen;
private Context mContext;
private TestFragment mFragment;
+ private TestFragment2 mFragment2;
private View mEmptyView;
+ private int mInitDeviceProvisionedValue;
@Before
public void setUp() {
@@ -72,13 +77,24 @@
FakeFeatureFactory.setupForTest();
mContext = RuntimeEnvironment.application;
mFragment = spy(new TestFragment());
+ mFragment2 = spy(new TestFragment2());
doReturn(mActivity).when(mFragment).getActivity();
when(mFragment.getContext()).thenReturn(mContext);
+ when(mFragment2.getContext()).thenReturn(mContext);
mEmptyView = new View(mContext);
ReflectionHelpers.setField(mFragment, "mEmptyView", mEmptyView);
doReturn(ITEM_COUNT).when(mPreferenceScreen).getPreferenceCount();
+
+ mInitDeviceProvisionedValue = Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.DEVICE_PROVISIONED, 0);
+ }
+
+ @After
+ public void tearDown() {
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.DEVICE_PROVISIONED, mInitDeviceProvisionedValue);
}
@Test
@@ -210,9 +226,67 @@
assertThat(mFragment.mPinnedHeaderFrameLayout.getVisibility()).isEqualTo(View.INVISIBLE);
}
+ @Test
+ public void onAttach_shouldNotSkipForSUWAndDeviceIsProvisioned_notCallFinish() {
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.DEVICE_PROVISIONED, 1);
+
+ mFragment.onAttach(mContext);
+
+ verify(mFragment, never()).finish();
+ }
+
+ @Test
+ public void onAttach_shouldNotSkipForSUWAndDeviceIsNotProvisioned_notCallFinish() {
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.DEVICE_PROVISIONED, 0);
+
+ mFragment.onAttach(mContext);
+
+ verify(mFragment, never()).finish();
+ }
+
+ @Test
+ public void onAttach_shouldSkipForSUWAndDeviceIsDeviceProvisioned_notCallFinish() {
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.DEVICE_PROVISIONED, 1);
+
+ mFragment2.onAttach(mContext);
+
+ verify(mFragment2, never()).finish();
+ }
+
+ @Test
+ public void onAttach_shouldSkipForSUWAndDeviceProvisioned_notCallFinish() {
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.DEVICE_PROVISIONED, 0);
+
+ mFragment2.onAttach(mContext);
+
+ verify(mFragment2, times(1)).finish();
+ }
+
public static class TestFragment extends SettingsPreferenceFragment {
@Override
+ protected boolean shouldSkipForInitialSUW() {
+ return false;
+ }
+
+ @Override
+ public int getMetricsCategory() {
+ return 0;
+ }
+ }
+
+ public static class TestFragment2 extends SettingsPreferenceFragment {
+
+ @Override
+ protected boolean shouldSkipForInitialSUW() {
+ return true;
+ }
+
+ @Override
public int getMetricsCategory() {
return 0;
}
diff --git a/tests/robotests/src/com/android/settings/accounts/AccountDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/accounts/AccountDashboardFragmentTest.java
index fe57090..921587e 100644
--- a/tests/robotests/src/com/android/settings/accounts/AccountDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accounts/AccountDashboardFragmentTest.java
@@ -114,4 +114,9 @@
assertThat(indexRaws).isNotEmpty();
}
+
+ @Test
+ public void shouldSkipForInitialSUW_returnTrue() {
+ assertThat(mFragment.shouldSkipForInitialSUW()).isTrue();
+ }
}
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java
index 95d7659..2cec3d1 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppInfoDashboardFragmentTest.java
@@ -384,6 +384,11 @@
.isTrue();
}
+ @Test
+ public void shouldSkipForInitialSUW_returnTrue() {
+ assertThat(mFragment.shouldSkipForInitialSUW()).isTrue();
+ }
+
@Implements(AppUtils.class)
public static class ShadowAppUtils {
diff --git a/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDashboardFragmentTest.java
index 2d4082b..bd4ee56 100644
--- a/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/development/DevelopmentSettingsDashboardFragmentTest.java
@@ -278,6 +278,11 @@
verify(controller).onDisableLogPersistDialogRejected();
}
+ @Test
+ public void shouldSkipForInitialSUW_returnTrue() {
+ assertThat(mDashboard.shouldSkipForInitialSUW()).isTrue();
+ }
+
@Implements(EnableDevelopmentSettingWarningDialog.class)
public static class ShadowEnableDevelopmentSettingWarningDialog {
diff --git a/tests/robotests/src/com/android/settings/privacy/WorkPolicyInfoPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/privacy/WorkPolicyInfoPreferenceControllerTest.java
index 79aec30..82444aa 100644
--- a/tests/robotests/src/com/android/settings/privacy/WorkPolicyInfoPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/privacy/WorkPolicyInfoPreferenceControllerTest.java
@@ -16,7 +16,7 @@
package com.android.settings.privacy;
-import static com.android.settings.core.BasePreferenceController.AVAILABLE_UNSEARCHABLE;
+import static com.android.settings.core.BasePreferenceController.AVAILABLE;
import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE;
import static com.google.common.truth.Truth.assertThat;
@@ -33,8 +33,8 @@
import com.android.settings.testutils.FakeFeatureFactory;
import org.junit.Before;
-import org.junit.runner.RunWith;
import org.junit.Test;
+import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
@@ -64,12 +64,12 @@
}
@Test
- public void getAvailabilityStatus_haveWorkPolicyInfo_shouldReturnAvailableUnsearchable() {
+ public void getAvailabilityStatus_haveWorkPolicyInfo_shouldReturnAvailable() {
when(mEnterpriseProvider.hasWorkPolicyInfo()).thenReturn(true);
WorkPolicyInfoPreferenceController controller =
new WorkPolicyInfoPreferenceController(mContext, "test_key");
- assertThat(controller.getAvailabilityStatus()).isEqualTo(AVAILABLE_UNSEARCHABLE);
+ assertThat(controller.getAvailabilityStatus()).isEqualTo(AVAILABLE);
}
@Test
diff --git a/tests/robotests/src/com/android/settings/system/ResetDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/system/ResetDashboardFragmentTest.java
new file mode 100644
index 0000000..c1d4788
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/system/ResetDashboardFragmentTest.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2022 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.system;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+@RunWith(RobolectricTestRunner.class)
+public class ResetDashboardFragmentTest {
+
+ private ResetDashboardFragment mFragment;
+
+ @Before
+ public void setup() {
+ mFragment = new ResetDashboardFragment();
+ }
+
+ @Test
+ public void shouldSkipForInitialSUW_returnTrue() {
+ assertThat(mFragment.shouldSkipForInitialSUW()).isTrue();
+ }
+}
diff --git a/tests/unit/src/com/android/settings/network/InternetPreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/InternetPreferenceControllerTest.java
index 6005713..da62837 100644
--- a/tests/unit/src/com/android/settings/network/InternetPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/network/InternetPreferenceControllerTest.java
@@ -101,7 +101,8 @@
public void onResume_shouldRegisterCallback() {
mController.onResume();
- verify(mContext).registerReceiver(any(BroadcastReceiver.class), any(IntentFilter.class));
+ verify(mContext).registerReceiver(any(BroadcastReceiver.class), any(IntentFilter.class),
+ any(int.class));
verify(mConnectivityManager).registerNetworkCallback(
any(NetworkRequest.class),
any(ConnectivityManager.NetworkCallback.class),
diff --git a/tests/unit/src/com/android/settings/network/InternetResetHelperTest.java b/tests/unit/src/com/android/settings/network/InternetResetHelperTest.java
index ec9abc9..4e382eb 100644
--- a/tests/unit/src/com/android/settings/network/InternetResetHelperTest.java
+++ b/tests/unit/src/com/android/settings/network/InternetResetHelperTest.java
@@ -121,7 +121,8 @@
public void onResume_registerReceiver() {
mInternetResetHelper.onResume();
- verify(mContext).registerReceiver(any(BroadcastReceiver.class), any(IntentFilter.class));
+ verify(mContext).registerReceiver(any(BroadcastReceiver.class), any(IntentFilter.class),
+ any(int.class));
}
@Test
diff --git a/tests/unit/src/com/android/settings/network/InternetUpdaterTest.java b/tests/unit/src/com/android/settings/network/InternetUpdaterTest.java
index c54c3ee..061ee4c 100644
--- a/tests/unit/src/com/android/settings/network/InternetUpdaterTest.java
+++ b/tests/unit/src/com/android/settings/network/InternetUpdaterTest.java
@@ -88,7 +88,8 @@
mInternetUpdater.onResume();
verify(mAirplaneModeEnabler).start();
- verify(mContext).registerReceiver(any(BroadcastReceiver.class), any(IntentFilter.class));
+ verify(mContext).registerReceiver(any(BroadcastReceiver.class), any(IntentFilter.class),
+ any(int.class));
verify(mConnectivityManager).registerDefaultNetworkCallback(
any(ConnectivityManager.NetworkCallback.class));
// Unregister callbacks