1ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov/*
2ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov * Copyright (C) 2016 The Android Open Source Project
3ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov *
4ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov * Licensed under the Apache License, Version 2.0 (the "License");
5ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov * you may not use this file except in compliance with the License.
6ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov * You may obtain a copy of the License at
7ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov *
8ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov *      http://www.apache.org/licenses/LICENSE-2.0
9ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov *
10ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov * Unless required by applicable law or agreed to in writing, software
11ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov * distributed under the License is distributed on an "AS IS" BASIS,
12ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov * See the License for the specific language governing permissions and
14ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov * limitations under the License.
15ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov */
16ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov
17ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganovpackage android.content.pm.permission;
18ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov
19ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganovimport android.annotation.NonNull;
20ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganovimport android.annotation.SystemApi;
21ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganovimport android.os.Parcel;
22ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganovimport android.os.Parcelable;
23ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov
24ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov/**
25ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov * This class contains information about how a runtime permission
26ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov * is to be presented in the UI. A single runtime permission
27ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov * presented to the user may correspond to multiple platform defined
28ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov * permissions, e.g. the location permission may control both the
29ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov * coarse and fine platform permissions.
30ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov *
31ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov * @hide
32ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov */
33ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov@SystemApi
34ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganovpublic final class RuntimePermissionPresentationInfo implements Parcelable {
35ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov    private static final int FLAG_GRANTED = 1 << 0;
36ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov    private static final int FLAG_STANDARD = 1 << 1;
37ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov
38ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov    private final CharSequence mLabel;
39ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov    private final int mFlags;
40ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov
41ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov    /**
42ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov     * Creates a new instance.
43ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov     *
44ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov     * @param label The permission label.
45ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov     * @param granted Whether the permission is granted.
46ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov     * @param standard Whether this is a platform-defined permission.
47ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov     */
48ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov    public RuntimePermissionPresentationInfo(CharSequence label,
49ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov            boolean granted, boolean standard) {
50ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov        mLabel = label;
51ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov        int flags = 0;
52ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov        if (granted) {
53ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov            flags |= FLAG_GRANTED;
54ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov        }
55ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov        if (standard) {
56ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov            flags |= FLAG_STANDARD;
57ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov        }
58ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov        mFlags = flags;
59ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov    }
60ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov
61ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov    private RuntimePermissionPresentationInfo(Parcel parcel) {
62ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov        mLabel = parcel.readCharSequence();
63ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov        mFlags = parcel.readInt();
64ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov    }
65ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov
66ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov    /**
67ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov     * @return Whether the permission is granted.
68ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov     */
69ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov    public boolean isGranted() {
70ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov        return (mFlags & FLAG_GRANTED) != 0;
71ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov    }
72ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov
73ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov    /**
74ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov     * @return Whether the permission is platform-defined.
75ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov     */
76ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov    public boolean isStandard() {
77ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov        return (mFlags & FLAG_STANDARD) != 0;
78ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov    }
79ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov
80ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov    /**
81ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov     * Gets the permission label.
82ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov     *
83ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov     * @return The label.
84ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov     */
85ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov    public @NonNull CharSequence getLabel() {
86ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov        return mLabel;
87ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov    }
88ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov
89ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov    @Override
90ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov    public int describeContents() {
91ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov        return 0;
92ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov    }
93ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov
94ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov    @Override
95ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov    public void writeToParcel(Parcel parcel, int flags) {
96ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov        parcel.writeCharSequence(mLabel);
97ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov        parcel.writeInt(mFlags);
98ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov    }
99ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov
100ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov    public static final Creator<RuntimePermissionPresentationInfo> CREATOR =
101ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov            new Creator<RuntimePermissionPresentationInfo>() {
102ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov        public RuntimePermissionPresentationInfo createFromParcel(Parcel source) {
103ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov            return new RuntimePermissionPresentationInfo(source);
104ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov        }
105ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov
106ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov        public RuntimePermissionPresentationInfo[] newArray(int size) {
107ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov            return new RuntimePermissionPresentationInfo[size];
108ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov        }
109ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov    };
110ae0e03a9e03de34e37b768b971d7596d7220a053Svet Ganov}
111