summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Christopher Wiley <wiley@google.com> 2015-11-22 17:12:37 -0800
committer Christopher Wiley <wiley@google.com> 2015-12-04 16:06:08 -0800
commit80fd1208b99fbb88f24faa5d55183cdbbdeb6777 (patch)
tree3afd0ca2c35711f33d3539e66da9def5a822e75a
parent1c9bdfd0294cd1b13470ae6443bfa2ad425bd7dd (diff)
Rethrow remote's ServiceSpecificException
Certain system services would like to throw exceptions with specific error codes, so that the framework can catch these specific conditions and express them appropriately. Bug: 25800533 Change-Id: I94b3d30fa131f5e14bba893c971615840085459f
-rw-r--r--core/java/android/os/Parcel.java12
-rw-r--r--core/java/android/os/ServiceSpecificException.java39
2 files changed, 51 insertions, 0 deletions
diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java
index 1e879f2edca1..5d6b8aa323c7 100644
--- a/core/java/android/os/Parcel.java
+++ b/core/java/android/os/Parcel.java
@@ -231,6 +231,7 @@ public final class Parcel {
private static final int VAL_SIZEF = 27;
// The initial int32 in a Binder call's reply Parcel header:
+ // Keep these in sync with libbinder's binder/Status.h.
private static final int EX_SECURITY = -1;
private static final int EX_BAD_PARCELABLE = -2;
private static final int EX_ILLEGAL_ARGUMENT = -3;
@@ -238,7 +239,11 @@ public final class Parcel {
private static final int EX_ILLEGAL_STATE = -5;
private static final int EX_NETWORK_MAIN_THREAD = -6;
private static final int EX_UNSUPPORTED_OPERATION = -7;
+ private static final int EX_SERVICE_SPECIFIC = -8;
private static final int EX_HAS_REPLY_HEADER = -128; // special; see below
+ // EX_TRANSACTION_FAILED is used exclusively in native code.
+ // see libbinder's binder/Status.h
+ private static final int EX_TRANSACTION_FAILED = -129;
private static native int nativeDataSize(long nativePtr);
private static native int nativeDataAvail(long nativePtr);
@@ -1515,6 +1520,8 @@ public final class Parcel {
code = EX_NETWORK_MAIN_THREAD;
} else if (e instanceof UnsupportedOperationException) {
code = EX_UNSUPPORTED_OPERATION;
+ } else if (e instanceof ServiceSpecificException) {
+ code = EX_SERVICE_SPECIFIC;
}
writeInt(code);
StrictMode.clearGatheredViolations();
@@ -1525,6 +1532,9 @@ public final class Parcel {
throw new RuntimeException(e);
}
writeString(e.getMessage());
+ if (e instanceof ServiceSpecificException) {
+ writeInt(((ServiceSpecificException)e).errorCode);
+ }
}
/**
@@ -1635,6 +1645,8 @@ public final class Parcel {
throw new NetworkOnMainThreadException();
case EX_UNSUPPORTED_OPERATION:
throw new UnsupportedOperationException(msg);
+ case EX_SERVICE_SPECIFIC:
+ throw new ServiceSpecificException(readInt(), msg);
}
throw new RuntimeException("Unknown exception code: " + code
+ " msg " + msg);
diff --git a/core/java/android/os/ServiceSpecificException.java b/core/java/android/os/ServiceSpecificException.java
new file mode 100644
index 000000000000..20f237a58ae1
--- /dev/null
+++ b/core/java/android/os/ServiceSpecificException.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 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.
+ */
+package android.os;
+
+/**
+ * An exception specific to a service.
+ *
+ * <p>This exception includes an error code specific to the throwing
+ * service. This is mostly used by system services to indicate
+ * domain specific error conditions.
+ *
+ * @hide
+ */
+public class ServiceSpecificException extends RuntimeException {
+ public final int errorCode;
+
+ ServiceSpecificException(int errorCode, String message) {
+ super(message);
+ this.errorCode = errorCode;
+ }
+
+ ServiceSpecificException(int errorCode) {
+ this.errorCode = errorCode;
+ }
+}
+