DataLayer sample: Removes BIND_LISTENER from manifest and removes Node API. am: 17df1e1 am: 94b81e7 am: 8144a37
am: b38eac0

* commit 'b38eac0adfd98b3554b84e3e6956ffe7396334f7':
  DataLayer sample: Removes BIND_LISTENER from manifest and removes Node API.

Change-Id: If8d07ecea69210ae8016bc4309904637f1f52eac
diff --git a/admin/AppRestrictionEnforcer/gradle/wrapper/gradle-wrapper.properties b/admin/AppRestrictionEnforcer/gradle/wrapper/gradle-wrapper.properties
index 377495f..2139f4b 100644
--- a/admin/AppRestrictionEnforcer/gradle/wrapper/gradle-wrapper.properties
+++ b/admin/AppRestrictionEnforcer/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/admin/AppRestrictionSchema/gradle/wrapper/gradle-wrapper.properties b/admin/AppRestrictionSchema/gradle/wrapper/gradle-wrapper.properties
index c5454eb..f1713fa 100644
--- a/admin/AppRestrictionSchema/gradle/wrapper/gradle-wrapper.properties
+++ b/admin/AppRestrictionSchema/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/admin/BasicManagedProfile/gradle/wrapper/gradle-wrapper.properties b/admin/BasicManagedProfile/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/admin/BasicManagedProfile/gradle/wrapper/gradle-wrapper.properties
+++ b/admin/BasicManagedProfile/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/admin/DeviceOwner/gradle/wrapper/gradle-wrapper.properties b/admin/DeviceOwner/gradle/wrapper/gradle-wrapper.properties
index 22997e5..6be9a46 100644
--- a/admin/DeviceOwner/gradle/wrapper/gradle-wrapper.properties
+++ b/admin/DeviceOwner/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/admin/NfcProvisioning/Application/src/main/java/com/example/android/nfcprovisioning/ProvisioningValuesLoader.java b/admin/NfcProvisioning/Application/src/main/java/com/example/android/nfcprovisioning/ProvisioningValuesLoader.java
index 2203c30..73a6053 100644
--- a/admin/NfcProvisioning/Application/src/main/java/com/example/android/nfcprovisioning/ProvisioningValuesLoader.java
+++ b/admin/NfcProvisioning/Application/src/main/java/com/example/android/nfcprovisioning/ProvisioningValuesLoader.java
@@ -30,8 +30,12 @@
 import java.io.File;
 import java.io.FileReader;
 import java.io.IOException;
+import java.io.StringWriter;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
 import java.util.TimeZone;
 
 /**
@@ -55,6 +59,7 @@
     public Map<String, String> loadInBackground() {
         HashMap<String, String> values = new HashMap<>();
         loadFromDisk(values);
+        gatherAdminExtras(values);
         loadSystemValues(values);
         return values;
     }
@@ -130,6 +135,29 @@
         }
     }
 
+    private void gatherAdminExtras(HashMap<String, String> values) {
+        HashMap<String, String> newMap = new HashMap<String, String>();
+        Properties props = new Properties();
+        Set<String>keys = new HashSet(values.keySet());
+        for (String key : keys) {
+            if (key.startsWith("android.app.extra")) {
+                continue;
+            }
+            props.put(key, values.get(key));
+            values.remove(key);
+        }
+        StringWriter sw = new StringWriter();
+        try{
+            props.store(sw, "admin extras bundle");
+            values.put(DevicePolicyManager.EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE,
+                    sw.toString());
+            Log.d(TAG, "Admin extras bundle=" + values.get(
+                    DevicePolicyManager.EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE));
+        } catch (IOException e) {
+            Log.e(TAG, "Unable to build admin extras bundle");
+        }
+    }
+
     private void loadSystemValues(HashMap<String, String> values) {
         Context context = getContext();
         putIfMissing(values, DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME,
diff --git a/admin/NfcProvisioning/gradle/wrapper/gradle-wrapper.properties b/admin/NfcProvisioning/gradle/wrapper/gradle-wrapper.properties
index 862673d..ee35487 100644
--- a/admin/NfcProvisioning/gradle/wrapper/gradle-wrapper.properties
+++ b/admin/NfcProvisioning/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/background/JobScheduler/gradle/wrapper/gradle-wrapper.properties b/background/JobScheduler/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/background/JobScheduler/gradle/wrapper/gradle-wrapper.properties
+++ b/background/JobScheduler/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/background/alarms/RepeatingAlarm/gradle/wrapper/gradle-wrapper.properties b/background/alarms/RepeatingAlarm/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/background/alarms/RepeatingAlarm/gradle/wrapper/gradle-wrapper.properties
+++ b/background/alarms/RepeatingAlarm/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/build.gradle b/build.gradle
index 1e3cf8a..01ed16f 100644
--- a/build.gradle
+++ b/build.gradle
@@ -107,6 +107,9 @@
 "notification/ActiveNotifications",
 "media/Camera2Raw",
 "content/AutoBackupForApps",
+"ui/window/MultiWindowPlayground",
+"content/documentsUi/ScopedDirectoryAccess",
+"security/DirectBoot",
 "content/DirectShare",
 "media/MidiScope",
 "media/MidiSynth",
diff --git a/connectivity/bluetooth/BluetoothAdvertisements/gradle/wrapper/gradle-wrapper.properties b/connectivity/bluetooth/BluetoothAdvertisements/gradle/wrapper/gradle-wrapper.properties
index 25c3a92..134127f 100644
--- a/connectivity/bluetooth/BluetoothAdvertisements/gradle/wrapper/gradle-wrapper.properties
+++ b/connectivity/bluetooth/BluetoothAdvertisements/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/connectivity/bluetooth/BluetoothChat/gradle/wrapper/gradle-wrapper.properties b/connectivity/bluetooth/BluetoothChat/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/connectivity/bluetooth/BluetoothChat/gradle/wrapper/gradle-wrapper.properties
+++ b/connectivity/bluetooth/BluetoothChat/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/connectivity/bluetooth/BluetoothLeGatt/gradle/wrapper/gradle-wrapper.properties b/connectivity/bluetooth/BluetoothLeGatt/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/connectivity/bluetooth/BluetoothLeGatt/gradle/wrapper/gradle-wrapper.properties
+++ b/connectivity/bluetooth/BluetoothLeGatt/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/connectivity/network/BasicNetworking/gradle/wrapper/gradle-wrapper.properties b/connectivity/network/BasicNetworking/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/connectivity/network/BasicNetworking/gradle/wrapper/gradle-wrapper.properties
+++ b/connectivity/network/BasicNetworking/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/connectivity/network/NetworkConnect/gradle/wrapper/gradle-wrapper.properties b/connectivity/network/NetworkConnect/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/connectivity/network/NetworkConnect/gradle/wrapper/gradle-wrapper.properties
+++ b/connectivity/network/NetworkConnect/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/connectivity/nfc/BeamLargeFiles/gradle/wrapper/gradle-wrapper.properties b/connectivity/nfc/BeamLargeFiles/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/connectivity/nfc/BeamLargeFiles/gradle/wrapper/gradle-wrapper.properties
+++ b/connectivity/nfc/BeamLargeFiles/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/connectivity/nfc/CardEmulation/gradle/wrapper/gradle-wrapper.properties b/connectivity/nfc/CardEmulation/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/connectivity/nfc/CardEmulation/gradle/wrapper/gradle-wrapper.properties
+++ b/connectivity/nfc/CardEmulation/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/connectivity/nfc/CardReader/gradle/wrapper/gradle-wrapper.properties b/connectivity/nfc/CardReader/gradle/wrapper/gradle-wrapper.properties
index 34ff29a..1d0dd57 100644
--- a/connectivity/nfc/CardReader/gradle/wrapper/gradle-wrapper.properties
+++ b/connectivity/nfc/CardReader/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/connectivity/sync/BasicSyncAdapter/gradle/wrapper/gradle-wrapper.properties b/connectivity/sync/BasicSyncAdapter/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/connectivity/sync/BasicSyncAdapter/gradle/wrapper/gradle-wrapper.properties
+++ b/connectivity/sync/BasicSyncAdapter/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/connectivity/wifidirect/DirectP2P/gradle/wrapper/gradle-wrapper.properties b/connectivity/wifidirect/DirectP2P/gradle/wrapper/gradle-wrapper.properties
index 039bfb4..2f348cb 100644
--- a/connectivity/wifidirect/DirectP2P/gradle/wrapper/gradle-wrapper.properties
+++ b/connectivity/wifidirect/DirectP2P/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
\ No newline at end of file
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
\ No newline at end of file
diff --git a/content/AutoBackupForApps/Application/src/main/java/com/example/android/autobackupsample/AddFileActivity.java b/content/AutoBackupForApps/Application/src/main/java/com/example/android/autobackupsample/AddFileActivity.java
index 00cd1e3..d026ddd 100644
--- a/content/AutoBackupForApps/Application/src/main/java/com/example/android/autobackupsample/AddFileActivity.java
+++ b/content/AutoBackupForApps/Application/src/main/java/com/example/android/autobackupsample/AddFileActivity.java
@@ -161,7 +161,7 @@
             return;
         }
 
-        long fileSize = Integer.valueOf(fileSizeEditTextValue) * mSizeMultiplier;
+        long fileSize = Integer.parseInt(fileSizeEditTextValue) * mSizeMultiplier;
 
         if (mFileStorage == FileStorage.EXTERNAL && !Utils.isExternalStorageAvailable()) {
             Toast toast = Toast.makeText(this,
diff --git a/content/AutoBackupForApps/gradle/wrapper/gradle-wrapper.properties b/content/AutoBackupForApps/gradle/wrapper/gradle-wrapper.properties
index 07fc193..03c59c2 100644
--- a/content/AutoBackupForApps/gradle/wrapper/gradle-wrapper.properties
+++ b/content/AutoBackupForApps/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=http\://services.gradle.org/distributions/gradle-2.10-bin.zip
diff --git a/content/DirectShare/gradle/wrapper/gradle-wrapper.properties b/content/DirectShare/gradle/wrapper/gradle-wrapper.properties
index 07fc193..03c59c2 100644
--- a/content/DirectShare/gradle/wrapper/gradle-wrapper.properties
+++ b/content/DirectShare/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=http\://services.gradle.org/distributions/gradle-2.10-bin.zip
diff --git a/content/WidgetData/gradle/wrapper/gradle-wrapper.properties b/content/WidgetData/gradle/wrapper/gradle-wrapper.properties
index 410f92a..522409b 100644
--- a/content/WidgetData/gradle/wrapper/gradle-wrapper.properties
+++ b/content/WidgetData/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/content/contacts/BasicContactables/gradle/wrapper/gradle-wrapper.properties b/content/contacts/BasicContactables/gradle/wrapper/gradle-wrapper.properties
index 07fc193..6cce24a 100644
--- a/content/contacts/BasicContactables/gradle/wrapper/gradle-wrapper.properties
+++ b/content/contacts/BasicContactables/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,7 @@
+
 #Wed Apr 10 15:27:10 PDT 2013
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/content/documentsUi/DirectorySelection/gradle/wrapper/gradle-wrapper.properties b/content/documentsUi/DirectorySelection/gradle/wrapper/gradle-wrapper.properties
index 263f57d..3e29ec9 100644
--- a/content/documentsUi/DirectorySelection/gradle/wrapper/gradle-wrapper.properties
+++ b/content/documentsUi/DirectorySelection/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/content/documentsUi/ScopedDirectoryAccess/Application/.gitignore b/content/documentsUi/ScopedDirectoryAccess/Application/.gitignore
new file mode 100644
index 0000000..6eb878d
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/Application/.gitignore
@@ -0,0 +1,16 @@
+# Copyright 2013 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.
+src/template/
+src/common/
+build.gradle
diff --git a/content/documentsUi/ScopedDirectoryAccess/Application/proguard-project.txt b/content/documentsUi/ScopedDirectoryAccess/Application/proguard-project.txt
new file mode 100644
index 0000000..f2fe155
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/Application/proguard-project.txt
@@ -0,0 +1,20 @@
+# To enable ProGuard in your project, edit project.properties
+# to define the proguard.config property as described in that file.
+#
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in ${sdk.dir}/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the ProGuard
+# include property in project.properties.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}
diff --git a/content/documentsUi/ScopedDirectoryAccess/Application/src/androidTest/java/com/example/android/filebasedencryption/test/SampleTests.java b/content/documentsUi/ScopedDirectoryAccess/Application/src/androidTest/java/com/example/android/filebasedencryption/test/SampleTests.java
new file mode 100644
index 0000000..9a0fd5d
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/Application/src/androidTest/java/com/example/android/filebasedencryption/test/SampleTests.java
@@ -0,0 +1,56 @@
+/*
+* Copyright (C) 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.scopeddirectoryaccess.test;
+
+import com.example.android.scopeddirectoryaccess.*;
+
+import android.test.ActivityInstrumentationTestCase2;
+
+/**
+* Tests for Scoped Directory Access API sample.
+*/
+public class SampleTests extends ActivityInstrumentationTestCase2<MainActivity> {
+
+    private MainActivity mTestActivity;
+    private ScopedDirectoryAccessFragment mTestFragment;
+
+    public SampleTests() {
+        super(MainActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        // Starts the activity under test using the default Intent with:
+        // action = {@link Intent#ACTION_MAIN}
+        // flags = {@link Intent#FLAG_ACTIVITY_NEW_TASK}
+        // All other fields are null or empty.
+        mTestActivity = getActivity();
+        mTestFragment = (ScopedDirectoryAccessFragment)
+            mTestActivity.getSupportFragmentManager().getFragments().get(1);
+    }
+
+    /**
+    * Test if the test fixture has been set up correctly.
+    */
+    public void testPreconditions() {
+        //Try to add a message to add context to your assertions. These messages will be shown if
+        //a tests fails and make it easy to understand why a test failed
+        assertNotNull("mTestActivity is null", mTestActivity);
+        assertNotNull("mTestFragment is null", mTestFragment);
+    }
+}
diff --git a/content/documentsUi/ScopedDirectoryAccess/Application/src/main/AndroidManifest.xml b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..b82d1ae
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/AndroidManifest.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?><!--
+ Copyright 2013 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.example.android.scopeddirectoryaccess"
+    android:versionCode="1"
+    android:versionName="1.0">
+
+    <application
+        android:allowBackup="true"
+        android:label="@string/app_name"
+        android:icon="@mipmap/ic_launcher"
+        android:theme="@style/AppTheme">
+
+        <activity
+            android:name=".MainActivity"
+            android:label="@string/app_name">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+    </application>
+</manifest>
diff --git a/content/documentsUi/ScopedDirectoryAccess/Application/src/main/java/com/example/android/scopeddirectoryaccess/DirectoryEntry.java b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/java/com/example/android/scopeddirectoryaccess/DirectoryEntry.java
new file mode 100644
index 0000000..0eb06da
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/java/com/example/android/scopeddirectoryaccess/DirectoryEntry.java
@@ -0,0 +1,59 @@
+/*
+* Copyright (C) 2014 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.scopeddirectoryaccess;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Entity class that represents a directory entry.
+ */
+public class DirectoryEntry implements Parcelable {
+    public String fileName;
+    public String mimeType;
+
+    public DirectoryEntry() {}
+
+    protected DirectoryEntry(Parcel in) {
+        fileName = in.readString();
+        mimeType = in.readString();
+    }
+
+    public static final Creator<DirectoryEntry> CREATOR = new Creator<DirectoryEntry>() {
+        @Override
+        public DirectoryEntry createFromParcel(Parcel in) {
+            return new DirectoryEntry(in);
+        }
+
+        @Override
+        public DirectoryEntry[] newArray(int size) {
+            return new DirectoryEntry[size];
+        }
+    };
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel parcel, int i) {
+        parcel.writeString(fileName);
+        parcel.writeString(mimeType);
+    }
+}
+
diff --git a/content/documentsUi/ScopedDirectoryAccess/Application/src/main/java/com/example/android/scopeddirectoryaccess/DirectoryEntryAdapter.java b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/java/com/example/android/scopeddirectoryaccess/DirectoryEntryAdapter.java
new file mode 100644
index 0000000..3d9e43a
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/java/com/example/android/scopeddirectoryaccess/DirectoryEntryAdapter.java
@@ -0,0 +1,75 @@
+package com.example.android.scopeddirectoryaccess;
+
+import android.provider.DocumentsContract;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Provide views to RecyclerView with the directory entries.
+ */
+public class DirectoryEntryAdapter extends RecyclerView.Adapter<DirectoryEntryAdapter.ViewHolder> {
+
+    private List<DirectoryEntry> mDirectoryEntries;
+
+    public DirectoryEntryAdapter() {
+        this(new ArrayList<DirectoryEntry>());
+    }
+
+    public DirectoryEntryAdapter(List<DirectoryEntry> directoryEntries) {
+        mDirectoryEntries = directoryEntries;
+    }
+
+    @Override
+    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
+        View v = LayoutInflater.from(viewGroup.getContext())
+                .inflate(R.layout.directory_entry, viewGroup, false);
+        return new ViewHolder(v);
+    }
+
+    @Override
+    public void onBindViewHolder(ViewHolder viewHolder, final int position) {
+        viewHolder.fileName.setText(mDirectoryEntries.get(position).fileName);
+        viewHolder.mimeType.setText(mDirectoryEntries.get(position).mimeType);
+
+        if (DocumentsContract.Document.MIME_TYPE_DIR
+                .equals(mDirectoryEntries.get(position).mimeType)) {
+            viewHolder.imageView.setImageResource(R.drawable.ic_directory_grey600_36dp);
+        } else {
+            viewHolder.imageView.setImageResource(R.drawable.ic_description_grey600_36dp);
+        }
+    }
+
+    @Override
+    public int getItemCount() {
+        return mDirectoryEntries.size();
+    }
+
+    public void setDirectoryEntries(List<DirectoryEntry> directoryEntries) {
+        mDirectoryEntries = directoryEntries;
+    }
+
+    /**
+     * Provide a reference to the type of views that you are using (custom ViewHolder)
+     */
+    public class ViewHolder extends RecyclerView.ViewHolder {
+
+        public TextView fileName;
+        public TextView mimeType;
+        public ImageView imageView;
+
+        public ViewHolder(View v) {
+            super(v);
+            fileName = (TextView) v.findViewById(R.id.textview_filename);
+            mimeType = (TextView) v.findViewById(R.id.textview_mimetype);
+            imageView = (ImageView) v.findViewById(R.id.imageview_entry);
+        }
+    }
+}
+
diff --git a/content/documentsUi/ScopedDirectoryAccess/Application/src/main/java/com/example/android/scopeddirectoryaccess/MainActivity.java b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/java/com/example/android/scopeddirectoryaccess/MainActivity.java
new file mode 100644
index 0000000..a80a283
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/java/com/example/android/scopeddirectoryaccess/MainActivity.java
@@ -0,0 +1,40 @@
+/*
+* 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.scopeddirectoryaccess;
+
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+
+/**
+ * Launcher Activity for the Scoped Directory Access API sample app.
+ */
+public class MainActivity extends AppCompatActivity {
+
+    private static final String FRAGMENT_TAG = ScopedDirectoryAccessFragment.class.getSimpleName();
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_main);
+
+        if (savedInstanceState == null) {
+            getSupportFragmentManager().beginTransaction()
+                    .add(R.id.container, ScopedDirectoryAccessFragment.newInstance(), FRAGMENT_TAG)
+                    .commit();
+        }
+    }
+}
\ No newline at end of file
diff --git a/content/documentsUi/ScopedDirectoryAccess/Application/src/main/java/com/example/android/scopeddirectoryaccess/ScopedDirectoryAccessFragment.java b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/java/com/example/android/scopeddirectoryaccess/ScopedDirectoryAccessFragment.java
new file mode 100644
index 0000000..08f04bc
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/java/com/example/android/scopeddirectoryaccess/ScopedDirectoryAccessFragment.java
@@ -0,0 +1,207 @@
+/*
+* 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.scopeddirectoryaccess;
+
+import android.app.Activity;
+import android.content.ContentResolver;
+import android.content.Intent;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.storage.StorageManager;
+import android.os.storage.StorageVolume;
+import android.provider.DocumentsContract;
+import android.support.v4.app.Fragment;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.Spinner;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+
+/**
+ * Fragment that displays the directory contents.
+ */
+public class ScopedDirectoryAccessFragment extends Fragment {
+
+    private static final String DIRECTORY_ENTRIES_KEY = "directory_entries";
+    private static final String SELECTED_DIRECTORY_KEY = "selected_directory";
+    private static final int OPEN_DIRECTORY_REQUEST_CODE = 1;
+
+    private static final String[] DIRECTORY_SELECTION = new String[]{
+            DocumentsContract.Document.COLUMN_DISPLAY_NAME,
+            DocumentsContract.Document.COLUMN_MIME_TYPE,
+            DocumentsContract.Document.COLUMN_DOCUMENT_ID,
+    };
+
+    private StorageManager mStorageManager;
+    private TextView mCurrentDirectoryTextView;
+    private TextView mNothingInDirectoryTextView;
+    private Spinner mDirectoriesSpinner;
+    private DirectoryEntryAdapter mAdapter;
+    private ArrayList<DirectoryEntry> mDirectoryEntries;
+
+    public static ScopedDirectoryAccessFragment newInstance() {
+        ScopedDirectoryAccessFragment fragment = new ScopedDirectoryAccessFragment();
+        return fragment;
+    }
+
+    public ScopedDirectoryAccessFragment() {
+        // Required empty public constructor
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+        mStorageManager = getActivity().getSystemService(StorageManager.class);
+    }
+
+    @Override
+    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        if (requestCode == OPEN_DIRECTORY_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
+            getActivity().getContentResolver().takePersistableUriPermission(data.getData(),
+                    Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
+            updateDirectoryEntries(data.getData());
+        }
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+            Bundle savedInstanceState) {
+        return inflater.inflate(R.layout.fragment_scoped_directory_access, container, false);
+    }
+
+    @Override
+    public void onViewCreated(final View rootView, Bundle savedInstanceState) {
+        super.onViewCreated(rootView, savedInstanceState);
+
+        mCurrentDirectoryTextView = (TextView) rootView
+                .findViewById(R.id.textview_current_directory);
+        mNothingInDirectoryTextView = (TextView) rootView
+                .findViewById(R.id.textview_nothing_in_directory);
+        Button openPictureButton = (Button) rootView.findViewById(R.id.button_open_directory);
+        openPictureButton.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                String selected = mDirectoriesSpinner.getSelectedItem().toString();
+                String directoryName = getDirectoryName(selected);
+                StorageVolume storageVolume = mStorageManager.getPrimaryVolume();
+                Intent intent = storageVolume.createAccessIntent(directoryName);
+                startActivityForResult(intent, OPEN_DIRECTORY_REQUEST_CODE);
+            }
+        });
+        RecyclerView recyclerView = (RecyclerView) rootView
+                .findViewById(R.id.recyclerview_directory_entries);
+        if (savedInstanceState != null) {
+            mDirectoryEntries = savedInstanceState.getParcelableArrayList(DIRECTORY_ENTRIES_KEY);
+            mCurrentDirectoryTextView.setText(savedInstanceState.getString(SELECTED_DIRECTORY_KEY));
+            mAdapter = new DirectoryEntryAdapter(mDirectoryEntries);
+            if (mAdapter.getItemCount() == 0) {
+                mNothingInDirectoryTextView.setVisibility(View.VISIBLE);
+            }
+        } else {
+            mDirectoryEntries = new ArrayList<>();
+            mAdapter = new DirectoryEntryAdapter();
+        }
+        recyclerView.setAdapter(mAdapter);
+        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
+        mDirectoriesSpinner = (Spinner) rootView.findViewById(R.id.spinner_directories);
+        ArrayAdapter<CharSequence> directoriesAdapter = ArrayAdapter
+                .createFromResource(getActivity(),
+                        R.array.directories, android.R.layout.simple_spinner_item);
+        directoriesAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+        mDirectoriesSpinner.setAdapter(directoriesAdapter);
+    }
+
+    @Override
+    public void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        outState.putString(SELECTED_DIRECTORY_KEY, mCurrentDirectoryTextView.getText().toString());
+        outState.putParcelableArrayList(DIRECTORY_ENTRIES_KEY, mDirectoryEntries);
+    }
+
+    private void updateDirectoryEntries(Uri uri) {
+        mDirectoryEntries.clear();
+        ContentResolver contentResolver = getActivity().getContentResolver();
+        Uri docUri = DocumentsContract.buildDocumentUriUsingTree(uri,
+                DocumentsContract.getTreeDocumentId(uri));
+        Uri childrenUri = DocumentsContract.buildChildDocumentsUriUsingTree(uri,
+                DocumentsContract.getTreeDocumentId(uri));
+
+        try (Cursor docCursor = contentResolver
+                .query(docUri, DIRECTORY_SELECTION, null, null, null)) {
+            while (docCursor != null && docCursor.moveToNext()) {
+                mCurrentDirectoryTextView.setText(docCursor.getString(docCursor.getColumnIndex(
+                        DocumentsContract.Document.COLUMN_DISPLAY_NAME)));
+            }
+        }
+
+        try (Cursor childCursor = contentResolver
+                .query(childrenUri, DIRECTORY_SELECTION, null, null, null)) {
+            while (childCursor != null && childCursor.moveToNext()) {
+                DirectoryEntry entry = new DirectoryEntry();
+                entry.fileName = childCursor.getString(childCursor.getColumnIndex(
+                        DocumentsContract.Document.COLUMN_DISPLAY_NAME));
+                entry.mimeType = childCursor.getString(childCursor.getColumnIndex(
+                        DocumentsContract.Document.COLUMN_MIME_TYPE));
+                mDirectoryEntries.add(entry);
+            }
+
+            if (mDirectoryEntries.isEmpty()) {
+                mNothingInDirectoryTextView.setVisibility(View.VISIBLE);
+            } else {
+                mNothingInDirectoryTextView.setVisibility(View.GONE);
+            }
+            mAdapter.setDirectoryEntries(mDirectoryEntries);
+            mAdapter.notifyDataSetChanged();
+        }
+    }
+
+    private String getDirectoryName(String name) {
+        switch (name) {
+            case "ALARMS":
+                return Environment.DIRECTORY_ALARMS;
+            case "DCIM":
+                return Environment.DIRECTORY_DCIM;
+            case "DOCUMENTS":
+                return Environment.DIRECTORY_DOCUMENTS;
+            case "DOWNLOADS":
+                return Environment.DIRECTORY_DOWNLOADS;
+            case "MOVIES":
+                return Environment.DIRECTORY_MOVIES;
+            case "MUSIC":
+                return Environment.DIRECTORY_MUSIC;
+            case "NOTIFICATIONS":
+                return Environment.DIRECTORY_NOTIFICATIONS;
+            case "PICTURES":
+                return Environment.DIRECTORY_PICTURES;
+            case "PODCASTS":
+                return Environment.DIRECTORY_PODCASTS;
+            case "RINGTONES":
+                return Environment.DIRECTORY_RINGTONES;
+            default:
+                throw new IllegalArgumentException("Invalid directory representation: " + name);
+        }
+    }
+}
diff --git a/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/drawable-hdpi/ic_description_grey600_36dp.png b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/drawable-hdpi/ic_description_grey600_36dp.png
new file mode 100644
index 0000000..1524fca
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/drawable-hdpi/ic_description_grey600_36dp.png
Binary files differ
diff --git a/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/drawable-hdpi/ic_directory_grey600_36dp.png b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/drawable-hdpi/ic_directory_grey600_36dp.png
new file mode 100644
index 0000000..f9403da
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/drawable-hdpi/ic_directory_grey600_36dp.png
Binary files differ
diff --git a/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/drawable-mdpi/ic_description_grey600_36dp.png b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/drawable-mdpi/ic_description_grey600_36dp.png
new file mode 100644
index 0000000..eca3020
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/drawable-mdpi/ic_description_grey600_36dp.png
Binary files differ
diff --git a/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/drawable-mdpi/ic_directory_grey600_36dp.png b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/drawable-mdpi/ic_directory_grey600_36dp.png
new file mode 100644
index 0000000..dd0d913
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/drawable-mdpi/ic_directory_grey600_36dp.png
Binary files differ
diff --git a/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/drawable-xhdpi/ic_description_grey600_36dp.png b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/drawable-xhdpi/ic_description_grey600_36dp.png
new file mode 100644
index 0000000..d5c37f2
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/drawable-xhdpi/ic_description_grey600_36dp.png
Binary files differ
diff --git a/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/drawable-xhdpi/ic_directory_grey600_36dp.png b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/drawable-xhdpi/ic_directory_grey600_36dp.png
new file mode 100644
index 0000000..e80139d
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/drawable-xhdpi/ic_directory_grey600_36dp.png
Binary files differ
diff --git a/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/drawable-xxhdpi/ic_description_grey600_36dp.png b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/drawable-xxhdpi/ic_description_grey600_36dp.png
new file mode 100644
index 0000000..fc765f0
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/drawable-xxhdpi/ic_description_grey600_36dp.png
Binary files differ
diff --git a/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/drawable-xxhdpi/ic_directory_grey600_36dp.png b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/drawable-xxhdpi/ic_directory_grey600_36dp.png
new file mode 100644
index 0000000..240060b
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/drawable-xxhdpi/ic_directory_grey600_36dp.png
Binary files differ
diff --git a/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/drawable-xxxhdpi/ic_description_grey600_36dp.png b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/drawable-xxxhdpi/ic_description_grey600_36dp.png
new file mode 100644
index 0000000..c3e6591
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/drawable-xxxhdpi/ic_description_grey600_36dp.png
Binary files differ
diff --git a/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/drawable-xxxhdpi/ic_directory_grey600_36dp.png b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/drawable-xxxhdpi/ic_directory_grey600_36dp.png
new file mode 100644
index 0000000..e1c2f0a
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/drawable-xxxhdpi/ic_directory_grey600_36dp.png
Binary files differ
diff --git a/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/layout/activity_main.xml b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/layout/activity_main.xml
new file mode 100755
index 0000000..e77f459
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/layout/activity_main.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ 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.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/container"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context="com.example.android.scopeddirectoryaccess.MainActivity"
+    tools:ignore="MergeRootFrame" />
diff --git a/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/layout/directory_entry.xml b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/layout/directory_entry.xml
new file mode 100644
index 0000000..340fdf1
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/layout/directory_entry.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="@dimen/directory_item_height"
+    android:orientation="horizontal"
+    android:layout_centerVertical="true"
+    android:gravity="center_vertical">
+
+    <ImageView
+        android:id="@+id/imageview_entry"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:src="@drawable/ic_directory_grey600_36dp" />
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="@dimen/margin_medium"
+        android:orientation="vertical">
+
+        <View
+            android:id="@+id/divisor"
+            android:layout_width="match_parent"
+            android:layout_height="1dp"
+            android:background="#aaaaaa" />
+
+        <TextView
+            android:id="@+id/textview_filename"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textColor="#000000" />
+
+        <TextView
+            android:id="@+id/textview_mimetype"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content" />
+
+    </LinearLayout>
+</LinearLayout>
diff --git a/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/layout/fragment_scoped_directory_access.xml b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/layout/fragment_scoped_directory_access.xml
new file mode 100644
index 0000000..3104e9b
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/layout/fragment_scoped_directory_access.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ 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.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:gravity="center_vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:padding="@dimen/margin_medium">
+
+    <LinearLayout android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal"
+        >
+
+        <Spinner
+            android:id="@+id/spinner_directories"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content" />
+
+        <Button android:id="@+id/button_open_directory"
+            android:text="@string/open_directory"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+    </LinearLayout>
+
+    <LinearLayout android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal"
+        android:layout_marginStart="@dimen/margin_small"
+        android:layout_marginEnd="@dimen/margin_small"
+        >
+
+        <TextView android:id="@+id/label_current_directory"
+            android:text="@string/selected_directory"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+        <TextView android:id="@+id/textview_current_directory"
+            android:enabled="false"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textColor="#000000"
+            />
+
+    </LinearLayout>
+
+    <TextView
+        android:id="@+id/textview_nothing_in_directory"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="@dimen/margin_small"
+        android:layout_marginTop="@dimen/margin_medium"
+        android:text="@string/nothing_in_directory"
+        android:visibility="gone"
+        />
+
+    <android.support.v7.widget.RecyclerView
+        android:id="@+id/recyclerview_directory_entries"
+        android:layout_marginStart="@dimen/margin_small"
+        android:layout_marginEnd="@dimen/margin_small"
+        android:scrollbars="vertical"
+        android:drawSelectorOnTop="true"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        app:layoutManager="LinearLayoutManager"
+        />
+
+</LinearLayout>
+
diff --git a/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/mipmap-hdpi/ic_launcher.png b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..f3a35bf
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/mipmap-hdpi/ic_launcher.png
Binary files differ
diff --git a/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/mipmap-mdpi/ic_launcher.png b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..c77f7e8
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/mipmap-mdpi/ic_launcher.png
Binary files differ
diff --git a/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/mipmap-xhdpi/ic_launcher.png b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..7a328e0
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/mipmap-xhdpi/ic_launcher.png
Binary files differ
diff --git a/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/mipmap-xxhdpi/ic_launcher.png b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..59a1bf7
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/mipmap-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..b35ede1
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Binary files differ
diff --git a/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/values/dimens.xml b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..82b5dd2
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/values/dimens.xml
@@ -0,0 +1,18 @@
+<!--
+  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.
+  -->
+<resources>
+    <dimen name="directory_item_height">72dp</dimen>
+</resources>
\ No newline at end of file
diff --git a/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/values/strings.xml b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/values/strings.xml
new file mode 100644
index 0000000..a400246
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/Application/src/main/res/values/strings.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+-->
+
+<resources>
+    <string name="open_directory">Open</string>
+    <string name="selected_directory">Selected directory:\ </string>
+    <string name="nothing_in_directory">Nothing in the directory</string>
+    <string-array name="directories">
+        <item>ALARMS</item>
+        <item>DCIM</item>
+        <item>DOCUMENTS</item>
+        <item>DOWNLOADS</item>
+        <item>MOVIES</item>
+        <item>MUSIC</item>
+        <item>NOTIFICATIONS</item>
+        <item>PICTURES</item>
+        <item>PODCASTS</item>
+        <item>RINGTONES</item>
+    </string-array>
+</resources>
\ No newline at end of file
diff --git a/content/documentsUi/ScopedDirectoryAccess/build.gradle b/content/documentsUi/ScopedDirectoryAccess/build.gradle
new file mode 100644
index 0000000..b95a860
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/build.gradle
@@ -0,0 +1,12 @@
+
+
+// BEGIN_EXCLUDE
+import com.example.android.samples.build.SampleGenPlugin
+apply plugin: SampleGenPlugin
+
+samplegen {
+  pathToBuild "../../../../../build"
+  pathToSamplesCommon "../../../common"
+}
+apply from: "../../../../../build/build.gradle"
+// END_EXCLUDE
diff --git a/content/documentsUi/ScopedDirectoryAccess/buildSrc/build.gradle b/content/documentsUi/ScopedDirectoryAccess/buildSrc/build.gradle
new file mode 100644
index 0000000..7c150e4
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/buildSrc/build.gradle
@@ -0,0 +1,16 @@
+
+repositories {
+    jcenter()
+}
+dependencies {
+    compile 'org.freemarker:freemarker:2.3.20'
+}
+
+sourceSets {
+    main {
+        groovy {
+            srcDir new File(rootDir, "../../../../../../build/buildSrc/src/main/groovy")
+        }
+    }
+}
+
diff --git a/content/documentsUi/ScopedDirectoryAccess/gradle/wrapper/gradle-wrapper.jar b/content/documentsUi/ScopedDirectoryAccess/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..8c0fb64
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/content/documentsUi/ScopedDirectoryAccess/gradle/wrapper/gradle-wrapper.properties b/content/documentsUi/ScopedDirectoryAccess/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..36a3111
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Mon Feb 08 18:26:13 JST 2016
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=http\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/content/documentsUi/ScopedDirectoryAccess/gradlew b/content/documentsUi/ScopedDirectoryAccess/gradlew
new file mode 100755
index 0000000..91a7e26
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/gradlew
@@ -0,0 +1,164 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+    echo "$*"
+}
+
+die ( ) {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+esac
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched.
+if $cygwin ; then
+    [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+fi
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >&-
+APP_HOME="`pwd -P`"
+cd "$SAVED" >&-
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+    JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/content/documentsUi/ScopedDirectoryAccess/gradlew.bat b/content/documentsUi/ScopedDirectoryAccess/gradlew.bat
new file mode 100644
index 0000000..aec9973
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/gradlew.bat
@@ -0,0 +1,90 @@
+@if "%DEBUG%" == "" @echo off

+@rem ##########################################################################

+@rem

+@rem  Gradle startup script for Windows

+@rem

+@rem ##########################################################################

+

+@rem Set local scope for the variables with windows NT shell

+if "%OS%"=="Windows_NT" setlocal

+

+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.

+set DEFAULT_JVM_OPTS=

+

+set DIRNAME=%~dp0

+if "%DIRNAME%" == "" set DIRNAME=.

+set APP_BASE_NAME=%~n0

+set APP_HOME=%DIRNAME%

+

+@rem Find java.exe

+if defined JAVA_HOME goto findJavaFromJavaHome

+

+set JAVA_EXE=java.exe

+%JAVA_EXE% -version >NUL 2>&1

+if "%ERRORLEVEL%" == "0" goto init

+

+echo.

+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

+echo.

+echo Please set the JAVA_HOME variable in your environment to match the

+echo location of your Java installation.

+

+goto fail

+

+:findJavaFromJavaHome

+set JAVA_HOME=%JAVA_HOME:"=%

+set JAVA_EXE=%JAVA_HOME%/bin/java.exe

+

+if exist "%JAVA_EXE%" goto init

+

+echo.

+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%

+echo.

+echo Please set the JAVA_HOME variable in your environment to match the

+echo location of your Java installation.

+

+goto fail

+

+:init

+@rem Get command-line arguments, handling Windowz variants

+

+if not "%OS%" == "Windows_NT" goto win9xME_args

+if "%@eval[2+2]" == "4" goto 4NT_args

+

+:win9xME_args

+@rem Slurp the command line arguments.

+set CMD_LINE_ARGS=

+set _SKIP=2

+

+:win9xME_args_slurp

+if "x%~1" == "x" goto execute

+

+set CMD_LINE_ARGS=%*

+goto execute

+

+:4NT_args

+@rem Get arguments from the 4NT Shell from JP Software

+set CMD_LINE_ARGS=%$

+

+:execute

+@rem Setup the command line

+

+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar

+

+@rem Execute Gradle

+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%

+

+:end

+@rem End local scope for the variables with windows NT shell

+if "%ERRORLEVEL%"=="0" goto mainEnd

+

+:fail

+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of

+rem the _cmd.exe /c_ return code!

+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1

+exit /b 1

+

+:mainEnd

+if "%OS%"=="Windows_NT" endlocal

+

+:omega

diff --git a/content/documentsUi/ScopedDirectoryAccess/screenshots/1.png b/content/documentsUi/ScopedDirectoryAccess/screenshots/1.png
new file mode 100644
index 0000000..7703234
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/screenshots/1.png
Binary files differ
diff --git a/content/documentsUi/ScopedDirectoryAccess/screenshots/2.png b/content/documentsUi/ScopedDirectoryAccess/screenshots/2.png
new file mode 100644
index 0000000..064c9f9
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/screenshots/2.png
Binary files differ
diff --git a/content/documentsUi/ScopedDirectoryAccess/screenshots/3.png b/content/documentsUi/ScopedDirectoryAccess/screenshots/3.png
new file mode 100644
index 0000000..e40a221
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/screenshots/3.png
Binary files differ
diff --git a/content/documentsUi/ScopedDirectoryAccess/screenshots/icon-web.png b/content/documentsUi/ScopedDirectoryAccess/screenshots/icon-web.png
new file mode 100644
index 0000000..0d24ee8
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/screenshots/icon-web.png
Binary files differ
diff --git a/content/documentsUi/ScopedDirectoryAccess/settings.gradle b/content/documentsUi/ScopedDirectoryAccess/settings.gradle
new file mode 100644
index 0000000..0a5c310
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/settings.gradle
@@ -0,0 +1,2 @@
+
+include 'Application'
diff --git a/content/documentsUi/ScopedDirectoryAccess/template-params.xml b/content/documentsUi/ScopedDirectoryAccess/template-params.xml
new file mode 100644
index 0000000..5c9bedb
--- /dev/null
+++ b/content/documentsUi/ScopedDirectoryAccess/template-params.xml
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+-->
+
+<sample>
+    <name>ScopedDirectoryAccess</name>
+    <group>Android N Preview</group>  <!-- This field will be deprecated in the future
+                            and replaced with the "categories" tags below. -->
+    <package>com.example.android.scopeddirectoryaccess</package>
+
+    <!-- change minSdk if needed-->
+    <minSdk>"N"</minSdk>
+    <targetSdkVersion>"N"</targetSdkVersion>
+    <compileSdkVersion>"android-N"</compileSdkVersion>
+
+    <!-- Include additional dependencies here.-->
+    <dependency>com.android.support:appcompat-v7:24.0.0-alpha1</dependency>
+    <dependency>com.android.support:recyclerview-v7:24.0.0-alpha1</dependency>
+    <dependency>com.android.support:support-v4:24.0.0-alpha1</dependency>
+
+    <template src="base" />
+
+    <strings>
+        <intro>
+<![CDATA[
+This sample demonstrates how to use the Scoped Directory Access API introduced in Android N
+to easily access to specific directories such as Pictures, Downloads instead of requesting
+READ_EXTERNAL_STORAGE or WRITE_EXTERNAL_STORAGE in your manifest.
+]]>
+        </intro>
+    </strings>
+
+    <metadata>
+        <status>PUBLISHED</status>
+        <categories>Android N Preview</categories>
+        <technologies>Android</technologies>
+        <languages>Java</languages>
+        <solutions>Mobile</solutions>
+        <level>BEGINNER</level>
+        <icon>screenshots/icon-web.png</icon>
+        <screenshots>
+            <img>screenshots/1.png</img>
+            <img>screenshots/2.png</img>
+            <img>screenshots/3.png</img>
+        </screenshots>
+        <api_refs>
+            <android>android.os.storage.StorageManager</android>
+            <android>android.os.storage.StorageVolume</android>
+        </api_refs>
+
+        <description>
+<![CDATA[
+This sample demonstrates how to use the Scoped Directory Access API introduced in Android N
+to easily access to specific directories such as Pictures, Downloads instead of requesting
+READ_EXTERNAL_STORAGE or WRITE_EXTERNAL_STORAGE in your manifest.
+]]>
+        </description>
+
+        <!-- Multi-paragraph introduction to sample, from an educational point-of-view.
+        Makrdown formatting allowed. This will be used to generate a mini-article for the
+        sample on DAC. -->
+        <intro>
+<![CDATA[
+This sample demonstrates how to use the Scoped Directory Access API that provides easy way to
+access specific directories instead of:
+ - Requesting READ_EXTERNAL_STORAGE or WRITE_EXTERNAL_STORAGE in your manifest, which allows
+   access to all public directories on external storage.
+ - Using the Storage Access Framework, where the user usually picks directories via a System UI,
+   which is unnecessary if you app always accesses to the same external directory.
+
+To access to a specific directory, use a new Intent created using the StorageVolume class like
+following:
+
+```
+StorageManager sm = getSystemService(StorageManager.class);
+StorageVolume volume = sm.getPrimaryVolume();
+Intent intent = volume.createAccessIntent(Environment.DIRECTORY_PICTURES);
+startActivityForResult(intent, request_code);
+```
+
+Note that the argument passed to StorageVolume.createAccessIntent needs to be one of the
+values of Environment.DIRECTORY_\*.
+
+Once the user grants the access, `onActivityResult` override will be called with a
+result code of `Activity.RESULT_OK` and an intent data that contains the URI representing
+the directory.
+]]>
+        </intro>
+    </metadata>
+</sample>
diff --git a/content/documentsUi/StorageClient/gradle/wrapper/gradle-wrapper.properties b/content/documentsUi/StorageClient/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/content/documentsUi/StorageClient/gradle/wrapper/gradle-wrapper.properties
+++ b/content/documentsUi/StorageClient/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/content/documentsUi/StorageProvider/gradle/wrapper/gradle-wrapper.properties b/content/documentsUi/StorageProvider/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/content/documentsUi/StorageProvider/gradle/wrapper/gradle-wrapper.properties
+++ b/content/documentsUi/StorageProvider/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/content/multiuser/AppRestrictions/gradle/wrapper/gradle-wrapper.properties b/content/multiuser/AppRestrictions/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/content/multiuser/AppRestrictions/gradle/wrapper/gradle-wrapper.properties
+++ b/content/multiuser/AppRestrictions/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/content/webview/PermissionRequest/gradle/wrapper/gradle-wrapper.properties b/content/webview/PermissionRequest/gradle/wrapper/gradle-wrapper.properties
index 2b7c590..e0de4e6 100644
--- a/content/webview/PermissionRequest/gradle/wrapper/gradle-wrapper.properties
+++ b/content/webview/PermissionRequest/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/experimental/ndkSampleGen/gradle/wrapper/gradle-wrapper.properties b/experimental/ndkSampleGen/gradle/wrapper/gradle-wrapper.properties
index f9ac955..65219cc 100644
--- a/experimental/ndkSampleGen/gradle/wrapper/gradle-wrapper.properties
+++ b/experimental/ndkSampleGen/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/input/gestures/BasicGestureDetect/gradle/wrapper/gradle-wrapper.properties b/input/gestures/BasicGestureDetect/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/input/gestures/BasicGestureDetect/gradle/wrapper/gradle-wrapper.properties
+++ b/input/gestures/BasicGestureDetect/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/input/multitouch/BasicMultitouch/gradle/wrapper/gradle-wrapper.properties b/input/multitouch/BasicMultitouch/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/input/multitouch/BasicMultitouch/gradle/wrapper/gradle-wrapper.properties
+++ b/input/multitouch/BasicMultitouch/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/media/BasicMediaDecoder/gradle/wrapper/gradle-wrapper.properties b/media/BasicMediaDecoder/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/media/BasicMediaDecoder/gradle/wrapper/gradle-wrapper.properties
+++ b/media/BasicMediaDecoder/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/media/BasicMediaRouter/gradle/wrapper/gradle-wrapper.properties b/media/BasicMediaRouter/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/media/BasicMediaRouter/gradle/wrapper/gradle-wrapper.properties
+++ b/media/BasicMediaRouter/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/media/Camera2Basic/README.md b/media/Camera2Basic/README.md
index 311e5bb..cee7178 100644
--- a/media/Camera2Basic/README.md
+++ b/media/Camera2Basic/README.md
@@ -43,7 +43,7 @@
 --------------
 
 - Android SDK v23
-- Android Build Tools v23.0.2
+- Android Build Tools v23.0.1
 - Android Support Repository
 
 Screenshots
diff --git a/media/Camera2Basic/gradle/wrapper/gradle-wrapper.properties b/media/Camera2Basic/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/media/Camera2Basic/gradle/wrapper/gradle-wrapper.properties
+++ b/media/Camera2Basic/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/media/Camera2Raw/Application/src/main/java/com/example/android/camera2raw/Camera2RawFragment.java b/media/Camera2Raw/Application/src/main/java/com/example/android/camera2raw/Camera2RawFragment.java
index bf5efe5..341cc72 100644
--- a/media/Camera2Raw/Application/src/main/java/com/example/android/camera2raw/Camera2RawFragment.java
+++ b/media/Camera2Raw/Application/src/main/java/com/example/android/camera2raw/Camera2RawFragment.java
@@ -442,7 +442,10 @@
                     case STATE_WAITING_FOR_3A_CONVERGENCE: {
                         boolean readyToCapture = true;
                         if (!mNoAFRun) {
-                            int afState = result.get(CaptureResult.CONTROL_AF_STATE);
+                            Integer afState = result.get(CaptureResult.CONTROL_AF_STATE);
+                            if (afState == null) {
+                                break;
+                            }
 
                             // If auto-focus has reached locked state, we are ready to capture
                             readyToCapture =
@@ -454,8 +457,11 @@
                         // auto-exposure and auto-white-balance have converged as well before
                         // taking a picture.
                         if (!isLegacyLocked()) {
-                            int aeState = result.get(CaptureResult.CONTROL_AE_STATE);
-                            int awbState = result.get(CaptureResult.CONTROL_AWB_STATE);
+                            Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
+                            Integer awbState = result.get(CaptureResult.CONTROL_AWB_STATE);
+                            if (aeState == null || awbState == null) {
+                                break;
+                            }
 
                             readyToCapture = readyToCapture &&
                                     aeState == CaptureResult.CONTROL_AE_STATE_CONVERGED &&
diff --git a/media/Camera2Raw/gradle/wrapper/gradle-wrapper.properties b/media/Camera2Raw/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/media/Camera2Raw/gradle/wrapper/gradle-wrapper.properties
+++ b/media/Camera2Raw/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/media/Camera2Video/gradle/wrapper/gradle-wrapper.properties b/media/Camera2Video/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/media/Camera2Video/gradle/wrapper/gradle-wrapper.properties
+++ b/media/Camera2Video/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/media/HdrViewfinder/gradle/wrapper/gradle-wrapper.properties b/media/HdrViewfinder/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/media/HdrViewfinder/gradle/wrapper/gradle-wrapper.properties
+++ b/media/HdrViewfinder/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/media/MediaBrowserService/gradle/wrapper/gradle-wrapper.properties b/media/MediaBrowserService/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/media/MediaBrowserService/gradle/wrapper/gradle-wrapper.properties
+++ b/media/MediaBrowserService/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/media/MediaEffects/gradle/wrapper/gradle-wrapper.properties b/media/MediaEffects/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/media/MediaEffects/gradle/wrapper/gradle-wrapper.properties
+++ b/media/MediaEffects/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/media/MediaRecorder/gradle/wrapper/gradle-wrapper.properties b/media/MediaRecorder/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/media/MediaRecorder/gradle/wrapper/gradle-wrapper.properties
+++ b/media/MediaRecorder/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/media/MediaRouter/gradle/wrapper/gradle-wrapper.properties b/media/MediaRouter/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/media/MediaRouter/gradle/wrapper/gradle-wrapper.properties
+++ b/media/MediaRouter/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/media/MidiScope/gradle/wrapper/gradle-wrapper.properties b/media/MidiScope/gradle/wrapper/gradle-wrapper.properties
index 07fc193..03c59c2 100644
--- a/media/MidiScope/gradle/wrapper/gradle-wrapper.properties
+++ b/media/MidiScope/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=http\://services.gradle.org/distributions/gradle-2.10-bin.zip
diff --git a/media/MidiSynth/gradle/wrapper/gradle-wrapper.properties b/media/MidiSynth/gradle/wrapper/gradle-wrapper.properties
index 07fc193..03c59c2 100644
--- a/media/MidiSynth/gradle/wrapper/gradle-wrapper.properties
+++ b/media/MidiSynth/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=http\://services.gradle.org/distributions/gradle-2.10-bin.zip
diff --git a/media/ScreenCapture/gradle/wrapper/gradle-wrapper.properties b/media/ScreenCapture/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/media/ScreenCapture/gradle/wrapper/gradle-wrapper.properties
+++ b/media/ScreenCapture/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/notification/ActiveNotifications/Application/src/main/AndroidManifest.xml b/notification/ActiveNotifications/Application/src/main/AndroidManifest.xml
index 3a39282..022e211 100644
--- a/notification/ActiveNotifications/Application/src/main/AndroidManifest.xml
+++ b/notification/ActiveNotifications/Application/src/main/AndroidManifest.xml
@@ -24,7 +24,7 @@
         android:icon="@mipmap/ic_launcher"
         android:theme="@style/AppTheme">
 
-        <activity android:name=".ActiveNotificationActivity"
+        <activity android:name=".ActiveNotificationsActivity"
                   android:label="@string/app_name">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
diff --git a/notification/ActiveNotifications/Application/src/main/java/com/example/android/activenotifications/ActiveNotificationFragment.java b/notification/ActiveNotifications/Application/src/main/java/com/example/android/activenotifications/ActiveNotificationFragment.java
deleted file mode 100644
index 3e87849..0000000
--- a/notification/ActiveNotifications/Application/src/main/java/com/example/android/activenotifications/ActiveNotificationFragment.java
+++ /dev/null
@@ -1,124 +0,0 @@
-package com.example.android.activenotifications;
-/*
-* Copyright 2015 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.
-*/
-
-import android.app.Notification;
-import android.app.NotificationManager;
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.service.notification.StatusBarNotification;
-import android.support.v4.app.Fragment;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.TextView;
-
-import com.example.android.common.logger.Log;
-
-/**
- * A fragment that enables display of notifications.
- */
-public class ActiveNotificationFragment extends Fragment {
-
-    private static final String TAG = "ActiveNotificationFragment";
-
-    private NotificationManager mNotificationManager;
-    private TextView mNumberOfNotifications;
-
-    // Every notification needs a unique ID otherwise the previous one would be overwritten.
-    private int mNotificationId = 0;
-    private PendingIntent mDeletePendingIntent;
-
-    @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container,
-            Bundle savedInstanceState) {
-        return inflater.inflate(R.layout.fragment_notification_builder, container, false);
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-        updateNumberOfNotifications();
-    }
-
-    @Override
-    public void onViewCreated(View view, Bundle savedInstanceState) {
-        super.onViewCreated(view, savedInstanceState);
-        mNotificationManager = (NotificationManager) getActivity().getSystemService(
-                Context.NOTIFICATION_SERVICE);
-        mNumberOfNotifications = (TextView) view.findViewById(R.id.number_of_notifications);
-
-        // Supply actions to the button that is displayed on screen.
-        View.OnClickListener onClickListener = new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                switch (v.getId()) {
-                    case R.id.add_notification: {
-                        addNotificationAndReadNumber();
-                        break;
-                    }
-                }
-            }
-        };
-        view.findViewById(R.id.add_notification).setOnClickListener(onClickListener);
-
-        // [BEGIN create_pending_intent_for_deletion]
-        // Create a PendingIntent to be fired upon deletion of a Notification.
-        Intent deleteIntent = new Intent(ActiveNotificationActivity.ACTION_NOTIFICATION_DELETE);
-        mDeletePendingIntent = PendingIntent.getBroadcast(getActivity(),
-                2323 /* requestCode */, deleteIntent, 0);
-        // [END create_pending_intent_for_deletion]
-    }
-
-    /**
-     * Add a new {@link Notification} with sample data and send it to the system.
-     * Then read the current number of displayed notifications for this application.
-     */
-    private void addNotificationAndReadNumber() {
-        // [BEGIN create_notification]
-        // Create a Notification and notify the system.
-        final Notification.Builder builder = new Notification.Builder(getActivity())
-                .setSmallIcon(R.mipmap.ic_notification)
-                .setContentTitle(getString(R.string.app_name))
-                .setContentText(getString(R.string.sample_notification_content))
-                .setAutoCancel(true)
-                .setDeleteIntent(mDeletePendingIntent);
-
-        final Notification notification = builder.build();
-        mNotificationManager.notify(++mNotificationId, notification);
-        // [END create_notification]
-        Log.i(TAG, "Add a notification");
-        updateNumberOfNotifications();
-    }
-
-    /**
-     * Request the current number of notifications from the {@link NotificationManager} and
-     * display them to the user.
-     */
-    protected void updateNumberOfNotifications() {
-        // [BEGIN get_active_notifications]
-        // Query the currently displayed notifications.
-        final StatusBarNotification[] activeNotifications = mNotificationManager
-                .getActiveNotifications();
-        // [END get_active_notifications]
-        final int numberOfNotifications = activeNotifications.length;
-        mNumberOfNotifications.setText(getString(R.string.active_notifications,
-                numberOfNotifications));
-        Log.i(TAG, getString(R.string.active_notifications, numberOfNotifications));
-    }
-}
diff --git a/notification/ActiveNotifications/Application/src/main/java/com/example/android/activenotifications/ActiveNotificationActivity.java b/notification/ActiveNotifications/Application/src/main/java/com/example/android/activenotifications/ActiveNotificationsActivity.java
similarity index 90%
rename from notification/ActiveNotifications/Application/src/main/java/com/example/android/activenotifications/ActiveNotificationActivity.java
rename to notification/ActiveNotifications/Application/src/main/java/com/example/android/activenotifications/ActiveNotificationsActivity.java
index bdb5421..637478d 100644
--- a/notification/ActiveNotifications/Application/src/main/java/com/example/android/activenotifications/ActiveNotificationActivity.java
+++ b/notification/ActiveNotifications/Application/src/main/java/com/example/android/activenotifications/ActiveNotificationsActivity.java
@@ -23,9 +23,9 @@
 import android.os.Bundle;
 import android.os.PersistableBundle;
 
-public class ActiveNotificationActivity extends MainActivity {
+public class ActiveNotificationsActivity extends MainActivity {
 
-    private ActiveNotificationFragment mFragment;
+    private ActiveNotificationsFragment mFragment;
 
     protected static final String ACTION_NOTIFICATION_DELETE
             = "com.example.android.activenotifications.delete";
@@ -48,7 +48,7 @@
     }
 
     private void findFragment() {
-        mFragment = (ActiveNotificationFragment) getSupportFragmentManager()
+        mFragment = (ActiveNotificationsFragment) getSupportFragmentManager()
                 .findFragmentById(R.id.sample_content_fragment);
     }
 
diff --git a/notification/ActiveNotifications/Application/src/main/java/com/example/android/activenotifications/ActiveNotificationsFragment.java b/notification/ActiveNotifications/Application/src/main/java/com/example/android/activenotifications/ActiveNotificationsFragment.java
new file mode 100644
index 0000000..db0dbac
--- /dev/null
+++ b/notification/ActiveNotifications/Application/src/main/java/com/example/android/activenotifications/ActiveNotificationsFragment.java
@@ -0,0 +1,193 @@
+package com.example.android.activenotifications;
+/*
+* Copyright 2015 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.
+*/
+
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.service.notification.StatusBarNotification;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.NotificationCompat;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import com.example.android.common.logger.Log;
+
+/**
+ * A fragment that allows notifications to be enqueued.
+ */
+public class ActiveNotificationsFragment extends Fragment {
+
+    /**
+     * The request code can be any number as long as it doesn't match another request code used
+     * in the same app.
+     */
+    private static final int REQUEST_CODE = 2323;
+
+    private static final String TAG = "ActiveNotificationsFragment";
+
+    private static final String NOTIFICATION_GROUP =
+            "com.example.android.activenotifications.notification_type";
+
+    private static final int NOTIFICATION_GROUP_SUMMARY_ID = 1;
+
+    private NotificationManager mNotificationManager;
+
+    private TextView mNumberOfNotifications;
+
+    // Every notification needs a unique ID otherwise the previous one would be overwritten. This
+    // variable is incremented when used.
+    private static int sNotificationId = NOTIFICATION_GROUP_SUMMARY_ID + 1;
+
+    private PendingIntent mDeletePendingIntent;
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+            Bundle savedInstanceState) {
+        return inflater.inflate(R.layout.fragment_notification_builder, container, false);
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        updateNumberOfNotifications();
+    }
+
+    @Override
+    public void onViewCreated(View view, Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+        mNotificationManager = (NotificationManager) getActivity().getSystemService(
+                Context.NOTIFICATION_SERVICE);
+        mNumberOfNotifications = (TextView) view.findViewById(R.id.number_of_notifications);
+
+        // Supply actions to the button that is displayed on screen.
+        View.OnClickListener onClickListener = new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                switch (v.getId()) {
+                    case R.id.add_notification: {
+                        addNotificationAndUpdateSummaries();
+                        break;
+                    }
+                }
+            }
+        };
+        view.findViewById(R.id.add_notification).setOnClickListener(onClickListener);
+
+        // [BEGIN create_pending_intent_for_deletion]
+        // Create a PendingIntent to be fired upon deletion of a Notification.
+        Intent deleteIntent = new Intent(ActiveNotificationsActivity.ACTION_NOTIFICATION_DELETE);
+        mDeletePendingIntent = PendingIntent.getBroadcast(getActivity(),
+                REQUEST_CODE, deleteIntent, 0);
+        // [END create_pending_intent_for_deletion]
+    }
+
+    /**
+     * Adds a new {@link Notification} with sample data and sends it to the system.
+     * Then updates the current number of displayed notifications for this application and
+     * creates a notification summary if more than one notification exists.
+     */
+    private void addNotificationAndUpdateSummaries() {
+        // [BEGIN create_notification]
+        // Create a Notification and notify the system.
+        final NotificationCompat.Builder builder = new NotificationCompat.Builder(getActivity())
+                .setSmallIcon(R.mipmap.ic_notification)
+                .setContentTitle(getString(R.string.app_name))
+                .setContentText(getString(R.string.sample_notification_content))
+                .setAutoCancel(true)
+                .setDeleteIntent(mDeletePendingIntent)
+                .setGroup(NOTIFICATION_GROUP);
+
+        final Notification notification = builder.build();
+        mNotificationManager.notify(getNewNotificationId(), notification);
+        // [END create_notification]
+        Log.i(TAG, "Add a notification");
+
+        updateNotificationSummary();
+        updateNumberOfNotifications();
+    }
+
+    /**
+     * Adds/updates/removes the notification summary as necessary.
+     */
+    protected void updateNotificationSummary() {
+        final StatusBarNotification[] activeNotifications = mNotificationManager
+                .getActiveNotifications();
+
+        int numberOfNotifications = activeNotifications.length;
+        // Since the notifications might include a summary notification remove it from the count if
+        // it is present.
+        for (StatusBarNotification notification : activeNotifications) {
+          if (notification.getId() == NOTIFICATION_GROUP_SUMMARY_ID) {
+            numberOfNotifications--;
+            break;
+          }
+        }
+
+        if (numberOfNotifications > 1) {
+            // Add/update the notification summary.
+            String notificationContent = getString(R.string.sample_notification_summary_content,
+                    "" + numberOfNotifications);
+            final NotificationCompat.Builder builder = new NotificationCompat.Builder(getActivity())
+                    .setSmallIcon(R.mipmap.ic_notification)
+                    .setStyle(new NotificationCompat.BigTextStyle()
+                            .setSummaryText(notificationContent))
+                    .setGroup(NOTIFICATION_GROUP)
+                    .setGroupSummary(true);
+            final Notification notification = builder.build();
+            mNotificationManager.notify(NOTIFICATION_GROUP_SUMMARY_ID, notification);
+        } else {
+            // Remove the notification summary.
+            mNotificationManager.cancel(NOTIFICATION_GROUP_SUMMARY_ID);
+        }
+    }
+
+    /**
+     * Requests the current number of notifications from the {@link NotificationManager} and
+     * display them to the user.
+     */
+    protected void updateNumberOfNotifications() {
+        // [BEGIN get_active_notifications]
+        // Query the currently displayed notifications.
+        final StatusBarNotification[] activeNotifications = mNotificationManager
+                .getActiveNotifications();
+        // [END get_active_notifications]
+        final int numberOfNotifications = activeNotifications.length;
+        mNumberOfNotifications.setText(getString(R.string.active_notifications,
+                numberOfNotifications));
+        Log.i(TAG, getString(R.string.active_notifications, numberOfNotifications));
+    }
+
+    /**
+     * Retrieves a unique notification ID.
+     */
+    public int getNewNotificationId() {
+        int notificationId = sNotificationId++;
+
+        // Unlikely in the sample, but the int will overflow if used enough so we skip the summary
+        // ID. Most apps will prefer a more deterministic way of identifying an ID such as hashing
+        // the content of the notification.
+        if (notificationId == NOTIFICATION_GROUP_SUMMARY_ID) {
+            notificationId = sNotificationId++;
+        }
+        return notificationId;
+    }
+}
diff --git a/notification/ActiveNotifications/Application/src/main/res/values/strings.xml b/notification/ActiveNotifications/Application/src/main/res/values/strings.xml
index 0f2977d..a4275fd 100644
--- a/notification/ActiveNotifications/Application/src/main/res/values/strings.xml
+++ b/notification/ActiveNotifications/Application/src/main/res/values/strings.xml
@@ -19,4 +19,5 @@
  <string name="active_notifications">Active Notifications: %1$s</string>
  <string name="update_notification_count">Update count</string>
  <string name="sample_notification_content">This is a sample notification.</string>
+ <string name="sample_notification_summary_content">There are %s ActiveNotifications.</string>
 </resources>
diff --git a/notification/ActiveNotifications/gradle/wrapper/gradle-wrapper.properties b/notification/ActiveNotifications/gradle/wrapper/gradle-wrapper.properties
index 07fc193..fdb8024 100644
--- a/notification/ActiveNotifications/gradle/wrapper/gradle-wrapper.properties
+++ b/notification/ActiveNotifications/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-bin.zip
diff --git a/notification/ActiveNotifications/template-params.xml b/notification/ActiveNotifications/template-params.xml
index 65fefd4..b98c5eb 100644
--- a/notification/ActiveNotifications/template-params.xml
+++ b/notification/ActiveNotifications/template-params.xml
@@ -15,58 +15,40 @@
  limitations under the License.
 -->
 <sample>
-    <name>ActiveNotification</name>
-    <group>Notification</group>  <!-- This field will be deprecated in the future
-                            and replaced with the "categories" tags below. -->
+    <name>ActiveNotifications</name>
+    <group>Android N Preview</group>
     <package>com.example.android.activenotifications</package>
 
-    <minSdk>23</minSdk>
-
-    <!-- Include additional dependencies here.-->
-    <!-- dependency>com.google.android.gms:play-services:5.0.+</dependency -->
+    <minSdk>"N"</minSdk>
+    <targetSdkVersion>"N"</targetSdkVersion>
+    <compileSdkVersion>"android-N"</compileSdkVersion>
 
     <strings>
         <intro>
             <![CDATA[
-The NotificationManager can tell you how many notifications your application is currently showing.
-This sample demonstrates how to use this API that has been introduced with Android M.
-To get started, press the "add a notification" button.
-When a notification is being canceled, the count gets updated via a PendingIntent.
+Notifications can now be grouped in Android N. Since Android M, the
+NotificationManager can tell you how many notifications your application 
+is currently showing. This sample demonstrates how to use these APIs 
+together for a nicer user experience when an app may have multiple 
+notifications. To get started, press the "add a notification" button. 
+If you add more than one notification a notification summary will be 
+added. When a notification is being canceled, the count gets updated 
+via a PendingIntent.
             ]]>
         </intro>
     </strings>
 
-    <!-- The basic templates have already been enabled. Uncomment more as desired. -->
     <template src="base" />
     <template src="FragmentView" />
     <common src="activities" />
     <common src="logger" />
 
     <metadata>
-        <!-- Values: {DRAFT | PUBLISHED | INTERNAL | DEPRECATED | SUPERCEDED} -->
         <status>DRAFT</status>
-        <!-- See http://go/sample-categories for details on the next 4 fields. -->
-        <!-- Most samples just need to udpate the Categories field. This is a comma-
-             seperated list of topic tags. Unlike the old category system, samples
-             may have multiple categories, so feel free to add extras. Try to avoid
-             simply tagging everything with "UI". :)-->
-        <categories>Getting Started, Notification</categories>
+        <categories>Getting Started, Notification, Android N Preview</categories>
         <technologies>Android</technologies>
         <languages>Java</languages>
         <solutions>Mobile</solutions>
-        <!-- Values: {BEGINNER | INTERMEDIATE | ADVANCED | EXPERT} -->
-        <!-- Beginner is for "getting started" type content, or essential content.
-             (e.g. "Hello World", activities, intents)
-
-             Intermediate is for content that covers material a beginner doesn't need
-             to know, but that a skilled developer is expected to know.
-             (e.g. services, basic styles and theming, sync adapters)
-
-             Advanced is for highly technical content geared towards experienced developers.
-             (e.g. performance optimizations, custom views, bluetooth)
-
-             Expert is reserved for highly technical or specialized content, and should
-             be used sparingly. (e.g. VPN clients, SELinux, custom instrumentation runners) -->
         <level>INTERMEDIATE</level>
         <icon>screenshots/icon-web.png</icon>
         <screenshots>
@@ -78,22 +60,33 @@
             <android>android.app.NotificationManager</android>
         </api_refs>
         <description>
-            The NotificationManager can tell you how many notifications your application is
-            currently showing. This sample demonstrates how to use this API that has been
-            introduced with Android M.
-         </description>
+<![CDATA[
+Notification Groups and the Notification Manager can be used together to simplify
+how users experience notifications. This sample demonstrates how
+the NotificationManager can tell you how many notifications your
+application is currently showing. It also shows how to manage the
+notifications as a group and introduce a summary for the group, when
+supported by the platform.
+]]>
+        </description>
         <intro>
-            The [NotificationManager][1] has become more powerful.
-            Starting with Android M, you can query it for the active notifications that
-            your app sent using the [notify][2] methods.
+<![CDATA[
+Notifications can now be grouped.
 
-            This sample demonstrates simple use of this newly added functionality by
-            allowing a user to add notifications and then querying how many notifications
-            are currently being displayed via the [getActiveNotifications()][3] method.
+Starting with Android N, you can set notification groups for notifications
+and define a notification group summary.
 
-            [1]: https://developer.android.com/reference/android/app/NotificationManager.html
-            [2]: https://developer.android.com/reference/android/app/NotificationManager.html#notify(int, android.app.Notification)
-            [2]: https://developer.android.com/reference/android/app/NotificationManager.html#getActiveNotifications()
+In Android M, you can query for the active notifications that your app sent 
+sing the [notify][2] methods.
+
+This sample demonstrates simple use of these features by allowing a user 
+to add notifications and then query how many notifications
+are currently being displayed via the [getActiveNotifications()][3] method.
+
+[1]: https://developer.android.com/reference/android/app/NotificationManager.html
+[2]: https://developer.android.com/reference/android/app/NotificationManager.html#notify(int, android.app.Notification)
+[3]: https://developer.android.com/reference/android/app/NotificationManager.html#getActiveNotifications()
+]]>
         </intro>
     </metadata>
 </sample>
diff --git a/notification/BasicNotifications/gradle/wrapper/gradle-wrapper.properties b/notification/BasicNotifications/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/notification/BasicNotifications/gradle/wrapper/gradle-wrapper.properties
+++ b/notification/BasicNotifications/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/notification/CustomNotifications/gradle/wrapper/gradle-wrapper.properties b/notification/CustomNotifications/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/notification/CustomNotifications/gradle/wrapper/gradle-wrapper.properties
+++ b/notification/CustomNotifications/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/notification/LNotifications/gradle/wrapper/gradle-wrapper.properties b/notification/LNotifications/gradle/wrapper/gradle-wrapper.properties
index 828f2e6..2fa0ecc 100644
--- a/notification/LNotifications/gradle/wrapper/gradle-wrapper.properties
+++ b/notification/LNotifications/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/notification/MessagingService/Application/src/main/java/com/example/android/messagingservice/MessageReplyReceiver.java b/notification/MessagingService/Application/src/main/java/com/example/android/messagingservice/MessageReplyReceiver.java
index 0a3eba6..7a48acf 100644
--- a/notification/MessagingService/Application/src/main/java/com/example/android/messagingservice/MessageReplyReceiver.java
+++ b/notification/MessagingService/Application/src/main/java/com/example/android/messagingservice/MessageReplyReceiver.java
@@ -16,15 +16,21 @@
 
 package com.example.android.messagingservice;
 
+import android.app.Notification;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
+import android.graphics.BitmapFactory;
 import android.os.Bundle;
+import android.support.v4.app.NotificationManagerCompat;
 import android.support.v4.app.RemoteInput;
+import android.support.v4.text.TextUtilsCompat;
+import android.support.v4.app.NotificationCompat;
+import android.text.TextUtils;
 import android.util.Log;
 
 /**
- * A receiver that gets called when a reply is sent to a given conversationId
+ * A receiver that gets called when a reply is sent to a given conversationId.
  */
 public class MessageReplyReceiver extends BroadcastReceiver {
 
@@ -39,6 +45,17 @@
                 Log.d(TAG, "Got reply (" + reply + ") for ConversationId " + conversationId);
                 MessageLogger.logMessage(context, "ConversationId: " + conversationId +
                         " received a reply: [" + reply + "]");
+
+                // Update the notification to stop the progress spinner.
+                NotificationManagerCompat notificationManager =
+                        NotificationManagerCompat.from(context);
+                Notification repliedNotification = new NotificationCompat.Builder(context)
+                        .setSmallIcon(R.drawable.notification_icon)
+                        .setLargeIcon(BitmapFactory.decodeResource(
+                                context.getResources(), R.drawable.android_contact))
+                        .setContentText(context.getString(R.string.replied))
+                        .build();
+                notificationManager.notify(conversationId, repliedNotification);
             }
         }
     }
@@ -51,7 +68,8 @@
     private CharSequence getMessageText(Intent intent) {
         Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
         if (remoteInput != null) {
-            return remoteInput.getCharSequence(MessagingService.EXTRA_VOICE_REPLY);
+            return remoteInput.getCharSequence(
+                    MessagingService.EXTRA_REMOTE_REPLY);
         }
         return null;
     }
diff --git a/notification/MessagingService/Application/src/main/java/com/example/android/messagingservice/MessagingService.java b/notification/MessagingService/Application/src/main/java/com/example/android/messagingservice/MessagingService.java
index 73199ed..77689cd 100644
--- a/notification/MessagingService/Application/src/main/java/com/example/android/messagingservice/MessagingService.java
+++ b/notification/MessagingService/Application/src/main/java/com/example/android/messagingservice/MessagingService.java
@@ -39,11 +39,10 @@
     private static final String EOL = "\n";
     private static final String READ_ACTION =
             "com.example.android.messagingservice.ACTION_MESSAGE_READ";
-
     public static final String REPLY_ACTION =
             "com.example.android.messagingservice.ACTION_MESSAGE_REPLY";
     public static final String CONVERSATION_ID = "conversation_id";
-    public static final String EXTRA_VOICE_REPLY = "extra_voice_reply";
+    public static final String EXTRA_REMOTE_REPLY = "extra_remote_reply";
     public static final int MSG_SEND_NOTIFICATION = 1;
 
     private NotificationManagerCompat mNotificationManager;
@@ -93,9 +92,10 @@
                 getMessageReadIntent(conversation.getConversationId()),
                 PendingIntent.FLAG_UPDATE_CURRENT);
 
-        // Build a RemoteInput for receiving voice input in a Car Notification
-        RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY)
-                .setLabel(getApplicationContext().getString(R.string.notification_reply))
+        // Build a RemoteInput for receiving voice input in a Car Notification or text input on
+        // devices that support text input (like devices on Android N and above).
+        RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_REMOTE_REPLY)
+                .setLabel(getString(R.string.reply))
                 .build();
 
         // Building a Pending Intent for the reply action to trigger
@@ -104,6 +104,12 @@
                 getMessageReplyIntent(conversation.getConversationId()),
                 PendingIntent.FLAG_UPDATE_CURRENT);
 
+        // Build an Android N compatible Remote Input enabled action.
+        NotificationCompat.Action actionReplyByRemoteInput = new NotificationCompat.Action.Builder(
+                R.drawable.notification_icon, getString(R.string.reply), replyIntent)
+                .addRemoteInput(remoteInput)
+                .build();
+
         // Create the UnreadConversation and populate it with the participant name,
         // read and reply intents.
         UnreadConversation.Builder unreadConvBuilder =
@@ -134,8 +140,9 @@
                 .setContentIntent(readPendingIntent)
                 .extend(new CarExtender()
                         .setUnreadConversation(unreadConvBuilder.build())
-                        .setColor(getApplicationContext()
-                                .getResources().getColor(R.color.default_color_light)));
+                        .setColor(getApplicationContext().getResources()
+                                .getColor(R.color.default_color_light)))
+                .addAction(actionReplyByRemoteInput);
 
         MessageLogger.logMessage(getApplicationContext(), "Sending notification "
                 + conversation.getConversationId() + " conversation: " + conversation);
diff --git a/notification/MessagingService/Application/src/main/res/values/strings.xml b/notification/MessagingService/Application/src/main/res/values/strings.xml
index 3f8390d..31e25ec 100644
--- a/notification/MessagingService/Application/src/main/res/values/strings.xml
+++ b/notification/MessagingService/Application/src/main/res/values/strings.xml
@@ -16,7 +16,8 @@
   -->
 <resources>
     <string name="app_name">Messaging Sample</string>
-    <string name="notification_reply">Reply by Voice</string>
+    <string name="replied">Replied</string>
+    <string name="reply">Reply</string>
     <string name="send_2_conversations">Send 2 conversations with 1 message</string>
     <string name="send_1_conversation">Send 1 conversation with 1 message</string>
     <string name="send_1_conv_3_messages">Send 1 conversation with 3 messages</string>
diff --git a/notification/MessagingService/gradle/wrapper/gradle-wrapper.properties b/notification/MessagingService/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/notification/MessagingService/gradle/wrapper/gradle-wrapper.properties
+++ b/notification/MessagingService/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/notification/MessagingService/template-params.xml b/notification/MessagingService/template-params.xml
index 9a68d74..c3aef39 100644
--- a/notification/MessagingService/template-params.xml
+++ b/notification/MessagingService/template-params.xml
@@ -16,7 +16,7 @@
 -->
 <sample>
     <name>MessagingService</name>
-    <group>Notification</group>
+    <group>Android N Preview</group>
     <package>com.example.android.messagingservice</package>
 
     <minSdk>21</minSdk>
@@ -25,9 +25,13 @@
         <intro>
             <![CDATA[
 This sample shows a simple service that sends notifications using
-NotificationCompat. In addition to sending a notification, it also extends
-the notification with a CarExtender to make it compatible with Android Auto.
-Each unread conversation from a user is sent as a distinct notification.
+NotificationCompat. It also extends the notification with Remote
+Input to allow Android N devices to reply via text directly from
+the notification without having to open an app. The same Remote
+Input usage also allows Android Auto users to respond by voice
+when the notifications is presented in that experience.
+Note: Each unread conversation from a user is sent as a distinct
+notification.
             ]]>
         </intro>
     </strings>
@@ -36,7 +40,8 @@
     <template src="base-application" />
     <metadata>
         <status>PUBLISHED</status>
-        <categories>UI, Notification</categories>
+        <categories>Android N Preview</categories>
+        <!-- Old Categories: UI, Notification -->
         <technologies>Android</technologies>
         <languages>Java</languages>
         <solutions>Mobile</solutions>
@@ -56,9 +61,13 @@
         <description>
 <![CDATA[
 This sample shows a simple service that sends notifications using
-NotificationCompat. In addition to sending a notification, it also extends
-the notification with a CarExtender to make it compatible with Android Auto.
-Each unread conversation from a user is sent as a distinct notification.
+NotificationCompat. It also extends the notification with Remote
+Input to allow Android N devices to reply via text directly from
+the notification without having to open an App. The same Remote
+Input object also allows Android Auto users to respond by voice
+when the notification is presented there.
+Note: Each unread conversation from a user is sent as a distinct
+notification.
 ]]></description>
         <intro>
             <![CDATA[
diff --git a/renderScript/BasicRenderScript/gradle/wrapper/gradle-wrapper.properties b/renderScript/BasicRenderScript/gradle/wrapper/gradle-wrapper.properties
index cb3018f..442968f 100644
--- a/renderScript/BasicRenderScript/gradle/wrapper/gradle-wrapper.properties
+++ b/renderScript/BasicRenderScript/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/renderScript/RenderScriptIntrinsic/gradle/wrapper/gradle-wrapper.properties b/renderScript/RenderScriptIntrinsic/gradle/wrapper/gradle-wrapper.properties
index d2ce766..6d297b3 100644
--- a/renderScript/RenderScriptIntrinsic/gradle/wrapper/gradle-wrapper.properties
+++ b/renderScript/RenderScriptIntrinsic/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/security/AsymmetricFingerprintDialog/gradle/wrapper/gradle-wrapper.properties b/security/AsymmetricFingerprintDialog/gradle/wrapper/gradle-wrapper.properties
index 203da3a..3ebd0d1 100644
--- a/security/AsymmetricFingerprintDialog/gradle/wrapper/gradle-wrapper.properties
+++ b/security/AsymmetricFingerprintDialog/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Mon Apr 27 11:28:32 JST 2015
+#Wed Oct 15 14:12:11 BST 2014
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/security/ConfirmCredential/gradle/wrapper/gradle-wrapper.properties b/security/ConfirmCredential/gradle/wrapper/gradle-wrapper.properties
index 07fc193..03c59c2 100644
--- a/security/ConfirmCredential/gradle/wrapper/gradle-wrapper.properties
+++ b/security/ConfirmCredential/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=http\://services.gradle.org/distributions/gradle-2.10-bin.zip
diff --git a/security/DirectBoot/Application/.gitignore b/security/DirectBoot/Application/.gitignore
new file mode 100644
index 0000000..6eb878d
--- /dev/null
+++ b/security/DirectBoot/Application/.gitignore
@@ -0,0 +1,16 @@
+# Copyright 2013 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.
+src/template/
+src/common/
+build.gradle
diff --git a/security/DirectBoot/Application/proguard-project.txt b/security/DirectBoot/Application/proguard-project.txt
new file mode 100644
index 0000000..f2fe155
--- /dev/null
+++ b/security/DirectBoot/Application/proguard-project.txt
@@ -0,0 +1,20 @@
+# To enable ProGuard in your project, edit project.properties
+# to define the proguard.config property as described in that file.
+#
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in ${sdk.dir}/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the ProGuard
+# include property in project.properties.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}
diff --git a/security/DirectBoot/Application/src/androidTest/java/com/example/android/filebasedencryption/test/SampleTests.java b/security/DirectBoot/Application/src/androidTest/java/com/example/android/filebasedencryption/test/SampleTests.java
new file mode 100644
index 0000000..5b9112d
--- /dev/null
+++ b/security/DirectBoot/Application/src/androidTest/java/com/example/android/filebasedencryption/test/SampleTests.java
@@ -0,0 +1,56 @@
+/*
+* Copyright (C) 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.test;
+
+import com.example.android.directboot.*;
+
+import android.test.ActivityInstrumentationTestCase2;
+
+/**
+* Tests for Direct Boot sample.
+*/
+public class SampleTests extends ActivityInstrumentationTestCase2<MainActivity> {
+
+    private MainActivity mTestActivity;
+    private SchedulerFragment mTestFragment;
+
+    public SampleTests() {
+        super(MainActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        // Starts the activity under test using the default Intent with:
+        // action = {@link Intent#ACTION_MAIN}
+        // flags = {@link Intent#FLAG_ACTIVITY_NEW_TASK}
+        // All other fields are null or empty.
+        mTestActivity = getActivity();
+        mTestFragment = (SchedulerFragment)
+            mTestActivity.getSupportFragmentManager().getFragments().get(1);
+    }
+
+    /**
+    * Test if the test fixture has been set up correctly.
+    */
+    public void testPreconditions() {
+        //Try to add a message to add context to your assertions. These messages will be shown if
+        //a tests fails and make it easy to understand why a test failed
+        assertNotNull("mTestActivity is null", mTestActivity);
+        assertNotNull("mTestFragment is null", mTestFragment);
+    }
+}
diff --git a/security/DirectBoot/Application/src/main/AndroidManifest.xml b/security/DirectBoot/Application/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..8d6daf9
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/AndroidManifest.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?><!--
+ Copyright 2013 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.example.android.directboot"
+    android:versionCode="1"
+    android:versionName="1.0">
+
+    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
+
+    <application
+        android:allowBackup="true"
+        android:label="@string/app_name"
+        android:icon="@mipmap/ic_launcher"
+        android:theme="@style/AppTheme"
+        >
+
+        <activity
+            android:name=".MainActivity"
+            android:label="@string/app_name"
+            >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+
+        <receiver android:name=".BootBroadcastReceiver"
+            android:exported="false"
+            android:directBootAware="true">
+            <!-- Listening the BOOT_COMPLETED action for legacy pre-N devices -->
+            <intent-filter>
+                <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
+                <action android:name="android.intent.action.BOOT_COMPLETED" />
+            </intent-filter>
+        </receiver>
+
+        <service android:name=".alarms.AlarmIntentService"
+            android:exported="false"
+            android:directBootAware="true"/>
+    </application>
+</manifest>
diff --git a/security/DirectBoot/Application/src/main/java/com/example/android/directboot/BootBroadcastReceiver.java b/security/DirectBoot/Application/src/main/java/com/example/android/directboot/BootBroadcastReceiver.java
new file mode 100644
index 0000000..6ba78f4
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/java/com/example/android/directboot/BootBroadcastReceiver.java
@@ -0,0 +1,64 @@
+/*
+* 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;
+
+import com.example.android.directboot.alarms.Alarm;
+import com.example.android.directboot.alarms.AlarmStorage;
+import com.example.android.directboot.alarms.AlarmUtil;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.support.v4.os.BuildCompat;
+import android.support.v4.os.UserManagerCompat;
+import android.util.Log;
+
+/**
+ * BroadcastReceiver that receives the following implicit broadcasts:
+ * <ul>
+ *     <li>Intent.ACTION_BOOT_COMPLETED</li>
+ *     <li>Intent.ACTION_LOCKED_BOOT_COMPLETED</li>
+ * </ul>
+ *
+ * To receive the Intent.ACTION_LOCKED_BOOT_COMPLETED broadcast, the receiver needs to have
+ * <code>directBootAware="true"</code> property in the manifest.
+ */
+public class BootBroadcastReceiver extends BroadcastReceiver {
+
+    private static final String TAG = "BootBroadcastReceiver";
+
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        boolean bootCompleted;
+        String action = intent.getAction();
+        Log.i(TAG, "Received action: " + action + ", user unlocked: " + UserManagerCompat
+                .isUserUnlocked(context));
+        if (BuildCompat.isAtLeastN()) {
+            bootCompleted = Intent.ACTION_LOCKED_BOOT_COMPLETED.equals(action);
+        } else {
+            bootCompleted = Intent.ACTION_BOOT_COMPLETED.equals(action);
+        }
+        if (!bootCompleted) {
+            return;
+        }
+        AlarmUtil util = new AlarmUtil(context);
+        AlarmStorage alarmStorage = new AlarmStorage(context);
+        for (Alarm alarm : alarmStorage.getAlarms()) {
+            util.scheduleAlarm(alarm);
+        }
+    }
+}
diff --git a/security/DirectBoot/Application/src/main/java/com/example/android/directboot/MainActivity.java b/security/DirectBoot/Application/src/main/java/com/example/android/directboot/MainActivity.java
new file mode 100644
index 0000000..1b16ee5
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/java/com/example/android/directboot/MainActivity.java
@@ -0,0 +1,37 @@
+/*
+* 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;
+
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+
+/**
+ * Launcher Activity for the Direct Boot sample app.
+ */
+public class MainActivity extends AppCompatActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_main);
+        if (savedInstanceState == null) {
+            getSupportFragmentManager().beginTransaction()
+                    .add(R.id.container, SchedulerFragment.newInstance())
+                    .commit();
+        }
+    }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..0f32c25
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/java/com/example/android/directboot/SchedulerFragment.java
@@ -0,0 +1,136 @@
+/*
+* 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;
+
+import com.example.android.directboot.alarms.Alarm;
+import com.example.android.directboot.alarms.AlarmAdapter;
+import com.example.android.directboot.alarms.AlarmIntentService;
+import com.example.android.directboot.alarms.AlarmStorage;
+import com.example.android.directboot.alarms.AlarmUtil;
+
+import android.app.Activity;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.design.widget.FloatingActionButton;
+import android.support.v4.app.Fragment;
+import android.support.v4.content.LocalBroadcastManager;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+/**
+ * Fragment that registers scheduled alarms.
+ */
+public class SchedulerFragment extends Fragment {
+
+    private static final String FRAGMENT_TIME_PICKER_TAG = "fragment_time_picker";
+
+    private AlarmAdapter mAlarmAdapter;
+    private AlarmUtil mAlarmUtil;
+    private TextView mTextViewIntroMessage;
+    private BroadcastReceiver mAlarmWentOffBroadcastReceiver;
+
+    public static SchedulerFragment newInstance() {
+        SchedulerFragment fragment = new SchedulerFragment();
+        return fragment;
+    }
+
+    public SchedulerFragment() {
+        // Required empty public constructor
+    }
+
+    @Override
+    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+        mAlarmWentOffBroadcastReceiver = new AlarmWentOffReceiver();
+        LocalBroadcastManager.getInstance(getActivity())
+                .registerReceiver(mAlarmWentOffBroadcastReceiver,
+                        new IntentFilter(AlarmIntentService.ALARM_WENT_OFF_ACTION));
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+            Bundle savedInstanceState) {
+        return inflater.inflate(R.layout.fragment_alarm_scheduler, container, false);
+    }
+
+    @Override
+    public void onViewCreated(final View rootView, Bundle savedInstanceState) {
+        super.onViewCreated(rootView, savedInstanceState);
+        FloatingActionButton fab = (FloatingActionButton) rootView.findViewById(R.id.fab_add_alarm);
+        fab.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                TimePickerFragment fragment = TimePickerFragment.newInstance();
+                fragment.setAlarmAddListener(new AlarmAddListenerImpl());
+                fragment.show(getFragmentManager(), FRAGMENT_TIME_PICKER_TAG);
+            }
+        });
+        mTextViewIntroMessage = (TextView) rootView.findViewById(R.id.text_intro_message);
+        Activity activity = getActivity();
+        AlarmStorage alarmStorage = new AlarmStorage(activity);
+        mAlarmAdapter = new AlarmAdapter(activity, alarmStorage.getAlarms());
+        if (mAlarmAdapter.getItemCount() == 0) {
+            mTextViewIntroMessage.setVisibility(View.VISIBLE);
+        }
+        RecyclerView recyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view_alarms);
+        recyclerView.setLayoutManager(new LinearLayoutManager(activity));
+        recyclerView.setAdapter(mAlarmAdapter);
+        recyclerView.addItemDecoration(new AlarmAdapter.DividerItemDecoration(activity));
+        mAlarmUtil = new AlarmUtil(activity);
+    }
+
+    @Override
+    public void onDestroy() {
+        LocalBroadcastManager.getInstance(getActivity())
+                .unregisterReceiver(mAlarmWentOffBroadcastReceiver);
+        super.onDestroy();
+    }
+
+    /**
+     * {@link TimePickerFragment.AlarmAddListener} to do actions after an alarm is added.
+     */
+    private class AlarmAddListenerImpl implements TimePickerFragment.AlarmAddListener {
+
+        @Override
+        public void onAlarmAdded(Alarm alarm) {
+            mAlarmAdapter.addAlarm(alarm);
+            mAlarmUtil.scheduleAlarm(alarm);
+            mTextViewIntroMessage.setVisibility(View.GONE);
+        }
+    }
+
+    /**
+     * A {@link BroadcastReceiver} that receives an intent when an alarm goes off.
+     * This receiver removes the corresponding alarm from the RecyclerView.
+     */
+    private class AlarmWentOffReceiver extends BroadcastReceiver {
+
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            Alarm alarm = intent.getParcelableExtra(AlarmIntentService.ALARM_KEY);
+            mAlarmAdapter.deleteAlarm(alarm);
+        }
+    }
+}
diff --git a/security/DirectBoot/Application/src/main/java/com/example/android/directboot/TimePickerFragment.java b/security/DirectBoot/Application/src/main/java/com/example/android/directboot/TimePickerFragment.java
new file mode 100644
index 0000000..5715668
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/java/com/example/android/directboot/TimePickerFragment.java
@@ -0,0 +1,105 @@
+/*
+* 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;
+
+import com.example.android.directboot.alarms.Alarm;
+import com.example.android.directboot.alarms.AlarmStorage;
+import com.example.android.directboot.alarms.AlarmUtil;
+
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v4.app.DialogFragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.TimePicker;
+import android.widget.Toast;
+
+import java.util.Calendar;
+
+/**
+ * DialogFragment for showing a TimePicker.
+ */
+public class TimePickerFragment extends DialogFragment {
+
+    private TimePicker mTimePicker;
+    private AlarmStorage mAlarmStorage;
+    private AlarmAddListener mAlarmAddListener;
+    private AlarmUtil mAlarmUtil;
+
+    public TimePickerFragment() {}
+
+    public static TimePickerFragment newInstance() {
+        return new TimePickerFragment();
+    }
+
+    public void setAlarmAddListener(AlarmAddListener listener) {
+        mAlarmAddListener = listener;
+    }
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Material_Light_Dialog);
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+        mAlarmStorage = new AlarmStorage(getActivity());
+        mAlarmUtil = new AlarmUtil(getActivity());
+    }
+
+    @Nullable
+    @Override
+    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
+            @Nullable Bundle savedInstanceState) {
+        View view = inflater.inflate(R.layout.fragment_time_picker, container, false);
+        mTimePicker = (TimePicker) view.findViewById(R.id.time_picker_alarm);
+        Button buttonOk = (Button) view.findViewById(R.id.button_ok_time_picker);
+        buttonOk.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                Calendar alarmTime = mAlarmUtil
+                        .getNextAlarmTime(mTimePicker.getHour(), mTimePicker.getMinute());
+                Alarm alarm = mAlarmStorage
+                        .saveAlarm(alarmTime.get(Calendar.MONTH), alarmTime.get(Calendar.DATE),
+                                alarmTime.get(Calendar.HOUR_OF_DAY), alarmTime.get(Calendar.MINUTE));
+                String alarmSavedString = getActivity()
+                        .getString(R.string.alarm_saved, alarm.hour, alarm.minute);
+                Toast.makeText(getActivity(), alarmSavedString, Toast.LENGTH_SHORT).show();
+                if (mAlarmAddListener != null) {
+                    mAlarmAddListener.onAlarmAdded(alarm);
+                }
+                dismiss();
+            }
+        });
+        Button buttonCancel = (Button) view.findViewById(R.id.button_cancel_time_picker);
+        buttonCancel.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                dismiss();
+            }
+        });
+        return view;
+    }
+
+    public interface AlarmAddListener {
+        void onAlarmAdded(Alarm 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
new file mode 100644
index 0000000..82712c6
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/java/com/example/android/directboot/alarms/Alarm.java
@@ -0,0 +1,165 @@
+/*
+* 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.os.Parcel;
+import android.os.Parcelable;
+import android.support.annotation.NonNull;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.Calendar;
+import java.util.Objects;
+
+/**
+ * Class represents a single alarm.
+ */
+public class Alarm implements Comparable<Alarm>, Parcelable {
+
+    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 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);
+    }
+
+    /**
+     * Serialize the instance as a JSON String.
+     * @return serialized JSON String.
+     */
+    public String toJson() {
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.put("id", id);
+            jsonObject.put("month", month);
+            jsonObject.put("date", date);
+            jsonObject.put("hour", hour);
+            jsonObject.put("minute", minute);
+        } catch (JSONException e) {
+            throw new IllegalStateException("Failed to convert the object to JSON");
+        }
+        return jsonObject.toString();
+    }
+
+    /**
+     * Parses a Json string to an {@link Alarm} instance.
+     *
+     * @param string The String representation of an alarm
+     * @return an instance of {@link Alarm}
+     */
+    public static Alarm fromJson(String string) {
+        JSONObject jsonObject;
+        Alarm alarm = new Alarm();
+        try {
+            jsonObject = new JSONObject(string);
+            alarm.id = jsonObject.getInt("id");
+            alarm.month = jsonObject.getInt("month");
+            alarm.date = jsonObject.getInt("date");
+            alarm.hour = jsonObject.getInt("hour");
+            alarm.minute = jsonObject.getInt("minute");
+        } catch (JSONException e) {
+            throw new IllegalArgumentException("Failed to parse the String: " + string);
+        }
+
+        return alarm;
+    }
+
+    @Override
+    public String toString() {
+        return "Alarm{" +
+                "id=" + id +
+                ", month=" + month +
+                ", date=" + date +
+                ", hour=" + hour +
+                ", minute=" + minute +
+                '}';
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (!(o instanceof Alarm)) {
+            return false;
+        }
+        Alarm alarm = (Alarm) o;
+        return id == alarm.id &&
+                month == alarm.month &&
+                date == alarm.date &&
+                hour == alarm.hour &&
+                minute == alarm.minute;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, month, date, hour, minute);
+    }
+
+    @Override
+    public int compareTo(@NonNull Alarm other) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(Calendar.MONTH, month);
+        calendar.set(Calendar.DATE, date);
+        calendar.set(Calendar.HOUR_OF_DAY, hour);
+        calendar.set(Calendar.MINUTE, minute);
+
+        Calendar otherCal = Calendar.getInstance();
+        otherCal.set(Calendar.MONTH, other.month);
+        otherCal.set(Calendar.DATE, other.date);
+        otherCal.set(Calendar.HOUR_OF_DAY, other.hour);
+        otherCal.set(Calendar.MINUTE, other.minute);
+        return calendar.compareTo(otherCal);
+    }
+}
diff --git a/security/DirectBoot/Application/src/main/java/com/example/android/directboot/alarms/AlarmAdapter.java b/security/DirectBoot/Application/src/main/java/com/example/android/directboot/alarms/AlarmAdapter.java
new file mode 100644
index 0000000..70582cb
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/java/com/example/android/directboot/alarms/AlarmAdapter.java
@@ -0,0 +1,189 @@
+/*
+* 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 com.example.android.directboot.R;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.drawable.Drawable;
+import android.support.v7.util.SortedList;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Locale;
+import java.util.Set;
+
+/**
+ * Adapter responsible for interactions between the {@link RecyclerView} and the
+ * scheduled alarms.
+ */
+public class AlarmAdapter extends RecyclerView.Adapter<AlarmAdapter.AlarmViewHolder> {
+
+    private SortedList<Alarm> mAlarmList;
+    private AlarmStorage mAlarmStorage;
+    private AlarmUtil mAlarmUtil;
+    private DateFormat mDateFormat;
+    private DateFormat mTimeFormat;
+    private Context mContext;
+
+    public AlarmAdapter(Context context, Set<Alarm> alarms) {
+        mAlarmList = new SortedList<>(Alarm.class, new SortedListCallback());
+        mAlarmList.addAll(alarms);
+        mAlarmStorage = new AlarmStorage(context);
+        mContext = context;
+        mAlarmUtil = new AlarmUtil(context);
+        mDateFormat = new SimpleDateFormat("MMM dd", Locale.getDefault());
+        mTimeFormat = new SimpleDateFormat("kk:mm", Locale.getDefault());
+    }
+
+    @Override
+    public AlarmViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        View v = LayoutInflater.from(parent.getContext())
+                .inflate(R.layout.alarm_row, parent, false);
+        return new AlarmViewHolder(v);
+    }
+
+    @Override
+    public void onBindViewHolder(AlarmViewHolder holder, final int position) {
+        Alarm alarm = mAlarmList.get(position);
+        Calendar alarmTime = Calendar.getInstance();
+        alarmTime.set(Calendar.MONTH, alarm.month);
+        alarmTime.set(Calendar.DATE, alarm.date);
+        alarmTime.set(Calendar.HOUR_OF_DAY, alarm.hour);
+        alarmTime.set(Calendar.MINUTE, alarm.minute);
+        holder.mAlarmTimeTextView
+                .setText(mTimeFormat.format(alarmTime.getTime()));
+        holder.mAlarmDateTextView
+                .setText(mDateFormat.format(alarmTime.getTime()));
+        holder.mDeleteImageView.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                Alarm toBeDeleted = mAlarmList.get(position);
+                mAlarmList.removeItemAt(position);
+                mAlarmStorage.deleteAlarm(toBeDeleted);
+                mAlarmUtil.cancelAlarm(toBeDeleted);
+                notifyDataSetChanged();
+                Toast.makeText(mContext, mContext.getString(R.string.alarm_deleted,
+                        toBeDeleted.hour, toBeDeleted.minute), Toast.LENGTH_SHORT).show();
+            }
+        });
+    }
+
+    @Override
+    public int getItemCount() {
+        return mAlarmList.size();
+    }
+
+    public void addAlarm(Alarm alarm) {
+        mAlarmList.add(alarm);
+        notifyDataSetChanged();
+    }
+
+    public void deleteAlarm(Alarm alarm) {
+        mAlarmList.remove(alarm);
+        notifyDataSetChanged();
+    }
+
+    public static class AlarmViewHolder extends RecyclerView.ViewHolder {
+
+        private TextView mAlarmTimeTextView;
+        private TextView mAlarmDateTextView;
+        private ImageView mDeleteImageView;
+
+        public AlarmViewHolder(View itemView) {
+            super(itemView);
+            mAlarmTimeTextView = (TextView) itemView.findViewById(R.id.text_alarm_time);
+            mAlarmDateTextView = (TextView) itemView.findViewById(R.id.text_alarm_date);
+            mDeleteImageView = (ImageView) itemView.findViewById(R.id.image_delete_alarm);
+        }
+    }
+
+
+    private static class SortedListCallback extends SortedList.Callback<Alarm> {
+
+        @Override
+        public int compare(Alarm o1, Alarm o2) {
+            return o1.compareTo(o2);
+        }
+
+        @Override
+        public void onInserted(int position, int count) {
+            //No op
+        }
+
+        @Override
+        public void onRemoved(int position, int count) {
+            //No op
+        }
+
+        @Override
+        public void onMoved(int fromPosition, int toPosition) {
+            //No op
+        }
+
+        @Override
+        public void onChanged(int position, int count) {
+            //No op
+        }
+
+        @Override
+        public boolean areContentsTheSame(Alarm oldItem, Alarm newItem) {
+            return oldItem.equals(newItem);
+        }
+
+        @Override
+        public boolean areItemsTheSame(Alarm item1, Alarm item2) {
+            return item1.equals(item2);
+        }
+    }
+
+    /**
+     * ItemDecoration that draws an divider between items in a RecyclerView.
+     */
+    public static class DividerItemDecoration extends RecyclerView.ItemDecoration {
+
+        private Drawable mDivider;
+
+        public DividerItemDecoration(Context context) {
+            mDivider = context.getDrawable(R.drawable.divider);
+        }
+
+        @Override
+        public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
+            int left = parent.getPaddingLeft();
+            int right = parent.getWidth() - parent.getPaddingRight();
+            for (int i = 0; i < parent.getChildCount(); i++) {
+                View child = parent.getChildAt(i);
+                RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
+                        .getLayoutParams();
+                int top = child.getBottom() + params.bottomMargin;
+                int bottom = top + mDivider.getIntrinsicHeight();
+                mDivider.setBounds(left, top, right, bottom);
+                mDivider.draw(c);
+            }
+        }
+    }
+}
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
new file mode 100644
index 0000000..446345c
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/java/com/example/android/directboot/alarms/AlarmIntentService.java
@@ -0,0 +1,65 @@
+/*
+* 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 com.example.android.directboot.R;
+
+import android.app.IntentService;
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.content.Context;
+import android.content.Intent;
+import android.provider.Settings;
+import android.support.v4.app.NotificationCompat;
+import android.support.v4.content.LocalBroadcastManager;
+
+/**
+ * IntentService to set off an alarm.
+ */
+public class AlarmIntentService extends IntentService {
+
+    public static final String ALARM_WENT_OFF_ACTION = AlarmIntentService.class.getName()
+            + ".ALARM_WENT_OFF";
+    public static final String ALARM_KEY = "alarm_instance";
+
+    public AlarmIntentService() {
+        super(AlarmIntentService.class.getName());
+    }
+
+    @Override
+    protected void onHandleIntent(Intent intent) {
+        Context context = getApplicationContext();
+        Alarm alarm = intent.getParcelableExtra(ALARM_KEY);
+
+        NotificationManager notificationManager = context
+                .getSystemService(NotificationManager.class);
+        NotificationCompat.Builder builder =
+                new NotificationCompat.Builder(context)
+                        .setSmallIcon(R.drawable.ic_fbe_notification)
+                        .setCategory(Notification.CATEGORY_ALARM)
+                        .setSound(Settings.System.DEFAULT_ALARM_ALERT_URI)
+                        .setContentTitle(context.getString(R.string.alarm_went_off, alarm.hour,
+                                alarm.minute));
+        notificationManager.notify(alarm.id, builder.build());
+
+        AlarmStorage alarmStorage = new AlarmStorage(context);
+        alarmStorage.deleteAlarm(alarm);
+        Intent wentOffIntent = new Intent(ALARM_WENT_OFF_ACTION);
+        wentOffIntent.putExtra(ALARM_KEY, alarm);
+        LocalBroadcastManager.getInstance(context).sendBroadcast(wentOffIntent);
+    }
+}
diff --git a/security/DirectBoot/Application/src/main/java/com/example/android/directboot/alarms/AlarmStorage.java b/security/DirectBoot/Application/src/main/java/com/example/android/directboot/alarms/AlarmStorage.java
new file mode 100644
index 0000000..2dc0635
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/java/com/example/android/directboot/alarms/AlarmStorage.java
@@ -0,0 +1,114 @@
+/*
+* 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;
+            }
+        }
+    }
+}
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
new file mode 100644
index 0000000..b80e8c9
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/java/com/example/android/directboot/alarms/AlarmUtil.java
@@ -0,0 +1,97 @@
+/*
+* 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.app.AlarmManager;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.util.Log;
+
+import java.util.Calendar;
+
+/**
+ * Utility class for alarms.
+ */
+public class AlarmUtil {
+
+    private static final String TAG = "AlarmUtil";
+    private final Context mContext;
+    private final AlarmManager mAlarmManager;
+
+    public AlarmUtil(Context context) {
+        mContext = context;
+        mAlarmManager = mContext.getSystemService(AlarmManager.class);
+    }
+
+    /**
+     * Schedules an alarm using {@link AlarmManager}.
+     *
+     * @param alarm the alarm to be scheduled
+     */
+    public void scheduleAlarm(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);
+        Calendar alarmTime = Calendar.getInstance();
+        alarmTime.set(Calendar.MONTH, alarm.month);
+        alarmTime.set(Calendar.DATE, alarm.date);
+        alarmTime.set(Calendar.HOUR_OF_DAY, alarm.hour);
+        alarmTime.set(Calendar.MINUTE, alarm.minute);
+
+        AlarmManager.AlarmClockInfo alarmClockInfo = new AlarmManager.AlarmClockInfo(
+                alarmTime.getTimeInMillis(),
+                pendingIntent);
+        mAlarmManager.setAlarmClock(alarmClockInfo, pendingIntent);
+        Log.i(TAG,
+                String.format("Alarm scheduled at (%2d:%02d) Date: %d, Month: %d",
+                        alarm.hour, alarm.minute,
+                        alarm.month, alarm.date));
+    }
+
+    /**
+     * Cancels the scheduled alarm.
+     *
+     * @param alarm the alarm to be canceled.
+     */
+    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);
+    }
+
+    /**
+     * Returns a next alarm time (nearest day) Calendar instance with the hour and the minute.
+     *
+     * @param hour the integer of the hour an alarm should go off
+     * @param minute the integer of the minute an alarm should go off
+     * @return a {@link Calendar} instance an alarm should go off given the passed hour and the
+     *         minute
+     */
+    public Calendar getNextAlarmTime(int hour, int minute) {
+        Calendar alarmTime = Calendar.getInstance();
+        alarmTime.set(Calendar.HOUR_OF_DAY, hour);
+        alarmTime.set(Calendar.MINUTE, minute);
+        if ((alarmTime.getTimeInMillis() - System.currentTimeMillis()) < 0) {
+            alarmTime.add(Calendar.DATE, 1);
+        }
+        return alarmTime;
+    }
+}
diff --git a/security/DirectBoot/Application/src/main/res/drawable-hdpi/ic_add_alarm_white_24dp.png b/security/DirectBoot/Application/src/main/res/drawable-hdpi/ic_add_alarm_white_24dp.png
new file mode 100644
index 0000000..5f33b37
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/res/drawable-hdpi/ic_add_alarm_white_24dp.png
Binary files differ
diff --git a/security/DirectBoot/Application/src/main/res/drawable-hdpi/ic_alarm_black_24dp.png b/security/DirectBoot/Application/src/main/res/drawable-hdpi/ic_alarm_black_24dp.png
new file mode 100644
index 0000000..9074911
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/res/drawable-hdpi/ic_alarm_black_24dp.png
Binary files differ
diff --git a/security/DirectBoot/Application/src/main/res/drawable-hdpi/ic_delete_black_24dp.png b/security/DirectBoot/Application/src/main/res/drawable-hdpi/ic_delete_black_24dp.png
new file mode 100644
index 0000000..dbbb602
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/res/drawable-hdpi/ic_delete_black_24dp.png
Binary files differ
diff --git a/security/DirectBoot/Application/src/main/res/drawable-hdpi/ic_fbe_notification.png b/security/DirectBoot/Application/src/main/res/drawable-hdpi/ic_fbe_notification.png
new file mode 100644
index 0000000..421baf4
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/res/drawable-hdpi/ic_fbe_notification.png
Binary files differ
diff --git a/security/DirectBoot/Application/src/main/res/drawable-mdpi/ic_add_alarm_white_24dp.png b/security/DirectBoot/Application/src/main/res/drawable-mdpi/ic_add_alarm_white_24dp.png
new file mode 100644
index 0000000..85a1e17
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/res/drawable-mdpi/ic_add_alarm_white_24dp.png
Binary files differ
diff --git a/security/DirectBoot/Application/src/main/res/drawable-mdpi/ic_alarm_black_24dp.png b/security/DirectBoot/Application/src/main/res/drawable-mdpi/ic_alarm_black_24dp.png
new file mode 100644
index 0000000..ed2f90a
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/res/drawable-mdpi/ic_alarm_black_24dp.png
Binary files differ
diff --git a/security/DirectBoot/Application/src/main/res/drawable-mdpi/ic_delete_black_24dp.png b/security/DirectBoot/Application/src/main/res/drawable-mdpi/ic_delete_black_24dp.png
new file mode 100644
index 0000000..999aa4c
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/res/drawable-mdpi/ic_delete_black_24dp.png
Binary files differ
diff --git a/security/DirectBoot/Application/src/main/res/drawable-mdpi/ic_fbe_notification.png b/security/DirectBoot/Application/src/main/res/drawable-mdpi/ic_fbe_notification.png
new file mode 100644
index 0000000..5635e41
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/res/drawable-mdpi/ic_fbe_notification.png
Binary files differ
diff --git a/security/DirectBoot/Application/src/main/res/drawable-xhdpi/ic_add_alarm_white_24dp.png b/security/DirectBoot/Application/src/main/res/drawable-xhdpi/ic_add_alarm_white_24dp.png
new file mode 100644
index 0000000..90f4de4
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/res/drawable-xhdpi/ic_add_alarm_white_24dp.png
Binary files differ
diff --git a/security/DirectBoot/Application/src/main/res/drawable-xhdpi/ic_alarm_black_24dp.png b/security/DirectBoot/Application/src/main/res/drawable-xhdpi/ic_alarm_black_24dp.png
new file mode 100644
index 0000000..e37eab0
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/res/drawable-xhdpi/ic_alarm_black_24dp.png
Binary files differ
diff --git a/security/DirectBoot/Application/src/main/res/drawable-xhdpi/ic_delete_black_24dp.png b/security/DirectBoot/Application/src/main/res/drawable-xhdpi/ic_delete_black_24dp.png
new file mode 100644
index 0000000..796ccd2
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/res/drawable-xhdpi/ic_delete_black_24dp.png
Binary files differ
diff --git a/security/DirectBoot/Application/src/main/res/drawable-xhdpi/ic_fbe_notification.png b/security/DirectBoot/Application/src/main/res/drawable-xhdpi/ic_fbe_notification.png
new file mode 100644
index 0000000..e07c385
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/res/drawable-xhdpi/ic_fbe_notification.png
Binary files differ
diff --git a/security/DirectBoot/Application/src/main/res/drawable-xxhdpi/ic_add_alarm_white_24dp.png b/security/DirectBoot/Application/src/main/res/drawable-xxhdpi/ic_add_alarm_white_24dp.png
new file mode 100644
index 0000000..3319384
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/res/drawable-xxhdpi/ic_add_alarm_white_24dp.png
Binary files differ
diff --git a/security/DirectBoot/Application/src/main/res/drawable-xxhdpi/ic_alarm_black_24dp.png b/security/DirectBoot/Application/src/main/res/drawable-xxhdpi/ic_alarm_black_24dp.png
new file mode 100644
index 0000000..eb1d08d
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/res/drawable-xxhdpi/ic_alarm_black_24dp.png
Binary files differ
diff --git a/security/DirectBoot/Application/src/main/res/drawable-xxhdpi/ic_delete_black_24dp.png b/security/DirectBoot/Application/src/main/res/drawable-xxhdpi/ic_delete_black_24dp.png
new file mode 100644
index 0000000..6d7cb81
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/res/drawable-xxhdpi/ic_delete_black_24dp.png
Binary files differ
diff --git a/security/DirectBoot/Application/src/main/res/drawable-xxhdpi/ic_fbe_notification.png b/security/DirectBoot/Application/src/main/res/drawable-xxhdpi/ic_fbe_notification.png
new file mode 100644
index 0000000..193d1bc
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/res/drawable-xxhdpi/ic_fbe_notification.png
Binary files differ
diff --git a/security/DirectBoot/Application/src/main/res/drawable-xxxhdpi/ic_add_alarm_white_24dp.png b/security/DirectBoot/Application/src/main/res/drawable-xxxhdpi/ic_add_alarm_white_24dp.png
new file mode 100644
index 0000000..2e425c0
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/res/drawable-xxxhdpi/ic_add_alarm_white_24dp.png
Binary files differ
diff --git a/security/DirectBoot/Application/src/main/res/drawable-xxxhdpi/ic_alarm_black_24dp.png b/security/DirectBoot/Application/src/main/res/drawable-xxxhdpi/ic_alarm_black_24dp.png
new file mode 100644
index 0000000..04b6c71
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/res/drawable-xxxhdpi/ic_alarm_black_24dp.png
Binary files differ
diff --git a/security/DirectBoot/Application/src/main/res/drawable-xxxhdpi/ic_delete_black_24dp.png b/security/DirectBoot/Application/src/main/res/drawable-xxxhdpi/ic_delete_black_24dp.png
new file mode 100644
index 0000000..f2b75c3
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/res/drawable-xxxhdpi/ic_delete_black_24dp.png
Binary files differ
diff --git a/security/DirectBoot/Application/src/main/res/drawable-xxxhdpi/ic_fbe_notification.png b/security/DirectBoot/Application/src/main/res/drawable-xxxhdpi/ic_fbe_notification.png
new file mode 100644
index 0000000..5dd463f
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/res/drawable-xxxhdpi/ic_fbe_notification.png
Binary files differ
diff --git a/security/DirectBoot/Application/src/main/res/drawable/divider.xml b/security/DirectBoot/Application/src/main/res/drawable/divider.xml
new file mode 100644
index 0000000..b21e664
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/res/drawable/divider.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ 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.
+-->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <size
+        android:width="1dp"
+        android:height="1dp" />
+    <solid android:color="@android:color/darker_gray" />
+</shape>
\ No newline at end of file
diff --git a/security/DirectBoot/Application/src/main/res/layout/activity_main.xml b/security/DirectBoot/Application/src/main/res/layout/activity_main.xml
new file mode 100755
index 0000000..4011cc4
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/res/layout/activity_main.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ 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.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/container"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context="com.example.android.directboot.MainActivity"
+    tools:ignore="MergeRootFrame" />
diff --git a/security/DirectBoot/Application/src/main/res/layout/alarm_row.xml b/security/DirectBoot/Application/src/main/res/layout/alarm_row.xml
new file mode 100644
index 0000000..ab5fb88
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/res/layout/alarm_row.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ 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.
+-->
+
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="@dimen/alarm_row_height"
+    android:layout_marginLeft="@dimen/margin_medium"
+    android:layout_marginRight="@dimen/margin_medium" >
+
+    <TextView
+        android:id="@+id/text_alarm_time"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="@dimen/margin_medium"
+        android:textSize="52sp"
+        />
+
+    <TextView
+        android:id="@+id/text_alarm_date"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_toEndOf="@id/text_alarm_time"
+        android:layout_marginStart="@dimen/margin_small"
+        android:layout_alignBaseline="@id/text_alarm_time"
+        android:textSize="20sp"
+        />
+
+    <ImageView
+        android:id="@+id/image_delete_alarm"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="@dimen/margin_medium"
+        android:layout_centerVertical="true"
+        android:layout_alignParentEnd="true"
+        android:src="@drawable/ic_delete_black_24dp"
+        />
+</RelativeLayout>
\ No newline at end of file
diff --git a/security/DirectBoot/Application/src/main/res/layout/fragment_alarm_scheduler.xml b/security/DirectBoot/Application/src/main/res/layout/fragment_alarm_scheduler.xml
new file mode 100644
index 0000000..68fea72
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/res/layout/fragment_alarm_scheduler.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ 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.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent" >
+
+    <TextView
+        android:id="@+id/text_registered_alarms"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="@dimen/margin_small"
+        android:drawableTop="@drawable/ic_alarm_black_24dp"
+        android:text="@string/registered_alarms"
+        android:textSize="14sp"
+        android:gravity="center"
+        />
+
+    <TextView
+        android:id="@+id/text_intro_message"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_margin="@dimen/margin_medium"
+        android:layout_below="@id/text_registered_alarms"
+        android:text="@string/intro_message"
+        android:textSize="20sp"
+        android:visibility="gone"
+        />
+
+    <android.support.v7.widget.RecyclerView
+        android:id="@+id/recycler_view_alarms"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_below="@id/text_intro_message"
+        />
+
+    <android.support.design.widget.FloatingActionButton
+        android:id="@+id/fab_add_alarm"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="end|bottom"
+        android:layout_margin="@dimen/margin_large"
+        android:layout_alignParentEnd="true"
+        android:layout_alignParentBottom="true"
+        android:src="@drawable/ic_add_alarm_white_24dp" />
+</RelativeLayout>
diff --git a/security/DirectBoot/Application/src/main/res/layout/fragment_time_picker.xml b/security/DirectBoot/Application/src/main/res/layout/fragment_time_picker.xml
new file mode 100644
index 0000000..cb83530
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/res/layout/fragment_time_picker.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/container"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+    <TimePicker
+        android:id="@+id/time_picker_alarm"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+
+    <LinearLayout
+        android:id="@+id/button_panel"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal"
+        android:paddingStart="@dimen/margin_medium"
+        android:paddingEnd="@dimen/margin_medium"
+        android:paddingTop="@dimen/margin_small"
+        android:paddingBottom="@dimen/margin_small"
+        android:gravity="bottom"
+        style="?android:attr/buttonBarStyle">
+
+        <Space
+            android:id="@+id/spacer"
+            android:layout_width="0dp"
+            android:layout_height="0dp"
+            android:layout_weight="1"
+            android:visibility="invisible" />
+
+        <Button
+            android:id="@+id/button_cancel_time_picker"
+            style="?android:attr/buttonBarNegativeButtonStyle"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/cancel"
+            />
+
+        <Button
+            android:id="@+id/button_ok_time_picker"
+            style="?android:attr/buttonBarPositiveButtonStyle"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/ok"
+            />
+    </LinearLayout>
+</LinearLayout>
\ No newline at end of file
diff --git a/security/DirectBoot/Application/src/main/res/mipmap-hdpi/ic_launcher.png b/security/DirectBoot/Application/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..da7ca83
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/res/mipmap-hdpi/ic_launcher.png
Binary files differ
diff --git a/security/DirectBoot/Application/src/main/res/mipmap-mdpi/ic_launcher.png b/security/DirectBoot/Application/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..b563d2a
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/res/mipmap-mdpi/ic_launcher.png
Binary files differ
diff --git a/security/DirectBoot/Application/src/main/res/mipmap-xhdpi/ic_launcher.png b/security/DirectBoot/Application/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..d8b1bc2
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/res/mipmap-xhdpi/ic_launcher.png
Binary files differ
diff --git a/security/DirectBoot/Application/src/main/res/mipmap-xxhdpi/ic_launcher.png b/security/DirectBoot/Application/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..da95a69
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/res/mipmap-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/security/DirectBoot/Application/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/security/DirectBoot/Application/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..59c453d
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Binary files differ
diff --git a/security/DirectBoot/Application/src/main/res/values/dimens.xml b/security/DirectBoot/Application/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..cf23df4
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/res/values/dimens.xml
@@ -0,0 +1,19 @@
+<!--
+  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.
+  -->
+
+<resources>
+    <dimen name="alarm_row_height">80dp</dimen>
+</resources>
\ No newline at end of file
diff --git a/security/DirectBoot/Application/src/main/res/values/strings.xml b/security/DirectBoot/Application/src/main/res/values/strings.xml
new file mode 100644
index 0000000..f8db16c
--- /dev/null
+++ b/security/DirectBoot/Application/src/main/res/values/strings.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+-->
+
+<resources>
+    <string name="alarm_saved">Alarm scheduled at %1$2d:%2$02d</string>
+    <string name="alarm_deleted">Deleted the alarm at %1$2d:%2$02d</string>
+    <string name="alarm_went_off">Alarm went off at %1$2d:%2$02d</string>
+    <string name="time_24hour_format">%1$2d:%2$02d</string>
+    <string name="ok">OK</string>
+    <string name="cancel">Cancel</string>
+    <string name="registered_alarms">Registered alarms</string>
+</resources>
\ No newline at end of file
diff --git a/security/DirectBoot/build.gradle b/security/DirectBoot/build.gradle
new file mode 100644
index 0000000..9b6a9ce
--- /dev/null
+++ b/security/DirectBoot/build.gradle
@@ -0,0 +1,12 @@
+
+
+// BEGIN_EXCLUDE
+import com.example.android.samples.build.SampleGenPlugin
+apply plugin: SampleGenPlugin
+
+samplegen {
+  pathToBuild "../../../../build"
+  pathToSamplesCommon "../../common"
+}
+apply from: "../../../../build/build.gradle"
+// END_EXCLUDE
diff --git a/security/DirectBoot/buildSrc/build.gradle b/security/DirectBoot/buildSrc/build.gradle
new file mode 100644
index 0000000..d77115d
--- /dev/null
+++ b/security/DirectBoot/buildSrc/build.gradle
@@ -0,0 +1,16 @@
+
+repositories {
+    jcenter()
+}
+dependencies {
+    compile 'org.freemarker:freemarker:2.3.20'
+}
+
+sourceSets {
+    main {
+        groovy {
+            srcDir new File(rootDir, "../../../../../build/buildSrc/src/main/groovy")
+        }
+    }
+}
+
diff --git a/security/DirectBoot/gradle/wrapper/gradle-wrapper.jar b/security/DirectBoot/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..8c0fb64
--- /dev/null
+++ b/security/DirectBoot/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/security/DirectBoot/gradle/wrapper/gradle-wrapper.properties b/security/DirectBoot/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..36a3111
--- /dev/null
+++ b/security/DirectBoot/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Mon Feb 08 18:26:13 JST 2016
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=http\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/security/DirectBoot/gradlew b/security/DirectBoot/gradlew
new file mode 100755
index 0000000..91a7e26
--- /dev/null
+++ b/security/DirectBoot/gradlew
@@ -0,0 +1,164 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+    echo "$*"
+}
+
+die ( ) {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+esac
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched.
+if $cygwin ; then
+    [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+fi
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >&-
+APP_HOME="`pwd -P`"
+cd "$SAVED" >&-
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+    JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/security/DirectBoot/gradlew.bat b/security/DirectBoot/gradlew.bat
new file mode 100644
index 0000000..aec9973
--- /dev/null
+++ b/security/DirectBoot/gradlew.bat
@@ -0,0 +1,90 @@
+@if "%DEBUG%" == "" @echo off

+@rem ##########################################################################

+@rem

+@rem  Gradle startup script for Windows

+@rem

+@rem ##########################################################################

+

+@rem Set local scope for the variables with windows NT shell

+if "%OS%"=="Windows_NT" setlocal

+

+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.

+set DEFAULT_JVM_OPTS=

+

+set DIRNAME=%~dp0

+if "%DIRNAME%" == "" set DIRNAME=.

+set APP_BASE_NAME=%~n0

+set APP_HOME=%DIRNAME%

+

+@rem Find java.exe

+if defined JAVA_HOME goto findJavaFromJavaHome

+

+set JAVA_EXE=java.exe

+%JAVA_EXE% -version >NUL 2>&1

+if "%ERRORLEVEL%" == "0" goto init

+

+echo.

+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

+echo.

+echo Please set the JAVA_HOME variable in your environment to match the

+echo location of your Java installation.

+

+goto fail

+

+:findJavaFromJavaHome

+set JAVA_HOME=%JAVA_HOME:"=%

+set JAVA_EXE=%JAVA_HOME%/bin/java.exe

+

+if exist "%JAVA_EXE%" goto init

+

+echo.

+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%

+echo.

+echo Please set the JAVA_HOME variable in your environment to match the

+echo location of your Java installation.

+

+goto fail

+

+:init

+@rem Get command-line arguments, handling Windowz variants

+

+if not "%OS%" == "Windows_NT" goto win9xME_args

+if "%@eval[2+2]" == "4" goto 4NT_args

+

+:win9xME_args

+@rem Slurp the command line arguments.

+set CMD_LINE_ARGS=

+set _SKIP=2

+

+:win9xME_args_slurp

+if "x%~1" == "x" goto execute

+

+set CMD_LINE_ARGS=%*

+goto execute

+

+:4NT_args

+@rem Get arguments from the 4NT Shell from JP Software

+set CMD_LINE_ARGS=%$

+

+:execute

+@rem Setup the command line

+

+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar

+

+@rem Execute Gradle

+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%

+

+:end

+@rem End local scope for the variables with windows NT shell

+if "%ERRORLEVEL%"=="0" goto mainEnd

+

+:fail

+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of

+rem the _cmd.exe /c_ return code!

+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1

+exit /b 1

+

+:mainEnd

+if "%OS%"=="Windows_NT" endlocal

+

+:omega

diff --git a/security/DirectBoot/screenshots/1.png b/security/DirectBoot/screenshots/1.png
new file mode 100644
index 0000000..5a67453
--- /dev/null
+++ b/security/DirectBoot/screenshots/1.png
Binary files differ
diff --git a/security/DirectBoot/screenshots/2.png b/security/DirectBoot/screenshots/2.png
new file mode 100644
index 0000000..d19d656
--- /dev/null
+++ b/security/DirectBoot/screenshots/2.png
Binary files differ
diff --git a/security/DirectBoot/screenshots/3.png b/security/DirectBoot/screenshots/3.png
new file mode 100644
index 0000000..16c52c1
--- /dev/null
+++ b/security/DirectBoot/screenshots/3.png
Binary files differ
diff --git a/security/DirectBoot/screenshots/4.png b/security/DirectBoot/screenshots/4.png
new file mode 100644
index 0000000..d796931
--- /dev/null
+++ b/security/DirectBoot/screenshots/4.png
Binary files differ
diff --git a/security/DirectBoot/screenshots/icon-web.png b/security/DirectBoot/screenshots/icon-web.png
new file mode 100644
index 0000000..cbf07ef
--- /dev/null
+++ b/security/DirectBoot/screenshots/icon-web.png
Binary files differ
diff --git a/security/DirectBoot/settings.gradle b/security/DirectBoot/settings.gradle
new file mode 100644
index 0000000..0a5c310
--- /dev/null
+++ b/security/DirectBoot/settings.gradle
@@ -0,0 +1,2 @@
+
+include 'Application'
diff --git a/security/DirectBoot/template-params.xml b/security/DirectBoot/template-params.xml
new file mode 100644
index 0000000..b27ada9
--- /dev/null
+++ b/security/DirectBoot/template-params.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+-->
+
+<sample>
+    <name>DirectBoot</name>
+    <group>Android N Preview</group>  <!-- This field will be deprecated in the future
+                            and replaced with the "categories" tags below. -->
+    <package>com.example.android.directboot</package>
+
+    <!-- change minSdk if needed-->
+    <minSdk>"N"</minSdk>
+    <targetSdkVersion>"N"</targetSdkVersion>
+    <compileSdkVersion>"android-N"</compileSdkVersion>
+
+    <!-- Include additional dependencies here.-->
+    <!-- dependency>com.google.android.gms:play-services:5.0.+</dependency -->
+    <dependency>com.android.support:appcompat-v7:24.0.0-alpha1</dependency>
+    <dependency>com.android.support:support-v4:24.0.0-alpha1</dependency>
+    <dependency>com.android.support:support-v13:24.0.0-alpha1</dependency>
+    <dependency>com.android.support:recyclerview-v7:24.0.0-alpha1</dependency>
+    <dependency>com.android.support:design:24.0.0-alpha1</dependency>
+
+    <template src="base" />
+
+    <strings>
+        <intro>
+<![CDATA[
+This sample demonstrates how to store/access data in a device protected storage
+which is always available while the device is booted.
+This sample works as a simple alarm clock. On > Android N devices, the scheduled alarms
+go off after reboot even before the user enters their credentials.
+]]>
+        </intro>
+    </strings>
+
+    <metadata>
+        <status>PUBLISHED</status>
+        <categories>Android N Preview</categories>
+        <technologies>Android</technologies>
+        <languages>Java</languages>
+        <solutions>Mobile</solutions>
+        <level>INTERMEDIATE</level>
+        <icon>screenshots/icon-web.png</icon>
+        <screenshots>
+            <img>screenshots/1.png</img>
+            <img>screenshots/2.png</img>
+            <img>screenshots/3.png</img>
+            <img>screenshots/4.png</img>
+        </screenshots>
+        <!-- List of APIs that this sample should be cross-referenced under. Use <android>
+        for fully-qualified Framework class names ("android:" namespace).
+
+        Use <ext> for custom namespaces, if needed. See "Samples Index API" documentation
+        for more details. -->
+        <api_refs>
+            <android>android.content.Context.createDeviceProtectedStorageContext</android>
+        </api_refs>
+
+        <!-- 1-3 line description of the sample here.
+
+            Avoid simply rearranging the sample's title. What does this sample actually
+            accomplish, and how does it do it? -->
+        <description>
+<![CDATA[
+Sample demonstrating how to store data in a device protected storage which
+is always available while the device is booted both before and after any
+user credentials(PIN/Pattern/Password) are entered.
+]]>
+        </description>
+
+        <!-- Multi-paragraph introduction to sample, from an educational point-of-view.
+        Makrdown formatting allowed. This will be used to generate a mini-article for the
+        sample on DAC. -->
+        <intro>
+<![CDATA[
+
+This sample demonstrates how to store and access data in a device protected
+storage which is always available while the device is booted.
+Starting from Android N, the system provides two storage locations for user data:
+
+- Credential protected:
+    - The default storage location for all apps, available only after the user has entered their pattern/password
+
+- Device protected:
+    - A new storage location which is always available while the device is booted, both before and after any user credentials are entered
+
+Apps can mark individual components as being direct boot aware which indicates to the system that they can safely run when
+Credential protected storage is unavailable (an direct boot aware component primarily relies on data stored in the new Device protected storage area, 
+but they may access Credential protected data when unlocked) by adding `directBootAware="true"` in the manifest.
+```
+<activity|provider|receiver|service ...
+android:directBootAware=”true”>
+```
+
+Components marked as directBoot aware are normal components that will continue to be available after the
+Credential protected storage becomes available. The storage APIs on the Context supplied to these components will always point to Credential protected storage by default.
+To access Device protected storage, you can create a secondary Context using this API
+```
+Context.createDeviceProtectedStorageContext()
+```
+All of the storage APIs on this returned Context will be redirected to point at Device protected storage.
+
+You need to be careful what data is stored/moved to a device protected storage
+because the storage isn't protected by the user's credential (PIN/Pattern/Password)
+You shouldn't store sensitive data (such as user's emails, auth tokens) in a
+device protected storage.
+]]>
+        </intro>
+    </metadata>
+</sample>
diff --git a/security/FingerprintDialog/gradle/wrapper/gradle-wrapper.properties b/security/FingerprintDialog/gradle/wrapper/gradle-wrapper.properties
index 203da3a..13b1b48 100644
--- a/security/FingerprintDialog/gradle/wrapper/gradle-wrapper.properties
+++ b/security/FingerprintDialog/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=http\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/security/keystore/BasicAndroidKeyStore/gradle/wrapper/gradle-wrapper.properties b/security/keystore/BasicAndroidKeyStore/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/security/keystore/BasicAndroidKeyStore/gradle/wrapper/gradle-wrapper.properties
+++ b/security/keystore/BasicAndroidKeyStore/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/sensors/BatchStepSensor/gradle/wrapper/gradle-wrapper.properties b/sensors/BatchStepSensor/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/sensors/BatchStepSensor/gradle/wrapper/gradle-wrapper.properties
+++ b/sensors/BatchStepSensor/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/system/AppUsageStatistics/gradle/wrapper/gradle-wrapper.properties b/system/AppUsageStatistics/gradle/wrapper/gradle-wrapper.properties
index cd50297..fdad773 100644
--- a/system/AppUsageStatistics/gradle/wrapper/gradle-wrapper.properties
+++ b/system/AppUsageStatistics/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/system/RuntimePermissions/gradle/wrapper/gradle-wrapper.properties b/system/RuntimePermissions/gradle/wrapper/gradle-wrapper.properties
index cd50297..fdad773 100644
--- a/system/RuntimePermissions/gradle/wrapper/gradle-wrapper.properties
+++ b/system/RuntimePermissions/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/system/RuntimePermissionsBasic/gradle/wrapper/gradle-wrapper.properties b/system/RuntimePermissionsBasic/gradle/wrapper/gradle-wrapper.properties
index cd50297..fdad773 100644
--- a/system/RuntimePermissionsBasic/gradle/wrapper/gradle-wrapper.properties
+++ b/system/RuntimePermissionsBasic/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/testing/ActivityInstrumentation/gradle/wrapper/gradle-wrapper.properties b/testing/ActivityInstrumentation/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/testing/ActivityInstrumentation/gradle/wrapper/gradle-wrapper.properties
+++ b/testing/ActivityInstrumentation/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/DrawableTinting/gradle/wrapper/gradle-wrapper.properties b/ui/DrawableTinting/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/ui/DrawableTinting/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/DrawableTinting/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/Interpolator/gradle/wrapper/gradle-wrapper.properties b/ui/Interpolator/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/ui/Interpolator/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/Interpolator/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/accessibility/BasicAccessibility/gradle/wrapper/gradle-wrapper.properties b/ui/accessibility/BasicAccessibility/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/ui/accessibility/BasicAccessibility/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/accessibility/BasicAccessibility/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/actionbar/DoneBar/gradle/wrapper/gradle-wrapper.properties b/ui/actionbar/DoneBar/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/ui/actionbar/DoneBar/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/actionbar/DoneBar/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/actionbarcompat/ActionBarCompat-Basic/gradle/wrapper/gradle-wrapper.properties b/ui/actionbarcompat/ActionBarCompat-Basic/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/ui/actionbarcompat/ActionBarCompat-Basic/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/actionbarcompat/ActionBarCompat-Basic/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/actionbarcompat/ActionBarCompat-ListPopupMenu/gradle/wrapper/gradle-wrapper.properties b/ui/actionbarcompat/ActionBarCompat-ListPopupMenu/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/ui/actionbarcompat/ActionBarCompat-ListPopupMenu/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/actionbarcompat/ActionBarCompat-ListPopupMenu/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/actionbarcompat/ActionBarCompat-ListViewModalSelect/gradle/wrapper/gradle-wrapper.properties b/ui/actionbarcompat/ActionBarCompat-ListViewModalSelect/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/ui/actionbarcompat/ActionBarCompat-ListViewModalSelect/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/actionbarcompat/ActionBarCompat-ListViewModalSelect/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/actionbarcompat/ActionBarCompat-SearchView/build.gradle b/ui/actionbarcompat/ActionBarCompat-SearchView/build.gradle
index 248a459..188b7c6 100644
--- a/ui/actionbarcompat/ActionBarCompat-SearchView/build.gradle
+++ b/ui/actionbarcompat/ActionBarCompat-SearchView/build.gradle
@@ -4,7 +4,7 @@
     }
 
     dependencies {
-        classpath 'com.android.tools.build:gradle:1.0.0-rc1'
+        classpath 'com.android.tools.build:gradle:2.0.0'
     }
 }
 
diff --git a/ui/actionbarcompat/ActionBarCompat-ShareActionProvider/gradle/wrapper/gradle-wrapper.properties b/ui/actionbarcompat/ActionBarCompat-ShareActionProvider/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/ui/actionbarcompat/ActionBarCompat-ShareActionProvider/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/actionbarcompat/ActionBarCompat-ShareActionProvider/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/actionbarcompat/ActionBarCompat-Styled/gradle/wrapper/gradle-wrapper.properties b/ui/actionbarcompat/ActionBarCompat-Styled/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/ui/actionbarcompat/ActionBarCompat-Styled/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/actionbarcompat/ActionBarCompat-Styled/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/activityscenetransition/ActivitySceneTransitionBasic/gradle/wrapper/gradle-wrapper.properties b/ui/activityscenetransition/ActivitySceneTransitionBasic/gradle/wrapper/gradle-wrapper.properties
index 2ea35fd..1534e1e 100644
--- a/ui/activityscenetransition/ActivitySceneTransitionBasic/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/activityscenetransition/ActivitySceneTransitionBasic/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/activitytasks/DocumentCentricApps/gradle/wrapper/gradle-wrapper.properties b/ui/activitytasks/DocumentCentricApps/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/ui/activitytasks/DocumentCentricApps/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/activitytasks/DocumentCentricApps/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/activitytasks/DocumentCentricRelinquishIdentity/gradle/wrapper/gradle-wrapper.properties b/ui/activitytasks/DocumentCentricRelinquishIdentity/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/ui/activitytasks/DocumentCentricRelinquishIdentity/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/activitytasks/DocumentCentricRelinquishIdentity/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/graphics/DisplayingBitmaps/gradle/wrapper/gradle-wrapper.properties b/ui/graphics/DisplayingBitmaps/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/ui/graphics/DisplayingBitmaps/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/graphics/DisplayingBitmaps/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/graphics/PdfRendererBasic/gradle/wrapper/gradle-wrapper.properties b/ui/graphics/PdfRendererBasic/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/ui/graphics/PdfRendererBasic/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/graphics/PdfRendererBasic/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/holo/BorderlessButtons/gradle/wrapper/gradle-wrapper.properties b/ui/holo/BorderlessButtons/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/ui/holo/BorderlessButtons/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/holo/BorderlessButtons/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/lists/CustomChoiceList/gradle/wrapper/gradle-wrapper.properties b/ui/lists/CustomChoiceList/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/ui/lists/CustomChoiceList/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/lists/CustomChoiceList/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/transition/AdapterTransition/gradle/wrapper/gradle-wrapper.properties b/ui/transition/AdapterTransition/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/ui/transition/AdapterTransition/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/transition/AdapterTransition/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/transition/BasicTransition/gradle/wrapper/gradle-wrapper.properties b/ui/transition/BasicTransition/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/ui/transition/BasicTransition/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/transition/BasicTransition/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/transition/CustomTransition/gradle/wrapper/gradle-wrapper.properties b/ui/transition/CustomTransition/gradle/wrapper/gradle-wrapper.properties
index fb05029..5e85628 100644
--- a/ui/transition/CustomTransition/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/transition/CustomTransition/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/transition/FragmentTransition/gradle/wrapper/gradle-wrapper.properties b/ui/transition/FragmentTransition/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/ui/transition/FragmentTransition/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/transition/FragmentTransition/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/views/CardView/gradle/wrapper/gradle-wrapper.properties b/ui/views/CardView/gradle/wrapper/gradle-wrapper.properties
index 5fd1493..711c6e1 100644
--- a/ui/views/CardView/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/views/CardView/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/views/Clipping/ClippingBasic/gradle/wrapper/gradle-wrapper.properties b/ui/views/Clipping/ClippingBasic/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/ui/views/Clipping/ClippingBasic/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/views/Clipping/ClippingBasic/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/views/Elevation/ElevationBasic/gradle/wrapper/gradle-wrapper.properties b/ui/views/Elevation/ElevationBasic/gradle/wrapper/gradle-wrapper.properties
index f1b6ded..32af84e 100644
--- a/ui/views/Elevation/ElevationBasic/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/views/Elevation/ElevationBasic/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/views/Elevation/ElevationDrag/gradle/wrapper/gradle-wrapper.properties b/ui/views/Elevation/ElevationDrag/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/ui/views/Elevation/ElevationDrag/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/views/Elevation/ElevationDrag/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/views/FloatingActionButton/FloatingActionButtonBasic/gradle/wrapper/gradle-wrapper.properties b/ui/views/FloatingActionButton/FloatingActionButtonBasic/gradle/wrapper/gradle-wrapper.properties
index f15b32c..9b778a3 100644
--- a/ui/views/FloatingActionButton/FloatingActionButtonBasic/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/views/FloatingActionButton/FloatingActionButtonBasic/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/views/HorizontalPaging/gradle/wrapper/gradle-wrapper.properties b/ui/views/HorizontalPaging/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/ui/views/HorizontalPaging/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/views/HorizontalPaging/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/views/NavigationDrawer/gradle/wrapper/gradle-wrapper.properties b/ui/views/NavigationDrawer/gradle/wrapper/gradle-wrapper.properties
index 5288c6d..d9a65b6 100644
--- a/ui/views/NavigationDrawer/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/views/NavigationDrawer/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/views/RecyclerView/Application/src/main/java/com/example/android/recyclerview/CustomAdapter.java b/ui/views/RecyclerView/Application/src/main/java/com/example/android/recyclerview/CustomAdapter.java
index 40f9375..de704ea 100644
--- a/ui/views/RecyclerView/Application/src/main/java/com/example/android/recyclerview/CustomAdapter.java
+++ b/ui/views/RecyclerView/Application/src/main/java/com/example/android/recyclerview/CustomAdapter.java
@@ -45,7 +45,7 @@
             v.setOnClickListener(new View.OnClickListener() {
                 @Override
                 public void onClick(View v) {
-                    Log.d(TAG, "Element " + getPosition() + " clicked.");
+                    Log.d(TAG, "Element " + getAdapterPosition() + " clicked.");
                 }
             });
             textView = (TextView) v.findViewById(R.id.textView);
diff --git a/ui/views/RecyclerView/gradle/wrapper/gradle-wrapper.properties b/ui/views/RecyclerView/gradle/wrapper/gradle-wrapper.properties
index 8505d8d..b87c376 100644
--- a/ui/views/RecyclerView/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/views/RecyclerView/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/views/RecyclerView/template-params.xml b/ui/views/RecyclerView/template-params.xml
index 4f09553..5850a54 100644
--- a/ui/views/RecyclerView/template-params.xml
+++ b/ui/views/RecyclerView/template-params.xml
@@ -22,7 +22,7 @@
     <group>UI</group>
     <package>com.example.android.recyclerview</package>
 
-    <dependency>com.android.support:recyclerview-v7:21.0.2</dependency>
+    <dependency>com.android.support:recyclerview-v7:23.1.1</dependency>
 
     <!-- change minSdk if needed-->
     <minSdk>7</minSdk>
diff --git a/ui/views/RevealEffect/RevealEffectBasic/gradle/wrapper/gradle-wrapper.properties b/ui/views/RevealEffect/RevealEffectBasic/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/ui/views/RevealEffect/RevealEffectBasic/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/views/RevealEffect/RevealEffectBasic/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/views/SlidingTabs/SlidingTabsBasic/gradle/wrapper/gradle-wrapper.properties b/ui/views/SlidingTabs/SlidingTabsBasic/gradle/wrapper/gradle-wrapper.properties
index fb05029..faca0a5 100644
--- a/ui/views/SlidingTabs/SlidingTabsBasic/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/views/SlidingTabs/SlidingTabsBasic/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,5 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
+
diff --git a/ui/views/SlidingTabs/SlidingTabsColors/gradle/wrapper/gradle-wrapper.properties b/ui/views/SlidingTabs/SlidingTabsColors/gradle/wrapper/gradle-wrapper.properties
index fac5adc..8808285 100644
--- a/ui/views/SlidingTabs/SlidingTabsColors/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/views/SlidingTabs/SlidingTabsColors/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/views/SwipeRefreshLayout/SwipeRefreshLayoutBasic/gradle/wrapper/gradle-wrapper.properties b/ui/views/SwipeRefreshLayout/SwipeRefreshLayoutBasic/gradle/wrapper/gradle-wrapper.properties
index 653fca1..b1cff39 100644
--- a/ui/views/SwipeRefreshLayout/SwipeRefreshLayoutBasic/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/views/SwipeRefreshLayout/SwipeRefreshLayoutBasic/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/views/SwipeRefreshLayout/SwipeRefreshListFragment/gradle/wrapper/gradle-wrapper.properties b/ui/views/SwipeRefreshLayout/SwipeRefreshListFragment/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/ui/views/SwipeRefreshLayout/SwipeRefreshListFragment/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/views/SwipeRefreshLayout/SwipeRefreshListFragment/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/views/SwipeRefreshLayout/SwipeRefreshMultipleViews/gradle/wrapper/gradle-wrapper.properties b/ui/views/SwipeRefreshLayout/SwipeRefreshMultipleViews/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/ui/views/SwipeRefreshLayout/SwipeRefreshMultipleViews/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/views/SwipeRefreshLayout/SwipeRefreshMultipleViews/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/views/TextSwitcher/gradle/wrapper/gradle-wrapper.properties b/ui/views/TextSwitcher/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/ui/views/TextSwitcher/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/views/TextSwitcher/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/window/AdvancedImmersiveMode/gradle/wrapper/gradle-wrapper.properties b/ui/window/AdvancedImmersiveMode/gradle/wrapper/gradle-wrapper.properties
index 699a491..27b249f 100644
--- a/ui/window/AdvancedImmersiveMode/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/window/AdvancedImmersiveMode/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/window/BasicImmersiveMode/gradle/wrapper/gradle-wrapper.properties b/ui/window/BasicImmersiveMode/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/ui/window/BasicImmersiveMode/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/window/BasicImmersiveMode/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/window/ImmersiveMode/gradle/wrapper/gradle-wrapper.properties b/ui/window/ImmersiveMode/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/ui/window/ImmersiveMode/gradle/wrapper/gradle-wrapper.properties
+++ b/ui/window/ImmersiveMode/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/window/MultiWindowPlayground/.google/packaging.yaml b/ui/window/MultiWindowPlayground/.google/packaging.yaml
new file mode 100644
index 0000000..a6ca69e
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/.google/packaging.yaml
@@ -0,0 +1,18 @@
+
+# GOOGLE SAMPLE PACKAGING DATA
+#
+# This file is used by Google as part of our samples packaging process.
+# End users may safely ignore this file. It has no relevance to other systems.
+---
+status:       DRAFT
+technologies: [Android]
+categories:   [Android N Preview]
+languages:    [Java]
+solutions:    [Mobile]
+github:       android-MultiWindowPlayground
+level:        INTERMEDIATE
+icon:         screenshots/icon-web.png
+apiRefs:
+    - android:android.content.Intent
+    - android:android.app.ActivityOptions
+license: apache2
diff --git a/ui/window/MultiWindowPlayground/Application/.gitignore b/ui/window/MultiWindowPlayground/Application/.gitignore
new file mode 100644
index 0000000..537302e
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/Application/.gitignore
@@ -0,0 +1,15 @@
+# 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.
+src/template/
+src/common/
diff --git a/ui/window/MultiWindowPlayground/Application/build.gradle b/ui/window/MultiWindowPlayground/Application/build.gradle
new file mode 100644
index 0000000..ce29114
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/Application/build.gradle
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 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.
+ */
+
+buildscript {
+    repositories {
+        jcenter()
+    }
+
+    dependencies {
+        classpath 'com.android.tools.build:gradle:2.0.0'
+    }
+}
+
+allprojects {
+    repositories {
+        jcenter()
+    }
+}
+
+apply plugin: 'com.android.application'
+
+android {
+    compileSdkVersion 'android-N'
+    buildToolsVersion '24.0.0 rc1'
+
+    defaultConfig {
+        applicationId "com.android.multiwindowplayground"
+        minSdkVersion 'N'
+        targetSdkVersion 'N'
+        versionCode 1
+        versionName "1.0"
+        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+
+    }
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+        }
+    }
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_7
+        targetCompatibility JavaVersion.VERSION_1_7
+    }
+}
+
+dependencies {
+    compile fileTree(include: ['*.jar'], dir: 'libs')
+    testCompile 'junit:junit:4.12'
+    compile 'com.android.support:appcompat-v7:24.0.0-alpha1'
+    androidTestCompile 'com.android.support:support-annotations:24.0.0-alpha1'
+    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1'
+}
diff --git a/ui/window/MultiWindowPlayground/Application/proguard-project.txt b/ui/window/MultiWindowPlayground/Application/proguard-project.txt
new file mode 100644
index 0000000..f2fe155
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/Application/proguard-project.txt
@@ -0,0 +1,20 @@
+# To enable ProGuard in your project, edit project.properties
+# to define the proguard.config property as described in that file.
+#
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in ${sdk.dir}/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the ProGuard
+# include property in project.properties.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}
diff --git a/ui/window/MultiWindowPlayground/Application/src/androidTest/java/LaunchTests.java b/ui/window/MultiWindowPlayground/Application/src/androidTest/java/LaunchTests.java
new file mode 100644
index 0000000..e0567ef
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/Application/src/androidTest/java/LaunchTests.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 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.
+ */
+
+import com.android.multiwindowplayground.MainActivity;
+import com.android.multiwindowplayground.R;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import android.support.test.rule.ActivityTestRule;
+import android.support.test.runner.AndroidJUnit4;
+import android.test.suitebuilder.annotation.LargeTest;
+
+import static android.support.test.espresso.Espresso.onView;
+import static android.support.test.espresso.action.ViewActions.click;
+import static android.support.test.espresso.action.ViewActions.scrollTo;
+import static android.support.test.espresso.assertion.ViewAssertions.matches;
+import static android.support.test.espresso.matcher.ViewMatchers.withId;
+import static android.support.test.espresso.matcher.ViewMatchers.withText;
+
+@LargeTest
+@RunWith(AndroidJUnit4.class)
+public class LaunchTests {
+
+    @Rule
+    public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>(
+            MainActivity.class);
+
+
+    @Test
+    public void testLaunchBasicActivity() {
+        // Click the 'start basic activity' button.
+        onView(withId(R.id.button_start_basic)).perform(scrollTo(), click());
+
+        // Verify that the description for the basic activity is now displayed.
+        onView(withId(R.id.description))
+                .check(matches(withText(R.string.activity_description_basic)));
+    }
+
+    @Test
+    public void testLaunchUnresizableActivity() {
+        // Click the 'start unresizable activity' button.
+        onView(withId(R.id.start_unresizable)).perform(scrollTo(), click());
+
+        // Verify that the description for the unresizable activity is now displayed.
+        onView(withId(R.id.description))
+                .check(matches(withText(R.string.activity_description_unresizable)));
+    }
+
+    @Test
+    public void testLaunchAdjacentActivity() {
+
+        // Click the 'start adjacent activity' button.
+        onView(withId(R.id.start_adjacent)).perform(scrollTo(), click());
+
+        // Verify that the correct description is now displayed.
+        onView(withId(R.id.description))
+                .check(matches(withText(R.string.activity_adjacent_description)));
+    }
+
+    @Test
+    public void testLaunchCustomConfigurationActivity() {
+        // Click the 'start activity that handles configuration changes' button.
+        onView(withId(R.id.start_customconfiguration)).perform(scrollTo(), click());
+
+        // Verify that the correct description is now displayed.
+        onView(withId(R.id.description))
+                .check(matches(withText(R.string.activity_custom_description)));
+    }
+
+
+    @Test
+    public void testLaunchMinimumSizeActivity() {
+        // Click the 'start activity with minimum size' button.
+        onView(withId(R.id.start_minimumsize)).perform(scrollTo(), click());
+
+        // Verify that the correct description is now displayed.
+        onView(withId(R.id.description))
+                .check(matches(withText(R.string.activity_minimum_description)));
+    }
+
+    @Test
+    public void testLaunchBoundsActivity() {
+        // Click the 'start activity with launch bounds' button.
+        onView(withId(R.id.start_launchbounds)).perform(scrollTo(), click());
+
+        // Verify that the correct description is now displayed.
+        onView(withId(R.id.description))
+                .check(matches(withText(R.string.activity_bounds_description)));
+    }
+
+
+}
diff --git a/ui/window/MultiWindowPlayground/Application/src/main/AndroidManifest.xml b/ui/window/MultiWindowPlayground/Application/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..c242903
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/Application/src/main/AndroidManifest.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  Copyright (C) 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.
+  -->
+
+<manifest package="com.android.multiwindowplayground"
+    xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <application
+        android:allowBackup="true"
+        android:icon="@mipmap/ic_launcher"
+        android:label="@string/app_name"
+        android:supportsRtl="true"
+        android:theme="@style/MultiWindowSampleTheme">
+        <!-- The launcher Activity that is started when the application is first started.
+         Note that we are setting the task affinity to "" to ensure each activity is launched
+         into a separate task stack. -->
+        <activity
+            android:name="com.android.multiwindowplayground.MainActivity"
+            android:taskAffinity="">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+
+        <!-- This Activity cannot be resized and is always displayed full screen. -->
+        <activity
+            android:name="com.android.multiwindowplayground.activities.UnresizableActivity"
+            android:resizeableActivity="false"
+            android:taskAffinity="" />
+
+        <!-- This Activity has a default size (750x500dp) with a minimum size
+        (500dp at its shortest side). It is launched in the top/end (top/right) corner by default.
+         These attributes are defined in the 'layout' tag within an Activity definition. -->
+        <activity
+            android:name="com.android.multiwindowplayground.activities.MinimumSizeActivity"
+            android:launchMode="singleInstance"
+            android:taskAffinity="">
+            <layout
+                android:defaultHeight="500dp"
+                android:defaultWidth="750dp"
+                android:gravity="top|end"
+                android:minimalWidth="500dp"
+                android:minimalHeight="500dp" />
+        </activity>
+
+        <!-- In split-screen mode, this Activity is launched adjacent to another Activity. This is
+          controlled via a flag set in the intent that launches this Activity. -->
+        <activity
+            android:name="com.android.multiwindowplayground.activities.AdjacentActivity"
+            android:taskAffinity="" />
+
+        <!-- This Activity is launched within an area defined in its launch intent. -->
+        <activity
+            android:name="com.android.multiwindowplayground.activities.LaunchBoundsActivity"
+            android:taskAffinity="" />
+
+        <!-- This activity handles all configuration changes itself.
+        Callbacks for configuration changes are received in 'onConfigurationChanged'. -->
+        <activity
+            android:name="com.android.multiwindowplayground.activities.CustomConfigurationChangeActivity"
+            android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
+            android:launchMode="singleInstance"
+            android:taskAffinity="" />
+
+        <!-- This Activity is launched in a new task without any special flags or settings. -->
+        <activity
+            android:name="com.android.multiwindowplayground.activities.BasicActivity"
+            android:launchMode="singleInstance"
+            android:taskAffinity="" />
+
+    </application>
+
+</manifest>
diff --git a/ui/window/MultiWindowPlayground/Application/src/main/java/com/android/multiwindowplayground/MainActivity.java b/ui/window/MultiWindowPlayground/Application/src/main/java/com/android/multiwindowplayground/MainActivity.java
new file mode 100644
index 0000000..bd7b552
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/Application/src/main/java/com/android/multiwindowplayground/MainActivity.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 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.android.multiwindowplayground;
+
+import com.android.multiwindowplayground.activities.AdjacentActivity;
+import com.android.multiwindowplayground.activities.BasicActivity;
+import com.android.multiwindowplayground.activities.CustomConfigurationChangeActivity;
+import com.android.multiwindowplayground.activities.LaunchBoundsActivity;
+import com.android.multiwindowplayground.activities.LoggingActivity;
+import com.android.multiwindowplayground.activities.MinimumSizeActivity;
+import com.android.multiwindowplayground.activities.UnresizableActivity;
+
+import android.app.ActivityOptions;
+import android.content.Intent;
+import android.graphics.Rect;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+
+public class MainActivity extends LoggingActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_main);
+
+        View multiDisabledMessage = findViewById(R.id.warning_multiwindow_disabled);
+        // Display an additional message if the app is not in multiwindow mode.
+        if (!isInMultiWindowMode()) {
+            multiDisabledMessage.setVisibility(View.VISIBLE);
+        } else {
+            multiDisabledMessage.setVisibility(View.GONE);
+        }
+    }
+
+    public void onStartUnresizableClick(View view) {
+        Log.d(mLogTag, "** starting UnresizableActivity");
+
+        /*
+         * This activity is marked as 'unresizable' in the AndroidManifest. We need to specify the
+         * FLAG_ACTIVITY_NEW_TASK flag here to launch it into a new task stack, otherwise the
+         * properties from the root activity would have been inherited (which was here marked as
+         * resizable by default).
+        */
+        Intent intent = new Intent(this, UnresizableActivity.class);
+        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        startActivity(intent);
+    }
+
+    public void onStartMinimumSizeActivity(View view) {
+        Log.d(mLogTag, "** starting MinimumSizeActivity");
+
+        startActivity(new Intent(this, MinimumSizeActivity.class));
+    }
+
+    public void onStartAdjacentActivity(View view) {
+        Log.d(mLogTag, "** starting AdjacentActivity");
+
+        /*
+         * Start this activity adjacent to the focused activity (ie. this activity) if possible.
+         * Note that this flag is just a hint to the system and may be ignored. For example,
+         * if the activity is launched within the same task, it will be launched on top of the
+         * previous activity that started the Intent. That's why the Intent.FLAG_ACTIVITY_NEW_TASK
+         * flag is specified here in the intent - this will start the activity in a new task.
+         */
+        Intent intent = new Intent(this, AdjacentActivity.class);
+        intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK);
+        startActivity(intent);
+    }
+
+    public void onStartLaunchBoundsActivity(View view) {
+        Log.d(mLogTag, "** starting LaunchBoundsActivity");
+
+        // Define the bounds in which the Activity will be launched into.
+        Rect bounds = new Rect(500, 300, 100, 0);
+
+        // Set the bounds as an activity option.
+        ActivityOptions options = ActivityOptions.makeBasic();
+        options.setLaunchBounds(bounds);
+
+        // Start the LaunchBoundsActivity with the specified options
+        Intent intent = new Intent(this, LaunchBoundsActivity.class);
+        startActivity(intent, options.toBundle());
+
+    }
+
+    public void onStartBasicActivity(View view) {
+        Log.d(mLogTag, "** starting BasicActivity");
+
+        // Start an Activity with the default options in the 'singleTask' launch mode as defined in
+        // the AndroidManifest.xml.
+        startActivity(new Intent(this, BasicActivity.class));
+
+    }
+
+    public void onStartCustomConfigurationActivity(View view) {
+        Log.d(mLogTag, "** starting CustomConfigurationChangeActivity");
+
+        // Start an Activity that handles all configuration changes itself.
+        startActivity(new Intent(this, CustomConfigurationChangeActivity.class));
+
+    }
+}
diff --git a/ui/window/MultiWindowPlayground/Application/src/main/java/com/android/multiwindowplayground/activities/AdjacentActivity.java b/ui/window/MultiWindowPlayground/Application/src/main/java/com/android/multiwindowplayground/activities/AdjacentActivity.java
new file mode 100644
index 0000000..cfb915b
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/Application/src/main/java/com/android/multiwindowplayground/activities/AdjacentActivity.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 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.android.multiwindowplayground.activities;
+
+import com.android.multiwindowplayground.R;
+
+import android.os.Bundle;
+import android.view.View;
+
+/**
+ * This Activity is to be launched adjacent to another Activity using the {@link
+ * android.content.Intent#FLAG_ACTIVITY_LAUNCH_ADJACENT}.
+ *
+ * @see com.android.multiwindowplayground.MainActivity#onStartAdjacentActivity(View)
+ */
+public class AdjacentActivity extends LoggingActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_logging);
+
+        setBackgroundColor(R.color.teal);
+        setDescription(R.string.activity_adjacent_description);
+    }
+
+}
diff --git a/ui/window/MultiWindowPlayground/Application/src/main/java/com/android/multiwindowplayground/activities/BasicActivity.java b/ui/window/MultiWindowPlayground/Application/src/main/java/com/android/multiwindowplayground/activities/BasicActivity.java
new file mode 100644
index 0000000..c40dee2
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/Application/src/main/java/com/android/multiwindowplayground/activities/BasicActivity.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 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.android.multiwindowplayground.activities;
+
+import com.android.multiwindowplayground.R;
+
+import android.os.Bundle;
+import android.view.View;
+
+/**
+ * This activity is the most basic, simeple use case and is to be launched without any special
+ * flags
+ * or settings.
+ *
+ * @see com.android.multiwindowplayground.MainActivity#onStartBasicActivity(View)
+ */
+public class BasicActivity extends LoggingActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_logging);
+
+        // Set the color and description
+        setDescription(R.string.activity_description_basic);
+        setBackgroundColor(R.color.gray);
+
+    }
+}
diff --git a/ui/window/MultiWindowPlayground/Application/src/main/java/com/android/multiwindowplayground/activities/CustomConfigurationChangeActivity.java b/ui/window/MultiWindowPlayground/Application/src/main/java/com/android/multiwindowplayground/activities/CustomConfigurationChangeActivity.java
new file mode 100644
index 0000000..32e5233
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/Application/src/main/java/com/android/multiwindowplayground/activities/CustomConfigurationChangeActivity.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 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.android.multiwindowplayground.activities;
+
+import com.android.multiwindowplayground.R;
+
+import android.content.res.Configuration;
+import android.os.Bundle;
+import android.view.View;
+
+/**
+ * This activity handles configuration changes itself. The list of configuration changes that are
+ * supported is defined in its AndroidManifest definition. Each configuration change triggers a
+ * call to {@link #onConfigurationChanged(Configuration)}, which is logged in the {@link
+ * LoggingActivity}.
+ *
+ * @see com.android.multiwindowplayground.MainActivity#onStartCustomConfigurationActivity(View)
+ */
+public class CustomConfigurationChangeActivity extends LoggingActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_logging);
+
+        setBackgroundColor(R.color.cyan);
+        setDescription(R.string.activity_custom_description);
+    }
+
+    @Override
+    public void onConfigurationChanged(Configuration newConfig) {
+        super.onConfigurationChanged(newConfig);
+
+        /*
+        Note: The implementation in LoggingActivity logs the output o the new configuration.
+        This callback is received whenever the configuration is updated, for example when the
+        size of this Activity is changed.
+         */
+    }
+}
diff --git a/ui/window/MultiWindowPlayground/Application/src/main/java/com/android/multiwindowplayground/activities/LaunchBoundsActivity.java b/ui/window/MultiWindowPlayground/Application/src/main/java/com/android/multiwindowplayground/activities/LaunchBoundsActivity.java
new file mode 100644
index 0000000..80a98f2
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/Application/src/main/java/com/android/multiwindowplayground/activities/LaunchBoundsActivity.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 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.android.multiwindowplayground.activities;
+
+import com.android.multiwindowplayground.R;
+
+import android.os.Bundle;
+import android.view.View;
+
+/**
+ * In free-form mode, this activity is to be launched within a defined bounds on screen.
+ * This property is set as part of the Intent that starts this activity.
+ *
+ * @see com.android.multiwindowplayground.MainActivity#onStartLaunchBoundsActivity(View)
+ */
+public class LaunchBoundsActivity extends LoggingActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_logging);
+
+        setBackgroundColor(R.color.lime);
+        setDescription(R.string.activity_bounds_description);
+    }
+
+}
diff --git a/ui/window/MultiWindowPlayground/Application/src/main/java/com/android/multiwindowplayground/activities/LoggingActivity.java b/ui/window/MultiWindowPlayground/Application/src/main/java/com/android/multiwindowplayground/activities/LoggingActivity.java
new file mode 100644
index 0000000..988a319
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/Application/src/main/java/com/android/multiwindowplayground/activities/LoggingActivity.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 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.android.multiwindowplayground.activities;
+
+import com.android.multiwindowplayground.R;
+import com.example.android.common.logger.Log;
+import com.example.android.common.logger.LogFragment;
+import com.example.android.common.logger.LogWrapper;
+import com.example.android.common.logger.MessageOnlyLogFilter;
+
+import android.content.res.Configuration;
+import android.os.Bundle;
+import android.os.PersistableBundle;
+import android.support.annotation.ColorRes;
+import android.support.annotation.StringRes;
+import android.support.v7.app.AppCompatActivity;
+import android.view.View;
+import android.widget.TextView;
+
+/**
+ * Activity that logs all key lifecycle callbacks to {@link Log}.
+ * Output is also logged to the UI into a {@link LogFragment} through {@link #initializeLogging()}
+ * and {@link #stopLogging()}.
+ */
+public abstract class LoggingActivity extends AppCompatActivity {
+
+    protected String mLogTag = getClass().getSimpleName();
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        Log.d(mLogTag, "onCreate");
+
+
+    }
+
+    @Override
+    public void onPostCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
+        super.onPostCreate(savedInstanceState, persistentState);
+        Log.d(mLogTag, "onPostCreate");
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+        Log.d(mLogTag, "onPause");
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        Log.d(mLogTag, "onDestroy");
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        Log.d(mLogTag, "onResume");
+    }
+
+    @Override
+    public void onConfigurationChanged(Configuration newConfig) {
+        super.onConfigurationChanged(newConfig);
+        Log.d(mLogTag, "onConfigurationChanged: " + newConfig.toString());
+    }
+
+    @Override
+    protected void onPostCreate(Bundle savedInstanceState) {
+        super.onPostCreate(savedInstanceState);
+        Log.d(mLogTag, "onPostCreate");
+    }
+
+    @Override
+    protected void onStart() {
+        super.onStart();
+        // Start logging to UI.
+        initializeLogging();
+
+        Log.d(mLogTag, "onStart");
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+        // Stop logging to UI when this activity is stopped.
+        stopLogging();
+
+        Log.d(mLogTag, "onStop");
+    }
+
+    @Override
+    public void onMultiWindowModeChanged(boolean isInMultiWindowMode) {
+        super.onMultiWindowModeChanged(isInMultiWindowMode);
+
+        Log.d(mLogTag, "onMultiWindowModeChanged: " + isInMultiWindowMode);
+    }
+
+    // Logging and UI methods below.
+
+    /** Set up targets to receive log data */
+    public void initializeLogging() {
+        // Using Log, front-end to the logging chain, emulates android.util.log method signatures.
+        // Wraps Android's native log framework
+        LogWrapper logWrapper = new LogWrapper();
+        Log.setLogNode(logWrapper);
+
+        // Filter strips out everything except the message text.
+        MessageOnlyLogFilter msgFilter = new MessageOnlyLogFilter();
+        logWrapper.setNext(msgFilter);
+
+        // On screen logging via a fragment with a TextView.
+        LogFragment logFragment = (LogFragment) getSupportFragmentManager()
+                .findFragmentById(R.id.log_fragment);
+        msgFilter.setNext(logFragment.getLogView());
+    }
+
+    public void stopLogging() {
+        Log.setLogNode(null);
+    }
+
+    /**
+     * Set the description text if a TextView with the id <code>description</code> is available.
+     */
+    protected void setDescription(@StringRes int textId) {
+        // Set the text and background color
+        TextView description = (TextView) findViewById(R.id.description);
+        if (description != null) {
+            description.setText(textId);
+        }
+    }
+
+    /**
+     * Set the background color for the description text.
+     */
+    protected void setBackgroundColor(@ColorRes int colorId) {
+        View scrollView = findViewById(R.id.scrollview);
+        if (scrollView != null) {
+            scrollView.setBackgroundResource(colorId);
+        }
+    }
+
+}
diff --git a/ui/window/MultiWindowPlayground/Application/src/main/java/com/android/multiwindowplayground/activities/MinimumSizeActivity.java b/ui/window/MultiWindowPlayground/Application/src/main/java/com/android/multiwindowplayground/activities/MinimumSizeActivity.java
new file mode 100644
index 0000000..a42c379
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/Application/src/main/java/com/android/multiwindowplayground/activities/MinimumSizeActivity.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 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.android.multiwindowplayground.activities;
+
+import com.android.multiwindowplayground.R;
+
+import android.os.Bundle;
+import android.view.View;
+
+/**
+ * This Activity has a minimum size defined in the AndroidManifeset.
+ *
+ * @see com.android.multiwindowplayground.MainActivity#onStartMinimumSizeActivity(View)
+ */
+public class MinimumSizeActivity extends LoggingActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_logging);
+
+        setBackgroundColor(R.color.pink);
+        setDescription(R.string.activity_minimum_description);
+    }
+
+}
diff --git a/ui/window/MultiWindowPlayground/Application/src/main/java/com/android/multiwindowplayground/activities/UnresizableActivity.java b/ui/window/MultiWindowPlayground/Application/src/main/java/com/android/multiwindowplayground/activities/UnresizableActivity.java
new file mode 100644
index 0000000..eb2523e
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/Application/src/main/java/com/android/multiwindowplayground/activities/UnresizableActivity.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 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.android.multiwindowplayground.activities;
+
+import com.android.multiwindowplayground.R;
+
+import android.os.Bundle;
+import android.view.View;
+
+/**
+ * This Activity is defined as unresizable in the AndroidManifest.
+ * This means that this activity is always launched full screen and will not be resized by the
+ * system.
+ *
+ * @see com.android.multiwindowplayground.MainActivity#onStartUnresizableClick(View)
+ */
+public class UnresizableActivity extends LoggingActivity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_logging);
+
+        setBackgroundColor(R.color.purple);
+        setDescription(R.string.activity_description_unresizable);
+    }
+
+}
diff --git a/ui/window/MultiWindowPlayground/Application/src/main/java/com/example/android/common/logger/Log.java b/ui/window/MultiWindowPlayground/Application/src/main/java/com/example/android/common/logger/Log.java
new file mode 100755
index 0000000..7c11223
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/Application/src/main/java/com/example/android/common/logger/Log.java
@@ -0,0 +1,238 @@
+/*
+ * Copyright (C) 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.common.logger;
+
+/**
+ * Helper class for a list (or tree) of LoggerNodes.
+ *
+ * <p>When this is set as the head of the list,
+ * an instance of it can function as a drop-in replacement for {@link android.util.Log}.
+ * Most of the methods in this class server only to map a method call in Log to its equivalent
+ * in LogNode.</p>
+ */
+public class Log {
+
+    // Grabbing the native values from Android's native logging facilities,
+    // to make for easy migration and interop.
+    public static final int NONE = -1;
+    public static final int VERBOSE = android.util.Log.VERBOSE;
+    public static final int DEBUG = android.util.Log.DEBUG;
+    public static final int INFO = android.util.Log.INFO;
+    public static final int WARN = android.util.Log.WARN;
+    public static final int ERROR = android.util.Log.ERROR;
+    public static final int ASSERT = android.util.Log.ASSERT;
+
+    // Stores the beginning of the LogNode topology.
+    private static LogNode mLogNode;
+
+    /**
+     * Returns the next LogNode in the linked list.
+     */
+    public static LogNode getLogNode() {
+        return mLogNode;
+    }
+
+    /**
+     * Sets the LogNode data will be sent to.
+     */
+    public static void setLogNode(LogNode node) {
+        mLogNode = node;
+    }
+
+    /**
+     * Instructs the LogNode to print the log data provided. Other LogNodes can
+     * be chained to the end of the LogNode as desired.
+     *
+     * @param priority Log level of the data being logged. Verbose, Error, etc.
+     * @param tag      Tag for for the log data. Can be used to organize log statements.
+     * @param msg      The actual message to be logged.
+     * @param tr       If an exception was thrown, this can be sent along for the logging
+     *                 facilities
+     *                 to extract and print useful information.
+     */
+    public static void println(int priority, String tag, String msg, Throwable tr) {
+        if (mLogNode != null) {
+            mLogNode.println(priority, tag, msg, tr);
+        }
+    }
+
+    /**
+     * Instructs the LogNode to print the log data provided. Other LogNodes can
+     * be chained to the end of the LogNode as desired.
+     *
+     * @param priority Log level of the data being logged. Verbose, Error, etc.
+     * @param tag      Tag for for the log data. Can be used to organize log statements.
+     * @param msg      The actual message to be logged. The actual message to be logged.
+     */
+    public static void println(int priority, String tag, String msg) {
+        println(priority, tag, msg, null);
+    }
+
+    /**
+     * Prints a message at VERBOSE priority.
+     *
+     * @param tag Tag for for the log data. Can be used to organize log statements.
+     * @param msg The actual message to be logged.
+     * @param tr  If an exception was thrown, this can be sent along for the logging facilities
+     *            to extract and print useful information.
+     */
+    public static void v(String tag, String msg, Throwable tr) {
+        println(VERBOSE, tag, msg, tr);
+    }
+
+    /**
+     * Prints a message at VERBOSE priority.
+     *
+     * @param tag Tag for for the log data. Can be used to organize log statements.
+     * @param msg The actual message to be logged.
+     */
+    public static void v(String tag, String msg) {
+        v(tag, msg, null);
+    }
+
+
+    /**
+     * Prints a message at DEBUG priority.
+     *
+     * @param tag Tag for for the log data. Can be used to organize log statements.
+     * @param msg The actual message to be logged.
+     * @param tr  If an exception was thrown, this can be sent along for the logging facilities
+     *            to extract and print useful information.
+     */
+    public static void d(String tag, String msg, Throwable tr) {
+        println(DEBUG, tag, msg, tr);
+    }
+
+    /**
+     * Prints a message at DEBUG priority.
+     *
+     * @param tag Tag for for the log data. Can be used to organize log statements.
+     * @param msg The actual message to be logged.
+     */
+    public static void d(String tag, String msg) {
+        d(tag, msg, null);
+    }
+
+    /**
+     * Prints a message at INFO priority.
+     *
+     * @param tag Tag for for the log data. Can be used to organize log statements.
+     * @param msg The actual message to be logged.
+     * @param tr  If an exception was thrown, this can be sent along for the logging facilities
+     *            to extract and print useful information.
+     */
+    public static void i(String tag, String msg, Throwable tr) {
+        println(INFO, tag, msg, tr);
+    }
+
+    /**
+     * Prints a message at INFO priority.
+     *
+     * @param tag Tag for for the log data. Can be used to organize log statements.
+     * @param msg The actual message to be logged.
+     */
+    public static void i(String tag, String msg) {
+        i(tag, msg, null);
+    }
+
+    /**
+     * Prints a message at WARN priority.
+     *
+     * @param tag Tag for for the log data. Can be used to organize log statements.
+     * @param msg The actual message to be logged.
+     * @param tr  If an exception was thrown, this can be sent along for the logging facilities
+     *            to extract and print useful information.
+     */
+    public static void w(String tag, String msg, Throwable tr) {
+        println(WARN, tag, msg, tr);
+    }
+
+    /**
+     * Prints a message at WARN priority.
+     *
+     * @param tag Tag for for the log data. Can be used to organize log statements.
+     * @param msg The actual message to be logged.
+     */
+    public static void w(String tag, String msg) {
+        w(tag, msg, null);
+    }
+
+    /**
+     * Prints a message at WARN priority.
+     *
+     * @param tag Tag for for the log data. Can be used to organize log statements.
+     * @param tr  If an exception was thrown, this can be sent along for the logging facilities
+     *            to extract and print useful information.
+     */
+    public static void w(String tag, Throwable tr) {
+        w(tag, null, tr);
+    }
+
+    /**
+     * Prints a message at ERROR priority.
+     *
+     * @param tag Tag for for the log data. Can be used to organize log statements.
+     * @param msg The actual message to be logged.
+     * @param tr  If an exception was thrown, this can be sent along for the logging facilities
+     *            to extract and print useful information.
+     */
+    public static void e(String tag, String msg, Throwable tr) {
+        println(ERROR, tag, msg, tr);
+    }
+
+    /**
+     * Prints a message at ERROR priority.
+     *
+     * @param tag Tag for for the log data. Can be used to organize log statements.
+     * @param msg The actual message to be logged.
+     */
+    public static void e(String tag, String msg) {
+        e(tag, msg, null);
+    }
+
+    /**
+     * Prints a message at ASSERT priority.
+     *
+     * @param tag Tag for for the log data. Can be used to organize log statements.
+     * @param msg The actual message to be logged.
+     * @param tr  If an exception was thrown, this can be sent along for the logging facilities
+     *            to extract and print useful information.
+     */
+    public static void wtf(String tag, String msg, Throwable tr) {
+        println(ASSERT, tag, msg, tr);
+    }
+
+    /**
+     * Prints a message at ASSERT priority.
+     *
+     * @param tag Tag for for the log data. Can be used to organize log statements.
+     * @param msg The actual message to be logged.
+     */
+    public static void wtf(String tag, String msg) {
+        wtf(tag, msg, null);
+    }
+
+    /**
+     * Prints a message at ASSERT priority.
+     *
+     * @param tag Tag for for the log data. Can be used to organize log statements.
+     * @param tr  If an exception was thrown, this can be sent along for the logging facilities
+     *            to extract and print useful information.
+     */
+    public static void wtf(String tag, Throwable tr) {
+        wtf(tag, null, tr);
+    }
+}
diff --git a/ui/window/MultiWindowPlayground/Application/src/main/java/com/example/android/common/logger/LogFragment.java b/ui/window/MultiWindowPlayground/Application/src/main/java/com/example/android/common/logger/LogFragment.java
new file mode 100755
index 0000000..0e9ea9e
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/Application/src/main/java/com/example/android/common/logger/LogFragment.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 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.common.logger;
+
+import android.graphics.Typeface;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ScrollView;
+
+/**
+ * Simple fraggment which contains a LogView and uses is to output log data it receives
+ * through the LogNode interface.
+ */
+public class LogFragment extends Fragment {
+
+    private LogView mLogView;
+    private ScrollView mScrollView;
+
+    public LogFragment() {
+    }
+
+    public View inflateViews() {
+        mScrollView = new ScrollView(getActivity());
+        ViewGroup.LayoutParams scrollParams = new ViewGroup.LayoutParams(
+                ViewGroup.LayoutParams.MATCH_PARENT,
+                ViewGroup.LayoutParams.MATCH_PARENT);
+        mScrollView.setLayoutParams(scrollParams);
+
+        mLogView = new LogView(getActivity());
+        ViewGroup.LayoutParams logParams = new ViewGroup.LayoutParams(scrollParams);
+        logParams.height = ViewGroup.LayoutParams.WRAP_CONTENT;
+        mLogView.setTextAppearance(android.R.style.TextAppearance_Material_Medium);
+        mLogView.setLayoutParams(logParams);
+        mLogView.setClickable(true);
+        mLogView.setFocusable(true);
+        mLogView.setTypeface(Typeface.create("monospace", Typeface.NORMAL));
+
+        // Want to set padding as 16 dips, setPadding takes pixels.  Hooray math!
+        int paddingDips = 16;
+        double scale = getResources().getDisplayMetrics().density;
+        int paddingPixels = (int) ((paddingDips * (scale)) + .5);
+        mLogView.setPadding(paddingPixels, paddingPixels, paddingPixels, paddingPixels);
+        mLogView.setCompoundDrawablePadding(paddingPixels);
+
+        mLogView.setGravity(Gravity.BOTTOM);
+
+        mScrollView.addView(mLogView);
+        return mScrollView;
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+            Bundle savedInstanceState) {
+
+        View result = inflateViews();
+
+        mLogView.addTextChangedListener(new TextWatcher() {
+            @Override
+            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+            }
+
+            @Override
+            public void onTextChanged(CharSequence s, int start, int before, int count) {
+            }
+
+            @Override
+            public void afterTextChanged(Editable s) {
+
+                mScrollView.post(new Runnable() {
+                    @Override
+                    public void run() {
+                        mScrollView
+                                .smoothScrollTo(0, mScrollView.getBottom() + mLogView.getHeight());
+                    }
+                });
+            }
+        });
+        return result;
+    }
+
+    public LogView getLogView() {
+        return mLogView;
+    }
+}
\ No newline at end of file
diff --git a/ui/window/MultiWindowPlayground/Application/src/main/java/com/example/android/common/logger/LogNode.java b/ui/window/MultiWindowPlayground/Application/src/main/java/com/example/android/common/logger/LogNode.java
new file mode 100755
index 0000000..7620ca6
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/Application/src/main/java/com/example/android/common/logger/LogNode.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 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.common.logger;
+
+/**
+ * Basic interface for a logging system that can output to one or more targets.
+ * Note that in addition to classes that will output these logs in some format,
+ * one can also implement this interface over a filter and insert that in the chain,
+ * such that no targets further down see certain data, or see manipulated forms of the data.
+ * You could, for instance, write a "ToHtmlLoggerNode" that just converted all the log data
+ * it received to HTML and sent it along to the next node in the chain, without printing it
+ * anywhere.
+ */
+public interface LogNode {
+
+    /**
+     * Instructs first LogNode in the list to print the log data provided.
+     *
+     * @param priority Log level of the data being logged.  Verbose, Error, etc.
+     * @param tag      Tag for for the log data.  Can be used to organize log statements.
+     * @param msg      The actual message to be logged. The actual message to be logged.
+     * @param tr       If an exception was thrown, this can be sent along for the logging
+     *                 facilities
+     *                 to extract and print useful information.
+     */
+    public void println(int priority, String tag, String msg, Throwable tr);
+
+}
diff --git a/ui/window/MultiWindowPlayground/Application/src/main/java/com/example/android/common/logger/LogView.java b/ui/window/MultiWindowPlayground/Application/src/main/java/com/example/android/common/logger/LogView.java
new file mode 100755
index 0000000..b1fb205
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/Application/src/main/java/com/example/android/common/logger/LogView.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 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.common.logger;
+
+import android.app.Activity;
+import android.content.Context;
+import android.util.AttributeSet;
+import android.widget.TextView;
+
+/**
+ * Simple TextView which is used to output log data received through the LogNode interface.
+ */
+public class LogView extends TextView implements LogNode {
+
+    public LogView(Context context) {
+        super(context);
+    }
+
+    public LogView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public LogView(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+    }
+
+    /**
+     * Formats the log data and prints it out to the LogView.
+     *
+     * @param priority Log level of the data being logged.  Verbose, Error, etc.
+     * @param tag      Tag for for the log data.  Can be used to organize log statements.
+     * @param msg      The actual message to be logged. The actual message to be logged.
+     * @param tr       If an exception was thrown, this can be sent along for the logging
+     *                 facilities
+     *                 to extract and print useful information.
+     */
+    @Override
+    public void println(int priority, String tag, String msg, Throwable tr) {
+
+        String priorityStr = null;
+
+        // For the purposes of this View, we want to print the priority as readable text.
+        switch (priority) {
+            case android.util.Log.VERBOSE:
+                priorityStr = "VERBOSE";
+                break;
+            case android.util.Log.DEBUG:
+                priorityStr = "DEBUG";
+                break;
+            case android.util.Log.INFO:
+                priorityStr = "INFO";
+                break;
+            case android.util.Log.WARN:
+                priorityStr = "WARN";
+                break;
+            case android.util.Log.ERROR:
+                priorityStr = "ERROR";
+                break;
+            case android.util.Log.ASSERT:
+                priorityStr = "ASSERT";
+                break;
+            default:
+                break;
+        }
+
+        // Handily, the Log class has a facility for converting a stack trace into a usable string.
+        String exceptionStr = null;
+        if (tr != null) {
+            exceptionStr = android.util.Log.getStackTraceString(tr);
+        }
+
+        // Take the priority, tag, message, and exception, and concatenate as necessary
+        // into one usable line of text.
+        final StringBuilder outputBuilder = new StringBuilder();
+
+        String delimiter = "\t";
+        appendIfNotNull(outputBuilder, priorityStr, delimiter);
+        appendIfNotNull(outputBuilder, tag, delimiter);
+        appendIfNotNull(outputBuilder, msg, delimiter);
+        appendIfNotNull(outputBuilder, exceptionStr, delimiter);
+
+        // In case this was originally called from an AsyncTask or some other off-UI thread,
+        // make sure the update occurs within the UI thread.
+        ((Activity) getContext()).runOnUiThread((new Thread(new Runnable() {
+            @Override
+            public void run() {
+                // Display the text we just generated within the LogView.
+                appendToLog(outputBuilder.toString());
+            }
+        })));
+
+        if (mNext != null) {
+            mNext.println(priority, tag, msg, tr);
+        }
+    }
+
+    public LogNode getNext() {
+        return mNext;
+    }
+
+    public void setNext(LogNode node) {
+        mNext = node;
+    }
+
+    /**
+     * Takes a string and adds to it, with a separator, if the bit to be added isn't null. Since
+     * the logger takes so many arguments that might be null, this method helps cut out some of the
+     * agonizing tedium of writing the same 3 lines over and over.
+     *
+     * @param source    StringBuilder containing the text to append to.
+     * @param addStr    The String to append
+     * @param delimiter The String to separate the source and appended strings. A tab or comma,
+     *                  for instance.
+     * @return The fully concatenated String as a StringBuilder
+     */
+    private StringBuilder appendIfNotNull(StringBuilder source, String addStr, String delimiter) {
+        if (addStr != null) {
+            if (addStr.length() == 0) {
+                delimiter = "";
+            }
+
+            return source.append(addStr).append(delimiter);
+        }
+        return source;
+    }
+
+    // The next LogNode in the chain.
+    LogNode mNext;
+
+    /** Outputs the string as a new line of log data in the LogView. */
+    public void appendToLog(String s) {
+        append("\n" + s);
+    }
+
+
+}
diff --git a/ui/window/MultiWindowPlayground/Application/src/main/java/com/example/android/common/logger/LogWrapper.java b/ui/window/MultiWindowPlayground/Application/src/main/java/com/example/android/common/logger/LogWrapper.java
new file mode 100755
index 0000000..8594bc4
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/Application/src/main/java/com/example/android/common/logger/LogWrapper.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 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.common.logger;
+
+import android.util.Log;
+
+/**
+ * Helper class which wraps Android's native Log utility in the Logger interface.  This way
+ * normal DDMS output can be one of the many targets receiving and outputting logs simultaneously.
+ */
+public class LogWrapper implements LogNode {
+
+    // For piping:  The next node to receive Log data after this one has done its work.
+    private LogNode mNext;
+
+    /**
+     * Returns the next LogNode in the linked list.
+     */
+    public LogNode getNext() {
+        return mNext;
+    }
+
+    /**
+     * Sets the LogNode data will be sent to..
+     */
+    public void setNext(LogNode node) {
+        mNext = node;
+    }
+
+    /**
+     * Prints data out to the console using Android's native log mechanism.
+     *
+     * @param priority Log level of the data being logged.  Verbose, Error, etc.
+     * @param tag      Tag for for the log data.  Can be used to organize log statements.
+     * @param msg      The actual message to be logged. The actual message to be logged.
+     * @param tr       If an exception was thrown, this can be sent along for the logging
+     *                 facilities
+     *                 to extract and print useful information.
+     */
+    @Override
+    public void println(int priority, String tag, String msg, Throwable tr) {
+        // There actually are log methods that don't take a msg parameter.  For now,
+        // if that's the case, just convert null to the empty string and move on.
+        String useMsg = msg;
+        if (useMsg == null) {
+            useMsg = "";
+        }
+
+        // If an exeption was provided, convert that exception to a usable string and attach
+        // it to the end of the msg method.
+        if (tr != null) {
+            msg += "\n" + Log.getStackTraceString(tr);
+        }
+
+        // This is functionally identical to Log.x(tag, useMsg);
+        // For instance, if priority were Log.VERBOSE, this would be the same as Log.v(tag, useMsg)
+        Log.println(priority, tag, useMsg);
+
+        // If this isn't the last node in the chain, move things along.
+        if (mNext != null) {
+            mNext.println(priority, tag, msg, tr);
+        }
+    }
+}
diff --git a/ui/window/MultiWindowPlayground/Application/src/main/java/com/example/android/common/logger/MessageOnlyLogFilter.java b/ui/window/MultiWindowPlayground/Application/src/main/java/com/example/android/common/logger/MessageOnlyLogFilter.java
new file mode 100755
index 0000000..b86e1ae
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/Application/src/main/java/com/example/android/common/logger/MessageOnlyLogFilter.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 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.common.logger;
+
+/**
+ * Simple {@link LogNode} filter, removes everything except the message.
+ * Useful for situations like on-screen log output where you don't want a lot of metadata
+ * displayed,
+ * just easy-to-read message updates as they're happening.
+ */
+public class MessageOnlyLogFilter implements LogNode {
+
+    LogNode mNext;
+
+    /**
+     * Takes the "next" LogNode as a parameter, to simplify chaining.
+     *
+     * @param next The next LogNode in the pipeline.
+     */
+    public MessageOnlyLogFilter(LogNode next) {
+        mNext = next;
+    }
+
+    public MessageOnlyLogFilter() {
+    }
+
+    @Override
+    public void println(int priority, String tag, String msg, Throwable tr) {
+        if (mNext != null) {
+            getNext().println(Log.NONE, null, msg, null);
+        }
+    }
+
+    /**
+     * Returns the next LogNode in the chain.
+     */
+    public LogNode getNext() {
+        return mNext;
+    }
+
+    /**
+     * Sets the LogNode data will be sent to..
+     */
+    public void setNext(LogNode node) {
+        mNext = node;
+    }
+
+}
diff --git a/ui/window/MultiWindowPlayground/Application/src/main/res/layout/activity_logging.xml b/ui/window/MultiWindowPlayground/Application/src/main/res/layout/activity_logging.xml
new file mode 100644
index 0000000..6c6d79b
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/Application/src/main/res/layout/activity_logging.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  Copyright (C) 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.
+  -->
+
+<!-- This layout contains a TextView and a LogFragment that logs some text to the screen. -->
+<LinearLayout android:id="@+id/layout"
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/white"
+    android:orientation="vertical">
+
+    <ScrollView
+        android:id="@+id/scrollview"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_gravity="top"
+        android:layout_weight="0.75">
+
+        <TextView
+            android:id="@+id/description"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:paddingBottom="@dimen/activity_vertical_margin"
+            android:paddingLeft="@dimen/activity_horizontal_margin"
+            android:paddingRight="@dimen/activity_horizontal_margin"
+            android:paddingTop="@dimen/activity_vertical_margin"
+            android:textColor="@color/white" />
+    </ScrollView>
+
+
+    <include
+        layout="@layout/logging"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_gravity="bottom"
+        android:layout_weight="0.25" />
+</LinearLayout>
\ No newline at end of file
diff --git a/ui/window/MultiWindowPlayground/Application/src/main/res/layout/activity_main.xml b/ui/window/MultiWindowPlayground/Application/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..640d9cc
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/Application/src/main/res/layout/activity_main.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+  Copyright (C) 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.
+  -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_height="match_parent"
+    android:layout_width="match_parent"
+    android:orientation="vertical"
+    android:background="@color/lightgray">
+
+    <ScrollView xmlns:tools="http://schemas.android.com/tools"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="0.75"
+        android:background="@color/white"
+        android:layout_gravity="top"
+        android:id="@+id/scrollview"
+        tools:context="com.android.multiwindowplayground.MainActivity">
+
+        <LinearLayout
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:paddingBottom="@dimen/activity_vertical_margin"
+            android:paddingLeft="@dimen/activity_horizontal_margin"
+            android:paddingRight="@dimen/activity_horizontal_margin"
+            android:paddingTop="@dimen/activity_vertical_margin"
+            android:orientation="vertical">
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/introduction_title"
+                android:textSize="30sp" />
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:id="@+id/warning_multiwindow_disabled"
+                android:visibility="gone"
+                tools:visibility="visible"
+                style="@style/TextWarning"
+                android:paddingTop="@dimen/content_vertical_dividing_padding"
+                android:paddingBottom="@dimen/content_vertical_dividing_padding"
+                android:text="Enable multi-window mode to see this sample in action!" />
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:id="@+id/description"
+                android:text="@string/sample_introduction" />
+
+            <Button
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:id="@+id/button_start_basic"
+                android:onClick="onStartBasicActivity"
+                android:text="@string/start_default" />
+
+            <Button
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:id="@+id/start_unresizable"
+                android:onClick="onStartUnresizableClick"
+                android:text="@string/start_unresizable" />
+
+            <Button
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:id="@+id/start_adjacent"
+                android:onClick="onStartAdjacentActivity"
+                android:text="@string/start_adjacent" />
+
+            <Button
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:id="@+id/start_customconfiguration"
+                android:onClick="onStartCustomConfigurationActivity"
+                android:text="@string/start_custom_activity" />
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:paddingTop="@dimen/content_vertical_dividing_padding"
+                android:text="@string/sample_freeform_introduction" />
+
+            <Button
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:id="@+id/start_minimumsize"
+                android:onClick="onStartMinimumSizeActivity"
+                android:text="@string/start_minimum" />
+
+            <Button
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:id="@+id/start_launchbounds"
+                android:onClick="onStartLaunchBoundsActivity"
+                android:text="@string/start_bounds" />
+
+        </LinearLayout>
+    </ScrollView>
+
+    <include
+        layout="@layout/logging"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_gravity="bottom"
+        android:layout_weight="0.25" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/ui/window/MultiWindowPlayground/Application/src/main/res/layout/logging.xml b/ui/window/MultiWindowPlayground/Application/src/main/res/layout/logging.xml
new file mode 100644
index 0000000..b2da5f1
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/Application/src/main/res/layout/logging.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!--
+  Copyright (C) 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.
+  -->
+
+<fragment xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:id="@+id/log_fragment"
+    android:name="com.example.android.common.logger.LogFragment" />
+
diff --git a/ui/window/MultiWindowPlayground/Application/src/main/res/mipmap-hdpi/ic_launcher.png b/ui/window/MultiWindowPlayground/Application/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100755
index 0000000..a150a5c
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/Application/src/main/res/mipmap-hdpi/ic_launcher.png
Binary files differ
diff --git a/ui/window/MultiWindowPlayground/Application/src/main/res/mipmap-mdpi/ic_launcher.png b/ui/window/MultiWindowPlayground/Application/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100755
index 0000000..1a482dd
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/Application/src/main/res/mipmap-mdpi/ic_launcher.png
Binary files differ
diff --git a/ui/window/MultiWindowPlayground/Application/src/main/res/mipmap-xhdpi/ic_launcher.png b/ui/window/MultiWindowPlayground/Application/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100755
index 0000000..148db37
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/Application/src/main/res/mipmap-xhdpi/ic_launcher.png
Binary files differ
diff --git a/ui/window/MultiWindowPlayground/Application/src/main/res/mipmap-xxhdpi/ic_launcher.png b/ui/window/MultiWindowPlayground/Application/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100755
index 0000000..7c5c6a4
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/Application/src/main/res/mipmap-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/ui/window/MultiWindowPlayground/Application/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/ui/window/MultiWindowPlayground/Application/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100755
index 0000000..944fc54
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/Application/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Binary files differ
diff --git a/ui/window/MultiWindowPlayground/Application/src/main/res/values-w820dp/dimens.xml b/ui/window/MultiWindowPlayground/Application/src/main/res/values-w820dp/dimens.xml
new file mode 100644
index 0000000..e8b7e24
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/Application/src/main/res/values-w820dp/dimens.xml
@@ -0,0 +1,19 @@
+<!--
+  Copyright (C) 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.
+  -->
+
+<resources>
+    <dimen name="activity_horizontal_margin">64dp</dimen>
+</resources>
diff --git a/ui/window/MultiWindowPlayground/Application/src/main/res/values/colors.xml b/ui/window/MultiWindowPlayground/Application/src/main/res/values/colors.xml
new file mode 100644
index 0000000..e18e61e
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/Application/src/main/res/values/colors.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  Copyright (C) 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.
+  -->
+
+<resources>
+    <color name="colorPrimary">#3F51B5</color>
+    <color name="colorPrimaryDark">#303F9F</color>
+    <color name="colorAccent">#FF4081</color>
+
+    <color name="purple">#512DA8</color>
+    <color name="pink">#C2185B</color>
+    <color name="teal">#00695C</color>
+    <color name="lime">#9E9D24</color>
+    <color name="gray">#424242</color>
+    <color name="lightgray">#F5F5F5</color>
+    <color name="cyan">#00838F</color>
+
+    <color name="white">#FFFFFF</color>
+</resources>
diff --git a/ui/window/MultiWindowPlayground/Application/src/main/res/values/dimens.xml b/ui/window/MultiWindowPlayground/Application/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..3a61036
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/Application/src/main/res/values/dimens.xml
@@ -0,0 +1,22 @@
+<!--
+  Copyright (C) 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.
+  -->
+
+<resources>
+    <!-- Default screen margins, per the Android Design guidelines. -->
+    <dimen name="activity_horizontal_margin">16dp</dimen>
+    <dimen name="activity_vertical_margin">16dp</dimen>
+    <dimen name="content_vertical_dividing_padding">16dp</dimen>
+</resources>
diff --git a/ui/window/MultiWindowPlayground/Application/src/main/res/values/strings.xml b/ui/window/MultiWindowPlayground/Application/src/main/res/values/strings.xml
new file mode 100644
index 0000000..430742d
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/Application/src/main/res/values/strings.xml
@@ -0,0 +1,66 @@
+<!--
+  Copyright (C) 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.
+  -->
+
+<resources>
+    <string name="app_name">MultiWindow Playground</string>
+    <string name="introduction_title">Multiwindow Playground</string>
+    <string name="sample_introduction">This sample demonstrates the use of the multi-window API
+        available in Android N.\nFirst, switch this app into
+        <b>split-screen mode</b>
+        (for example by long-pressing the recents button). Each button below starts a new activity
+        with special flags.\n<b>See the files MainActivity.java and AndroidManifest.xml for
+        implementation details.</b>
+    </string>
+    <string name="sample_freeform_introduction">The buttons below demonstrate features only
+        available in <b>free-form multi-window mode</b>.</string>
+    <string name="start_default">Start basic, default Activity</string>
+    <string name="start_unresizable">Start unresizable Activity</string>
+    <string name="start_adjacent">Start Activity adjacent</string>
+    <string name="start_minimum">Start Activity with minimum size</string>
+    <string name="start_bounds">Start Activity with launch bounds</string>
+    <string name="start_custom_activity">Start activity that handles configuration changes.</string>
+
+    <string name="activity_description_basic">This Activity was launched in a new task without any
+        additional flags or options.
+    </string>
+    <string name="activity_description_unresizable">This activity is set as unresizable in the
+        AndroidManifest. This is done by setting the <i>resizeableActivity</i> property to
+        <i>false</i> for this activity.
+    </string>
+    <string name="activity_adjacent_description">This activity was launched with the flag
+        <b>Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT</b>.\n\nIf possible, it has been launched into the
+        adjacent area from the activity that started it.\nThis is only a hint to the system. For
+        example - if the application is not in split-screen mode, it will be launched full-screen.
+        If it is launched in the same task as the initial Activity, it will retain its activity
+        properties and its location.
+    </string>
+    <string name="activity_custom_description">This activity handles configuration changes
+        itself.\n\nIn the AndroidManifest, this activity has been configured to receive callbacks
+        for <b>screenSize|smallestScreenSize|screenLayout|orientation</b>
+        changes.\nTry resizing this activity to different sizes to see which configuration
+        properties change.
+    </string>
+    <string name="activity_bounds_description">This activity has been launched with a launch bounds
+        set in its intent. The bounds define the area into which the activity should be launched.
+        \n\nNote that this flag only applies in free-form mode.
+    </string>
+    <string name="activity_minimum_description">This activity has a minimum size.\nIt was launched
+        into the top/end corner with a a default size of 750dp by 500dp, with a minimum size of 750dp
+        as defined in its <b>layout attribute in the AndroidManifest definition</b>.
+        \n\nNote that this Activity was launched in a different task, otherwise the properties from
+        the Activity that launched this one would have been applied.
+    </string>
+</resources>
diff --git a/ui/window/MultiWindowPlayground/Application/src/main/res/values/styles.xml b/ui/window/MultiWindowPlayground/Application/src/main/res/values/styles.xml
new file mode 100644
index 0000000..0324dbd
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/Application/src/main/res/values/styles.xml
@@ -0,0 +1,36 @@
+<!--
+  Copyright (C) 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.
+  -->
+
+<resources>
+
+    <!-- Base application theme. -->
+    <style name="MultiWindowSampleTheme" parent="Theme.AppCompat.Light.DarkActionBar">
+        <!-- Customize your theme here. -->
+        <item name="colorPrimary">@color/colorPrimary</item>
+        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
+        <item name="colorAccent">@color/colorAccent</item>
+
+        <!-- Drawable to use in the background while the window is resizing on Android N. -->
+        <item name="android:windowBackgroundFallback">@color/colorAccent</item>
+        <item name="android:windowBackground">@color/colorAccent</item>
+    </style>
+
+    <style name="TextWarning" parent="TextAppearance.AppCompat.Medium">
+
+    </style>
+
+
+</resources>
diff --git a/ui/window/MultiWindowPlayground/CONTRIBUTING.md b/ui/window/MultiWindowPlayground/CONTRIBUTING.md
new file mode 100644
index 0000000..faa8b5c
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/CONTRIBUTING.md
@@ -0,0 +1,35 @@
+# How to become a contributor and submit your own code
+
+## Contributor License Agreements
+
+We'd love to accept your sample apps and patches! Before we can take them, we
+have to jump a couple of legal hurdles.
+
+Please fill out either the individual or corporate Contributor License Agreement (CLA).
+
+  * If you are an individual writing original source code and you're sure you
+    own the intellectual property, then you'll need to sign an [individual CLA]
+    (https://cla.developers.google.com).
+  * If you work for a company that wants to allow you to contribute your work,
+    then you'll need to sign a [corporate CLA]
+    (https://cla.developers.google.com).
+
+Follow either of the two links above to access the appropriate CLA and
+instructions for how to sign and return it. Once we receive it, we'll be able to
+accept your pull requests.
+
+## Contributing A Patch
+
+1. Submit an issue describing your proposed change to the repo in question.
+1. The repo owner will respond to your issue promptly.
+1. If your proposed change is accepted, and you haven't already done so, sign a
+   Contributor License Agreement (see details above).
+1. Fork the desired repo, develop and test your code changes.
+1. Ensure that your code adheres to the existing style in the sample to which
+   you are contributing. Refer to the
+   [Android Code Style Guide]
+   (https://source.android.com/source/code-style.html) for the
+   recommended coding standards for this organization.
+1. Ensure that your code has an appropriate set of unit tests which all pass.
+1. Submit a pull request.
+
diff --git a/ui/window/MultiWindowPlayground/README.md b/ui/window/MultiWindowPlayground/README.md
new file mode 100644
index 0000000..ea73dc1
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/README.md
@@ -0,0 +1,95 @@
+
+Android MultiWindowPlayground Sample
+===================================
+
+This sample demonstrates the use of the multi-window API available
+in Android N. It shows the use of new Intent flags and
+AndroidManifest properties to define the multi-window behavior.
+Switch the sample app into multi-window mode to see how it affects
+the lifecycle and behavior of the app.
+
+Introduction
+------------
+
+Android N introduces new APIs to support multiple activities
+to be displayed at the same time.
+
+Activities that are started within the same task stack
+inherit their multiwindow properties from the activity that fired
+off the intent. The following features are available when an activity
+has been launched into a new task stack.
+
+An activity can be set as not resizable through the
+`android:resizableActivity` property in the AndroidManifest. All
+applications targeting Android N or above are resizable by default.
+
+In split-screen mode, an activity can be started adjacent to the
+launching activity by setting the
+`Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT` flag in its intent.
+
+Sometimes activities may choose to handle configuration changes
+themselves (for example for games or OpenGL-based applications). In this
+case, setting
+`android:configChanges=screenSize|smallestScreenSize|screenLayout|orientation`
+in the AndroidManifest definition of the activity enables callbacks for
+all configuration changes that may occur during multi-window use for the
+Activity. See [Handling Runtime Changes][1].
+
+In freeform mode (where applications can be freely resized), activities
+can be started within a certain area of the screen using the
+`ActivityOptions#setLaunchBounds` call.
+
+Alternatively, the preferred and minimum sizes can be set in a new
+`layout` property in the AndroidManifest.
+
+
+[1]: https://developer.android.com/guide/topics/resources/runtime-changes.html
+
+Pre-requisites
+--------------
+- Android SDK Preview N
+- Android Build Tools v23.0.0
+- Android Support Repository
+
+Screenshots
+-------------
+
+<img src="screenshots/main.png" height="400" alt="Screenshot"/> 
+
+Getting Started
+---------------
+
+This sample uses the Gradle build system. To build this project, use the
+"gradlew build" command or use "Import Project" in Android Studio.
+
+Support
+-------
+
+- Google+ Community: https://plus.google.com/communities/105153134372062985968
+- Stack Overflow: http://stackoverflow.com/questions/tagged/android
+
+If you've found an error in this sample, please file an issue:
+https://github.com/googlesamples/android-MultiWindowPlayground
+
+Patches are encouraged, and may be submitted by forking this project and
+submitting a pull request through GitHub. Please see CONTRIBUTING.md for more details.
+
+License
+-------
+
+Copyright 2016 The Android Open Source Project, Inc.
+
+Licensed to the Apache Software Foundation (ASF) under one or more contributor
+license agreements.  See the NOTICE file distributed with this work for
+additional information regarding copyright ownership.  The ASF licenses this
+file to you 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.
diff --git a/ui/window/MultiWindowPlayground/build.gradle b/ui/window/MultiWindowPlayground/build.gradle
new file mode 100644
index 0000000..b95a860
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/build.gradle
@@ -0,0 +1,12 @@
+
+
+// BEGIN_EXCLUDE
+import com.example.android.samples.build.SampleGenPlugin
+apply plugin: SampleGenPlugin
+
+samplegen {
+  pathToBuild "../../../../../build"
+  pathToSamplesCommon "../../../common"
+}
+apply from: "../../../../../build/build.gradle"
+// END_EXCLUDE
diff --git a/ui/window/MultiWindowPlayground/buildSrc/build.gradle b/ui/window/MultiWindowPlayground/buildSrc/build.gradle
new file mode 100644
index 0000000..7c150e4
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/buildSrc/build.gradle
@@ -0,0 +1,16 @@
+
+repositories {
+    jcenter()
+}
+dependencies {
+    compile 'org.freemarker:freemarker:2.3.20'
+}
+
+sourceSets {
+    main {
+        groovy {
+            srcDir new File(rootDir, "../../../../../../build/buildSrc/src/main/groovy")
+        }
+    }
+}
+
diff --git a/ui/window/MultiWindowPlayground/gradle/wrapper/gradle-wrapper.jar b/ui/window/MultiWindowPlayground/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..8c0fb64
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/ui/window/MultiWindowPlayground/gradle/wrapper/gradle-wrapper.properties b/ui/window/MultiWindowPlayground/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..122a0dc
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Mon Dec 28 10:00:20 PST 2015
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/ui/window/MultiWindowPlayground/gradlew b/ui/window/MultiWindowPlayground/gradlew
new file mode 100755
index 0000000..91a7e26
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/gradlew
@@ -0,0 +1,164 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+    echo "$*"
+}
+
+die ( ) {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+esac
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched.
+if $cygwin ; then
+    [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+fi
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >&-
+APP_HOME="`pwd -P`"
+cd "$SAVED" >&-
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+    JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/ui/window/MultiWindowPlayground/gradlew.bat b/ui/window/MultiWindowPlayground/gradlew.bat
new file mode 100644
index 0000000..aec9973
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/gradlew.bat
@@ -0,0 +1,90 @@
+@if "%DEBUG%" == "" @echo off

+@rem ##########################################################################

+@rem

+@rem  Gradle startup script for Windows

+@rem

+@rem ##########################################################################

+

+@rem Set local scope for the variables with windows NT shell

+if "%OS%"=="Windows_NT" setlocal

+

+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.

+set DEFAULT_JVM_OPTS=

+

+set DIRNAME=%~dp0

+if "%DIRNAME%" == "" set DIRNAME=.

+set APP_BASE_NAME=%~n0

+set APP_HOME=%DIRNAME%

+

+@rem Find java.exe

+if defined JAVA_HOME goto findJavaFromJavaHome

+

+set JAVA_EXE=java.exe

+%JAVA_EXE% -version >NUL 2>&1

+if "%ERRORLEVEL%" == "0" goto init

+

+echo.

+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.

+echo.

+echo Please set the JAVA_HOME variable in your environment to match the

+echo location of your Java installation.

+

+goto fail

+

+:findJavaFromJavaHome

+set JAVA_HOME=%JAVA_HOME:"=%

+set JAVA_EXE=%JAVA_HOME%/bin/java.exe

+

+if exist "%JAVA_EXE%" goto init

+

+echo.

+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%

+echo.

+echo Please set the JAVA_HOME variable in your environment to match the

+echo location of your Java installation.

+

+goto fail

+

+:init

+@rem Get command-line arguments, handling Windowz variants

+

+if not "%OS%" == "Windows_NT" goto win9xME_args

+if "%@eval[2+2]" == "4" goto 4NT_args

+

+:win9xME_args

+@rem Slurp the command line arguments.

+set CMD_LINE_ARGS=

+set _SKIP=2

+

+:win9xME_args_slurp

+if "x%~1" == "x" goto execute

+

+set CMD_LINE_ARGS=%*

+goto execute

+

+:4NT_args

+@rem Get arguments from the 4NT Shell from JP Software

+set CMD_LINE_ARGS=%$

+

+:execute

+@rem Setup the command line

+

+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar

+

+@rem Execute Gradle

+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%

+

+:end

+@rem End local scope for the variables with windows NT shell

+if "%ERRORLEVEL%"=="0" goto mainEnd

+

+:fail

+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of

+rem the _cmd.exe /c_ return code!

+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1

+exit /b 1

+

+:mainEnd

+if "%OS%"=="Windows_NT" endlocal

+

+:omega

diff --git a/ui/window/MultiWindowPlayground/screenshots/icon-web.png b/ui/window/MultiWindowPlayground/screenshots/icon-web.png
new file mode 100755
index 0000000..8d99c12
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/screenshots/icon-web.png
Binary files differ
diff --git a/ui/window/MultiWindowPlayground/screenshots/main.png b/ui/window/MultiWindowPlayground/screenshots/main.png
new file mode 100644
index 0000000..d922200
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/screenshots/main.png
Binary files differ
diff --git a/ui/window/MultiWindowPlayground/settings.gradle b/ui/window/MultiWindowPlayground/settings.gradle
new file mode 100644
index 0000000..0a5c310
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/settings.gradle
@@ -0,0 +1,2 @@
+
+include 'Application'
diff --git a/ui/window/MultiWindowPlayground/template-params.xml b/ui/window/MultiWindowPlayground/template-params.xml
new file mode 100644
index 0000000..3d78da6
--- /dev/null
+++ b/ui/window/MultiWindowPlayground/template-params.xml
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2013 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.
+-->
+
+<sample>
+    <name>MultiWindowPlayground</name>
+    <group>Android N Preview</group>
+    <package>com.example.android.multiwindowplayground</package>
+
+    <minSdk>"N"</minSdk>
+    <targetSdkVersion>"N"</targetSdkVersion>
+    <compileSdkVersion>"android-N"</compileSdkVersion>
+
+    <strings>
+        <intro>
+            <![CDATA[
+This sample demonstrates the use of the multi-window API available
+in Android N. It shows the use of new Intent flags and
+AndroidManifest properties to define the multi-window behavior.
+Switch the sample app into multi-window mode to see how it affects
+the lifecycle and behavior of the app.
+            ]]>
+        </intro>
+    </strings>
+
+    <template src="base-build" />
+
+    <metadata>
+        <status>PUBLISHED</status>
+        <categories>Android N Preview</categories>
+        <technologies>Android</technologies>
+        <languages>Java</languages>
+        <solutions>Mobile</solutions>
+        <level>INTERMEDIATE</level>
+        <!-- Dimensions: 512x512, PNG fomrat -->
+        <icon>screenshots/icon-web.png</icon>
+        <!-- Path to screenshots. Use <img> tags for each. -->
+        <screenshots>
+            <img>screenshots/main.png</img>
+        </screenshots>
+        <api_refs>
+            <android>android.content.Intent</android>
+            <android>android.app.ActivityOptions</android>
+        </api_refs>
+        <description>
+<![CDATA[
+This sample demonstrates the use of the multi-window API available
+in Android N. It shows the use of new Intent flags and
+AndroidManifest properties to define the multi-window behavior.
+Switch the sample app into multi-window mode to see how it affects
+the lifecycle and behavior of the app.
+]]>
+        </description>
+
+        <intro>
+<![CDATA[
+Android N introduces new APIs to support multiple activities
+to be displayed at the same time.
+
+Activities that are started within the same task stack
+inherit their multiwindow properties from the activity that fired
+off the intent. The following features are available when an activity
+has been launched into a new task stack.
+
+An activity can be set as not resizable through the
+`android:resizableActivity` property in the AndroidManifest. All
+applications targeting Android N or above are resizable by default.
+
+In split-screen mode, an activity can be started adjacent to the
+launching activity by setting the
+`Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT` flag in its intent.
+
+Sometimes activities may choose to handle configuration changes
+themselves (for example for games or OpenGL-based applications). In this
+case, setting
+`android:configChanges=screenSize|smallestScreenSize|screenLayout|orientation`
+in the AndroidManifest definition of the activity enables callbacks for
+all configuration changes that may occur during multi-window use for the
+Activity. See [Handling Runtime Changes][1].
+
+In freeform mode (where applications can be freely resized), activities
+can be started within a certain area of the screen using the
+`ActivityOptions#setLaunchBounds` call.
+
+Alternatively, the preferred and minimum sizes can be set in a new
+`layout` property in the AndroidManifest.
+
+
+[1]: https://developer.android.com/guide/topics/resources/runtime-changes.html
+]]>
+        </intro>
+    </metadata>
+</sample>
diff --git a/views/TextLinkify/gradle/wrapper/gradle-wrapper.properties b/views/TextLinkify/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/views/TextLinkify/gradle/wrapper/gradle-wrapper.properties
+++ b/views/TextLinkify/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/wearable/wear/AlwaysOn/gradle/wrapper/gradle-wrapper.properties b/wearable/wear/AlwaysOn/gradle/wrapper/gradle-wrapper.properties
index 4364027..4e239ca 100644
--- a/wearable/wear/AlwaysOn/gradle/wrapper/gradle-wrapper.properties
+++ b/wearable/wear/AlwaysOn/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/wearable/wear/DelayedConfirmation/gradle/wrapper/gradle-wrapper.properties b/wearable/wear/DelayedConfirmation/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/wearable/wear/DelayedConfirmation/gradle/wrapper/gradle-wrapper.properties
+++ b/wearable/wear/DelayedConfirmation/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/wearable/wear/ElizaChat/gradle/wrapper/gradle-wrapper.properties b/wearable/wear/ElizaChat/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/wearable/wear/ElizaChat/gradle/wrapper/gradle-wrapper.properties
+++ b/wearable/wear/ElizaChat/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/wearable/wear/EmbeddedApp/gradle/wrapper/gradle-wrapper.properties b/wearable/wear/EmbeddedApp/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/wearable/wear/EmbeddedApp/gradle/wrapper/gradle-wrapper.properties
+++ b/wearable/wear/EmbeddedApp/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/wearable/wear/FindMyPhone/gradle/wrapper/gradle-wrapper.properties b/wearable/wear/FindMyPhone/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/wearable/wear/FindMyPhone/gradle/wrapper/gradle-wrapper.properties
+++ b/wearable/wear/FindMyPhone/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/wearable/wear/Flashlight/gradle/wrapper/gradle-wrapper.properties b/wearable/wear/Flashlight/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/wearable/wear/Flashlight/gradle/wrapper/gradle-wrapper.properties
+++ b/wearable/wear/Flashlight/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/wearable/wear/Geofencing/gradle/wrapper/gradle-wrapper.properties b/wearable/wear/Geofencing/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/wearable/wear/Geofencing/gradle/wrapper/gradle-wrapper.properties
+++ b/wearable/wear/Geofencing/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/wearable/wear/GridViewPager/gradle/wrapper/gradle-wrapper.properties b/wearable/wear/GridViewPager/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/wearable/wear/GridViewPager/gradle/wrapper/gradle-wrapper.properties
+++ b/wearable/wear/GridViewPager/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/wearable/wear/JumpingJack/gradle/wrapper/gradle-wrapper.properties b/wearable/wear/JumpingJack/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/wearable/wear/JumpingJack/gradle/wrapper/gradle-wrapper.properties
+++ b/wearable/wear/JumpingJack/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/wearable/wear/Notifications/gradle/wrapper/gradle-wrapper.properties b/wearable/wear/Notifications/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/wearable/wear/Notifications/gradle/wrapper/gradle-wrapper.properties
+++ b/wearable/wear/Notifications/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/wearable/wear/Quiz/gradle/wrapper/gradle-wrapper.properties b/wearable/wear/Quiz/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/wearable/wear/Quiz/gradle/wrapper/gradle-wrapper.properties
+++ b/wearable/wear/Quiz/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/wearable/wear/RecipeAssistant/gradle/wrapper/gradle-wrapper.properties b/wearable/wear/RecipeAssistant/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/wearable/wear/RecipeAssistant/gradle/wrapper/gradle-wrapper.properties
+++ b/wearable/wear/RecipeAssistant/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/wearable/wear/SkeletonWearableApp/gradle/wrapper/gradle-wrapper.properties b/wearable/wear/SkeletonWearableApp/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/wearable/wear/SkeletonWearableApp/gradle/wrapper/gradle-wrapper.properties
+++ b/wearable/wear/SkeletonWearableApp/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/wearable/wear/SpeedTracker/gradle/wrapper/gradle-wrapper.properties b/wearable/wear/SpeedTracker/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/wearable/wear/SpeedTracker/gradle/wrapper/gradle-wrapper.properties
+++ b/wearable/wear/SpeedTracker/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/wearable/wear/SynchronizedNotifications/gradle/wrapper/gradle-wrapper.properties b/wearable/wear/SynchronizedNotifications/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/wearable/wear/SynchronizedNotifications/gradle/wrapper/gradle-wrapper.properties
+++ b/wearable/wear/SynchronizedNotifications/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/wearable/wear/Timer/gradle/wrapper/gradle-wrapper.properties b/wearable/wear/Timer/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/wearable/wear/Timer/gradle/wrapper/gradle-wrapper.properties
+++ b/wearable/wear/Timer/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/wearable/wear/WatchFace/gradle/wrapper/gradle-wrapper.properties b/wearable/wear/WatchFace/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/wearable/wear/WatchFace/gradle/wrapper/gradle-wrapper.properties
+++ b/wearable/wear/WatchFace/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/wearable/wear/WatchViewStub/gradle/wrapper/gradle-wrapper.properties b/wearable/wear/WatchViewStub/gradle/wrapper/gradle-wrapper.properties
index 07fc193..d570517 100644
--- a/wearable/wear/WatchViewStub/gradle/wrapper/gradle-wrapper.properties
+++ b/wearable/wear/WatchViewStub/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/wearable/wear/WearSpeakerSample/build.gradle b/wearable/wear/WearSpeakerSample/build.gradle
index 25ba12a..fb66109 100644
--- a/wearable/wear/WearSpeakerSample/build.gradle
+++ b/wearable/wear/WearSpeakerSample/build.gradle
@@ -21,7 +21,7 @@
         jcenter()
     }
     dependencies {
-        classpath 'com.android.tools.build:gradle:1.3.0'
+        classpath 'com.android.tools.build:gradle:2.0.0'
 
         // NOTE: Do not place your application dependencies here; they belong
         // in the individual module build.gradle files
diff --git a/wearable/wear/WearSpeakerSample/gradle/wrapper/gradle-wrapper.properties b/wearable/wear/WearSpeakerSample/gradle/wrapper/gradle-wrapper.properties
index 08a6fd5..43b9e1e 100644
--- a/wearable/wear/WearSpeakerSample/gradle/wrapper/gradle-wrapper.properties
+++ b/wearable/wear/WearSpeakerSample/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Sun Oct 04 13:39:51 PDT 2015
+#Tue May 20 13:33:02 BST 2014
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
diff --git a/wearable/wear/XYZTouristAttractions/gradle/wrapper/gradle-wrapper.properties b/wearable/wear/XYZTouristAttractions/gradle/wrapper/gradle-wrapper.properties
index 4364027..4e239ca 100644
--- a/wearable/wear/XYZTouristAttractions/gradle/wrapper/gradle-wrapper.properties
+++ b/wearable/wear/XYZTouristAttractions/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip