Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1c59bb5f authored by Ricky Wai's avatar Ricky Wai Committed by Automerger Merge Worker
Browse files

Merge "Apply app ops restriction and filter to restricted switch preference"...

Merge "Apply app ops restriction and filter to restricted switch preference" into tm-dev am: 477ed8b6

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/17135813

Change-Id: Ifc09e4d9dd7b1bd82054fa75ed5f01db3c8a759c
parents e65c416d 477ed8b6
Loading
Loading
Loading
Loading
+7 −5
Original line number Diff line number Diff line
@@ -23,7 +23,6 @@ import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
import android.app.admin.DevicePolicyManager;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Build;
import android.os.UserHandle;
import android.text.TextUtils;
import android.util.AttributeSet;
@@ -33,8 +32,6 @@ import android.widget.TextView;
import androidx.preference.Preference;
import androidx.preference.PreferenceViewHolder;

import com.android.internal.util.Preconditions;

/**
 * Helper class for managing settings preferences that can be disabled
 * by device admins via user restrictions.
@@ -42,8 +39,8 @@ import com.android.internal.util.Preconditions;
public class RestrictedPreferenceHelper {
    private final Context mContext;
    private final Preference mPreference;
    final String packageName;
    final int uid;
    String packageName;
    int uid;

    private boolean mDisabledByAdmin;
    private EnforcedAdmin mEnforcedAdmin;
@@ -219,6 +216,11 @@ public class RestrictedPreferenceHelper {
        return mDisabledByAppOps;
    }

    public void updatePackageDetails(String packageName, int uid) {
        this.packageName = packageName;
        this.uid = uid;
    }

    private void updateDisabledState() {
        if (!(mPreference instanceof RestrictedTopLevelPreference)) {
            mPreference.setEnabled(!(mDisabledByAdmin || mDisabledByAppOps));
+59 −2
Original line number Diff line number Diff line
@@ -18,8 +18,11 @@ package com.android.settingslib;

import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;

import android.annotation.NonNull;
import android.app.AppOpsManager;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Process;
import android.os.UserHandle;
import android.util.AttributeSet;
import android.util.TypedValue;
@@ -28,6 +31,7 @@ import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.annotation.VisibleForTesting;
import androidx.core.content.res.TypedArrayUtils;
import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceViewHolder;
@@ -39,6 +43,7 @@ import androidx.preference.SwitchPreference;
 */
public class RestrictedSwitchPreference extends SwitchPreference {
    RestrictedPreferenceHelper mHelper;
    AppOpsManager mAppOpsManager;
    boolean mUseAdditionalSummary = false;
    CharSequence mRestrictedSwitchSummary;
    private int mIconSize;
@@ -90,6 +95,11 @@ public class RestrictedSwitchPreference extends SwitchPreference {
        this(context, null);
    }

    @VisibleForTesting
    public void setAppOps(AppOpsManager appOps) {
        mAppOpsManager = appOps;
    }

    public void setIconSize(int iconSize) {
        mIconSize = iconSize;
    }
@@ -97,6 +107,12 @@ public class RestrictedSwitchPreference extends SwitchPreference {
    @Override
    public void onBindViewHolder(PreferenceViewHolder holder) {
        super.onBindViewHolder(holder);
        final View switchView = holder.findViewById(android.R.id.switch_widget);
        if (switchView != null) {
            final View rootView = switchView.getRootView();
            rootView.setFilterTouchesWhenObscured(true);
        }

        mHelper.onBindViewHolder(holder);

        CharSequence switchSummary;
@@ -164,12 +180,19 @@ public class RestrictedSwitchPreference extends SwitchPreference {

    @Override
    public void setEnabled(boolean enabled) {
        boolean changed = false;
        if (enabled && isDisabledByAdmin()) {
            mHelper.setDisabledByAdmin(null);
            return;
            changed = true;
        }
        if (enabled && isDisabledByAppOps()) {
            mHelper.setDisabledByAppOps(false);
            changed = true;
        }
        if (!changed) {
            super.setEnabled(enabled);
        }
    }

    public void setDisabledByAdmin(EnforcedAdmin admin) {
        if (mHelper.setDisabledByAdmin(admin)) {
@@ -180,4 +203,38 @@ public class RestrictedSwitchPreference extends SwitchPreference {
    public boolean isDisabledByAdmin() {
        return mHelper.isDisabledByAdmin();
    }

    private void setDisabledByAppOps(boolean disabled) {
        if (mHelper.setDisabledByAppOps(disabled)) {
            notifyChanged();
        }
    }

    public boolean isDisabledByAppOps() {
        return mHelper.isDisabledByAppOps();
    }

    public int getUid() {
        return mHelper != null ? mHelper.uid : Process.INVALID_UID;
    }

    public String getPackageName() {
        return mHelper != null ? mHelper.packageName : null;
    }

    public void updateState(@NonNull String packageName, int uid, boolean isEnabled) {
        mHelper.updatePackageDetails(packageName, uid);
        if (mAppOpsManager == null) {
            mAppOpsManager = getContext().getSystemService(AppOpsManager.class);
        }
        final int mode = mAppOpsManager.noteOpNoThrow(
                AppOpsManager.OP_ACCESS_RESTRICTED_SETTINGS,
                uid, packageName);
        final boolean appOpsAllowed = mode == AppOpsManager.MODE_ALLOWED;
        if (appOpsAllowed || isEnabled) {
            setEnabled(true);
        } else {
            setDisabledByAppOps(true);
        }
    }
}