Add start-encryption intent filter to settings

* Add intent-filter for "android.app.action.START_ENCRYPTION"
* Add pseudo-activity to host intent-filter
* Add code to settings page that exits quickly when encryption
  is not available or is already started.

This can be tested using ApiDemos -> App -> Device Admin

Bug: 3346770
Change-Id: Ie97459cf9e2a7b09b690bf085e64ef905466e77a
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index c7fbfa4..f822ff6 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1080,6 +1080,21 @@
             </intent-filter>
         </activity>
 
+        <!-- Pseudo-activity used to provide an intent-filter entry point to encryption settings -->
+        <activity android:name="Settings$CryptKeeperSettingsActivity"
+                android:theme="@android:style/Theme.Holo"
+                android:label="@string/crypt_keeper_encrypt_title">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <action android:name="android.app.action.START_ENCRYPTION" />
+                <category android:name="android.intent.category.DEFAULT" /> />
+            </intent-filter>
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                android:value="com.android.settings.CryptKeeperSettings" />
+            <meta-data android:name="com.android.settings.TOP_LEVEL_HEADER_ID"
+                android:resource="@id/security_settings" />
+        </activity>
+
         <receiver android:name=".widget.SettingsAppWidgetProvider"
                 android:label="@string/gadget_title"
                 android:exported="false"
diff --git a/src/com/android/settings/CryptKeeperSettings.java b/src/com/android/settings/CryptKeeperSettings.java
index 26483ec..d26e5ff 100644
--- a/src/com/android/settings/CryptKeeperSettings.java
+++ b/src/com/android/settings/CryptKeeperSettings.java
@@ -19,6 +19,7 @@
 import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.Fragment;
+import android.app.admin.DevicePolicyManager;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
@@ -90,7 +91,6 @@
         }
     };
 
-
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
         mContentView = inflater.inflate(R.layout.crypt_keeper_settings, null);
@@ -118,6 +118,28 @@
     }
 
     /**
+     * If encryption is already started, and this launched via a "start encryption" intent,
+     * then exit immediately - it's already up and running, so there's no point in "starting" it.
+     */
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+        Activity activity = getActivity();
+        Intent intent = activity.getIntent();
+        if (DevicePolicyManager.ACTION_START_ENCRYPTION.equals(intent.getAction())) {
+            DevicePolicyManager dpm = (DevicePolicyManager)
+                    activity.getSystemService(Context.DEVICE_POLICY_SERVICE);
+            if (dpm != null) {
+                int status = dpm.getStorageEncryptionStatus();
+                if (status != DevicePolicyManager.ENCRYPTION_STATUS_INACTIVE) {
+                    // There is nothing to do here, so simply finish() (which returns to caller)
+                    activity.finish();
+                }
+            }
+        }
+    }
+
+    /**
      * Keyguard validation is run using the standard {@link ConfirmLockPattern}
      * component as a subactivity
      * @param request the request code to be returned once confirmation finishes
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index 11d8c57..1e54504 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -332,4 +332,5 @@
     public static class PowerUsageSummaryActivity extends Settings { }
     public static class AccountSyncSettingsActivity extends Settings { }
     public static class AccountSyncSettingsInAddAccountActivity extends Settings { }
+    public static class CryptKeeperSettingsActivity extends Settings { }
 }