From 1dd1d79d9063524ce4b25f0fc059ac9380784261 Mon Sep 17 00:00:00 2001 From: markchien Date: Fri, 11 Jan 2019 16:18:20 +0800 Subject: [PATCH] Support entitlement check in DSDS Get resource from preferred SIM's subId. Bug: 122108346 Bug: 120069528 Test: atest TetherServiceTest Change-Id: Ia4279a418dfa6cd14942b7f4d2a313156066381b --- AndroidManifest.xml | 2 +- src/com/android/settings/Utils.java | 10 ++++ .../TetherProvisioningActivity.java | 10 +++- .../settings/wifi/tether/TetherService.java | 49 +++++++++++++------ .../wifi/tether/TetherServiceTest.java | 26 ++++++---- 5 files changed, 69 insertions(+), 28 deletions(-) rename src/com/android/settings/{ => network}/TetherProvisioningActivity.java (90%) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index b4579771762..c234427d3fb 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -442,7 +442,7 @@ android:exported="true" android:permission="android.permission.TETHER_PRIVILEGED" /> - mCurrentTethers; private ArrayMap> mPendingCallbacks; private HotspotOffReceiver mHotspotReceiver; @@ -79,7 +83,7 @@ public class TetherService extends Service { public void onCreate() { super.onCreate(); if (DEBUG) Log.d(TAG, "Creating TetherService"); - String provisionResponse = getResources().getString( + String provisionResponse = getResourceForDefaultDataSubId().getString( com.android.internal.R.string.config_mobile_hotspot_provision_response); registerReceiver(mReceiver, new IntentFilter(provisionResponse), android.Manifest.permission.CONNECTIVITY_INTERNAL, null); @@ -91,9 +95,6 @@ public class TetherService extends Service { mPendingCallbacks.put(ConnectivityManager.TETHERING_USB, new ArrayList()); mPendingCallbacks.put( ConnectivityManager.TETHERING_BLUETOOTH, new ArrayList()); - if (mUsageManagerWrapper == null) { - mUsageManagerWrapper = new UsageStatsManagerWrapper(this); - } mHotspotReceiver = new HotspotOffReceiver(this); } @@ -258,7 +259,7 @@ public class TetherService extends Service { } private Intent getProvisionBroadcastIntent(int index) { - String provisionAction = getResources().getString( + String provisionAction = getResourceForDefaultDataSubId().getString( com.android.internal.R.string.config_mobile_hotspot_provision_app_no_ui); Intent intent = new Intent(provisionAction); int type = mCurrentTethers.get(index); @@ -282,7 +283,7 @@ public class TetherService extends Service { for (ResolveInfo resolver : resolvers) { if (resolver.activityInfo.applicationInfo.isSystemApp()) { String packageName = resolver.activityInfo.packageName; - mUsageManagerWrapper.setAppInactive(packageName, false); + getTetherServiceWrapper().setAppInactive(packageName, false); } } } @@ -294,7 +295,7 @@ public class TetherService extends Service { PendingIntent pendingIntent = PendingIntent.getService(this, 0, intent, 0); AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); - int period = getResources().getInteger( + int period = getResourceForDefaultDataSubId().getInteger( com.android.internal.R.integer.config_mobile_hotspot_provision_check_period); long periodMs = period * MS_PER_HOUR; long firstTime = SystemClock.elapsedRealtime() + periodMs; @@ -347,7 +348,7 @@ public class TetherService extends Service { @Override public void onReceive(Context context, Intent intent) { if (DEBUG) Log.d(TAG, "Got provision result " + intent); - String provisionResponse = getResources().getString( + String provisionResponse = getResourceForDefaultDataSubId().getString( com.android.internal.R.string.config_mobile_hotspot_provision_response); if (provisionResponse.equals(intent.getAction())) { @@ -385,19 +386,27 @@ public class TetherService extends Service { }; @VisibleForTesting - void setUsageStatsManagerWrapper(UsageStatsManagerWrapper wrapper) { - mUsageManagerWrapper = wrapper; + void setTetherServiceWrapper(TetherServiceWrapper wrapper) { + mWrapper = wrapper; + } + + private TetherServiceWrapper getTetherServiceWrapper() { + if (mWrapper == null) { + mWrapper = new TetherServiceWrapper(this); + } + return mWrapper; } /** - * A static helper class used for tests. UsageStatsManager cannot be mocked out becasue - * it's marked final. This class can be mocked out instead. + * A static helper class used for tests. UsageStatsManager cannot be mocked out because + * it's marked final. Static method SubscriptionManager#getResourcesForSubId also cannot + * be mocked. This class can be mocked out instead. */ @VisibleForTesting - public static class UsageStatsManagerWrapper { + public static class TetherServiceWrapper { private final UsageStatsManager mUsageStatsManager; - UsageStatsManagerWrapper(Context context) { + TetherServiceWrapper(Context context) { mUsageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE); } @@ -405,5 +414,15 @@ public class TetherService extends Service { void setAppInactive(String packageName, boolean isInactive) { mUsageStatsManager.setAppInactive(packageName, isInactive); } + + int getDefaultDataSubscriptionId() { + return SubscriptionManager.getDefaultDataSubscriptionId(); + } + } + + @VisibleForTesting + Resources getResourceForDefaultDataSubId() { + final int subId = getTetherServiceWrapper().getDefaultDataSubscriptionId(); + return Utils.getResourcesForSubId(this, subId); } } diff --git a/tests/unit/src/com/android/settings/wifi/tether/TetherServiceTest.java b/tests/unit/src/com/android/settings/wifi/tether/TetherServiceTest.java index 09b317ca932..03320923d7a 100644 --- a/tests/unit/src/com/android/settings/wifi/tether/TetherServiceTest.java +++ b/tests/unit/src/com/android/settings/wifi/tether/TetherServiceTest.java @@ -27,6 +27,8 @@ import static android.net.ConnectivityManager.TETHERING_USB; import static android.net.ConnectivityManager.TETHERING_WIFI; import static android.net.ConnectivityManager.TETHER_ERROR_NO_ERROR; import static android.net.ConnectivityManager.TETHER_ERROR_PROVISION_FAILED; +import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID; + import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyLong; import static org.mockito.Matchers.eq; @@ -83,7 +85,7 @@ public class TetherServiceTest extends ServiceTestCase { private TetherService mService; private MockResources mResources; - private FakeUsageStatsManagerWrapper mUsageStatsManagerWrapper; + private MockTetherServiceWrapper mWrapper; int mLastReceiverResultCode = BOGUS_RECEIVER_RESULT; private int mLastTetherRequestType = TETHERING_INVALID; private int mProvisionResponse = BOGUS_RECEIVER_RESULT; @@ -125,7 +127,7 @@ public class TetherServiceTest extends ServiceTestCase { when(mPrefs.edit()).thenReturn(mPrefEditor); when(mPrefEditor.putString(eq(CURRENT_TYPES), mStoredTypes.capture())).thenReturn( mPrefEditor); - mUsageStatsManagerWrapper = new FakeUsageStatsManagerWrapper(mContext); + mWrapper = new MockTetherServiceWrapper(mContext); ResolveInfo systemAppResolveInfo = new ResolveInfo(); ActivityInfo systemActivityInfo = new ActivityInfo(); @@ -146,6 +148,8 @@ public class TetherServiceTest extends ServiceTestCase { resolvers.add(systemAppResolveInfo); when(mPackageManager.queryBroadcastReceivers( any(Intent.class), eq(PackageManager.MATCH_ALL))).thenReturn(resolvers); + setupService(); + getService().setTetherServiceWrapper(mWrapper); } @Override @@ -171,16 +175,13 @@ public class TetherServiceTest extends ServiceTestCase { } public void testStartKeepsProvisionAppActive() { - setupService(); - getService().setUsageStatsManagerWrapper(mUsageStatsManagerWrapper); - runProvisioningForType(TETHERING_WIFI); assertTrue(waitForProvisionRequest(TETHERING_WIFI)); assertTrue(waitForProvisionResponse(TETHER_ERROR_NO_ERROR)); - assertFalse(mUsageStatsManagerWrapper.isAppInactive(ENTITLEMENT_PACKAGE_NAME)); + assertFalse(mWrapper.isAppInactive(ENTITLEMENT_PACKAGE_NAME)); // Non-system handler of the intent action should stay idle. - assertTrue(mUsageStatsManagerWrapper.isAppInactive(FAKE_PACKAGE_NAME)); + assertTrue(mWrapper.isAppInactive(FAKE_PACKAGE_NAME)); } public void testScheduleRechecks() { @@ -419,11 +420,11 @@ public class TetherServiceTest extends ServiceTestCase { } } - private static class FakeUsageStatsManagerWrapper - extends TetherService.UsageStatsManagerWrapper { + private static class MockTetherServiceWrapper + extends TetherService.TetherServiceWrapper { private final Set mActivePackages; - FakeUsageStatsManagerWrapper(Context context) { + MockTetherServiceWrapper(Context context) { super(context); mActivePackages = new HashSet<>(); } @@ -440,5 +441,10 @@ public class TetherServiceTest extends ServiceTestCase { boolean isAppInactive(String packageName) { return !mActivePackages.contains(packageName); } + + @Override + int getDefaultDataSubscriptionId() { + return INVALID_SUBSCRIPTION_ID; + } } }