Merge "Throw on revoked location permission - telephony"
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index add90ff..dbfb317 100755
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -1928,9 +1928,11 @@
 
     @Override
     @SuppressWarnings("unchecked")
-    public List<NeighboringCellInfo> getNeighboringCellInfo(String callingPackage) {
-        mPhone.getContext().getSystemService(AppOpsManager.class)
-                .checkPackage(Binder.getCallingUid(), callingPackage);
+    public List<NeighboringCellInfo>
+            getNeighboringCellInfo(String callingPackage, int targetSdk) {
+        // FIXME: use the P constant when available
+        if (targetSdk > android.os.Build.VERSION_CODES.O_MR1 + 1) return null;
+
         if (!LocationAccessPolicy.canAccessCellLocation(mPhone.getContext(),
                 callingPackage, Binder.getCallingUid(), Binder.getCallingPid(), true)) {
             return null;
diff --git a/src/com/android/services/telephony/CdmaConnection.java b/src/com/android/services/telephony/CdmaConnection.java
index 4c869a9..19c750b 100644
--- a/src/com/android/services/telephony/CdmaConnection.java
+++ b/src/com/android/services/telephony/CdmaConnection.java
@@ -40,6 +40,7 @@
 
     private static final int MSG_CALL_WAITING_MISSED = 1;
     private static final int MSG_DTMF_SEND_CONFIRMATION = 2;
+    private static final int MSG_CDMA_LINE_CONTROL_INFO_REC = 3;
     private static final int TIMEOUT_CALL_WAITING_MILLIS = 20 * 1000;
 
     private final Handler mHandler = new Handler() {
@@ -54,6 +55,9 @@
                 case MSG_DTMF_SEND_CONFIRMATION:
                     handleBurstDtmfConfirmation();
                     break;
+                case MSG_CDMA_LINE_CONTROL_INFO_REC:
+                    handleCdmaConnectionTimeReset();
+                    break;
                 default:
                     break;
             }
@@ -72,6 +76,7 @@
     // Indicates that the DTMF confirmation from telephony is pending.
     private boolean mDtmfBurstConfirmationPending = false;
     private boolean mIsCallWaiting;
+    private boolean mIsConnectionTimeReset = false;
 
     CdmaConnection(
             Connection connection,
@@ -299,4 +304,33 @@
         mAllowMute = true;
         super.handleExitedEcmMode();
     }
+
+    private void handleCdmaConnectionTimeReset() {
+        boolean isImsCall = getOriginalConnection() instanceof ImsPhoneConnection;
+        if (!isImsCall && !mIsConnectionTimeReset && mIsOutgoing
+                && getOriginalConnection() != null
+                && getOriginalConnection().getState() == Call.State.ACTIVE
+                && getOriginalConnection().getDurationMillis() > 0) {
+            mIsConnectionTimeReset = true;
+            getOriginalConnection().resetConnectionTime();
+            resetConnectionTime();
+        }
+    }
+
+    @Override
+    void setOriginalConnection(com.android.internal.telephony.Connection originalConnection) {
+        super.setOriginalConnection(originalConnection);
+        if (getPhone() != null) {
+            getPhone().registerForLineControlInfo(mHandler, MSG_CDMA_LINE_CONTROL_INFO_REC, null);
+        }
+    }
+
+    @Override
+    protected void close() {
+        mIsConnectionTimeReset = false;
+        if (getPhone() != null) {
+            getPhone().unregisterForLineControlInfo(mHandler);
+        }
+        super.close();
+    }
 }
diff --git a/src/com/android/services/telephony/TelephonyConnection.java b/src/com/android/services/telephony/TelephonyConnection.java
index ed5ef55..2b445dc 100644
--- a/src/com/android/services/telephony/TelephonyConnection.java
+++ b/src/com/android/services/telephony/TelephonyConnection.java
@@ -1666,7 +1666,7 @@
         setActive();
     }
 
-    private void close() {
+    protected void close() {
         Log.v(this, "close");
         clearOriginalConnection();
         destroy();