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