blob: d08548fa31a5e18555dc83a935818f84724a7bb9 [file] [log] [blame]
/*
* Copyright (C) 2018 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.content.pm;
import android.annotation.IntDef;
import android.os.Parcel;
import android.os.Parcelable;
import java.lang.annotation.RetentionPolicy;
/**
* Information you can retrive about a particular application requested permission. This
* corresponds to information collected from the AndroidManifest.xml's <uses-permission>
* tags.
*/
public final class UsesPermissionInfo extends PackageItemInfo implements Parcelable {
/**
* Flag for {@link #getFlags()}: the requested permission is currently granted to the
* application.
*/
public static final int FLAG_REQUESTED_PERMISSION_GRANTED = 1 << 1;
/** @hide */
@IntDef(flag = true, prefix = {"FLAG_"}, value = {FLAG_REQUESTED_PERMISSION_GRANTED})
@java.lang.annotation.Retention(RetentionPolicy.SOURCE)
public @interface Flags {}
/** An unset value for {@link #getDataSentOffDevice()},
* {@link #getDataSharedWithThirdParty()}, and {@link #getDataUsedForMonetization()}
*/
public static final int USAGE_UNDEFINED = 0;
/**
* A yes value for {@link #getDataSentOffDevice()}, {@link #getDataSharedWithThirdParty()},
* and {@link #getDataUsedForMonetization()} corresponding to the <code>yes</code> value of
* {@link android.R.attr#dataSentOffDevice}, {@link android.R.attr#dataSharedWithThirdParty},
* and {@link android.R.attr#dataUsedForMonetization} attributes.
*/
public static final int USAGE_YES = 1;
/**
* A user triggered only value for {@link #getDataSentOffDevice()},
* {@link #getDataSharedWithThirdParty()}, and {@link #getDataUsedForMonetization()}
* corresponding to the <code>userTriggered</code> value of
* {@link android.R.attr#dataSentOffDevice}, {@link android.R.attr#dataSharedWithThirdParty},
* and {@link android.R.attr#dataUsedForMonetization} attributes.
*/
public static final int USAGE_USER_TRIGGERED = 2;
/**
* A no value for {@link #getDataSentOffDevice()}, {@link #getDataSharedWithThirdParty()},
* and {@link #getDataUsedForMonetization()} corresponding to the <code>no</code> value of
* {@link android.R.attr#dataSentOffDevice}, {@link android.R.attr#dataSharedWithThirdParty},
* and {@link android.R.attr#dataUsedForMonetization} attributes.
*/
public static final int USAGE_NO = 3;
/** @hide */
@IntDef(prefix = {"USAGE_"}, value = {
USAGE_UNDEFINED,
USAGE_YES,
USAGE_USER_TRIGGERED,
USAGE_NO})
@java.lang.annotation.Retention(RetentionPolicy.SOURCE)
public @interface Usage {}
/**
* An unset value for {@link #getDataRetention}.
*/
public static final int RETENTION_UNDEFINED = 0;
/**
* A data not retained value for {@link #getDataRetention()} corresponding to the
* <code>notRetained</code> value of {@link android.R.attr#dataRetentionTime}.
*/
public static final int RETENTION_NOT_RETAINED = 1;
/**
* A user selected value for {@link #getDataRetention()} corresponding to the
* <code>userSelected</code> value of {@link android.R.attr#dataRetentionTime}.
*/
public static final int RETENTION_USER_SELECTED = 2;
/**
* An unlimited value for {@link #getDataRetention()} corresponding to the
* <code>unlimited</code> value of {@link android.R.attr#dataRetentionTime}.
*/
public static final int RETENTION_UNLIMITED = 3;
/**
* A specified value for {@link #getDataRetention()} corresponding to providing the number of
* weeks data is retained in {@link android.R.attr#dataRetentionTime}. The number of weeks
* is available in {@link #getDataRetentionWeeks()}.
*/
public static final int RETENTION_SPECIFIED = 4;
/** @hide */
@IntDef(prefix = {"RETENTION_"}, value = {
RETENTION_UNDEFINED,
RETENTION_NOT_RETAINED,
RETENTION_USER_SELECTED,
RETENTION_UNLIMITED,
RETENTION_SPECIFIED})
@java.lang.annotation.Retention(RetentionPolicy.SOURCE)
public @interface Retention {}
private final String mPermission;
private final @Flags int mFlags;
private final @Usage int mDataSentOffDevice;
private final @Usage int mDataSharedWithThirdParty;
private final @Usage int mDataUsedForMonetization;
private final @Retention int mDataRetention;
private final int mDataRetentionWeeks;
/** @hide */
public UsesPermissionInfo(String permission) {
mPermission = permission;
mDataSentOffDevice = USAGE_UNDEFINED;
mDataSharedWithThirdParty = USAGE_UNDEFINED;
mDataUsedForMonetization = USAGE_UNDEFINED;
mDataRetention = RETENTION_UNDEFINED;
mDataRetentionWeeks = -1;
mFlags = 0;
}
/** @hide */
public UsesPermissionInfo(String permission,
@Usage int dataSentOffDevice, @Usage int dataSharedWithThirdParty,
@Usage int dataUsedForMonetization, @Retention int dataRetention,
int dataRetentionWeeks) {
mPermission = permission;
mDataSentOffDevice = dataSentOffDevice;
mDataSharedWithThirdParty = dataSharedWithThirdParty;
mDataUsedForMonetization = dataUsedForMonetization;
mDataRetention = dataRetention;
mDataRetentionWeeks = dataRetentionWeeks;
mFlags = 0;
}
/** @hide */
public UsesPermissionInfo(UsesPermissionInfo orig) {
this(orig, orig.mFlags);
}
/** @hide */
public UsesPermissionInfo(UsesPermissionInfo orig, int flags) {
super(orig);
mPermission = orig.mPermission;
mFlags = flags;
mDataSentOffDevice = orig.mDataSentOffDevice;
mDataSharedWithThirdParty = orig.mDataSharedWithThirdParty;
mDataUsedForMonetization = orig.mDataUsedForMonetization;
mDataRetention = orig.mDataRetention;
mDataRetentionWeeks = orig.mDataRetentionWeeks;
}
/**
* The name of the requested permission.
*/
public String getPermission() {
return mPermission;
}
public @Flags int getFlags() {
return mFlags;
}
/**
* If the application sends the data guarded by this permission off the device.
*
* See {@link android.R.attr#dataSentOffDevice}
*/
public @Usage int getDataSentOffDevice() {
return mDataSentOffDevice;
}
/**
* If the application or its services shares the data guarded by this permission with third
* parties.
*
* See {@link android.R.attr#dataSharedWithThirdParty}
*/
public @Usage int getDataSharedWithThirdParty() {
return mDataSharedWithThirdParty;
}
/**
* If the application or its services use the data guarded by this permission for monetization
* purposes.
*
* See {@link android.R.attr#dataUsedForMonetization}
*/
public @Usage int getDataUsedForMonetization() {
return mDataUsedForMonetization;
}
/**
* How long the application or its services store the data guarded by this permission.
* If set to {@link #RETENTION_SPECIFIED} {@link #getDataRetentionWeeks()} will contain the
* number of weeks the data is stored.
*
* See {@link android.R.attr#dataRetentionTime}
*/
public @Retention int getDataRetention() {
return mDataRetention;
}
/**
* If {@link #getDataRetention()} is {@link #RETENTION_SPECIFIED} the number of weeks the
* application or its services store data guarded by this permission.
*
* @throws IllegalStateException if {@link #getDataRetention} is not
* {@link #RETENTION_SPECIFIED}.
*/
public int getDataRetentionWeeks() {
if (mDataRetention != RETENTION_SPECIFIED) {
throw new IllegalStateException("Data retention weeks not specified");
}
return mDataRetentionWeeks;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeString(mPermission);
dest.writeInt(mFlags);
dest.writeInt(mDataSentOffDevice);
dest.writeInt(mDataSharedWithThirdParty);
dest.writeInt(mDataUsedForMonetization);
dest.writeInt(mDataRetention);
dest.writeInt(mDataRetentionWeeks);
}
private UsesPermissionInfo(Parcel source) {
super(source);
mPermission = source.readString();
mFlags = source.readInt();
mDataSentOffDevice = source.readInt();
mDataSharedWithThirdParty = source.readInt();
mDataUsedForMonetization = source.readInt();
mDataRetention = source.readInt();
mDataRetentionWeeks = source.readInt();
}
public static final Creator<UsesPermissionInfo> CREATOR =
new Creator<UsesPermissionInfo>() {
@Override
public UsesPermissionInfo createFromParcel(Parcel source) {
return new UsesPermissionInfo(source);
}
@Override
public UsesPermissionInfo[] newArray(int size) {
return new UsesPermissionInfo[size];
}
};
}