Merge "Import translations. DO NOT MERGE" into oc-dev
diff --git a/src/com/android/settings/bluetooth/BluetoothPairingService.java b/src/com/android/settings/bluetooth/BluetoothPairingService.java
index 58df919..4fedb6d 100644
--- a/src/com/android/settings/bluetooth/BluetoothPairingService.java
+++ b/src/com/android/settings/bluetooth/BluetoothPairingService.java
@@ -120,7 +120,8 @@
Notification.Builder builder = new Notification.Builder(this,
BLUETOOTH_NOTIFICATION_CHANNEL)
.setSmallIcon(android.R.drawable.stat_sys_data_bluetooth)
- .setTicker(res.getString(R.string.bluetooth_notif_ticker));
+ .setTicker(res.getString(R.string.bluetooth_notif_ticker))
+ .setLocalOnly(true);
PendingIntent pairIntent = PendingIntent.getActivity(this, 0,
getPairingDialogIntent(this, intent), PendingIntent.FLAG_ONE_SHOT);
diff --git a/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java b/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java
index 59496dd..85c5e45 100644
--- a/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java
+++ b/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java
@@ -181,6 +181,7 @@
.setDeleteIntent(PendingIntent.getBroadcast(context, 0, deleteIntent, 0))
.setColor(context.getColor(
com.android.internal.R.color.system_notification_accent_color))
+ .setLocalOnly(true)
.build();
notification.flags |= Notification.FLAG_NO_CLEAR; // Cannot be set with the builder.
diff --git a/src/com/android/settings/deviceinfo/storage/StorageAsyncLoader.java b/src/com/android/settings/deviceinfo/storage/StorageAsyncLoader.java
index 0b685d0..630df85 100644
--- a/src/com/android/settings/deviceinfo/storage/StorageAsyncLoader.java
+++ b/src/com/android/settings/deviceinfo/storage/StorageAsyncLoader.java
@@ -105,7 +105,17 @@
continue;
}
- long blamedSize = stats.getDataBytes() - stats.getCacheBytes();
+ final long dataSize = stats.getDataBytes();
+ final long cacheQuota = mStatsManager.getCacheQuotaBytes(mUuid, app.uid);
+ final long cacheBytes = stats.getCacheBytes();
+ long blamedSize = dataSize;
+ // Technically, we could overages as freeable on the storage settings screen.
+ // If the app is using more cache than its quota, we would accidentally subtract the
+ // overage from the system size (because it shows up as unused) during our attribution.
+ // Thus, we cap the attribution at the quota size.
+ if (cacheQuota < cacheBytes) {
+ blamedSize = blamedSize - cacheBytes + cacheQuota;
+ }
// This isn't quite right because it slams the first user by user id with the whole code
// size, but this ensures that we count all apps seen once.
diff --git a/tests/unit/src/com/android/settings/deviceinfo/storage/StorageAsyncLoaderTest.java b/tests/unit/src/com/android/settings/deviceinfo/storage/StorageAsyncLoaderTest.java
index 28bd861..5a3569c 100644
--- a/tests/unit/src/com/android/settings/deviceinfo/storage/StorageAsyncLoaderTest.java
+++ b/tests/unit/src/com/android/settings/deviceinfo/storage/StorageAsyncLoaderTest.java
@@ -29,6 +29,7 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.UserInfo;
+import android.net.TrafficStats;
import android.os.UserHandle;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
@@ -55,6 +56,7 @@
private static final int SECONDARY_USER_ID = 10;
private static final String PACKAGE_NAME_1 = "com.blah.test";
private static final String PACKAGE_NAME_2 = "com.blah.test2";
+ private static final long DEFAULT_QUOTA = 64 * TrafficStats.MB_IN_BYTES;
@Mock
private StorageStatsSource mSource;
@@ -81,6 +83,7 @@
mUsers = new ArrayList<>();
mUsers.add(info);
when(mUserManager.getUsers()).thenReturn(mUsers);
+ when(mSource.getCacheQuotaBytes(anyString(), anyInt())).thenReturn(DEFAULT_QUOTA);
}
@Test
@@ -120,13 +123,13 @@
}
@Test
- public void testCacheIsIgnored() throws Exception {
+ public void testCacheIsNotIgnored() throws Exception {
addPackage(PACKAGE_NAME_1, 100, 1, 10, ApplicationInfo.CATEGORY_UNDEFINED);
SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
assertThat(result.size()).isEqualTo(1);
- assertThat(result.get(PRIMARY_USER_ID).otherAppsSize).isEqualTo(11L);
+ assertThat(result.get(PRIMARY_USER_ID).otherAppsSize).isEqualTo(111L);
}
@Test
@@ -155,7 +158,7 @@
SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
assertThat(result.size()).isEqualTo(1);
- assertThat(result.get(PRIMARY_USER_ID).otherAppsSize).isEqualTo(11L);
+ assertThat(result.get(PRIMARY_USER_ID).otherAppsSize).isEqualTo(111L);
}
@Test
@@ -207,12 +210,23 @@
assertThat(result.get(SECONDARY_USER_ID).videoAppsSize).isEqualTo(10L);
}
+ @Test
+ public void testCacheOveragesAreCountedAsFree() throws Exception {
+ addPackage(PACKAGE_NAME_1, DEFAULT_QUOTA + 100, 1, 10, ApplicationInfo.CATEGORY_UNDEFINED);
+
+ SparseArray<StorageAsyncLoader.AppsStorageResult> result = mLoader.loadInBackground();
+
+ assertThat(result.size()).isEqualTo(1);
+ assertThat(result.get(PRIMARY_USER_ID).otherAppsSize).isEqualTo(DEFAULT_QUOTA + 11);
+ }
+
private ApplicationInfo addPackage(String packageName, long cacheSize, long codeSize,
long dataSize, int category) throws Exception {
StorageStatsSource.AppStorageStats storageStats =
mock(StorageStatsSource.AppStorageStats.class);
when(storageStats.getCodeBytes()).thenReturn(codeSize);
- when(storageStats.getDataBytes()).thenReturn(dataSize);
+ when(storageStats.getDataBytes()).thenReturn(dataSize + cacheSize);
+ when(storageStats.getCacheBytes()).thenReturn(cacheSize);
when(mSource.getStatsForPackage(anyString(), eq(packageName), any(UserHandle.class)))
.thenReturn(storageStats);