Merge "Refactor to SimChangeListener class" am: a12217012e am: 74247b4ee8
am: 6dacd5ecf2
Change-Id: Ia80e64c9f1188953aa4d9687bc7b0b0659de968a
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user