Search in sources :

Example 1 with UriPermission

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;
}
Also used : SQLiteDatabase(android.database.sqlite.SQLiteDatabase) ArrayList(java.util.ArrayList) List(java.util.List) UriPermission(android.content.UriPermission) Cursor(android.database.Cursor) File(java.io.File) Uri(android.net.Uri) ContentResolver(android.content.ContentResolver)

Example 2 with UriPermission

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;
}
Also used : Parcel(android.os.Parcel) UriPermission(android.content.UriPermission)

Example 3 with UriPermission

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;
}
Also used : Parcel(android.os.Parcel) UriPermission(android.content.UriPermission)

Example 4 with UriPermission

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;
}
Also used : UriPermission(android.content.UriPermission) ActivityManager(android.app.ActivityManager) Uri(android.net.Uri) ContentProviderClient(android.content.ContentProviderClient)

Example 5 with UriPermission

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;
}
Also used : StorageManager(android.os.storage.StorageManager) SQLiteDiskIOException(android.database.sqlite.SQLiteDiskIOException) IOException(java.io.IOException) Uri(android.net.Uri) Point(android.graphics.Point) UriPermission(android.content.UriPermission) SQLiteDiskIOException(android.database.sqlite.SQLiteDiskIOException)

Aggregations

UriPermission (android.content.UriPermission)23 Uri (android.net.Uri)11 Parcel (android.os.Parcel)10 ActivityManager (android.app.ActivityManager)6 IOException (java.io.IOException)6 ContentProviderClient (android.content.ContentProviderClient)5 SQLiteDiskIOException (android.database.sqlite.SQLiteDiskIOException)5 Point (android.graphics.Point)5 StorageManager (android.os.storage.StorageManager)5 File (java.io.File)2 ContentResolver (android.content.ContentResolver)1 PackageManager (android.content.pm.PackageManager)1 ProviderInfo (android.content.pm.ProviderInfo)1 Cursor (android.database.Cursor)1 SQLiteDatabase (android.database.sqlite.SQLiteDatabase)1 DocumentFile (android.support.v4.provider.DocumentFile)1 Preference (android.support.v7.preference.Preference)1 MutableInt (android.util.MutableInt)1 InputStream (java.io.InputStream)1 ArrayList (java.util.ArrayList)1