Files
app_Settings/src/com/android/settings/notification/RedactNotificationPreferenceController.java
Adam Bookatz 8311f68065 Fix Settings getProfileIdsWithDisabled usage
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
2022-04-27 18:34:07 -07:00

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;
}
}