blob: 2dc063535f3a258f1d4a5dba5fa46ff56af93b37 [file] [log] [blame]
/*
* Copyright 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.example.android.directboot.alarms;
import android.content.Context;
import android.content.SharedPreferences;
import android.support.v4.os.BuildCompat;
import android.util.Log;
import java.security.SecureRandom;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* Class responsible for saving/retrieving alarms. This class uses SharedPreferences as storage.
*/
public class AlarmStorage {
private static final String TAG = AlarmStorage.class.getSimpleName();
private static final String ALARM_PREFERENCES_NAME = "alarm_preferences";
private static final SecureRandom SECURE_RANDOM = new SecureRandom();
private SharedPreferences mSharedPreferences;
public AlarmStorage(Context context) {
Context storageContext;
if (BuildCompat.isAtLeastN()) {
// All N devices have split storage areas, but we may need to
// move the existing preferences to the new device protected
// storage area, which is where the data lives from now on.
final Context deviceContext = context.createDeviceProtectedStorageContext();
if (!deviceContext.moveSharedPreferencesFrom(context,
ALARM_PREFERENCES_NAME)) {
Log.w(TAG, "Failed to migrate shared preferences.");
}
storageContext = deviceContext;
} else {
storageContext = context;
}
mSharedPreferences = storageContext
.getSharedPreferences(ALARM_PREFERENCES_NAME, Context.MODE_PRIVATE);
}
/**
* Stores an alarm in the SharedPreferences.
*
* @param month the integer represents a month
* @param date the integer represents a date
* @param hour the integer as 24-hour format the alarm goes off
* @param minute the integer of the minute the alarm goes off
* @return the saved {@link Alarm} instance
*/
public Alarm saveAlarm(int month, int date, int hour, int minute) {
Alarm alarm = new Alarm();
// Ignore the Id duplication if that happens
alarm.id = SECURE_RANDOM.nextInt();
alarm.month = month;
alarm.date = date;
alarm.hour = hour;
alarm.minute = minute;
SharedPreferences.Editor editor = mSharedPreferences.edit();
editor.putString(String.valueOf(alarm.id), alarm.toJson());
editor.apply();
return alarm;
}
/**
* Retrieves the alarms stored in the SharedPreferences.
* This method takes linear time as the alarms count.
*
* @return a {@link Set} of alarms.
*/
public Set<Alarm> getAlarms() {
Set<Alarm> alarms = new HashSet<>();
for (Map.Entry<String, ?> entry : mSharedPreferences.getAll().entrySet()) {
alarms.add(Alarm.fromJson(entry.getValue().toString()));
}
return alarms;
}
/**
* Delete the alarm instance passed as an argument from the SharedPreferences.
* This method iterates through the alarms stored in the SharedPreferences, takes linear time
* as the alarms count.
*
* @param toBeDeleted the alarm instance to be deleted
*/
public void deleteAlarm(Alarm toBeDeleted) {
for (Map.Entry<String, ?> entry : mSharedPreferences.getAll().entrySet()) {
Alarm alarm = Alarm.fromJson(entry.getValue().toString());
if (alarm.id == toBeDeleted.id) {
SharedPreferences.Editor editor = mSharedPreferences.edit();
editor.remove(String.valueOf(alarm.id));
editor.apply();
return;
}
}
}
}