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