18a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddypackage com.android.server.backup; 28a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy 38a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy 48a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddyimport android.app.backup.BlobBackupHelper; 58a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddyimport android.app.usage.UsageStatsManagerInternal; 68a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddyimport android.content.Context; 78a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddyimport android.os.UserHandle; 88a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddyimport android.util.Log; 98a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy 108a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddyimport com.android.server.LocalServices; 118a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy 128a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddyimport java.io.ByteArrayInputStream; 138a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddyimport java.io.ByteArrayOutputStream; 148a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddyimport java.io.DataInputStream; 158a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddyimport java.io.DataOutputStream; 168a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddyimport java.io.IOException; 178a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy 188a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddypublic class UsageStatsBackupHelper extends BlobBackupHelper { 198a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy static final String TAG = "UsgStatsBackupHelper"; // must be < 23 chars 208a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy static final boolean DEBUG = false; 218a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy 228a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy // Current version of the blob schema 238a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy static final int BLOB_VERSION = 1; 248a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy 258a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy // Key under which the payload blob is stored 26e35ae5cce1bcc1841b433ed1c5bef0a5c911cf15Ritesh Reddy // same as UsageStatsDatabase.KEY_USAGE_STATS 278a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy static final String KEY_USAGE_STATS = "usage_stats"; 288a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy 298a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy public UsageStatsBackupHelper(Context context) { 308a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy super(BLOB_VERSION, KEY_USAGE_STATS); 318a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy } 328a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy 338a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy @Override 348a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy protected byte[] getBackupPayload(String key) { 35e35ae5cce1bcc1841b433ed1c5bef0a5c911cf15Ritesh Reddy if (KEY_USAGE_STATS.equals(key)) { 36e35ae5cce1bcc1841b433ed1c5bef0a5c911cf15Ritesh Reddy UsageStatsManagerInternal localUsageStatsManager = 37e35ae5cce1bcc1841b433ed1c5bef0a5c911cf15Ritesh Reddy LocalServices.getService(UsageStatsManagerInternal.class); 388a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy ByteArrayOutputStream baos = new ByteArrayOutputStream(); 398a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy DataOutputStream out = new DataOutputStream(baos); 40e35ae5cce1bcc1841b433ed1c5bef0a5c911cf15Ritesh Reddy try { 418a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy out.writeInt(UserHandle.USER_SYSTEM); 428a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy out.write(localUsageStatsManager.getBackupPayload(UserHandle.USER_SYSTEM, key)); 43e35ae5cce1bcc1841b433ed1c5bef0a5c911cf15Ritesh Reddy } catch (IOException ioe) { 448a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy if (DEBUG) Log.e(TAG, "Failed to backup Usage Stats", ioe); 458a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy baos.reset(); 468a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy } 478a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy return baos.toByteArray(); 488a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy } 498a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy return null; 508a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy } 518a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy 528a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy 538a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy @Override 548a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy protected void applyRestoredPayload(String key, byte[] payload) { 558a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy if (KEY_USAGE_STATS.equals(key)) { 56e35ae5cce1bcc1841b433ed1c5bef0a5c911cf15Ritesh Reddy UsageStatsManagerInternal localUsageStatsManager = 57e35ae5cce1bcc1841b433ed1c5bef0a5c911cf15Ritesh Reddy LocalServices.getService(UsageStatsManagerInternal.class); 588a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy DataInputStream in = new DataInputStream(new ByteArrayInputStream(payload)); 59e35ae5cce1bcc1841b433ed1c5bef0a5c911cf15Ritesh Reddy try { 608a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy int user = in.readInt(); 618a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy byte[] restoreData = new byte[payload.length - 4]; 62e35ae5cce1bcc1841b433ed1c5bef0a5c911cf15Ritesh Reddy in.read(restoreData, 0, restoreData.length); 638a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy localUsageStatsManager.applyRestoredPayload(user, key, restoreData); 64e35ae5cce1bcc1841b433ed1c5bef0a5c911cf15Ritesh Reddy } catch (IOException ioe) { 658a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy if (DEBUG) Log.e(TAG, "Failed to restore Usage Stats", ioe); 668a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy } 678a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy } 688a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy } 698a6ce2cb64f4d61ee426240c539dc8b00dac857fRitesh Reddy} 70