Merge sc-dev-plus-aosp-without-vendor@7634622
Merged-In: Id2a8c43f9bca79200f837759ce9de0a6eba2a37a Change-Id: I90fe22409ec7832714c8530f54408db747bdf3c4
This commit is contained in:
@@ -33,7 +33,8 @@ import com.android.settingslib.core.lifecycle.events.OnStop;
|
||||
|
||||
/**
|
||||
* Controller to maintain the {@link androidx.preference.Preference} for add
|
||||
* device. It monitor Bluetooth's status(on/off) and decide if need to show summary or not.
|
||||
* device. It monitor Bluetooth's status(on/off) and decide if need
|
||||
* to show summary or not.
|
||||
*/
|
||||
public class AddDevicePreferenceController extends BasePreferenceController
|
||||
implements LifecycleObserver, OnStart, OnStop {
|
||||
@@ -42,7 +43,7 @@ public class AddDevicePreferenceController extends BasePreferenceController
|
||||
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
updateState();
|
||||
updateState(mPreference);
|
||||
}
|
||||
};
|
||||
private IntentFilter mIntentFilter;
|
||||
@@ -69,6 +70,7 @@ public class AddDevicePreferenceController extends BasePreferenceController
|
||||
super.displayPreference(screen);
|
||||
if (isAvailable()) {
|
||||
mPreference = screen.findPreference(getPreferenceKey());
|
||||
updateState(mPreference);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,12 +83,12 @@ public class AddDevicePreferenceController extends BasePreferenceController
|
||||
|
||||
@Override
|
||||
public CharSequence getSummary() {
|
||||
return mBluetoothAdapter != null && mBluetoothAdapter.isEnabled()
|
||||
return isBluetoothEnabled()
|
||||
? ""
|
||||
: mContext.getString(R.string.connected_device_add_device_summary);
|
||||
}
|
||||
|
||||
void updateState() {
|
||||
updateState(mPreference);
|
||||
protected boolean isBluetoothEnabled() {
|
||||
return mBluetoothAdapter != null && mBluetoothAdapter.isEnabled();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -68,6 +68,7 @@ public class AvailableMediaDeviceGroupController extends BasePreferenceControlle
|
||||
}
|
||||
mBluetoothDeviceUpdater.registerCallback();
|
||||
mLocalBluetoothManager.getEventManager().registerCallback(this);
|
||||
mBluetoothDeviceUpdater.refreshPreference();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -25,8 +25,8 @@ import com.android.settings.bluetooth.BluetoothDeviceRenamePreferenceController;
|
||||
import com.android.settings.bluetooth.BluetoothSwitchPreferenceController;
|
||||
import com.android.settings.dashboard.DashboardFragment;
|
||||
import com.android.settings.search.BaseSearchIndexProvider;
|
||||
import com.android.settings.widget.SwitchBar;
|
||||
import com.android.settings.widget.SwitchBarController;
|
||||
import com.android.settings.widget.MainSwitchBarController;
|
||||
import com.android.settings.widget.SettingsMainSwitchBar;
|
||||
import com.android.settingslib.core.lifecycle.Lifecycle;
|
||||
import com.android.settingslib.search.SearchIndexable;
|
||||
import com.android.settingslib.widget.FooterPreference;
|
||||
@@ -42,7 +42,7 @@ public class BluetoothDashboardFragment extends DashboardFragment {
|
||||
private static final String KEY_BLUETOOTH_SCREEN_FOOTER = "bluetooth_screen_footer";
|
||||
|
||||
private FooterPreference mFooterPreference;
|
||||
private SwitchBar mSwitchBar;
|
||||
private SettingsMainSwitchBar mSwitchBar;
|
||||
private BluetoothSwitchPreferenceController mController;
|
||||
|
||||
@Override
|
||||
@@ -83,8 +83,9 @@ public class BluetoothDashboardFragment extends DashboardFragment {
|
||||
|
||||
SettingsActivity activity = (SettingsActivity) getActivity();
|
||||
mSwitchBar = activity.getSwitchBar();
|
||||
mSwitchBar.setTitle(getContext().getString(R.string.bluetooth_main_switch_title));
|
||||
mController = new BluetoothSwitchPreferenceController(activity,
|
||||
new SwitchBarController(mSwitchBar), mFooterPreference);
|
||||
new MainSwitchBarController(mSwitchBar), mFooterPreference);
|
||||
Lifecycle lifecycle = getSettingsLifecycle();
|
||||
if (lifecycle != null) {
|
||||
lifecycle.addObserver(mController);
|
||||
|
||||
@@ -49,11 +49,6 @@ public class ConnectedDeviceDashboardFragment extends DashboardFragment {
|
||||
return TAG;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isParalleledControllers() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getHelpResource() {
|
||||
return R.string.help_url_connected_devices;
|
||||
|
||||
@@ -61,6 +61,7 @@ public class ConnectedDeviceGroupController extends BasePreferenceController
|
||||
mBluetoothDeviceUpdater.registerCallback();
|
||||
mConnectedUsbDeviceUpdater.registerCallback();
|
||||
mConnectedDockUpdater.registerCallback();
|
||||
mBluetoothDeviceUpdater.refreshPreference();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -54,9 +54,9 @@ public class NfcAndPaymentFragmentController extends BasePreferenceController {
|
||||
public CharSequence getSummary() {
|
||||
if (mNfcAdapter != null) {
|
||||
if (mNfcAdapter.isEnabled()) {
|
||||
return mContext.getText(R.string.switch_on_text);
|
||||
return mContext.getText(R.string.nfc_setting_on);
|
||||
} else {
|
||||
return mContext.getText(R.string.switch_off_text);
|
||||
return mContext.getText(R.string.nfc_setting_off);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
|
||||
@@ -103,6 +103,7 @@ public class PreviouslyConnectedDevicePreferenceController extends BasePreferenc
|
||||
final Context context = screen.getContext();
|
||||
mBluetoothDeviceUpdater.setPrefContext(context);
|
||||
mSavedDockUpdater.setPreferenceContext(context);
|
||||
mBluetoothDeviceUpdater.forceUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -111,6 +112,7 @@ public class PreviouslyConnectedDevicePreferenceController extends BasePreferenc
|
||||
mBluetoothDeviceUpdater.registerCallback();
|
||||
mSavedDockUpdater.registerCallback();
|
||||
mContext.registerReceiver(mReceiver, mIntentFilter);
|
||||
mBluetoothDeviceUpdater.refreshPreference();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -144,7 +146,7 @@ public class PreviouslyConnectedDevicePreferenceController extends BasePreferenc
|
||||
|
||||
private void addPreference(int index, Preference preference) {
|
||||
if (preference instanceof BluetoothDevicePreference) {
|
||||
if (mDevicesList.size() >= index) {
|
||||
if (index >= 0 && mDevicesList.size() >= index) {
|
||||
mDevicesList.add(index, preference);
|
||||
} else {
|
||||
mDevicesList.add(preference);
|
||||
|
||||
@@ -63,6 +63,7 @@ public class SavedDeviceGroupController extends BasePreferenceController
|
||||
public void onStart() {
|
||||
mBluetoothDeviceUpdater.registerCallback();
|
||||
mSavedDockUpdater.registerCallback();
|
||||
mBluetoothDeviceUpdater.refreshPreference();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -33,10 +33,4 @@ public class TopLevelConnectedDevicesPreferenceController extends BasePreference
|
||||
return mContext.getResources().getBoolean(R.bool.config_show_top_level_connected_devices)
|
||||
? AVAILABLE : UNSUPPORTED_ON_DEVICE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CharSequence getSummary() {
|
||||
return mContext.getText(
|
||||
AdvancedConnectedDeviceController.getConnectedDevicesSummaryResourceId(mContext));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,8 +19,11 @@ import static android.hardware.usb.UsbPortStatus.DATA_ROLE_DEVICE;
|
||||
import static android.hardware.usb.UsbPortStatus.POWER_ROLE_SINK;
|
||||
import static android.hardware.usb.UsbPortStatus.POWER_ROLE_SOURCE;
|
||||
|
||||
import static com.android.settingslib.RestrictedLockUtilsInternal.checkIfUsbDataSignalingIsDisabled;
|
||||
|
||||
import android.content.Context;
|
||||
import android.hardware.usb.UsbManager;
|
||||
import android.os.UserHandle;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
import androidx.preference.Preference;
|
||||
@@ -30,6 +33,7 @@ import com.android.settings.connecteddevice.DevicePreferenceCallback;
|
||||
import com.android.settings.core.SubSettingLauncher;
|
||||
import com.android.settings.dashboard.DashboardFragment;
|
||||
import com.android.settings.overlay.FeatureFactory;
|
||||
import com.android.settingslib.RestrictedPreference;
|
||||
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
||||
|
||||
/**
|
||||
@@ -45,7 +49,7 @@ public class ConnectedUsbDeviceUpdater {
|
||||
private UsbBackend mUsbBackend;
|
||||
private DevicePreferenceCallback mDevicePreferenceCallback;
|
||||
@VisibleForTesting
|
||||
Preference mUsbPreference;
|
||||
RestrictedPreference mUsbPreference;
|
||||
@VisibleForTesting
|
||||
UsbConnectionBroadcastReceiver mUsbReceiver;
|
||||
|
||||
@@ -88,10 +92,12 @@ public class ConnectedUsbDeviceUpdater {
|
||||
}
|
||||
|
||||
public void initUsbPreference(Context context) {
|
||||
mUsbPreference = new Preference(context, null /* AttributeSet */);
|
||||
mUsbPreference = new RestrictedPreference(context, null /* AttributeSet */);
|
||||
mUsbPreference.setTitle(R.string.usb_pref);
|
||||
mUsbPreference.setIcon(R.drawable.ic_usb);
|
||||
mUsbPreference.setKey(PREF_KEY);
|
||||
mUsbPreference.setDisabledByAdmin(
|
||||
checkIfUsbDataSignalingIsDisabled(context, UserHandle.myUserId()));
|
||||
mUsbPreference.setOnPreferenceClickListener((Preference p) -> {
|
||||
mMetricsFeatureProvider.logClickedPreference(p, mFragment.getMetricsCategory());
|
||||
// New version - uses a separate screen.
|
||||
|
||||
@@ -28,7 +28,7 @@ import android.content.pm.PackageManager;
|
||||
import android.hardware.usb.UsbManager;
|
||||
import android.hardware.usb.UsbPort;
|
||||
import android.hardware.usb.UsbPortStatus;
|
||||
import android.net.ConnectivityManager;
|
||||
import android.net.TetheringManager;
|
||||
import android.os.UserHandle;
|
||||
import android.os.UserManager;
|
||||
|
||||
@@ -74,9 +74,8 @@ public class UsbBackend {
|
||||
mIsAdminUser = userManager.isAdminUser();
|
||||
|
||||
mMidiSupported = context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_MIDI);
|
||||
ConnectivityManager cm =
|
||||
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||
mTetheringSupported = cm.isTetheringSupported();
|
||||
final TetheringManager tm = context.getSystemService(TetheringManager.class);
|
||||
mTetheringSupported = tm.isTetheringSupported();
|
||||
|
||||
updatePorts();
|
||||
}
|
||||
|
||||
@@ -75,6 +75,9 @@ public class UsbConnectionBroadcastReceiver extends BroadcastReceiver implements
|
||||
if (intent.getExtras().getBoolean(UsbManager.USB_FUNCTION_ACCESSORY)) {
|
||||
functions |= UsbManager.FUNCTION_ACCESSORY;
|
||||
}
|
||||
if (intent.getExtras().getBoolean(UsbManager.USB_FUNCTION_NCM)) {
|
||||
functions |= UsbManager.FUNCTION_NCM;
|
||||
}
|
||||
mFunctions = functions;
|
||||
mDataRole = mUsbBackend.getDataRole();
|
||||
mPowerRole = mUsbBackend.getPowerRole();
|
||||
|
||||
@@ -16,14 +16,17 @@
|
||||
|
||||
package com.android.settings.connecteddevice.usb;
|
||||
|
||||
import static android.net.ConnectivityManager.TETHERING_USB;
|
||||
import static android.net.TetheringManager.TETHERING_USB;
|
||||
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.content.Context;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.hardware.usb.UsbManager;
|
||||
import android.net.ConnectivityManager;
|
||||
import android.net.TetheringManager;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.HandlerExecutor;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
@@ -43,10 +46,13 @@ import java.util.List;
|
||||
* Provides options for selecting the default USB mode.
|
||||
*/
|
||||
public class UsbDefaultFragment extends RadioButtonPickerFragment {
|
||||
|
||||
private static final String TAG = "UsbDefaultFragment";
|
||||
|
||||
@VisibleForTesting
|
||||
UsbBackend mUsbBackend;
|
||||
@VisibleForTesting
|
||||
ConnectivityManager mConnectivityManager;
|
||||
TetheringManager mTetheringManager;
|
||||
@VisibleForTesting
|
||||
OnStartTetheringCallback mOnStartTetheringCallback = new OnStartTetheringCallback();
|
||||
@VisibleForTesting
|
||||
@@ -55,25 +61,43 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment {
|
||||
long mCurrentFunctions;
|
||||
@VisibleForTesting
|
||||
boolean mIsStartTethering = false;
|
||||
@VisibleForTesting
|
||||
Handler mHandler;
|
||||
|
||||
private UsbConnectionBroadcastReceiver mUsbReceiver;
|
||||
private boolean mIsConnected = false;
|
||||
|
||||
@VisibleForTesting
|
||||
UsbConnectionBroadcastReceiver.UsbConnectionListener mUsbConnectionListener =
|
||||
(connected, functions, powerRole, dataRole) -> {
|
||||
if (mIsStartTethering) {
|
||||
final long defaultFunctions = mUsbBackend.getDefaultUsbFunctions();
|
||||
Log.d(TAG, "UsbConnectionListener() connected : " + connected + ", functions : "
|
||||
+ functions + ", defaultFunctions : " + defaultFunctions
|
||||
+ ", mIsStartTethering : " + mIsStartTethering);
|
||||
if (connected && !mIsConnected && (defaultFunctions == UsbManager.FUNCTION_RNDIS
|
||||
|| defaultFunctions == UsbManager.FUNCTION_NCM)
|
||||
&& !mIsStartTethering) {
|
||||
mCurrentFunctions = defaultFunctions;
|
||||
startTethering();
|
||||
}
|
||||
|
||||
if (mIsStartTethering && connected) {
|
||||
mCurrentFunctions = functions;
|
||||
refresh(functions);
|
||||
mUsbBackend.setDefaultUsbFunctions(functions);
|
||||
mIsStartTethering = false;
|
||||
}
|
||||
mIsConnected = connected;
|
||||
};
|
||||
|
||||
@Override
|
||||
public void onAttach(Context context) {
|
||||
super.onAttach(context);
|
||||
mUsbBackend = new UsbBackend(context);
|
||||
mConnectivityManager = context.getSystemService(ConnectivityManager.class);
|
||||
mTetheringManager = context.getSystemService(TetheringManager.class);
|
||||
mUsbReceiver = new UsbConnectionBroadcastReceiver(context, mUsbConnectionListener,
|
||||
mUsbBackend);
|
||||
mHandler = new Handler(context.getMainLooper());
|
||||
getSettingsLifecycle().addObserver(mUsbReceiver);
|
||||
mCurrentFunctions = mUsbBackend.getDefaultUsbFunctions();
|
||||
}
|
||||
@@ -128,7 +152,11 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment {
|
||||
|
||||
@Override
|
||||
protected String getDefaultKey() {
|
||||
return UsbBackend.usbFunctionsToString(mUsbBackend.getDefaultUsbFunctions());
|
||||
long defaultUsbFunctions = mUsbBackend.getDefaultUsbFunctions();
|
||||
// Because we didn't have an option for NCM, so make FUNCTION_NCM corresponding to
|
||||
// FUNCTION_RNDIS for initializing the UI.
|
||||
return UsbBackend.usbFunctionsToString(defaultUsbFunctions == UsbManager.FUNCTION_NCM
|
||||
? UsbManager.FUNCTION_RNDIS : defaultUsbFunctions);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -136,12 +164,11 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment {
|
||||
long functions = UsbBackend.usbFunctionsFromString(key);
|
||||
mPreviousFunctions = mUsbBackend.getCurrentFunctions();
|
||||
if (!Utils.isMonkeyRunning()) {
|
||||
if (functions == UsbManager.FUNCTION_RNDIS) {
|
||||
if (functions == UsbManager.FUNCTION_RNDIS || functions == UsbManager.FUNCTION_NCM) {
|
||||
// We need to have entitlement check for usb tethering, so use API in
|
||||
// ConnectivityManager.
|
||||
mIsStartTethering = true;
|
||||
mConnectivityManager.startTethering(TETHERING_USB, true /* showProvisioningUi */,
|
||||
mOnStartTetheringCallback);
|
||||
// TetheringManager.
|
||||
mCurrentFunctions = functions;
|
||||
startTethering();
|
||||
} else {
|
||||
mIsStartTethering = false;
|
||||
mCurrentFunctions = functions;
|
||||
@@ -152,6 +179,13 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment {
|
||||
return true;
|
||||
}
|
||||
|
||||
private void startTethering() {
|
||||
Log.d(TAG, "startTethering()");
|
||||
mIsStartTethering = true;
|
||||
mTetheringManager.startTethering(TETHERING_USB, new HandlerExecutor(mHandler),
|
||||
mOnStartTetheringCallback);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPause() {
|
||||
super.onPause();
|
||||
@@ -159,20 +193,19 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment {
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
final class OnStartTetheringCallback extends
|
||||
ConnectivityManager.OnStartTetheringCallback {
|
||||
final class OnStartTetheringCallback implements
|
||||
TetheringManager.StartTetheringCallback {
|
||||
|
||||
@Override
|
||||
public void onTetheringStarted() {
|
||||
super.onTetheringStarted();
|
||||
Log.d(TAG, "onTetheringStarted()");
|
||||
// Set default usb functions again to make internal data persistent
|
||||
mCurrentFunctions = UsbManager.FUNCTION_RNDIS;
|
||||
mUsbBackend.setDefaultUsbFunctions(UsbManager.FUNCTION_RNDIS);
|
||||
mUsbBackend.setDefaultUsbFunctions(mCurrentFunctions);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTetheringFailed() {
|
||||
super.onTetheringFailed();
|
||||
public void onTetheringFailed(int error) {
|
||||
Log.w(TAG, "onTetheringFailed() error : " + error);
|
||||
mUsbBackend.setDefaultUsbFunctions(mPreviousFunctions);
|
||||
updateCandidates();
|
||||
}
|
||||
@@ -187,7 +220,11 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment {
|
||||
final boolean isSupported = mUsbBackend.areFunctionsSupported(option);
|
||||
pref.setEnabled(isSupported);
|
||||
if (isSupported) {
|
||||
pref.setChecked(functions == option);
|
||||
if (functions == UsbManager.FUNCTION_NCM) {
|
||||
pref.setChecked(UsbManager.FUNCTION_RNDIS == option);
|
||||
} else {
|
||||
pref.setChecked(functions == option);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,9 +16,12 @@
|
||||
|
||||
package com.android.settings.connecteddevice.usb;
|
||||
|
||||
import static com.android.settingslib.RestrictedLockUtilsInternal.checkIfUsbDataSignalingIsDisabled;
|
||||
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.os.UserHandle;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
@@ -92,6 +95,7 @@ public class UsbDetailsFragment extends DashboardFragment {
|
||||
ret.add(new UsbDetailsDataRoleController(context, fragment, usbBackend));
|
||||
ret.add(new UsbDetailsFunctionsController(context, fragment, usbBackend));
|
||||
ret.add(new UsbDetailsPowerRoleController(context, fragment, usbBackend));
|
||||
ret.add(new UsbDetailsTranscodeMtpController(context, fragment, usbBackend));
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -100,6 +104,11 @@ public class UsbDetailsFragment extends DashboardFragment {
|
||||
*/
|
||||
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
|
||||
new BaseSearchIndexProvider(R.xml.usb_details_fragment) {
|
||||
@Override
|
||||
protected boolean isPageSearchEnabled(Context context) {
|
||||
return checkIfUsbDataSignalingIsDisabled(
|
||||
context, UserHandle.myUserId()) == null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<AbstractPreferenceController> createPreferenceControllers(
|
||||
|
||||
@@ -17,11 +17,12 @@
|
||||
package com.android.settings.connecteddevice.usb;
|
||||
|
||||
import static android.hardware.usb.UsbPortStatus.DATA_ROLE_DEVICE;
|
||||
import static android.net.ConnectivityManager.TETHERING_USB;
|
||||
|
||||
import android.content.Context;
|
||||
import android.hardware.usb.UsbManager;
|
||||
import android.net.ConnectivityManager;
|
||||
import android.net.TetheringManager;
|
||||
import android.os.Handler;
|
||||
import android.os.HandlerExecutor;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
@@ -55,7 +56,8 @@ public class UsbDetailsFunctionsController extends UsbDetailsController
|
||||
}
|
||||
|
||||
private PreferenceCategory mProfilesContainer;
|
||||
private ConnectivityManager mConnectivityManager;
|
||||
private TetheringManager mTetheringManager;
|
||||
private Handler mHandler;
|
||||
@VisibleForTesting
|
||||
OnStartTetheringCallback mOnStartTetheringCallback;
|
||||
@VisibleForTesting
|
||||
@@ -64,15 +66,18 @@ public class UsbDetailsFunctionsController extends UsbDetailsController
|
||||
public UsbDetailsFunctionsController(Context context, UsbDetailsFragment fragment,
|
||||
UsbBackend backend) {
|
||||
super(context, fragment, backend);
|
||||
mConnectivityManager = context.getSystemService(ConnectivityManager.class);
|
||||
mTetheringManager = context.getSystemService(TetheringManager.class);
|
||||
mOnStartTetheringCallback = new OnStartTetheringCallback();
|
||||
mPreviousFunction = mUsbBackend.getCurrentFunctions();
|
||||
mHandler = new Handler(context.getMainLooper());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void displayPreference(PreferenceScreen screen) {
|
||||
super.displayPreference(screen);
|
||||
mProfilesContainer = screen.findPreference(getPreferenceKey());
|
||||
refresh(/* connected */ false, /* functions */ mUsbBackend.getDefaultUsbFunctions(),
|
||||
/* powerRole */ 0, /* dataRole */ 0);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -84,6 +89,7 @@ public class UsbDetailsFunctionsController extends UsbDetailsController
|
||||
pref = new RadioButtonPreference(mProfilesContainer.getContext());
|
||||
pref.setKey(key);
|
||||
pref.setTitle(titleId);
|
||||
pref.setSingleLineTitle(false);
|
||||
pref.setOnClickListener(this);
|
||||
mProfilesContainer.addPreference(pref);
|
||||
}
|
||||
@@ -110,6 +116,8 @@ public class UsbDetailsFunctionsController extends UsbDetailsController
|
||||
if (mUsbBackend.areFunctionsSupported(option)) {
|
||||
if (isAccessoryMode(functions)) {
|
||||
pref.setChecked(UsbManager.FUNCTION_MTP == option);
|
||||
} else if (functions == UsbManager.FUNCTION_NCM) {
|
||||
pref.setChecked(UsbManager.FUNCTION_RNDIS == option);
|
||||
} else {
|
||||
pref.setChecked(functions == option);
|
||||
}
|
||||
@@ -130,7 +138,7 @@ public class UsbDetailsFunctionsController extends UsbDetailsController
|
||||
+ UsbManager.usbFunctionsToString(previousFunction));
|
||||
}
|
||||
if (function != previousFunction && !Utils.isMonkeyRunning()
|
||||
&& !shouldIgnoreClickEvent(function, previousFunction)) {
|
||||
&& !isClickEventIgnored(function, previousFunction)) {
|
||||
mPreviousFunction = previousFunction;
|
||||
|
||||
//Update the UI in advance to make it looks smooth
|
||||
@@ -142,10 +150,11 @@ public class UsbDetailsFunctionsController extends UsbDetailsController
|
||||
preference.setChecked(true);
|
||||
}
|
||||
|
||||
if (function == UsbManager.FUNCTION_RNDIS) {
|
||||
if (function == UsbManager.FUNCTION_RNDIS || function == UsbManager.FUNCTION_NCM) {
|
||||
// We need to have entitlement check for usb tethering, so use API in
|
||||
// ConnectivityManager.
|
||||
mConnectivityManager.startTethering(TETHERING_USB, true /* showProvisioningUi */,
|
||||
// TetheringManager.
|
||||
mTetheringManager.startTethering(
|
||||
TetheringManager.TETHERING_USB, new HandlerExecutor(mHandler),
|
||||
mOnStartTetheringCallback);
|
||||
} else {
|
||||
mUsbBackend.setCurrentFunctions(function);
|
||||
@@ -153,7 +162,7 @@ public class UsbDetailsFunctionsController extends UsbDetailsController
|
||||
}
|
||||
}
|
||||
|
||||
private boolean shouldIgnoreClickEvent(long function, long previousFunction) {
|
||||
private boolean isClickEventIgnored(long function, long previousFunction) {
|
||||
return isAccessoryMode(previousFunction) && function == UsbManager.FUNCTION_MTP;
|
||||
}
|
||||
|
||||
@@ -172,12 +181,11 @@ public class UsbDetailsFunctionsController extends UsbDetailsController
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
final class OnStartTetheringCallback extends
|
||||
ConnectivityManager.OnStartTetheringCallback {
|
||||
final class OnStartTetheringCallback implements TetheringManager.StartTetheringCallback {
|
||||
|
||||
@Override
|
||||
public void onTetheringFailed() {
|
||||
super.onTetheringFailed();
|
||||
public void onTetheringFailed(int error) {
|
||||
Log.w(TAG, "onTetheringFailed() error : " + error);
|
||||
mUsbBackend.setCurrentFunctions(mPreviousFunction);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,97 @@
|
||||
/*
|
||||
* Copyright (C) 2021 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.settings.connecteddevice.usb;
|
||||
|
||||
import static android.hardware.usb.UsbPortStatus.DATA_ROLE_DEVICE;
|
||||
|
||||
import android.content.Context;
|
||||
import android.hardware.usb.UsbManager;
|
||||
import android.os.SystemProperties;
|
||||
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceCategory;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
import androidx.preference.SwitchPreference;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.Utils;
|
||||
|
||||
/**
|
||||
* This class controls the switch for setting if we should transcode files transferred via MTP over
|
||||
* USB.
|
||||
*/
|
||||
public class UsbDetailsTranscodeMtpController extends UsbDetailsController
|
||||
implements Preference.OnPreferenceClickListener {
|
||||
private static final String TRANSCODE_MTP_SYS_PROP_KEY = "sys.fuse.transcode_mtp";
|
||||
private static final String PREFERENCE_KEY = "usb_transcode_mtp";
|
||||
|
||||
private PreferenceCategory mPreferenceCategory;
|
||||
private SwitchPreference mSwitchPreference;
|
||||
|
||||
public UsbDetailsTranscodeMtpController(Context context, UsbDetailsFragment fragment,
|
||||
UsbBackend backend) {
|
||||
super(context, fragment, backend);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void displayPreference(PreferenceScreen screen) {
|
||||
super.displayPreference(screen);
|
||||
mPreferenceCategory = screen.findPreference(getPreferenceKey());
|
||||
mSwitchPreference = new SwitchPreference(mPreferenceCategory.getContext());
|
||||
mSwitchPreference.setTitle(R.string.usb_transcode_files);
|
||||
mSwitchPreference.setOnPreferenceClickListener(this);
|
||||
mSwitchPreference.setSummaryOn(R.string.usb_transcode_files_summary);
|
||||
mPreferenceCategory.addPreference(mSwitchPreference);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void refresh(boolean connected, long functions, int powerRole, int dataRole) {
|
||||
if (mUsbBackend.areFunctionsSupported(UsbManager.FUNCTION_MTP | UsbManager.FUNCTION_PTP)) {
|
||||
mFragment.getPreferenceScreen().addPreference(mPreferenceCategory);
|
||||
} else {
|
||||
mFragment.getPreferenceScreen().removePreference(mPreferenceCategory);
|
||||
}
|
||||
|
||||
mSwitchPreference.setChecked(
|
||||
SystemProperties.getBoolean(TRANSCODE_MTP_SYS_PROP_KEY, false));
|
||||
mPreferenceCategory.setEnabled(
|
||||
connected && isDeviceInFileTransferMode(functions, dataRole));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onPreferenceClick(Preference preference) {
|
||||
SystemProperties.set(TRANSCODE_MTP_SYS_PROP_KEY,
|
||||
Boolean.toString(mSwitchPreference.isChecked()));
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAvailable() {
|
||||
return !Utils.isMonkeyRunning();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPreferenceKey() {
|
||||
return PREFERENCE_KEY;
|
||||
}
|
||||
|
||||
private static boolean isDeviceInFileTransferMode(long functions, int dataRole) {
|
||||
return dataRole == DATA_ROLE_DEVICE && ((functions & UsbManager.FUNCTION_MTP) != 0
|
||||
|| (functions & UsbManager.FUNCTION_PTP) != 0);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user