Merge sc-dev-plus-aosp-without-vendor@7634622

Merged-In: Id2a8c43f9bca79200f837759ce9de0a6eba2a37a
Change-Id: I90fe22409ec7832714c8530f54408db747bdf3c4
This commit is contained in:
Xin Li
2021-08-14 06:30:57 +00:00
2494 changed files with 218431 additions and 77065 deletions

View File

@@ -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();
}
}

View File

@@ -68,6 +68,7 @@ public class AvailableMediaDeviceGroupController extends BasePreferenceControlle
}
mBluetoothDeviceUpdater.registerCallback();
mLocalBluetoothManager.getEventManager().registerCallback(this);
mBluetoothDeviceUpdater.refreshPreference();
}
@Override

View File

@@ -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);

View File

@@ -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;

View File

@@ -61,6 +61,7 @@ public class ConnectedDeviceGroupController extends BasePreferenceController
mBluetoothDeviceUpdater.registerCallback();
mConnectedUsbDeviceUpdater.registerCallback();
mConnectedDockUpdater.registerCallback();
mBluetoothDeviceUpdater.refreshPreference();
}
@Override

View File

@@ -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;

View File

@@ -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);

View File

@@ -63,6 +63,7 @@ public class SavedDeviceGroupController extends BasePreferenceController
public void onStart() {
mBluetoothDeviceUpdater.registerCallback();
mSavedDockUpdater.registerCallback();
mBluetoothDeviceUpdater.refreshPreference();
}
@Override

View File

@@ -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));
}
}

View File

@@ -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.

View File

@@ -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();
}

View File

@@ -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();

View File

@@ -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);
}
}
}
}

View File

@@ -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(

View File

@@ -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);
}
}

View File

@@ -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);
}
}