154daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen/* 254daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen * Copyright (C) 2017 The Android Open Source Project 354daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen * 454daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file 554daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen * except in compliance with the License. You may obtain a copy of the License at 654daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen * 754daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen * http://www.apache.org/licenses/LICENSE-2.0 854daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen * 954daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen * Unless required by applicable law or agreed to in writing, software distributed under the 1054daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 1154daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen * KIND, either express or implied. See the License for the specific language governing 1254daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen * permissions and limitations under the License. 1354daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen */ 1454daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chenpackage com.android.systemui.qs.car; 1554daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen 1654daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chenimport android.content.Context; 1754daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chenimport android.content.Intent; 1854daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chenimport android.graphics.drawable.Drawable; 1954daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chenimport android.support.annotation.Nullable; 2054daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chenimport android.util.AttributeSet; 212ff95846dae60c6c4ddffa3ce5a34687d9f88d3bBryan Eylerimport android.util.Log; 2254daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chenimport android.view.View; 2354daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chenimport android.widget.ImageView; 2454daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chenimport android.widget.RelativeLayout; 25cade22539536823695e4b75f77dcb54ecce72ba2Bryan Eylerimport android.widget.TextView; 2654daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen 2754daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chenimport com.android.systemui.Dependency; 2854daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chenimport com.android.systemui.R; 2954daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chenimport com.android.systemui.plugins.ActivityStarter; 3054daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chenimport com.android.systemui.qs.QSFooter; 3154daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chenimport com.android.systemui.qs.QSPanel; 3254daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chenimport com.android.systemui.statusbar.phone.MultiUserSwitch; 3354daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chenimport com.android.systemui.statusbar.policy.DeviceProvisionedController; 3454daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chenimport com.android.systemui.statusbar.policy.UserInfoController; 3554daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen 3654daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen/** 3754daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen * The footer view that displays below the status bar in the auto use-case. This view shows the 3854daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen * user switcher and access to settings. 3954daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen */ 4054daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chenpublic class CarQSFooter extends RelativeLayout implements QSFooter, 4154daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen UserInfoController.OnUserInfoChangedListener { 422ff95846dae60c6c4ddffa3ce5a34687d9f88d3bBryan Eyler private static final String TAG = "CarQSFooter"; 432ff95846dae60c6c4ddffa3ce5a34687d9f88d3bBryan Eyler 4454daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen private UserInfoController mUserInfoController; 4554daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen 4654daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen private MultiUserSwitch mMultiUserSwitch; 47cade22539536823695e4b75f77dcb54ecce72ba2Bryan Eyler private TextView mUserName; 4854daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen private ImageView mMultiUserAvatar; 49715bdbcd424af1adc3f27b613951bb97970825bdBryan Eyler private CarQSFragment.UserSwitchCallback mUserSwitchCallback; 5054daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen 5154daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen public CarQSFooter(Context context, AttributeSet attrs) { 5254daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen super(context, attrs); 5354daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen } 5454daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen 5554daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen @Override 5654daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen protected void onFinishInflate() { 5754daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen super.onFinishInflate(); 5854daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen mMultiUserSwitch = findViewById(R.id.multi_user_switch); 5954daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen mMultiUserAvatar = mMultiUserSwitch.findViewById(R.id.multi_user_avatar); 60cade22539536823695e4b75f77dcb54ecce72ba2Bryan Eyler mUserName = findViewById(R.id.user_name); 6154daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen 6254daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen mUserInfoController = Dependency.get(UserInfoController.class); 6354daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen 642ff95846dae60c6c4ddffa3ce5a34687d9f88d3bBryan Eyler mMultiUserSwitch.setOnClickListener(v -> { 65715bdbcd424af1adc3f27b613951bb97970825bdBryan Eyler if (mUserSwitchCallback == null) { 662ff95846dae60c6c4ddffa3ce5a34687d9f88d3bBryan Eyler Log.e(TAG, "CarQSFooter not properly set up; cannot display user switcher."); 672ff95846dae60c6c4ddffa3ce5a34687d9f88d3bBryan Eyler return; 682ff95846dae60c6c4ddffa3ce5a34687d9f88d3bBryan Eyler } 692ff95846dae60c6c4ddffa3ce5a34687d9f88d3bBryan Eyler 70715bdbcd424af1adc3f27b613951bb97970825bdBryan Eyler if (!mUserSwitchCallback.isShowing()) { 71715bdbcd424af1adc3f27b613951bb97970825bdBryan Eyler mUserSwitchCallback.show(); 722ff95846dae60c6c4ddffa3ce5a34687d9f88d3bBryan Eyler } else { 73715bdbcd424af1adc3f27b613951bb97970825bdBryan Eyler mUserSwitchCallback.hide(); 742ff95846dae60c6c4ddffa3ce5a34687d9f88d3bBryan Eyler } 752ff95846dae60c6c4ddffa3ce5a34687d9f88d3bBryan Eyler }); 762ff95846dae60c6c4ddffa3ce5a34687d9f88d3bBryan Eyler 7754daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen findViewById(R.id.settings_button).setOnClickListener(v -> { 7854daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen ActivityStarter activityStarter = Dependency.get(ActivityStarter.class); 7954daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen 8054daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen if (!Dependency.get(DeviceProvisionedController.class).isCurrentUserSetup()) { 8154daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen // If user isn't setup just unlock the device and dump them back at SUW. 8254daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen activityStarter.postQSRunnableDismissingKeyguard(() -> { }); 8354daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen return; 8454daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen } 8554daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen 8654daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen activityStarter.startActivity(new Intent(android.provider.Settings.ACTION_SETTINGS), 8754daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen true /* dismissShade */); 8854daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen }); 8954daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen } 9054daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen 9154daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen @Override 9254daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen public void onUserInfoChanged(String name, Drawable picture, String userAccount) { 9354daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen mMultiUserAvatar.setImageDrawable(picture); 94cade22539536823695e4b75f77dcb54ecce72ba2Bryan Eyler mUserName.setText(name); 9554daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen } 9654daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen 9754daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen @Override 9854daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen public void setQSPanel(@Nullable QSPanel panel) { 9954daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen if (panel != null) { 10054daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen mMultiUserSwitch.setQsPanel(panel); 10154daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen } 10254daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen } 10354daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen 104715bdbcd424af1adc3f27b613951bb97970825bdBryan Eyler public void setUserSwitchCallback(CarQSFragment.UserSwitchCallback callback) { 105715bdbcd424af1adc3f27b613951bb97970825bdBryan Eyler mUserSwitchCallback = callback; 1062ff95846dae60c6c4ddffa3ce5a34687d9f88d3bBryan Eyler } 1072ff95846dae60c6c4ddffa3ce5a34687d9f88d3bBryan Eyler 10854daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen @Override 10954daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen public void setListening(boolean listening) { 11054daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen if (listening) { 11154daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen mUserInfoController.addCallback(this); 11254daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen } else { 11354daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen mUserInfoController.removeCallback(this); 11454daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen } 11554daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen } 11654daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen 11754daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen @Override 1188a3e23ce6361b1c94fc99e98377a41551366029fAmin Shaikh public void setExpandClickListener(OnClickListener onClickListener) { 11954daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen // No view that should expand/collapse the quick settings. 12054daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen } 12154daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen 12254daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen @Override 12354daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen public void setExpanded(boolean expanded) { 12454daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen // Do nothing because the quick settings cannot be expanded. 12554daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen } 12654daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen 12754daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen @Override 12854daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen public void setExpansion(float expansion) { 12954daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen // Do nothing because the quick settings cannot be expanded. 13054daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen } 13154daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen 13254daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen @Override 13354daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen public void setKeyguardShowing(boolean keyguardShowing) { 13454daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen // Do nothing because the footer will not be shown when the keyguard is up. 13554daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen } 13654daefe3aa8dcdee149ce95fd4f8ecf60632c9f1Anthony Chen} 137