Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9f196efc authored by Edgar Wang's avatar Edgar Wang
Browse files

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
parent c3d052a4
Loading
Loading
Loading
Loading
+83 −9
Original line number Diff line number Diff line
@@ -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<String> getNonIndexableKeys(Context context) {
                    final List<String> 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<VolumeInfo> 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<VolumeInfo> 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<DiskInfo> disks = storageManager.getDisks();
                    for (DiskInfo disk : disks) {
                        if (disk.volumeCount == 0 && disk.size > 0) {
                            return true;
                        }
                    }

                    // Missing private volumes
                    final List<VolumeRecord> recs = storageManager.getVolumeRecords();
                    for (VolumeRecord rec : recs) {
                        if (rec.getType() == VolumeInfo.TYPE_PRIVATE
                                && storageManager.findVolumeByUuid(rec.getFsUuid()) == null) {
                            internalCount++;
                        }
                    }

                    return (internalCount != 1);
                }
            };
}