summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Daniel Nishi <dhnishi@google.com> 2017-03-09 14:30:07 -0800
committer Daniel Nishi <dhnishi@google.com> 2017-03-10 12:31:07 -0800
commit80fdb0149de107347f59b6badbf7386a166f4a92 (patch)
tree077bb5585b22cad321a64d7e8fcd3439f6daf6e8
parenta9767337b09d0c4eb47c0588e754e9cd8c880b3f (diff)
Hook up the cache quota query.
Apps should now be able to get the real cache quota value, instead of a stock 64MB. Bug: 33965858 Test: Manually verified that an app recevied a non-64MB quota. Change-Id: Idba47ecba356ffb592694a0d5a72363f3d0e95d0
-rw-r--r--core/java/android/app/usage/IStorageStatsManager.aidl1
-rw-r--r--core/java/android/app/usage/StorageStatsManager.java9
-rw-r--r--services/core/java/com/android/server/StorageManagerService.java9
-rw-r--r--services/core/java/com/android/server/storage/CacheQuotaStrategy.java19
-rw-r--r--services/usage/java/com/android/server/usage/StorageStatsService.java22
5 files changed, 56 insertions, 4 deletions
diff --git a/core/java/android/app/usage/IStorageStatsManager.aidl b/core/java/android/app/usage/IStorageStatsManager.aidl
index 76c0293566bb..5d1550f1a557 100644
--- a/core/java/android/app/usage/IStorageStatsManager.aidl
+++ b/core/java/android/app/usage/IStorageStatsManager.aidl
@@ -24,6 +24,7 @@ interface IStorageStatsManager {
boolean isQuotaSupported(String volumeUuid, String callingPackage);
long getTotalBytes(String volumeUuid, String callingPackage);
long getFreeBytes(String volumeUuid, String callingPackage);
+ long getCacheQuotaBytes(String volumeUuid, int uid, String callingPackage);
StorageStats queryStatsForPackage(String volumeUuid, String packageName, int userId, String callingPackage);
StorageStats queryStatsForUid(String volumeUuid, int uid, String callingPackage);
StorageStats queryStatsForUser(String volumeUuid, int userId, String callingPackage);
diff --git a/core/java/android/app/usage/StorageStatsManager.java b/core/java/android/app/usage/StorageStatsManager.java
index 081ccd956d6e..82762293a241 100644
--- a/core/java/android/app/usage/StorageStatsManager.java
+++ b/core/java/android/app/usage/StorageStatsManager.java
@@ -195,4 +195,13 @@ public class StorageStatsManager {
throw e.rethrowFromSystemServer();
}
}
+
+ /** {@hide} */
+ public long getCacheQuotaBytes(String volumeUuid, int uid) {
+ try {
+ return mService.getCacheQuotaBytes(volumeUuid, uid, mContext.getOpPackageName());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
}
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index 32136bbf6a95..1f544a0ab515 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -3275,8 +3275,13 @@ class StorageManagerService extends IStorageManager.Stub
if (uid != Binder.getCallingUid()) {
mContext.enforceCallingPermission(android.Manifest.permission.STORAGE_INTERNAL, TAG);
}
- // TODO: wire up to cache quota once merged
- return 64 * TrafficStats.MB_IN_BYTES;
+ final long token = Binder.clearCallingIdentity();
+ final StorageStatsManager stats = mContext.getSystemService(StorageStatsManager.class);
+ try {
+ return stats.getCacheQuotaBytes(volumeUuid, uid);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
}
@Override
diff --git a/services/core/java/com/android/server/storage/CacheQuotaStrategy.java b/services/core/java/com/android/server/storage/CacheQuotaStrategy.java
index c06439278954..7720e2444133 100644
--- a/services/core/java/com/android/server/storage/CacheQuotaStrategy.java
+++ b/services/core/java/com/android/server/storage/CacheQuotaStrategy.java
@@ -41,6 +41,7 @@ import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserManager;
import android.text.format.DateUtils;
+import android.util.ArrayMap;
import android.util.Pair;
import android.util.Slog;
import android.util.Xml;
@@ -64,6 +65,7 @@ import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
/**
* CacheQuotaStrategy is a strategy for determining cache quotas using usage stats and foreground
@@ -85,15 +87,18 @@ public class CacheQuotaStrategy implements RemoteCallback.OnResultListener {
private final Context mContext;
private final UsageStatsManagerInternal mUsageStats;
private final Installer mInstaller;
+ private final Map<String, Map<Integer, Long>> mQuotaMap;
private ServiceConnection mServiceConnection;
private ICacheQuotaService mRemoteService;
private AtomicFile mPreviousValuesFile;
public CacheQuotaStrategy(
- Context context, UsageStatsManagerInternal usageStatsManager, Installer installer) {
+ Context context, UsageStatsManagerInternal usageStatsManager, Installer installer,
+ Map<String, Map<Integer, Long>> quotaMap) {
mContext = Preconditions.checkNotNull(context);
mUsageStats = Preconditions.checkNotNull(usageStatsManager);
mInstaller = Preconditions.checkNotNull(installer);
+ mQuotaMap = Preconditions.checkNotNull(quotaMap);
mPreviousValuesFile = new AtomicFile(new File(
new File(Environment.getDataDirectory(), "system"), "cachequota.xml"));
}
@@ -221,6 +226,9 @@ public class CacheQuotaStrategy implements RemoteCallback.OnResultListener {
mInstaller.setAppQuota(request.getVolumeUuid(),
UserHandle.getUserId(uid),
UserHandle.getAppId(uid), proposedQuota);
+ insertIntoQuotaMap(request.getVolumeUuid(),
+ UserHandle.getUserId(uid),
+ UserHandle.getAppId(uid), proposedQuota);
} catch (Installer.InstallerException ex) {
Slog.w(TAG,
"Failed to set cache quota for " + request.getUid(),
@@ -231,6 +239,15 @@ public class CacheQuotaStrategy implements RemoteCallback.OnResultListener {
disconnectService();
}
+ private void insertIntoQuotaMap(String volumeUuid, int userId, int appId, long quota) {
+ Map<Integer, Long> volumeMap = mQuotaMap.get(volumeUuid);
+ if (volumeMap == null) {
+ volumeMap = new ArrayMap<>();
+ mQuotaMap.put(volumeUuid, volumeMap);
+ }
+ volumeMap.put(UserHandle.getUid(userId, appId), quota);
+ }
+
private void disconnectService() {
if (mServiceConnection != null) {
mContext.unbindService(mServiceConnection);
diff --git a/services/usage/java/com/android/server/usage/StorageStatsService.java b/services/usage/java/com/android/server/usage/StorageStatsService.java
index 89e68a63ac3b..8d6cb894c0b4 100644
--- a/services/usage/java/com/android/server/usage/StorageStatsService.java
+++ b/services/usage/java/com/android/server/usage/StorageStatsService.java
@@ -28,6 +28,7 @@ import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.PackageStats;
import android.content.pm.UserInfo;
+import android.net.TrafficStats;
import android.os.Binder;
import android.os.Environment;
import android.os.FileUtils;
@@ -43,6 +44,7 @@ import android.os.storage.StorageManager;
import android.os.storage.VolumeInfo;
import android.provider.Settings;
import android.text.format.DateUtils;
+import android.util.ArrayMap;
import android.util.Slog;
import com.android.internal.annotations.VisibleForTesting;
@@ -56,6 +58,7 @@ import com.android.server.pm.Installer.InstallerException;
import com.android.server.storage.CacheQuotaStrategy;
import java.io.IOException;
+import java.util.Map;
public class StorageStatsService extends IStorageStatsManager.Stub {
private static final String TAG = "StorageStatsService";
@@ -83,6 +86,7 @@ public class StorageStatsService extends IStorageStatsManager.Stub {
private final UserManager mUser;
private final PackageManager mPackage;
private final StorageManager mStorage;
+ private final Map<String, Map<Integer, Long>> mCacheQuotas;
private final Installer mInstaller;
private final H mHandler;
@@ -93,6 +97,7 @@ public class StorageStatsService extends IStorageStatsManager.Stub {
mUser = Preconditions.checkNotNull(context.getSystemService(UserManager.class));
mPackage = Preconditions.checkNotNull(context.getPackageManager());
mStorage = Preconditions.checkNotNull(context.getSystemService(StorageManager.class));
+ mCacheQuotas = new ArrayMap<>();
mInstaller = new Installer(context);
mInstaller.onStart();
@@ -177,6 +182,21 @@ public class StorageStatsService extends IStorageStatsManager.Stub {
}
@Override
+ public long getCacheQuotaBytes(String volumeUuid, int uid, String callingPackage) {
+ enforcePermission(Binder.getCallingUid(), callingPackage);
+
+ if (mCacheQuotas.containsKey(volumeUuid)) {
+ // TODO: Change to SparseLongArray.
+ Map<Integer, Long> uidMap = mCacheQuotas.get(volumeUuid);
+ if (uidMap.containsKey(uid)) {
+ return uidMap.get(uid);
+ }
+ }
+
+ return 64 * TrafficStats.MB_IN_BYTES;
+ }
+
+ @Override
public StorageStats queryStatsForPackage(String volumeUuid, String packageName, int userId,
String callingPackage) {
enforcePermission(Binder.getCallingUid(), callingPackage);
@@ -424,7 +444,7 @@ public class StorageStatsService extends IStorageStatsManager.Stub {
private CacheQuotaStrategy getInitializedStrategy() {
UsageStatsManagerInternal usageStatsManager =
LocalServices.getService(UsageStatsManagerInternal.class);
- return new CacheQuotaStrategy(mContext, usageStatsManager, mInstaller);
+ return new CacheQuotaStrategy(mContext, usageStatsManager, mInstaller, mCacheQuotas);
}
}