Skip to content
Snippets Groups Projects
Commit 147186da authored by markchien's avatar markchien Committed by Mark Chien
Browse files

[Tether10]Remove UserManagerInternal usage in Tethering

To be the unbundled application, tethering can not use UserManagerInternal
method anymore. Replace it by listening user restriction change intent.

Also fix some cleanup from
https://android-review.googlesource.com/c/platform/frameworks/base/+/1131002

Bug: 143195885
Test: -build, flash, boot
      -atest TetheringTests
      -manual test. Add a trigger point to call
       UserManager.setUserRestriction(DISALLOW_CONFIG_TETHERING) from
       Settings. Open hotspot -> restrict tethering from new adding trigger
       point -> hotspot is OFF and Tethering settings are not available.

Change-Id: I4ed08d20f8b7476b8ecd5d018b75806dd2f22cc1
Merged-In: I4ed08d20f8b7476b8ecd5d018b75806dd2f22cc1
parent ee6ad378
No related branches found
No related tags found
No related merge requests found
......@@ -17,7 +17,7 @@
package android.net;
/**
* Configuration details for a tethering.
* Configuration details for tethering.
* @hide
*/
parcelable TetheringConfigurationParcel {
......
......@@ -168,11 +168,12 @@ public class TetheringManager {
* #getTetherableIfaces() to ensure corresponding interface is available for
* tethering before calling #tether().
*
* TODO: Deprecate this API. The only usages should be in PanService and Wifi P2P which
* @deprecated The only usages should be in PanService and Wifi P2P which
* need direct access.
*
* {@hide}
*/
@Deprecated
public int tether(@NonNull String iface) {
try {
mConnector.tether(iface);
......@@ -185,8 +186,10 @@ public class TetheringManager {
/**
* Stop tethering the named interface.
*
* @deprecated
* {@hide}
*/
@Deprecated
public int untether(@NonNull String iface) {
try {
mConnector.untether(iface);
......@@ -202,9 +205,10 @@ public class TetheringManager {
* encapsulate proper entitlement logic. If the API is used and an entitlement check is needed,
* downstream USB tethering will be enabled but will not have any upstream.
*
* @Deprecated
* @deprecated
* {@hide}
*/
@Deprecated
public int setUsbTethering(boolean enable) {
try {
mConnector.setUsbTethering(enable);
......@@ -386,8 +390,10 @@ public class TetheringManager {
/**
* Get the set of tethered dhcp ranges.
*
* @deprecated This API just return the default value which is not used in DhcpServer.
* {@hide}
*/
@Deprecated
public @NonNull String[] getTetheredDhcpRanges() {
if (!mCallback.awaitCallbackCreation()) {
throw new NullPointerException("callback was not ready yet");
......
......@@ -93,8 +93,6 @@ import android.os.RemoteException;
import android.os.ResultReceiver;
import android.os.UserHandle;
import android.os.UserManager;
import android.os.UserManagerInternal;
import android.os.UserManagerInternal.UserRestrictionsListener;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
......@@ -111,7 +109,6 @@ import com.android.internal.util.MessageUtils;
import com.android.internal.util.Protocol;
import com.android.internal.util.State;
import com.android.internal.util.StateMachine;
import com.android.server.LocalServices;
import java.io.FileDescriptor;
import java.io.PrintWriter;
......@@ -188,6 +185,7 @@ public class Tethering {
private final PhoneStateListener mPhoneStateListener;
private final INetd mNetd;
private final NetdCallback mNetdCallback;
private final UserRestrictionActionListener mTetheringRestriction;
private int mActiveDataSubId = INVALID_SUBSCRIPTION_ID;
// All the usage of mTetherInternalCallback should run in the same thread.
private ITetherInternalCallback mTetherInternalCallback = null;
......@@ -280,6 +278,10 @@ public class Tethering {
mLog.e("Unable to register netd UnsolicitedEventListener");
}
final UserManager userManager = (UserManager) mContext.getSystemService(
Context.USER_SERVICE);
mTetheringRestriction = new UserRestrictionActionListener(userManager, this);
// Load tethering configuration.
updateConfiguration();
......@@ -298,6 +300,7 @@ public class Tethering {
filter.addAction(WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
filter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
filter.addAction(UserManager.ACTION_USER_RESTRICTIONS_CHANGED);
mContext.registerReceiver(mStateReceiver, filter, null, handler);
filter = new IntentFilter();
......@@ -306,11 +309,6 @@ public class Tethering {
filter.addDataScheme("file");
mContext.registerReceiver(mStateReceiver, filter, null, handler);
final UserManagerInternal umi = LocalServices.getService(UserManagerInternal.class);
// This check is useful only for some unit tests; example: ConnectivityServiceTest.
if (umi != null) {
umi.addUserRestrictionsListener(new TetheringUserRestrictionListener(this));
}
}
private WifiManager getWifiManager() {
......@@ -717,8 +715,8 @@ public class Tethering {
}
if (mTetheredNotificationBuilder == null) {
mTetheredNotificationBuilder =
new Notification.Builder(mContext, SystemNotificationChannels.NETWORK_STATUS);
mTetheredNotificationBuilder = new Notification.Builder(mContext,
SystemNotificationChannels.NETWORK_STATUS);
mTetheredNotificationBuilder.setWhen(0)
.setOngoing(true)
.setColor(mContext.getColor(
......@@ -764,6 +762,9 @@ public class Tethering {
} else if (action.equals(Intent.ACTION_CONFIGURATION_CHANGED)) {
mLog.log("OBSERVED configuration changed");
updateConfiguration();
} else if (action.equals(UserManager.ACTION_USER_RESTRICTIONS_CHANGED)) {
mLog.log("OBSERVED user restrictions changed");
handleUserRestrictionAction();
}
}
......@@ -870,25 +871,35 @@ public class Tethering {
}
}
}
private void handleUserRestrictionAction() {
mTetheringRestriction.onUserRestrictionsChanged();
}
}
@VisibleForTesting
protected static class TetheringUserRestrictionListener implements UserRestrictionsListener {
protected static class UserRestrictionActionListener {
private final UserManager mUserManager;
private final Tethering mWrapper;
public boolean mDisallowTethering;
public TetheringUserRestrictionListener(Tethering wrapper) {
public UserRestrictionActionListener(UserManager um, Tethering wrapper) {
mUserManager = um;
mWrapper = wrapper;
mDisallowTethering = false;
}
public void onUserRestrictionsChanged(int userId,
Bundle newRestrictions,
Bundle prevRestrictions) {
public void onUserRestrictionsChanged() {
// getUserRestrictions gets restriction for this process' user, which is the primary
// user. This is fine because DISALLOW_CONFIG_TETHERING can only be set on the primary
// user. See UserManager.DISALLOW_CONFIG_TETHERING.
final Bundle restrictions = mUserManager.getUserRestrictions();
final boolean newlyDisallowed =
newRestrictions.getBoolean(UserManager.DISALLOW_CONFIG_TETHERING);
final boolean previouslyDisallowed =
prevRestrictions.getBoolean(UserManager.DISALLOW_CONFIG_TETHERING);
final boolean tetheringDisallowedChanged = (newlyDisallowed != previouslyDisallowed);
restrictions.getBoolean(UserManager.DISALLOW_CONFIG_TETHERING);
final boolean prevDisallowed = mDisallowTethering;
mDisallowTethering = newlyDisallowed;
final boolean tetheringDisallowedChanged = (newlyDisallowed != prevDisallowed);
if (!tetheringDisallowedChanged) {
return;
}
......
......@@ -166,6 +166,7 @@ public class TetheringTest {
@Mock private RouterAdvertisementDaemon mRouterAdvertisementDaemon;
@Mock private IDhcpServer mDhcpServer;
@Mock private INetd mNetd;
@Mock private UserManager mUserManager;
private final MockIpServerDependencies mIpServerDependencies =
spy(new MockIpServerDependencies());
......@@ -214,6 +215,7 @@ public class TetheringTest {
if (Context.WIFI_SERVICE.equals(name)) return mWifiManager;
if (Context.USB_SERVICE.equals(name)) return mUsbManager;
if (Context.TELEPHONY_SERVICE.equals(name)) return mTelephonyManager;
if (Context.USER_SERVICE.equals(name)) return mUserManager;
return super.getSystemService(name);
}
......@@ -954,26 +956,26 @@ public class TetheringTest {
verifyNoMoreInteractions(mNMService);
}
private void userRestrictionsListenerBehaviour(
private void runUserRestrictionsChange(
boolean currentDisallow, boolean nextDisallow, String[] activeTetheringIfacesList,
int expectedInteractionsWithShowNotification) throws Exception {
final int userId = 0;
final Bundle currRestrictions = new Bundle();
final Bundle newRestrictions = new Bundle();
Tethering tethering = mock(Tethering.class);
Tethering.TetheringUserRestrictionListener turl =
new Tethering.TetheringUserRestrictionListener(tethering);
currRestrictions.putBoolean(UserManager.DISALLOW_CONFIG_TETHERING, currentDisallow);
newRestrictions.putBoolean(UserManager.DISALLOW_CONFIG_TETHERING, nextDisallow);
when(tethering.getTetheredIfaces()).thenReturn(activeTetheringIfacesList);
final Tethering mockTethering = mock(Tethering.class);
when(mockTethering.getTetheredIfaces()).thenReturn(activeTetheringIfacesList);
when(mUserManager.getUserRestrictions()).thenReturn(newRestrictions);
final Tethering.UserRestrictionActionListener ural =
new Tethering.UserRestrictionActionListener(mUserManager, mockTethering);
ural.mDisallowTethering = currentDisallow;
turl.onUserRestrictionsChanged(userId, newRestrictions, currRestrictions);
ural.onUserRestrictionsChanged();
verify(tethering, times(expectedInteractionsWithShowNotification))
verify(mockTethering, times(expectedInteractionsWithShowNotification))
.showTetheredNotification(anyInt(), eq(false));
verify(tethering, times(expectedInteractionsWithShowNotification)).untetherAll();
verify(mockTethering, times(expectedInteractionsWithShowNotification))
.untetherAll();
}
@Test
......@@ -983,7 +985,7 @@ public class TetheringTest {
final boolean nextDisallow = true;
final int expectedInteractionsWithShowNotification = 0;
userRestrictionsListenerBehaviour(currDisallow, nextDisallow, emptyActiveIfacesList,
runUserRestrictionsChange(currDisallow, nextDisallow, emptyActiveIfacesList,
expectedInteractionsWithShowNotification);
}
......@@ -994,7 +996,7 @@ public class TetheringTest {
final boolean nextDisallow = true;
final int expectedInteractionsWithShowNotification = 1;
userRestrictionsListenerBehaviour(currDisallow, nextDisallow, nonEmptyActiveIfacesList,
runUserRestrictionsChange(currDisallow, nextDisallow, nonEmptyActiveIfacesList,
expectedInteractionsWithShowNotification);
}
......@@ -1005,7 +1007,7 @@ public class TetheringTest {
final boolean nextDisallow = false;
final int expectedInteractionsWithShowNotification = 0;
userRestrictionsListenerBehaviour(currDisallow, nextDisallow, nonEmptyActiveIfacesList,
runUserRestrictionsChange(currDisallow, nextDisallow, nonEmptyActiveIfacesList,
expectedInteractionsWithShowNotification);
}
......@@ -1016,7 +1018,7 @@ public class TetheringTest {
final boolean nextDisallow = false;
final int expectedInteractionsWithShowNotification = 0;
userRestrictionsListenerBehaviour(currDisallow, nextDisallow, nonEmptyActiveIfacesList,
runUserRestrictionsChange(currDisallow, nextDisallow, nonEmptyActiveIfacesList,
expectedInteractionsWithShowNotification);
}
......@@ -1027,13 +1029,13 @@ public class TetheringTest {
boolean currDisallow = true;
boolean nextDisallow = true;
userRestrictionsListenerBehaviour(currDisallow, nextDisallow, nonEmptyActiveIfacesList,
runUserRestrictionsChange(currDisallow, nextDisallow, nonEmptyActiveIfacesList,
expectedInteractionsWithShowNotification);
currDisallow = false;
nextDisallow = false;
userRestrictionsListenerBehaviour(currDisallow, nextDisallow, nonEmptyActiveIfacesList,
runUserRestrictionsChange(currDisallow, nextDisallow, nonEmptyActiveIfacesList,
expectedInteractionsWithShowNotification);
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment