Merge "Refactor to SimChangeListener class"

am: a12217012e

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

View File

@@ -1345,12 +1345,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();
@@ -1359,18 +1372,46 @@ 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;
} }
public boolean hasMobileHotspotProvisionApp() {
try {
if (!mContext.getResources().getString(com.android.internal.R.string.
config_mobile_hotspot_provision_app_no_ui).isEmpty()) {
Log.d(TAG, "re-evaluate provisioning");
return true;
}
} catch (Resources.NotFoundException e) {}
Log.d(TAG, "no prov-check needed for new SIM");
return false;
} }
class SimChangeBroadcastReceiver extends BroadcastReceiver { private boolean isSimCardAbsent(String state) {
return IccCardConstants.INTENT_VALUE_ICC_ABSENT.equals(state);
}
private boolean isSimCardLoaded(String state) {
return IccCardConstants.INTENT_VALUE_ICC_LOADED.equals(state);
}
private void startProvisionIntent(int tetherType) {
final 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);
}
private class SimChangeBroadcastReceiver extends BroadcastReceiver {
// used to verify this receiver is still current // used to verify this receiver is still current
final private int mGenerationNumber; final private int mGenerationNumber;
@@ -1379,38 +1420,39 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
private boolean mSimAbsentSeen = false; private boolean mSimAbsentSeen = false;
public SimChangeBroadcastReceiver(int generationNumber) { public SimChangeBroadcastReceiver(int generationNumber) {
super();
mGenerationNumber = generationNumber; mGenerationNumber = generationNumber;
} }
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
final int currentGenerationNumber = mSimBcastGenerationNumber.get();
if (DBG) { if (DBG) {
Log.d(TAG, "simchange mGenerationNumber=" + mGenerationNumber + Log.d(TAG, "simchange mGenerationNumber=" + mGenerationNumber +
", current generationNumber=" + mSimBcastGenerationNumber.get()); ", current generationNumber=" + currentGenerationNumber);
} }
if (mGenerationNumber != mSimBcastGenerationNumber.get()) return; if (mGenerationNumber != currentGenerationNumber) return;
final String state =
intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE);
final String state = intent.getStringExtra(
IccCardConstants.INTENT_KEY_ICC_STATE);
Log.d(TAG, "got Sim changed to state " + state + ", mSimAbsentSeen=" + Log.d(TAG, "got Sim changed to state " + state + ", mSimAbsentSeen=" +
mSimAbsentSeen); mSimAbsentSeen);
if (!mSimAbsentSeen && IccCardConstants.INTENT_VALUE_ICC_ABSENT.equals(state)) {
mSimAbsentSeen = true; if (isSimCardAbsent(state)) {
if (!mSimAbsentSeen) mSimAbsentSeen = true;
return;
} }
if (mSimAbsentSeen && IccCardConstants.INTENT_VALUE_ICC_LOADED.equals(state)) { if (isSimCardLoaded(state) && mSimAbsentSeen) {
mSimAbsentSeen = false; mSimAbsentSeen = false;
try {
if (mContext.getResources().getString(com.android.internal.R.string. if (!hasMobileHotspotProvisionApp()) return;
config_mobile_hotspot_provision_app_no_ui).isEmpty() == false) {
ArrayList<Integer> tethered = new ArrayList<Integer>(); ArrayList<Integer> tethered = new ArrayList<Integer>();
synchronized (mPublicSync) { synchronized (mPublicSync) {
for (int i = 0; i < mTetherStates.size(); i++) { for (int i = 0; i < mTetherStates.size(); i++) {
TetherState tetherState = mTetherStates.valueAt(i); TetherState tetherState = mTetherStates.valueAt(i);
if (tetherState.mLastState != if (tetherState.mLastState != IControlsTethering.STATE_TETHERED) {
IControlsTethering.STATE_TETHERED) {
continue; // Skip interfaces that aren't tethered. continue; // Skip interfaces that aren't tethered.
} }
String iface = mTetherStates.keyAt(i); String iface = mTetherStates.keyAt(i);
@@ -1420,22 +1462,10 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering
} }
} }
} }
for (int tetherType : tethered) { for (int tetherType : tethered) {
Intent startProvIntent = new Intent(); startProvisionIntent(tetherType);
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");
// not defined, do nothing
} }
} }
} }
@@ -1471,12 +1501,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
@@ -1488,7 +1519,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);
} }