1 /*
2  * Copyright (C) 2024 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.launcher3.widget.picker.model
18 
19 import com.android.launcher3.model.data.ItemInfo
20 import com.android.launcher3.widget.model.WidgetsListBaseEntry
21 import com.android.launcher3.widget.picker.model.data.WidgetPickerData
22 import com.android.launcher3.widget.picker.model.data.WidgetPickerDataUtils.withRecommendedWidgets
23 import com.android.launcher3.widget.picker.model.data.WidgetPickerDataUtils.withWidgets
24 import java.io.PrintWriter
25 
26 /**
27  * Provides [WidgetPickerData] to various views such as widget picker, app-specific widget picker,
28  * widgets shortcut.
29  */
30 class WidgetPickerDataProvider {
31     /** All the widgets data provided for the views */
32     private var mWidgetPickerData: WidgetPickerData = WidgetPickerData()
33 
34     private var changeListener: WidgetPickerDataChangeListener? = null
35 
36     /** Sets a listener to be called back when widget data is updated. */
setChangeListenernull37     fun setChangeListener(changeListener: WidgetPickerDataChangeListener?) {
38         this.changeListener = changeListener
39     }
40 
41     /** Returns the current snapshot of [WidgetPickerData]. */
getnull42     fun get(): WidgetPickerData {
43         return mWidgetPickerData
44     }
45 
46     /**
47      * Updates the widgets available to the widget picker.
48      *
49      * Generally called when the widgets model has new data.
50      */
51     @JvmOverloads
setWidgetsnull52     fun setWidgets(
53         allWidgets: List<WidgetsListBaseEntry>,
54         defaultWidgets: List<WidgetsListBaseEntry> = listOf()
55     ) {
56         mWidgetPickerData =
57             mWidgetPickerData.withWidgets(allWidgets = allWidgets, defaultWidgets = defaultWidgets)
58         changeListener?.onWidgetsBound()
59     }
60 
61     /**
62      * Makes the widget recommendations available to the widget picker
63      *
64      * Generally called when new widget predictions are available.
65      */
setWidgetRecommendationsnull66     fun setWidgetRecommendations(recommendations: List<ItemInfo>) {
67         mWidgetPickerData = mWidgetPickerData.withRecommendedWidgets(recommendations)
68         changeListener?.onRecommendedWidgetsBound()
69     }
70 
71     /** Writes the current state to the provided writer. */
dumpnull72     fun dump(prefix: String, writer: PrintWriter) {
73         writer.println(prefix + "WidgetPickerDataProvider:")
74         writer.println("$prefix\twidgetPickerData:$mWidgetPickerData")
75     }
76 
77     interface WidgetPickerDataChangeListener {
78         /** A callback to get notified when widgets are bound. */
onWidgetsBoundnull79         fun onWidgetsBound()
80 
81         /** A callback to get notified when recommended widgets are bound. */
82         fun onRecommendedWidgetsBound()
83     }
84 }
85