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