1e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey/*
2e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey * Copyright (C) 2013 The Android Open Source Project
3e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey *
4e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License");
5e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey * you may not use this file except in compliance with the License.
6e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey * You may obtain a copy of the License at
7e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey *
8e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey *      http://www.apache.org/licenses/LICENSE-2.0
9e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey *
10e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey * Unless required by applicable law or agreed to in writing, software
11e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS,
12e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey * See the License for the specific language governing permissions and
14e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey * limitations under the License.
15e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey */
16e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey
17e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkeypackage android.content;
18e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey
19e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkeyimport android.net.Uri;
20e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkeyimport android.os.Parcel;
21e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkeyimport android.os.Parcelable;
22e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey
23e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey/**
24e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey * Description of a single Uri permission grant. This grants may have been
25e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey * created via {@link Intent#FLAG_GRANT_READ_URI_PERMISSION}, etc when sending
26e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey * an {@link Intent}, or explicitly through
27e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey * {@link Context#grantUriPermission(String, android.net.Uri, int)}.
28e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey *
29e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey * @see ContentResolver#getPersistedUriPermissions()
30e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey */
31e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkeypublic final class UriPermission implements Parcelable {
32e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    private final Uri mUri;
33e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    private final int mModeFlags;
34e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    private final long mPersistedTime;
35e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey
36e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    /**
37e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey     * Value returned when a permission has not been persisted.
38e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey     */
39e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    public static final long INVALID_TIME = Long.MIN_VALUE;
40e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey
41e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    /** {@hide} */
42e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    public UriPermission(Uri uri, int modeFlags, long persistedTime) {
43e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey        mUri = uri;
44e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey        mModeFlags = modeFlags;
45e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey        mPersistedTime = persistedTime;
46e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    }
47e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey
48e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    /** {@hide} */
49e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    public UriPermission(Parcel in) {
50e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey        mUri = in.readParcelable(null);
51e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey        mModeFlags = in.readInt();
52e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey        mPersistedTime = in.readLong();
53e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    }
54e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey
55e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    /**
56e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey     * Return the Uri this permission pertains to.
57e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey     */
58e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    public Uri getUri() {
59e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey        return mUri;
60e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    }
61e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey
62e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    /**
63e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey     * Returns if this permission offers read access.
64e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey     */
65e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    public boolean isReadPermission() {
66e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey        return (mModeFlags & Intent.FLAG_GRANT_READ_URI_PERMISSION) != 0;
67e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    }
68e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey
69e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    /**
70e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey     * Returns if this permission offers write access.
71e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey     */
72e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    public boolean isWritePermission() {
73e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey        return (mModeFlags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION) != 0;
74e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    }
75e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey
76e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    /**
77e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey     * Return the time when this permission was first persisted, in milliseconds
78e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey     * since January 1, 1970 00:00:00.0 UTC. Returns {@link #INVALID_TIME} if
79e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey     * not persisted.
80e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey     *
81e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey     * @see ContentResolver#takePersistableUriPermission(Uri, int)
82e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey     * @see System#currentTimeMillis()
83e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey     */
84e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    public long getPersistedTime() {
85e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey        return mPersistedTime;
86e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    }
87e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey
88e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    @Override
89e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    public String toString() {
90e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey        return "UriPermission {uri=" + mUri + ", modeFlags=" + mModeFlags + ", persistedTime="
91e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey                + mPersistedTime + "}";
92e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    }
93e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey
94e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    @Override
95e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    public int describeContents() {
96e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey        return 0;
97e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    }
98e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey
99e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    @Override
100e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    public void writeToParcel(Parcel dest, int flags) {
101e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey        dest.writeParcelable(mUri, flags);
102e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey        dest.writeInt(mModeFlags);
103e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey        dest.writeLong(mPersistedTime);
104e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    }
105e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey
106e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    public static final Creator<UriPermission> CREATOR = new Creator<UriPermission>() {
107e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey        @Override
108e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey        public UriPermission createFromParcel(Parcel source) {
109e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey            return new UriPermission(source);
110e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey        }
111e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey
112e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey        @Override
113e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey        public UriPermission[] newArray(int size) {
114e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey            return new UriPermission[size];
115e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey        }
116e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey    };
117e66c1778f80f4b18e29e018eca3a338f125f23b9Jeff Sharkey}
118