summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher3/RemoteFolderManager.java
blob: efbc9159d490bd27b80a126568ada92e0695fbf8 (plain)
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
package com.android.launcher3;

import android.util.Log;
import android.util.Pair;
import android.view.View;
import com.android.launcher3.settings.SettingsProvider;

import java.util.ArrayList;

/**
 * Manages adding and removing the remote folder from the workspace.
 */
public class RemoteFolderManager {
    private static final String TAG = "RemoteFolderManager";

    private final Launcher mLauncher;

    /** View which is displayed in the workspace **/
    private FolderIcon mRemoteFolder;
    /** Coordinates of the folder's position before being hidden **/
    private int[] mRemoteFolderCell;

    public RemoteFolderManager(final Launcher launcher) {
        mLauncher = launcher;
        mRemoteFolderCell = new int[2];
    }

    public void setRemoteFolder(final FolderIcon remoteFolder) {
        mRemoteFolder = remoteFolder;
    }

    /**
     * Called when Launcher finishes binding items from the model.
     */
    public void bindFinished() {
        boolean remoteFolderEnabled = SettingsProvider.getBoolean(mLauncher,
                SettingsProvider.SETTINGS_UI_HOMESCREEN_REMOTE_FOLDER,
                R.bool.preferences_interface_homescreen_remote_folder_default);
        if (remoteFolderEnabled && mRemoteFolder == null) {
            showRemoteFolder();
        } else if (!remoteFolderEnabled) {
            // We might load the remote folder on startup, but we shouldn't show it
            hideRemoteFolder();
        }
    }

    /**
     * Called when the setting for remote folder is updated.
     * @param newValue the new setting for remote folder
     */
    public void onSettingChanged(final boolean newValue) {
        if (newValue) {
            showRemoteFolder();
        } else {
            hideRemoteFolder();
        }
    }

    /**
     * Called when the remote folder is dropped into the delete area on the workspace.
     */
    public void onFolderDeleted() {
        hideRemoteFolder();
        SettingsProvider.putBoolean(mLauncher,
                SettingsProvider.SETTINGS_UI_HOMESCREEN_REMOTE_FOLDER, false);
        mLauncher.mOverviewSettingsPanel.notifyDataSetInvalidated();
    }

    private void showRemoteFolder() {
        int[] cell;
        long screen;
        long container;
        boolean findNewSpace = true;
        FolderInfo folderInfo = null;
        Workspace workspace = mLauncher.getWorkspace();

        // Check if we can re-add at our old location
        if (mRemoteFolder != null) {
            folderInfo = mRemoteFolder.getFolderInfo();
            CellLayout cellLayout = mLauncher.getCellLayout(
                    folderInfo.container, folderInfo.screenId);
            if (cellLayout != null
                    && !cellLayout.isOccupied(mRemoteFolderCell[0], mRemoteFolderCell[1])) {
                findNewSpace = false;
            }
        }
        if (findNewSpace) {
            // Try to find a new space to add.
            Pair<Long, int[]> space = LauncherModel.findNextAvailableIconSpace(mLauncher, null,
                    null, 0, new ArrayList<Long>(workspace.getWorkspaceScreenIds()));

            // All screens are full. Create a new screen.
            if (space == null) {
                workspace.addExtraEmptyScreen();
                screen = workspace.commitExtraEmptyScreen();
                cell = new int[2];
            } else {
                screen = space.first;
                cell = space.second;
            }

            container = LauncherSettings.Favorites.CONTAINER_DESKTOP;
        } else {
            screen = folderInfo.screenId;
            cell = mRemoteFolderCell;
            container = folderInfo.container;
        }

        // Create the folder if this is our first time showing it
        if (mRemoteFolder == null) {
            folderInfo = new FolderInfo();
            folderInfo.setTitle(mLauncher.getString(R.string.recommendations_title));
            folderInfo.setRemote(true);

            CellLayout cellLayout = mLauncher.getCellLayout(container, screen);
            mRemoteFolder = mLauncher.addFolder(cellLayout, container, screen,
                    cell[0], cell[1], folderInfo);

            mLauncher.getModel().syncRemoteFolder(folderInfo, mLauncher);
        } else {
            // Folder may be hidden by drop delete animation, so force visibility.
            mRemoteFolder.setVisibility(View.VISIBLE);
            workspace.addInScreen(mRemoteFolder, container, screen,
                    cell[0], cell[1], 1, 1, mLauncher.isWorkspaceLocked());
            mLauncher.getCellLayout(container, screen)
                    .getShortcutsAndWidgets().measureChild(mRemoteFolder);

            // Update the model
            folderInfo.cellX = cell[0];
            folderInfo.cellY = cell[1];
            folderInfo.container = container;
            folderInfo.screenId = screen;
            LauncherModel.updateItemInDatabase(mLauncher, folderInfo);
        }
    }

    private void hideRemoteFolder() {
        // Remote folder does not exist
        if (mRemoteFolder == null) {
            Log.e(TAG, "Remote folder is null");
            return;
        }

        FolderInfo info = mRemoteFolder.getFolderInfo();

        // Store our current location so we can try to re-add in the same spot later.
        mRemoteFolderCell[0] = info.cellX;
        mRemoteFolderCell[1] = info.cellY;

        // Clear the spot
        mLauncher.getCellLayout(info.container, info.screenId).removeView(mRemoteFolder);
        info.cellX = -1;
        info.cellY = -1;
        LauncherModel.updateItemInDatabase(mLauncher, info);

        // We may be removing from a screen we're on alone, so remove it if necessary.
        mLauncher.getWorkspace().removeExtraEmptyScreen(false, true);
    }
}