Loading services/core/java/com/android/server/storage/DiskStatsLoggingService.java +12 −22 Original line number Original line Diff line number Diff line Loading @@ -73,6 +73,7 @@ public class DiskStatsLoggingService extends JobService { final int userId = UserHandle.myUserId(); final int userId = UserHandle.myUserId(); UserEnvironment environment = new UserEnvironment(userId); UserEnvironment environment = new UserEnvironment(userId); LogRunnable task = new LogRunnable(); LogRunnable task = new LogRunnable(); task.setRootDirectory(environment.getExternalStorageDirectory()); task.setDownloadsDirectory( task.setDownloadsDirectory( environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)); environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)); task.setSystemSize(FileCollector.getSystemSize(this)); task.setSystemSize(FileCollector.getSystemSize(this)); Loading Loading @@ -126,10 +127,14 @@ public class DiskStatsLoggingService extends JobService { private JobParameters mParams; private JobParameters mParams; private AppCollector mCollector; private AppCollector mCollector; private File mOutputFile; private File mOutputFile; private File mRootDirectory; private File mDownloadsDirectory; private File mDownloadsDirectory; private Context mContext; private long mSystemSize; private long mSystemSize; public void setRootDirectory(File file) { mRootDirectory = file; } public void setDownloadsDirectory(File file) { public void setDownloadsDirectory(File file) { mDownloadsDirectory = file; mDownloadsDirectory = file; } } Loading @@ -146,25 +151,14 @@ public class DiskStatsLoggingService extends JobService { mSystemSize = size; mSystemSize = size; } } public void setContext(Context context) { mContext = context; } public void setJobService(JobService jobService, JobParameters params) { public void setJobService(JobService jobService, JobParameters params) { mJobService = jobService; mJobService = jobService; mParams = params; mParams = params; } } public void run() { public void run() { FileCollector.MeasurementResult mainCategories; FileCollector.MeasurementResult mainCategories = try { FileCollector.getMeasurementResult(mRootDirectory); mainCategories = FileCollector.getMeasurementResult(mContext); } catch (IllegalStateException e) { // This can occur if installd has an issue. Log.e(TAG, "Error while measuring storage", e); finishJob(true); return; } FileCollector.MeasurementResult downloads = FileCollector.MeasurementResult downloads = FileCollector.getMeasurementResult(mDownloadsDirectory); FileCollector.getMeasurementResult(mDownloadsDirectory); Loading @@ -174,10 +168,12 @@ public class DiskStatsLoggingService extends JobService { needsReschedule = false; needsReschedule = false; logToFile(mainCategories, downloads, stats, mSystemSize); logToFile(mainCategories, downloads, stats, mSystemSize); } else { } else { Log.w(TAG, "Timed out while fetching package stats."); Log.w("TAG", "Timed out while fetching package stats."); } } finishJob(needsReschedule); if (mJobService != null) { mJobService.jobFinished(mParams, needsReschedule); } } } private void logToFile(MeasurementResult mainCategories, MeasurementResult downloads, private void logToFile(MeasurementResult mainCategories, MeasurementResult downloads, Loading @@ -191,11 +187,5 @@ public class DiskStatsLoggingService extends JobService { Log.e(TAG, "Exception while writing opportunistic disk file cache.", e); Log.e(TAG, "Exception while writing opportunistic disk file cache.", e); } } } } private void finishJob(boolean needsReschedule) { if (mJobService != null) { mJobService.jobFinished(mParams, needsReschedule); } } } } } } No newline at end of file services/core/java/com/android/server/storage/FileCollector.java +0 −24 Original line number Original line Diff line number Diff line Loading @@ -17,11 +17,8 @@ package com.android.server.storage; package com.android.server.storage; import android.annotation.IntDef; import android.annotation.IntDef; import android.app.usage.ExternalStorageStats; import android.app.usage.StorageStatsManager; import android.content.Context; import android.content.Context; import android.content.pm.PackageManager; import android.content.pm.PackageManager; import android.os.UserHandle; import android.os.storage.StorageManager; import android.os.storage.StorageManager; import android.os.storage.VolumeInfo; import android.os.storage.VolumeInfo; import android.util.ArrayMap; import android.util.ArrayMap; Loading Loading @@ -156,30 +153,9 @@ public class FileCollector { new MeasurementResult()); new MeasurementResult()); } } /** * Returns the file categorization result for the primary internal storage UUID. * * @param context */ public static MeasurementResult getMeasurementResult(Context context) { MeasurementResult result = new MeasurementResult(); StorageStatsManager ssm = (StorageStatsManager) context.getSystemService(Context.STORAGE_STATS_SERVICE); ExternalStorageStats stats = ssm.queryExternalStatsForUser( StorageManager.UUID_PRIVATE_INTERNAL, UserHandle.of(context.getUserId())); result.imagesSize = stats.getImageBytes(); result.videosSize = stats.getVideoBytes(); result.audioSize = stats.getAudioBytes(); result.miscSize = stats.getTotalBytes() - result.imagesSize - result.videosSize - result.audioSize; return result; } /** /** * Returns the size of a system for a given context. This is done by finding the difference * Returns the size of a system for a given context. This is done by finding the difference * between the shared data and the total primary storage size. * between the shared data and the total primary storage size. * * @param context Context to use to get storage information. * @param context Context to use to get storage information. */ */ public static long getSystemSize(Context context) { public static long getSystemSize(Context context) { Loading services/tests/servicestests/src/com/android/server/storage/DiskStatsLoggingServiceTest.java +15 −23 Original line number Original line Diff line number Diff line Loading @@ -20,18 +20,15 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyLong; import static org.mockito.Mockito.eq; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Matchers.isNull; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.mockito.Mockito.when; import android.app.job.JobService; import android.app.job.JobService; import android.app.usage.ExternalStorageStats; import android.app.job.JobParameters; import android.app.usage.StorageStatsManager; import android.content.pm.PackageStats; import android.content.pm.PackageStats; import android.os.UserHandle; import android.test.AndroidTestCase; import android.test.AndroidTestCase; import android.util.Log; import com.android.server.storage.DiskStatsLoggingService.LogRunnable; import com.android.server.storage.DiskStatsLoggingService.LogRunnable; Loading @@ -55,10 +52,8 @@ import java.util.ArrayList; public class DiskStatsLoggingServiceTest extends AndroidTestCase { public class DiskStatsLoggingServiceTest extends AndroidTestCase { @Rule public TemporaryFolder mTemporaryFolder; @Rule public TemporaryFolder mTemporaryFolder; @Rule public TemporaryFolder mDownloads; @Rule public TemporaryFolder mDownloads; @Rule public TemporaryFolder mRootDirectory; @Mock private AppCollector mCollector; @Mock private AppCollector mCollector; @Mock private JobService mJobService; @Mock private StorageStatsManager mSsm; private ExternalStorageStats mStorageStats; private File mInputFile; private File mInputFile; Loading @@ -71,10 +66,8 @@ public class DiskStatsLoggingServiceTest extends AndroidTestCase { mInputFile = mTemporaryFolder.newFile(); mInputFile = mTemporaryFolder.newFile(); mDownloads = new TemporaryFolder(); mDownloads = new TemporaryFolder(); mDownloads.create(); mDownloads.create(); mStorageStats = new ExternalStorageStats(); mRootDirectory = new TemporaryFolder(); when(mSsm.queryExternalStatsForUser(isNull(String.class), any(UserHandle.class))) mRootDirectory.create(); .thenReturn(mStorageStats); when(mJobService.getSystemService(anyString())).thenReturn(mSsm); } } @Test @Test Loading @@ -82,9 +75,9 @@ public class DiskStatsLoggingServiceTest extends AndroidTestCase { LogRunnable task = new LogRunnable(); LogRunnable task = new LogRunnable(); task.setAppCollector(mCollector); task.setAppCollector(mCollector); task.setDownloadsDirectory(mDownloads.getRoot()); task.setDownloadsDirectory(mDownloads.getRoot()); task.setRootDirectory(mRootDirectory.getRoot()); task.setLogOutputFile(mInputFile); task.setLogOutputFile(mInputFile); task.setSystemSize(0L); task.setSystemSize(0L); task.setContext(mJobService); task.run(); task.run(); JSONObject json = getJsonOutput(); JSONObject json = getJsonOutput(); Loading @@ -106,10 +99,10 @@ public class DiskStatsLoggingServiceTest extends AndroidTestCase { public void testPopulatedLogTask() throws Exception { public void testPopulatedLogTask() throws Exception { // Write data to directories. // Write data to directories. writeDataToFile(mDownloads.newFile(), "lol"); writeDataToFile(mDownloads.newFile(), "lol"); mStorageStats.audioBytes = 6L; writeDataToFile(mRootDirectory.newFile("test.jpg"), "1234"); mStorageStats.imageBytes = 4L; writeDataToFile(mRootDirectory.newFile("test.mp4"), "12345"); mStorageStats.videoBytes = 5L; writeDataToFile(mRootDirectory.newFile("test.mp3"), "123456"); mStorageStats.totalBytes = 22L; writeDataToFile(mRootDirectory.newFile("test.whatever"), "1234567"); // Write apps. // Write apps. ArrayList<PackageStats> apps = new ArrayList<>(); ArrayList<PackageStats> apps = new ArrayList<>(); Loading @@ -117,16 +110,15 @@ public class DiskStatsLoggingServiceTest extends AndroidTestCase { testApp.dataSize = 5L; testApp.dataSize = 5L; testApp.cacheSize = 55L; testApp.cacheSize = 55L; testApp.codeSize = 10L; testApp.codeSize = 10L; testApp.userHandle = UserHandle.USER_SYSTEM; apps.add(testApp); apps.add(testApp); when(mCollector.getPackageStats(anyLong())).thenReturn(apps); when(mCollector.getPackageStats(anyInt())).thenReturn(apps); LogRunnable task = new LogRunnable(); LogRunnable task = new LogRunnable(); task.setAppCollector(mCollector); task.setAppCollector(mCollector); task.setDownloadsDirectory(mDownloads.getRoot()); task.setDownloadsDirectory(mDownloads.getRoot()); task.setRootDirectory(mRootDirectory.getRoot()); task.setLogOutputFile(mInputFile); task.setLogOutputFile(mInputFile); task.setSystemSize(10L); task.setSystemSize(10L); task.setContext(mJobService); task.run(); task.run(); JSONObject json = getJsonOutput(); JSONObject json = getJsonOutput(); Loading @@ -151,9 +143,9 @@ public class DiskStatsLoggingServiceTest extends AndroidTestCase { LogRunnable task = new LogRunnable(); LogRunnable task = new LogRunnable(); task.setAppCollector(mCollector); task.setAppCollector(mCollector); task.setDownloadsDirectory(mDownloads.getRoot()); task.setDownloadsDirectory(mDownloads.getRoot()); task.setRootDirectory(mRootDirectory.getRoot()); task.setLogOutputFile(mInputFile); task.setLogOutputFile(mInputFile); task.setSystemSize(10L); task.setSystemSize(10L); task.setContext(mJobService); task.run(); task.run(); // No exception should be thrown. // No exception should be thrown. Loading Loading
services/core/java/com/android/server/storage/DiskStatsLoggingService.java +12 −22 Original line number Original line Diff line number Diff line Loading @@ -73,6 +73,7 @@ public class DiskStatsLoggingService extends JobService { final int userId = UserHandle.myUserId(); final int userId = UserHandle.myUserId(); UserEnvironment environment = new UserEnvironment(userId); UserEnvironment environment = new UserEnvironment(userId); LogRunnable task = new LogRunnable(); LogRunnable task = new LogRunnable(); task.setRootDirectory(environment.getExternalStorageDirectory()); task.setDownloadsDirectory( task.setDownloadsDirectory( environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)); environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)); task.setSystemSize(FileCollector.getSystemSize(this)); task.setSystemSize(FileCollector.getSystemSize(this)); Loading Loading @@ -126,10 +127,14 @@ public class DiskStatsLoggingService extends JobService { private JobParameters mParams; private JobParameters mParams; private AppCollector mCollector; private AppCollector mCollector; private File mOutputFile; private File mOutputFile; private File mRootDirectory; private File mDownloadsDirectory; private File mDownloadsDirectory; private Context mContext; private long mSystemSize; private long mSystemSize; public void setRootDirectory(File file) { mRootDirectory = file; } public void setDownloadsDirectory(File file) { public void setDownloadsDirectory(File file) { mDownloadsDirectory = file; mDownloadsDirectory = file; } } Loading @@ -146,25 +151,14 @@ public class DiskStatsLoggingService extends JobService { mSystemSize = size; mSystemSize = size; } } public void setContext(Context context) { mContext = context; } public void setJobService(JobService jobService, JobParameters params) { public void setJobService(JobService jobService, JobParameters params) { mJobService = jobService; mJobService = jobService; mParams = params; mParams = params; } } public void run() { public void run() { FileCollector.MeasurementResult mainCategories; FileCollector.MeasurementResult mainCategories = try { FileCollector.getMeasurementResult(mRootDirectory); mainCategories = FileCollector.getMeasurementResult(mContext); } catch (IllegalStateException e) { // This can occur if installd has an issue. Log.e(TAG, "Error while measuring storage", e); finishJob(true); return; } FileCollector.MeasurementResult downloads = FileCollector.MeasurementResult downloads = FileCollector.getMeasurementResult(mDownloadsDirectory); FileCollector.getMeasurementResult(mDownloadsDirectory); Loading @@ -174,10 +168,12 @@ public class DiskStatsLoggingService extends JobService { needsReschedule = false; needsReschedule = false; logToFile(mainCategories, downloads, stats, mSystemSize); logToFile(mainCategories, downloads, stats, mSystemSize); } else { } else { Log.w(TAG, "Timed out while fetching package stats."); Log.w("TAG", "Timed out while fetching package stats."); } } finishJob(needsReschedule); if (mJobService != null) { mJobService.jobFinished(mParams, needsReschedule); } } } private void logToFile(MeasurementResult mainCategories, MeasurementResult downloads, private void logToFile(MeasurementResult mainCategories, MeasurementResult downloads, Loading @@ -191,11 +187,5 @@ public class DiskStatsLoggingService extends JobService { Log.e(TAG, "Exception while writing opportunistic disk file cache.", e); Log.e(TAG, "Exception while writing opportunistic disk file cache.", e); } } } } private void finishJob(boolean needsReschedule) { if (mJobService != null) { mJobService.jobFinished(mParams, needsReschedule); } } } } } } No newline at end of file
services/core/java/com/android/server/storage/FileCollector.java +0 −24 Original line number Original line Diff line number Diff line Loading @@ -17,11 +17,8 @@ package com.android.server.storage; package com.android.server.storage; import android.annotation.IntDef; import android.annotation.IntDef; import android.app.usage.ExternalStorageStats; import android.app.usage.StorageStatsManager; import android.content.Context; import android.content.Context; import android.content.pm.PackageManager; import android.content.pm.PackageManager; import android.os.UserHandle; import android.os.storage.StorageManager; import android.os.storage.StorageManager; import android.os.storage.VolumeInfo; import android.os.storage.VolumeInfo; import android.util.ArrayMap; import android.util.ArrayMap; Loading Loading @@ -156,30 +153,9 @@ public class FileCollector { new MeasurementResult()); new MeasurementResult()); } } /** * Returns the file categorization result for the primary internal storage UUID. * * @param context */ public static MeasurementResult getMeasurementResult(Context context) { MeasurementResult result = new MeasurementResult(); StorageStatsManager ssm = (StorageStatsManager) context.getSystemService(Context.STORAGE_STATS_SERVICE); ExternalStorageStats stats = ssm.queryExternalStatsForUser( StorageManager.UUID_PRIVATE_INTERNAL, UserHandle.of(context.getUserId())); result.imagesSize = stats.getImageBytes(); result.videosSize = stats.getVideoBytes(); result.audioSize = stats.getAudioBytes(); result.miscSize = stats.getTotalBytes() - result.imagesSize - result.videosSize - result.audioSize; return result; } /** /** * Returns the size of a system for a given context. This is done by finding the difference * Returns the size of a system for a given context. This is done by finding the difference * between the shared data and the total primary storage size. * between the shared data and the total primary storage size. * * @param context Context to use to get storage information. * @param context Context to use to get storage information. */ */ public static long getSystemSize(Context context) { public static long getSystemSize(Context context) { Loading
services/tests/servicestests/src/com/android/server/storage/DiskStatsLoggingServiceTest.java +15 −23 Original line number Original line Diff line number Diff line Loading @@ -20,18 +20,15 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyLong; import static org.mockito.Mockito.eq; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Matchers.isNull; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.mockito.Mockito.when; import android.app.job.JobService; import android.app.job.JobService; import android.app.usage.ExternalStorageStats; import android.app.job.JobParameters; import android.app.usage.StorageStatsManager; import android.content.pm.PackageStats; import android.content.pm.PackageStats; import android.os.UserHandle; import android.test.AndroidTestCase; import android.test.AndroidTestCase; import android.util.Log; import com.android.server.storage.DiskStatsLoggingService.LogRunnable; import com.android.server.storage.DiskStatsLoggingService.LogRunnable; Loading @@ -55,10 +52,8 @@ import java.util.ArrayList; public class DiskStatsLoggingServiceTest extends AndroidTestCase { public class DiskStatsLoggingServiceTest extends AndroidTestCase { @Rule public TemporaryFolder mTemporaryFolder; @Rule public TemporaryFolder mTemporaryFolder; @Rule public TemporaryFolder mDownloads; @Rule public TemporaryFolder mDownloads; @Rule public TemporaryFolder mRootDirectory; @Mock private AppCollector mCollector; @Mock private AppCollector mCollector; @Mock private JobService mJobService; @Mock private StorageStatsManager mSsm; private ExternalStorageStats mStorageStats; private File mInputFile; private File mInputFile; Loading @@ -71,10 +66,8 @@ public class DiskStatsLoggingServiceTest extends AndroidTestCase { mInputFile = mTemporaryFolder.newFile(); mInputFile = mTemporaryFolder.newFile(); mDownloads = new TemporaryFolder(); mDownloads = new TemporaryFolder(); mDownloads.create(); mDownloads.create(); mStorageStats = new ExternalStorageStats(); mRootDirectory = new TemporaryFolder(); when(mSsm.queryExternalStatsForUser(isNull(String.class), any(UserHandle.class))) mRootDirectory.create(); .thenReturn(mStorageStats); when(mJobService.getSystemService(anyString())).thenReturn(mSsm); } } @Test @Test Loading @@ -82,9 +75,9 @@ public class DiskStatsLoggingServiceTest extends AndroidTestCase { LogRunnable task = new LogRunnable(); LogRunnable task = new LogRunnable(); task.setAppCollector(mCollector); task.setAppCollector(mCollector); task.setDownloadsDirectory(mDownloads.getRoot()); task.setDownloadsDirectory(mDownloads.getRoot()); task.setRootDirectory(mRootDirectory.getRoot()); task.setLogOutputFile(mInputFile); task.setLogOutputFile(mInputFile); task.setSystemSize(0L); task.setSystemSize(0L); task.setContext(mJobService); task.run(); task.run(); JSONObject json = getJsonOutput(); JSONObject json = getJsonOutput(); Loading @@ -106,10 +99,10 @@ public class DiskStatsLoggingServiceTest extends AndroidTestCase { public void testPopulatedLogTask() throws Exception { public void testPopulatedLogTask() throws Exception { // Write data to directories. // Write data to directories. writeDataToFile(mDownloads.newFile(), "lol"); writeDataToFile(mDownloads.newFile(), "lol"); mStorageStats.audioBytes = 6L; writeDataToFile(mRootDirectory.newFile("test.jpg"), "1234"); mStorageStats.imageBytes = 4L; writeDataToFile(mRootDirectory.newFile("test.mp4"), "12345"); mStorageStats.videoBytes = 5L; writeDataToFile(mRootDirectory.newFile("test.mp3"), "123456"); mStorageStats.totalBytes = 22L; writeDataToFile(mRootDirectory.newFile("test.whatever"), "1234567"); // Write apps. // Write apps. ArrayList<PackageStats> apps = new ArrayList<>(); ArrayList<PackageStats> apps = new ArrayList<>(); Loading @@ -117,16 +110,15 @@ public class DiskStatsLoggingServiceTest extends AndroidTestCase { testApp.dataSize = 5L; testApp.dataSize = 5L; testApp.cacheSize = 55L; testApp.cacheSize = 55L; testApp.codeSize = 10L; testApp.codeSize = 10L; testApp.userHandle = UserHandle.USER_SYSTEM; apps.add(testApp); apps.add(testApp); when(mCollector.getPackageStats(anyLong())).thenReturn(apps); when(mCollector.getPackageStats(anyInt())).thenReturn(apps); LogRunnable task = new LogRunnable(); LogRunnable task = new LogRunnable(); task.setAppCollector(mCollector); task.setAppCollector(mCollector); task.setDownloadsDirectory(mDownloads.getRoot()); task.setDownloadsDirectory(mDownloads.getRoot()); task.setRootDirectory(mRootDirectory.getRoot()); task.setLogOutputFile(mInputFile); task.setLogOutputFile(mInputFile); task.setSystemSize(10L); task.setSystemSize(10L); task.setContext(mJobService); task.run(); task.run(); JSONObject json = getJsonOutput(); JSONObject json = getJsonOutput(); Loading @@ -151,9 +143,9 @@ public class DiskStatsLoggingServiceTest extends AndroidTestCase { LogRunnable task = new LogRunnable(); LogRunnable task = new LogRunnable(); task.setAppCollector(mCollector); task.setAppCollector(mCollector); task.setDownloadsDirectory(mDownloads.getRoot()); task.setDownloadsDirectory(mDownloads.getRoot()); task.setRootDirectory(mRootDirectory.getRoot()); task.setLogOutputFile(mInputFile); task.setLogOutputFile(mInputFile); task.setSystemSize(10L); task.setSystemSize(10L); task.setContext(mJobService); task.run(); task.run(); // No exception should be thrown. // No exception should be thrown. Loading