content: /*
  * 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 androidx.core.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;
              }
          }
      }
  }
  