@@ -220,7 +220,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
220220
221221 // list of DeathRecipients used to make sure features are turned off when
222222 // a process dies
223- private List mFeatureUsers ;
223+ private List < FeatureUser > mFeatureUsers ;
224224
225225 private boolean mSystemReady ;
226226 private Intent mInitialBroadcast ;
@@ -404,7 +404,7 @@ private ConnectivityService(Context context) {
404404 mNetRequestersPids [i ] = new ArrayList ();
405405 }
406406
407- mFeatureUsers = new ArrayList ();
407+ mFeatureUsers = new ArrayList < FeatureUser > ();
408408
409409 mNumDnsEntries = 0 ;
410410
@@ -677,6 +677,20 @@ public void expire() {
677677 stopUsingNetworkFeature (this , false );
678678 }
679679
680+ public boolean isSameUser (FeatureUser u ) {
681+ if (u == null ) return false ;
682+
683+ return isSameUser (u .mPid , u .mUid , u .mNetworkType , u .mFeature );
684+ }
685+
686+ public boolean isSameUser (int pid , int uid , int networkType , String feature ) {
687+ if ((mPid == pid ) && (mUid == uid ) && (mNetworkType == networkType ) &&
688+ TextUtils .equals (mFeature , feature )) {
689+ return true ;
690+ }
691+ return false ;
692+ }
693+
680694 public String toString () {
681695 return "FeatureUser(" +mNetworkType +"," +mFeature +"," +mPid +"," +mUid +"), created " +
682696 (System .currentTimeMillis () - mCreateTime ) + " mSec ago" ;
@@ -727,16 +741,29 @@ public int startUsingNetworkFeature(int networkType, String feature,
727741 }
728742 }
729743
744+ int restoreTimer = getRestoreDefaultNetworkDelay (usedNetworkType );
745+
730746 synchronized (this ) {
731- mFeatureUsers .add (f );
747+ boolean addToList = true ;
748+ if (restoreTimer < 0 ) {
749+ // In case there is no timer is specified for the feature,
750+ // make sure we don't add duplicate entry with the same request.
751+ for (FeatureUser u : mFeatureUsers ) {
752+ if (u .isSameUser (f )) {
753+ // Duplicate user is found. Do not add.
754+ addToList = false ;
755+ break ;
756+ }
757+ }
758+ }
759+
760+ if (addToList ) mFeatureUsers .add (f );
732761 if (!mNetRequestersPids [usedNetworkType ].contains (currentPid )) {
733762 // this gets used for per-pid dns when connected
734763 mNetRequestersPids [usedNetworkType ].add (currentPid );
735764 }
736765 }
737766
738- int restoreTimer = getRestoreDefaultNetworkDelay (usedNetworkType );
739-
740767 if (restoreTimer >= 0 ) {
741768 mHandler .sendMessageDelayed (
742769 mHandler .obtainMessage (EVENT_RESTORE_DEFAULT_NETWORK , f ), restoreTimer );
@@ -786,11 +813,9 @@ public int stopUsingNetworkFeature(int networkType, String feature) {
786813 boolean found = false ;
787814
788815 synchronized (this ) {
789- for (int i = 0 ; i < mFeatureUsers .size () ; i ++) {
790- u = (FeatureUser )mFeatureUsers .get (i );
791- if (uid == u .mUid && pid == u .mPid &&
792- networkType == u .mNetworkType &&
793- TextUtils .equals (feature , u .mFeature )) {
816+ for (FeatureUser x : mFeatureUsers ) {
817+ if (x .isSameUser (pid , uid , networkType , feature )) {
818+ u = x ;
794819 found = true ;
795820 break ;
796821 }
@@ -842,11 +867,8 @@ private int stopUsingNetworkFeature(FeatureUser u, boolean ignoreDups) {
842867 // do not pay attention to duplicate requests - in effect the
843868 // API does not refcount and a single stop will counter multiple starts.
844869 if (ignoreDups == false ) {
845- for (int i = 0 ; i < mFeatureUsers .size () ; i ++) {
846- FeatureUser x = (FeatureUser )mFeatureUsers .get (i );
847- if (x .mUid == u .mUid && x .mPid == u .mPid &&
848- x .mNetworkType == u .mNetworkType &&
849- TextUtils .equals (x .mFeature , u .mFeature )) {
870+ for (FeatureUser x : mFeatureUsers ) {
871+ if (x .isSameUser (u )) {
850872 if (DBG ) log ("ignoring stopUsingNetworkFeature as dup is found" );
851873 return 1 ;
852874 }
0 commit comments