In two places, Settings uses getProfileIdsWithDisabled intending to restrict itself to *managed* profiles, but actually allows for any type of profile. Since the declared intent is to only deal with managed profiles, we update the code to only consider managed profiles. On devices that only have managed profiles (currently almost all devices), this cl is a no-op. Bug: 230495929 Bug: 230534572 Bug: 170249807 Test: com.android.settings.UtilsTest Test: make RunSettingsRoboTests -j Change-Id: Id04d45839ef61080b00ca2f91525718cb3a85120
195 lines
7.3 KiB
Java
195 lines
7.3 KiB
Java
/*
|
|
* Copyright (C) 2019 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.notification;
|
|
|
|
import static android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_SECURE_NOTIFICATIONS;
|
|
import static android.app.admin.DevicePolicyManager.KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS;
|
|
import static android.provider.Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS;
|
|
|
|
import android.app.KeyguardManager;
|
|
import android.content.Context;
|
|
import android.content.pm.UserInfo;
|
|
import android.database.ContentObserver;
|
|
import android.os.Handler;
|
|
import android.os.Looper;
|
|
import android.os.UserHandle;
|
|
import android.os.UserManager;
|
|
import android.provider.Settings;
|
|
|
|
import androidx.preference.PreferenceScreen;
|
|
|
|
import com.android.internal.widget.LockPatternUtils;
|
|
import com.android.settings.R;
|
|
import com.android.settings.core.TogglePreferenceController;
|
|
import com.android.settings.overlay.FeatureFactory;
|
|
import com.android.settingslib.RestrictedLockUtils;
|
|
import com.android.settingslib.RestrictedLockUtilsInternal;
|
|
import com.android.settingslib.RestrictedSwitchPreference;
|
|
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
|
import com.android.settingslib.core.lifecycle.events.OnStart;
|
|
import com.android.settingslib.core.lifecycle.events.OnStop;
|
|
|
|
import java.util.List;
|
|
|
|
/**
|
|
* The controller of the sensitive notifications.
|
|
*/
|
|
public class RedactNotificationPreferenceController extends TogglePreferenceController implements
|
|
LifecycleObserver, OnStart, OnStop {
|
|
private static final String TAG = "LockScreenNotifPref";
|
|
|
|
static final String KEY_LOCKSCREEN_REDACT = "lock_screen_redact";
|
|
static final String KEY_LOCKSCREEN_WORK_PROFILE_REDACT = "lock_screen_work_redact";
|
|
|
|
private UserManager mUm;
|
|
private KeyguardManager mKm;
|
|
int mProfileUserId;
|
|
private RestrictedSwitchPreference mPreference;
|
|
private ContentObserver mContentObserver =
|
|
new ContentObserver(new Handler(Looper.getMainLooper())) {
|
|
@Override
|
|
public void onChange(boolean selfChange) {
|
|
if (mPreference != null) {
|
|
mPreference.setEnabled(
|
|
getAvailabilityStatus() != DISABLED_DEPENDENT_SETTING);
|
|
}
|
|
}
|
|
};
|
|
|
|
public RedactNotificationPreferenceController(Context context, String settingKey) {
|
|
super(context, settingKey);
|
|
|
|
mUm = context.getSystemService(UserManager.class);
|
|
mKm = context.getSystemService(KeyguardManager.class);
|
|
|
|
mProfileUserId = UserHandle.myUserId();
|
|
final List<UserInfo> profiles = mUm.getProfiles(UserHandle.myUserId());
|
|
final int count = profiles.size();
|
|
for (int i = 0; i < count; i++) {
|
|
final UserInfo profile = profiles.get(i);
|
|
if (profile.isManagedProfile()
|
|
&& profile.getUserHandle().getIdentifier() != UserHandle.myUserId()) {
|
|
mProfileUserId = profile.getUserHandle().getIdentifier();
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void displayPreference(PreferenceScreen screen) {
|
|
super.displayPreference(screen);
|
|
mPreference = screen.findPreference(getPreferenceKey());
|
|
|
|
int userId = KEY_LOCKSCREEN_REDACT.equals(getPreferenceKey())
|
|
? UserHandle.myUserId() : mProfileUserId;
|
|
if (userId != UserHandle.USER_NULL) {
|
|
mPreference.setDisabledByAdmin(getEnforcedAdmin(userId));
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public boolean isChecked() {
|
|
int userId = KEY_LOCKSCREEN_REDACT.equals(getPreferenceKey())
|
|
? UserHandle.myUserId() : mProfileUserId;
|
|
|
|
return getAllowPrivateNotifications(userId);
|
|
}
|
|
|
|
@Override
|
|
public boolean setChecked(boolean isChecked) {
|
|
int userId = KEY_LOCKSCREEN_REDACT.equals(getPreferenceKey())
|
|
? UserHandle.myUserId() : mProfileUserId;
|
|
|
|
Settings.Secure.putIntForUser(mContext.getContentResolver(),
|
|
Settings.Secure.LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, isChecked ? 1 : 0, userId);
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public int getAvailabilityStatus() {
|
|
// hide work profile setting if no work profile
|
|
if (KEY_LOCKSCREEN_WORK_PROFILE_REDACT.equals(getPreferenceKey())
|
|
&& mProfileUserId == UserHandle.myUserId()) {
|
|
return CONDITIONALLY_UNAVAILABLE;
|
|
}
|
|
|
|
int userId = KEY_LOCKSCREEN_REDACT.equals(getPreferenceKey())
|
|
? UserHandle.myUserId() : mProfileUserId;
|
|
|
|
// hide if lockscreen isn't secure for this user
|
|
final LockPatternUtils utils = FeatureFactory.getFactory(mContext)
|
|
.getSecurityFeatureProvider()
|
|
.getLockPatternUtils(mContext);
|
|
if (!utils.isSecure(userId)) {
|
|
return CONDITIONALLY_UNAVAILABLE;
|
|
}
|
|
|
|
// all notifs hidden? disabled
|
|
if (!getLockscreenNotificationsEnabled(userId)) {
|
|
return DISABLED_DEPENDENT_SETTING;
|
|
}
|
|
|
|
// specifically the work profile setting requires the work profile to be unlocked
|
|
if (KEY_LOCKSCREEN_WORK_PROFILE_REDACT.equals(getPreferenceKey())) {
|
|
if (mKm.isDeviceLocked(mProfileUserId)) {
|
|
return DISABLED_DEPENDENT_SETTING;
|
|
}
|
|
}
|
|
|
|
return AVAILABLE;
|
|
}
|
|
|
|
@Override
|
|
public int getSliceHighlightMenuRes() {
|
|
return R.string.menu_key_notifications;
|
|
}
|
|
|
|
@Override
|
|
public void onStart() {
|
|
mContext.getContentResolver().registerContentObserver(
|
|
Settings.Secure.getUriFor(Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS),
|
|
false /* notifyForDescendants */, mContentObserver);
|
|
}
|
|
|
|
@Override
|
|
public void onStop() {
|
|
mContext.getContentResolver().unregisterContentObserver(mContentObserver);
|
|
}
|
|
|
|
private RestrictedLockUtils.EnforcedAdmin getEnforcedAdmin(int userId) {
|
|
RestrictedLockUtils.EnforcedAdmin admin =
|
|
RestrictedLockUtilsInternal.checkIfKeyguardFeaturesDisabled(
|
|
mContext, KEYGUARD_DISABLE_SECURE_NOTIFICATIONS, userId);
|
|
if (admin != null) {
|
|
return admin;
|
|
}
|
|
admin = RestrictedLockUtilsInternal.checkIfKeyguardFeaturesDisabled(
|
|
mContext, KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS, userId);
|
|
return admin;
|
|
}
|
|
|
|
private boolean getAllowPrivateNotifications(int userId) {
|
|
return Settings.Secure.getIntForUser(mContext.getContentResolver(),
|
|
LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS, 1, userId) != 0
|
|
&& getEnforcedAdmin(userId) == null;
|
|
}
|
|
|
|
private boolean getLockscreenNotificationsEnabled(int userId) {
|
|
return Settings.Secure.getIntForUser(mContext.getContentResolver(),
|
|
Settings.Secure.LOCK_SCREEN_SHOW_NOTIFICATIONS, 1, userId) != 0;
|
|
}
|
|
}
|