Androidシングルデュアルデスクトップ切り替え

17052 ワード

単一の2階層デスクトップ切り替えデータを永続化する必要があるため、単一階層デスクトップに必要なデータベーステーブルを多く作成する必要があります.
  • テーブルはストレージデスクトップアイコンで、テーブル構造はオリジナルデスクトップテーブルと同じように直接copy 1部で
  • テーブルはストレージデスクトップページであり、テーブル構造はオリジナルと同じ
  • である.
    上記の2つのテーブルを作成するときに、データベース・バージョンのアップグレードが与える影響に注意してください.
    テーブル構造はオリジナルと同じなので、ロードロジックを変更する必要はありません.オリジナルロードによって直接変更する必要があるのは、ロードされたテーブルがどのテーブルなのかです.
    単一の2階層デスクトップであるかどうかを判断する方法を確立します.この方法は単一の2階層デスクトップのフラグです.
        /**add by lmjssjj begin*/
        public static boolean isDisableAllApps(){
            return false;
        }
        /**add by lmjssjj end*/

    ロードされたデータテーブルの変更
     public static final class WorkspaceScreens implements ChangeLogColumns {
    
            public static final String TABLE_NAME = "workspaceScreens";
            /**add by lmjssjj begin*/
            public static final String TABLE_DISABLEALLAPPS_NAME = "workspaceScreens_disable_allapps";
            /**add by lmjssjj end*/
    
            /**
             * The content:// style URL for this table
             */
            static final Uri CONTENT_URI = Uri.parse("content://" +
                    ProviderConfig.AUTHORITY + "/" + /**modify by lmjssjj*/(LauncherAppState.isDisableAllApps()?TABLE_DISABLEALLAPPS_NAME:TABLE_NAME));
    
            /**
             * The rank of this screen -- ie. how it is ordered relative to the other screens.
             * 

    Type: INTEGER

    */
    public static final String SCREEN_RANK = "screenRank"; }
    public static final class Favorites implements BaseLauncherColumns {
    
            public static final String TABLE_NAME = "favorites";
            /**add by lmjssjj begin*/
            public static final String TABLE_DISABLEALLAPPS_NAME = "favorites_disable_allapps";
            /**add by lmjssjj end*/
            /**
             * The content:// style URL for this table
             */
            public static final Uri CONTENT_URI = Uri.parse("content://" +
                    ProviderConfig.AUTHORITY + "/" +/**modify by lmjssjj*/ (LauncherAppState.isDisableAllApps()?TABLE_DISABLEALLAPPS_NAME:TABLE_NAME));
    
            /**
             * The content:// style URL for a given row, identified by its id.
             *
             * @param id The row id.
             *
             * @return The unique content URL for the specified row.
             */
            public static Uri getContentUri(long id) {
                return Uri.parse("content://" + ProviderConfig.AUTHORITY +
                        "/" + (LauncherAppState.isDisableAllApps()?TABLE_DISABLEALLAPPS_NAME:TABLE_NAME) + "/" + id);
            }

    データベース・バージョンのアップグレードのためのデータベース・テーブルの追加
    //add by lmjssjj
            private void addFavoritesDisableAllappsTable(SQLiteDatabase db){
                 UserManagerCompat userManager = UserManagerCompat.getInstance(mContext);
                 long userSerialNumber =
                         userManager.getSerialNumberForUser(UserHandleCompat.myUserHandle());
                db.execSQL("CREATE TABLE favorites_disable_allapps (" + "_id INTEGER PRIMARY KEY," + "title TEXT,"
                        + "intent TEXT," + "container INTEGER," + "screen INTEGER," + "cellX INTEGER,"
                        + "cellY INTEGER," + "spanX INTEGER," + "spanY INTEGER," + "itemType INTEGER,"
                        + "appWidgetId INTEGER NOT NULL DEFAULT -1," + "isShortcut INTEGER,"
                        + "iconType INTEGER," + "iconPackage TEXT," + "iconResource TEXT,"
                        + "icon BLOB," + "uri TEXT," + "displayMode INTEGER,"
                        + "appWidgetProvider TEXT," + "modified INTEGER NOT NULL DEFAULT 0,"
                        + "restored INTEGER NOT NULL DEFAULT 0," + "profileId INTEGER DEFAULT "
                        + userSerialNumber + "," + "rank INTEGER NOT NULL DEFAULT 0,"
                        + "options INTEGER NOT NULL DEFAULT 0" + ");");
            }//end by lmjssjj
    
            private void addWorkspacesTable(SQLiteDatabase db) {
                db.execSQL("CREATE TABLE " + TABLE_WORKSPACE_SCREENS + " ("
                        + LauncherSettings.WorkspaceScreens._ID + " INTEGER PRIMARY KEY,"
                        + LauncherSettings.WorkspaceScreens.SCREEN_RANK + " INTEGER,"
                        + LauncherSettings.ChangeLogColumns.MODIFIED + " INTEGER NOT NULL DEFAULT 0"
                        + ");");
            }
     private void setFlagDisableAllAppsEmptyDbCreated() {
                String spKey = LauncherAppState.getSharedPreferencesKey();
                SharedPreferences sp = mContext.getSharedPreferences(spKey, Context.MODE_PRIVATE);
                sp.edit().putBoolean(EMPTY_DISABLEALLAPPS_DATABASE_CREATED, true).commit();
            }
    
    public void clearFlagDisableAllAppsEmptyDbCreated() {
            String spKey = LauncherAppState.getSharedPreferencesKey();
            getContext().getSharedPreferences(spKey, Context.MODE_PRIVATE).edit()
            .remove(EMPTY_DISABLEALLAPPS_DATABASE_CREATED).commit();
        }

    データベーステーブルが作成されました.次に、データベースの書き込みを変更する必要があります.上記の判断方法で書き込みの読み取りを変更するテーブルが作成されました.
     private long initializeMaxItemId(SQLiteDatabase db) {
                return getMaxId(db, LauncherAppState.isDisableAllApps()?TABLE_FAVORITES_DISABLE_ALLAPPS:TABLE_FAVORITES);
            }
    private long initializeMaxScreenId(SQLiteDatabase db) {
                return getMaxId(db, LauncherAppState.isDisableAllApps()?TABLE_WORKSPACE_SCREENS_DISABLE_ALLAPPS:TABLE_WORKSPACE_SCREENS);
            }
     @Override
            public long insertAndCheck(SQLiteDatabase db, ContentValues values) {
                return dbInsertAndCheck(this, db, LauncherAppState.isDisableAllApps()?TABLE_FAVORITES_DISABLE_ALLAPPS:TABLE_FAVORITES, null, values);
            }

    次のデータ・ロード
    boolean bl = prefs.getBoolean(LauncherAppState.isDisableAllApps()?LauncherProvider.EMPTY_DISABLEALLAPPS_DATABASE_CREATED:LauncherProvider.EMPTY_DATABASE_CREATED, false);
    if(LauncherAppState.isDisableAllApps())
                        LauncherAppState.getLauncherProvider().clearFlagDisableAllAppsEmptyDbCreated();

    単層データをロードし、二層データはオリジナルロジックに従います.
            private void loadAllAppsFirst() {
    
                    final Callbacks oldCallbacks = mCallbacks.get();
                    if (oldCallbacks == null) {
                        return;
                    }
                    final List profiles = mUserManager.getUserProfiles();
                    mBgAllAppsList.clear();
                    for (UserHandleCompat user : profiles) {
    
                        final List apps = mLauncherApps.getActivityList(null, user);
    
                        if (apps == null || apps.isEmpty()) {
                            return;
                        }
    
                        for (int i = 0; i < apps.size(); i++) {
                            LauncherActivityInfoCompat app = apps.get(i);
    
                            mBgAllAppsList.add(new AppInfo(mContext, app, user, mIconCache));
    
                        }
                        mBgAllAppsList.added.clear();
    
                }
                verifyApplications();
                updateIconCache();
    
                loadAndBindWidgetsAndShortcuts(tryGetCallbacks(oldCallbacks), true /* refresh */);
    
            }

    切り替え時に再ロードするのは、設定ページ(自分のプロセスでページを設定する)kill自身です.
    ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
                activityManager.killBackgroundProcesses(getPackageName());
    finish();

    データのマージ
    private void verifyApplications() {
            final Context context = mApp.getContext();
    
            // Cross reference all the applications in our apps list with items in
            // the workspace
            ArrayList tmpInfos;
            ArrayList added = new ArrayList();
            synchronized (sBgLock) {
                for (AppInfo app : mBgAllAppsList.data) {
                    tmpInfos = getItemInfoForComponentName(app.componentName, app.user);
                    if (tmpInfos.isEmpty()) {
                        // We are missing an application icon, so add this to the
                        // workspace
                        added.add(app);
                        // This is a rare event, so lets log it
                        Log.e(TAG, "Missing Application on load: " + app);
                    }
                }
            }
            if (!added.isEmpty()) {
                addAndBindAddedWorkspaceItems(context, added,true);
            }
        }

    まとめ:注意する必要がある1、単層デスクトップを作成するために必要なデータベース2、データベースの削除・変更3、単層デスクトップを初めてロードする場合、アプリケーションのマージ4、アプリケーションをインストールする場合5、アプリケーションをアンインストールする場合(オリジナルロジック)6、アプリケーションが更新される場合(オリジナルロジック)7、アンインストールするかアイコンを削除するかどうかを判断する8、ショートカットアイコン作成の詳細9、シングルダブル切り替え
    交流グループ:19640873