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