1 /*
2  * Copyright (C) 2020 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 
17 package com.android.systemui.qs;
18 
19 import static com.android.systemui.qs.dagger.QSFragmentModule.QS_FOOTER;
20 
21 import android.content.ClipData;
22 import android.content.ClipboardManager;
23 import android.text.TextUtils;
24 import android.view.View;
25 import android.widget.TextView;
26 import android.widget.Toast;
27 
28 import com.android.systemui.R;
29 import com.android.systemui.qs.dagger.QSScope;
30 import com.android.systemui.settings.UserTracker;
31 import com.android.systemui.util.ViewController;
32 
33 import javax.inject.Inject;
34 import javax.inject.Named;
35 
36 /**
37  * Controller for {@link QSFooterView}.
38  */
39 @QSScope
40 public class QSFooterViewController extends ViewController<QSFooterView> implements QSFooter {
41 
42     private final UserTracker mUserTracker;
43     private final QSPanelController mQsPanelController;
44     private final QuickQSPanelController mQuickQSPanelController;
45     private final FooterActionsController mFooterActionsController;
46     private final TextView mBuildText;
47     private final PageIndicator mPageIndicator;
48 
49     @Inject
QSFooterViewController(QSFooterView view, UserTracker userTracker, QSPanelController qsPanelController, QuickQSPanelController quickQSPanelController, @Named(QS_FOOTER) FooterActionsController footerActionsController)50     QSFooterViewController(QSFooterView view,
51             UserTracker userTracker,
52             QSPanelController qsPanelController,
53             QuickQSPanelController quickQSPanelController,
54             @Named(QS_FOOTER) FooterActionsController footerActionsController) {
55         super(view);
56         mUserTracker = userTracker;
57         mQsPanelController = qsPanelController;
58         mQuickQSPanelController = quickQSPanelController;
59         mFooterActionsController = footerActionsController;
60 
61         mBuildText = mView.findViewById(R.id.build);
62         mPageIndicator = mView.findViewById(R.id.footer_page_indicator);
63     }
64 
65     @Override
onInit()66     protected void onInit() {
67         super.onInit();
68         mFooterActionsController.init();
69     }
70 
71     @Override
onViewAttached()72     protected void onViewAttached() {
73         mView.addOnLayoutChangeListener(
74                 (v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> {
75                     mView.updateExpansion();
76                     mFooterActionsController.updateAnimator(right - left,
77                             mQuickQSPanelController.getNumQuickTiles());
78                 }
79         );
80 
81         mBuildText.setOnLongClickListener(view -> {
82             CharSequence buildText = mBuildText.getText();
83             if (!TextUtils.isEmpty(buildText)) {
84                 ClipboardManager service =
85                         mUserTracker.getUserContext().getSystemService(ClipboardManager.class);
86                 String label = getResources().getString(R.string.build_number_clip_data_label);
87                 service.setPrimaryClip(ClipData.newPlainText(label, buildText));
88                 Toast.makeText(getContext(), R.string.build_number_copy_toast, Toast.LENGTH_SHORT)
89                         .show();
90                 return true;
91             }
92             return false;
93         });
94         mQsPanelController.setFooterPageIndicator(mPageIndicator);
95         mView.updateEverything();
96     }
97 
98     @Override
onViewDetached()99     protected void onViewDetached() {
100         setListening(false);
101     }
102 
103     @Override
setVisibility(int visibility)104     public void setVisibility(int visibility) {
105         mView.setVisibility(visibility);
106     }
107 
108     @Override
setExpanded(boolean expanded)109     public void setExpanded(boolean expanded) {
110         mFooterActionsController.setExpanded(expanded);
111         mView.setExpanded(expanded);
112     }
113 
114     @Override
setExpansion(float expansion)115     public void setExpansion(float expansion) {
116         mView.setExpansion(expansion);
117         mFooterActionsController.setExpansion(expansion);
118     }
119 
120     @Override
setListening(boolean listening)121     public void setListening(boolean listening) {
122         mFooterActionsController.setListening(listening);
123     }
124 
125     @Override
setKeyguardShowing(boolean keyguardShowing)126     public void setKeyguardShowing(boolean keyguardShowing) {
127         mView.setKeyguardShowing();
128         mFooterActionsController.setKeyguardShowing();
129     }
130 
131     /** */
132     @Override
setExpandClickListener(View.OnClickListener onClickListener)133     public void setExpandClickListener(View.OnClickListener onClickListener) {
134         mView.setExpandClickListener(onClickListener);
135     }
136 
137     @Override
disable(int state1, int state2, boolean animate)138     public void disable(int state1, int state2, boolean animate) {
139         mView.disable(state2);
140         mFooterActionsController.disable(state2);
141     }
142 }
143