Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit eb51bde8 authored by Doris Ling's avatar Doris Ling
Browse files

Add Usb preference to connected devices dashboard.

Add Usb preference and the corresponding controller.

Change-Id: I79e3f20b5c024ece0515f9a6cba1185ba8b8c7be
Fixes: 31800290
Test: make RunSettingsRoboTests
parent e2bd1d9f
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -7057,6 +7057,11 @@
         usb_use_file_transfer, use_use_photo_transfer, and usb_use_MIDI -->
    <string name="usb_use">Use USB to</string>
    <!-- Settings item title for USB preference [CHAR LIMIT=35] -->
    <string name="usb_pref">USB</string>
    <!-- Summary for the USB preference when nothing is connected through the usb port.  [CHAR LIMIT=40] -->
    <string name="usb_nothing_connected">Nothing connected</string>
    <!-- Settings item title for background check prefs [CHAR LIMIT=35] -->
    <string name="background_check_pref">Background check</string>
+20 −11
Original line number Diff line number Diff line
@@ -28,4 +28,13 @@
        android:title="@string/android_beam_settings_title"
        android:order="-4" />

    <Preference
        android:key="usb_mode"
        android:title="@string/usb_pref"
        android:order="-3" >
        <intent android:action="android.intent.action.MAIN"
            android:targetPackage="com.android.settings"
            android:targetClass="com.android.settings.deviceinfo.UsbModeChooserActivity"/>
    </Preference>

</PreferenceScreen>
 No newline at end of file
+6 −1
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.content.Context;
import com.android.settings.R;
import com.android.settings.core.PreferenceController;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.deviceinfo.UsbBackend;
import com.android.settings.nfc.NfcPreferenceController;
import com.android.settingslib.drawer.CategoryKey;

@@ -29,6 +30,7 @@ import java.util.List;
public class ConnectedDeviceDashboardFragment extends DashboardFragment {

    private static final String TAG = "ConnectedDeviceFrag";
    private UsbModePreferenceController mUsbPrefController;

    @Override
    public int getMetricsCategory() {
@@ -52,11 +54,14 @@ public class ConnectedDeviceDashboardFragment extends DashboardFragment {

    @Override
    protected List<PreferenceController> getPreferenceControllers(Context context) {
        final List<PreferenceController> controllers = new ArrayList<>();
        final NfcPreferenceController nfcPreferenceController =
                new NfcPreferenceController(context);
        getLifecycle().addObserver(nfcPreferenceController);
        final List<PreferenceController> controllers = new ArrayList<>();
        controllers.add(nfcPreferenceController);
        mUsbPrefController = new UsbModePreferenceController(context, new UsbBackend(context));
        getLifecycle().addObserver(mUsbPrefController);
        controllers.add(mUsbPrefController);
        return controllers;
    }

+169 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2016 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;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.hardware.usb.UsbManager;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;

import com.android.settings.core.PreferenceController;
import com.android.settings.R;
import com.android.settings.core.lifecycle.LifecycleObserver;
import com.android.settings.core.lifecycle.events.OnPause;
import com.android.settings.core.lifecycle.events.OnResume;
import com.android.settings.deviceinfo.UsbBackend;

public class UsbModePreferenceController extends PreferenceController
        implements LifecycleObserver, OnResume, OnPause {

    private static final String KEY_USB_MODE = "usb_mode";

    private UsbBackend mUsbBackend;
    private UsbConnectionBroadcastReceiver mUsbReceiver;
    private Preference mUsbPreference;

    public UsbModePreferenceController(Context context, UsbBackend usbBackend) {
        super(context);
        mUsbBackend = usbBackend;
        mUsbReceiver = new UsbConnectionBroadcastReceiver();
    }

    @Override
    public void displayPreference(PreferenceScreen screen) {
        super.displayPreference(screen);
        mUsbPreference = screen.findPreference(KEY_USB_MODE);
        updataSummary(mUsbPreference);
    }

    @Override
    public void updateState(Preference preference) {
        updataSummary(preference);
    }

    @Override
    public boolean handlePreferenceTreeClick(Preference preference) {
        return false;
    }

    @Override
    public boolean isAvailable() {
        return true;
    }

    @Override
    public String getPreferenceKey() {
        return KEY_USB_MODE;
    }

    @Override
    public void onPause() {
        mUsbReceiver.unregister();
    }

    @Override
    public void onResume() {
        mUsbReceiver.register();
    }

    public static int getSummary(int mode) {
        switch (mode) {
            case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_NONE:
                return R.string.usb_use_charging_only_desc;
            case UsbBackend.MODE_POWER_SOURCE | UsbBackend.MODE_DATA_NONE:
                return R.string.usb_use_power_only_desc;
            case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_MTP:
                return R.string.usb_use_file_transfers_desc;
            case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_PTP:
                return R.string.usb_use_photo_transfers_desc;
            case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_MIDI:
                return R.string.usb_use_MIDI_desc;
        }
        return 0;
    }

    public static int getTitle(int mode) {
        switch (mode) {
            case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_NONE:
                return R.string.usb_use_charging_only;
            case UsbBackend.MODE_POWER_SOURCE | UsbBackend.MODE_DATA_NONE:
                return R.string.usb_use_power_only;
            case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_MTP:
                return R.string.usb_use_file_transfers;
            case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_PTP:
                return R.string.usb_use_photo_transfers;
            case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_MIDI:
                return R.string.usb_use_MIDI;
        }
        return 0;
    }

    private void updataSummary(Preference preference) {
        updataSummary(preference, mUsbBackend.getCurrentMode());
    }

    private void updataSummary(Preference preference, int mode) {
        if (preference != null) {
            if (mUsbReceiver.isConnected()) {
                preference.setEnabled(true);
                preference.setSummary(getTitle(mode));
            } else {
                preference.setSummary(R.string.usb_nothing_connected);
                preference.setEnabled(false);
            }
        }
    }

    private class UsbConnectionBroadcastReceiver extends BroadcastReceiver {
        private boolean mListeningToUsbEvents;
        private boolean mConnected;

        @Override
        public void onReceive(Context context, Intent intent) {
            boolean connected = intent != null
                    && intent.getExtras().getBoolean(UsbManager.USB_CONNECTED);
            if (connected != mConnected) {
                mConnected = connected;
                updataSummary(mUsbPreference);
            }
        }

        public void register() {
            if (!mListeningToUsbEvents) {
                IntentFilter intentFilter = new IntentFilter(UsbManager.ACTION_USB_STATE);
                Intent intent = mContext.registerReceiver(this, intentFilter);
                mConnected = intent != null
                        && intent.getExtras().getBoolean(UsbManager.USB_CONNECTED);
                mListeningToUsbEvents = true;
            }
        }

        public void unregister() {
            if (mListeningToUsbEvents) {
                mContext.unregisterReceiver(this);
                mListeningToUsbEvents = false;
            }
        }

        public boolean isConnected() {
            return mConnected;
        }
    }

}
+3 −33
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ import android.widget.TextView;

import com.android.settings.R;
import com.android.settingslib.RestrictedLockUtils;
import com.android.settings.connecteddevice.UsbModePreferenceController;

import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;

@@ -135,9 +136,9 @@ public class UsbModeChooserActivity extends Activity {
        View v = mLayoutInflater.inflate(R.layout.restricted_radio_with_summary, container, false);

        TextView titleView = (TextView) v.findViewById(android.R.id.title);
        titleView.setText(getTitle(mode));
        titleView.setText(UsbModePreferenceController.getTitle(mode));
        TextView summaryView = (TextView) v.findViewById(android.R.id.summary);
        summaryView.setText(getSummary(mode));
        summaryView.setText(UsbModePreferenceController.getSummary(mode));

        if (disallowedByAdmin) {
            if (mEnforcedAdmin != null) {
@@ -177,35 +178,4 @@ public class UsbModeChooserActivity extends Activity {
        }
    }

    private static int getSummary(int mode) {
        switch (mode) {
            case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_NONE:
                return R.string.usb_use_charging_only_desc;
            case UsbBackend.MODE_POWER_SOURCE | UsbBackend.MODE_DATA_NONE:
                return R.string.usb_use_power_only_desc;
            case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_MTP:
                return R.string.usb_use_file_transfers_desc;
            case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_PTP:
                return R.string.usb_use_photo_transfers_desc;
            case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_MIDI:
                return R.string.usb_use_MIDI_desc;
        }
        return 0;
    }

    private static int getTitle(int mode) {
        switch (mode) {
            case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_NONE:
                return R.string.usb_use_charging_only;
            case UsbBackend.MODE_POWER_SOURCE | UsbBackend.MODE_DATA_NONE:
                return R.string.usb_use_power_only;
            case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_MTP:
                return R.string.usb_use_file_transfers;
            case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_PTP:
                return R.string.usb_use_photo_transfers;
            case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_MIDI:
                return R.string.usb_use_MIDI;
        }
        return 0;
    }
}
Loading