DeskClockBackupAgent.java revision 1f53186f7d1d449382b2e429cd35e3312f9eb97e
1b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux/* 2b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux * Copyright (C) 2015 The Android Open Source Project 3b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux * 4b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux * Licensed under the Apache License, Version 2.0 (the "License"); 5b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux * you may not use this file except in compliance with the License. 6b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux * You may obtain a copy of the License at 7b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux * 8b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux * http://www.apache.org/licenses/LICENSE-2.0 9b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux * 10b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux * Unless required by applicable law or agreed to in writing, software 11b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux * distributed under the License is distributed on an "AS IS" BASIS, 12b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux * See the License for the specific language governing permissions and 14b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux * limitations under the License. 15b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux */ 16b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux 17b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieuxpackage com.android.deskclock; 18b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux 19b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieuximport android.app.backup.BackupAgent; 20b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieuximport android.app.backup.BackupDataInput; 21b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieuximport android.app.backup.BackupDataOutput; 22b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieuximport android.os.ParcelFileDescriptor; 23b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieuximport android.support.annotation.NonNull; 24b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux 25b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieuximport com.android.deskclock.alarms.AlarmStateManager; 261f53186f7d1d449382b2e429cd35e3312f9eb97eJames Lemieuximport com.android.deskclock.provider.Alarm; 271f53186f7d1d449382b2e429cd35e3312f9eb97eJames Lemieuximport com.android.deskclock.provider.AlarmInstance; 28b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux 29b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieuximport java.io.File; 30b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieuximport java.io.IOException; 311f53186f7d1d449382b2e429cd35e3312f9eb97eJames Lemieuximport java.util.Calendar; 321f53186f7d1d449382b2e429cd35e3312f9eb97eJames Lemieuximport java.util.List; 33b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux 34b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieuxpublic class DeskClockBackupAgent extends BackupAgent { 35b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux 361f53186f7d1d449382b2e429cd35e3312f9eb97eJames Lemieux private static final String TAG = "DeskClockBackupAgent"; 371f53186f7d1d449382b2e429cd35e3312f9eb97eJames Lemieux 38b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux @Override 39b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data, 40b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux ParcelFileDescriptor newState) throws IOException { } 41b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux 42b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux @Override 43b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux public void onRestore(BackupDataInput data, int appVersionCode, 44b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux ParcelFileDescriptor newState) throws IOException { } 45b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux 46b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux @Override 47b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux public void onRestoreFile(@NonNull ParcelFileDescriptor data, long size, File destination, 48b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux int type, long mode, long mtime) throws IOException { 49b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux // The preference file on the backup device may not be the same on the restore device. 50b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux // Massage the file name here before writing it. 51b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux if (destination.getName().endsWith("_preferences.xml")) { 52b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux final String prefFileName = getPackageName() + "_preferences.xml"; 53b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux destination = new File(destination.getParentFile(), prefFileName); 54b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux } 55b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux 56b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux super.onRestoreFile(data, size, destination, type, mode, mtime); 57b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux } 58b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux 59b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux @Override 60b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux public void onRestoreFinished() { 61b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux // Now that alarms have been restored, schedule them in AlarmManager. 621f53186f7d1d449382b2e429cd35e3312f9eb97eJames Lemieux final List<Alarm> alarms = Alarm.getAlarms(getContentResolver(), null); 631f53186f7d1d449382b2e429cd35e3312f9eb97eJames Lemieux 641f53186f7d1d449382b2e429cd35e3312f9eb97eJames Lemieux final Calendar now = Calendar.getInstance(); 651f53186f7d1d449382b2e429cd35e3312f9eb97eJames Lemieux for (Alarm alarm : alarms) { 661f53186f7d1d449382b2e429cd35e3312f9eb97eJames Lemieux // Remove any instances that may currently exist for the alarm; 671f53186f7d1d449382b2e429cd35e3312f9eb97eJames Lemieux // these aren't relevant on the restore device and we'll recreate them below. 681f53186f7d1d449382b2e429cd35e3312f9eb97eJames Lemieux AlarmStateManager.deleteAllInstances(this, alarm.id); 691f53186f7d1d449382b2e429cd35e3312f9eb97eJames Lemieux 701f53186f7d1d449382b2e429cd35e3312f9eb97eJames Lemieux if (alarm.enabled) { 711f53186f7d1d449382b2e429cd35e3312f9eb97eJames Lemieux // Create the next alarm instance to schedule. 721f53186f7d1d449382b2e429cd35e3312f9eb97eJames Lemieux AlarmInstance alarmInstance = alarm.createInstanceAfter(now); 731f53186f7d1d449382b2e429cd35e3312f9eb97eJames Lemieux 741f53186f7d1d449382b2e429cd35e3312f9eb97eJames Lemieux // Add the next alarm instance to the database. 751f53186f7d1d449382b2e429cd35e3312f9eb97eJames Lemieux alarmInstance = AlarmInstance.addInstance(getContentResolver(), alarmInstance); 761f53186f7d1d449382b2e429cd35e3312f9eb97eJames Lemieux 771f53186f7d1d449382b2e429cd35e3312f9eb97eJames Lemieux // Schedule the next alarm instance in AlarmManager. 781f53186f7d1d449382b2e429cd35e3312f9eb97eJames Lemieux AlarmStateManager.registerInstance(this, alarmInstance, true); 791f53186f7d1d449382b2e429cd35e3312f9eb97eJames Lemieux LogUtils.i(TAG, "DeskClockBackupAgent scheduled alarm instance: %s", alarmInstance); 801f53186f7d1d449382b2e429cd35e3312f9eb97eJames Lemieux } 811f53186f7d1d449382b2e429cd35e3312f9eb97eJames Lemieux } 82b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux } 83b5f116935f6b767d9bf7c266a9c189d706cc6d66James Lemieux}