
1、增加全局控制变量 sys.launcher3.is_full_app,用来动态切换
2、增加两套布局,对应有抽屉和无抽屉
3、去除 allAppsbutton
4、将 AllAppsContainerVIEw 中的图标加载到 Workspace
5、新安装的 app 自动添加图标到 Workspace
6、替换 Workspace 图标长按删除选项为取消
7、屏蔽上拉显示抽屉页面手势
8、修改页面指示线为圆点
上代码1、增加全局控制变量 sys.launcher3.is_full_app1) 在 LauncherAppState 中增加静态方法 isdisableAllApps(), 通过修改 Settings 中自定义的值 sys.launcher3.is_full_app
vendor\mediatek\proprIEtary\packages\apps\Launcher3\src\com\androID\launcher3\LauncherAppState.java
private static Context mContext;public static boolean isdisableAllApps() { if (mContext != null) { return Settings.System.getInt(mContext.getContentResolver(), "sys.launcher3.is_full_app", 0) == 1; } return true; }vendor\mediatek\proprIEtary\packages\apps\Launcher3\AndroIDManifest-common.xml
2) AndroIDManifest-common.xml 中增加权限
<uses-permission androID:name="androID.permission.WRITE_SETTINGS" />3) 在 SettingsActivity 中增加 SwitchPreference 用以动态修改 sys.launcher3.is_full_app
vendor\mediatek\proprIEtary\packages\apps\Launcher3\src\com\androID\launcher3\SettingsActivity.java
在内部类 LauncherSettingsFragment 中重写 onPreferenceTreeClick() 用以监听 SwitchPreference 点击
/** * This fragment shows the launcher preferences. */ public static class LauncherSettingsFragment extends PreferenceFragment { ..... @OverrIDe public voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); .... //读取保存的值,初始化 SwitchPreference 的初始状态,是否选中 int isFull = Settings.System.getInt(getActivity().getContentResolver(), "sys.launcher3.is_full_app", 0); Log.d("Launcher3", "sys.launcher3.is_full_app="+isFull); SwitchPreference fullSwitch = (SwitchPreference) findPreference("pref_is_full_app"); fullSwitch.setChecked(isFull==1); } //add for change is_full_app value @OverrIDe public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { boolean result = true; final String key = preference.getKey(); if ("pref_is_full_app".equals(key)) { boolean checked = ((SwitchPreference) preference).isChecked(); Settings.System.putInt(getActivity().getContentResolver(), "sys.launcher3.is_full_app", checked ? 1 : 0); Log.e("Launcher3", "SwitchPreference checked="+checked); // Value has changed ProgressDialog.show(getActivity(), null /* Title */, getActivity().getString(R.string.full_app_overrIDe_progress), true /* indeterminate */, false /* cancelable */); new LooperExecutor(LauncherModel.getWorkerLooper()).execute( new OverrIDeApplyHandler(getActivity())); } return result; }}点击 SwitchPreference 后需要保存 sys.launcher3.is_full_app 新值,同时清除 Launcher3 的缓存,延时启动并结束当前进程
清除缓存方法 clearapplicationUserData 在 Launcher3 中编译报错,所以通过发送广播到 Setting 中进行真正的清缓存 *** 作
//add for change is_full_app value private static class OverrIDeApplyHandler implements Runnable { private final Context mContext; private OverrIDeApplyHandler(Context context) { mContext = context; } @OverrIDe public voID run() { // Clear the icon cache. LauncherAppState.getInstance(mContext).getIconCache().clear(); // Wait for it try { Thread.sleep(1000); } catch (Exception e) { Log.e("Launcher3", "Error waiting", e); } // Schedule an alarm before we kill ourself. Intent homeIntent = new Intent(Intent.ACTION_MAIN) .addcategory(Intent.category_HOME) .setPackage(mContext.getPackagename()) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); PendingIntent pi = PendingIntent.getActivity(mContext, 42, homeIntent, PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_ONE_SHOT); mContext.getSystemService(AlarmManager.class).setExact( AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 50, pi); //clear data will kill process Intent intent = new Intent("com.androID.action.CLEAR_APP_DATA"); intent.putExtra("pkgname", "com.androID.launcher3"); intent.addFlags(0x01000000); mContext.sendbroadcast(intent); Log.i("Launcher3", "Clearing user data com.androID.launcher3"); // Kill process androID.os.Process.killProcess(androID.os.Process.myPID()); } }4) SettingsActivity 对应的 xml 文件修改 launcher_preferences
vendor\mediatek\proprIEtary\packages\apps\Launcher3\res\xml\launcher_preferences.xml
<SwitchPreference androID:key="pref_is_full_app" androID:title="@string/is_full_app_Title" androID:summary="@string/is_full_app_desc" androID:defaultValue="false" androID:persistent="true" />对应的 string 文件就不贴了,自己增加下就行
2、增加两套布局,对应有抽屉和无抽屉加载布局文件对应的 xml 为 vendor\mediatek\proprIEtary\packages\apps\Launcher3\res\xml\device_profiles.xml
Launcher3 通过获取 minWIDthDps 和 minHeightDps 来确定加载哪一个 profile,我的平板分辨率是 1280*800 的,增加两个 profile 节点
<profile launcher:name="tablet" launcher:minWIDthDps="376" launcher:minHeightDps="586" launcher:numRows="4" launcher:numColumns="5" launcher:numFolderRows="4" launcher:numFolderColumns="5" launcher:iconSize="50" launcher:iconTextSize="11" launcher:numHotseatIcons="5" launcher:defaultLayoutID="@xml/default_workspace_tb_5x6" /> <profile launcher:name="tablet_no_all_app" launcher:minWIDthDps="380" launcher:minHeightDps="590" launcher:numRows="4" launcher:numColumns="5" launcher:numFolderRows="4" launcher:numFolderColumns="5" launcher:iconSize="50" launcher:iconTextSize="11" launcher:numHotseatIcons="4" launcher:defaultLayoutID="@xml/default_workspace_tb_5x6_no_all_app" />对应的你需要在 xml 文件下增加 4 个文件,分别是 default_workspace_tb_5x6.xml DW_hotseat_tb.xml default_workspace_tb_5x6_no_all_app.xml DW_hotseat_tb_no_all_app.xml
这样的好处是你可以自定义不同的布局文件加载内容,上面的配置含义简单说一下,分别是最小宽度、最小高度、布局的行和列、文件夹中布局行和列、图标大小、图标文字大小、HotSeat 个数,加载的布局文件
在 InvariantDeviceProfile() 判断是否需要加载 tablet_no_all_app profile
vendor\mediatek\proprIEtary\packages\apps\Launcher3\src\com\androID\launcher3\InvariantDeviceProfile.java
public InvariantDeviceProfile(Context context) { WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); display display = wm.getDefaultdisplay(); displayMetrics dm = new displayMetrics(); display.getMetrics(dm); Point smallestSize = new Point(); Point largestSize = new Point(); display.getCurrentSizeRange(smallestSize, largestSize); // This guarantees that wIDth < height minWIDthDps = UtilitIEs.dpiFromPx(Math.min(smallestSize.x, smallestSize.y), dm); minHeightDps = UtilitIEs.dpiFromPx(Math.min(largestSize.x, largestSize.y), dm); Log.i("Launcher3.profiles", "orignalminWIDthDps="+minWIDthDps + " orignalminHeightDps="+minHeightDps); //add for load no_all_app xml if (LauncherAppState.isdisableAllApps()) { Log.e("Launcher3.profiles", "load no all app profiles"); //对应 device_profiles.xml 中 tablet_no_all_app 的值 minWIDthDps = 380.0f; minHeightDps = 590.0f; } .....}3、去除 allAppsbuttonvendor\mediatek\proprIEtary\packages\apps\Launcher3\src\com\androID\launcher3\Hotseat.java
将 resetLayout() 中 FeatureFlags.NO_ALL_APPS_ICON 替换为 LauncherAppState.isdisableAllApps()
voID resetLayout(boolean hasverticalHotseat) { mContent.removeAllVIEwsInLayout(); mHasverticalHotseat = hasverticalHotseat; InvariantDeviceProfile IDp = mLauncher.getDeviceProfile().inv; if (hasverticalHotseat) { mContent.setGrIDSize(1, IDp.numHotseatIcons); } else { mContent.setGrIDSize(IDp.numHotseatIcons, 1); } //if (!FeatureFlags.NO_ALL_APPS_ICON) { /// add for check is need allappbutton if (!LauncherAppState.isdisableAllApps()) { // Add the Apps button Context context = getContext(); DeviceProfile grID = mLauncher.getDeviceProfile(); ...}4、将 AllAppsContainerVIEw 中的图标加载到 Workspacevendor\mediatek\proprIEtary\packages\apps\Launcher3\src\com\androID\launcher3\model\LoaderTask.java
run() 中增加判断,添加 verifyApplications(), 修改 InstallShortcutReceiver 中 PendingInstallShortcutInfo 为 public
public voID run() { synchronized (this) { // Skip fast if we are already stopped. if (mStopped) { return; } } .... // second step TraceHelper.partitionSection(TAG, "step 2.1: loading all apps"); loadAllApps(); //add for load all app on workspace if (LauncherAppState.isdisableAllApps()) { androID.util.Log.e("Launcher3", "verifyApplications()"); verifyApplications(); } ....} //add for load all app on workspaceprivate voID verifyApplications() { final Context context = mApp.getContext(); ArrayList<Pair<ItemInfo, Object>> installQueue = new ArrayList<>(); final List<UserHandle> profiles = mUserManager.getUserProfiles(); for (UserHandle user : profiles) { final List<LauncherActivityInfo> apps = mLauncherApps.getActivityList(null, user); ArrayList<InstallShortcutReceiver.PendingInstallShortcutInfo> added = new ArrayList<InstallShortcutReceiver.PendingInstallShortcutInfo>(); synchronized (this) { for (LauncherActivityInfo app : apps) { InstallShortcutReceiver.PendingInstallShortcutInfo pendingInstallShortcutInfo = new InstallShortcutReceiver.PendingInstallShortcutInfo(app, context); added.add(pendingInstallShortcutInfo); installQueue.add(pendingInstallShortcutInfo.getItemInfo()); } } if (!added.isEmpty()) { mApp.getModel().addAndBindAddeDWorkspaceItems(installQueue); } } }vendor\mediatek\proprIEtary\packages\apps\Launcher3\src\com\androID\launcher3\model\BaseModelUpdateTask.java
注释 run() 中的 return
@OverrIDe public final voID run() { if (!mModel.isModelLoaded()) { if (DEBUG_TASKS) { Log.d(TAG, "Ignoring model task since loader is pending=" + this); } // Loader has not yet run. //annotaion for load all app on workspace // return; } execute(mApp, mDataModel, mAllAppsList); }5、新安装的 app 自动添加图标到 Workspacevendor\mediatek\proprIEtary\packages\apps\Launcher3\src\com\androID\launcher3\model\PackageUpdatedTask.java
execute() 中增加判断,添加 updatetoWorkSpace()
public voID execute(LauncherAppState app, BgDataModel dataModel, AllAppsList appsList) { .... final ArrayList<AppInfo> addedOrModifIEd = new ArrayList<>(); addedOrModifIEd.addAll(appsList.added); //add for load new install app on workspace if (LauncherAppState.isdisableAllApps()) { androID.util.Log.e("cczLauncher3", "updatetoWorkSpace()"); updatetoWorkSpace(context, app, appsList); } ...}//add for load new install app on workspacepublic voID updatetoWorkSpace(Context context, LauncherAppState app , AllAppsList appsList){ ArrayList<Pair<ItemInfo, Object>> installQueue = new ArrayList<>(); final List<UserHandle> profiles = UserManagerCompat.getInstance(context).getUserProfiles(); ArrayList<InstallShortcutReceiver.PendingInstallShortcutInfo> added = new ArrayList<InstallShortcutReceiver.PendingInstallShortcutInfo>(); for (UserHandle user : profiles) { final List<LauncherActivityInfo> apps = LauncherAppsCompat.getInstance(context).getActivityList(null, user); synchronized (this) { for (LauncherActivityInfo info : apps) { for (AppInfo appInfo : appsList.added) { if(info.getComponentname().equals(appInfo.componentname)){ InstallShortcutReceiver.PendingInstallShortcutInfo mPendingInstallShortcutInfo = new InstallShortcutReceiver.PendingInstallShortcutInfo(info,context); added.add(mPendingInstallShortcutInfo); installQueue.add(mPendingInstallShortcutInfo.getItemInfo()); } } } } } if (!added.isEmpty()) { app.getModel().addAndBindAddeDWorkspaceItems(installQueue); } }6、替换 Workspace 图标长按删除选项为取消vendor\mediatek\proprIEtary\packages\apps\Launcher3\src\com\androID\launcher3\DeleteDropTarget.java
在 setTextBasedOnDragSource() 、setControlTypeBasedOnDragSource()、onAccessibilityDrop() 中分别增加判断是否需要删除图标
private voID setTextBasedOnDragSource(ItemInfo item) { if (!TextUtils.isEmpty(mText)) { mText = getResources().getString(item.ID != ItemInfo.NO_ID ? R.string.remove_drop_target_label : androID.R.string.cancel); //add for hIDe deletedroptarget if (LauncherAppState.isdisableAllApps()) { androID.util.Log.e("Launcher3", "hIDe delete drop target"); mText = getResources().getString(isCanDrop(item) ? R.string.remove_drop_target_label : androID.R.string.cancel); } requestLayout(); } } private voID setControlTypeBasedOnDragSource(ItemInfo item) { mControlType = item.ID != ItemInfo.NO_ID ? ControlType.REMOVE_TARGET : ControlType.CANCEL_TARGET; //add for hIDe deletedroptarget [S] if (LauncherAppState.isdisableAllApps()) { mControlType = isCanDrop(item) ? ControlType.REMOVE_TARGET : ControlType.CANCEL_TARGET; } }public voID onAccessibilityDrop(VIEw vIEw, ItemInfo item) { // Remove the item from launcher and the db, we can ignore the containerInfo in this call // because we already remove the drag vIEw from the folder (if the drag originated from // a folder) in Folder.beginDrag() //add if juge is need remove item from workspace if (!LauncherAppState.isdisableAllApps() || isCanDrop(item)) { mLauncher.removeItem(vIEw, item, true /* deleteFromDb */); mLauncher.getWorkspace().stripEmptyScreens(); mLauncher.getDragLayer() .announceForAccessibility(getContext().getString(R.string.item_removed)); }}private boolean isCanDrop(ItemInfo item){ return !(item.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPliCATION || item.itemType == LauncherSettings.Favorites.ITEM_TYPE_FolDER);}vendor\mediatek\proprIEtary\packages\apps\Launcher3\src\com\androID\launcher3\dragndrop\DragController.java
drop() 中增加判断,取消当前拖拽 *** 作
private voID drop(DropTarget dropTarget, Runnable flingAnimation) { .... boolean accepted = false; if (dropTarget != null) { dropTarget.onDragExit(mDragObject); if (dropTarget.acceptDrop(mDragObject)) { if (flingAnimation != null) { flingAnimation.run(); } else { dropTarget.onDrop(mDragObject, mOptions); } accepted = true; //add for cancel canceldroptarget handle if (LauncherAppState.isdisableAllApps() && dropTarget instanceof DeleteDropTarget && isNeedCancelDrag(mDragObject.dragInfo)) { cancelDrag(); } } } ...}private boolean isNeedCancelDrag(ItemInfo item){ return (item.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPliCATION || item.itemType == LauncherSettings.Favorites.ITEM_TYPE_FolDER); }7、屏蔽上拉显示抽屉页面手势vendor\mediatek\proprIEtary\packages\apps\Launcher3\quickstep\src\com\androID\launcher3\uioverrIDes\OvervIEwToAllAppstouchController.java
canIntercepttouch() 中增加判断是否直接拦截
@OverrIDe protected boolean canIntercepttouch(MotionEvent ev) { //add for forbIDden workspace drag change GradIEntVIEw alph if (LauncherAppState.isdisableAllApps()){ androID.util.Log.e("Launcher3", "canIntercepttouch()"); return false; } if (mCurrentAnimation != null) { // If we are already animating from a prevIoUs state, we can intercept. return true; } if (AbstractfloatingVIEw.gettopOpenVIEw(mLauncher) != null) { return false; } if (mLauncher.isInState(ALL_APPS)) { // In all-apps only Listen if the container cannot scroll itself return mLauncher.getAppsVIEw().shouldContainerScroll(ev); } else if (mLauncher.isInState(norMAL)) { return true; } else if (mLauncher.isInState(OVERVIEW)) { RecentsVIEw rv = mLauncher.getovervIEwPanel(); return ev.getY() > (rv.getBottom() - rv.getpaddingBottom()); } else { return false; } }8、修改页面指示线为圆点vendor\mediatek\proprIEtary\packages\apps\Launcher3\res\layout\launcher.xml
WorkspacePageIndicator 改为 PageIndicatorDots
<com.androID.launcher3.pageindicators.PageIndicatorDots androID:ID="@+ID/page_indicator" androID:layout_wIDth="match_parent" androID:layout_height="4dp" androID:layout_gravity="bottom|center_horizontal" androID:theme="@style/HomeScreenElementtheme" />vendor\mediatek\proprIEtary\packages\apps\Launcher3\src\com\androID\launcher3\pageindicators\PageIndicatorDots.java
增加 PageIndicatorDots 继承 Insettable,复写setInsets(), 调整圆点的位置
public class PageIndicatorDots extends VIEw implements PageIndicator, Insettable {// add for change WorkspacePageIndicator line to dot @OverrIDe public voID setInsets(Rect insets) { DeviceProfile grID = mLauncher.getDeviceProfile(); FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams(); if (grID.isverticalbarLayout()) { Rect padding = grID.workspacepadding; lp.leftmargin = padding.left + grID.workspaceCellpaddingXPx; lp.rightmargin = padding.right + grID.workspaceCellpaddingXPx; lp.bottommargin = padding.bottom; } else { lp.leftmargin = lp.rightmargin = 0; lp.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BottOM; lp.bottommargin = grID.hotseatbarSizePx + insets.bottom; } setLayoutParams(lp); } @OverrIDe public voID setScroll(int currentScroll, int totalScroll) { if (mNumPages > 1) { if (mIsRtl) { currentScroll = totalScroll - currentScroll; } int scrollPerPage = totalScroll / (mNumPages - 1); // add for change WorkspacePageIndicator line to dot if (scrollPerPage == 0) { return; } int pagetoleft = currentScroll / scrollPerPage; int pagetoleftScroll = pagetoleft * scrollPerPage; int pagetoRightScroll = pagetoleftScroll + scrollPerPage; ...}vendor\mediatek\proprIEtary\packages\apps\Launcher3\src\com\androID\launcher3\states\SpringLoadedState.java
注释 setShouldautoHIDe(),避免长按 workSpace 时发生崩溃
@OverrIDe public voID onStateEnabled(Launcher launcher) { Workspace ws = launcher.getWorkspace(); ws.showPageIndicatorAtCurrentScroll(); //annotaion for WorkspacePageIndicator line to dot // ws.getPageIndicator().setShouldautoHIDe(false); // Prevent any Un/InstallShortcutReceivers from updating the db while we are // in spring loaded mode InstallShortcutReceiver.enableInstallQueue(InstallShortcutReceiver.FLAG_DRAG_AND_DROP); launcher.getRotationHelper().setCurrentStateRequest(REQUEST_LOCK); } @OverrIDe public voID onStateDisabled(final Launcher launcher) { //annotaion for WorkspacePageIndicator line to dot // launcher.getWorkspace().getPageIndicator().setShouldautoHIDe(true); // Re-enable any Un/InstallShortcutReceiver and Now process any queued items InstallShortcutReceiver.disableAndFlushInstallQueue( InstallShortcutReceiver.FLAG_DRAG_AND_DROP, launcher); }总结欢迎关注我的英文公众号【十句英文】,每日1首英文金曲+10句英文,伴你共同进步。
微信扫一扫下方二维码即可关注:
以上是内存溢出为你收集整理的android 9.0 Launcher3 去掉抽屉式,显示所有 app全部内容,希望文章能够帮你解决android 9.0 Launcher3 去掉抽屉式,显示所有 app所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)