2021-02-10 17:10:15 +00:00
|
|
|
/*
|
|
|
|
|
* Copyright (C) 2021 The Android Open Source Project
|
|
|
|
|
*
|
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
|
*
|
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
*
|
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
|
* limitations under the License.
|
|
|
|
|
*/
|
|
|
|
|
package com.android.launcher3.widget.model;
|
|
|
|
|
|
2023-02-09 16:51:57 -08:00
|
|
|
import android.content.Context;
|
|
|
|
|
import android.content.res.Resources;
|
|
|
|
|
|
|
|
|
|
import androidx.annotation.Nullable;
|
|
|
|
|
|
|
|
|
|
import com.android.launcher3.R;
|
2021-02-10 17:10:15 +00:00
|
|
|
import com.android.launcher3.model.WidgetItem;
|
|
|
|
|
import com.android.launcher3.model.data.PackageItemInfo;
|
2023-02-09 16:51:57 -08:00
|
|
|
import com.android.launcher3.util.PluralMessageFormat;
|
2021-02-10 17:10:15 +00:00
|
|
|
|
2021-03-11 16:10:27 +00:00
|
|
|
import java.util.List;
|
2023-02-09 16:51:57 -08:00
|
|
|
import java.util.function.BiFunction;
|
|
|
|
|
import java.util.stream.Collectors;
|
2021-02-10 17:10:15 +00:00
|
|
|
|
|
|
|
|
/** An information holder for an app which has widgets or/and shortcuts. */
|
2023-02-09 16:51:57 -08:00
|
|
|
public final class WidgetsListHeaderEntry extends WidgetsListBaseEntry {
|
2021-02-10 17:10:15 +00:00
|
|
|
|
2023-02-09 16:51:57 -08:00
|
|
|
private static final BiFunction<Context, WidgetsListHeaderEntry, String> SUBTITLE_SEARCH =
|
|
|
|
|
(context, entry) -> entry.mWidgets.stream()
|
|
|
|
|
.map(item -> item.label).sorted().collect(Collectors.joining(", "));
|
2021-02-10 17:10:15 +00:00
|
|
|
|
2023-02-09 16:51:57 -08:00
|
|
|
private static final BiFunction<Context, WidgetsListHeaderEntry, String> SUBTITLE_DEFAULT =
|
|
|
|
|
(context, entry) -> {
|
|
|
|
|
List<WidgetItem> items = entry.mWidgets;
|
|
|
|
|
int wc = (int) items.stream().filter(item -> item.widgetInfo != null).count();
|
|
|
|
|
int sc = Math.max(0, items.size() - wc);
|
2021-02-10 17:10:15 +00:00
|
|
|
|
2023-02-09 16:51:57 -08:00
|
|
|
Resources resources = context.getResources();
|
|
|
|
|
if (wc == 0 && sc == 0) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
String subtitle;
|
|
|
|
|
if (wc > 0 && sc > 0) {
|
|
|
|
|
String widgetsCount = PluralMessageFormat.getIcuPluralString(context,
|
|
|
|
|
R.string.widgets_count, wc);
|
|
|
|
|
String shortcutsCount = PluralMessageFormat.getIcuPluralString(context,
|
|
|
|
|
R.string.shortcuts_count, sc);
|
|
|
|
|
subtitle = resources.getString(R.string.widgets_and_shortcuts_count,
|
|
|
|
|
widgetsCount, shortcutsCount);
|
|
|
|
|
} else if (wc > 0) {
|
|
|
|
|
subtitle = PluralMessageFormat.getIcuPluralString(context,
|
|
|
|
|
R.string.widgets_count, wc);
|
|
|
|
|
} else {
|
|
|
|
|
subtitle = PluralMessageFormat.getIcuPluralString(context,
|
|
|
|
|
R.string.shortcuts_count, sc);
|
|
|
|
|
}
|
|
|
|
|
return subtitle;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
private final boolean mIsWidgetListShown;
|
|
|
|
|
private final boolean mIsSearchEntry;
|
2021-06-14 14:55:07 +00:00
|
|
|
|
|
|
|
|
private WidgetsListHeaderEntry(PackageItemInfo pkgItem, String titleSectionName,
|
2023-02-09 16:51:57 -08:00
|
|
|
List<WidgetItem> items, boolean isSearchEntry, boolean isWidgetListShown) {
|
2021-03-09 21:23:35 +00:00
|
|
|
super(pkgItem, titleSectionName, items);
|
2023-02-09 16:51:57 -08:00
|
|
|
mIsSearchEntry = isSearchEntry;
|
2021-06-14 14:55:07 +00:00
|
|
|
mIsWidgetListShown = isWidgetListShown;
|
2021-02-10 17:10:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** Returns {@code true} if the widgets list associated with this header is shown. */
|
|
|
|
|
public boolean isWidgetListShown() {
|
|
|
|
|
return mIsWidgetListShown;
|
|
|
|
|
}
|
|
|
|
|
|
2021-03-11 16:10:27 +00:00
|
|
|
@Override
|
|
|
|
|
public String toString() {
|
|
|
|
|
return "Header:" + mPkgItem.packageName + ":" + mWidgets.size();
|
|
|
|
|
}
|
|
|
|
|
|
2023-02-09 16:51:57 -08:00
|
|
|
public boolean isSearchEntry() {
|
|
|
|
|
return mIsSearchEntry;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Nullable
|
|
|
|
|
public String getSubtitle(Context context) {
|
|
|
|
|
return mIsSearchEntry
|
|
|
|
|
? SUBTITLE_SEARCH.apply(context, this) : SUBTITLE_DEFAULT.apply(context, this);
|
|
|
|
|
}
|
|
|
|
|
|
2021-03-11 16:10:27 +00:00
|
|
|
@Override
|
|
|
|
|
public boolean equals(Object obj) {
|
|
|
|
|
if (!(obj instanceof WidgetsListHeaderEntry)) return false;
|
|
|
|
|
WidgetsListHeaderEntry otherEntry = (WidgetsListHeaderEntry) obj;
|
|
|
|
|
return mWidgets.equals(otherEntry.mWidgets) && mPkgItem.equals(otherEntry.mPkgItem)
|
2021-06-14 14:55:07 +00:00
|
|
|
&& mTitleSectionName.equals(otherEntry.mTitleSectionName)
|
2023-02-09 16:51:57 -08:00
|
|
|
&& mIsWidgetListShown == otherEntry.mIsWidgetListShown
|
|
|
|
|
&& mIsSearchEntry == otherEntry.mIsSearchEntry;
|
2021-06-14 14:55:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** Returns a copy of this {@link WidgetsListHeaderEntry} with the widget list shown. */
|
|
|
|
|
public WidgetsListHeaderEntry withWidgetListShown() {
|
|
|
|
|
if (mIsWidgetListShown) return this;
|
|
|
|
|
return new WidgetsListHeaderEntry(
|
|
|
|
|
mPkgItem,
|
|
|
|
|
mTitleSectionName,
|
|
|
|
|
mWidgets,
|
2023-02-09 16:51:57 -08:00
|
|
|
mIsSearchEntry,
|
2021-06-14 14:55:07 +00:00
|
|
|
/* isWidgetListShown= */ true);
|
2021-03-11 16:10:27 +00:00
|
|
|
}
|
2023-02-09 16:51:57 -08:00
|
|
|
|
|
|
|
|
public static WidgetsListHeaderEntry create(PackageItemInfo pkgItem, String titleSectionName,
|
|
|
|
|
List<WidgetItem> items) {
|
|
|
|
|
return new WidgetsListHeaderEntry(
|
|
|
|
|
pkgItem,
|
|
|
|
|
titleSectionName,
|
|
|
|
|
items,
|
|
|
|
|
/* forSearch */ false,
|
|
|
|
|
/* isWidgetListShown= */ false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static WidgetsListHeaderEntry createForSearch(PackageItemInfo pkgItem,
|
|
|
|
|
String titleSectionName, List<WidgetItem> items) {
|
|
|
|
|
return new WidgetsListHeaderEntry(
|
|
|
|
|
pkgItem,
|
|
|
|
|
titleSectionName,
|
|
|
|
|
items,
|
|
|
|
|
/* forSearch */ true,
|
|
|
|
|
/* isWidgetListShown= */ false);
|
|
|
|
|
}
|
2021-02-10 17:10:15 +00:00
|
|
|
}
|