Use different exceptions for different crash reasons

Always throwing RemoteServiceException would make it impossible to
tell the cause of a crash without the string message.

Let's use a different exception type so developers can cluster crashes
without the exception message.

Bug: 124137635
Test: Treehugger
Change-Id: Ibae57bdb1b8965241c41249a89c728d224e4e995
diff --git a/src/com/android/settings/password/PasswordUtils.java b/src/com/android/settings/password/PasswordUtils.java
index 5b75033..e8e309c 100644
--- a/src/com/android/settings/password/PasswordUtils.java
+++ b/src/com/android/settings/password/PasswordUtils.java
@@ -79,18 +79,20 @@
     }
 
     /** Crashes the calling application and provides it with {@code message}. */
-    public static void crashCallingApplication(IBinder activityToken, String message) {
+    public static void crashCallingApplication(IBinder activityToken, String message,
+            int exceptionTypeId) {
         IActivityManager am = ActivityManager.getService();
         try {
             int uid = am.getLaunchedFromUid(activityToken);
             int userId = UserHandle.getUserId(uid);
-            am.crashApplication(
+            am.crashApplicationWithType(
                     uid,
                     /* initialPid= */ -1,
                     getCallingAppPackageName(activityToken),
                     userId,
                     message,
-                    false);
+                    false,
+                    exceptionTypeId);
         } catch (RemoteException e) {
             Log.v(TAG, "Could not talk to activity manager.", e);
         }
diff --git a/src/com/android/settings/password/SetNewPasswordActivity.java b/src/com/android/settings/password/SetNewPasswordActivity.java
index 2282587..fc664ec 100644
--- a/src/com/android/settings/password/SetNewPasswordActivity.java
+++ b/src/com/android/settings/password/SetNewPasswordActivity.java
@@ -29,6 +29,7 @@
 import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_REQUESTED_MIN_COMPLEXITY;
 
 import android.app.Activity;
+import android.app.RemoteServiceException.MissingRequestPasswordComplexityPermissionException;
 import android.app.admin.DevicePolicyManager;
 import android.app.admin.DevicePolicyManager.PasswordComplexity;
 import android.app.admin.PasswordMetrics;
@@ -101,7 +102,8 @@
                 PasswordUtils.crashCallingApplication(activityToken,
                         "Must have permission "
                                 + REQUEST_PASSWORD_COMPLEXITY + " to use extra "
-                                + EXTRA_PASSWORD_COMPLEXITY);
+                                + EXTRA_PASSWORD_COMPLEXITY,
+                        MissingRequestPasswordComplexityPermissionException.TYPE_ID);
                 finish();
                 return;
             }
diff --git a/src/com/android/settings/password/SetupChooseLockGeneric.java b/src/com/android/settings/password/SetupChooseLockGeneric.java
index 3261b81..968af32 100644
--- a/src/com/android/settings/password/SetupChooseLockGeneric.java
+++ b/src/com/android/settings/password/SetupChooseLockGeneric.java
@@ -21,6 +21,7 @@
 
 import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_REQUESTED_MIN_COMPLEXITY;
 
+import android.app.RemoteServiceException.MissingRequestPasswordComplexityPermissionException;
 import android.content.Context;
 import android.content.Intent;
 import android.os.Bundle;
@@ -79,7 +80,8 @@
             if (!hasPermission) {
                 PasswordUtils.crashCallingApplication(activityToken,
                         "Must have permission " + REQUEST_PASSWORD_COMPLEXITY
-                                + " to use extra " + EXTRA_PASSWORD_COMPLEXITY);
+                                + " to use extra " + EXTRA_PASSWORD_COMPLEXITY,
+                        MissingRequestPasswordComplexityPermissionException.TYPE_ID);
                 finish();
                 return;
             }