Snap for 10183495 from 1015cfc92562a9c6b7ef5cc8589d6913fb342c5e to build-tools-release

Change-Id: I2cc9f14bc6e84d35345a734f1c15f20cf937f189
diff --git a/Android.bp b/Android.bp
index 66081f1..a542d96 100644
--- a/Android.bp
+++ b/Android.bp
@@ -645,6 +645,7 @@
     defaults: ["aidl_test_java_integration_defaults"],
     static_libs: [
         "aidl-test-interface-permission-java",
+        "frameworks-base-testutils",
     ],
     srcs: [
         "tests/java/src/android/aidl/permission/tests/*.java",
@@ -660,6 +661,7 @@
     defaults: ["aidl_test_java_integration_defaults"],
     static_libs: [
         "aidl-test-interface-permission-java",
+        "frameworks-base-testutils",
     ],
     data: [
         ":cts-dalvik-device-test-runner",
diff --git a/aidl_language.cpp b/aidl_language.cpp
index 6720818..06af907 100644
--- a/aidl_language.cpp
+++ b/aidl_language.cpp
@@ -1097,6 +1097,7 @@
                        const Comments& comments, int id)
     : AidlMember(location, comments),
       oneway_(oneway),
+      oneway_annotation_(oneway),
       type_(type),
       name_(name),
       arguments_(std::move(*args)),
@@ -1707,7 +1708,7 @@
 AidlInterface::AidlInterface(const AidlLocation& location, const std::string& name,
                              const Comments& comments, bool oneway, const std::string& package,
                              std::vector<std::unique_ptr<AidlMember>>* members)
-    : AidlDefinedType(location, name, comments, package, members) {
+    : AidlDefinedType(location, name, comments, package, members), oneway_annotation_(oneway) {
   for (auto& m : GetMethods()) {
     m.get()->ApplyInterfaceOneway(oneway);
   }
diff --git a/aidl_language.h b/aidl_language.h
index 3b1c77d..f963edb 100644
--- a/aidl_language.h
+++ b/aidl_language.h
@@ -878,6 +878,7 @@
   // set if this method is part of an interface that is marked oneway
   void ApplyInterfaceOneway(bool oneway) { oneway_ = oneway_ || oneway; }
   bool IsOneway() const { return oneway_; }
+  bool HasOnewayAnnotation() const { return oneway_annotation_; }
 
   const std::string& GetName() const { return name_; }
   bool HasId() const { return has_id_; }
@@ -917,7 +918,11 @@
   void DispatchVisit(AidlVisitor& v) const override { v.Visit(*this); }
 
  private:
+  // oneway_ may be set by the method or the parent interface. If the interface is oneway,
+  // is also oneway. oneway_annotation_ may only be set on creation, and may not be overridden
+  // by the parent interface. It is used to detect redundant oneway annotations.
   bool oneway_;
+  bool oneway_annotation_;
   std::unique_ptr<AidlTypeSpecifier> type_;
   std::string name_;
   const std::vector<std::unique_ptr<AidlArgument>> arguments_;
@@ -1215,6 +1220,10 @@
   bool UsesPermissions() const;
   std::string GetDescriptor() const;
   void DispatchVisit(AidlVisitor& v) const override { v.Visit(*this); }
+  bool HasOnewayAnnotation() const { return oneway_annotation_; }
+
+ private:
+  bool oneway_annotation_;
 };
 
 inline std::string SimpleName(const std::string& qualified_name) {
diff --git a/build/aidl_api.go b/build/aidl_api.go
index e6256d6..8424ef0 100644
--- a/build/aidl_api.go
+++ b/build/aidl_api.go
@@ -724,7 +724,7 @@
 }
 
 func init() {
-	android.RegisterSingletonType("aidl-freeze-api", freezeApiSingletonFactory)
+	android.RegisterParallelSingletonType("aidl-freeze-api", freezeApiSingletonFactory)
 }
 
 func freezeApiSingletonFactory() android.Singleton {
diff --git a/build/aidl_rust_glue.py b/build/aidl_rust_glue.py
index 519718b..c06790d 100755
--- a/build/aidl_rust_glue.py
+++ b/build/aidl_rust_glue.py
@@ -86,7 +86,8 @@
     lib_rs_file.write("}\n")
 
 def execute():
-  parser = argparse.ArgumentParser(description='Generate the top-level lib.rs.')
+  parser = argparse.ArgumentParser(description='Generate the top-level lib.rs.',
+                                   fromfile_prefix_chars='@')
   parser.add_argument('output', help='Path to output .rs file')
   parser.add_argument('root', help='Common ancestor of all input files')
   parser.add_argument('inputs', nargs='+', help='Input .rs files')
diff --git a/diagnostics.cpp b/diagnostics.cpp
index 5112173..5c51f03 100644
--- a/diagnostics.cpp
+++ b/diagnostics.cpp
@@ -224,6 +224,31 @@
   }
 };
 
+struct DiagnoseRedundantOneway : DiagnosticsVisitor {
+  DiagnoseRedundantOneway(DiagnosticsContext& diag) : DiagnosticsVisitor(diag) {}
+  void Visit(const AidlInterface& i) override {
+    if (i.HasOnewayAnnotation()) {
+      for (const auto& m : i.GetMethods()) {
+        if (!m->IsUserDefined()) continue;
+        if (Suppressed(*m)) continue;
+        if (m->HasOnewayAnnotation()) {
+          diag.Report(i.GetLocation(), DiagnosticID::redundant_oneway)
+              << "The interface '" << i.GetName()
+              << "' is oneway. Redundant oneway annotation for method '" << m->GetName() << "'.";
+        }
+      }
+    }
+  }
+  bool Suppressed(const AidlMethod& m) const {
+    for (const auto& w : m.GetType().SuppressWarnings()) {
+      if (w == to_string(DiagnosticID::redundant_oneway)) {
+        return true;
+      }
+    }
+    return false;
+  }
+};
+
 struct DiagnoseOutArray : DiagnosticsVisitor {
   DiagnoseOutArray(DiagnosticsContext& diag) : DiagnosticsVisitor(diag) {}
   void Visit(const AidlMethod& m) override {
@@ -435,6 +460,7 @@
   DiagnoseUntypedCollection{diag}.Check(doc);
   DiagnosePermissionAnnotations{diag}.Check(doc);
   DiagnoseRedundantNames{diag}.Check(doc);
+  DiagnoseRedundantOneway{diag}.Check(doc);
 
   return diag.ErrorCount() == 0;
 }
diff --git a/diagnostics.inc b/diagnostics.inc
index 85b5203..9abdee8 100644
--- a/diagnostics.inc
+++ b/diagnostics.inc
@@ -12,3 +12,4 @@
 DIAG(unknown_warning, "unknown-warning", false)
 DIAG(untyped_collection, "untyped-collection", false)
 DIAG(redundant_name, "redundant-name", false)
+DIAG(redundant_oneway, "redundant-oneway", false)
diff --git a/diagnostics_unittest.cpp b/diagnostics_unittest.cpp
index dcbb701..feb8189 100644
--- a/diagnostics_unittest.cpp
+++ b/diagnostics_unittest.cpp
@@ -157,6 +157,24 @@
   });
 }
 
+TEST_F(DiagnosticsTest, RedundantOnewayMethodAnnotationInOnewayInterface) {
+  expect_diagnostic = DiagnosticID::redundant_oneway;
+  ParseFiles({
+      {"IFoo.aidl", "oneway interface IFoo { oneway void foo(int a); }"},
+  });
+}
+
+TEST_F(DiagnosticsTest, RedundantOnewayMethodSuppressedAtMethod) {
+  enable_diagnostic = DiagnosticID::redundant_oneway;
+  expect_diagnostic = {};
+  ParseFiles({
+      {"IFoo.aidl",
+       "oneway interface IFoo {\n"
+       "  @SuppressWarnings(value={\"redundant-oneway\"}) oneway void bar();\n"
+       "}"},
+  });
+}
+
 TEST_F(DiagnosticsTest, ArraysAsOutputParametersConsideredHarmful) {
   expect_diagnostic = DiagnosticID::out_array;
   ParseFiles({
diff --git a/generate_java_binder.cpp b/generate_java_binder.cpp
index 67bfcfa..6dd5935 100644
--- a/generate_java_binder.cpp
+++ b/generate_java_binder.cpp
@@ -85,7 +85,7 @@
   std::shared_ptr<Variable> transact_data;
   std::shared_ptr<Variable> transact_reply;
   std::shared_ptr<Variable> transact_flags;
-  std::shared_ptr<SwitchStatement> transact_switch_meta;
+  std::vector<std::shared_ptr<IfStatement>> transact_if_statements_meta;
   std::shared_ptr<SwitchStatement> transact_switch_user;
   std::shared_ptr<StatementBlock> transact_statements;
   std::shared_ptr<SwitchStatement> code_to_method_name_switch;
@@ -181,7 +181,6 @@
   transact_statements = onTransact->statements;
   onTransact->exceptions.push_back("android.os.RemoteException");
   this->elements.push_back(onTransact);
-  this->transact_switch_meta = std::make_shared<SwitchStatement>(this->transact_code);
   this->transact_switch_user = std::make_shared<SwitchStatement>(this->transact_code);
 }
 
@@ -210,8 +209,22 @@
     transact_statements->Add(ifStatement);
   }
 
+  // Build the if/else chain for the meta methods. There at most 3 different
+  // statements so if/else is more efficient than a switch statement.
   // Meta transactions are looked up prior to user-defined transactions.
-  transact_statements->Add(this->transact_switch_meta);
+  AIDL_FATAL_IF(this->transact_if_statements_meta.size() == 0, AIDL_LOCATION_HERE)
+      << "Expecting to have meta methods and found none.";
+  AIDL_FATAL_IF(this->transact_if_statements_meta.size() > 3, AIDL_LOCATION_HERE)
+      << "Expecting to have at most 3 meta methods and found "
+      << this->transact_if_statements_meta.size();
+  auto ifStatement = this->transact_if_statements_meta[0];
+  std::shared_ptr<IfStatement> currentIfStatement = ifStatement;
+  for (size_t i = 1; i < transact_if_statements_meta.size(); i++) {
+    currentIfStatement->elseif = this->transact_if_statements_meta[i];
+    currentIfStatement = currentIfStatement->elseif;
+  }
+
+  transact_statements->Add(ifStatement);
   transact_statements->Add(this->transact_switch_user);
 
   // getTransactionName
@@ -925,22 +938,24 @@
     }
   } else {
     if (method.GetName() == kGetInterfaceVersion && options.Version() > 0) {
-      auto c = std::make_shared<Case>(transactCodeName);
+      auto ifStatement = std::make_shared<IfStatement>();
+      ifStatement->expression = std::make_shared<LiteralExpression>("code == " + transactCodeName);
       std::ostringstream code;
       code << "reply.writeNoException();\n"
            << "reply.writeInt(" << kGetInterfaceVersion << "());\n"
            << "return true;\n";
-      c->statements->Add(std::make_shared<LiteralStatement>(code.str()));
-      stubClass->transact_switch_meta->cases.push_back(c);
+      ifStatement->statements->Add(std::make_shared<LiteralStatement>(code.str()));
+      stubClass->transact_if_statements_meta.push_back(ifStatement);
     }
     if (method.GetName() == kGetInterfaceHash && !options.Hash().empty()) {
-      auto c = std::make_shared<Case>(transactCodeName);
+      auto ifStatement = std::make_shared<IfStatement>();
+      ifStatement->expression = std::make_shared<LiteralExpression>("code == " + transactCodeName);
       std::ostringstream code;
       code << "reply.writeNoException();\n"
            << "reply.writeString(" << kGetInterfaceHash << "());\n"
            << "return true;\n";
-      c->statements->Add(std::make_shared<LiteralStatement>(code.str()));
-      stubClass->transact_switch_meta->cases.push_back(c);
+      ifStatement->statements->Add(std::make_shared<LiteralStatement>(code.str()));
+      stubClass->transact_if_statements_meta.push_back(ifStatement);
     }
   }
 
@@ -1028,12 +1043,13 @@
                                          Class* interface, std::shared_ptr<StubClass> stub,
                                          std::shared_ptr<ProxyClass> proxy) {
   // the interface descriptor transaction handler
-  auto c = std::make_shared<Case>("INTERFACE_TRANSACTION");
-  c->statements->Add(std::make_shared<MethodCall>(
+  auto ifStatement = std::make_shared<IfStatement>();
+  ifStatement->expression = std::make_shared<LiteralExpression>("code == INTERFACE_TRANSACTION");
+  ifStatement->statements->Add(std::make_shared<MethodCall>(
       stub->transact_reply, "writeString",
       std::vector<std::shared_ptr<Expression>>{stub->GetTransactDescriptor(nullptr)}));
-  c->statements->Add(std::make_shared<ReturnStatement>(TRUE_VALUE));
-  stub->transact_switch_meta->cases.push_back(c);
+  ifStatement->statements->Add(std::make_shared<ReturnStatement>(TRUE_VALUE));
+  stub->transact_if_statements_meta.push_back(ifStatement);
 
   // and the proxy-side method returning the descriptor directly
   auto getDesc = std::make_shared<Method>();
diff --git a/tests/android/aidl/tests/permission/IProtected.aidl b/tests/android/aidl/tests/permission/IProtected.aidl
index d2fdba5..2504bc8 100644
--- a/tests/android/aidl/tests/permission/IProtected.aidl
+++ b/tests/android/aidl/tests/permission/IProtected.aidl
@@ -11,5 +11,7 @@
     void NonManifestPermission();
 
     // Used by the integration tests to dynamically set permissions that are considered granted.
-    @RequiresNoPermission void SetGranted(in List<String> permissions);
+    @RequiresNoPermission void Grant(in String permission);
+    @RequiresNoPermission void Revoke(in String permission);
+    @RequiresNoPermission void RevokeAll();
 }
diff --git a/tests/golden_output/aidl-test-fixedsizearray-java-source/gen/android/aidl/fixedsizearray/FixedSizeArrayExample.java b/tests/golden_output/aidl-test-fixedsizearray-java-source/gen/android/aidl/fixedsizearray/FixedSizeArrayExample.java
index a04eb16..54e451f 100644
--- a/tests/golden_output/aidl-test-fixedsizearray-java-source/gen/android/aidl/fixedsizearray/FixedSizeArrayExample.java
+++ b/tests/golden_output/aidl-test-fixedsizearray-java-source/gen/android/aidl/fixedsizearray/FixedSizeArrayExample.java
@@ -427,13 +427,9 @@
         if (code >= android.os.IBinder.FIRST_CALL_TRANSACTION && code <= android.os.IBinder.LAST_CALL_TRANSACTION) {
           data.enforceInterface(descriptor);
         }
-        switch (code)
-        {
-          case INTERFACE_TRANSACTION:
-          {
-            reply.writeString(descriptor);
-            return true;
-          }
+        if (code == INTERFACE_TRANSACTION) {
+          reply.writeString(descriptor);
+          return true;
         }
         switch (code)
         {
@@ -844,13 +840,9 @@
       @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
       {
         java.lang.String descriptor = DESCRIPTOR;
-        switch (code)
-        {
-          case INTERFACE_TRANSACTION:
-          {
-            reply.writeString(descriptor);
-            return true;
-          }
+        if (code == INTERFACE_TRANSACTION) {
+          reply.writeString(descriptor);
+          return true;
         }
         switch (code)
         {
diff --git a/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/ArrayOfInterfaces.java b/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/ArrayOfInterfaces.java
index a4f89ab..6628a8e 100644
--- a/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/ArrayOfInterfaces.java
+++ b/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/ArrayOfInterfaces.java
@@ -99,13 +99,9 @@
       @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
       {
         java.lang.String descriptor = DESCRIPTOR;
-        switch (code)
-        {
-          case INTERFACE_TRANSACTION:
-          {
-            reply.writeString(descriptor);
-            return true;
-          }
+        if (code == INTERFACE_TRANSACTION) {
+          reply.writeString(descriptor);
+          return true;
         }
         switch (code)
         {
@@ -206,13 +202,9 @@
         if (code >= android.os.IBinder.FIRST_CALL_TRANSACTION && code <= android.os.IBinder.LAST_CALL_TRANSACTION) {
           data.enforceInterface(descriptor);
         }
-        switch (code)
-        {
-          case INTERFACE_TRANSACTION:
-          {
-            reply.writeString(descriptor);
-            return true;
-          }
+        if (code == INTERFACE_TRANSACTION) {
+          reply.writeString(descriptor);
+          return true;
         }
         switch (code)
         {
diff --git a/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/ICircular.java b/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/ICircular.java
index e24b2b4..0bd23dc 100644
--- a/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/ICircular.java
+++ b/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/ICircular.java
@@ -69,13 +69,9 @@
       if (code >= android.os.IBinder.FIRST_CALL_TRANSACTION && code <= android.os.IBinder.LAST_CALL_TRANSACTION) {
         data.enforceInterface(descriptor);
       }
-      switch (code)
-      {
-        case INTERFACE_TRANSACTION:
-        {
-          reply.writeString(descriptor);
-          return true;
-        }
+      if (code == INTERFACE_TRANSACTION) {
+        reply.writeString(descriptor);
+        return true;
       }
       switch (code)
       {
diff --git a/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/IDeprecated.java b/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/IDeprecated.java
index d9c1d4b..723f90b 100644
--- a/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/IDeprecated.java
+++ b/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/IDeprecated.java
@@ -60,13 +60,9 @@
     @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
     {
       java.lang.String descriptor = DESCRIPTOR;
-      switch (code)
-      {
-        case INTERFACE_TRANSACTION:
-        {
-          reply.writeString(descriptor);
-          return true;
-        }
+      if (code == INTERFACE_TRANSACTION) {
+        reply.writeString(descriptor);
+        return true;
       }
       switch (code)
       {
diff --git a/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/INamedCallback.java b/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/INamedCallback.java
index 95c3526..e80b1b6 100644
--- a/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/INamedCallback.java
+++ b/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/INamedCallback.java
@@ -69,13 +69,9 @@
       if (code >= android.os.IBinder.FIRST_CALL_TRANSACTION && code <= android.os.IBinder.LAST_CALL_TRANSACTION) {
         data.enforceInterface(descriptor);
       }
-      switch (code)
-      {
-        case INTERFACE_TRANSACTION:
-        {
-          reply.writeString(descriptor);
-          return true;
-        }
+      if (code == INTERFACE_TRANSACTION) {
+        reply.writeString(descriptor);
+        return true;
       }
       switch (code)
       {
diff --git a/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/INewName.java b/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/INewName.java
index 1fdf120..39f55af 100644
--- a/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/INewName.java
+++ b/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/INewName.java
@@ -69,13 +69,9 @@
       if (code >= android.os.IBinder.FIRST_CALL_TRANSACTION && code <= android.os.IBinder.LAST_CALL_TRANSACTION) {
         data.enforceInterface(descriptor);
       }
-      switch (code)
-      {
-        case INTERFACE_TRANSACTION:
-        {
-          reply.writeString(descriptor);
-          return true;
-        }
+      if (code == INTERFACE_TRANSACTION) {
+        reply.writeString(descriptor);
+        return true;
       }
       switch (code)
       {
diff --git a/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/IOldName.java b/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/IOldName.java
index 325fd8f..e8e16ea 100644
--- a/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/IOldName.java
+++ b/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/IOldName.java
@@ -69,13 +69,9 @@
       if (code >= android.os.IBinder.FIRST_CALL_TRANSACTION && code <= android.os.IBinder.LAST_CALL_TRANSACTION) {
         data.enforceInterface(descriptor);
       }
-      switch (code)
-      {
-        case INTERFACE_TRANSACTION:
-        {
-          reply.writeString(descriptor);
-          return true;
-        }
+      if (code == INTERFACE_TRANSACTION) {
+        reply.writeString(descriptor);
+        return true;
       }
       switch (code)
       {
diff --git a/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/ITestService.java b/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/ITestService.java
index 733a502..6110111 100644
--- a/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/ITestService.java
+++ b/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/ITestService.java
@@ -931,13 +931,9 @@
       if (code >= android.os.IBinder.FIRST_CALL_TRANSACTION && code <= android.os.IBinder.LAST_CALL_TRANSACTION) {
         data.enforceInterface(descriptor);
       }
-      switch (code)
-      {
-        case INTERFACE_TRANSACTION:
-        {
-          reply.writeString(descriptor);
-          return true;
-        }
+      if (code == INTERFACE_TRANSACTION) {
+        reply.writeString(descriptor);
+        return true;
       }
       switch (code)
       {
@@ -3993,13 +3989,9 @@
         @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
         {
           java.lang.String descriptor = DESCRIPTOR;
-          switch (code)
-          {
-            case INTERFACE_TRANSACTION:
-            {
-              reply.writeString(descriptor);
-              return true;
-            }
+          if (code == INTERFACE_TRANSACTION) {
+            reply.writeString(descriptor);
+            return true;
           }
           switch (code)
           {
diff --git a/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/ListOfInterfaces.java b/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/ListOfInterfaces.java
index cb240f4..0599124 100644
--- a/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/ListOfInterfaces.java
+++ b/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/ListOfInterfaces.java
@@ -99,13 +99,9 @@
       @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
       {
         java.lang.String descriptor = DESCRIPTOR;
-        switch (code)
-        {
-          case INTERFACE_TRANSACTION:
-          {
-            reply.writeString(descriptor);
-            return true;
-          }
+        if (code == INTERFACE_TRANSACTION) {
+          reply.writeString(descriptor);
+          return true;
         }
         switch (code)
         {
@@ -206,13 +202,9 @@
         if (code >= android.os.IBinder.FIRST_CALL_TRANSACTION && code <= android.os.IBinder.LAST_CALL_TRANSACTION) {
           data.enforceInterface(descriptor);
         }
-        switch (code)
-        {
-          case INTERFACE_TRANSACTION:
-          {
-            reply.writeString(descriptor);
-            return true;
-          }
+        if (code == INTERFACE_TRANSACTION) {
+          reply.writeString(descriptor);
+          return true;
         }
         switch (code)
         {
diff --git a/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/nested/INestedService.java b/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/nested/INestedService.java
index 004f0e3..265146e 100644
--- a/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/nested/INestedService.java
+++ b/tests/golden_output/aidl-test-interface-java-source/gen/android/aidl/tests/nested/INestedService.java
@@ -76,13 +76,9 @@
       if (code >= android.os.IBinder.FIRST_CALL_TRANSACTION && code <= android.os.IBinder.LAST_CALL_TRANSACTION) {
         data.enforceInterface(descriptor);
       }
-      switch (code)
-      {
-        case INTERFACE_TRANSACTION:
-        {
-          reply.writeString(descriptor);
-          return true;
-        }
+      if (code == INTERFACE_TRANSACTION) {
+        reply.writeString(descriptor);
+        return true;
       }
       switch (code)
       {
@@ -287,13 +283,9 @@
         if (code >= android.os.IBinder.FIRST_CALL_TRANSACTION && code <= android.os.IBinder.LAST_CALL_TRANSACTION) {
           data.enforceInterface(descriptor);
         }
-        switch (code)
-        {
-          case INTERFACE_TRANSACTION:
-          {
-            reply.writeString(descriptor);
-            return true;
-          }
+        if (code == INTERFACE_TRANSACTION) {
+          reply.writeString(descriptor);
+          return true;
         }
         switch (code)
         {
diff --git a/tests/golden_output/aidl-test-interface-permission-java-source/gen/android/aidl/tests/permission/INoPermission.java b/tests/golden_output/aidl-test-interface-permission-java-source/gen/android/aidl/tests/permission/INoPermission.java
index fc65b93..3d96568 100644
--- a/tests/golden_output/aidl-test-interface-permission-java-source/gen/android/aidl/tests/permission/INoPermission.java
+++ b/tests/golden_output/aidl-test-interface-permission-java-source/gen/android/aidl/tests/permission/INoPermission.java
@@ -68,13 +68,9 @@
       if (code >= android.os.IBinder.FIRST_CALL_TRANSACTION && code <= android.os.IBinder.LAST_CALL_TRANSACTION) {
         data.enforceInterface(descriptor);
       }
-      switch (code)
-      {
-        case INTERFACE_TRANSACTION:
-        {
-          reply.writeString(descriptor);
-          return true;
-        }
+      if (code == INTERFACE_TRANSACTION) {
+        reply.writeString(descriptor);
+        return true;
       }
       switch (code)
       {
diff --git a/tests/golden_output/aidl-test-interface-permission-java-source/gen/android/aidl/tests/permission/IProtected.java b/tests/golden_output/aidl-test-interface-permission-java-source/gen/android/aidl/tests/permission/IProtected.java
index 1e10c08..87ddac0 100644
--- a/tests/golden_output/aidl-test-interface-permission-java-source/gen/android/aidl/tests/permission/IProtected.java
+++ b/tests/golden_output/aidl-test-interface-permission-java-source/gen/android/aidl/tests/permission/IProtected.java
@@ -20,7 +20,13 @@
     {
     }
     // Used by the integration tests to dynamically set permissions that are considered granted.
-    @Override public void SetGranted(java.util.List<java.lang.String> permissions) throws android.os.RemoteException
+    @Override public void Grant(java.lang.String permission) throws android.os.RemoteException
+    {
+    }
+    @Override public void Revoke(java.lang.String permission) throws android.os.RemoteException
+    {
+    }
+    @Override public void RevokeAll() throws android.os.RemoteException
     {
     }
     @Override
@@ -87,9 +93,17 @@
         {
           return "NonManifestPermission";
         }
-        case TRANSACTION_SetGranted:
+        case TRANSACTION_Grant:
         {
-          return "SetGranted";
+          return "Grant";
+        }
+        case TRANSACTION_Revoke:
+        {
+          return "Revoke";
+        }
+        case TRANSACTION_RevokeAll:
+        {
+          return "RevokeAll";
         }
         default:
         {
@@ -108,13 +122,9 @@
       if (code >= android.os.IBinder.FIRST_CALL_TRANSACTION && code <= android.os.IBinder.LAST_CALL_TRANSACTION) {
         data.enforceInterface(descriptor);
       }
-      switch (code)
-      {
-        case INTERFACE_TRANSACTION:
-        {
-          reply.writeString(descriptor);
-          return true;
-        }
+      if (code == INTERFACE_TRANSACTION) {
+        reply.writeString(descriptor);
+        return true;
       }
       switch (code)
       {
@@ -142,12 +152,27 @@
           reply.writeNoException();
           break;
         }
-        case TRANSACTION_SetGranted:
+        case TRANSACTION_Grant:
         {
-          java.util.List<java.lang.String> _arg0;
-          _arg0 = data.createStringArrayList();
+          java.lang.String _arg0;
+          _arg0 = data.readString();
           data.enforceNoDataAvail();
-          this.SetGranted(_arg0);
+          this.Grant(_arg0);
+          reply.writeNoException();
+          break;
+        }
+        case TRANSACTION_Revoke:
+        {
+          java.lang.String _arg0;
+          _arg0 = data.readString();
+          data.enforceNoDataAvail();
+          this.Revoke(_arg0);
+          reply.writeNoException();
+          break;
+        }
+        case TRANSACTION_RevokeAll:
+        {
+          this.RevokeAll();
           reply.writeNoException();
           break;
         }
@@ -230,14 +255,43 @@
         }
       }
       // Used by the integration tests to dynamically set permissions that are considered granted.
-      @Override public void SetGranted(java.util.List<java.lang.String> permissions) throws android.os.RemoteException
+      @Override public void Grant(java.lang.String permission) throws android.os.RemoteException
       {
         android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
         android.os.Parcel _reply = android.os.Parcel.obtain();
         try {
           _data.writeInterfaceToken(DESCRIPTOR);
-          _data.writeStringList(permissions);
-          boolean _status = mRemote.transact(Stub.TRANSACTION_SetGranted, _data, _reply, 0);
+          _data.writeString(permission);
+          boolean _status = mRemote.transact(Stub.TRANSACTION_Grant, _data, _reply, 0);
+          _reply.readException();
+        }
+        finally {
+          _reply.recycle();
+          _data.recycle();
+        }
+      }
+      @Override public void Revoke(java.lang.String permission) throws android.os.RemoteException
+      {
+        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
+        android.os.Parcel _reply = android.os.Parcel.obtain();
+        try {
+          _data.writeInterfaceToken(DESCRIPTOR);
+          _data.writeString(permission);
+          boolean _status = mRemote.transact(Stub.TRANSACTION_Revoke, _data, _reply, 0);
+          _reply.readException();
+        }
+        finally {
+          _reply.recycle();
+          _data.recycle();
+        }
+      }
+      @Override public void RevokeAll() throws android.os.RemoteException
+      {
+        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
+        android.os.Parcel _reply = android.os.Parcel.obtain();
+        try {
+          _data.writeInterfaceToken(DESCRIPTOR);
+          boolean _status = mRemote.transact(Stub.TRANSACTION_RevokeAll, _data, _reply, 0);
           _reply.readException();
         }
         finally {
@@ -268,11 +322,13 @@
     protected void NonManifestPermission_enforcePermission() throws SecurityException {
       mEnforcer.enforcePermission(android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, getCallingPid(), getCallingUid());
     }
-    static final int TRANSACTION_SetGranted = (android.os.IBinder.FIRST_CALL_TRANSACTION + 4);
+    static final int TRANSACTION_Grant = (android.os.IBinder.FIRST_CALL_TRANSACTION + 4);
+    static final int TRANSACTION_Revoke = (android.os.IBinder.FIRST_CALL_TRANSACTION + 5);
+    static final int TRANSACTION_RevokeAll = (android.os.IBinder.FIRST_CALL_TRANSACTION + 6);
     /** @hide */
     public int getMaxTransactionId()
     {
-      return 4;
+      return 6;
     }
   }
   public static final java.lang.String DESCRIPTOR = "android$aidl$tests$permission$IProtected".replace('$', '.');
@@ -286,5 +342,9 @@
   public void NonManifestPermission() throws android.os.RemoteException;
   // Used by the integration tests to dynamically set permissions that are considered granted.
   @android.annotation.RequiresNoPermission
-  public void SetGranted(java.util.List<java.lang.String> permissions) throws android.os.RemoteException;
+  public void Grant(java.lang.String permission) throws android.os.RemoteException;
+  @android.annotation.RequiresNoPermission
+  public void Revoke(java.lang.String permission) throws android.os.RemoteException;
+  @android.annotation.RequiresNoPermission
+  public void RevokeAll() throws android.os.RemoteException;
 }
diff --git a/tests/golden_output/aidl-test-interface-permission-java-source/gen/android/aidl/tests/permission/IProtectedInterface.java b/tests/golden_output/aidl-test-interface-permission-java-source/gen/android/aidl/tests/permission/IProtectedInterface.java
index 5a97ed0..ade2de8 100644
--- a/tests/golden_output/aidl-test-interface-permission-java-source/gen/android/aidl/tests/permission/IProtectedInterface.java
+++ b/tests/golden_output/aidl-test-interface-permission-java-source/gen/android/aidl/tests/permission/IProtectedInterface.java
@@ -86,13 +86,9 @@
       if (code >= android.os.IBinder.FIRST_CALL_TRANSACTION && code <= android.os.IBinder.LAST_CALL_TRANSACTION) {
         data.enforceInterface(descriptor);
       }
-      switch (code)
-      {
-        case INTERFACE_TRANSACTION:
-        {
-          reply.writeString(descriptor);
-          return true;
-        }
+      if (code == INTERFACE_TRANSACTION) {
+        reply.writeString(descriptor);
+        return true;
       }
       switch (code)
       {
diff --git a/tests/golden_output/aidl-test-interface-permission-java-source/gen/android/aidl/tests/permission/platform/IProtected.java b/tests/golden_output/aidl-test-interface-permission-java-source/gen/android/aidl/tests/permission/platform/IProtected.java
index aca8d07..c0e6cf7 100644
--- a/tests/golden_output/aidl-test-interface-permission-java-source/gen/android/aidl/tests/permission/platform/IProtected.java
+++ b/tests/golden_output/aidl-test-interface-permission-java-source/gen/android/aidl/tests/permission/platform/IProtected.java
@@ -79,13 +79,9 @@
       if (code >= android.os.IBinder.FIRST_CALL_TRANSACTION && code <= android.os.IBinder.LAST_CALL_TRANSACTION) {
         data.enforceInterface(descriptor);
       }
-      switch (code)
-      {
-        case INTERFACE_TRANSACTION:
-        {
-          reply.writeString(descriptor);
-          return true;
-        }
+      if (code == INTERFACE_TRANSACTION) {
+        reply.writeString(descriptor);
+        return true;
       }
       switch (code)
       {
diff --git a/tests/golden_output/aidl-test-versioned-interface-V1-java-source/gen/android/aidl/versioned/tests/IFooInterface.java b/tests/golden_output/aidl-test-versioned-interface-V1-java-source/gen/android/aidl/versioned/tests/IFooInterface.java
index 7d66241..6dca016 100644
--- a/tests/golden_output/aidl-test-versioned-interface-V1-java-source/gen/android/aidl/versioned/tests/IFooInterface.java
+++ b/tests/golden_output/aidl-test-versioned-interface-V1-java-source/gen/android/aidl/versioned/tests/IFooInterface.java
@@ -76,25 +76,19 @@
       if (code >= android.os.IBinder.FIRST_CALL_TRANSACTION && code <= android.os.IBinder.LAST_CALL_TRANSACTION) {
         data.enforceInterface(descriptor);
       }
-      switch (code)
-      {
-        case INTERFACE_TRANSACTION:
-        {
-          reply.writeString(descriptor);
-          return true;
-        }
-        case TRANSACTION_getInterfaceVersion:
-        {
-          reply.writeNoException();
-          reply.writeInt(getInterfaceVersion());
-          return true;
-        }
-        case TRANSACTION_getInterfaceHash:
-        {
-          reply.writeNoException();
-          reply.writeString(getInterfaceHash());
-          return true;
-        }
+      if (code == INTERFACE_TRANSACTION) {
+        reply.writeString(descriptor);
+        return true;
+      }
+      else if (code == TRANSACTION_getInterfaceVersion) {
+        reply.writeNoException();
+        reply.writeInt(getInterfaceVersion());
+        return true;
+      }
+      else if (code == TRANSACTION_getInterfaceHash) {
+        reply.writeNoException();
+        reply.writeString(getInterfaceHash());
+        return true;
       }
       switch (code)
       {
diff --git a/tests/golden_output/aidl_test_loggable_interface-java-source/gen/android/aidl/loggable/ILoggableInterface.java b/tests/golden_output/aidl_test_loggable_interface-java-source/gen/android/aidl/loggable/ILoggableInterface.java
index c8ab851..c061734 100644
--- a/tests/golden_output/aidl_test_loggable_interface-java-source/gen/android/aidl/loggable/ILoggableInterface.java
+++ b/tests/golden_output/aidl_test_loggable_interface-java-source/gen/android/aidl/loggable/ILoggableInterface.java
@@ -69,13 +69,9 @@
       if (code >= android.os.IBinder.FIRST_CALL_TRANSACTION && code <= android.os.IBinder.LAST_CALL_TRANSACTION) {
         data.enforceInterface(descriptor);
       }
-      switch (code)
-      {
-        case INTERFACE_TRANSACTION:
-        {
-          reply.writeString(descriptor);
-          return true;
-        }
+      if (code == INTERFACE_TRANSACTION) {
+        reply.writeString(descriptor);
+        return true;
       }
       switch (code)
       {
@@ -289,13 +285,9 @@
         if (code >= android.os.IBinder.FIRST_CALL_TRANSACTION && code <= android.os.IBinder.LAST_CALL_TRANSACTION) {
           data.enforceInterface(descriptor);
         }
-        switch (code)
-        {
-          case INTERFACE_TRANSACTION:
-          {
-            reply.writeString(descriptor);
-            return true;
-          }
+        if (code == INTERFACE_TRANSACTION) {
+          reply.writeString(descriptor);
+          return true;
         }
         switch (code)
         {
diff --git a/tests/java/src/android/aidl/permission/service/FakePermissionEnforcer.java b/tests/java/src/android/aidl/permission/service/FakePermissionEnforcer.java
deleted file mode 100644
index f7b694a..0000000
--- a/tests/java/src/android/aidl/permission/service/FakePermissionEnforcer.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2022 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.aidl.permission.service;
-
-import static android.permission.PermissionManager.PERMISSION_GRANTED;
-import static android.permission.PermissionManager.PERMISSION_HARD_DENIED;
-
-import android.annotation.NonNull;
-import android.content.AttributionSource;
-import java.util.List;
-
-/* Fake for android.os.PermissionEnforcer
- */
-public class FakePermissionEnforcer extends android.os.PermissionEnforcer {
-  private List<String> mGranted;
-
-  public void setGranted(List<String> granted) { mGranted = granted; }
-
-  @Override
-  protected int checkPermission(@NonNull String permission, int pid, int uid) {
-    if (mGranted != null && mGranted.contains(permission)) {
-      return PERMISSION_GRANTED;
-    }
-    return PERMISSION_HARD_DENIED;
-  }
-
-  @Override
-  protected int checkPermission(@NonNull String permission, @NonNull AttributionSource source) {
-    if (mGranted != null && mGranted.contains(permission)) {
-      return PERMISSION_GRANTED;
-    }
-    return PERMISSION_HARD_DENIED;
-  }
-}
diff --git a/tests/java/src/android/aidl/permission/service/PermissionTestService.java b/tests/java/src/android/aidl/permission/service/PermissionTestService.java
index b65b5df..f3bb0ce 100644
--- a/tests/java/src/android/aidl/permission/service/PermissionTestService.java
+++ b/tests/java/src/android/aidl/permission/service/PermissionTestService.java
@@ -20,6 +20,7 @@
 import android.annotation.EnforcePermission;
 import android.os.Binder;
 import android.os.ServiceManager;
+import android.os.test.FakePermissionEnforcer;
 import java.util.List;
 
 public class PermissionTestService extends IProtected.Stub {
@@ -62,7 +63,17 @@
   }
 
   @Override
-  public void SetGranted(List<String> permissions) {
-    mPermissionEnforcer.setGranted(permissions);
+  public void Grant(String permission) {
+    mPermissionEnforcer.grant(permission);
+  }
+
+  @Override
+  public void Revoke(String permission) {
+    mPermissionEnforcer.revoke(permission);
+  }
+
+  @Override
+  public void RevokeAll() {
+    mPermissionEnforcer.revokeAll();
   }
 }
diff --git a/tests/java/src/android/aidl/permission/tests/PermissionTests.java b/tests/java/src/android/aidl/permission/tests/PermissionTests.java
index 91a9f42..6eb9035 100644
--- a/tests/java/src/android/aidl/permission/tests/PermissionTests.java
+++ b/tests/java/src/android/aidl/permission/tests/PermissionTests.java
@@ -39,42 +39,48 @@
   @Test
   public void testProtected() throws Exception {
     // Requires READ_PHONE_STATE.
-    service.SetGranted(List.of());
     assertThrows(SecurityException.class, () -> service.PermissionProtected());
-    service.SetGranted(List.of("android.permission.READ_PHONE_STATE"));
+    service.Grant("android.permission.READ_PHONE_STATE");
     service.PermissionProtected();
   }
 
   @Test
   public void testMultiplePermissionsAll() throws Exception {
     // Requires INTERNET and VIBRATE.
-    service.SetGranted(List.of());
     assertThrows(SecurityException.class, () -> service.MultiplePermissionsAll());
-    service.SetGranted(List.of("android.permission.INTERNET"));
+
+    service.Grant("android.permission.INTERNET");
     assertThrows(SecurityException.class, () -> service.MultiplePermissionsAll());
-    service.SetGranted(List.of("android.permission.VIBRATE"));
+    service.RevokeAll();
+
+    service.Grant("android.permission.VIBRATE");
     assertThrows(SecurityException.class, () -> service.MultiplePermissionsAll());
-    service.SetGranted(List.of("android.permission.INTERNET", "android.permission.VIBRATE"));
+    service.RevokeAll();
+
+    service.Grant("android.permission.INTERNET");
+    service.Grant("android.permission.VIBRATE");
     service.MultiplePermissionsAll();
   }
 
   @Test
   public void testMultiplePermissionsAny() throws Exception {
     // Requires INTERNET or VIBRATE.
-    service.SetGranted(List.of());
     assertThrows(SecurityException.class, () -> service.MultiplePermissionsAny());
-    service.SetGranted(List.of("android.permission.INTERNET"));
+
+    service.Grant("android.permission.INTERNET");
     service.MultiplePermissionsAny();
-    service.SetGranted(List.of("android.permission.VIBRATE"));
+    service.RevokeAll();
+
+    service.Grant("android.permission.VIBRATE");
     service.MultiplePermissionsAny();
   }
 
   @Test
   public void testNonManifestPermission() throws Exception {
     // Requires android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK
-    service.SetGranted(List.of());
     assertThrows(SecurityException.class, () -> service.NonManifestPermission());
-    service.SetGranted(List.of("android.permission.MAINLINE_NETWORK_STACK"));
+
+    service.Grant("android.permission.MAINLINE_NETWORK_STACK");
     service.NonManifestPermission();
   }
 
diff --git a/tests/java/src/android/aidl/permission/tests/PermissionTestsLocal.java b/tests/java/src/android/aidl/permission/tests/PermissionTestsLocal.java
index 3e3146e..22aa6bd 100644
--- a/tests/java/src/android/aidl/permission/tests/PermissionTestsLocal.java
+++ b/tests/java/src/android/aidl/permission/tests/PermissionTestsLocal.java
@@ -20,10 +20,10 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertThrows;
 
-import android.aidl.permission.service.FakePermissionEnforcer;
 import android.aidl.permission.service.PermissionTestService;
 import android.aidl.tests.permission.IProtected;
 import android.os.RemoteException;
+import android.os.test.FakePermissionEnforcer;
 import org.junit.Before;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -34,5 +34,6 @@
   public void setUp() throws RemoteException {
     service = new PermissionTestService(new FakePermissionEnforcer());
     assertNotNull(service);
+    service.RevokeAll();
   }
 }
diff --git a/tests/java/src/android/aidl/permission/tests/PermissionTestsRemote.java b/tests/java/src/android/aidl/permission/tests/PermissionTestsRemote.java
index 5602fe8..0d8620e 100644
--- a/tests/java/src/android/aidl/permission/tests/PermissionTestsRemote.java
+++ b/tests/java/src/android/aidl/permission/tests/PermissionTestsRemote.java
@@ -35,5 +35,6 @@
     assertNotNull(binder);
     service = IProtected.Stub.asInterface(binder);
     assertNotNull(service);
+    service.RevokeAll();
   }
 }