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