Merge "Add API setProhibitMode in HdmiControlService"
diff --git a/core/java/android/hardware/hdmi/IHdmiControlService.aidl b/core/java/android/hardware/hdmi/IHdmiControlService.aidl
index 0e231cc..3f0f2ae 100644
--- a/core/java/android/hardware/hdmi/IHdmiControlService.aidl
+++ b/core/java/android/hardware/hdmi/IHdmiControlService.aidl
@@ -52,6 +52,7 @@
     void setControlEnabled(boolean enabled);
     void setArcMode(boolean enabled);
     void setOption(int option, int value);
+    void setProhibitMode(boolean enabled);
     oneway void setSystemAudioVolume(int oldIndex, int newIndex, int maxIndex);
     oneway void setSystemAudioMute(boolean mute);
     void setInputChangeListener(IHdmiInputChangeListener listener);
diff --git a/services/core/java/com/android/server/hdmi/ActiveSourceHandler.java b/services/core/java/com/android/server/hdmi/ActiveSourceHandler.java
index 45fde45..dcf43a3 100644
--- a/services/core/java/com/android/server/hdmi/ActiveSourceHandler.java
+++ b/services/core/java/com/android/server/hdmi/ActiveSourceHandler.java
@@ -72,7 +72,7 @@
 
         int currentActive = tv.getActiveSource();
         int currentPath = tv.getActivePath();
-        if (!tv.isInPresetInstallationMode()) {
+        if (!tv.isProhibitMode()) {
             tv.updateActiveSource(activeAddress, activePath);
             if (currentActive != activeAddress && currentPath != activePath) {
                 tv.updateActivePortId(mService.pathToPortId(activePath));
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
index 795404f..d6d6006 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
@@ -53,12 +53,6 @@
     @GuardedBy("mLock")
     private int mActiveRoutingPath;
 
-    // Set to true while the service is in normal mode. While set to false, no input change is
-    // allowed. Used for situations where input change can confuse users such as channel auto-scan,
-    // system upgrade, etc., a.k.a. "prohibit mode".
-    @GuardedBy("mLock")
-    private boolean mInputChangeEnabled;
-
     protected final HdmiCecMessageCache mCecMessageCache = new HdmiCecMessageCache();
     protected final Object mLock;
 
@@ -71,9 +65,6 @@
         mDeviceType = deviceType;
         mAddress = HdmiCec.ADDR_UNREGISTERED;
         mLock = service.getServiceLock();
-
-        // TODO: Get control flag from persistent storage
-        mInputChangeEnabled = true;
     }
 
     // Factory method that returns HdmiCecLocalDevice of corresponding type.
@@ -291,7 +282,7 @@
     protected boolean handleStandby(HdmiCecMessage message) {
         assertRunOnServiceThread();
         // Seq #12
-        if (mService.isControlEnabled() && !isInPresetInstallationMode()
+        if (mService.isControlEnabled() && !mService.isProhibitMode()
                 && mService.isPowerOnOrTransient()) {
             mService.standby();
             return true;
@@ -546,19 +537,6 @@
         }
     }
 
-    void setInputChangeEnabled(boolean enabled) {
-        synchronized (mLock) {
-            mInputChangeEnabled = enabled;
-        }
-    }
-
-    boolean isInPresetInstallationMode() {
-        // TODO: Change this to check the right flag.
-        synchronized (mLock) {
-            return !mInputChangeEnabled;
-        }
-    }
-
     @ServiceThreadOnly
     HdmiCecMessageCache getCecMessageCache() {
         assertRunOnServiceThread();
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
index 7ecbdd6..eb80b20 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
@@ -272,7 +272,7 @@
         if (getActiveSource() != message.getSource()) {
             return true;
         }
-        if (isInPresetInstallationMode()) {
+        if (isProhibitMode()) {
             return true;
         }
         int portId = getPrevPortId();
@@ -1061,4 +1061,8 @@
         }
         return false;
     }
+
+    boolean isProhibitMode() {
+        return mService.isProhibitMode();
+    }
 }
diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java
index a6936c0..6dd3250 100644
--- a/services/core/java/com/android/server/hdmi/HdmiControlService.java
+++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java
@@ -151,6 +151,12 @@
     @GuardedBy("mLock")
     private boolean mHdmiControlEnabled;
 
+    // Set to true while the service is in normal mode. While set to false, no input change is
+    // allowed. Used for situations where input change can confuse users such as channel auto-scan,
+    // system upgrade, etc., a.k.a. "prohibit mode".
+    @GuardedBy("mLock")
+    private boolean mProhibitMode;
+
     // List of listeners registered by callers that want to get notified of
     // system audio mode changes.
     private final ArrayList<IHdmiSystemAudioModeChangeListener>
@@ -217,6 +223,8 @@
         // TODO: Read the preference for SystemAudioMode and initialize mSystemAudioMode and
         // start to monitor the preference value and invoke SystemAudioActionFromTv if needed.
         mHdmiControlEnabled = true;
+        // TODO: Get control flag from persistent storage
+        mProhibitMode = false;
     }
 
     @ServiceThreadOnly
@@ -875,6 +883,7 @@
 
         @Override
         public void setOption(final int key, final int value) {
+            enforceAccessPermission();
             if (!isTvDevice()) {
                 return;
             }
@@ -898,6 +907,15 @@
         private boolean isTvDevice() {
             return tv() != null;
         }
+
+        @Override
+        public void setProhibitMode(final boolean enabled) {
+            enforceAccessPermission();
+            if (!isTvDevice()) {
+                return;
+            }
+            HdmiControlService.this.setProhibitMode(enabled);
+        }
     }
 
     @ServiceThreadOnly
@@ -1176,4 +1194,16 @@
         mStandbyMessageReceived = false;
         mCecController.setOption(HdmiCec.OPTION_CEC_SERVICE_CONTROL, HdmiCec.DISABLED);
     }
+
+    boolean isProhibitMode() {
+        synchronized (mLock) {
+            return mProhibitMode;
+        }
+    }
+
+    void setProhibitMode(boolean enabled) {
+        synchronized (mLock) {
+            mProhibitMode = enabled;
+        }
+    }
 }
diff --git a/services/core/java/com/android/server/hdmi/SystemAudioActionFromAvr.java b/services/core/java/com/android/server/hdmi/SystemAudioActionFromAvr.java
index f44c014..ef7e837 100644
--- a/services/core/java/com/android/server/hdmi/SystemAudioActionFromAvr.java
+++ b/services/core/java/com/android/server/hdmi/SystemAudioActionFromAvr.java
@@ -51,7 +51,7 @@
             finishWithCallback(HdmiCec.RESULT_SUCCESS);
             return;
         }
-        if (tv().isInPresetInstallationMode()) {
+        if (tv().isProhibitMode()) {
             sendCommand(HdmiCecMessageBuilder.buildFeatureAbortCommand(
                     getSourceAddress(), mAvrLogicalAddress,
                     HdmiCec.MESSAGE_SET_SYSTEM_AUDIO_MODE, HdmiConstants.ABORT_REFUSED));