• Android13 Launcher3 定制


    去掉Google搜索栏

    aosp/packages/apps/Launcher3/src_build_config/com/android/launcher3/BuildConfig.java

    修改QSB_ON_FIRST_SCREEN为false

        public static final boolean QSB_ON_FIRST_SCREEN = false;
    
    • 1

    去掉抽屉菜单,所有应用都放到桌面

    增加控制变量

    aosp/packages/apps/Launcher3/src_build_config/com/android/launcher3/BuildConfig.java

    增加

      public static final boolean REMOVE_DRAWER = true;
    
    • 1

    aosp/packages/apps/Launcher3/src/com/android/launcher3/config/FeatureFlags.java

    增加

    public static final boolean REMOVE_DRAWER =  BuildConfig.REMOVE_DRAWER;
    
    • 1

    禁用上滑打开抽屉应用菜单

    aosp/packages/apps/Launcher3/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/PortraitStatesTouchController.java

    
     @Override
        protected boolean canInterceptTouch(MotionEvent ev) {
            if(FeatureFlags.REMOVE_DRAWER){
                return false;
            }
     		....
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    加载所有应用

    aosp/packages/apps/Launcher3/src/com/android/launcher3/model/LoaderTask.java

      public void run() {
      	...
    		Trace.beginSection("LoadAllApps");
         List<LauncherActivityInfo> allActivityList;
         try {
            allActivityList = loadAllApps();
         } finally {
             Trace.endSection();
         }
         logASplit(logger, "loadAllApps");
    
    		// 增加
         if (FeatureFlags.REMOVE_DRAWER){
             getAllApplications();
         }
    
         verifyNotStopped();
         mResults.bindAllApps();
         logASplit(logger, "bindAllApps");
         ...
      }
    
    	private void getAllApplications() {
          Log.d(TAG,"getAllApplications");
          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<ItemInstallQueue.PendingInstallShortcutInfo>added = new ArrayList<ItemInstallQueue.PendingInstallShortcutInfo>();
              synchronized (this) {
                  for (LauncherActivityInfo app :apps) {
    //                    if(app.getComponentName().getPackageName().equals("com.android.stk")||app.getComponentName().getPackageName().equals("com.android.fmradio")){
    //                        continue;
    //                    }
                      Log.d(TAG,"getAllApplications packageName: " + app.getComponentName().getPackageName());
                      ItemInstallQueue.PendingInstallShortcutInfo pendingInstallShortcutInfo
                              = new ItemInstallQueue.PendingInstallShortcutInfo(app.getActivityInfo().packageName, user);
                      added.add(pendingInstallShortcutInfo);
                      installQueue.add(pendingInstallShortcutInfo.getItemInfo(context));
                  }
              }
              if (!added.isEmpty()) {
                  mApp.getModel().addAndBindAddedWorkspaceItems(installQueue);
              }
          }
      }
        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    aosp/packages/apps/Launcher3/src/com/android/launcher3/model/ItemInstallQueue.java

    // 修改private为public
     public static class PendingInstallShortcutInfo extends ItemInfo {}
    
    • 1
    • 2

    安装的app添加到workspace工作区

    aosp/packages/apps/Launcher3/src/com/android/launcher3/model/PackageUpdatedTask.java

     @Override
        public void execute(@NonNull final LauncherAppState app, @NonNull final BgDataModel dataModel,
                @NonNull final AllAppsList appsList) {
          ...
      		bindApplicationsIfNeeded();
      			
    				// 增加
            if(FeatureFlags.REMOVE_DRAWER){
                updateToWorkSpace(context, app,appsList);
            }
    
            final IntSet removedShortcuts = new IntSet();
            // Shortcuts to keep even if the corresponding app was removed
            final IntSet forceKeepShortcuts = new IntSet();
            ...
    		}
    
    		//安装的app添加到workspace工作区
        public void updateToWorkSpace(Context context, LauncherAppState app, AllAppsList appsList){
            Log.d(TAG,"updateToWorkSpace");
            ArrayList<Pair<ItemInfo,Object>> installQueue = new ArrayList<>();
            UserManager mUserManager = app.getContext().getSystemService(UserManager.class);
            final List<UserHandle> profiles = mUserManager.getUserProfiles();
            ArrayList<ItemInstallQueue.PendingInstallShortcutInfo> added = new ArrayList<>();
            LauncherApps mLauncherApps = app.getContext().getSystemService(LauncherApps.class);
            for(UserHandle user : profiles){
                final List<LauncherActivityInfo> apps = mLauncherApps.getActivityList(null,user);
                       synchronized (this){
                            for(LauncherActivityInfo info :apps){
                                for(AppInfo appInfo : appsList.data){
                                    String packageName = info.getComponentName().getPackageName();
                                    if(info.getComponentName().equals(appInfo.componentName)){
                                       if(DEBUG){
                                           Log.d(TAG,"updateToWorkSpace packageName: " + packageName);
                                       }
                                        ItemInstallQueue.PendingInstallShortcutInfo mPendingInstallShortcutInfo
                                                        = new ItemInstallQueue.PendingInstallShortcutInfo(packageName,user);
                                        added.add(mPendingInstallShortcutInfo);
                                        installQueue.add(mPendingInstallShortcutInfo.getItemInfo(context));
                                    }
                                }
                            }
                       }
            }
            if(!added.isEmpty()){
                app.getModel().addAndBindAddedWorkspaceItems(installQueue);
            }
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    打开限制

    清除数据重新加载还能加载图标
    aosp/packages/apps/Launcher3/src/com/android/launcher3/model/AddWorkspaceItemsTask.java

    public void execute(@NonNull final LauncherAppState app, @NonNull final BgDataModel dataModel,
                @NonNull final AllAppsList apps) {
    ...
       // b/139663018 Short-circuit this logic if the icon is a system app
       if (PackageManagerHelper.isSystemApp(app.getContext(),
               Objects.requireNonNull(item.getIntent()))) {
           if (TestProtocol.sDebugTracing) {
               Log.d(TestProtocol.MISSING_PROMISE_ICON,
                       LOG + " Item is a system app.");
           }
           if(!FeatureFlags.REMOVE_DRAWER){
               continue;
           }
       }
    ...
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    这里不做修改的话如果清除所有数据,那么图标就不会加载
    aosp/packages/apps/Launcher3/src/com/android/launcher3/model/BaseModelUpdateTask.java

      @Override
        public final void run() {
            if (!Objects.requireNonNull(mModel).isModelLoaded()) {
                if (DEBUG_TASKS) {
                    Log.d(TAG, "Ignoring model task since loader is pending=" + this);
                }
                // Loader has not yet run.
                if(!FeatureFlags.REMOVE_DRAWER) {
                   return;
                }
            }
            execute(mApp, mDataModel, mAllAppsList);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    顶部菜单移除remove换成取消cancel,无法移除

    remove变成cancel

    aosp/packages/apps/Launcher3/src/com/android/launcher3/DeleteDropTarget.java

     private boolean canRemove(ItemInfo item) {
            // 增加
            if(FeatureFlags.REMOVE_DRAWER) {
                return false ;
            }
            return item.id != ItemInfo.NO_ID;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    无法删除图标

    aosp/packages/apps/Launcher3/src/com/android/launcher3/dragndrop/DragController.java

    protected void drop(DropTarget dropTarget, Runnable flingAnimation) {
    ...
     // Drop onto the target.
     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;    
    				 
    				 // 增加
              if (FeatureFlags.REMOVE_DRAWER && dropTarget instanceof DeleteDropTarget
                 && isNeedCancelDrag(mDragObject.dragInfo)
              ) {
                  cancelDrag();
              }
          }
      }
    
      final View dropTargetAsView = dropTarget instanceof View ? (View) dropTarget : null;
      dispatchDropComplete(dropTargetAsView, accepted);
    }
    
    private boolean isNeedCancelDrag(ItemInfo item){
    	return (item.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION ||
    	    item.itemType == LauncherSettings.Favorites.ITEM_TYPE_FOLDER);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    Android 13.0 桌面改成单层桌面的代码记录
    launcher3去掉抽屉菜单,所有用都放到桌面,无法拖拽删除图标,去除hotseat
    Android11去除抽屉模式

  • 相关阅读:
    品牌数字化转型|借势营销节点,3 招解锁品牌营销力
    prometheus学习1部署了解
    数据资产、数字资产、数据资源及数据资产入表
    TikTok生态圈【6.27跨境日报】TikTok夏季大甩卖利用现场活动中的游戏化
    霍夫曼树:霍夫曼编码(Huffman Tree:Huffman Coding)
    面对 HR 的空窗期提问,你会如何回答?
    javascript解决闭包漏洞的一个问题
    项目实战(依旧还是登录认证,JWT解析异常处理,授权信息处理)
    多进程间通信学习之有名管道
    【python VS vba(系列2)】 python和vba读写EXCEL文件的方式比较 (建设ing)
  • 原文地址:https://blog.csdn.net/didayuye/article/details/134426503