Search in sources :

Example 16 with StorageVolume

use of android.os.storage.StorageVolume in project android_frameworks_base by AOSPA.

the class MountService method getVolumeList.

@Override
public StorageVolume[] getVolumeList(int uid, String packageName, int flags) {
    final int userId = UserHandle.getUserId(uid);
    final boolean forWrite = (flags & StorageManager.FLAG_FOR_WRITE) != 0;
    final boolean realState = (flags & StorageManager.FLAG_REAL_STATE) != 0;
    final boolean includeInvisible = (flags & StorageManager.FLAG_INCLUDE_INVISIBLE) != 0;
    final boolean userKeyUnlocked;
    final boolean storagePermission;
    final long token = Binder.clearCallingIdentity();
    try {
        userKeyUnlocked = isUserKeyUnlocked(userId);
        storagePermission = mMountServiceInternal.hasExternalStorage(uid, packageName);
    } finally {
        Binder.restoreCallingIdentity(token);
    }
    boolean foundPrimary = false;
    final ArrayList<StorageVolume> res = new ArrayList<>();
    synchronized (mLock) {
        for (int i = 0; i < mVolumes.size(); i++) {
            final VolumeInfo vol = mVolumes.valueAt(i);
            switch(vol.getType()) {
                case VolumeInfo.TYPE_PUBLIC:
                case VolumeInfo.TYPE_EMULATED:
                    break;
                default:
                    continue;
            }
            boolean match = false;
            if (forWrite) {
                match = vol.isVisibleForWrite(userId);
            } else {
                match = vol.isVisibleForRead(userId) || (includeInvisible && vol.getPath() != null);
            }
            if (!match)
                continue;
            boolean reportUnmounted = false;
            if ((vol.getType() == VolumeInfo.TYPE_EMULATED) && !userKeyUnlocked) {
                reportUnmounted = true;
            } else if (!storagePermission && !realState) {
                reportUnmounted = true;
            }
            final StorageVolume userVol = vol.buildStorageVolume(mContext, userId, reportUnmounted);
            if (vol.isPrimary()) {
                res.add(0, userVol);
                foundPrimary = true;
            } else {
                res.add(userVol);
            }
        }
    }
    if (!foundPrimary) {
        Log.w(TAG, "No primary storage defined yet; hacking together a stub");
        final boolean primaryPhysical = SystemProperties.getBoolean(StorageManager.PROP_PRIMARY_PHYSICAL, false);
        final String id = "stub_primary";
        final File path = Environment.getLegacyExternalStorageDirectory();
        final String description = mContext.getString(android.R.string.unknownName);
        final boolean primary = true;
        final boolean removable = primaryPhysical;
        final boolean emulated = !primaryPhysical;
        final long mtpReserveSize = 0L;
        final boolean allowMassStorage = false;
        final long maxFileSize = 0L;
        final UserHandle owner = new UserHandle(userId);
        final String uuid = null;
        final String state = Environment.MEDIA_REMOVED;
        res.add(0, new StorageVolume(id, StorageVolume.STORAGE_ID_INVALID, path, description, primary, removable, emulated, mtpReserveSize, allowMassStorage, maxFileSize, owner, uuid, state));
    }
    return res.toArray(new StorageVolume[res.size()]);
}
Also used : StorageVolume(android.os.storage.StorageVolume) UserHandle(android.os.UserHandle) CopyOnWriteArrayList(java.util.concurrent.CopyOnWriteArrayList) ArrayList(java.util.ArrayList) VolumeInfo(android.os.storage.VolumeInfo) File(java.io.File) AtomicFile(android.util.AtomicFile)

Example 17 with StorageVolume

use of android.os.storage.StorageVolume in project android_frameworks_base by AOSPA.

the class MountService method onUnlockUser.

private void onUnlockUser(int userId) {
    Slog.d(TAG, "onUnlockUser " + userId);
    // bind mount against.
    try {
        mConnector.execute("volume", "user_started", userId);
    } catch (NativeDaemonConnectorException ignored) {
    }
    // correctly, then synthesize events for any already-mounted volumes.
    synchronized (mVolumes) {
        for (int i = 0; i < mVolumes.size(); i++) {
            final VolumeInfo vol = mVolumes.valueAt(i);
            if (vol.isVisibleForRead(userId) && vol.isMountedReadable()) {
                final StorageVolume userVol = vol.buildStorageVolume(mContext, userId, false);
                mHandler.obtainMessage(H_VOLUME_BROADCAST, userVol).sendToTarget();
                final String envState = VolumeInfo.getEnvironmentForState(vol.getState());
                mCallbacks.notifyStorageStateChanged(userVol.getPath(), envState, envState);
            }
        }
        mSystemUnlockedUsers = ArrayUtils.appendInt(mSystemUnlockedUsers, userId);
    }
}
Also used : StorageVolume(android.os.storage.StorageVolume) VolumeInfo(android.os.storage.VolumeInfo)

Example 18 with StorageVolume

use of android.os.storage.StorageVolume in project android_frameworks_base by AOSPA.

the class SharedStorageAgent method onFullBackup.

/**
     * Full backup of the shared-storage filesystem
     */
@Override
public void onFullBackup(FullBackupDataOutput output) throws IOException {
    // "primary" shared storage volume is first in the list.
    if (mVolumes != null) {
        if (DEBUG)
            Slog.i(TAG, "Backing up " + mVolumes.length + " shared volumes");
        // Ignore all apps' getExternalFilesDir() content; it is backed up as part of
        // each app-specific payload.
        ArraySet<String> externalFilesDirFilter = new ArraySet();
        final File externalAndroidRoot = new File(Environment.getExternalStorageDirectory(), Environment.DIRECTORY_ANDROID);
        externalFilesDirFilter.add(externalAndroidRoot.getCanonicalPath());
        for (int i = 0; i < mVolumes.length; i++) {
            StorageVolume v = mVolumes[i];
            // Express the contents of volume N this way in the tar stream:
            //     shared/N/path/to/file
            // The restore will then extract to the given volume
            String domain = FullBackup.SHARED_PREFIX + i;
            fullBackupFileTree(null, domain, v.getPath(), null, /* manifestExcludes */
            externalFilesDirFilter, /* systemExcludes */
            output);
        }
    }
}
Also used : StorageVolume(android.os.storage.StorageVolume) ArraySet(android.util.ArraySet) File(java.io.File)

Example 19 with StorageVolume

use of android.os.storage.StorageVolume in project android_frameworks_base by ResurrectionRemix.

the class SharedStorageAgent method onFullBackup.

/**
     * Full backup of the shared-storage filesystem
     */
@Override
public void onFullBackup(FullBackupDataOutput output) throws IOException {
    // "primary" shared storage volume is first in the list.
    if (mVolumes != null) {
        if (DEBUG)
            Slog.i(TAG, "Backing up " + mVolumes.length + " shared volumes");
        // Ignore all apps' getExternalFilesDir() content; it is backed up as part of
        // each app-specific payload.
        ArraySet<String> externalFilesDirFilter = new ArraySet();
        final File externalAndroidRoot = new File(Environment.getExternalStorageDirectory(), Environment.DIRECTORY_ANDROID);
        externalFilesDirFilter.add(externalAndroidRoot.getCanonicalPath());
        for (int i = 0; i < mVolumes.length; i++) {
            StorageVolume v = mVolumes[i];
            // Express the contents of volume N this way in the tar stream:
            //     shared/N/path/to/file
            // The restore will then extract to the given volume
            String domain = FullBackup.SHARED_PREFIX + i;
            fullBackupFileTree(null, domain, v.getPath(), null, /* manifestExcludes */
            externalFilesDirFilter, /* systemExcludes */
            output);
        }
    }
}
Also used : StorageVolume(android.os.storage.StorageVolume) ArraySet(android.util.ArraySet) File(java.io.File)

Example 20 with StorageVolume

use of android.os.storage.StorageVolume in project android_frameworks_base by ResurrectionRemix.

the class OpenExternalDirectoryActivity method onCreate.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState != null) {
        if (DEBUG)
            Log.d(TAG, "activity.onCreateDialog(): reusing instance");
        return;
    }
    final Intent intent = getIntent();
    if (intent == null) {
        if (DEBUG)
            Log.d(TAG, "missing intent");
        logInvalidScopedAccessRequest(this, SCOPED_DIRECTORY_ACCESS_INVALID_ARGUMENTS);
        setResult(RESULT_CANCELED);
        finish();
        return;
    }
    final Parcelable storageVolume = intent.getParcelableExtra(EXTRA_STORAGE_VOLUME);
    if (!(storageVolume instanceof StorageVolume)) {
        if (DEBUG)
            Log.d(TAG, "extra " + EXTRA_STORAGE_VOLUME + " is not a StorageVolume: " + storageVolume);
        logInvalidScopedAccessRequest(this, SCOPED_DIRECTORY_ACCESS_INVALID_ARGUMENTS);
        setResult(RESULT_CANCELED);
        finish();
        return;
    }
    String directoryName = intent.getStringExtra(EXTRA_DIRECTORY_NAME);
    if (directoryName == null) {
        directoryName = DIRECTORY_ROOT;
    }
    final StorageVolume volume = (StorageVolume) storageVolume;
    if (getScopedAccessPermissionStatus(getApplicationContext(), getCallingPackage(), volume.getUuid(), directoryName) == PERMISSION_NEVER_ASK) {
        logValidScopedAccessRequest(this, directoryName, SCOPED_DIRECTORY_ACCESS_ALREADY_DENIED);
        setResult(RESULT_CANCELED);
        finish();
        return;
    }
    final int userId = UserHandle.myUserId();
    if (!showFragment(this, userId, volume, directoryName)) {
        setResult(RESULT_CANCELED);
        finish();
        return;
    }
}
Also used : StorageVolume(android.os.storage.StorageVolume) Intent(android.content.Intent) Parcelable(android.os.Parcelable) SuppressLint(android.annotation.SuppressLint)

Aggregations

StorageVolume (android.os.storage.StorageVolume)53 StorageManager (android.os.storage.StorageManager)13 File (java.io.File)13 Intent (android.content.Intent)11 VolumeInfo (android.os.storage.VolumeInfo)10 UserHandle (android.os.UserHandle)6 ArrayList (java.util.ArrayList)6 SuppressLint (android.annotation.SuppressLint)5 Parcelable (android.os.Parcelable)5 VolumeRecord (android.os.storage.VolumeRecord)5 ArraySet (android.util.ArraySet)5 AtomicFile (android.util.AtomicFile)5 CopyOnWriteArrayList (java.util.concurrent.CopyOnWriteArrayList)5 IOException (java.io.IOException)4 XmlPullParserException (org.xmlpull.v1.XmlPullParserException)3 HandlerThread (android.os.HandlerThread)2 RemoteException (android.os.RemoteException)2 IMountService (android.os.storage.IMountService)2 NoSuchAlgorithmException (java.security.NoSuchAlgorithmException)2 InvalidKeySpecException (java.security.spec.InvalidKeySpecException)2