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