From 9f196efcad1d013507d316795feb4d02d0682d93 Mon Sep 17 00:00:00 2001 From: Edgar Wang Date: Fri, 10 Apr 2020 10:35:21 +0800 Subject: [PATCH] Fix when search "storage", there are multiple results root cause: if device doesn't have external storage, StorageSettings will launch PrivateVolumeSettings and finish itself. But we still index the preferences in StorageSettings. Solution: Check if device doesn't support external storage, add all of StorageSettings preference into nonIndexableKey list. Bug: 152366015 Test: robotest & manual Change-Id: Ib559db3455d46a343ad7eb73e54eb72d0e833308 --- .../settings/deviceinfo/StorageSettings.java | 92 +++++++++++++++++-- 1 file changed, 83 insertions(+), 9 deletions(-) diff --git a/src/com/android/settings/deviceinfo/StorageSettings.java b/src/com/android/settings/deviceinfo/StorageSettings.java index 7f2c645a3b5..de6394e61ea 100644 --- a/src/com/android/settings/deviceinfo/StorageSettings.java +++ b/src/com/android/settings/deviceinfo/StorageSettings.java @@ -70,6 +70,16 @@ import java.util.List; public class StorageSettings extends SettingsPreferenceFragment implements Indexable { static final String TAG = "StorageSettings"; + private static final String KEY_STORAGE_SETTINGS = "storage_settings"; + private static final String KEY_INTERNAL_STORAGE = "storage_settings_internal_storage"; + private static final String KEY_STORAGE_SETTINGS_VOLUME = "storage_settings_volume_"; + private static final String KEY_STORAGE_SETTINGS_MEMORY_SIZE = "storage_settings_memory_size"; + private static final String KEY_STORAGE_SETTINGS_MEMORY = "storage_settings_memory_available"; + private static final String KEY_STORAGE_SETTINGS_DCIM = "storage_settings_dcim_space"; + private static final String KEY_STORAGE_SETTINGS_MUSIC = "storage_settings_music_space"; + private static final String KEY_STORAGE_SETTINGS_MISC = "storage_settings_misc_space"; + private static final String KEY_STORAGE_SETTINGS_FREE_SPACE = "storage_settings_free_space"; + private static final String TAG_VOLUME_UNMOUNTED = "volume_unmounted"; private static final String TAG_DISK_INIT = "disk_init"; private static final int METRICS_CATEGORY = SettingsEnums.DEVICEINFO_STORAGE; @@ -551,14 +561,14 @@ public class StorageSettings extends SettingsPreferenceFragment implements Index SearchIndexableRaw data = new SearchIndexableRaw(context); data.title = context.getString(R.string.storage_settings); - data.key = "storage_settings"; + data.key = KEY_STORAGE_SETTINGS; data.screenTitle = context.getString(R.string.storage_settings); data.keywords = context.getString(R.string.keywords_storage_settings); result.add(data); data = new SearchIndexableRaw(context); data.title = context.getString(R.string.internal_storage); - data.key = "storage_settings_internal_storage"; + data.key = KEY_INTERNAL_STORAGE; data.screenTitle = context.getString(R.string.storage_settings); result.add(data); @@ -568,7 +578,7 @@ public class StorageSettings extends SettingsPreferenceFragment implements Index for (VolumeInfo vol : vols) { if (isInteresting(vol)) { data.title = storage.getBestVolumeDescription(vol); - data.key = "storage_settings_volume_" + vol.id; + data.key = KEY_STORAGE_SETTINGS_VOLUME + vol.id; data.screenTitle = context.getString(R.string.storage_settings); result.add(data); } @@ -576,37 +586,37 @@ public class StorageSettings extends SettingsPreferenceFragment implements Index data = new SearchIndexableRaw(context); data.title = context.getString(R.string.memory_size); - data.key = "storage_settings_memory_size"; + data.key = KEY_STORAGE_SETTINGS_MEMORY_SIZE; data.screenTitle = context.getString(R.string.storage_settings); result.add(data); data = new SearchIndexableRaw(context); data.title = context.getString(R.string.memory_available); - data.key = "storage_settings_memory_available"; + data.key = KEY_STORAGE_SETTINGS_MEMORY; data.screenTitle = context.getString(R.string.storage_settings); result.add(data); data = new SearchIndexableRaw(context); data.title = context.getString(R.string.memory_dcim_usage); - data.key = "storage_settings_dcim_space"; + data.key = KEY_STORAGE_SETTINGS_DCIM; data.screenTitle = context.getString(R.string.storage_settings); result.add(data); data = new SearchIndexableRaw(context); data.title = context.getString(R.string.memory_music_usage); - data.key = "storage_settings_music_space"; + data.key = KEY_STORAGE_SETTINGS_MUSIC; data.screenTitle = context.getString(R.string.storage_settings); result.add(data); data = new SearchIndexableRaw(context); data.title = context.getString(R.string.memory_media_misc_usage); - data.key = "storage_settings_misc_space"; + data.key = KEY_STORAGE_SETTINGS_MISC; data.screenTitle = context.getString(R.string.storage_settings); result.add(data); data = new SearchIndexableRaw(context); data.title = context.getString(R.string.storage_menu_free); - data.key = "storage_settings_free_space"; + data.key = KEY_STORAGE_SETTINGS_FREE_SPACE; data.screenTitle = context.getString(R.string.storage_menu_free); // We need to define all three in order for this to trigger properly. data.intentAction = StorageManager.ACTION_MANAGE_STORAGE; @@ -618,5 +628,69 @@ public class StorageSettings extends SettingsPreferenceFragment implements Index return result; } + + @Override + public List getNonIndexableKeys(Context context) { + final List niks = super.getNonIndexableKeys(context); + if (isExternalExist(context)) { + niks.add(KEY_STORAGE_SETTINGS); + niks.add(KEY_INTERNAL_STORAGE); + niks.add(KEY_STORAGE_SETTINGS_MEMORY_SIZE); + niks.add(KEY_STORAGE_SETTINGS_MEMORY); + niks.add(KEY_STORAGE_SETTINGS_DCIM); + niks.add(KEY_STORAGE_SETTINGS_MUSIC); + niks.add(KEY_STORAGE_SETTINGS_MISC); + niks.add(KEY_STORAGE_SETTINGS_FREE_SPACE); + + final StorageManager storage = context.getSystemService( + StorageManager.class); + final List vols = storage.getVolumes(); + for (VolumeInfo vol : vols) { + if (isInteresting(vol)) { + niks.add(KEY_STORAGE_SETTINGS_VOLUME + vol.id); + } + } + } + return niks; + } + + @Override + protected boolean isPageSearchEnabled(Context context) { + return !isExternalExist(context); + } + + private boolean isExternalExist(Context context) { + int internalCount = 0; + StorageManager storageManager = context.getSystemService(StorageManager.class); + final List volumes = storageManager.getVolumes(); + for (VolumeInfo vol : volumes) { + //External storage + if (vol.getType() == VolumeInfo.TYPE_PUBLIC + || vol.getType() == VolumeInfo.TYPE_STUB) { + return true; + } else if (vol.getType() == VolumeInfo.TYPE_PRIVATE) { + internalCount++; + } + } + + // Unsupported disks + final List disks = storageManager.getDisks(); + for (DiskInfo disk : disks) { + if (disk.volumeCount == 0 && disk.size > 0) { + return true; + } + } + + // Missing private volumes + final List recs = storageManager.getVolumeRecords(); + for (VolumeRecord rec : recs) { + if (rec.getType() == VolumeInfo.TYPE_PRIVATE + && storageManager.findVolumeByUuid(rec.getFsUuid()) == null) { + internalCount++; + } + } + + return (internalCount != 1); + } }; }