Show USB flash drive in storage spinner when it's unmounted

Before this change, USB flash drive is removed from storage spinner
when it's unmounted (by option menu 'Eject'), however, USB flash
drive will show in storage spinner when Storage Settings page is
resumed again.

After this change, USB flash drive will show in storage spinner
even if it's unmounted. It will be removed until it's unplugged
from device.

Bug: 225095144
Test: manual visual
      Insert / Eject / Mount / unplug an USB flash drive and
      observe UI behavior.
Change-Id: I6b81766216c7850b018997f2de12a19d9d8675be
This commit is contained in:
Arc Wang
2022-05-10 12:35:17 +08:00
parent 22cda47705
commit f81a4817f2
3 changed files with 44 additions and 30 deletions

View File

@@ -84,10 +84,19 @@ public class ProfileSelectStorageFragment extends ProfileSelectFragment {
}
final StorageEntry changedStorageEntry = new StorageEntry(getContext(), volumeInfo);
switch (volumeInfo.getState()) {
final int volumeState = volumeInfo.getState();
switch (volumeState) {
case VolumeInfo.STATE_REMOVED:
case VolumeInfo.STATE_BAD_REMOVAL:
// Remove removed storage from list and don't show it on spinner.
if (!mStorageEntries.remove(changedStorageEntry)) {
break;
}
case VolumeInfo.STATE_MOUNTED:
case VolumeInfo.STATE_MOUNTED_READ_ONLY:
case VolumeInfo.STATE_UNMOUNTABLE:
case VolumeInfo.STATE_UNMOUNTED:
case VolumeInfo.STATE_EJECTING:
// Add mounted or unmountable storage in the list and show it on spinner.
// Unmountable storages are the storages which has a problem format and android
// is not able to mount it automatically.
@@ -95,25 +104,15 @@ public class ProfileSelectStorageFragment extends ProfileSelectFragment {
mStorageEntries.removeIf(storageEntry -> {
return storageEntry.equals(changedStorageEntry);
});
mStorageEntries.add(changedStorageEntry);
if (volumeState != VolumeInfo.STATE_REMOVED
&& volumeState != VolumeInfo.STATE_BAD_REMOVAL) {
mStorageEntries.add(changedStorageEntry);
}
if (changedStorageEntry.equals(mSelectedStorageEntry)) {
mSelectedStorageEntry = changedStorageEntry;
}
refreshUi();
break;
case VolumeInfo.STATE_REMOVED:
case VolumeInfo.STATE_UNMOUNTED:
case VolumeInfo.STATE_BAD_REMOVAL:
case VolumeInfo.STATE_EJECTING:
// Remove removed storage from list and don't show it on spinner.
if (mStorageEntries.remove(changedStorageEntry)) {
if (changedStorageEntry.equals(mSelectedStorageEntry)) {
mSelectedStorageEntry =
StorageEntry.getDefaultInternalStorageEntry(getContext());
}
refreshUi();
}
break;
default:
// Do nothing.
}

View File

@@ -115,10 +115,19 @@ public class StorageDashboardFragment extends DashboardFragment
}
final StorageEntry changedStorageEntry = new StorageEntry(getContext(), volumeInfo);
switch (volumeInfo.getState()) {
final int volumeState = volumeInfo.getState();
switch (volumeState) {
case VolumeInfo.STATE_REMOVED:
case VolumeInfo.STATE_BAD_REMOVAL:
// Remove removed storage from list and don't show it on spinner.
if (!mStorageEntries.remove(changedStorageEntry)) {
break;
}
case VolumeInfo.STATE_MOUNTED:
case VolumeInfo.STATE_MOUNTED_READ_ONLY:
case VolumeInfo.STATE_UNMOUNTABLE:
case VolumeInfo.STATE_UNMOUNTED:
case VolumeInfo.STATE_EJECTING:
// Add mounted or unmountable storage in the list and show it on spinner.
// Unmountable storages are the storages which has a problem format and android
// is not able to mount it automatically.
@@ -126,25 +135,15 @@ public class StorageDashboardFragment extends DashboardFragment
mStorageEntries.removeIf(storageEntry -> {
return storageEntry.equals(changedStorageEntry);
});
mStorageEntries.add(changedStorageEntry);
if (volumeState != VolumeInfo.STATE_REMOVED
&& volumeState != VolumeInfo.STATE_BAD_REMOVAL) {
mStorageEntries.add(changedStorageEntry);
}
if (changedStorageEntry.equals(mSelectedStorageEntry)) {
mSelectedStorageEntry = changedStorageEntry;
}
refreshUi();
break;
case VolumeInfo.STATE_REMOVED:
case VolumeInfo.STATE_UNMOUNTED:
case VolumeInfo.STATE_BAD_REMOVAL:
case VolumeInfo.STATE_EJECTING:
// Remove removed storage from list and don't show it on spinner.
if (mStorageEntries.remove(changedStorageEntry)) {
if (changedStorageEntry.equals(mSelectedStorageEntry)) {
mSelectedStorageEntry =
StorageEntry.getDefaultInternalStorageEntry(getContext());
}
refreshUi();
}
break;
default:
// Do nothing.
}

View File

@@ -26,6 +26,7 @@ import android.os.UserManager;
import android.os.storage.DiskInfo;
import android.os.storage.StorageManager;
import android.os.storage.VolumeInfo;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
@@ -53,6 +54,8 @@ import java.util.Objects;
public class VolumeOptionMenuController implements LifecycleObserver, OnCreateOptionsMenu,
OnPrepareOptionsMenu, OnOptionsItemSelected {
private static final String TAG = "VolumeOptionMenuController";
@VisibleForTesting
MenuItem mRename;
@VisibleForTesting
@@ -103,6 +106,17 @@ public class VolumeOptionMenuController implements LifecycleObserver, OnCreateOp
mFree = menu.findItem(R.id.storage_free);
mForget = menu.findItem(R.id.storage_forget);
updateOptionsMenu();
}
private void updateOptionsMenu() {
if (mRename == null || mMount == null || mUnmount == null || mFormat == null
|| mFormatAsPortable == null || mFormatAsInternal == null || mMigrate == null
|| mFree == null || mForget == null) {
Log.d(TAG, "Menu items are not available");
return;
}
mRename.setVisible(false);
mMount.setVisible(false);
mUnmount.setVisible(false);
@@ -253,5 +267,7 @@ public class VolumeOptionMenuController implements LifecycleObserver, OnCreateOp
public void setSelectedStorageEntry(StorageEntry storageEntry) {
mStorageEntry = storageEntry;
updateOptionsMenu();
}
}