blob: e65e742cb6ec5ec04a9d595ff8791c7a824d8ae5 [file] [log] [blame]
/*
* Copyright (C) 2008 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 static android.content.res.Resources.ID_NULL;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.StringRes;
import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* Information you can retrieve about a particular security permission
* group known to the system. This corresponds to information collected from the
* AndroidManifest.xml's <permission-group> tags.
*/
public class PermissionGroupInfo extends PackageItemInfo implements Parcelable {
/**
* A string resource identifier (in the package's resources) of this
* permission's description. From the "description" attribute or,
* if not set, 0.
*/
public @StringRes int descriptionRes;
/**
* A string resource identifier (in the package's resources) used to request the permissions.
* From the "request" attribute or, if not set, 0.
*
* @hide
*/
@SystemApi
public @StringRes int requestRes;
/**
* A string resource identifier (in the package's resources) used as subtitle when requesting
* only access while in the foreground.
*
* From the "requestDetail" attribute or, if not set, {@link
* android.content.res.Resources#ID_NULL}.
*
* @hide
*/
@SystemApi
public final @StringRes int requestDetailResourceId;
/**
* A string resource identifier (in the package's resources) used when requesting background
* access. Also used when requesting both foreground and background access.
*
* From the "backgroundRequest" attribute or, if not set, {@link
* android.content.res.Resources#ID_NULL}.
*
* @hide
*/
@SystemApi
public final @StringRes int backgroundRequestResourceId;
/**
* A string resource identifier (in the package's resources) used as subtitle when requesting
* background access.
*
* From the "backgroundRequestDetail" attribute or, if not set, {@link
* android.content.res.Resources#ID_NULL}.
*
* @hide
*/
@SystemApi
public final @StringRes int backgroundRequestDetailResourceId;
/**
* The description string provided in the AndroidManifest file, if any. You
* probably don't want to use this, since it will be null if the description
* is in a resource. You probably want
* {@link PermissionInfo#loadDescription} instead.
*/
public @Nullable CharSequence nonLocalizedDescription;
/**
* Flag for {@link #flags}, corresponding to <code>personalInfo</code>
* value of {@link android.R.attr#permissionGroupFlags}.
*/
public static final int FLAG_PERSONAL_INFO = 1<<0;
/** @hide */
@IntDef(flag = true, prefix = { "FLAG_" }, value = {
FLAG_PERSONAL_INFO,
})
@Retention(RetentionPolicy.SOURCE)
public @interface Flags {}
/**
* Additional flags about this group as given by
* {@link android.R.attr#permissionGroupFlags}.
*/
public @Flags int flags;
/**
* Prioritization of this group, for visually sorting with other groups.
*/
public int priority;
/**
* @hide
*/
public PermissionGroupInfo(@StringRes int requestDetailResourceId,
@StringRes int backgroundRequestResourceId,
@StringRes int backgroundRequestDetailResourceId) {
this.requestDetailResourceId = requestDetailResourceId;
this.backgroundRequestResourceId = backgroundRequestResourceId;
this.backgroundRequestDetailResourceId = backgroundRequestDetailResourceId;
}
/**
* @deprecated Should only be created by the system.
*/
@Deprecated
public PermissionGroupInfo() {
this(ID_NULL, ID_NULL, ID_NULL);
}
/**
* @deprecated Should only be created by the system.
*/
@Deprecated
public PermissionGroupInfo(@NonNull PermissionGroupInfo orig) {
super(orig);
descriptionRes = orig.descriptionRes;
requestRes = orig.requestRes;
requestDetailResourceId = orig.requestDetailResourceId;
backgroundRequestResourceId = orig.backgroundRequestResourceId;
backgroundRequestDetailResourceId = orig.backgroundRequestDetailResourceId;
nonLocalizedDescription = orig.nonLocalizedDescription;
flags = orig.flags;
priority = orig.priority;
}
/**
* Retrieve the textual description of this permission. This
* will call back on the given PackageManager to load the description from
* the application.
*
* @param pm A PackageManager from which the label can be loaded; usually
* the PackageManager from which you originally retrieved this item.
*
* @return Returns a CharSequence containing the permission's description.
* If there is no description, null is returned.
*/
public @Nullable CharSequence loadDescription(@NonNull PackageManager pm) {
if (nonLocalizedDescription != null) {
return nonLocalizedDescription;
}
if (descriptionRes != 0) {
CharSequence label = pm.getText(packageName, descriptionRes, null);
if (label != null) {
return label;
}
}
return null;
}
public String toString() {
return "PermissionGroupInfo{"
+ Integer.toHexString(System.identityHashCode(this))
+ " " + name + " flgs=0x" + Integer.toHexString(flags) + "}";
}
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel dest, int parcelableFlags) {
super.writeToParcel(dest, parcelableFlags);
dest.writeInt(descriptionRes);
dest.writeInt(requestRes);
dest.writeInt(requestDetailResourceId);
dest.writeInt(backgroundRequestResourceId);
dest.writeInt(backgroundRequestDetailResourceId);
TextUtils.writeToParcel(nonLocalizedDescription, dest, parcelableFlags);
dest.writeInt(flags);
dest.writeInt(priority);
}
public static final @NonNull Creator<PermissionGroupInfo> CREATOR =
new Creator<PermissionGroupInfo>() {
public PermissionGroupInfo createFromParcel(Parcel source) {
return new PermissionGroupInfo(source);
}
public PermissionGroupInfo[] newArray(int size) {
return new PermissionGroupInfo[size];
}
};
private PermissionGroupInfo(Parcel source) {
super(source);
descriptionRes = source.readInt();
requestRes = source.readInt();
requestDetailResourceId = source.readInt();
backgroundRequestResourceId = source.readInt();
backgroundRequestDetailResourceId = source.readInt();
nonLocalizedDescription = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source);
flags = source.readInt();
priority = source.readInt();
}
}