android 9.0 Launcher3 去掉抽屉式,显示所有 app

android 9.0 Launcher3 去掉抽屉式,显示所有 app,第1张

概述效果图修改思路1、增加全局控制变量sys.launcher3.is_full_app,用来动态切换2、增加两套布局,对应有抽屉和无抽屉3、去除allAppsButton4、将AllAppsContainerView中的图标加载到Workspace5、新安装的app自动添加图标到Workspace6、替换Workspace图标长按删除选项 效果图

修改思路

1、增加全局控制变量 sys.launcher3.is_full_app,用来动态切换

2、增加两套布局,对应有抽屉和无抽屉

3、去除 allAppsbutton

4、将 AllAppsContainerVIEw 中的图标加载到 Workspace

5、新安装的 app 自动添加图标到 Workspace

6、替换 Workspace 图标长按删除选项为取消

7、屏蔽上拉显示抽屉页面手势

8、修改页面指示线为圆点

上代码1、增加全局控制变量 sys.launcher3.is_full_app

1) 在 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、去除 allAppsbutton

vendor\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 中的图标加载到 Workspace

vendor\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 自动添加图标到 Workspace

vendor\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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1210135.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-04
下一篇2022-06-04

发表评论

登录后才能评论

评论列表(0条)

    保存