Cache mechanism for Storage page

- Use SharedPreference to cache the size info
- Improve the flicker problem on Documents & other preference
- The jobs are destroied on onPause to prevent the jobs being
  restarting when back to Storage page
- Enable progress bar animation for each storage item

Bug: 191117970
Test: manual test
1) The loading spinner will be shown when entering Storage page
   at first time.
2) Back to Settings homepage and switch back to Storage page, the
   loading spinner shouldn't be shown.
3) Click each preference in the Storage page and switch between these
   pages, the size info should be updated if something removed and the
   order of preference shouldn't be changed.

Change-Id: I75533742a025dc61116207285a894ee728d0af68
This commit is contained in:
Mill Chen
2022-02-08 15:37:53 +08:00
parent 05e713bcc5
commit 77775a66f2
7 changed files with 351 additions and 46 deletions

View File

@@ -0,0 +1,97 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settings.deviceinfo.storage;
import static com.google.common.truth.Truth.assertThat;
import android.content.Context;
import android.os.UserHandle;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(AndroidJUnit4.class)
public class StorageCacheHelperTest {
private static final long FAKE_IMAGES_SIZE = 7000L;
private static final long FAKE_VIDEOS_SIZE = 8900L;
private static final long FAKE_AUDIO_SIZE = 3500L;
private static final long FAKE_APPS_SIZE = 4000L;
private static final long FAKE_GAMES_SIZE = 5000L;
private static final long FAKE_DOCS_SIZE = 1500L;
private static final long FAKE_TRASH_SIZE = 500L;
private static final long FAKE_SYSTEM_SIZE = 2300L;
private static final long FAKE_TOTAL_SIZE = 256000L;
private static final long FAKE_USED_SIZE = 50000L;
private Context mContext;
private StorageCacheHelper mHelper;
@Before
public void setUp() {
mContext = ApplicationProvider.getApplicationContext();
mHelper = new StorageCacheHelper(mContext, UserHandle.myUserId());
}
@Test
public void hasCachedSizeInfo_noCacheData_shouldReturnFalse() {
assertThat(mHelper.hasCachedSizeInfo()).isFalse();
}
@Test
public void hasCachedSizeInfo_hasCacheData_shouldReturnTrue() {
mHelper.cacheSizeInfo(getFakeStorageCache());
assertThat(mHelper.hasCachedSizeInfo()).isTrue();
}
@Test
public void cacheSizeInfo_shouldSaveToSharedPreference() {
mHelper.cacheSizeInfo(getFakeStorageCache());
StorageCacheHelper.StorageCache storageCache = mHelper.retrieveCachedSize();
assertThat(storageCache.imagesSize).isEqualTo(FAKE_IMAGES_SIZE);
assertThat(storageCache.totalSize).isEqualTo(0);
}
@Test
public void cacheTotalSizeAndUsedSize_shouldSaveToSharedPreference() {
mHelper.cacheTotalSizeAndUsedSize(FAKE_TOTAL_SIZE, FAKE_USED_SIZE);
StorageCacheHelper.StorageCache storageCache = mHelper.retrieveCachedSize();
assertThat(storageCache.totalSize).isEqualTo(FAKE_TOTAL_SIZE);
assertThat(storageCache.usedSize).isEqualTo(FAKE_USED_SIZE);
}
private StorageCacheHelper.StorageCache getFakeStorageCache() {
StorageCacheHelper.StorageCache result = new StorageCacheHelper.StorageCache();
result.trashSize = FAKE_TRASH_SIZE;
result.systemSize = FAKE_SYSTEM_SIZE;
result.imagesSize = FAKE_IMAGES_SIZE;
result.documentsAndOtherSize = FAKE_DOCS_SIZE;
result.audioSize = FAKE_AUDIO_SIZE;
result.gamesSize = FAKE_GAMES_SIZE;
result.videosSize = FAKE_VIDEOS_SIZE;
result.allAppsExceptGamesSize = FAKE_APPS_SIZE;
return result;
}
}