use of android.content.UriPermission in project muzei by romannurik.
the class GalleryProvider method deleteChosenPhotos.
private int deleteChosenPhotos(@NonNull final Uri uri, final String selection, final String[] selectionArgs) {
// Opens the database object in "write" mode.
final SQLiteDatabase db = databaseHelper.getWritableDatabase();
// We can't just simply delete the rows as that won't free up the space occupied by the
// chosen image files for each row being deleted. Instead we have to query
// and manually delete each chosen image file
String[] projection = new String[] { GalleryContract.ChosenPhotos.COLUMN_NAME_URI };
Cursor rowsToDelete = queryChosenPhotos(uri, projection, selection, selectionArgs, null);
if (rowsToDelete == null) {
return 0;
}
rowsToDelete.moveToFirst();
while (!rowsToDelete.isAfterLast()) {
String imageUri = rowsToDelete.getString(0);
File file = getCacheFileForUri(getContext(), imageUri);
if (file != null && file.exists()) {
if (!file.delete()) {
Log.w(TAG, "Unable to delete " + file);
}
} else if (getContext() != null) {
// Try to release any persisted URI permission for the imageUri
Uri uriToRelease = Uri.parse(imageUri);
ContentResolver contentResolver = getContext().getContentResolver();
List<UriPermission> persistedUriPermissions = contentResolver.getPersistedUriPermissions();
for (UriPermission persistedUriPermission : persistedUriPermissions) {
if (persistedUriPermission.getUri().equals(uriToRelease)) {
contentResolver.releasePersistableUriPermission(uriToRelease, Intent.FLAG_GRANT_READ_URI_PERMISSION);
break;
}
}
}
rowsToDelete.moveToNext();
}
String finalSelection = selection;
if (GalleryProvider.uriMatcher.match(uri) == CHOSEN_PHOTOS_ID) {
// If the incoming URI is for a single chosen photo identified by its ID, appends "_ID = <chosenPhotoId>"
finalSelection = DatabaseUtils.concatenateWhere(selection, BaseColumns._ID + "=" + uri.getLastPathSegment());
}
int count = db.delete(GalleryContract.ChosenPhotos.TABLE_NAME, finalSelection, selectionArgs);
if (count > 0) {
notifyChange(uri);
}
return count;
}
use of android.content.UriPermission in project platform_frameworks_base by android.
the class ActivityManagerProxy method getGrantedUriPermissions.
@Override
public ParceledListSlice<UriPermission> getGrantedUriPermissions(String packageName, int userId) throws RemoteException {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IActivityManager.descriptor);
data.writeString(packageName);
data.writeInt(userId);
mRemote.transact(GET_GRANTED_URI_PERMISSIONS_TRANSACTION, data, reply, 0);
reply.readException();
@SuppressWarnings("unchecked") final ParceledListSlice<UriPermission> perms = ParceledListSlice.CREATOR.createFromParcel(reply);
data.recycle();
reply.recycle();
return perms;
}
use of android.content.UriPermission in project platform_frameworks_base by android.
the class ActivityManagerProxy method getPersistedUriPermissions.
@Override
public ParceledListSlice<UriPermission> getPersistedUriPermissions(String packageName, boolean incoming) throws RemoteException {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IActivityManager.descriptor);
data.writeString(packageName);
data.writeInt(incoming ? 1 : 0);
mRemote.transact(GET_PERSISTED_URI_PERMISSIONS_TRANSACTION, data, reply, 0);
reply.readException();
@SuppressWarnings("unchecked") final ParceledListSlice<UriPermission> perms = ParceledListSlice.CREATOR.createFromParcel(reply);
data.recycle();
reply.recycle();
return perms;
}
use of android.content.UriPermission in project android_frameworks_base by AOSPA.
the class OpenExternalDirectoryActivity method getIntentForExistingPermission.
private static Intent getIntentForExistingPermission(OpenExternalDirectoryActivity activity, boolean isRoot, File root, File file) {
final String packageName = activity.getCallingPackage();
final ContentProviderClient storageClient = activity.getExternalStorageClient();
final Uri grantedUri = getGrantedUriPermission(activity, storageClient, file);
final Uri rootUri = root.equals(file) ? grantedUri : getGrantedUriPermission(activity, storageClient, root);
if (DEBUG)
Log.d(TAG, "checking if " + packageName + " already has permission for " + grantedUri + " or its root (" + rootUri + ")");
final ActivityManager am = (ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE);
for (UriPermission uriPermission : am.getGrantedUriPermissions(packageName).getList()) {
final Uri uri = uriPermission.getUri();
if (uri == null) {
Log.w(TAG, "null URI for " + uriPermission);
continue;
}
if (uri.equals(grantedUri) || uri.equals(rootUri)) {
if (DEBUG)
Log.d(TAG, packageName + " already has permission: " + uriPermission);
return createGrantedUriPermissionsIntent(grantedUri);
}
}
if (DEBUG)
Log.d(TAG, packageName + " does not have permission for " + grantedUri);
return null;
}
use of android.content.UriPermission in project android_frameworks_base by AOSPA.
the class MtpDocumentsProvider method onCreate.
@Override
public boolean onCreate() {
sSingleton = this;
mContext = getContext();
mResources = getContext().getResources();
mMtpManager = new MtpManager(getContext());
mResolver = getContext().getContentResolver();
mDeviceToolkits = new HashMap<Integer, DeviceToolkit>();
mDatabase = new MtpDatabase(getContext(), MtpDatabaseConstants.FLAG_DATABASE_IN_FILE);
mRootScanner = new RootScanner(mResolver, mMtpManager, mDatabase);
mAppFuse = new AppFuse(TAG, new AppFuseCallback());
mIntentSender = new ServiceIntentSender(getContext());
// after booting.
try {
final int bootCount = Settings.Global.getInt(mResolver, Settings.Global.BOOT_COUNT, -1);
final int lastBootCount = mDatabase.getLastBootCount();
if (bootCount != -1 && bootCount != lastBootCount) {
mDatabase.setLastBootCount(bootCount);
final List<UriPermission> permissions = mResolver.getOutgoingPersistedUriPermissions();
final Uri[] uris = new Uri[permissions.size()];
for (int i = 0; i < permissions.size(); i++) {
uris[i] = permissions.get(i).getUri();
}
mDatabase.cleanDatabase(uris);
}
} catch (SQLiteDiskIOException error) {
// It can happen due to disk shortage.
Log.e(TAG, "Failed to clean database.", error);
return false;
}
// TODO: Mount AppFuse on demands.
try {
mAppFuse.mount(getContext().getSystemService(StorageManager.class));
} catch (IOException error) {
Log.e(TAG, "Failed to start app fuse.", error);
return false;
}
resume();
return true;
}
Aggregations