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}