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