Files
packages_apps_Settings/src/com/android/settings/deviceinfo/TopLevelStoragePreferenceController.java
Edgar Wang e52320e755 Correct used size of Storage Settings.
Since StorageManager rounded the totalBytes of device storage but
they don't do that rounding for freeBytes.
So in some cases the freeBytes can be greater than totalBytes.

We propose to get totalBytes of device storage directly to calculate
correct privateUsedBytes.

Test: robotest
Bug: 281955532
Change-Id: I4f137c20e7c2f54f4e037d50e81b3176edc1a83a
2023-06-27 06:29:00 +00:00

102 lines
3.9 KiB
Java

/*
* Copyright (C) 2018 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;
import android.content.Context;
import android.os.UserManager;
import android.os.storage.StorageManager;
import android.text.format.Formatter;
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.deviceinfo.storage.StorageCacheHelper;
import com.android.settingslib.deviceinfo.PrivateStorageInfo;
import com.android.settingslib.deviceinfo.StorageManagerVolumeProvider;
import com.android.settingslib.utils.ThreadUtils;
import java.text.NumberFormat;
import java.util.concurrent.Future;
public class TopLevelStoragePreferenceController extends BasePreferenceController {
private final StorageManager mStorageManager;
private final StorageManagerVolumeProvider mStorageManagerVolumeProvider;
public TopLevelStoragePreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
mStorageManager = mContext.getSystemService(StorageManager.class);
mStorageManagerVolumeProvider = new StorageManagerVolumeProvider(mStorageManager);
}
@Override
public int getAvailabilityStatus() {
return AVAILABLE;
}
@Override
protected void refreshSummary(Preference preference) {
if (preference == null) {
return;
}
refreshSummaryThread(preference);
}
@VisibleForTesting
protected Future refreshSummaryThread(Preference preference) {
int userId = Utils.getCurrentUserId(mContext.getSystemService(UserManager.class),
/* isWorkProfile */ false);
final StorageCacheHelper storageCacheHelper = new StorageCacheHelper(mContext, userId);
long cachedUsedSize = storageCacheHelper.retrieveUsedSize();
long cachedTotalSize = storageCacheHelper.retrieveCachedSize().totalSize;
if (cachedUsedSize != 0 && cachedTotalSize != 0) {
preference.setSummary(getSummary(cachedUsedSize, cachedTotalSize));
}
return ThreadUtils.postOnBackgroundThread(() -> {
final PrivateStorageInfo info = PrivateStorageInfo.getPrivateStorageInfo(
getStorageManagerVolumeProvider());
// TODO(b/288103116): replace with new API to get TotalBytes before rounding
// once support by StorageManager.
long usedBytes = Utils.getPrimaryStorageSize() - info.freeBytes;
storageCacheHelper.cacheUsedSize(usedBytes);
ThreadUtils.postOnMainThread(() -> {
preference.setSummary(
getSummary(usedBytes, info.totalBytes));
});
});
}
@VisibleForTesting
protected StorageManagerVolumeProvider getStorageManagerVolumeProvider() {
return mStorageManagerVolumeProvider;
}
private String getSummary(long usedBytes, long totalBytes) {
NumberFormat percentageFormat = NumberFormat.getPercentInstance();
return mContext.getString(R.string.storage_summary,
totalBytes == 0L ? "0" : percentageFormat.format(((double) usedBytes) / totalBytes),
Formatter.formatFileSize(mContext, totalBytes - usedBytes));
}
}