Skip to content

Commit 97f25f7

Browse files
haggertkdarknius09
authored andcommitted
Merge tag 'android-security-11.0.0_r58' of https://android.googlesource.com/platform/packages/apps/Settings into staging/lineage-18.1_merge_android-security-11.0.0_r58
Android Security 11.0.0 Release 58 (8712617) * tag 'android-security-11.0.0_r58' of https://android.googlesource.com/platform/packages/apps/Settings: Extract app label from component name in notification access confirmation UI [DO NOT MERGE] Fix can't change notification sound for work profile. [DO NOT MERGE] Fix Settings crash when setting a null ringtone RESTRICT AUTOMERGE Fix: policy enforcement for location wifi scanning Do not let guest user disable secuer nfc via SettingsSlice RESTRICT AUTOMERGE Make bluetooth not discoverable via SliceDeepLinkTrampoline [DO NOT MERGE] Verify ringtone from ringtone picker is audio Change-Id: I1d78221bea197662b3a703c12b19bb266c9b675b
1 parent 1cc94ec commit 97f25f7

10 files changed

+219
-13
lines changed

res/xml/location_scanning.xml

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@
1717
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
1818
android:title="@string/location_scanning_screen_title">
1919

20-
<SwitchPreference
20+
<com.android.settingslib.RestrictedSwitchPreference
2121
android:title="@string/location_scanning_wifi_always_scanning_title"
2222
android:summary="@string/location_scanning_wifi_always_scanning_description"
2323
android:defaultValue="true"
2424
android:key="wifi_always_scanning" />
2525

26-
<SwitchPreference
26+
<com.android.settingslib.RestrictedSwitchPreference
2727
android:title="@string/location_scanning_bluetooth_always_scanning_title"
2828
android:summary="@string/location_scanning_bluetooth_always_scanning_description"
2929
android:defaultValue="true"

src/com/android/settings/DefaultRingtonePreference.java

+27-2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@
2222
import android.media.RingtoneManager;
2323
import android.net.Uri;
2424
import android.util.AttributeSet;
25+
import android.util.Log;
26+
27+
import androidx.annotation.VisibleForTesting;
2528

2629
public class DefaultRingtonePreference extends RingtonePreference {
2730
private static final String TAG = "DefaultRingtonePreference";
@@ -43,8 +46,30 @@ public void onPrepareRingtonePickerIntent(Intent ringtonePickerIntent) {
4346

4447
@Override
4548
protected void onSaveRingtone(Uri ringtoneUri) {
46-
RingtoneManager.setActualDefaultRingtoneUriBySlot(mUserContext, getRingtoneType(),
47-
ringtoneUri, getSlotId());
49+
if (ringtoneUri == null) {
50+
setActualDefaultRingtoneUri(ringtoneUri);
51+
return;
52+
}
53+
54+
String mimeType = mUserContext.getContentResolver().getType(ringtoneUri);
55+
if (mimeType == null) {
56+
Log.e(TAG, "onSaveRingtone for URI:" + ringtoneUri
57+
+ " ignored: failure to find mimeType (no access from this context?)");
58+
return;
59+
}
60+
61+
if (!(mimeType.startsWith("audio/") || mimeType.equals("application/ogg"))) {
62+
Log.e(TAG, "onSaveRingtone for URI:" + ringtoneUri
63+
+ " ignored: associated mimeType:" + mimeType + " is not an audio type");
64+
return;
65+
}
66+
67+
setActualDefaultRingtoneUri(ringtoneUri);
68+
}
69+
70+
@VisibleForTesting
71+
void setActualDefaultRingtoneUri(Uri ringtoneUri) {
72+
RingtoneManager.setActualDefaultRingtoneUri(mUserContext, getRingtoneType(), ringtoneUri);
4873
}
4974

5075
@Override

src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java

+13-4
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ public class ConnectedDeviceDashboardFragment extends DashboardFragment {
7272
private static final String SETTINGS_PACKAGE_NAME = "com.android.settings";
7373
private static final String SYSTEMUI_PACKAGE_NAME = "com.android.systemui";
7474
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
75+
private static final String SLICE_ACTION = "com.android.settings.SEARCH_RESULT_TRAMPOLINE";
7576

7677
@VisibleForTesting
7778
static final String KEY_CONNECTED_DEVICES = "connected_device_list";
@@ -110,8 +111,10 @@ public void onAttach(Context context) {
110111
SettingsUIDeviceConfig.BT_NEAR_BY_SUGGESTION_ENABLED, true);
111112
String callingAppPackageName = PasswordUtils.getCallingAppPackageName(
112113
getActivity().getActivityToken());
114+
String action = getIntent() != null ? getIntent().getAction() : "";
113115
if (DEBUG) {
114-
Log.d(TAG, "onAttach() calling package name is : " + callingAppPackageName);
116+
Log.d(TAG, "onAttach() calling package name is : " + callingAppPackageName
117+
+ ", action : " + action);
115118
}
116119
use(AvailableMediaDeviceGroupController.class).init(this);
117120
use(ConnectedDeviceGroupController.class).init(this);
@@ -120,9 +123,15 @@ public void onAttach(Context context) {
120123
use(SlicePreferenceController.class).setSliceUri(nearbyEnabled
121124
? Uri.parse(getString(R.string.config_nearby_devices_slice_uri))
122125
: null);
123-
use(DiscoverableFooterPreferenceController.class).setAlwaysDiscoverable(
124-
TextUtils.equals(SETTINGS_PACKAGE_NAME, callingAppPackageName)
125-
|| TextUtils.equals(SYSTEMUI_PACKAGE_NAME, callingAppPackageName));
126+
use(DiscoverableFooterPreferenceController.class)
127+
.setAlwaysDiscoverable(isAlwaysDiscoverable(callingAppPackageName, action));
128+
}
129+
130+
@VisibleForTesting
131+
boolean isAlwaysDiscoverable(String callingAppPackageName, String action) {
132+
return TextUtils.equals(SLICE_ACTION, action) ? false
133+
: TextUtils.equals(SETTINGS_PACKAGE_NAME, callingAppPackageName)
134+
|| TextUtils.equals(SYSTEMUI_PACKAGE_NAME, callingAppPackageName);
126135
}
127136

128137
/**

src/com/android/settings/location/BluetoothScanningPreferenceController.java

+11
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,17 @@
1414
package com.android.settings.location;
1515

1616
import android.content.Context;
17+
import android.os.UserHandle;
18+
import android.os.UserManager;
1719
import android.provider.Settings;
1820

1921
import androidx.preference.Preference;
2022
import androidx.preference.SwitchPreference;
2123

2224
import com.android.settings.core.PreferenceControllerMixin;
25+
import com.android.settingslib.RestrictedLockUtils;
26+
import com.android.settingslib.RestrictedLockUtilsInternal;
27+
import com.android.settingslib.RestrictedSwitchPreference;
2328
import com.android.settingslib.core.AbstractPreferenceController;
2429

2530
public class BluetoothScanningPreferenceController extends AbstractPreferenceController
@@ -46,6 +51,12 @@ public void updateState(Preference preference) {
4651
((SwitchPreference) preference).setChecked(
4752
Settings.Global.getInt(mContext.getContentResolver(),
4853
Settings.Global.BLE_SCAN_ALWAYS_AVAILABLE, 0) == 1);
54+
final RestrictedLockUtils.EnforcedAdmin admin =
55+
RestrictedLockUtilsInternal.checkIfRestrictionEnforced(
56+
mContext, UserManager.DISALLOW_CONFIG_LOCATION, UserHandle.myUserId());
57+
if (admin != null) {
58+
((RestrictedSwitchPreference) preference).setDisabledByAdmin(admin);
59+
}
4960
}
5061

5162
@Override

src/com/android/settings/location/WifiScanningPreferenceController.java

+11
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,17 @@
1414
package com.android.settings.location;
1515

1616
import android.content.Context;
17+
import android.os.UserHandle;
18+
import android.os.UserManager;
1719
import android.net.wifi.WifiManager;
1820

1921
import androidx.preference.Preference;
2022
import androidx.preference.SwitchPreference;
2123

2224
import com.android.settings.core.PreferenceControllerMixin;
25+
import com.android.settingslib.RestrictedLockUtils;
26+
import com.android.settingslib.RestrictedLockUtilsInternal;
27+
import com.android.settingslib.RestrictedSwitchPreference;
2328
import com.android.settingslib.core.AbstractPreferenceController;
2429

2530
public class WifiScanningPreferenceController extends AbstractPreferenceController
@@ -46,6 +51,12 @@ public String getPreferenceKey() {
4651
@Override
4752
public void updateState(Preference preference) {
4853
((SwitchPreference) preference).setChecked(mWifiManager.isScanAlwaysAvailable());
54+
final RestrictedLockUtils.EnforcedAdmin admin =
55+
RestrictedLockUtilsInternal.checkIfRestrictionEnforced(
56+
mContext, UserManager.DISALLOW_CONFIG_LOCATION, UserHandle.myUserId());
57+
if (admin != null) {
58+
((RestrictedSwitchPreference) preference).setDisabledByAdmin(admin);
59+
}
4960
}
5061

5162
@Override

src/com/android/settings/nfc/SecureNfcPreferenceController.java

+16-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import android.content.Context;
1919
import android.nfc.NfcAdapter;
20+
import android.os.UserManager;
2021

2122
import androidx.preference.PreferenceScreen;
2223
import androidx.preference.SwitchPreference;
@@ -31,10 +32,12 @@ public class SecureNfcPreferenceController extends TogglePreferenceController
3132

3233
private final NfcAdapter mNfcAdapter;
3334
private SecureNfcEnabler mSecureNfcEnabler;
35+
private final UserManager mUserManager;
3436

3537
public SecureNfcPreferenceController(Context context, String key) {
3638
super(context, key);
3739
mNfcAdapter = NfcAdapter.getDefaultAdapter(context);
40+
mUserManager = context.getSystemService(UserManager.class);
3841
}
3942

4043
@Override
@@ -57,7 +60,11 @@ public boolean isChecked() {
5760

5861
@Override
5962
public boolean setChecked(boolean isChecked) {
60-
return mNfcAdapter.enableSecureNfc(isChecked);
63+
if (isToggleable()) {
64+
return mNfcAdapter.enableSecureNfc(isChecked);
65+
} else {
66+
return false;
67+
}
6168
}
6269

6370
@Override
@@ -94,4 +101,12 @@ public void onPause() {
94101
mSecureNfcEnabler.pause();
95102
}
96103
}
104+
105+
private boolean isToggleable() {
106+
if (mUserManager.isGuestUser()) {
107+
return false;
108+
}
109+
return true;
110+
}
111+
97112
}

src/com/android/settings/notification/NotificationAccessConfirmationActivity.java

+29-4
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
2121

2222
import static com.android.internal.notification.NotificationAccessConfirmationActivityContract.EXTRA_COMPONENT_NAME;
23-
import static com.android.internal.notification.NotificationAccessConfirmationActivityContract.EXTRA_PACKAGE_TITLE;
2423
import static com.android.internal.notification.NotificationAccessConfirmationActivityContract.EXTRA_USER_ID;
2524

2625
import android.Manifest;
@@ -30,10 +29,13 @@
3029
import android.content.ComponentName;
3130
import android.content.Context;
3231
import android.content.DialogInterface;
32+
import android.content.pm.ApplicationInfo;
33+
import android.content.pm.PackageItemInfo;
3334
import android.content.pm.PackageManager;
3435
import android.content.pm.ServiceInfo;
3536
import android.os.Bundle;
3637
import android.os.UserHandle;
38+
import android.text.TextUtils;
3739
import android.util.Slog;
3840
import android.view.WindowManager;
3941
import android.view.accessibility.AccessibilityEvent;
@@ -63,15 +65,38 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
6365

6466
mComponentName = getIntent().getParcelableExtra(EXTRA_COMPONENT_NAME);
6567
mUserId = getIntent().getIntExtra(EXTRA_USER_ID, UserHandle.USER_NULL);
66-
String pkgTitle = getIntent().getStringExtra(EXTRA_PACKAGE_TITLE);
68+
CharSequence mAppLabel;
69+
70+
if (mComponentName == null || mComponentName.getPackageName() == null) {
71+
finish();
72+
return;
73+
}
74+
75+
try {
76+
ApplicationInfo applicationInfo = getPackageManager().getApplicationInfo(
77+
mComponentName.getPackageName(), 0);
78+
mAppLabel = applicationInfo.loadSafeLabel(getPackageManager(),
79+
PackageItemInfo.DEFAULT_MAX_LABEL_SIZE_PX,
80+
PackageItemInfo.SAFE_LABEL_FLAG_TRIM
81+
| PackageItemInfo.SAFE_LABEL_FLAG_FIRST_LINE);
82+
} catch (PackageManager.NameNotFoundException e) {
83+
Slog.e(LOG_TAG, "Couldn't find app with package name for " + mComponentName, e);
84+
finish();
85+
return;
86+
}
87+
88+
if (TextUtils.isEmpty(mAppLabel)) {
89+
finish();
90+
return;
91+
}
6792

6893
AlertController.AlertParams p = new AlertController.AlertParams(this);
6994
p.mTitle = getString(
7095
R.string.notification_listener_security_warning_title,
71-
pkgTitle);
96+
mAppLabel);
7297
p.mMessage = getString(
7398
R.string.notification_listener_security_warning_summary,
74-
pkgTitle);
99+
mAppLabel);
75100
p.mPositiveButtonText = getString(R.string.allow);
76101
p.mPositiveButtonListener = (a, b) -> onAllow();
77102
p.mNegativeButtonText = getString(R.string.deny);

tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragmentTest.java

+27
Original file line numberDiff line numberDiff line change
@@ -53,16 +53,23 @@ public class ConnectedDeviceDashboardFragmentTest {
5353
private static final String KEY_NEARBY_DEVICES = "bt_nearby_slice";
5454
private static final String KEY_DISCOVERABLE_FOOTER = "discoverable_footer";
5555
private static final String KEY_SEE_ALL = "previously_connected_devices_see_all";
56+
private static final String SETTINGS_PACKAGE_NAME = "com.android.settings";
57+
private static final String SYSTEMUI_PACKAGE_NAME = "com.android.systemui";
58+
private static final String SLICE_ACTION = "com.android.settings.SEARCH_RESULT_TRAMPOLINE";
59+
private static final String TEST_APP_NAME = "com.testapp.settings";
60+
private static final String TEST_ACTION = "com.testapp.settings.ACTION_START";
5661

5762
@Mock
5863
private PackageManager mPackageManager;
5964
private Context mContext;
65+
private ConnectedDeviceDashboardFragment mFragment;
6066

6167
@Before
6268
public void setUp() {
6369
MockitoAnnotations.initMocks(this);
6470

6571
mContext = spy(RuntimeEnvironment.application);
72+
mFragment = new ConnectedDeviceDashboardFragment();
6673
doReturn(mPackageManager).when(mContext).getPackageManager();
6774
doReturn(true).when(mPackageManager).hasSystemFeature(PackageManager.FEATURE_BLUETOOTH);
6875
}
@@ -86,6 +93,26 @@ public void nonIndexableKeys_existInXmlLayout() {
8693
KEY_NEARBY_DEVICES, KEY_DISCOVERABLE_FOOTER, KEY_SEE_ALL);
8794
}
8895

96+
@Test
97+
public void isAlwaysDiscoverable_callingAppIsNotFromSystemApp_returnsFalse() {
98+
assertThat(mFragment.isAlwaysDiscoverable(TEST_APP_NAME, TEST_ACTION)).isFalse();
99+
}
100+
101+
@Test
102+
public void isAlwaysDiscoverable_callingAppIsFromSettings_returnsTrue() {
103+
assertThat(mFragment.isAlwaysDiscoverable(SETTINGS_PACKAGE_NAME, TEST_ACTION)).isTrue();
104+
}
105+
106+
@Test
107+
public void isAlwaysDiscoverable_callingAppIsFromSystemUI_returnsTrue() {
108+
assertThat(mFragment.isAlwaysDiscoverable(SYSTEMUI_PACKAGE_NAME, TEST_ACTION)).isTrue();
109+
}
110+
111+
@Test
112+
public void isAlwaysDiscoverable_actionIsFromSlice_returnsFalse() {
113+
assertThat(mFragment.isAlwaysDiscoverable(SYSTEMUI_PACKAGE_NAME, SLICE_ACTION)).isFalse();
114+
}
115+
89116
@Test
90117
public void getPreferenceControllers_containSlicePrefController() {
91118
final List<BasePreferenceController> controllers =

tests/unit/Android.bp

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ android_test {
1717
"androidx.test.espresso.core",
1818
"androidx.test.espresso.contrib-nodeps",
1919
"androidx.test.espresso.intents-nodeps",
20+
"androidx.test.ext.junit",
2021
"mockito-target-minus-junit4",
2122
"platform-test-annotations",
2223
"truth-prebuilt",

0 commit comments

Comments
 (0)