17000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich/*
27000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich * Copyright (C) 2015 The Android Open Source Project
37000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich *
47000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich * Licensed under the Apache License, Version 2.0 (the "License");
57000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich * you may not use this file except in compliance with the License.
67000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich * You may obtain a copy of the License at
77000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich *
87000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich *      http://www.apache.org/licenses/LICENSE-2.0
97000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich *
107000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich * Unless required by applicable law or agreed to in writing, software
117000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich * distributed under the License is distributed on an "AS IS" BASIS,
127000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich * See the License for the specific language governing permissions and
147000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich * limitations under the License.
157000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich */
167000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich
177000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevichpackage com.android.settings.deviceinfo;
187000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich
197000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevichimport android.annotation.Nullable;
207000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevichimport android.app.Activity;
2172aa5379806759fbf8f8402500b69f34eccb1956Guang Zhuimport android.app.ActivityManager;
227000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevichimport android.app.AlertDialog;
2393df36a1c7ae91c304e7d7eb55462b84705a49b3Du, Changbinimport android.content.BroadcastReceiver;
2493df36a1c7ae91c304e7d7eb55462b84705a49b3Du, Changbinimport android.content.Context;
257000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevichimport android.content.DialogInterface;
2693df36a1c7ae91c304e7d7eb55462b84705a49b3Du, Changbinimport android.content.Intent;
2793df36a1c7ae91c304e7d7eb55462b84705a49b3Du, Changbinimport android.content.IntentFilter;
281c3fd76ee08e63d5a12387e21a59f89c431fc17aSudheer Shankaimport android.graphics.drawable.Drawable;
291c3fd76ee08e63d5a12387e21a59f89c431fc17aSudheer Shankaimport android.graphics.PorterDuff;
3093df36a1c7ae91c304e7d7eb55462b84705a49b3Du, Changbinimport android.hardware.usb.UsbManager;
317000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevichimport android.os.Bundle;
321c3fd76ee08e63d5a12387e21a59f89c431fc17aSudheer Shankaimport android.os.UserHandle;
331c3fd76ee08e63d5a12387e21a59f89c431fc17aSudheer Shankaimport android.os.UserManager;
343ff3b81827ff647706d6ac8c925a33fedccebd93Doris Lingimport android.support.annotation.VisibleForTesting;
3583290eef8cfeebc9736f077d78003d78e6bf1320Jason Monkimport android.view.LayoutInflater;
3683290eef8cfeebc9736f077d78003d78e6bf1320Jason Monkimport android.view.View;
3783290eef8cfeebc9736f077d78003d78e6bf1320Jason Monkimport android.view.View.OnClickListener;
3883290eef8cfeebc9736f077d78003d78e6bf1320Jason Monkimport android.widget.Checkable;
3983290eef8cfeebc9736f077d78003d78e6bf1320Jason Monkimport android.widget.LinearLayout;
4083290eef8cfeebc9736f077d78003d78e6bf1320Jason Monkimport android.widget.TextView;
4172aa5379806759fbf8f8402500b69f34eccb1956Guang Zhu
427000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevichimport com.android.settings.R;
431c3fd76ee08e63d5a12387e21a59f89c431fc17aSudheer Shankaimport com.android.settingslib.RestrictedLockUtils;
441c3fd76ee08e63d5a12387e21a59f89c431fc17aSudheer Shanka
451c3fd76ee08e63d5a12387e21a59f89c431fc17aSudheer Shankaimport static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
467000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich
477000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich/**
487000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich * UI for the USB chooser dialog.
497000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich *
507000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich */
517000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevichpublic class UsbModeChooserActivity extends Activity {
527000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich
5383290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk    public static final int[] DEFAULT_MODES = {
5483290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk        UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_NONE,
5583290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk        UsbBackend.MODE_POWER_SOURCE | UsbBackend.MODE_DATA_NONE,
5683290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk        UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_MTP,
5783290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk        UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_PTP,
5883290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk        UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_MIDI
5983290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk    };
6083290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk
6183290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk    private UsbBackend mBackend;
6283290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk    private AlertDialog mDialog;
6383290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk    private LayoutInflater mLayoutInflater;
641c3fd76ee08e63d5a12387e21a59f89c431fc17aSudheer Shanka    private EnforcedAdmin mEnforcedAdmin;
657000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich
6693df36a1c7ae91c304e7d7eb55462b84705a49b3Du, Changbin    private BroadcastReceiver mDisconnectedReceiver = new BroadcastReceiver() {
6793df36a1c7ae91c304e7d7eb55462b84705a49b3Du, Changbin        @Override
6893df36a1c7ae91c304e7d7eb55462b84705a49b3Du, Changbin        public void onReceive(Context context, Intent intent) {
6993df36a1c7ae91c304e7d7eb55462b84705a49b3Du, Changbin            String action = intent.getAction();
7093df36a1c7ae91c304e7d7eb55462b84705a49b3Du, Changbin            if (UsbManager.ACTION_USB_STATE.equals(action)) {
7193df36a1c7ae91c304e7d7eb55462b84705a49b3Du, Changbin                boolean connected = intent.getBooleanExtra(UsbManager.USB_CONNECTED, false);
720f6796284b869f7f2863b22f686191539f2c5e02Daichi Hirono                boolean hostConnected =
730f6796284b869f7f2863b22f686191539f2c5e02Daichi Hirono                        intent.getBooleanExtra(UsbManager.USB_HOST_CONNECTED, false);
740f6796284b869f7f2863b22f686191539f2c5e02Daichi Hirono                if (!connected && !hostConnected) {
7593df36a1c7ae91c304e7d7eb55462b84705a49b3Du, Changbin                    mDialog.dismiss();
7693df36a1c7ae91c304e7d7eb55462b84705a49b3Du, Changbin                }
7793df36a1c7ae91c304e7d7eb55462b84705a49b3Du, Changbin            }
7893df36a1c7ae91c304e7d7eb55462b84705a49b3Du, Changbin        }
7993df36a1c7ae91c304e7d7eb55462b84705a49b3Du, Changbin    };
8093df36a1c7ae91c304e7d7eb55462b84705a49b3Du, Changbin
817000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich    @Override
827000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich    protected void onCreate(@Nullable Bundle savedInstanceState) {
838a9b03f746233fa00d4e32f018acac919c824f6fNick Kralevich
847000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich        super.onCreate(savedInstanceState);
85ec323a0849155302b3b522fe34a2638be74af420Zoltan Szatmary-Ban
8683290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk        mLayoutInflater = LayoutInflater.from(this);
8783290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk
8883290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk        mDialog = new AlertDialog.Builder(this)
8983290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk                .setTitle(R.string.usb_use)
9083290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk                .setView(R.layout.usb_dialog_container)
9183290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk                .setOnDismissListener(new DialogInterface.OnDismissListener() {
9283290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk                    @Override
9383290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk                    public void onDismiss(DialogInterface dialog) {
9483290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk                        finish();
9583290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk                    }
9683290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk                })
9783290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk                .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
987000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich                    @Override
997000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich                    public void onClick(DialogInterface dialog, int which) {
10083290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk                        finish();
1017000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich                    }
10283290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk                }).create();
10383290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk        mDialog.show();
10483290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk
10583290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk        LinearLayout container = (LinearLayout) mDialog.findViewById(R.id.container);
10683290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk
1071c3fd76ee08e63d5a12387e21a59f89c431fc17aSudheer Shanka        mEnforcedAdmin = RestrictedLockUtils.checkIfRestrictionEnforced(this,
1081c3fd76ee08e63d5a12387e21a59f89c431fc17aSudheer Shanka                UserManager.DISALLOW_USB_FILE_TRANSFER, UserHandle.myUserId());
10983290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk        mBackend = new UsbBackend(this);
11083290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk        int current = mBackend.getCurrentMode();
11183290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk        for (int i = 0; i < DEFAULT_MODES.length; i++) {
1129e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka            if (mBackend.isModeSupported(DEFAULT_MODES[i])
1139e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka                    && !mBackend.isModeDisallowedBySystem(DEFAULT_MODES[i])) {
1141c3fd76ee08e63d5a12387e21a59f89c431fc17aSudheer Shanka                inflateOption(DEFAULT_MODES[i], current == DEFAULT_MODES[i], container,
1159e9e63b7b3b31fcae7242eb07f528487e0913402Sudheer Shanka                        mBackend.isModeDisallowed(DEFAULT_MODES[i]));
1167000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich            }
11783290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk        }
11883290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk    }
11983290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk
12093df36a1c7ae91c304e7d7eb55462b84705a49b3Du, Changbin    @Override
12193df36a1c7ae91c304e7d7eb55462b84705a49b3Du, Changbin    public void onStart() {
12293df36a1c7ae91c304e7d7eb55462b84705a49b3Du, Changbin        super.onStart();
12393df36a1c7ae91c304e7d7eb55462b84705a49b3Du, Changbin
12493df36a1c7ae91c304e7d7eb55462b84705a49b3Du, Changbin        IntentFilter filter = new IntentFilter(UsbManager.ACTION_USB_STATE);
12593df36a1c7ae91c304e7d7eb55462b84705a49b3Du, Changbin        registerReceiver(mDisconnectedReceiver, filter);
12693df36a1c7ae91c304e7d7eb55462b84705a49b3Du, Changbin    }
12793df36a1c7ae91c304e7d7eb55462b84705a49b3Du, Changbin
12893df36a1c7ae91c304e7d7eb55462b84705a49b3Du, Changbin    @Override
12993df36a1c7ae91c304e7d7eb55462b84705a49b3Du, Changbin    protected void onStop() {
13093df36a1c7ae91c304e7d7eb55462b84705a49b3Du, Changbin        unregisterReceiver(mDisconnectedReceiver);
13193df36a1c7ae91c304e7d7eb55462b84705a49b3Du, Changbin        super.onStop();
13293df36a1c7ae91c304e7d7eb55462b84705a49b3Du, Changbin    }
13393df36a1c7ae91c304e7d7eb55462b84705a49b3Du, Changbin
1341c3fd76ee08e63d5a12387e21a59f89c431fc17aSudheer Shanka    private void inflateOption(final int mode, boolean selected, LinearLayout container,
1351c3fd76ee08e63d5a12387e21a59f89c431fc17aSudheer Shanka            final boolean disallowedByAdmin) {
136115d15763d95c2f93a639ad2569037d274d46a22Sudheer Shanka        View v = mLayoutInflater.inflate(R.layout.restricted_radio_with_summary, container, false);
13783290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk
1381c3fd76ee08e63d5a12387e21a59f89c431fc17aSudheer Shanka        TextView titleView = (TextView) v.findViewById(android.R.id.title);
1393ff3b81827ff647706d6ac8c925a33fedccebd93Doris Ling        titleView.setText(getTitle(mode));
1401c3fd76ee08e63d5a12387e21a59f89c431fc17aSudheer Shanka        TextView summaryView = (TextView) v.findViewById(android.R.id.summary);
1413ff3b81827ff647706d6ac8c925a33fedccebd93Doris Ling        updateSummary(summaryView, mode);
1421c3fd76ee08e63d5a12387e21a59f89c431fc17aSudheer Shanka
1431c3fd76ee08e63d5a12387e21a59f89c431fc17aSudheer Shanka        if (disallowedByAdmin) {
1441c3fd76ee08e63d5a12387e21a59f89c431fc17aSudheer Shanka            if (mEnforcedAdmin != null) {
145115d15763d95c2f93a639ad2569037d274d46a22Sudheer Shanka                setDisabledByAdmin(v, titleView, summaryView);
1461c3fd76ee08e63d5a12387e21a59f89c431fc17aSudheer Shanka            } else {
1471c3fd76ee08e63d5a12387e21a59f89c431fc17aSudheer Shanka                return;
1481c3fd76ee08e63d5a12387e21a59f89c431fc17aSudheer Shanka            }
1491c3fd76ee08e63d5a12387e21a59f89c431fc17aSudheer Shanka        }
15083290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk
15183290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk        v.setOnClickListener(new OnClickListener() {
1527000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich            @Override
15383290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk            public void onClick(View v) {
1541c3fd76ee08e63d5a12387e21a59f89c431fc17aSudheer Shanka                if (disallowedByAdmin && mEnforcedAdmin != null) {
1551c3fd76ee08e63d5a12387e21a59f89c431fc17aSudheer Shanka                    RestrictedLockUtils.sendShowAdminSupportDetailsIntent(
1561c3fd76ee08e63d5a12387e21a59f89c431fc17aSudheer Shanka                            UsbModeChooserActivity.this, mEnforcedAdmin);
1571c3fd76ee08e63d5a12387e21a59f89c431fc17aSudheer Shanka                    return;
1581c3fd76ee08e63d5a12387e21a59f89c431fc17aSudheer Shanka                }
15983290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk                if (!ActivityManager.isUserAMonkey()) {
16083290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk                    mBackend.setMode(mode);
16183290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk                }
16283290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk                mDialog.dismiss();
16383290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk                finish();
1647000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich            }
1657000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich        });
16683290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk        ((Checkable) v).setChecked(selected);
16783290eef8cfeebc9736f077d78003d78e6bf1320Jason Monk        container.addView(v);
1687000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich    }
1697000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich
170115d15763d95c2f93a639ad2569037d274d46a22Sudheer Shanka    private void setDisabledByAdmin(View rootView, TextView titleView, TextView summaryView) {
1711c3fd76ee08e63d5a12387e21a59f89c431fc17aSudheer Shanka        if (mEnforcedAdmin != null) {
1721c3fd76ee08e63d5a12387e21a59f89c431fc17aSudheer Shanka            titleView.setEnabled(false);
1731c3fd76ee08e63d5a12387e21a59f89c431fc17aSudheer Shanka            summaryView.setEnabled(false);
174115d15763d95c2f93a639ad2569037d274d46a22Sudheer Shanka            rootView.findViewById(R.id.restricted_icon).setVisibility(View.VISIBLE);
1751c3fd76ee08e63d5a12387e21a59f89c431fc17aSudheer Shanka            Drawable[] compoundDrawables = titleView.getCompoundDrawablesRelative();
1761c3fd76ee08e63d5a12387e21a59f89c431fc17aSudheer Shanka            compoundDrawables[0 /* start */].mutate().setColorFilter(
1771c3fd76ee08e63d5a12387e21a59f89c431fc17aSudheer Shanka                    getColor(R.color.disabled_text_color), PorterDuff.Mode.MULTIPLY);
1781c3fd76ee08e63d5a12387e21a59f89c431fc17aSudheer Shanka        }
1791c3fd76ee08e63d5a12387e21a59f89c431fc17aSudheer Shanka    }
1801c3fd76ee08e63d5a12387e21a59f89c431fc17aSudheer Shanka
1813ff3b81827ff647706d6ac8c925a33fedccebd93Doris Ling    @VisibleForTesting
1823ff3b81827ff647706d6ac8c925a33fedccebd93Doris Ling    static void updateSummary(TextView summaryView, int mode) {
1833ff3b81827ff647706d6ac8c925a33fedccebd93Doris Ling        if (mode == (UsbBackend.MODE_POWER_SOURCE | UsbBackend.MODE_DATA_NONE)) {
1843ff3b81827ff647706d6ac8c925a33fedccebd93Doris Ling            summaryView.setText(R.string.usb_use_power_only_desc);
1853ff3b81827ff647706d6ac8c925a33fedccebd93Doris Ling        }
1863ff3b81827ff647706d6ac8c925a33fedccebd93Doris Ling    }
1873ff3b81827ff647706d6ac8c925a33fedccebd93Doris Ling
1883ff3b81827ff647706d6ac8c925a33fedccebd93Doris Ling    @VisibleForTesting
1893ff3b81827ff647706d6ac8c925a33fedccebd93Doris Ling    static int getTitle(int mode) {
1903ff3b81827ff647706d6ac8c925a33fedccebd93Doris Ling        switch (mode) {
1913ff3b81827ff647706d6ac8c925a33fedccebd93Doris Ling            case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_NONE:
1923ff3b81827ff647706d6ac8c925a33fedccebd93Doris Ling                return R.string.usb_use_charging_only;
1933ff3b81827ff647706d6ac8c925a33fedccebd93Doris Ling            case UsbBackend.MODE_POWER_SOURCE | UsbBackend.MODE_DATA_NONE:
1943ff3b81827ff647706d6ac8c925a33fedccebd93Doris Ling                return R.string.usb_use_power_only;
1953ff3b81827ff647706d6ac8c925a33fedccebd93Doris Ling            case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_MTP:
1963ff3b81827ff647706d6ac8c925a33fedccebd93Doris Ling                return R.string.usb_use_file_transfers;
1973ff3b81827ff647706d6ac8c925a33fedccebd93Doris Ling            case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_PTP:
1983ff3b81827ff647706d6ac8c925a33fedccebd93Doris Ling                return R.string.usb_use_photo_transfers;
1993ff3b81827ff647706d6ac8c925a33fedccebd93Doris Ling            case UsbBackend.MODE_POWER_SINK | UsbBackend.MODE_DATA_MIDI:
2003ff3b81827ff647706d6ac8c925a33fedccebd93Doris Ling                return R.string.usb_use_MIDI;
2013ff3b81827ff647706d6ac8c925a33fedccebd93Doris Ling        }
2023ff3b81827ff647706d6ac8c925a33fedccebd93Doris Ling        return 0;
2033ff3b81827ff647706d6ac8c925a33fedccebd93Doris Ling    }
2047000d5433880b736bd67cbb44f66df771b64ee1bNick Kralevich}
205