• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 android.content.Context
20 import com.android.launcher3.dagger.LauncherComponentProvider.appComponent
21 import com.android.launcher3.model.WidgetItem
22 import com.android.launcher3.model.WidgetsFilterDataProvider
23 import com.android.launcher3.model.WidgetsFilterDataProvider.WidgetsFilterLoadedCallback
24 import com.android.launcher3.model.data.ItemInfo
25 import com.android.launcher3.widget.model.WidgetsListBaseEntry
26 import com.android.launcher3.widget.picker.model.data.WidgetPickerData
27 import com.android.launcher3.widget.picker.model.data.WidgetPickerDataUtils.withRecommendedWidgets
28 import com.android.launcher3.widget.picker.model.data.WidgetPickerDataUtils.withWidgets
29 import java.io.PrintWriter
30 import java.util.function.Predicate
31 
32 /**
33  * Provides [WidgetPickerData] to various views such as widget picker, app-specific widget picker,
34  * widgets shortcut.
35  */
36 class WidgetPickerDataProvider(private val filterProvider: WidgetsFilterDataProvider) :
37     WidgetsFilterLoadedCallback {
38 
39     constructor(context: Context) : this(context.appComponent.widgetsFilterDataProvider)
40 
41     /** All the widgets data provided for the views */
42     private var mWidgetPickerData: WidgetPickerData = WidgetPickerData()
43 
44     private var changeListener: WidgetPickerDataChangeListener? = null
45 
46     var hostSpecifiedDefaultWidgetsFilter: Predicate<WidgetItem>? = null
47 
48     private var allWidgets: List<WidgetsListBaseEntry> = emptyList()
49 
50     /** Sets a listener to be called back when widget data is updated. */
setChangeListenernull51     fun setChangeListener(changeListener: WidgetPickerDataChangeListener?) {
52         this.changeListener = changeListener
53     }
54 
55     init {
56         filterProvider.addFilterChangeCallback(this)
57     }
58 
59     /** Returns the current snapshot of [WidgetPickerData]. */
getnull60     fun get(): WidgetPickerData {
61         return mWidgetPickerData
62     }
63 
onWidgetsFilterLoadednull64     override fun onWidgetsFilterLoaded() {
65         setWidgets(allWidgets)
66     }
67 
68     /**
69      * Updates the widgets available to the widget picker.
70      *
71      * Generally called when the widgets model has new data.
72      */
setWidgetsnull73     fun setWidgets(allWidgets: List<WidgetsListBaseEntry>) {
74         this.allWidgets = allWidgets
75 
76         val currentFilter = filterProvider.defaultWidgetsFilter
77         val finalFilter =
78             when {
79                 currentFilter != null && hostSpecifiedDefaultWidgetsFilter != null ->
80                     currentFilter.and(hostSpecifiedDefaultWidgetsFilter)
81                 hostSpecifiedDefaultWidgetsFilter != null -> hostSpecifiedDefaultWidgetsFilter
82                 else -> currentFilter
83             }
84 
85         val defaultWidgets =
86             if (finalFilter != null)
87                 allWidgets
88                     .map { it.copy().apply { mWidgets.removeIf(finalFilter) } }
89                     .filter { it.mWidgets.isNotEmpty() }
90             else emptyList()
91 
92         mWidgetPickerData =
93             mWidgetPickerData.withWidgets(allWidgets = allWidgets, defaultWidgets = defaultWidgets)
94         changeListener?.onWidgetsBound()
95     }
96 
97     /**
98      * Makes the widget recommendations available to the widget picker
99      *
100      * Generally called when new widget predictions are available.
101      */
setWidgetRecommendationsnull102     fun setWidgetRecommendations(recommendations: List<ItemInfo>) {
103         mWidgetPickerData = mWidgetPickerData.withRecommendedWidgets(recommendations)
104         changeListener?.onRecommendedWidgetsBound()
105     }
106 
107     /** Writes the current state to the provided writer. */
dumpnull108     fun dump(prefix: String, writer: PrintWriter) {
109         writer.println(prefix + "WidgetPickerDataProvider:")
110         writer.println("$prefix\twidgetPickerData:$mWidgetPickerData")
111     }
112 
destroynull113     fun destroy() {
114         filterProvider.removeFilterChangeCallback(this)
115     }
116 
117     interface WidgetPickerDataChangeListener {
118         /** A callback to get notified when widgets are bound. */
onWidgetsBoundnull119         fun onWidgetsBound()
120 
121         /** A callback to get notified when recommended widgets are bound. */
122         fun onRecommendedWidgetsBound()
123     }
124 }
125