Loading services/core/java/com/android/server/connectivity/Tethering.java +98 −67 Original line number Diff line number Diff line Loading @@ -1345,12 +1345,25 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering } } private final AtomicInteger mSimBcastGenerationNumber = new AtomicInteger(0); private SimChangeBroadcastReceiver mBroadcastReceiver = null; private class SimChangeListener { 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( mSimBcastGenerationNumber.incrementAndGet()); final IntentFilter filter = new IntentFilter(); Loading @@ -1359,18 +1372,46 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering mContext.registerReceiver(mBroadcastReceiver, filter, null, mTetherMasterSM.getHandler()); } } private void stopListeningForSimChanges() { if (DBG) Log.d(TAG, "stopListeningForSimChanges"); if (mBroadcastReceiver != null) { public void stopListening() { if (DBG) Log.d(TAG, "stopListening for SIM changes"); if (mBroadcastReceiver == null) return; mSimBcastGenerationNumber.incrementAndGet(); mContext.unregisterReceiver(mBroadcastReceiver); 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; } 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); } class SimChangeBroadcastReceiver extends BroadcastReceiver { 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 final private int mGenerationNumber; Loading @@ -1379,38 +1420,39 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering private boolean mSimAbsentSeen = false; public SimChangeBroadcastReceiver(int generationNumber) { super(); mGenerationNumber = generationNumber; } @Override public void onReceive(Context context, Intent intent) { final int currentGenerationNumber = mSimBcastGenerationNumber.get(); if (DBG) { Log.d(TAG, "simchange mGenerationNumber=" + mGenerationNumber + ", current generationNumber=" + mSimBcastGenerationNumber.get()); ", current generationNumber=" + currentGenerationNumber); } if (mGenerationNumber != mSimBcastGenerationNumber.get()) return; final String state = intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE); if (mGenerationNumber != currentGenerationNumber) return; final String state = intent.getStringExtra( IccCardConstants.INTENT_KEY_ICC_STATE); Log.d(TAG, "got Sim changed to state " + state + ", 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; try { if (mContext.getResources().getString(com.android.internal.R.string. config_mobile_hotspot_provision_app_no_ui).isEmpty() == 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) { if (tetherState.mLastState != IControlsTethering.STATE_TETHERED) { continue; // Skip interfaces that aren't tethered. } String iface = mTetherStates.keyAt(i); Loading @@ -1420,22 +1462,10 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering } } } 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); startProvisionIntent(tetherType); } 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 } } } Loading Loading @@ -1471,12 +1501,13 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering } class TetherModeAliveState extends TetherMasterUtilState { final SimChangeListener simChange = new SimChangeListener(mContext); boolean mTryCell = true; @Override public void enter() { // TODO: examine if we should check the return value. turnOnMasterTetherSettings(); // may transition us out startListeningForSimChanges(); simChange.startListening(); mUpstreamNetworkMonitor.start(); mTryCell = true; // better try something first pass or crazy tests cases will fail Loading @@ -1488,7 +1519,7 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering public void exit() { unrequestUpstreamMobileConnection(); mUpstreamNetworkMonitor.stop(); stopListeningForSimChanges(); simChange.stopListening(); notifyTetheredOfNewUpstreamIface(null); handleNewUpstreamNetworkState(null); } Loading Loading
services/core/java/com/android/server/connectivity/Tethering.java +98 −67 Original line number Diff line number Diff line Loading @@ -1345,12 +1345,25 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering } } private final AtomicInteger mSimBcastGenerationNumber = new AtomicInteger(0); private SimChangeBroadcastReceiver mBroadcastReceiver = null; private class SimChangeListener { 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( mSimBcastGenerationNumber.incrementAndGet()); final IntentFilter filter = new IntentFilter(); Loading @@ -1359,18 +1372,46 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering mContext.registerReceiver(mBroadcastReceiver, filter, null, mTetherMasterSM.getHandler()); } } private void stopListeningForSimChanges() { if (DBG) Log.d(TAG, "stopListeningForSimChanges"); if (mBroadcastReceiver != null) { public void stopListening() { if (DBG) Log.d(TAG, "stopListening for SIM changes"); if (mBroadcastReceiver == null) return; mSimBcastGenerationNumber.incrementAndGet(); mContext.unregisterReceiver(mBroadcastReceiver); 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; } 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); } class SimChangeBroadcastReceiver extends BroadcastReceiver { 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 final private int mGenerationNumber; Loading @@ -1379,38 +1420,39 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering private boolean mSimAbsentSeen = false; public SimChangeBroadcastReceiver(int generationNumber) { super(); mGenerationNumber = generationNumber; } @Override public void onReceive(Context context, Intent intent) { final int currentGenerationNumber = mSimBcastGenerationNumber.get(); if (DBG) { Log.d(TAG, "simchange mGenerationNumber=" + mGenerationNumber + ", current generationNumber=" + mSimBcastGenerationNumber.get()); ", current generationNumber=" + currentGenerationNumber); } if (mGenerationNumber != mSimBcastGenerationNumber.get()) return; final String state = intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE); if (mGenerationNumber != currentGenerationNumber) return; final String state = intent.getStringExtra( IccCardConstants.INTENT_KEY_ICC_STATE); Log.d(TAG, "got Sim changed to state " + state + ", 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; try { if (mContext.getResources().getString(com.android.internal.R.string. config_mobile_hotspot_provision_app_no_ui).isEmpty() == 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) { if (tetherState.mLastState != IControlsTethering.STATE_TETHERED) { continue; // Skip interfaces that aren't tethered. } String iface = mTetherStates.keyAt(i); Loading @@ -1420,22 +1462,10 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering } } } 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); startProvisionIntent(tetherType); } 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 } } } Loading Loading @@ -1471,12 +1501,13 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering } class TetherModeAliveState extends TetherMasterUtilState { final SimChangeListener simChange = new SimChangeListener(mContext); boolean mTryCell = true; @Override public void enter() { // TODO: examine if we should check the return value. turnOnMasterTetherSettings(); // may transition us out startListeningForSimChanges(); simChange.startListening(); mUpstreamNetworkMonitor.start(); mTryCell = true; // better try something first pass or crazy tests cases will fail Loading @@ -1488,7 +1519,7 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering public void exit() { unrequestUpstreamMobileConnection(); mUpstreamNetworkMonitor.stop(); stopListeningForSimChanges(); simChange.stopListening(); notifyTetheredOfNewUpstreamIface(null); handleNewUpstreamNetworkState(null); } Loading