Fix DirectBoot sample.

Custom Parcelable objects are not support in PendingIntents set in
AlarmManager (see https://code.google.com/p/android/issues/detail?id=209422 ),
instead the alarm is encoded directly as extra values.

Bump dependencies to fix issues on final N devices.

Move sample to 'security' category.

Change-Id: I6622c6dce6348d9386203791861fb42415537db3
diff --git a/security/DirectBoot/Application/src/main/java/com/example/android/directboot/SchedulerFragment.java b/security/DirectBoot/Application/src/main/java/com/example/android/directboot/SchedulerFragment.java
index 0f32c25..008961f 100644
--- a/security/DirectBoot/Application/src/main/java/com/example/android/directboot/SchedulerFragment.java
+++ b/security/DirectBoot/Application/src/main/java/com/example/android/directboot/SchedulerFragment.java
@@ -129,7 +129,7 @@
 
         @Override
         public void onReceive(Context context, Intent intent) {
-            Alarm alarm = intent.getParcelableExtra(AlarmIntentService.ALARM_KEY);
+            Alarm alarm = AlarmUtil.readAlarm(intent.getExtras());
             mAlarmAdapter.deleteAlarm(alarm);
         }
     }
diff --git a/security/DirectBoot/Application/src/main/java/com/example/android/directboot/alarms/Alarm.java b/security/DirectBoot/Application/src/main/java/com/example/android/directboot/alarms/Alarm.java
index 82712c6..27ca5c4 100644
--- a/security/DirectBoot/Application/src/main/java/com/example/android/directboot/alarms/Alarm.java
+++ b/security/DirectBoot/Application/src/main/java/com/example/android/directboot/alarms/Alarm.java
@@ -16,66 +16,44 @@
 
 package com.example.android.directboot.alarms;
 
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.support.annotation.NonNull;
-
 import org.json.JSONException;
 import org.json.JSONObject;
 
+import android.support.annotation.NonNull;
+
 import java.util.Calendar;
 import java.util.Objects;
 
 /**
  * Class represents a single alarm.
  */
-public class Alarm implements Comparable<Alarm>, Parcelable {
+public class Alarm implements Comparable<Alarm> {
 
     public int id;
+
     public int month;
+
     public int date;
+
     /** Integer as a 24-hour format */
     public int hour;
+
     public int minute;
 
-    public Alarm() {}
-
-    protected Alarm(Parcel in) {
-        id = in.readInt();
-        month = in.readInt();
-        date = in.readInt();
-        hour = in.readInt();
-        minute = in.readInt();
+    public Alarm(int id, int month, int date, int hour, int minute) {
+        this.id = id;
+        this.month = month;
+        this.date = date;
+        this.hour = hour;
+        this.minute = minute;
     }
 
-    public static final Creator<Alarm> CREATOR = new Creator<Alarm>() {
-        @Override
-        public Alarm createFromParcel(Parcel in) {
-            return new Alarm(in);
-        }
-
-        @Override
-        public Alarm[] newArray(int size) {
-            return new Alarm[size];
-        }
-    };
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(Parcel parcel, int i) {
-        parcel.writeInt(id);
-        parcel.writeInt(month);
-        parcel.writeInt(date);
-        parcel.writeInt(hour);
-        parcel.writeInt(minute);
+    public Alarm() {
     }
 
     /**
      * Serialize the instance as a JSON String.
+     *
      * @return serialized JSON String.
      */
     public String toJson() {
diff --git a/security/DirectBoot/Application/src/main/java/com/example/android/directboot/alarms/AlarmIntentService.java b/security/DirectBoot/Application/src/main/java/com/example/android/directboot/alarms/AlarmIntentService.java
index 446345c..3909482 100644
--- a/security/DirectBoot/Application/src/main/java/com/example/android/directboot/alarms/AlarmIntentService.java
+++ b/security/DirectBoot/Application/src/main/java/com/example/android/directboot/alarms/AlarmIntentService.java
@@ -34,7 +34,17 @@
 
     public static final String ALARM_WENT_OFF_ACTION = AlarmIntentService.class.getName()
             + ".ALARM_WENT_OFF";
-    public static final String ALARM_KEY = "alarm_instance";
+
+
+    public static final String KEY_ALARM_ID = "alarm_id";
+
+    public static final String KEY_ALARM_MONTH = "alarm_month";
+
+    public static final String KEY_ALARM_DATE = "alarm_date";
+
+    public static final String KEY_ALARM_HOUR = "alarm_hour";
+
+    public static final String KEY_ALARM_MINUTE = "alarm_minute";
 
     public AlarmIntentService() {
         super(AlarmIntentService.class.getName());
@@ -43,7 +53,7 @@
     @Override
     protected void onHandleIntent(Intent intent) {
         Context context = getApplicationContext();
-        Alarm alarm = intent.getParcelableExtra(ALARM_KEY);
+        Alarm alarm = AlarmUtil.readAlarm(intent.getExtras());
 
         NotificationManager notificationManager = context
                 .getSystemService(NotificationManager.class);
@@ -59,7 +69,7 @@
         AlarmStorage alarmStorage = new AlarmStorage(context);
         alarmStorage.deleteAlarm(alarm);
         Intent wentOffIntent = new Intent(ALARM_WENT_OFF_ACTION);
-        wentOffIntent.putExtra(ALARM_KEY, alarm);
+        wentOffIntent.putExtras(AlarmUtil.writeAlarm(alarm));
         LocalBroadcastManager.getInstance(context).sendBroadcast(wentOffIntent);
     }
 }
diff --git a/security/DirectBoot/Application/src/main/java/com/example/android/directboot/alarms/AlarmUtil.java b/security/DirectBoot/Application/src/main/java/com/example/android/directboot/alarms/AlarmUtil.java
index b80e8c9..29c01c9 100644
--- a/security/DirectBoot/Application/src/main/java/com/example/android/directboot/alarms/AlarmUtil.java
+++ b/security/DirectBoot/Application/src/main/java/com/example/android/directboot/alarms/AlarmUtil.java
@@ -20,6 +20,7 @@
 import android.app.PendingIntent;
 import android.content.Context;
 import android.content.Intent;
+import android.os.Bundle;
 import android.util.Log;
 
 import java.util.Calendar;
@@ -45,7 +46,9 @@
      */
     public void scheduleAlarm(Alarm alarm) {
         Intent intent = new Intent(mContext, AlarmIntentService.class);
-        intent.putExtra(AlarmIntentService.ALARM_KEY, alarm);
+        Bundle extras = writeAlarm(alarm);
+        intent.putExtras(extras);
+
         PendingIntent pendingIntent = PendingIntent
                 .getService(mContext, alarm.id, intent, PendingIntent.FLAG_UPDATE_CURRENT);
         Calendar alarmTime = Calendar.getInstance();
@@ -71,7 +74,6 @@
      */
     public void cancelAlarm(Alarm alarm) {
         Intent intent = new Intent(mContext, AlarmIntentService.class);
-        intent.putExtra(AlarmIntentService.ALARM_KEY, alarm);
         PendingIntent pendingIntent = PendingIntent
                 .getService(mContext, alarm.id, intent, PendingIntent.FLAG_UPDATE_CURRENT);
         mAlarmManager.cancel(pendingIntent);
@@ -94,4 +96,25 @@
         }
         return alarmTime;
     }
+
+    public static Alarm readAlarm(Bundle extras) {
+        int id = extras.getInt(AlarmIntentService.KEY_ALARM_ID);
+        int month = extras.getInt(AlarmIntentService.KEY_ALARM_MONTH);
+        int date = extras.getInt(AlarmIntentService.KEY_ALARM_DATE);
+        int hour = extras.getInt(AlarmIntentService.KEY_ALARM_HOUR);
+        int minute = extras.getInt(AlarmIntentService.KEY_ALARM_MINUTE);
+
+        return new Alarm(id, month, date, hour, minute);
+    }
+
+    public static Bundle writeAlarm(Alarm alarm){
+        Bundle extras = new Bundle();
+        extras.putInt(AlarmIntentService.KEY_ALARM_ID, alarm.id);
+        extras.putInt(AlarmIntentService.KEY_ALARM_MONTH, alarm.month);
+        extras.putInt(AlarmIntentService.KEY_ALARM_DATE, alarm.date);
+        extras.putInt(AlarmIntentService.KEY_ALARM_HOUR, alarm.hour);
+        extras.putInt(AlarmIntentService.KEY_ALARM_MINUTE, alarm.minute);
+
+        return extras;
+    }
 }
diff --git a/security/DirectBoot/template-params.xml b/security/DirectBoot/template-params.xml
index dd5d5b1..b020ec1 100644
--- a/security/DirectBoot/template-params.xml
+++ b/security/DirectBoot/template-params.xml
@@ -22,13 +22,13 @@
     <package>com.example.android.directboot</package>
 
     <minSdk>24</minSdk>
-    <compileSdkVersion>24</compileSdkVersion>
-    <targetSdkVersion>24</targetSdkVersion>
+    <compileSdkVersion>25</compileSdkVersion>
+    <targetSdkVersion>25</targetSdkVersion>
 
     <!-- Include additional dependencies here.-->
     <!-- dependency>com.google.android.gms:play-services:5.0.+</dependency -->
-    <dependency>com.android.support:recyclerview-v7:24.0.0</dependency>
-    <dependency>com.android.support:design:24.0.0</dependency>
+    <dependency>com.android.support:recyclerview-v7:25.0.1</dependency>
+    <dependency>com.android.support:design:25.0.1</dependency>
 
     <template src="base" />
 
@@ -45,7 +45,7 @@
 
     <metadata>
         <status>PUBLISHED</status>
-        <categories>Android N Preview</categories>
+        <categories>Security</categories>
         <technologies>Android</technologies>
         <languages>Java</languages>
         <solutions>Mobile</solutions>