diff options
author | TreeHugger Robot <treehugger-gerrit@google.com> | 2017-08-08 08:57:10 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2017-08-08 08:57:10 +0000 |
commit | b60182fd03c80d70a90dc3b6e4393efc6744cd74 (patch) | |
tree | 6e68b87a25ea8fed6677322976705d40e11024dd | |
parent | 97217bb7b219d17b297c6e8ef07a74142f5ff745 (diff) | |
parent | d97cb9753d2b17ae21c522d9a438b0e38c529121 (diff) | |
download | telephony-b60182fd03c80d70a90dc3b6e4393efc6744cd74.tar.gz |
Merge "Notify carrier app of other default networks" into oc-dr1-dev
5 files changed, 141 insertions, 31 deletions
diff --git a/src/java/com/android/internal/telephony/CarrierActionAgent.java b/src/java/com/android/internal/telephony/CarrierActionAgent.java index 0a7980bd30..6b9a70af41 100644 --- a/src/java/com/android/internal/telephony/CarrierActionAgent.java +++ b/src/java/com/android/internal/telephony/CarrierActionAgent.java @@ -54,25 +54,29 @@ public class CarrierActionAgent extends Handler { private static final boolean VDBG = Rlog.isLoggable(LOG_TAG, Log.VERBOSE); /** A list of carrier actions */ - public static final int CARRIER_ACTION_SET_METERED_APNS_ENABLED = 0; - public static final int CARRIER_ACTION_SET_RADIO_ENABLED = 1; - public static final int CARRIER_ACTION_RESET = 2; - public static final int EVENT_APM_SETTINGS_CHANGED = 3; - public static final int EVENT_MOBILE_DATA_SETTINGS_CHANGED = 4; - public static final int EVENT_DATA_ROAMING_OFF = 5; - public static final int EVENT_SIM_STATE_CHANGED = 6; + public static final int CARRIER_ACTION_SET_METERED_APNS_ENABLED = 0; + public static final int CARRIER_ACTION_SET_RADIO_ENABLED = 1; + public static final int CARRIER_ACTION_RESET = 2; + public static final int CARRIER_ACTION_REPORT_DEFAULT_NETWORK_STATUS = 3; + public static final int EVENT_APM_SETTINGS_CHANGED = 4; + public static final int EVENT_MOBILE_DATA_SETTINGS_CHANGED = 5; + public static final int EVENT_DATA_ROAMING_OFF = 6; + public static final int EVENT_SIM_STATE_CHANGED = 7; /** Member variables */ private final Phone mPhone; /** registrant list per carrier action */ private RegistrantList mMeteredApnEnableRegistrants = new RegistrantList(); private RegistrantList mRadioEnableRegistrants = new RegistrantList(); + private RegistrantList mDefaultNetworkReportRegistrants = new RegistrantList(); /** local log for carrier actions */ private LocalLog mMeteredApnEnabledLog = new LocalLog(10); private LocalLog mRadioEnabledLog = new LocalLog(10); - /** carrier actions, true by default */ + private LocalLog mReportDefaultNetworkStatusLog = new LocalLog(10); + /** carrier actions */ private Boolean mCarrierActionOnMeteredApnEnabled = true; private Boolean mCarrierActionOnRadioEnabled = true; + private Boolean mCarrierActionReportDefaultNetworkStatus = false; /** content observer for APM change */ private final SettingsObserver mSettingsObserver; @@ -102,6 +106,9 @@ public class CarrierActionAgent extends Handler { @Override public void handleMessage(Message msg) { + // skip notification if the input carrier action is same as the current one. + Boolean enabled = getCarrierActionEnabled(msg.what); + if (enabled != null && enabled == (boolean) msg.obj) return; switch (msg.what) { case CARRIER_ACTION_SET_METERED_APNS_ENABLED: mCarrierActionOnMeteredApnEnabled = (boolean) msg.obj; @@ -118,6 +125,15 @@ public class CarrierActionAgent extends Handler { mRadioEnableRegistrants.notifyRegistrants( new AsyncResult(null, mCarrierActionOnRadioEnabled, null)); break; + case CARRIER_ACTION_REPORT_DEFAULT_NETWORK_STATUS: + mCarrierActionReportDefaultNetworkStatus = (boolean) msg.obj; + log("CARRIER_ACTION_REPORT_AT_DEFAULT_NETWORK_STATUS: " + + mCarrierActionReportDefaultNetworkStatus); + mReportDefaultNetworkStatusLog.log("REGISTER_DEFAULT_NETWORK_STATUS: " + + mCarrierActionReportDefaultNetworkStatus); + mDefaultNetworkReportRegistrants.notifyRegistrants( + new AsyncResult(null, mCarrierActionReportDefaultNetworkStatus, null)); + break; case CARRIER_ACTION_RESET: log("CARRIER_ACTION_RESET"); carrierActionReset(); @@ -171,17 +187,6 @@ public class CarrierActionAgent extends Handler { } /** - * Return current carrier action values - */ - public Object getCarrierActionValue(int action) { - Object val = getCarrierAction(action); - if (val == null) { - throw new IllegalArgumentException("invalid carrier action: " + action); - } - return val; - } - - /** * Action set from carrier app to enable/disable radio */ public void carrierActionSetRadioEnabled(boolean enabled) { @@ -195,7 +200,15 @@ public class CarrierActionAgent extends Handler { sendMessage(obtainMessage(CARRIER_ACTION_SET_METERED_APNS_ENABLED, enabled)); } + /** + * Action set from carrier app to start/stop reporting default network status. + */ + public void carrierActionReportDefaultNetworkStatus(boolean report) { + sendMessage(obtainMessage(CARRIER_ACTION_REPORT_DEFAULT_NETWORK_STATUS, report)); + } + private void carrierActionReset() { + carrierActionReportDefaultNetworkStatus(false); carrierActionSetMeteredApnsEnabled(true); carrierActionSetRadioEnabled(true); // notify configured carrier apps for reset @@ -209,18 +222,22 @@ public class CarrierActionAgent extends Handler { return mMeteredApnEnableRegistrants; case CARRIER_ACTION_SET_RADIO_ENABLED: return mRadioEnableRegistrants; + case CARRIER_ACTION_REPORT_DEFAULT_NETWORK_STATUS: + return mDefaultNetworkReportRegistrants; default: loge("Unsupported action: " + action); return null; } } - private Object getCarrierAction(int action) { + private Boolean getCarrierActionEnabled(int action) { switch (action) { case CARRIER_ACTION_SET_METERED_APNS_ENABLED: return mCarrierActionOnMeteredApnEnabled; case CARRIER_ACTION_SET_RADIO_ENABLED: return mCarrierActionOnRadioEnabled; + case CARRIER_ACTION_REPORT_DEFAULT_NETWORK_STATUS: + return mCarrierActionReportDefaultNetworkStatus; default: loge("Unsupported action: " + action); return null; @@ -235,7 +252,7 @@ public class CarrierActionAgent extends Handler { */ public void registerForCarrierAction(int action, Handler h, int what, Object obj, boolean notifyNow) { - Object carrierAction = getCarrierAction(action); + Boolean carrierAction = getCarrierActionEnabled(action); if (carrierAction == null) { throw new IllegalArgumentException("invalid carrier action: " + action); } @@ -287,5 +304,10 @@ public class CarrierActionAgent extends Handler { ipw.increaseIndent(); mRadioEnabledLog.dump(fd, ipw, args); ipw.decreaseIndent(); + + pw.println(" mCarrierActionReportDefaultNetworkStatus Log:"); + ipw.increaseIndent(); + mReportDefaultNetworkStatusLog.dump(fd, ipw, args); + ipw.decreaseIndent(); } } diff --git a/src/java/com/android/internal/telephony/CarrierSignalAgent.java b/src/java/com/android/internal/telephony/CarrierSignalAgent.java index c6958cf6ea..f2dd2aaf70 100644 --- a/src/java/com/android/internal/telephony/CarrierSignalAgent.java +++ b/src/java/com/android/internal/telephony/CarrierSignalAgent.java @@ -22,6 +22,11 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; +import android.net.ConnectivityManager; +import android.net.Network; +import android.os.AsyncResult; +import android.os.Handler; +import android.os.Message; import android.os.PersistableBundle; import android.telephony.CarrierConfigManager; import android.telephony.Rlog; @@ -49,7 +54,7 @@ import static android.telephony.CarrierConfigManager.KEY_CARRIER_APP_NO_WAKE_SIG * repeated polling and send the intent to the interested receivers. * Each CarrierSignalAgent is associated with a phone object. */ -public class CarrierSignalAgent { +public class CarrierSignalAgent extends Handler { private static final String LOG_TAG = CarrierSignalAgent.class.getSimpleName(); private static final boolean DBG = true; @@ -63,6 +68,7 @@ public class CarrierSignalAgent { /** Member variables */ private final Phone mPhone; + private boolean mDefaultNetworkAvail; /** * This is a map of intent action -> set of component name of statically registered @@ -84,6 +90,8 @@ public class CarrierSignalAgent { */ private Map<String, Set<ComponentName>> mCachedNoWakeSignalConfigs = new HashMap<>(); + private static final int EVENT_REGISTER_DEFAULT_NETWORK_AVAIL = 0; + /** * This is a list of supported signals from CarrierSignalAgent */ @@ -91,7 +99,8 @@ public class CarrierSignalAgent { TelephonyIntents.ACTION_CARRIER_SIGNAL_PCO_VALUE, TelephonyIntents.ACTION_CARRIER_SIGNAL_REDIRECTED, TelephonyIntents.ACTION_CARRIER_SIGNAL_REQUEST_NETWORK_FAILED, - TelephonyIntents.ACTION_CARRIER_SIGNAL_RESET)); + TelephonyIntents.ACTION_CARRIER_SIGNAL_RESET, + TelephonyIntents.ACTION_CARRIER_SIGNAL_DEFAULT_NETWORK_AVAILABLE)); private final LocalLog mErrorLocalLog = new LocalLog(20); @@ -105,6 +114,8 @@ public class CarrierSignalAgent { } }; + private ConnectivityManager.NetworkCallback mNetworkCallback; + /** Constructor */ public CarrierSignalAgent(Phone phone) { mPhone = phone; @@ -112,6 +123,61 @@ public class CarrierSignalAgent { // reload configurations on CARRIER_CONFIG_CHANGED mPhone.getContext().registerReceiver(mReceiver, new IntentFilter(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED)); + mPhone.getCarrierActionAgent().registerForCarrierAction( + CarrierActionAgent.CARRIER_ACTION_REPORT_DEFAULT_NETWORK_STATUS, this, + EVENT_REGISTER_DEFAULT_NETWORK_AVAIL, null, false); + } + + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case EVENT_REGISTER_DEFAULT_NETWORK_AVAIL: + AsyncResult ar = (AsyncResult) msg.obj; + if (ar.exception != null) { + Rlog.e(LOG_TAG, "Register default network exception: " + ar.exception); + return; + } + final ConnectivityManager connectivityMgr = ConnectivityManager + .from(mPhone.getContext()); + if ((boolean) ar.result) { + mNetworkCallback = new ConnectivityManager.NetworkCallback() { + @Override + public void onAvailable(Network network) { + // an optimization to avoid signaling on every default network switch. + if (!mDefaultNetworkAvail) { + if (DBG) log("Default network available: " + network); + Intent intent = new Intent(TelephonyIntents + .ACTION_CARRIER_SIGNAL_DEFAULT_NETWORK_AVAILABLE); + intent.putExtra( + TelephonyIntents.EXTRA_DEFAULT_NETWORK_AVAILABLE_KEY, true); + notifyCarrierSignalReceivers(intent); + mDefaultNetworkAvail = true; + } + } + @Override + public void onLost(Network network) { + if (DBG) log("Default network lost: " + network); + Intent intent = new Intent(TelephonyIntents + .ACTION_CARRIER_SIGNAL_DEFAULT_NETWORK_AVAILABLE); + intent.putExtra( + TelephonyIntents.EXTRA_DEFAULT_NETWORK_AVAILABLE_KEY, false); + notifyCarrierSignalReceivers(intent); + mDefaultNetworkAvail = false; + } + }; + connectivityMgr.registerDefaultNetworkCallback(mNetworkCallback, mPhone); + log("Register default network"); + + } else if (mNetworkCallback != null) { + connectivityMgr.unregisterNetworkCallback(mNetworkCallback); + mNetworkCallback = null; + mDefaultNetworkAvail = false; + log("unregister default network"); + } + break; + default: + break; + } } /** @@ -316,6 +382,8 @@ public class CarrierSignalAgent { } ipw.decreaseIndent(); + pw.println("mDefaultNetworkAvail: " + mDefaultNetworkAvail); + pw.println("error log:"); ipw.increaseIndent(); mErrorLocalLog.dump(fd, pw, args); diff --git a/src/java/com/android/internal/telephony/GsmCdmaPhone.java b/src/java/com/android/internal/telephony/GsmCdmaPhone.java index d479f8ee42..63a23bd8a0 100644 --- a/src/java/com/android/internal/telephony/GsmCdmaPhone.java +++ b/src/java/com/android/internal/telephony/GsmCdmaPhone.java @@ -205,6 +205,10 @@ public class GsmCdmaPhone extends Phone { mPrecisePhoneType = precisePhoneType; initOnce(ci); initRatSpecific(precisePhoneType); + // CarrierSignalAgent uses CarrierActionAgent in construction so it needs to be created + // after CarrierActionAgent. + mCarrierActionAgent = mTelephonyComponentFactory.makeCarrierActionAgent(this); + mCarrierSignalAgent = mTelephonyComponentFactory.makeCarrierSignalAgent(this); mSST = mTelephonyComponentFactory.makeServiceStateTracker(this, this.mCi); // DcTracker uses SST so needs to be created after it is instantiated mDcTracker = mTelephonyComponentFactory.makeDcTracker(this); diff --git a/src/java/com/android/internal/telephony/Phone.java b/src/java/com/android/internal/telephony/Phone.java index 26d20c1ca1..11c8e610a8 100644 --- a/src/java/com/android/internal/telephony/Phone.java +++ b/src/java/com/android/internal/telephony/Phone.java @@ -250,9 +250,9 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { private boolean mDnsCheckDisabled; public DcTracker mDcTracker; /* Used for dispatching signals to configured carrier apps */ - private CarrierSignalAgent mCarrierSignalAgent; + protected CarrierSignalAgent mCarrierSignalAgent; /* Used for dispatching carrier action from carrier apps */ - private CarrierActionAgent mCarrierActionAgent; + protected CarrierActionAgent mCarrierActionAgent; private boolean mDoesRilSendMultipleCallRing; private int mCallRingContinueToken; private int mCallRingDelay; @@ -534,8 +534,6 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { mSmsUsageMonitor = mTelephonyComponentFactory.makeSmsUsageMonitor(context); mUiccController = UiccController.getInstance(); mUiccController.registerForIccChanged(this, EVENT_ICC_CHANGED, null); - mCarrierSignalAgent = mTelephonyComponentFactory.makeCarrierSignalAgent(this); - mCarrierActionAgent = mTelephonyComponentFactory.makeCarrierActionAgent(this); mSimActivationTracker = mTelephonyComponentFactory.makeSimActivationTracker(this); if (getPhoneType() != PhoneConstants.PHONE_TYPE_SIP) { mCi.registerForSrvccStateChanged(this, EVENT_SRVCC_STATE_CHANGED, null); @@ -2810,6 +2808,13 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { } /** + * Action set from carrier app to start/stop reporting default network condition. + */ + public void carrierActionReportDefaultNetworkStatus(boolean report) { + mCarrierActionAgent.carrierActionReportDefaultNetworkStatus(report); + } + + /** * Notify registrants of a new ringing Connection. * Subclasses of Phone probably want to replace this with a * version scoped to their packages diff --git a/tests/telephonytests/src/com/android/internal/telephony/CarrierActionAgentTest.java b/tests/telephonytests/src/com/android/internal/telephony/CarrierActionAgentTest.java index ca21914323..2294decbf0 100644 --- a/tests/telephonytests/src/com/android/internal/telephony/CarrierActionAgentTest.java +++ b/tests/telephonytests/src/com/android/internal/telephony/CarrierActionAgentTest.java @@ -26,6 +26,7 @@ import static org.mockito.Mockito.verify; import android.content.Intent; import android.database.ContentObserver; import android.net.Uri; +import android.os.AsyncResult; import android.os.Handler; import android.os.HandlerThread; import android.os.Message; @@ -106,13 +107,21 @@ public class CarrierActionAgentTest extends TelephonyTest { mContext.sendBroadcast(intent); waitForMs(200); - // carrier actions triggered from sim loading + // no carrier actions triggered from sim loading since there are same as the current one ArgumentCaptor<Message> message = ArgumentCaptor.forClass(Message.class); - verify(mDataActionHandler).sendMessageAtTime(message.capture(), anyLong()); - assertEquals(DATA_CARRIER_ACTION_EVENT, message.getValue().what); + verify(mDataActionHandler, times(0)).sendMessageAtTime(message.capture(), anyLong()); + verify(mRadioActionHandler, times(0)).sendMessageAtTime(message.capture(), anyLong()); - verify(mRadioActionHandler).sendMessageAtTime(message.capture(), anyLong()); + // disable metered apns and radio + mCarrierActionAgentUT.carrierActionSetRadioEnabled(false); + mCarrierActionAgentUT.carrierActionSetMeteredApnsEnabled(false); + waitForMs(200); + verify(mDataActionHandler, times(1)).sendMessageAtTime(message.capture(), anyLong()); + assertEquals(DATA_CARRIER_ACTION_EVENT, message.getValue().what); + assertEquals(false, ((AsyncResult) message.getValue().obj).result); + verify(mRadioActionHandler, times(1)).sendMessageAtTime(message.capture(), anyLong()); assertEquals(RADIO_CARRIER_ACTION_EVENT, message.getValue().what); + assertEquals(false, ((AsyncResult) message.getValue().obj).result); // simulate APM change from off -> on Settings.Global.putInt(mFakeContentResolver, Settings.Global.AIRPLANE_MODE_ON, 1); @@ -123,9 +132,11 @@ public class CarrierActionAgentTest extends TelephonyTest { // carrier actions triggered from APM verify(mDataActionHandler, times(2)).sendMessageAtTime(message.capture(), anyLong()); assertEquals(DATA_CARRIER_ACTION_EVENT, message.getValue().what); + assertEquals(true, ((AsyncResult) message.getValue().obj).result); verify(mRadioActionHandler, times(2)).sendMessageAtTime(message.capture(), anyLong()); assertEquals(RADIO_CARRIER_ACTION_EVENT, message.getValue().what); + assertEquals(true, ((AsyncResult) message.getValue().obj).result); } @After |