1/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
15 */
16
17package com.android.systemui.statusbar.phone;
18
19import android.content.Context;
20import android.content.Intent;
21import android.os.UserManager;
22import android.provider.ContactsContract;
23import android.text.TextUtils;
24import android.util.AttributeSet;
25import android.view.View;
26import android.view.ViewGroup;
27import android.view.accessibility.AccessibilityEvent;
28import android.view.accessibility.AccessibilityNodeInfo;
29import android.widget.Button;
30import android.widget.FrameLayout;
31
32import com.android.systemui.Dependency;
33import com.android.systemui.R;
34import com.android.systemui.plugins.ActivityStarter;
35import com.android.systemui.plugins.qs.DetailAdapter;
36import com.android.systemui.qs.QSPanel;
37import com.android.systemui.statusbar.policy.KeyguardUserSwitcher;
38import com.android.systemui.statusbar.policy.UserSwitcherController;
39
40/**
41 * Container for image of the multi user switcher (tappable).
42 */
43public class MultiUserSwitch extends FrameLayout implements View.OnClickListener {
44
45    protected QSPanel mQsPanel;
46    private KeyguardUserSwitcher mKeyguardUserSwitcher;
47    private boolean mKeyguardMode;
48    private UserSwitcherController.BaseUserAdapter mUserListener;
49
50    final UserManager mUserManager;
51
52    private final int[] mTmpInt2 = new int[2];
53
54    protected UserSwitcherController mUserSwitcherController;
55
56    public MultiUserSwitch(Context context, AttributeSet attrs) {
57        super(context, attrs);
58        mUserManager = UserManager.get(getContext());
59    }
60
61    @Override
62    protected void onFinishInflate() {
63        super.onFinishInflate();
64        setOnClickListener(this);
65        refreshContentDescription();
66    }
67
68    public void setQsPanel(QSPanel qsPanel) {
69        mQsPanel = qsPanel;
70        setUserSwitcherController(Dependency.get(UserSwitcherController.class));
71    }
72
73    public boolean hasMultipleUsers() {
74        if (mUserListener == null) {
75            return false;
76        }
77        return mUserListener.getUserCount() != 0;
78    }
79
80    public void setUserSwitcherController(UserSwitcherController userSwitcherController) {
81        mUserSwitcherController = userSwitcherController;
82        registerListener();
83        refreshContentDescription();
84    }
85
86    public void setKeyguardUserSwitcher(KeyguardUserSwitcher keyguardUserSwitcher) {
87        mKeyguardUserSwitcher = keyguardUserSwitcher;
88    }
89
90    public void setKeyguardMode(boolean keyguardShowing) {
91        mKeyguardMode = keyguardShowing;
92        registerListener();
93    }
94
95    private void registerListener() {
96        if (mUserManager.isUserSwitcherEnabled() && mUserListener == null) {
97
98            final UserSwitcherController controller = mUserSwitcherController;
99            if (controller != null) {
100                mUserListener = new UserSwitcherController.BaseUserAdapter(controller) {
101                    @Override
102                    public void notifyDataSetChanged() {
103                        refreshContentDescription();
104                    }
105
106                    @Override
107                    public View getView(int position, View convertView, ViewGroup parent) {
108                        return null;
109                    }
110                };
111                refreshContentDescription();
112            }
113        }
114    }
115
116    @Override
117    public void onClick(View v) {
118        if (mUserManager.isUserSwitcherEnabled()) {
119            if (mKeyguardMode) {
120                if (mKeyguardUserSwitcher != null) {
121                    mKeyguardUserSwitcher.show(true /* animate */);
122                }
123            } else if (mQsPanel != null && mUserSwitcherController != null) {
124                View center = getChildCount() > 0 ? getChildAt(0) : this;
125
126                center.getLocationInWindow(mTmpInt2);
127                mTmpInt2[0] += center.getWidth() / 2;
128                mTmpInt2[1] += center.getHeight() / 2;
129
130                mQsPanel.showDetailAdapter(true,
131                        getUserDetailAdapter(),
132                        mTmpInt2);
133            }
134        } else {
135            if (mQsPanel != null) {
136                Intent intent = ContactsContract.QuickContact.composeQuickContactsIntent(
137                        getContext(), v, ContactsContract.Profile.CONTENT_URI,
138                        ContactsContract.QuickContact.MODE_LARGE, null);
139                Dependency.get(ActivityStarter.class).postStartActivityDismissingKeyguard(intent, 0);
140            }
141        }
142    }
143
144    @Override
145    public void setClickable(boolean clickable) {
146        super.setClickable(clickable);
147        refreshContentDescription();
148    }
149
150    private void refreshContentDescription() {
151        String currentUser = null;
152        if (mUserManager.isUserSwitcherEnabled()
153                && mUserSwitcherController != null) {
154            currentUser = mUserSwitcherController.getCurrentUserName(mContext);
155        }
156
157        String text = null;
158
159        if (!TextUtils.isEmpty(currentUser)) {
160            text = mContext.getString(
161                    R.string.accessibility_quick_settings_user,
162                    currentUser);
163        }
164
165        if (!TextUtils.equals(getContentDescription(), text)) {
166            setContentDescription(text);
167        }
168    }
169
170    @Override
171    public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
172        super.onInitializeAccessibilityEvent(event);
173        event.setClassName(Button.class.getName());
174    }
175
176    @Override
177    public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
178        super.onInitializeAccessibilityNodeInfo(info);
179        info.setClassName(Button.class.getName());
180    }
181
182    @Override
183    public boolean hasOverlappingRendering() {
184        return false;
185    }
186
187    protected DetailAdapter getUserDetailAdapter() {
188        return mUserSwitcherController.userDetailAdapter;
189    }
190}
191