Merge "Ensure upgrade to video requests are ignored when video disabled."
diff --git a/src/java/com/android/ims/ImsCall.java b/src/java/com/android/ims/ImsCall.java
index ad289fd..b972810 100644
--- a/src/java/com/android/ims/ImsCall.java
+++ b/src/java/com/android/ims/ImsCall.java
@@ -3447,6 +3447,20 @@
             if (mCallProfile == null) {
                 return false;
             }
+            int radioTechnology = getRadioTechnology();
+            return radioTechnology == ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN;
+        }
+    }
+
+    /**
+     * Determines the radio access technology for the {@link ImsCall}.
+     * @return The {@link ServiceState} {@code RIL_RADIO_TECHNOLOGY_*} code in use.
+     */
+    public int getRadioTechnology() {
+        synchronized(mLockObj) {
+            if (mCallProfile == null) {
+                return ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN;
+            }
             String callType = mCallProfile.getCallExtra(ImsCallProfile.EXTRA_CALL_RAT_TYPE);
             if (callType == null || callType.isEmpty()) {
                 callType = mCallProfile.getCallExtra(ImsCallProfile.EXTRA_CALL_RAT_TYPE_ALT);
@@ -3461,7 +3475,7 @@
                 radioTechnology = ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN;
             }
 
-            return radioTechnology == ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN;
+            return radioTechnology;
         }
     }
 
diff --git a/src/java/com/android/ims/internal/ImsVideoCallProviderWrapper.java b/src/java/com/android/ims/internal/ImsVideoCallProviderWrapper.java
index 113b06b..364a073 100644
--- a/src/java/com/android/ims/internal/ImsVideoCallProviderWrapper.java
+++ b/src/java/com/android/ims/internal/ImsVideoCallProviderWrapper.java
@@ -70,6 +70,7 @@
     private VideoPauseTracker mVideoPauseTracker = new VideoPauseTracker();
     private boolean mUseVideoPauseWorkaround = false;
     private int mCurrentVideoState;
+    private boolean mIsVideoEnabled = true;
 
     private IBinder.DeathRecipient mDeathRecipient = new IBinder.DeathRecipient() {
         @Override
@@ -151,9 +152,25 @@
         public void handleMessage(Message msg) {
             SomeArgs args;
             switch (msg.what) {
-                case MSG_RECEIVE_SESSION_MODIFY_REQUEST:
-                    receiveSessionModifyRequest((VideoProfile) msg.obj);
-                    break;
+                case MSG_RECEIVE_SESSION_MODIFY_REQUEST: {
+                    VideoProfile videoProfile = (VideoProfile) msg.obj;
+                    if (!VideoProfile.isVideo(mCurrentVideoState) && VideoProfile.isVideo(
+                            videoProfile.getVideoState()) && !mIsVideoEnabled) {
+                        // Video is disabled, reject the request.
+                        Log.i(ImsVideoCallProviderWrapper.this,
+                                "receiveSessionModifyRequest: requestedVideoState=%s; rejecting "
+                                        + "as video is disabled.",
+                                videoProfile.getVideoState());
+                        try {
+                            mVideoCallProvider.sendSessionModifyResponse(
+                                    new VideoProfile(VideoProfile.STATE_AUDIO_ONLY));
+                        } catch (RemoteException e) {
+                        }
+                        return;
+                    }
+                    receiveSessionModifyRequest(videoProfile);
+                }
+                break;
                 case MSG_RECEIVE_SESSION_MODIFY_RESPONSE:
                     args = (SomeArgs) msg.obj;
                     try {
@@ -569,4 +586,14 @@
         }
         mCurrentVideoState = newVideoState;
     }
+
+    /**
+     * Sets whether video is enabled locally or not.
+     * Used to reject incoming video requests when video is disabled locally due to data being
+     * disabled on a call where video calls are metered.
+     * @param isVideoEnabled {@code true} if video is locally enabled, {@code false} otherwise.
+     */
+    public void setIsVideoEnabled(boolean isVideoEnabled) {
+        mIsVideoEnabled = isVideoEnabled;
+    }
 }