/*
|
* Copyright (C) 2017 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.applications;
|
|
import android.content.Context;
|
import android.text.format.Formatter;
|
|
import androidx.annotation.Nullable;
|
import androidx.annotation.StringRes;
|
import androidx.preference.Preference;
|
|
import com.android.internal.util.Preconditions;
|
import com.android.settingslib.applications.StorageStatsSource;
|
|
/**
|
* Handles setting the sizes for the app info screen.
|
*/
|
public class AppStorageSizesController {
|
private final Preference mTotalSize;
|
private final Preference mAppSize;
|
private final Preference mDataSize;
|
private final Preference mCacheSize;
|
private final @StringRes int mComputing;
|
private final @StringRes int mError;
|
|
@Nullable
|
private StorageStatsSource.AppStorageStats mLastResult;
|
private boolean mLastResultFailed;
|
private boolean mCachedCleared;
|
private boolean mDataCleared;
|
private long mLastCodeSize = -1;
|
private long mLastDataSize = -1;
|
private long mLastCacheSize = -1;
|
private long mLastTotalSize = -1;
|
|
private AppStorageSizesController(Preference total, Preference app,
|
Preference data, Preference cache, @StringRes int computing, @StringRes int error) {
|
mTotalSize = total;
|
mAppSize = app;
|
mDataSize = data;
|
mCacheSize = cache;
|
mComputing = computing;
|
mError = error;
|
}
|
|
/**
|
* Updates the UI using storage stats.
|
* @param context Context to use to fetch strings
|
*/
|
public void updateUi(Context context) {
|
if (mLastResult == null) {
|
int errorRes = mLastResultFailed ? mError : mComputing;
|
|
mAppSize.setSummary(errorRes);
|
mDataSize.setSummary(errorRes);
|
mCacheSize.setSummary(errorRes);
|
mTotalSize.setSummary(errorRes);
|
} else {
|
long codeSize = mLastResult.getCodeBytes();
|
long dataSize =
|
mDataCleared ? 0 : mLastResult.getDataBytes() - mLastResult.getCacheBytes();
|
if (mLastCodeSize != codeSize) {
|
mLastCodeSize = codeSize;
|
mAppSize.setSummary(getSizeStr(context, codeSize));
|
}
|
if (mLastDataSize != dataSize) {
|
mLastDataSize = dataSize;
|
mDataSize.setSummary(getSizeStr(context, dataSize));
|
}
|
long cacheSize = (mDataCleared || mCachedCleared) ? 0 : mLastResult.getCacheBytes();
|
if (mLastCacheSize != cacheSize) {
|
mLastCacheSize = cacheSize;
|
mCacheSize.setSummary(getSizeStr(context, cacheSize));
|
}
|
|
long totalSize = codeSize + dataSize + cacheSize;
|
if (mLastTotalSize != totalSize) {
|
mLastTotalSize = totalSize;
|
mTotalSize.setSummary(getSizeStr(context, totalSize));
|
}
|
}
|
}
|
|
/**
|
* Sets a result for the controller to use to update the UI.
|
* @param result A result for the UI. If null, count as a failed calculation.
|
*/
|
public void setResult(StorageStatsSource.AppStorageStats result) {
|
mLastResult = result;
|
mLastResultFailed = result == null;
|
}
|
|
/**
|
* Sets if we have cleared the cache and should zero the cache bytes.
|
* When the cache is cleared, the cache directories are recreated. These directories have
|
* some size, but are empty. We zero this out to best match user expectations.
|
*/
|
public void setCacheCleared(boolean isCleared) {
|
mCachedCleared = isCleared;
|
}
|
|
/**
|
* Sets if we have cleared data and should zero the data bytes.
|
* When the data is cleared, the directory are recreated. Directories have some size, but are
|
* empty. We zero this out to best match user expectations.
|
*/
|
public void setDataCleared(boolean isCleared) {
|
mDataCleared = isCleared;
|
}
|
|
/**
|
* Returns the last result calculated, if it exists. If it does not, returns null.
|
*/
|
public StorageStatsSource.AppStorageStats getLastResult() {
|
return mLastResult;
|
}
|
|
private String getSizeStr(Context context, long size) {
|
return Formatter.formatFileSize(context, size);
|
}
|
|
public static class Builder {
|
private Preference mTotalSize;
|
private Preference mAppSize;
|
private Preference mDataSize;
|
private Preference mCacheSize;
|
private @StringRes int mComputing;
|
private @StringRes int mError;
|
|
public Builder setAppSizePreference(Preference preference) {
|
mAppSize = preference;
|
return this;
|
}
|
|
public Builder setDataSizePreference(Preference preference) {
|
mDataSize = preference;
|
return this;
|
}
|
|
public Builder setCacheSizePreference(Preference preference) {
|
mCacheSize = preference;
|
return this;
|
}
|
|
public Builder setTotalSizePreference(Preference preference) {
|
mTotalSize = preference;
|
return this;
|
}
|
|
public Builder setComputingString(@StringRes int sequence) {
|
mComputing = sequence;
|
return this;
|
}
|
|
public Builder setErrorString(@StringRes int sequence) {
|
mError = sequence;
|
return this;
|
}
|
|
public AppStorageSizesController build() {
|
return new AppStorageSizesController(
|
Preconditions.checkNotNull(mTotalSize),
|
Preconditions.checkNotNull(mAppSize),
|
Preconditions.checkNotNull(mDataSize),
|
Preconditions.checkNotNull(mCacheSize),
|
mComputing,
|
mError);
|
}
|
}
|
}
|