Send availability info more reliably

We don't have a monolithic availability state, so the mAvailable variable
must go.

bug:5453318
Change-Id: I82af90907cc7a0173b74d661912f9c28ddc7dcb0
diff --git a/core/java/android/net/MobileDataStateTracker.java b/core/java/android/net/MobileDataStateTracker.java
index 62bb965..54a89ad 100644
--- a/core/java/android/net/MobileDataStateTracker.java
+++ b/core/java/android/net/MobileDataStateTracker.java
@@ -197,7 +197,10 @@
                 String apnName = intent.getStringExtra(Phone.DATA_APN_KEY);
                 mNetworkInfo.setRoaming(intent.getBooleanExtra(Phone.DATA_NETWORK_ROAMING_KEY,
                         false));
-
+                if (VDBG) {
+                    log(mApnType + " setting isAvailable to " +
+                            intent.getBooleanExtra(Phone.NETWORK_UNAVAILABLE_KEY,false));
+                }
                 mNetworkInfo.setIsAvailable(!intent.getBooleanExtra(Phone.NETWORK_UNAVAILABLE_KEY,
                         false));
 
diff --git a/core/java/android/net/NetworkStateTracker.java b/core/java/android/net/NetworkStateTracker.java
index 1735592..7df0193 100644
--- a/core/java/android/net/NetworkStateTracker.java
+++ b/core/java/android/net/NetworkStateTracker.java
@@ -132,6 +132,9 @@
      * Returns an indication of whether this network is available for
      * connections. A value of {@code false} means that some quasi-permanent
      * condition prevents connectivity to this network.
+     *
+     * NOTE that this is broken on multi-connection devices.  Should be fixed in J release
+     * TODO - fix on multi-pdp devices
      */
     public boolean isAvailable();
 
diff --git a/telephony/java/com/android/internal/telephony/DataConnectionTracker.java b/telephony/java/com/android/internal/telephony/DataConnectionTracker.java
index ae152fb..759a84b 100644
--- a/telephony/java/com/android/internal/telephony/DataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/DataConnectionTracker.java
@@ -254,9 +254,6 @@
     /** CID of active data connection */
     protected int mCidActive;
 
-    /** indication of our availability (preconditions to trysetupData are met) **/
-    protected boolean mAvailability = false;
-
     // When false we will not auto attach and manually attaching is required.
     protected boolean mAutoAttachOnCreation = false;
 
@@ -755,7 +752,7 @@
                 mPhone.notifyDataConnection(reason, apnIdToType(id));
             }
         }
-        notifyDataAvailability(reason);
+        notifyOffApnsOfAvailability(reason);
     }
 
     // a new APN has gone active and needs to send events to catch up with the
@@ -783,15 +780,8 @@
     }
 
     // disabled apn's still need avail/unavail notificiations - send them out
-    protected void notifyOffApnsOfAvailability(String reason, boolean availability) {
-        if (mAvailability == availability) {
-            if (DBG) {
-                log("notifyOffApnsOfAvailability: no change in availability, " +
-                     "not nofitying about reason='" + reason + "' availability=" + availability);
-            }
-            return;
-        }
-        mAvailability = availability;
+    protected void notifyOffApnsOfAvailability(String reason) {
+        if (DBG) log("notifyOffApnsOfAvailability - reason= " + reason);
         for (int id = 0; id < APN_NUM_TYPES; id++) {
             if (!isApnIdEnabled(id)) {
                 notifyApnIdDisconnected(reason, id);
@@ -799,13 +789,6 @@
         }
     }
 
-    // we had an availability change - tell the listeners
-    protected void notifyDataAvailability(String reason) {
-        // note that we either just turned all off because we lost availability
-        // or all were off and could now go on, so only have off apns to worry about
-        notifyOffApnsOfAvailability(reason, isDataPossible(Phone.APN_TYPE_DEFAULT));
-    }
-
     public boolean isApnTypeEnabled(String apnType) {
         if (apnType == null) {
             return false;
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
index 4dace82..3c7ff05 100644
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaDataConnectionTracker.java
@@ -237,7 +237,7 @@
             // FIXME  this can be improved
             setState(State.CONNECTED);
             notifyDataConnection(reason);
-            notifyOffApnsOfAvailability(reason, true);
+            notifyOffApnsOfAvailability(reason);
 
             log("(fix?) We're on the simulator; assuming data is connected");
             return true;
@@ -250,10 +250,10 @@
         if ((mState == State.IDLE || mState == State.SCANNING) &&
                 isDataAllowed() && getAnyDataEnabled()) {
             boolean retValue = setupData(reason);
-            notifyOffApnsOfAvailability(reason, retValue);
+            notifyOffApnsOfAvailability(reason);
             return retValue;
         } else {
-            notifyOffApnsOfAvailability(reason, false);
+            notifyOffApnsOfAvailability(reason);
             return false;
         }
     }
@@ -276,7 +276,7 @@
         }
 
         setState(State.DISCONNECTING);
-        notifyDataAvailability(reason);
+        notifyOffApnsOfAvailability(reason);
 
         boolean notificationDeferred = false;
         for (DataConnection conn : mDataConnections.values()) {
@@ -536,7 +536,7 @@
 
     private void notifyNoData(FailCause lastFailCauseCode) {
         setState(State.FAILED);
-        notifyDataAvailability(null);
+        notifyOffApnsOfAvailability(null);
     }
 
     protected void gotoIdleAndNotifyDataConnection(String reason) {
@@ -583,7 +583,7 @@
     @Override
     protected void onRoamingOff() {
         if (getDataOnRoamingEnabled() == false) {
-            notifyDataAvailability(Phone.REASON_ROAMING_OFF);
+            notifyOffApnsOfAvailability(Phone.REASON_ROAMING_OFF);
             trySetupData(Phone.REASON_ROAMING_OFF);
         } else {
             notifyDataConnection(Phone.REASON_ROAMING_OFF);
@@ -601,7 +601,7 @@
         } else {
             if (DBG) log("Tear down data connection on roaming.");
             cleanUpAllConnections(null);
-            notifyDataAvailability(Phone.REASON_ROAMING_ON);
+            notifyOffApnsOfAvailability(Phone.REASON_ROAMING_ON);
         }
     }
 
@@ -619,7 +619,7 @@
             log("We're on the simulator; assuming data is connected");
         }
 
-        notifyDataAvailability(null);
+        notifyOffApnsOfAvailability(null);
 
         if (mState != State.IDLE) {
             cleanUpAllConnections(null);
@@ -710,7 +710,7 @@
         if (mState == State.CONNECTED && !mCdmaPhone.mSST.isConcurrentVoiceAndDataAllowed()) {
             stopNetStatPoll();
             notifyDataConnection(Phone.REASON_VOICE_CALL_STARTED);
-            notifyDataAvailability(Phone.REASON_VOICE_CALL_STARTED);
+            notifyOffApnsOfAvailability(Phone.REASON_VOICE_CALL_STARTED);
         }
     }
 
@@ -727,7 +727,7 @@
                 // clean slate after call end.
                 resetPollStats();
             }
-            notifyDataAvailability(Phone.REASON_VOICE_CALL_ENDED);
+            notifyOffApnsOfAvailability(Phone.REASON_VOICE_CALL_ENDED);
         } else {
             mDataConnections.get(0).resetRetryCount();
             // in case data setup was attempted when we were on a voice call
diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
index 78ba7dd..5497b7f 100644
--- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
@@ -556,7 +556,7 @@
             notifyDataConnection(Phone.REASON_DATA_ATTACHED);
         } else {
             // update APN availability so that APN can be enabled.
-            notifyDataAvailability(Phone.REASON_DATA_ATTACHED);
+            notifyOffApnsOfAvailability(Phone.REASON_DATA_ATTACHED);
         }
 
         setupDataOnReadyApns(Phone.REASON_DATA_ATTACHED);
@@ -693,7 +693,7 @@
                 if (waitingApns.isEmpty()) {
                     if (DBG) log("trySetupData: No APN found");
                     notifyNoData(GsmDataConnection.FailCause.MISSING_UNKNOWN_APN, apnContext);
-                    notifyOffApnsOfAvailability(apnContext.getReason(), false);
+                    notifyOffApnsOfAvailability(apnContext.getReason());
                     return false;
                 } else {
                     apnContext.setWaitingApns(waitingApns);
@@ -708,7 +708,7 @@
             }
             // apnContext.setReason(apnContext.getReason());
             boolean retValue = setupData(apnContext);
-            notifyOffApnsOfAvailability(apnContext.getReason(), retValue);
+            notifyOffApnsOfAvailability(apnContext.getReason());
             return retValue;
         } else {
             // TODO: check the condition.
@@ -716,23 +716,25 @@
                 && (apnContext.getState() == State.IDLE
                     || apnContext.getState() == State.SCANNING))
                 mPhone.notifyDataConnectionFailed(apnContext.getReason(), apnContext.getApnType());
-            notifyOffApnsOfAvailability(apnContext.getReason(), false);
+            notifyOffApnsOfAvailability(apnContext.getReason());
             return false;
         }
     }
 
     @Override
     // Disabled apn's still need avail/unavail notificiations - send them out
-    protected void notifyOffApnsOfAvailability(String reason, boolean availability) {
-        if (mAvailability == availability) return;
-        mAvailability = availability;
-
+    protected void notifyOffApnsOfAvailability(String reason) {
         for (ApnContext apnContext : mApnContexts.values()) {
             if (!apnContext.isReady()) {
                 if (DBG) log("notifyOffApnOfAvailability type:" + apnContext.getApnType());
                 mPhone.notifyDataConnection(reason != null ? reason : apnContext.getReason(),
                                             apnContext.getApnType(),
                                             Phone.DataState.DISCONNECTED);
+            } else {
+                if (DBG) {
+                    log("notifyOffApnsOfAvailability skipped apn due to isReady==false: " +
+                            apnContext.toString());
+                }
             }
         }
     }
@@ -1572,7 +1574,7 @@
         createAllApnList();
         if (mPhone.mCM.getRadioState().isOn()) {
             if (DBG) log("onRecordsLoaded: notifying data availability");
-            notifyDataAvailability(Phone.REASON_SIM_LOADED);
+            notifyOffApnsOfAvailability(Phone.REASON_SIM_LOADED);
         }
         setupDataOnReadyApns(Phone.REASON_SIM_LOADED);
     }
@@ -1681,7 +1683,7 @@
         if (DBG) log("onRoamingOff");
 
         if (getDataOnRoamingEnabled() == false) {
-            notifyDataAvailability(Phone.REASON_ROAMING_OFF);
+            notifyOffApnsOfAvailability(Phone.REASON_ROAMING_OFF);
             setupDataOnReadyApns(Phone.REASON_ROAMING_OFF);
         } else {
             notifyDataConnection(Phone.REASON_ROAMING_OFF);
@@ -1697,7 +1699,7 @@
         } else {
             if (DBG) log("onRoamingOn: Tear down data connection on roaming.");
             cleanUpAllConnections(true, Phone.REASON_ROAMING_ON);
-            notifyDataAvailability(Phone.REASON_ROAMING_ON);
+            notifyOffApnsOfAvailability(Phone.REASON_ROAMING_ON);
         }
     }
 
@@ -1714,7 +1716,7 @@
         }
 
         if (mPhone.mIccRecords.getRecordsLoaded()) {
-            notifyDataAvailability(null);
+            notifyOffApnsOfAvailability(null);
         }
 
         if (getOverallState() != State.IDLE) {
@@ -1740,7 +1742,7 @@
             if (DBG) log("onRadioOffOrNotAvailable: is off and clean up all connections");
             cleanUpAllConnections(false, Phone.REASON_RADIO_TURNED_OFF);
         }
-        notifyDataAvailability(null);
+        notifyOffApnsOfAvailability(null);
     }
 
     @Override
@@ -1985,7 +1987,7 @@
                         apnContext.getApnType());
             }
         }
-        notifyDataAvailability(reason);
+        notifyOffApnsOfAvailability(reason);
     }
 
     /**