blob: 5268ec42e21c25bd9ce7a0ac2f3ba457545fe78d [file] [log] [blame]
/*
* 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 android.app;
import static android.app.AppOpsManager.OP_NONE;
import android.annotation.NonNull;
import java.util.Objects;
/**
* Information about a particular app op.
*/
class AppOpInfo {
/**
* A unique constant identifying this app op.
*/
public final int code;
/**
* This maps each operation to the operation that serves as the
* switch to determine whether it is allowed. Generally this is
* a 1:1 mapping, but for some things (like location) that have
* multiple low-level operations being tracked that should be
* presented to the user as one switch then this can be used to
* make them all controlled by the same single operation.
*/
public final int switchCode;
/**
* This maps each operation to the public string constant for it.
*/
public final String name;
/**
* This provides a simple name for each operation to be used
* in debug output.
*/
public final String simpleName;
/**
* This optionally maps a permission to an operation. If there
* is no permission associated with an operation, it is null.
*/
public final String permission;
/**
* Specifies whether an Op should be restricted by a user restriction.
* Each Op should be filled with a restriction string from UserManager or
* null to specify it is not affected by any user restriction.
*/
public final String restriction;
/**
* In which cases should an app be allowed to bypass the
* {@link AppOpsManager#setUserRestriction user restriction} for a certain app-op.
*/
public final AppOpsManager.RestrictionBypass allowSystemRestrictionBypass;
/**
* This specifies the default mode for each operation.
*/
public final int defaultMode;
/**
* This specifies whether each option is allowed to be reset
* when resetting all app preferences. Disable reset for
* app ops that are under strong control of some part of the
* system (such as OP_WRITE_SMS, which should be allowed only
* for whichever app is selected as the current SMS app).
*/
public final boolean disableReset;
/**
* This specifies whether each option is only allowed to be read
* by apps with manage appops permission.
*/
public final boolean restrictRead;
/**
* Whether to collect noteOp instances, and send them to callbacks.
*/
public final boolean forceCollectNotes;
AppOpInfo(int code,
int switchCode,
@NonNull String name,
@NonNull String simpleName,
String permission,
String restriction,
AppOpsManager.RestrictionBypass allowSystemRestrictionBypass,
int defaultMode,
boolean disableReset,
boolean restrictRead,
boolean forceCollectNotes) {
if (code < OP_NONE) throw new IllegalArgumentException();
if (switchCode < OP_NONE) throw new IllegalArgumentException();
Objects.requireNonNull(name);
Objects.requireNonNull(simpleName);
this.code = code;
this.switchCode = switchCode;
this.name = name;
this.simpleName = simpleName;
this.permission = permission;
this.restriction = restriction;
this.allowSystemRestrictionBypass = allowSystemRestrictionBypass;
this.defaultMode = defaultMode;
this.disableReset = disableReset;
this.restrictRead = restrictRead;
this.forceCollectNotes = forceCollectNotes;
}
static class Builder {
private int mCode;
private int mSwitchCode;
private String mName;
private String mSimpleName;
private String mPermission = null;
private String mRestriction = null;
private AppOpsManager.RestrictionBypass mAllowSystemRestrictionBypass = null;
private int mDefaultMode = AppOpsManager.MODE_DEFAULT;
private boolean mDisableReset = false;
private boolean mRestrictRead = false;
private boolean mForceCollectNotes = false;
Builder(int code, @NonNull String name, @NonNull String simpleName) {
if (code < OP_NONE) throw new IllegalArgumentException();
Objects.requireNonNull(name);
Objects.requireNonNull(simpleName);
this.mCode = code;
this.mSwitchCode = code;
this.mName = name;
this.mSimpleName = simpleName;
}
public Builder setCode(int value) {
this.mCode = value;
return this;
}
public Builder setSwitchCode(int value) {
this.mSwitchCode = value;
return this;
}
public Builder setName(String value) {
this.mName = value;
return this;
}
public Builder setSimpleName(String value) {
this.mSimpleName = value;
return this;
}
public Builder setPermission(String value) {
this.mPermission = value;
return this;
}
public Builder setRestriction(String value) {
this.mRestriction = value;
return this;
}
public Builder setAllowSystemRestrictionBypass(
AppOpsManager.RestrictionBypass value) {
this.mAllowSystemRestrictionBypass = value;
return this;
}
public Builder setDefaultMode(int value) {
this.mDefaultMode = value;
return this;
}
public Builder setDisableReset(boolean value) {
this.mDisableReset = value;
return this;
}
public Builder setRestrictRead(boolean value) {
this.mRestrictRead = value;
return this;
}
public Builder setForceCollectNotes(boolean value) {
this.mForceCollectNotes = value;
return this;
}
public AppOpInfo build() {
return new AppOpInfo(mCode, mSwitchCode, mName, mSimpleName, mPermission, mRestriction,
mAllowSystemRestrictionBypass, mDefaultMode, mDisableReset, mRestrictRead,
mForceCollectNotes);
}
}
}