version:1.5
fix:迁移到奥乐云平台 add:
This commit is contained in:
339
src/com/aoleyun/os/icons/IconCache.java
Normal file
339
src/com/aoleyun/os/icons/IconCache.java
Normal file
@@ -0,0 +1,339 @@
|
||||
/*
|
||||
* Copyright (C) 2008 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.aoleyun.os.icons;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.LauncherActivityInfo;
|
||||
import android.content.pm.PackageInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.PackageManager.NameNotFoundException;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Handler;
|
||||
import android.os.Process;
|
||||
import android.os.UserHandle;
|
||||
import android.util.Log;
|
||||
|
||||
import com.aoleyun.os.AppInfo;
|
||||
import com.aoleyun.os.IconProvider;
|
||||
import com.aoleyun.os.InvariantDeviceProfile;
|
||||
import com.aoleyun.os.ItemInfoWithIcon;
|
||||
import com.aoleyun.os.LauncherFiles;
|
||||
import com.aoleyun.os.LauncherModel;
|
||||
import com.aoleyun.os.MainThreadExecutor;
|
||||
import com.aoleyun.os.R;
|
||||
import com.aoleyun.os.TTUtils.BitmapUtils;
|
||||
import com.aoleyun.os.WorkspaceItemInfo;
|
||||
import com.aoleyun.os.Utilities;
|
||||
import com.aoleyun.os.compat.LauncherAppsCompat;
|
||||
import com.aoleyun.os.compat.UserManagerCompat;
|
||||
import com.aoleyun.os.icons.cache.BaseIconCache;
|
||||
import com.aoleyun.os.icons.cache.CachingLogic;
|
||||
import com.aoleyun.os.icons.cache.HandlerRunnable;
|
||||
import com.aoleyun.os.model.PackageItemInfo;
|
||||
import com.aoleyun.os.util.InstantAppResolver;
|
||||
import com.aoleyun.os.util.Preconditions;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
/**
|
||||
* Cache of application icons. Icons can be made from any thread.
|
||||
*/
|
||||
public class IconCache extends BaseIconCache {
|
||||
|
||||
private static final String TAG = "Launcher.IconCache";
|
||||
|
||||
private final MainThreadExecutor mMainThreadExecutor = new MainThreadExecutor();
|
||||
|
||||
private final CachingLogic<ComponentWithLabel> mComponentWithLabelCachingLogic;
|
||||
private final CachingLogic<LauncherActivityInfo> mLauncherActivityInfoCachingLogic;
|
||||
|
||||
private final LauncherAppsCompat mLauncherApps;
|
||||
private final UserManagerCompat mUserManager;
|
||||
private final InstantAppResolver mInstantAppResolver;
|
||||
private final IconProvider mIconProvider;
|
||||
|
||||
private int mPendingIconRequestCount = 0;
|
||||
|
||||
public IconCache(Context context, InvariantDeviceProfile inv) {
|
||||
super(context, LauncherFiles.APP_ICONS_DB, LauncherModel.getWorkerLooper(),
|
||||
inv.fillResIconDpi, inv.iconBitmapSize, true /* inMemoryCache */);
|
||||
mComponentWithLabelCachingLogic = new ComponentWithLabel.ComponentCachingLogic(context);
|
||||
mLauncherActivityInfoCachingLogic = new LauncherActivtiyCachingLogic(this);
|
||||
mLauncherApps = LauncherAppsCompat.getInstance(mContext);
|
||||
mUserManager = UserManagerCompat.getInstance(mContext);
|
||||
mInstantAppResolver = InstantAppResolver.newInstance(mContext);
|
||||
mIconProvider = IconProvider.newInstance(context);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected long getSerialNumberForUser(UserHandle user) {
|
||||
return mUserManager.getSerialNumberForUser(user);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isInstantApp(ApplicationInfo info) {
|
||||
return mInstantAppResolver.isInstantApp(info);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected BaseIconFactory getIconFactory() {
|
||||
return LauncherIcons.obtain(mContext);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the entries related to the given package in memory and persistent DB.
|
||||
*/
|
||||
public synchronized void updateIconsForPkg(String packageName, UserHandle user) {
|
||||
removeIconsForPkg(packageName, user);
|
||||
try {
|
||||
PackageInfo info = mPackageManager.getPackageInfo(packageName,
|
||||
PackageManager.GET_UNINSTALLED_PACKAGES);
|
||||
long userSerial = mUserManager.getSerialNumberForUser(user);
|
||||
for (LauncherActivityInfo app : mLauncherApps.getActivityList(packageName, user)) {
|
||||
addIconToDBAndMemCache(app, mLauncherActivityInfoCachingLogic, info, userSerial,
|
||||
false /*replace existing*/);
|
||||
}
|
||||
} catch (NameNotFoundException e) {
|
||||
Log.d(TAG, "Package not found", e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetches high-res icon for the provided ItemInfo and updates the caller when done.
|
||||
* @return a request ID that can be used to cancel the request.
|
||||
*/
|
||||
public IconLoadRequest updateIconInBackground(final ItemInfoUpdateReceiver caller,
|
||||
final ItemInfoWithIcon info) {
|
||||
Preconditions.assertUIThread();
|
||||
if (mPendingIconRequestCount <= 0) {
|
||||
LauncherModel.setWorkerPriority(Process.THREAD_PRIORITY_FOREGROUND);
|
||||
}
|
||||
mPendingIconRequestCount ++;
|
||||
|
||||
IconLoadRequest request = new IconLoadRequest(mWorkerHandler, this::onIconRequestEnd) {
|
||||
@Override
|
||||
public void run() {
|
||||
if (info instanceof AppInfo || info instanceof WorkspaceItemInfo) {
|
||||
getTitleAndIcon(info, false);
|
||||
} else if (info instanceof PackageItemInfo) {
|
||||
getTitleAndIconForApp((PackageItemInfo) info, false);
|
||||
}
|
||||
mMainThreadExecutor.execute(() -> {
|
||||
caller.reapplyItemInfo(info);
|
||||
onEnd();
|
||||
});
|
||||
}
|
||||
};
|
||||
Utilities.postAsyncCallback(mWorkerHandler, request);
|
||||
return request;
|
||||
}
|
||||
|
||||
private void onIconRequestEnd() {
|
||||
mPendingIconRequestCount --;
|
||||
if (mPendingIconRequestCount <= 0) {
|
||||
LauncherModel.setWorkerPriority(Process.THREAD_PRIORITY_BACKGROUND);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates {@param application} only if a valid entry is found.
|
||||
*/
|
||||
public synchronized void updateTitleAndIcon(AppInfo application) {
|
||||
CacheEntry entry = cacheLocked(application.componentName,
|
||||
application.user, () -> null, mLauncherActivityInfoCachingLogic,
|
||||
false, application.usingLowResIcon());
|
||||
if (entry.icon != null && !isDefaultIcon(entry.icon, application.user)) {
|
||||
applyCacheEntry(entry, application);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fill in {@param info} with the icon and label for {@param activityInfo}
|
||||
*/
|
||||
public synchronized void getTitleAndIcon(ItemInfoWithIcon info,
|
||||
LauncherActivityInfo activityInfo, boolean useLowResIcon) {
|
||||
// If we already have activity info, no need to use package icon
|
||||
getTitleAndIcon(info, () -> activityInfo, false, useLowResIcon);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fill in {@param info} with the icon and label. If the
|
||||
* corresponding activity is not found, it reverts to the package icon.
|
||||
*/
|
||||
public synchronized void getTitleAndIcon(ItemInfoWithIcon info, boolean useLowResIcon) {
|
||||
// null info means not installed, but if we have a component from the intent then
|
||||
// we should still look in the cache for restored app icons.
|
||||
if (info.getTargetComponent() == null) {
|
||||
info.applyFrom(getDefaultIcon(info.user));
|
||||
info.title = "";
|
||||
info.contentDescription = "";
|
||||
} else {
|
||||
Intent intent = info.getIntent();
|
||||
getTitleAndIcon(info, () -> mLauncherApps.resolveActivity(intent, info.user),
|
||||
true, useLowResIcon);
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized String getTitleNoCache(ComponentWithLabel info) {
|
||||
CacheEntry entry = cacheLocked(info.getComponent(), info.getUser(), () -> info,
|
||||
mComponentWithLabelCachingLogic, false /* usePackageIcon */,
|
||||
true /* useLowResIcon */, false /* addToMemCache */);
|
||||
return Utilities.trim(entry.title);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fill in {@param mWorkspaceItemInfo} with the icon and label for {@param info}
|
||||
*/
|
||||
private synchronized void getTitleAndIcon(
|
||||
@NonNull ItemInfoWithIcon infoInOut,
|
||||
@NonNull Supplier<LauncherActivityInfo> activityInfoProvider,
|
||||
boolean usePkgIcon, boolean useLowResIcon) {
|
||||
CacheEntry entry = cacheLocked(infoInOut.getTargetComponent(), infoInOut.user,
|
||||
activityInfoProvider, mLauncherActivityInfoCachingLogic, usePkgIcon, useLowResIcon);
|
||||
applyCacheEntry(entry, infoInOut);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Fill in {@param infoInOut} with the corresponding icon and label.
|
||||
*/
|
||||
public synchronized void getTitleAndIconForApp(
|
||||
PackageItemInfo infoInOut, boolean useLowResIcon) {
|
||||
CacheEntry entry = getEntryForPackageLocked(
|
||||
infoInOut.packageName, infoInOut.user, useLowResIcon);
|
||||
applyCacheEntry(entry, infoInOut);
|
||||
}
|
||||
|
||||
protected void applyCacheEntry(CacheEntry entry, ItemInfoWithIcon info) {
|
||||
info.title = Utilities.trim(entry.title);
|
||||
info.contentDescription = entry.contentDescription;
|
||||
info.applyFrom((entry.icon == null) ? getDefaultIcon(info.user) : entry);
|
||||
}
|
||||
private List<String> appClassNameList = new ArrayList<String>() {
|
||||
{
|
||||
this.add("com.android.appstore");//应用市场
|
||||
this.add("com.android.browser.BrowserActivity");//浏览器
|
||||
this.add("com.android.calculator2.Calculator");//计算器
|
||||
this.add("com.android.calendar.AllInOneActivity");//日历
|
||||
this.add("com.android.camera.CameraLauncher");//相机
|
||||
this.add("com.mediatek.camera.CameraLauncher");//相机
|
||||
this.add("com.android.contacts.activities.PeopleActivity");//通讯录
|
||||
this.add("com.android.deskclock.DeskClock");//时钟
|
||||
this.add("com.android.dialer.DialtactsActivity");//电话
|
||||
this.add("com.android.dialer.main.impl.MainActivity");//电话
|
||||
this.add("com.android.gallery3d.v2.app.GalleryActivity2");//图库
|
||||
this.add("com.android.messaging.ui.conversationlist.ConversationListActivity");//信息
|
||||
this.add("com.android.music.MusicBrowserActivity");//音乐
|
||||
this.add("com.android.providers.downloads.ui.DownloadList");//下载
|
||||
this.add("com.android.quicksearchbox.SearchActivity");//搜索
|
||||
this.add("com.android.settings.Settings");//设置
|
||||
this.add("com.sprd.soundrecorder.RecorderActivity");//录音机
|
||||
this.add("com.android.stk.StkMain");//sim卡
|
||||
this.add("com.sprd.gallery3d.app.NewVideoActivity");//视频
|
||||
this.add("com.mediatek.filemanager.FileManagerOperationActivity");//文件管理
|
||||
this.add("com.android.documentsui.LauncherActivity");//下载
|
||||
this.add("com.mediatek.fmradio.FmRadioActivity");//收音机
|
||||
this.add("com.android.fmradio.FmMainActivity");//收音机
|
||||
this.add("com.android.email.activity.Welcome");//电子邮件
|
||||
}
|
||||
};
|
||||
private List<String> appIconList = new ArrayList<String>() {{
|
||||
this.add("com_android_appstore");
|
||||
this.add("com_android_browser");
|
||||
this.add("com_android_calculator2");
|
||||
this.add("com_android_calendar");
|
||||
this.add("com_android_camera");
|
||||
this.add("com_android_camera");
|
||||
this.add("com_android_contacts");
|
||||
this.add("com_android_deskclock");
|
||||
this.add("com_android_dialer");
|
||||
this.add("com_android_dialer");
|
||||
this.add("com_android_gallery3d_app");
|
||||
this.add("com_android_mms_ui");
|
||||
this.add("com_android_music");
|
||||
this.add("com_android_providers_downloads_ui");
|
||||
this.add("com_android_quicksearchbox");
|
||||
this.add("com_android_settings");
|
||||
this.add("com_android_soundrecorder");
|
||||
this.add("com_android_stk_stkmain");
|
||||
this.add("com_android_vdieo");
|
||||
this.add("com_mediatek_filemanager");
|
||||
this.add("com_mediatek_filemanager");
|
||||
this.add("com_mediatek_fmradio");
|
||||
this.add("com_mediatek_fmradio");//收音机
|
||||
this.add("com_android_email");
|
||||
}};
|
||||
|
||||
public Drawable getFullResIcon(LauncherActivityInfo info) {
|
||||
return getFullResIcon(info, true);
|
||||
}
|
||||
|
||||
public Drawable getFullResIcon(LauncherActivityInfo info, boolean flattenDrawable) {
|
||||
//此处修改根据应用包名获取图标
|
||||
Drawable icon = null;
|
||||
|
||||
if (null != info) {
|
||||
String name = info.getComponentName().getClassName();
|
||||
Log.e("fht", "getDeskClockIcon:"+name);
|
||||
if (appClassNameList.indexOf(info.getComponentName().getClassName()) == -1) {
|
||||
icon = BitmapUtils.getRoundedBitmap(mIconProvider.getIcon(info, mIconDpi, flattenDrawable), mContext);
|
||||
} else {
|
||||
if (name.equals("com.android.calendar.AllInOneActivity")) {
|
||||
icon = BitmapUtils.createCalendarIconBitmap(mContext.getResources().getDrawable(R.drawable.mask), mContext);
|
||||
} else if (name.equals("com.android.deskclock.DeskClock")) {
|
||||
icon = BitmapUtils.getDeskClockIcon(mContext);
|
||||
} else {
|
||||
int i = appClassNameList.indexOf(name);
|
||||
String val = appIconList.get(i);
|
||||
int resID = mContext.getResources().getIdentifier(val, "drawable", "com.aoleyun.os");
|
||||
if (resID == 0) {
|
||||
icon = mIconProvider.getIcon(info, mIconDpi, flattenDrawable);
|
||||
} else {
|
||||
icon = mContext.getResources().getDrawable(resID);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// return mIconProvider.getIcon(info, mIconDpi, flattenDrawable);
|
||||
return icon;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getIconSystemState(String packageName) {
|
||||
return mIconProvider.getSystemStateForPackage(mSystemState, packageName);
|
||||
}
|
||||
|
||||
public static abstract class IconLoadRequest extends HandlerRunnable {
|
||||
IconLoadRequest(Handler handler, Runnable endRunnable) {
|
||||
super(handler, endRunnable);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Interface for receiving itemInfo with high-res icon.
|
||||
*/
|
||||
public interface ItemInfoUpdateReceiver {
|
||||
|
||||
void reapplyItemInfo(ItemInfoWithIcon info);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user