1 /* 2 * Copyright (C) 2022 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.complication; 18 19 import static com.android.systemui.complication.dagger.RegisteredComplicationsModule.DREAM_SMARTSPACE_LAYOUT_PARAMS; 20 21 import android.content.Context; 22 import android.os.Parcelable; 23 import android.view.View; 24 import android.view.ViewGroup; 25 import android.widget.FrameLayout; 26 27 import com.android.systemui.CoreStartable; 28 import com.android.systemui.dagger.qualifiers.SystemUser; 29 import com.android.systemui.dreams.DreamOverlayStateController; 30 import com.android.systemui.dreams.smartspace.DreamSmartspaceController; 31 import com.android.systemui.flags.FeatureFlags; 32 import com.android.systemui.flags.Flags; 33 import com.android.systemui.plugins.BcSmartspaceDataPlugin; 34 import com.android.systemui.shared.condition.Monitor; 35 import com.android.systemui.util.condition.ConditionalCoreStartable; 36 37 import java.util.List; 38 39 import javax.inject.Inject; 40 import javax.inject.Named; 41 import javax.inject.Provider; 42 43 /** 44 * {@link SmartSpaceComplication} embodies the SmartSpace view found on the lockscreen as a 45 * {@link Complication} 46 */ 47 public class SmartSpaceComplication implements Complication { 48 private final Provider<SmartSpaceComplicationViewHolder> mViewHolderProvider; 49 50 @Inject SmartSpaceComplication(Provider<SmartSpaceComplicationViewHolder> viewHolderProvider)51 public SmartSpaceComplication(Provider<SmartSpaceComplicationViewHolder> viewHolderProvider) { 52 mViewHolderProvider = viewHolderProvider; 53 } 54 55 @Override createView(ComplicationViewModel model)56 public ViewHolder createView(ComplicationViewModel model) { 57 return mViewHolderProvider.get(); 58 } 59 60 @Override getRequiredTypeAvailability()61 public int getRequiredTypeAvailability() { 62 return COMPLICATION_TYPE_SMARTSPACE; 63 } 64 65 /** 66 * {@link CoreStartable} responsbile for registering {@link SmartSpaceComplication} with 67 * SystemUI. 68 */ 69 public static class Registrant extends ConditionalCoreStartable { 70 private final DreamSmartspaceController mSmartSpaceController; 71 private final DreamOverlayStateController mDreamOverlayStateController; 72 private final SmartSpaceComplication mComplication; 73 private final FeatureFlags mFeatureFlags; 74 75 private final BcSmartspaceDataPlugin.SmartspaceTargetListener mSmartspaceListener = 76 new BcSmartspaceDataPlugin.SmartspaceTargetListener() { 77 @Override 78 public void onSmartspaceTargetsUpdated(List<? extends Parcelable> targets) { 79 mDreamOverlayStateController.addComplication(mComplication); 80 } 81 }; 82 83 /** 84 * Default constructor for {@link SmartSpaceComplication}. 85 */ 86 @Inject Registrant( DreamOverlayStateController dreamOverlayStateController, SmartSpaceComplication smartSpaceComplication, DreamSmartspaceController smartSpaceController, @SystemUser Monitor monitor, FeatureFlags featureFlags)87 public Registrant( 88 DreamOverlayStateController dreamOverlayStateController, 89 SmartSpaceComplication smartSpaceComplication, 90 DreamSmartspaceController smartSpaceController, 91 @SystemUser Monitor monitor, 92 FeatureFlags featureFlags) { 93 super(monitor); 94 mDreamOverlayStateController = dreamOverlayStateController; 95 mComplication = smartSpaceComplication; 96 mSmartSpaceController = smartSpaceController; 97 mFeatureFlags = featureFlags; 98 } 99 100 @Override onStart()101 public void onStart() { 102 if (mFeatureFlags.isEnabled(Flags.HIDE_SMARTSPACE_ON_DREAM_OVERLAY)) { 103 return; 104 } 105 106 mDreamOverlayStateController.addCallback(new DreamOverlayStateController.Callback() { 107 @Override 108 public void onStateChanged() { 109 if (mDreamOverlayStateController.isOverlayActive()) { 110 mSmartSpaceController.addListener(mSmartspaceListener); 111 } else { 112 mSmartSpaceController.removeListener(mSmartspaceListener); 113 mDreamOverlayStateController.removeComplication(mComplication); 114 } 115 } 116 }); 117 } 118 } 119 120 static class SmartSpaceComplicationViewHolder implements ViewHolder { 121 private View mView = null; 122 private final DreamSmartspaceController mSmartSpaceController; 123 private final Context mContext; 124 private final ComplicationLayoutParams mLayoutParams; 125 126 @Inject SmartSpaceComplicationViewHolder( Context context, DreamSmartspaceController smartSpaceController, @Named(DREAM_SMARTSPACE_LAYOUT_PARAMS) ComplicationLayoutParams layoutParams)127 protected SmartSpaceComplicationViewHolder( 128 Context context, 129 DreamSmartspaceController smartSpaceController, 130 @Named(DREAM_SMARTSPACE_LAYOUT_PARAMS) ComplicationLayoutParams layoutParams) { 131 mSmartSpaceController = smartSpaceController; 132 mContext = context; 133 mLayoutParams = layoutParams; 134 } 135 136 @Override getView()137 public View getView() { 138 if (mView != null) { 139 return mView; 140 } 141 final FrameLayout smartSpaceContainer = new FrameLayout(mContext); 142 smartSpaceContainer.addView( 143 mSmartSpaceController.buildAndConnectView(smartSpaceContainer), 144 new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 145 ViewGroup.LayoutParams.WRAP_CONTENT)); 146 147 mView = smartSpaceContainer; 148 return smartSpaceContainer; 149 } 150 151 @Override getLayoutParams()152 public ComplicationLayoutParams getLayoutParams() { 153 return mLayoutParams; 154 } 155 } 156 } 157