【现象】
    在Storage中点击Files选项,会弹出Files,若有多个Files则会弹出选择框(GMS版本)。
    但当连续快速点击Files时,则会出现不显示弹框的假象。
    停止点击后,会出现大量弹窗,消耗的资源也很大,可能导致卡死。
    甚至在连续快速点击的过程中就出现卡死。

    【原因】
    系统弹出选择框需要时间,当弹框出现后,下一次点击事件会被弹框拦截掉,这样是正常的处理流程。
    但当连续点击的间隔小于此时间时,系统在持续接受点击事件并响应,导致大量弹窗正在弹出的路上,同时部分弹窗还没完全显现就被dismiss,看起来就是没出现过弹窗。

    【解决方案】
    增加点击事件防抖,即增加连点时间间隔判断,不响应短间隔的连续点击。
    修改如下:

    1. +++ b/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/deviceinfo/storage/StorageItemPreferenceController.java
    2. @@ -101,6 +101,11 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle
    3. private static final String AUTHORITY_MEDIA = "com.android.providers.media.documents";
    4. + /// START. 不响应短时连续点击。By XShawn@20211227.
    5. + private Preference lastPrefs = null;
    6. + private long lastPrefsClickTime = 0;
    7. + /// END. 不响应短时连续点击。By XShawn@20211227.
    8. +
    9. public StorageItemPreferenceController(
    10. Context context, Fragment hostFragment, VolumeInfo volume, StorageVolumeProvider svp) {
    11. super(context);
    12. @@ -136,6 +141,18 @@ public class StorageItemPreferenceController extends AbstractPreferenceControlle
    13. if (preference.getKey() == null) {
    14. return false;
    15. }
    16. +
    17. + /// START. 不响应短时连续点击。By XShawn@20211227.
    18. + long currTime = System.currentTimeMillis();
    19. + if (lastPrefs == preference && currTime - lastPrefsClickTime <= 1000) {
    20. + lastPrefs = preference;
    21. + lastPrefsClickTime = currTime;
    22. + return false;
    23. + }
    24. + lastPrefs = preference;
    25. + lastPrefsClickTime = currTime;
    26. + /// END. 不响应短时连续点击。By XShawn@20211227.
    27. +
    28. switch (preference.getKey()) {
    29. case PHOTO_KEY:
    30. intent = getPhotosIntent();