summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher3/RemoteFolderManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/launcher3/RemoteFolderManager.java')
-rw-r--r--src/com/android/launcher3/RemoteFolderManager.java159
1 files changed, 159 insertions, 0 deletions
diff --git a/src/com/android/launcher3/RemoteFolderManager.java b/src/com/android/launcher3/RemoteFolderManager.java
new file mode 100644
index 000000000..efbc9159d
--- /dev/null
+++ b/src/com/android/launcher3/RemoteFolderManager.java
@@ -0,0 +1,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);
+ }
+}