Merge "Refactor to SimChangeListener class" am: a12217012e am: 74247b4ee8

am: 6dacd5ecf2

Change-Id: Ia80e64c9f1188953aa4d9687bc7b0b0659de968a
This commit is contained in:
Erik Kline
2017-01-20 10:21:20 +00:00
committed by android-build-merger

View File

@@ -1346,12 +1346,25 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
} }
} }
private final AtomicInteger mSimBcastGenerationNumber = new AtomicInteger(0); private class SimChangeListener {
private SimChangeBroadcastReceiver mBroadcastReceiver = null; private final Context mContext;
private final AtomicInteger mSimBcastGenerationNumber;
private BroadcastReceiver mBroadcastReceiver;
SimChangeListener(Context ctx) {
mContext = ctx;
mSimBcastGenerationNumber = new AtomicInteger(0);
}
public int generationNumber() {
return mSimBcastGenerationNumber.get();
}
public void startListening() {
if (DBG) Log.d(TAG, "startListening for SIM changes");
if (mBroadcastReceiver != null) return;
private void startListeningForSimChanges() {
if (DBG) Log.d(TAG, "startListeningForSimChanges");
if (mBroadcastReceiver == null) {
mBroadcastReceiver = new SimChangeBroadcastReceiver( mBroadcastReceiver = new SimChangeBroadcastReceiver(
mSimBcastGenerationNumber.incrementAndGet()); mSimBcastGenerationNumber.incrementAndGet());
final IntentFilter filter = new IntentFilter(); final IntentFilter filter = new IntentFilter();
@@ -1360,83 +1373,100 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
mContext.registerReceiver(mBroadcastReceiver, filter, null, mContext.registerReceiver(mBroadcastReceiver, filter, null,
mTetherMasterSM.getHandler()); mTetherMasterSM.getHandler());
} }
}
private void stopListeningForSimChanges() { public void stopListening() {
if (DBG) Log.d(TAG, "stopListeningForSimChanges"); if (DBG) Log.d(TAG, "stopListening for SIM changes");
if (mBroadcastReceiver != null) {
if (mBroadcastReceiver == null) return;
mSimBcastGenerationNumber.incrementAndGet(); mSimBcastGenerationNumber.incrementAndGet();
mContext.unregisterReceiver(mBroadcastReceiver); mContext.unregisterReceiver(mBroadcastReceiver);
mBroadcastReceiver = null; mBroadcastReceiver = null;
} }
}
class SimChangeBroadcastReceiver extends BroadcastReceiver { public boolean hasMobileHotspotProvisionApp() {
// used to verify this receiver is still current try {
final private int mGenerationNumber; if (!mContext.getResources().getString(com.android.internal.R.string.
config_mobile_hotspot_provision_app_no_ui).isEmpty()) {
// we're interested in edge-triggered LOADED notifications, so Log.d(TAG, "re-evaluate provisioning");
// ignore LOADED unless we saw an ABSENT state first return true;
private boolean mSimAbsentSeen = false; }
} catch (Resources.NotFoundException e) {}
public SimChangeBroadcastReceiver(int generationNumber) { Log.d(TAG, "no prov-check needed for new SIM");
super(); return false;
mGenerationNumber = generationNumber;
} }
@Override private boolean isSimCardAbsent(String state) {
public void onReceive(Context context, Intent intent) { return IccCardConstants.INTENT_VALUE_ICC_ABSENT.equals(state);
if (DBG) { }
Log.d(TAG, "simchange mGenerationNumber=" + mGenerationNumber +
", current generationNumber=" + mSimBcastGenerationNumber.get());
}
if (mGenerationNumber != mSimBcastGenerationNumber.get()) return;
final String state = private boolean isSimCardLoaded(String state) {
intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE); return IccCardConstants.INTENT_VALUE_ICC_LOADED.equals(state);
}
Log.d(TAG, "got Sim changed to state " + state + ", mSimAbsentSeen=" + private void startProvisionIntent(int tetherType) {
mSimAbsentSeen); final Intent startProvIntent = new Intent();
if (!mSimAbsentSeen && IccCardConstants.INTENT_VALUE_ICC_ABSENT.equals(state)) { startProvIntent.putExtra(ConnectivityManager.EXTRA_ADD_TETHER_TYPE, tetherType);
mSimAbsentSeen = true; startProvIntent.putExtra(ConnectivityManager.EXTRA_RUN_PROVISION, true);
startProvIntent.setComponent(TETHER_SERVICE);
mContext.startServiceAsUser(startProvIntent, UserHandle.CURRENT);
}
private class SimChangeBroadcastReceiver extends BroadcastReceiver {
// used to verify this receiver is still current
final private int mGenerationNumber;
// we're interested in edge-triggered LOADED notifications, so
// ignore LOADED unless we saw an ABSENT state first
private boolean mSimAbsentSeen = false;
public SimChangeBroadcastReceiver(int generationNumber) {
mGenerationNumber = generationNumber;
} }
if (mSimAbsentSeen && IccCardConstants.INTENT_VALUE_ICC_LOADED.equals(state)) { @Override
mSimAbsentSeen = false; public void onReceive(Context context, Intent intent) {
try { final int currentGenerationNumber = mSimBcastGenerationNumber.get();
if (mContext.getResources().getString(com.android.internal.R.string.
config_mobile_hotspot_provision_app_no_ui).isEmpty() == false) { if (DBG) {
ArrayList<Integer> tethered = new ArrayList<Integer>(); Log.d(TAG, "simchange mGenerationNumber=" + mGenerationNumber +
synchronized (mPublicSync) { ", current generationNumber=" + currentGenerationNumber);
for (int i = 0; i < mTetherStates.size(); i++) { }
TetherState tetherState = mTetherStates.valueAt(i); if (mGenerationNumber != currentGenerationNumber) return;
if (tetherState.mLastState !=
IControlsTethering.STATE_TETHERED) { final String state = intent.getStringExtra(
continue; // Skip interfaces that aren't tethered. IccCardConstants.INTENT_KEY_ICC_STATE);
} Log.d(TAG, "got Sim changed to state " + state + ", mSimAbsentSeen=" +
String iface = mTetherStates.keyAt(i); mSimAbsentSeen);
int interfaceType = ifaceNameToType(iface);
if (interfaceType != ConnectivityManager.TETHERING_INVALID) { if (isSimCardAbsent(state)) {
tethered.add(new Integer(interfaceType)); if (!mSimAbsentSeen) mSimAbsentSeen = true;
} return;
}
if (isSimCardLoaded(state) && mSimAbsentSeen) {
mSimAbsentSeen = false;
if (!hasMobileHotspotProvisionApp()) return;
ArrayList<Integer> tethered = new ArrayList<Integer>();
synchronized (mPublicSync) {
for (int i = 0; i < mTetherStates.size(); i++) {
TetherState tetherState = mTetherStates.valueAt(i);
if (tetherState.mLastState != IControlsTethering.STATE_TETHERED) {
continue; // Skip interfaces that aren't tethered.
}
String iface = mTetherStates.keyAt(i);
int interfaceType = ifaceNameToType(iface);
if (interfaceType != ConnectivityManager.TETHERING_INVALID) {
tethered.add(new Integer(interfaceType));
} }
} }
for (int tetherType : tethered) {
Intent startProvIntent = new Intent();
startProvIntent.putExtra(
ConnectivityManager.EXTRA_ADD_TETHER_TYPE, tetherType);
startProvIntent.putExtra(
ConnectivityManager.EXTRA_RUN_PROVISION, true);
startProvIntent.setComponent(TETHER_SERVICE);
mContext.startServiceAsUser(startProvIntent, UserHandle.CURRENT);
}
Log.d(TAG, "re-evaluate provisioning");
} else {
Log.d(TAG, "no prov-check needed for new SIM");
} }
} catch (Resources.NotFoundException e) {
Log.d(TAG, "no prov-check needed for new SIM"); for (int tetherType : tethered) {
// not defined, do nothing startProvisionIntent(tetherType);
}
} }
} }
} }
@@ -1472,12 +1502,13 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
} }
class TetherModeAliveState extends TetherMasterUtilState { class TetherModeAliveState extends TetherMasterUtilState {
final SimChangeListener simChange = new SimChangeListener(mContext);
boolean mTryCell = true; boolean mTryCell = true;
@Override @Override
public void enter() { public void enter() {
// TODO: examine if we should check the return value. // TODO: examine if we should check the return value.
turnOnMasterTetherSettings(); // may transition us out turnOnMasterTetherSettings(); // may transition us out
startListeningForSimChanges(); simChange.startListening();
mUpstreamNetworkMonitor.start(); mUpstreamNetworkMonitor.start();
mTryCell = true; // better try something first pass or crazy tests cases will fail mTryCell = true; // better try something first pass or crazy tests cases will fail
@@ -1489,7 +1520,7 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
public void exit() { public void exit() {
unrequestUpstreamMobileConnection(); unrequestUpstreamMobileConnection();
mUpstreamNetworkMonitor.stop(); mUpstreamNetworkMonitor.stop();
stopListeningForSimChanges(); simChange.stopListening();
notifyTetheredOfNewUpstreamIface(null); notifyTetheredOfNewUpstreamIface(null);
handleNewUpstreamNetworkState(null); handleNewUpstreamNetworkState(null);
} }