1 /*
2  * Copyright (C) 2023 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 android.content.res.Configuration;
20 import android.os.Bundle;
21 import android.os.Trace;
22 import android.view.ContextThemeWrapper;
23 import android.view.LayoutInflater;
24 import android.view.View;
25 import android.view.ViewGroup;
26 
27 import androidx.annotation.FloatRange;
28 import androidx.annotation.Nullable;
29 
30 import com.android.systemui.plugins.qs.QS;
31 import com.android.systemui.plugins.qs.QSContainerController;
32 import com.android.systemui.qs.dagger.QSFragmentComponent;
33 import com.android.systemui.res.R;
34 import com.android.systemui.settings.brightness.MirrorController;
35 import com.android.systemui.util.LifecycleFragment;
36 
37 import java.util.function.Consumer;
38 
39 import javax.inject.Inject;
40 import javax.inject.Provider;
41 
42 public class QSFragmentLegacy extends LifecycleFragment implements QS {
43 
44     private final Provider<QSImpl> mQsImplProvider;
45 
46     private final QSFragmentComponent.Factory mQsComponentFactory;
47 
48     @Nullable
49     private QSImpl mQsImpl;
50 
51     @Inject
QSFragmentLegacy( Provider<QSImpl> qsImplProvider, QSFragmentComponent.Factory qsComponentFactory )52     public QSFragmentLegacy(
53             Provider<QSImpl> qsImplProvider,
54             QSFragmentComponent.Factory qsComponentFactory
55     ) {
56         mQsComponentFactory = qsComponentFactory;
57         mQsImplProvider = qsImplProvider;
58     }
59 
60     @Override
onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState)61     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
62             Bundle savedInstanceState) {
63         try {
64             Trace.beginSection("QSFragment#onCreateView");
65             inflater = inflater.cloneInContext(new ContextThemeWrapper(getContext(),
66                     R.style.Theme_SystemUI_QuickSettings));
67             return inflater.inflate(R.layout.qs_panel, container, false);
68         } finally {
69             Trace.endSection();
70         }
71     }
72 
73     @Override
onViewCreated(View view, @Nullable Bundle savedInstanceState)74     public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
75         QSFragmentComponent qsFragmentComponent = mQsComponentFactory.create(getView());
76         mQsImpl = mQsImplProvider.get();
77         mQsImpl.onCreate(null);
78         mQsImpl.onComponentCreated(qsFragmentComponent, savedInstanceState);
79     }
80 
81     @Override
setScrollListener(ScrollListener listener)82     public void setScrollListener(ScrollListener listener) {
83         if (mQsImpl != null) {
84             mQsImpl.setScrollListener(listener);
85         }
86     }
87 
88     @Override
onDestroyView()89     public void onDestroyView() {
90         if (mQsImpl != null) {
91             mQsImpl.onDestroy();
92             mQsImpl = null;
93         }
94         super.onDestroyView();
95     }
96     @Override
onSaveInstanceState(Bundle outState)97     public void onSaveInstanceState(Bundle outState) {
98         super.onSaveInstanceState(outState);
99         if (mQsImpl != null) {
100             mQsImpl.onSaveInstanceState(outState);
101         }
102     }
103 
104     @Override
getHeader()105     public View getHeader() {
106         if (mQsImpl != null) {
107             return mQsImpl.getHeader();
108         } else {
109             return null;
110         }
111     }
112 
113     @Override
setHasNotifications(boolean hasNotifications)114     public void setHasNotifications(boolean hasNotifications) {
115         if (mQsImpl != null) {
116             mQsImpl.setHasNotifications(hasNotifications);
117         }
118     }
119 
120     @Override
setPanelView(HeightListener panelView)121     public void setPanelView(HeightListener panelView) {
122         if (mQsImpl != null) {
123             mQsImpl.setPanelView(panelView);
124         }
125     }
126 
127     @Override
onConfigurationChanged(Configuration newConfig)128     public void onConfigurationChanged(Configuration newConfig) {
129         super.onConfigurationChanged(newConfig);
130         if (mQsImpl != null) {
131             mQsImpl.onConfigurationChanged(newConfig);
132         }
133     }
134 
135     @Override
setFancyClipping(int leftInset, int top, int rightInset, int bottom, int cornerRadius, boolean visible, boolean fullWidth)136     public void setFancyClipping(int leftInset, int top, int rightInset, int bottom,
137             int cornerRadius, boolean visible, boolean fullWidth) {
138         if (mQsImpl != null) {
139             mQsImpl.setFancyClipping(leftInset, top, rightInset, bottom, cornerRadius, visible,
140                     fullWidth);
141         }
142     }
143 
144     @Override
isFullyCollapsed()145     public boolean isFullyCollapsed() {
146         if (mQsImpl != null) {
147             return mQsImpl.isFullyCollapsed();
148         } else {
149             return true;
150         }
151     }
152 
153     @Override
setCollapsedMediaVisibilityChangedListener(Consumer<Boolean> listener)154     public void setCollapsedMediaVisibilityChangedListener(Consumer<Boolean> listener) {
155         if (mQsImpl != null) {
156             mQsImpl.setCollapsedMediaVisibilityChangedListener(listener);
157         }
158     }
159 
160     @Override
setContainerController(QSContainerController controller)161     public void setContainerController(QSContainerController controller) {
162         if (mQsImpl != null) {
163             mQsImpl.setContainerController(controller);
164         }
165     }
166 
167     @Override
isCustomizing()168     public boolean isCustomizing() {
169         if (mQsImpl != null) {
170             return mQsImpl.isCustomizing();
171         } else {
172             return false;
173         }
174     }
175 
getQSPanelController()176     public QSPanelController getQSPanelController() {
177         if (mQsImpl != null) {
178             return mQsImpl.getQSPanelController();
179         } else {
180             return null;
181         }
182     }
183 
setBrightnessMirrorController( MirrorController brightnessMirrorController)184     public void setBrightnessMirrorController(
185             MirrorController brightnessMirrorController) {
186         if (mQsImpl != null) {
187             mQsImpl.setBrightnessMirrorController(brightnessMirrorController);
188         }
189     }
190 
191     @Override
isShowingDetail()192     public boolean isShowingDetail() {
193         if (mQsImpl != null) {
194             return mQsImpl.isShowingDetail();
195         } else {
196             return false;
197         }
198     }
199 
200     @Override
setHeaderClickable(boolean clickable)201     public void setHeaderClickable(boolean clickable) {
202         if (mQsImpl != null) {
203             mQsImpl.setHeaderClickable(clickable);
204         }
205     }
206 
207     @Override
setExpanded(boolean expanded)208     public void setExpanded(boolean expanded) {
209         if (mQsImpl != null) {
210             mQsImpl.setExpanded(expanded);
211         }
212     }
213 
214     @Override
setOverscrolling(boolean stackScrollerOverscrolling)215     public void setOverscrolling(boolean stackScrollerOverscrolling) {
216         if (mQsImpl != null) {
217             mQsImpl.setOverscrolling(stackScrollerOverscrolling);
218         }
219     }
220 
221     @Override
setShouldUpdateSquishinessOnMedia(boolean shouldUpdate)222     public void setShouldUpdateSquishinessOnMedia(boolean shouldUpdate) {
223         if (mQsImpl != null) {
224             mQsImpl.setShouldUpdateSquishinessOnMedia(shouldUpdate);
225         }
226     }
227 
228     @Override
setListening(boolean listening)229     public void setListening(boolean listening) {
230         if (mQsImpl != null) {
231             mQsImpl.setListening(listening);
232         }
233     }
234 
235     @Override
setQsVisible(boolean visible)236     public void setQsVisible(boolean visible) {
237         if (mQsImpl != null) {
238             mQsImpl.setQsVisible(visible);
239         }
240     }
241 
242     @Override
setHeaderListening(boolean listening)243     public void setHeaderListening(boolean listening) {
244         if (mQsImpl != null) {
245             mQsImpl.setHeaderListening(listening);
246         }
247     }
248 
249     @Override
notifyCustomizeChanged()250     public void notifyCustomizeChanged() {
251         if (mQsImpl != null) {
252             mQsImpl.notifyCustomizeChanged();
253         }
254     }
255 
256     @Override
setInSplitShade(boolean inSplitShade)257     public void setInSplitShade(boolean inSplitShade) {
258         if (mQsImpl != null) {
259             mQsImpl.setInSplitShade(inSplitShade);
260         }
261     }
262 
263     @Override
setTransitionToFullShadeProgress( boolean isTransitioningToFullShade, @FloatRange(from = 0.0, to = 1.0) float qsTransitionFraction, @FloatRange(from = 0.0, to = 1.0) float qsSquishinessFraction)264     public void setTransitionToFullShadeProgress(
265             boolean isTransitioningToFullShade,
266             @FloatRange(from = 0.0, to = 1.0) float qsTransitionFraction,
267             @FloatRange(from = 0.0, to = 1.0) float qsSquishinessFraction) {
268         if (mQsImpl != null) {
269             mQsImpl.setTransitionToFullShadeProgress(isTransitioningToFullShade,
270                     qsTransitionFraction, qsSquishinessFraction);
271         }
272     }
273 
274     @Override
setOverScrollAmount(int overScrollAmount)275     public void setOverScrollAmount(int overScrollAmount) {
276         if (mQsImpl != null) {
277             mQsImpl.setOverScrollAmount(overScrollAmount);
278         }
279     }
280 
281     @Override
getHeightDiff()282     public int getHeightDiff() {
283         if (mQsImpl != null) {
284             return mQsImpl.getHeightDiff();
285         } else {
286             return 0;
287         }
288     }
289 
290     @Override
setIsNotificationPanelFullWidth(boolean isFullWidth)291     public void setIsNotificationPanelFullWidth(boolean isFullWidth) {
292         if (mQsImpl != null) {
293             mQsImpl.setIsNotificationPanelFullWidth(isFullWidth);
294         }
295     }
296 
297     @Override
setQsExpansion(float expansion, float panelExpansionFraction, float proposedTranslation, float squishinessFraction)298     public void setQsExpansion(float expansion, float panelExpansionFraction,
299             float proposedTranslation, float squishinessFraction) {
300         if (mQsImpl != null) {
301             mQsImpl.setQsExpansion(expansion, panelExpansionFraction, proposedTranslation,
302                     squishinessFraction);
303         }
304     }
305 
306     @Override
animateHeaderSlidingOut()307     public void animateHeaderSlidingOut() {
308         if (mQsImpl != null) {
309             mQsImpl.animateHeaderSlidingOut();
310         }
311     }
312 
313     @Override
setCollapseExpandAction(Runnable action)314     public void setCollapseExpandAction(Runnable action) {
315         if (mQsImpl != null) {
316             mQsImpl.setCollapseExpandAction(action);
317         }
318     }
319 
320     @Override
closeDetail()321     public void closeDetail() {
322         if (mQsImpl != null) {
323             mQsImpl.closeDetail();
324         }
325     }
326 
327     @Override
closeCustomizer()328     public void closeCustomizer() {
329         if (mQsImpl != null) {
330             mQsImpl.closeDetail();
331         }
332     }
333 
334     /**
335      * The height this view wants to be. This is different from {@link View#getMeasuredHeight} such
336      * that during closing the detail panel, this already returns the smaller height.
337      */
338     @Override
getDesiredHeight()339     public int getDesiredHeight() {
340         if (mQsImpl != null) {
341             return mQsImpl.getDesiredHeight();
342         } else {
343             return 0;
344         }
345     }
346 
347     @Override
setHeightOverride(int desiredHeight)348     public void setHeightOverride(int desiredHeight) {
349         if (mQsImpl != null) {
350             mQsImpl.setHeightOverride(desiredHeight);
351         }
352     }
353 
354     @Override
getQsMinExpansionHeight()355     public int getQsMinExpansionHeight() {
356         if (mQsImpl != null) {
357             return mQsImpl.getQsMinExpansionHeight();
358         } else {
359             return 0;
360         }
361     }
362 
363     @Override
hideImmediately()364     public void hideImmediately() {
365         if (mQsImpl != null) {
366             mQsImpl.hideImmediately();
367         }
368     }
369 }
370