summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--AndroidManifest.xml1
-rw-r--r--RemoteFolder/src/com.cyngn.RemoteFolder/RemoteFolderUpdater.java15
-rw-r--r--res/layout/remote_folder.xml11
-rw-r--r--res/values/preferences_defaults.xml1
-rw-r--r--src/com/android/launcher3/DeleteDropTarget.java12
-rw-r--r--src/com/android/launcher3/Folder.java12
-rw-r--r--src/com/android/launcher3/FolderIcon.java2
-rw-r--r--src/com/android/launcher3/FolderInfo.java20
-rw-r--r--src/com/android/launcher3/Launcher.java41
-rw-r--r--src/com/android/launcher3/LauncherModel.java23
-rw-r--r--src/com/android/launcher3/LauncherSettings.java2
-rw-r--r--src/com/android/launcher3/OverviewSettingsPanel.java7
-rw-r--r--src/com/android/launcher3/RemoteFolder.java37
-rw-r--r--src/com/android/launcher3/RemoteFolderManager.java159
-rw-r--r--src/com/android/launcher3/Workspace.java8
-rw-r--r--src/com/android/launcher3/list/SettingsPinnedHeaderAdapter.java19
-rw-r--r--src/com/android/launcher3/settings/SettingsProvider.java1
17 files changed, 265 insertions, 106 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index d4334242f..2b35a5b89 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -68,6 +68,7 @@
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.BROADCAST_STICKY"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
+ <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="com.android.launcher.permission.WRITE_SETTINGS" />
<uses-permission android:name="com.android.launcher3.permission.READ_SETTINGS" />
diff --git a/RemoteFolder/src/com.cyngn.RemoteFolder/RemoteFolderUpdater.java b/RemoteFolder/src/com.cyngn.RemoteFolder/RemoteFolderUpdater.java
index eb0da80e8..1322c057d 100644
--- a/RemoteFolder/src/com.cyngn.RemoteFolder/RemoteFolderUpdater.java
+++ b/RemoteFolder/src/com.cyngn.RemoteFolder/RemoteFolderUpdater.java
@@ -11,11 +11,26 @@ public class RemoteFolderUpdater {
private static final String TAG = "RemoteFolderUpdater";
+ private static final Object sLock = new Object();
+ private static RemoteFolderUpdater sInstance;
+
public interface RemoteFolderUpdateListener {
void onSuccess(List<RemoteFolderInfo> remoteFolderInfoList);
void onFailure(String error);
}
+ public static RemoteFolderUpdater getInstance() {
+ synchronized (sLock) {
+ if (sInstance == null) {
+ sInstance = new RemoteFolderUpdater();
+ }
+
+ return sInstance;
+ }
+ }
+
+ private RemoteFolderUpdater() { }
+
/**
* Requests data needed by remote folders.
* @param context
diff --git a/res/layout/remote_folder.xml b/res/layout/remote_folder.xml
index b185a2109..ffbcb645c 100644
--- a/res/layout/remote_folder.xml
+++ b/res/layout/remote_folder.xml
@@ -92,17 +92,6 @@ android:background="@drawable/folder_bg">
android:layout_alignParentRight="true"
/>
- <Button
- android:id="@+id/disable_remote_folder_button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:minHeight="@dimen/folder_lock_icon"
- android:text="@string/disable"
- android:layout_below="@id/help_text_view"
- android:layout_toLeftOf="@id/close_info_button"
- android:layout_alignParentBottom="true"
- />
-
</RelativeLayout>
<ScrollView
diff --git a/res/values/preferences_defaults.xml b/res/values/preferences_defaults.xml
index 5693dbb75..fd82dbffa 100644
--- a/res/values/preferences_defaults.xml
+++ b/res/values/preferences_defaults.xml
@@ -6,6 +6,7 @@
<bool name="preferences_interface_homescreen_scrolling_page_outlines_default">@bool/config_workspaceDefaultShowOutlines</bool>
<bool name="preferences_interface_homescreen_scrolling_fade_adjacent_default">@@bool/config_workspaceFadeAdjacentScreens</bool>
<bool name="preferences_interface_homescreen_hide_icon_labels_default">false</bool>
+ <bool name="preferences_interface_homescreen_remote_folder_default">false</bool>
<string name="preferences_interface_drawer_scrolling_transition_effect">none</string>
<bool name="preferences_interface_drawer_scrolling_fade_adjacent_default">false</bool>
<bool name="preferences_interface_drawer_remove_hidden_apps_shortcuts_default">true</bool>
diff --git a/src/com/android/launcher3/DeleteDropTarget.java b/src/com/android/launcher3/DeleteDropTarget.java
index ea058ea71..74b21df50 100644
--- a/src/com/android/launcher3/DeleteDropTarget.java
+++ b/src/com/android/launcher3/DeleteDropTarget.java
@@ -330,10 +330,16 @@ public class DeleteDropTarget extends ButtonDropTarget {
} else if (isWorkspaceOrFolderApplication(d)) {
LauncherModel.deleteItemFromDatabase(mLauncher, item);
} else if (isWorkspaceFolder(d)) {
- // Remove the folder from the workspace and delete the contents from launcher model
FolderInfo folderInfo = (FolderInfo) item;
- mLauncher.removeFolder(folderInfo);
- LauncherModel.deleteFolderContentsFromDatabase(mLauncher, folderInfo);
+
+ // Remote folder should not really be deleted. Let the manager handle it.
+ if (folderInfo.isRemote()) {
+ mLauncher.getRemoteFolderManager().onFolderDeleted();
+ } else {
+ // Remove the folder from the workspace and delete the contents from launcher model
+ mLauncher.removeFolder(folderInfo);
+ LauncherModel.deleteFolderContentsFromDatabase(mLauncher, folderInfo);
+ }
} else if (isWorkspaceOrFolderWidget(d)) {
// Remove the widget from the workspace
mLauncher.removeAppWidget((LauncherAppWidgetInfo) item);
diff --git a/src/com/android/launcher3/Folder.java b/src/com/android/launcher3/Folder.java
index 4cc328c5a..a0bb2dc93 100644
--- a/src/com/android/launcher3/Folder.java
+++ b/src/com/android/launcher3/Folder.java
@@ -486,9 +486,9 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
mInfo = info;
final ArrayList<ShortcutInfo> children = info.contents;
- if (info.subType == FolderInfo.REMOTE_SUBTYPE && children.isEmpty()) {
+ if (info.isRemote() && children.isEmpty()) {
final int count = 6;
- RemoteFolderUpdater updater = mLauncher.getRemoteFolderUpdaterInstance();
+ RemoteFolderUpdater updater = RemoteFolderUpdater.getInstance();
updater.requestSync(getContext(), count, new RemoteFolderUpdater.RemoteFolderUpdateListener() {
@Override
public void onSuccess(List<RemoteFolderUpdater.RemoteFolderInfo> remoteFolderInfoList) {
@@ -699,7 +699,7 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
circX, circY, 0, mScreenWidth);
final View[] alphaViewSet;
- if (mInfo.subType == FolderInfo.REMOTE_SUBTYPE) {
+ if (mInfo.isRemote()) {
alphaViewSet = new View[] { mContent, mFolderName };
} else {
alphaViewSet = new View[] { mFolderNameLockContainer,
@@ -1517,7 +1517,7 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
}
private void replaceFolderWithFinalItem() {
- if (mInfo.subType == FolderInfo.REMOTE_SUBTYPE) {
+ if (mInfo.isRemote()) {
return;
}
@@ -1681,8 +1681,8 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList
mLauncher, item, mInfo.id, 0, item.cellX, item.cellY);
// If this is a Remote Folder, we need to register each view with our updater for click handling.
- if (mInfo.subType == FolderInfo.REMOTE_SUBTYPE) {
- RemoteFolderUpdater updater = mLauncher.getModel().getRemoteFolderUpdaterInstance();
+ if (mInfo.isRemote()) {
+ RemoteFolderUpdater updater = RemoteFolderUpdater.getInstance();
updater.registerViewForInteraction(getViewForInfo(item), item.getIntent());
}
diff --git a/src/com/android/launcher3/FolderIcon.java b/src/com/android/launcher3/FolderIcon.java
index b66d5b70d..c41485668 100644
--- a/src/com/android/launcher3/FolderIcon.java
+++ b/src/com/android/launcher3/FolderIcon.java
@@ -170,7 +170,7 @@ public class FolderIcon extends FrameLayout implements FolderListener {
icon.mLauncher = launcher;
icon.setContentDescription(String.format(launcher.getString(R.string.folder_name_format),
folderInfo.title));
- if (folderInfo.subType == FolderInfo.REMOTE_SUBTYPE) {
+ if (folderInfo.isRemote()) {
RemoteFolder folder = RemoteFolder.fromXml(launcher);
folder.setDragController(launcher.getDragController());
folder.setFolderIcon(icon);
diff --git a/src/com/android/launcher3/FolderInfo.java b/src/com/android/launcher3/FolderInfo.java
index af9cf070b..abc6c2736 100644
--- a/src/com/android/launcher3/FolderInfo.java
+++ b/src/com/android/launcher3/FolderInfo.java
@@ -75,6 +75,25 @@ public class FolderInfo extends ItemInfo {
itemsChanged();
}
+ /**
+ * @return true if this info represents a remote folder, false otherwise
+ */
+ public boolean isRemote() {
+ return (subType & REMOTE_SUBTYPE) != 0;
+ }
+
+ /**
+ * Set flag indicating whether this folder is remote
+ * @param remote true if folder is remote, false otherwise
+ */
+ public void setRemote(final boolean remote) {
+ if (remote) {
+ subType |= REMOTE_SUBTYPE;
+ } else {
+ subType &= ~REMOTE_SUBTYPE;
+ }
+ }
+
public void setTitle(CharSequence title) {
this.title = title;
for (int i = 0; i < listeners.size(); i++) {
@@ -87,6 +106,7 @@ public class FolderInfo extends ItemInfo {
super.onAddToDatabase(context, values);
values.put(LauncherSettings.Favorites.TITLE, title.toString());
values.put(LauncherSettings.Favorites.HIDDEN, hidden ? 1 : 0);
+ values.put(LauncherSettings.BaseLauncherColumns.SUBTYPE, subType);
}
void addListener(FolderListener listener) {
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index b734ad032..5567a58c0 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -32,9 +32,7 @@ import android.app.AlertDialog;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
-import android.app.Dialog;
import android.app.SearchManager;
-import android.appwidget.AppWidgetHost;
import android.appwidget.AppWidgetHostView;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProviderInfo;
@@ -62,7 +60,6 @@ import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.Rect;
-import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.AsyncTask;
@@ -73,8 +70,6 @@ import android.os.Handler;
import android.os.Message;
import android.os.StrictMode;
import android.os.SystemClock;
-import android.os.UserHandle;
-import android.preference.PreferenceManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.Selection;
@@ -82,7 +77,6 @@ import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import android.text.method.TextKeyListener;
import android.util.Log;
-import android.util.Pair;
import android.view.Display;
import android.view.Gravity;
import android.view.HapticFeedbackConstants;
@@ -124,8 +118,6 @@ import com.android.launcher3.compat.UserManagerCompat;
import com.android.launcher3.PagedView.TransitionEffect;
import com.android.launcher3.settings.SettingsProvider;
import com.android.launcher3.stats.LauncherStats;
-import com.android.launcher3.stats.internal.service.AggregationIntentService;
-import com.cyngn.RemoteFolder.RemoteFolderUpdater;
import java.io.DataInputStream;
import java.io.DataOutputStream;
@@ -295,6 +287,7 @@ public class Launcher extends Activity
private DynamicGridSizeFragment mDynamicGridSizeFragment;
private LauncherClings mLauncherClings;
protected HiddenFolderFragment mHiddenFolderFragment;
+ private RemoteFolderManager mRemoteFolderManager;
private AppWidgetManagerCompat mAppWidgetManager;
private LauncherAppWidgetHost mAppWidgetHost;
@@ -404,9 +397,6 @@ public class Launcher extends Activity
private BubbleTextView mWaitingForResume;
- // Remote Folder Updater, used in Workspace and Folder
- private RemoteFolderUpdater remoteFolderUpdater;
-
// Search widget
int mSearchWidgetId;
AppWidgetProviderInfo mSearchWidgetInfo;
@@ -516,6 +506,8 @@ public class Launcher extends Activity
mAppWidgetHost = new LauncherAppWidgetHost(this, APPWIDGET_HOST_ID);
mAppWidgetHost.startListening();
+ mRemoteFolderManager = new RemoteFolderManager(this);
+
// If we are getting an onCreate, we can actually preempt onResume and unset mPaused here,
// this also ensures that any synchronous binding below doesn't re-trigger another
// LauncherModel load.
@@ -2256,6 +2248,10 @@ public class Launcher extends Activity
return mWorkspace;
}
+ public RemoteFolderManager getRemoteFolderManager() {
+ return mRemoteFolderManager;
+ }
+
public Hotseat getHotseat() {
return mHotseat;
}
@@ -2806,10 +2802,14 @@ public class Launcher extends Activity
}
FolderIcon addFolder(CellLayout layout, long container, final long screenId, int cellX,
- int cellY) {
- final FolderInfo folderInfo = new FolderInfo();
+ int cellY) {
+ FolderInfo folderInfo = new FolderInfo();
folderInfo.title = getText(R.string.folder_name);
+ return addFolder(layout, container, screenId, cellX, cellY, folderInfo);
+ }
+ FolderIcon addFolder(CellLayout layout, long container, final long screenId, int cellX,
+ int cellY, FolderInfo folderInfo) {
// Update the model
LauncherModel.addItemToDatabase(Launcher.this, folderInfo, container, screenId, cellX, cellY,
false);
@@ -3230,7 +3230,7 @@ public class Launcher extends Activity
// Open the requested folder
openFolder(folderIcon, folderTouchXYOffset);
- if (info.subType == FolderInfo.REMOTE_SUBTYPE) {
+ if (info.isRemote()) {
mModel.syncRemoteFolder(info, this);
}
} else {
@@ -4948,6 +4948,10 @@ public class Launcher extends Activity
newFolder.setTextVisible(!mHideIconLabels);
workspace.addInScreenFromBind(newFolder, item.container, item.screenId, item.cellX,
item.cellY, 1, 1);
+
+ if (((FolderInfo) item).isRemote()) {
+ mRemoteFolderManager.setRemoteFolder(newFolder);
+ }
break;
default:
throw new RuntimeException("Invalid Item Type");
@@ -5199,6 +5203,8 @@ public class Launcher extends Activity
mWorkspace.resetOverviewMode();
}
mModel.updateCount();
+
+ mRemoteFolderManager.bindFinished();
}
private void sendLoadingCompleteBroadcastIfNecessary() {
@@ -5946,13 +5952,6 @@ public class Launcher extends Activity
SettingsProvider.SETTINGS_UI_HOMESCREEN_SEARCH,
R.bool.preferences_interface_homescreen_search_default);
}
-
- public RemoteFolderUpdater getRemoteFolderUpdaterInstance() {
- if (remoteFolderUpdater == null) {
- remoteFolderUpdater = new RemoteFolderUpdater();
- }
- return remoteFolderUpdater;
- }
}
interface LauncherTransitionable {
diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java
index 3a0428557..365396b16 100644
--- a/src/com/android/launcher3/LauncherModel.java
+++ b/src/com/android/launcher3/LauncherModel.java
@@ -2393,7 +2393,7 @@ public class LauncherModel extends BroadcastReceiver
sBgItemsIdMap.put(folderInfo.id, folderInfo);
sBgFolders.put(folderInfo.id, folderInfo);
- if (folderInfo.subType == FolderInfo.REMOTE_SUBTYPE) {
+ if (folderInfo.isRemote()) {
syncRemoteFolder(folderInfo, mContext);
}
@@ -2872,7 +2872,7 @@ public class LauncherModel extends BroadcastReceiver
}
workspaceItems.remove(i);
folders.remove(Long.valueOf(item.id));
- } else if (folder.contents.size() == 0 && folder.subType == 0) {
+ } else if (folder.contents.size() == 0 && !folder.isRemote()) {
LauncherModel.deleteFolderContentsFromDatabase(mContext, folder);
workspaceItems.remove(i);
folders.remove(Long.valueOf(item.id));
@@ -4259,25 +4259,8 @@ public class LauncherModel extends BroadcastReceiver
return mCallbacks != null ? mCallbacks.get() : null;
}
- public static RemoteFolderUpdater getRemoteFolderUpdaterInstance() {
- if (remoteFolderUpdater == null) {
- remoteFolderUpdater = new RemoteFolderUpdater();
- }
- return remoteFolderUpdater;
- }
-
protected synchronized void syncRemoteFolder(final FolderInfo folderInfo, final Context context) {
-
- String spKey = LauncherAppState.getSharedPreferencesKey();
- SharedPreferences sp = context.getSharedPreferences(spKey, Context.MODE_PRIVATE);
- boolean isEnabled = sp.getBoolean(RemoteFolder.REMOTE_FOLDER_ENABLED, true);
-
- if (!isEnabled) {
- Log.e(TAG, "Prevented remote folder sync, since it has been explicitly disabled.");
- return;
- }
-
- RemoteFolderUpdater updater = getRemoteFolderUpdaterInstance();
+ RemoteFolderUpdater updater = RemoteFolderUpdater.getInstance();
final int count = 6;
updater.requestSync(context, count, new RemoteFolderUpdater.RemoteFolderUpdateListener() {
diff --git a/src/com/android/launcher3/LauncherSettings.java b/src/com/android/launcher3/LauncherSettings.java
index 50aa5c4db..d7df5a714 100644
--- a/src/com/android/launcher3/LauncherSettings.java
+++ b/src/com/android/launcher3/LauncherSettings.java
@@ -262,8 +262,6 @@ class LauncherSettings {
*/
static final int ITEM_TYPE_WIDGET_PHOTO_FRAME = 1002;
- static final int ITEM_TYPE_REMOTE_FOLDER = 2000;
-
/**
* The appWidgetId of the widget
*
diff --git a/src/com/android/launcher3/OverviewSettingsPanel.java b/src/com/android/launcher3/OverviewSettingsPanel.java
index fef164383..58567abea 100644
--- a/src/com/android/launcher3/OverviewSettingsPanel.java
+++ b/src/com/android/launcher3/OverviewSettingsPanel.java
@@ -46,7 +46,8 @@ public class OverviewSettingsPanel {
res.getString(R.string.scroll_effect_text),
res.getString(R.string.icon_labels),
res.getString(R.string.scrolling_wallpaper),
- res.getString(R.string.grid_size_text)};
+ res.getString(R.string.grid_size_text),
+ res.getString(R.string.recommendations_title)};
String[] valuesDrawer = new String[] {
res.getString(R.string.drawer_type),
@@ -174,7 +175,8 @@ public class OverviewSettingsPanel {
res.getString(R.string.scroll_effect_text),
res.getString(R.string.icon_labels),
res.getString(R.string.scrolling_wallpaper),
- res.getString(R.string.grid_size_text)};
+ res.getString(R.string.grid_size_text),
+ res.getString(R.string.recommendations_title)};
mSettingsAdapter.changeCursor(0, createCursor(res
.getString(R.string.home_screen_settings), values));
}
@@ -192,7 +194,6 @@ public class OverviewSettingsPanel {
mSettingsAdapter.notifyDataSetInvalidated();
}
-
class SettingsSimplePanelSlideListener extends SlidingUpPanelLayout.SimplePanelSlideListener {
ImageView mAnimatedArrow;
diff --git a/src/com/android/launcher3/RemoteFolder.java b/src/com/android/launcher3/RemoteFolder.java
index 0d33a5536..9478ea641 100644
--- a/src/com/android/launcher3/RemoteFolder.java
+++ b/src/com/android/launcher3/RemoteFolder.java
@@ -24,7 +24,6 @@ public class RemoteFolder extends Folder {
private ImageView mFolderInfo;
private TextView mFolderHelpText;
private Button mCloseInfoButton;
- private Button mDisableFolderButton;
private View mFolderInfoContainer;
private int mFolderInfoContainerHeight;
@@ -82,11 +81,6 @@ public class RemoteFolder extends Folder {
mCloseInfoButton.measure(measureSpec, measureSpec);
mButtonHeight = mCloseInfoButton.getMeasuredHeight();
mCloseInfoButton.setOnClickListener(this);
-
- mDisableFolderButton = (Button) findViewById(R.id.disable_remote_folder_button);
- mDisableFolderButton.setText(getResources().getString(R.string.disable));
- mDisableFolderButton.measure(measureSpec, measureSpec);
- mDisableFolderButton.setOnClickListener(this);
}
protected int getFolderHeight() {
@@ -146,8 +140,6 @@ public class RemoteFolder extends Folder {
mFolderInfoIconHeight + mHelpTextHeight + mButtonHeight, MeasureSpec.EXACTLY));
mCloseInfoButton.measure(contentAreaWidthSpec,
MeasureSpec.makeMeasureSpec(mButtonHeight, MeasureSpec.EXACTLY));
- mDisableFolderButton.measure(contentAreaWidthSpec,
- MeasureSpec.makeMeasureSpec(mButtonHeight, MeasureSpec.EXACTLY));
} else {
mHelpTextHeight = 0;
mFolderHelpText.measure(contentAreaWidthSpec, MeasureSpec.makeMeasureSpec(
@@ -156,8 +148,6 @@ public class RemoteFolder extends Folder {
MeasureSpec.makeMeasureSpec(mFolderInfoIconHeight, MeasureSpec.EXACTLY));
mCloseInfoButton.measure(contentAreaWidthSpec,
MeasureSpec.makeMeasureSpec(0, MeasureSpec.EXACTLY));
- mDisableFolderButton.measure(contentAreaWidthSpec,
- MeasureSpec.makeMeasureSpec(0, MeasureSpec.EXACTLY));
}
Log.e(TAG, "onMeasure(), width: " + width + ", height:" + height);
@@ -178,9 +168,6 @@ public class RemoteFolder extends Folder {
case R.id.close_info_button:
mLauncher.closeFolder();
break;
- case R.id.disable_remote_folder_button:
- disableRemoteFolder();
- break;
default:
break;
}
@@ -195,7 +182,6 @@ public class RemoteFolder extends Folder {
mFolderHelpText.setVisibility(GONE);
mCloseInfoButton.setVisibility(GONE);
- mDisableFolderButton.setVisibility(GONE);
mFolderInfo.setImageDrawable(getResources().getDrawable(R.drawable.ic_launcher_info_normal_holo));
@@ -207,31 +193,10 @@ public class RemoteFolder extends Folder {
mFolderHelpText.setVisibility(VISIBLE);
mCloseInfoButton.setVisibility(VISIBLE);
- mDisableFolderButton.setVisibility(VISIBLE);
mFolderInfo.setImageDrawable(getResources().getDrawable(R.drawable.ic_launcher_clear_normal_holo));
}
this.invalidate();
-
- }
-
- private void disableRemoteFolder() {
- // close the folder UX & disable remote folders.
- mLauncher.closeFolder();
-
- if (mContext != null) {
- String spKey = LauncherAppState.getSharedPreferencesKey();
- SharedPreferences sp = mContext.getSharedPreferences(spKey, Context.MODE_PRIVATE);
- sp.edit().putBoolean(REMOTE_FOLDER_ENABLED, false).commit();
- Log.e(TAG, "Set preference to disable remote folder. Requesting sync to remove existing folder");
-
- LauncherModel.deleteFolderContentsFromDatabase(mContext, mInfo);
- LauncherModel.deleteItemFromDatabase(mContext, mInfo);
- mLauncher.getWorkspace().removeView(this);
- mLauncher.removeFolder(mInfo);
-
- mLauncher.getWorkspace().refreshDrawableState();
- }
}
@Override
@@ -239,7 +204,6 @@ public class RemoteFolder extends Folder {
super.animateClosed(animate);
mFolderHelpText.setVisibility(GONE);
mCloseInfoButton.setVisibility(GONE);
- mDisableFolderButton.setVisibility(GONE);
mContentScrollView.setVisibility(VISIBLE);
mFolderInfo.setImageDrawable(getResources().getDrawable(R.drawable.ic_launcher_info_normal_holo));
}
@@ -251,7 +215,6 @@ public class RemoteFolder extends Folder {
mFolderHelpText.setText(getResources().getString(R.string.recommendations_help_text));
mFolderHelpText.setVisibility(GONE);
mCloseInfoButton.setVisibility(GONE);
- mDisableFolderButton.setVisibility(GONE);
mContentScrollView.setVisibility(VISIBLE);
mContent.setVisibility(VISIBLE);
mFolderInfo.setImageDrawable(getResources().getDrawable(R.drawable.ic_launcher_info_normal_holo));
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);
+ }
+}
diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java
index 197c09a77..e6087a666 100644
--- a/src/com/android/launcher3/Workspace.java
+++ b/src/com/android/launcher3/Workspace.java
@@ -400,6 +400,13 @@ public class Workspace extends SmoothPagedView
}
}
+ /**
+ * @return A {@link Set} of {@link Long}s representing ids of the workspace screens
+ */
+ public Set<Long> getWorkspaceScreenIds() {
+ return mWorkspaceScreens.keySet();
+ }
+
// estimate the size of a widget with spans hSpan, vSpan. return MAX_VALUE for each
// dimension if unsuccessful
public int[] estimateItemSize(int hSpan, int vSpan,
@@ -4462,6 +4469,7 @@ public class Workspace extends SmoothPagedView
}
if (cellLayout != null) {
cellLayout.onDropChild(mDragInfo.cell);
+ cellLayout.setUseTempCoords(false);
}
}
if ((d.cancelled || (beingCalledAfterUninstall && !mUninstallSuccessful))
diff --git a/src/com/android/launcher3/list/SettingsPinnedHeaderAdapter.java b/src/com/android/launcher3/list/SettingsPinnedHeaderAdapter.java
index df9a1f05b..a9364d49f 100644
--- a/src/com/android/launcher3/list/SettingsPinnedHeaderAdapter.java
+++ b/src/com/android/launcher3/list/SettingsPinnedHeaderAdapter.java
@@ -132,6 +132,14 @@ public class SettingsPinnedHeaderAdapter extends PinnedHeaderListAdapter {
case 4:
updateDynamicGridSizeSettingsItem(v);
break;
+ case 5:
+ current = SettingsProvider.getBoolean(mContext,
+ SettingsProvider.SETTINGS_UI_HOMESCREEN_REMOTE_FOLDER,
+ R.bool.preferences_interface_homescreen_remote_folder_default);
+ state = current ? res.getString(R.string.setting_state_on)
+ : res.getString(R.string.setting_state_off);
+ ((TextView) v.findViewById(R.id.item_state)).setText(state);
+ break;
default:
((TextView) v.findViewById(R.id.item_state)).setText("");
}
@@ -308,7 +316,12 @@ public class SettingsPinnedHeaderAdapter extends PinnedHeaderListAdapter {
case 4:
mLauncher.onClickDynamicGridSizeButton();
break;
-
+ case 5:
+ boolean newValue = onSettingsBooleanChanged(v,
+ SettingsProvider.SETTINGS_UI_HOMESCREEN_REMOTE_FOLDER,
+ R.bool.preferences_interface_homescreen_remote_folder_default);
+ mLauncher.getRemoteFolderManager().onSettingChanged(newValue);
+ break;
}
break;
case OverviewSettingsPanel.DRAWER_SETTINGS_POSITION:
@@ -372,7 +385,7 @@ public class SettingsPinnedHeaderAdapter extends PinnedHeaderListAdapter {
R.bool.preferences_interface_homescreen_search_default);
}
- private void onSettingsBooleanChanged(View v, String key, int res) {
+ private boolean onSettingsBooleanChanged(View v, String key, int res) {
boolean current = SettingsProvider.getBoolean(
mContext, key, res);
@@ -384,6 +397,8 @@ public class SettingsPinnedHeaderAdapter extends PinnedHeaderListAdapter {
R.string.setting_state_off) : mLauncher.getResources().getString(
R.string.setting_state_on);
((TextView) v.findViewById(R.id.item_state)).setText(state);
+
+ return !current;
}
private void onIconLabelsBooleanChanged(View v, String key, int res) {
diff --git a/src/com/android/launcher3/settings/SettingsProvider.java b/src/com/android/launcher3/settings/SettingsProvider.java
index 042053cef..841fa3e2a 100644
--- a/src/com/android/launcher3/settings/SettingsProvider.java
+++ b/src/com/android/launcher3/settings/SettingsProvider.java
@@ -31,6 +31,7 @@ public final class SettingsProvider {
public static final String SETTINGS_UI_HOMESCREEN_SCROLLING_WALLPAPER_SCROLL = "ui_homescreen_scrolling_wallpaper_scroll";
public static final String SETTINGS_UI_HOMESCREEN_SCROLLING_PAGE_OUTLINES = "ui_homescreen_scrolling_page_outlines";
public static final String SETTINGS_UI_HOMESCREEN_SCROLLING_FADE_ADJACENT = "ui_homescreen_scrolling_fade_adjacent";
+ public static final String SETTINGS_UI_HOMESCREEN_REMOTE_FOLDER = "ui_homescreen_remote_folder";
public static final String SETTINGS_UI_DYNAMIC_GRID_SIZE = "ui_dynamic_grid_size";
public static final String SETTINGS_UI_HOMESCREEN_ROWS = "ui_homescreen_rows";
public static final String SETTINGS_UI_HOMESCREEN_COLUMNS = "ui_homescreen_columns";