diff options
-rw-r--r-- | res/values-fr/strings.xml | 2 | ||||
-rw-r--r-- | res/values/strings.xml | 2 | ||||
-rw-r--r-- | res/xml/preferences.xml | 11 | ||||
-rw-r--r-- | src/com/cyanogenmod/trebuchet/AllAppsButtonInfo.java | 35 | ||||
-rw-r--r-- | src/com/cyanogenmod/trebuchet/DeleteDropTarget.java | 7 | ||||
-rw-r--r-- | src/com/cyanogenmod/trebuchet/DragController.java | 10 | ||||
-rw-r--r-- | src/com/cyanogenmod/trebuchet/Hotseat.java | 45 | ||||
-rw-r--r-- | src/com/cyanogenmod/trebuchet/ItemInfo.java | 1 | ||||
-rw-r--r-- | src/com/cyanogenmod/trebuchet/Launcher.java | 2 | ||||
-rw-r--r-- | src/com/cyanogenmod/trebuchet/LauncherModel.java | 13 | ||||
-rw-r--r-- | src/com/cyanogenmod/trebuchet/LauncherSettings.java | 5 | ||||
-rw-r--r-- | src/com/cyanogenmod/trebuchet/SearchDropTargetBar.java | 10 | ||||
-rw-r--r-- | src/com/cyanogenmod/trebuchet/Workspace.java | 19 | ||||
-rw-r--r-- | src/com/cyanogenmod/trebuchet/preference/Preferences.java | 4 | ||||
-rw-r--r-- | src/com/cyanogenmod/trebuchet/preference/PreferencesProvider.java | 14 |
15 files changed, 159 insertions, 21 deletions
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 241e1c2..961cee4 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -172,6 +172,8 @@ <!-- Dock --> <string name="preferences_interface_dock_title">Barre de Dock</string> + <string name="preferences_interface_dock_size_title">Icônes du dock</string> + <string name="preferences_interface_dock_size_summary">Définir le nombre d\'icône du dock</string> <!-- Icons --> <string name="preferences_interface_icons_title">Icônes</string> diff --git a/res/values/strings.xml b/res/values/strings.xml index 9e8d6f8..4ede002 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -347,6 +347,8 @@ s --> <!-- Dock --> <string name="preferences_interface_dock_title">Dock</string> + <string name="preferences_interface_dock_size_title">Dock icons</string> + <string name="preferences_interface_dock_size_summary">Choose the number of icons in the dock</string> <!-- Icons --> <string name="preferences_interface_icons_title">Icons</string> diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml index 9cf8aaa..504ced6 100644 --- a/res/xml/preferences.xml +++ b/res/xml/preferences.xml @@ -115,10 +115,15 @@ </PreferenceScreen> <!-- Dock --> - <!-- <PreferenceScreen android:key="ui_dock" + <PreferenceScreen android:key="ui_dock" android:title="@string/preferences_interface_dock_title"> - - </PreferenceScreen> --> + <com.cyanogenmod.trebuchet.preference.NumberPickerPreference android:key="ui_dock_hotseat_size" + android:title="@string/preferences_interface_dock_size_title" + android:summary="@string/preferences_interface_dock_size_summary" + android:defaultValue="@integer/hotseat_cell_count" + launcher:max="9" + launcher:min="1" /> + </PreferenceScreen> <!-- Icons --> <!-- <PreferenceScreen android:key="ui_icons" diff --git a/src/com/cyanogenmod/trebuchet/AllAppsButtonInfo.java b/src/com/cyanogenmod/trebuchet/AllAppsButtonInfo.java new file mode 100644 index 0000000..3d0d916 --- /dev/null +++ b/src/com/cyanogenmod/trebuchet/AllAppsButtonInfo.java @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.cyanogenmod.trebuchet; + +/** + * Represents the AllApps button in hotseat + */ +class AllAppsButtonInfo extends ItemInfo { + + AllAppsButtonInfo() { + itemType = LauncherSettings.BaseLauncherColumns.ITEM_TYPE_ALLAPPS; + } + + @Override + public String toString() { + return "AllAppsButtonInfo(id=" + this.id + " type=" + this.itemType + + " container=" + this.container + " screen=" + screen + + " cellX=" + cellX + " cellY=" + cellY + " spanX=" + spanX + " spanY=" + spanY + + " dropPos=" + dropPos + ")"; + } +} diff --git a/src/com/cyanogenmod/trebuchet/DeleteDropTarget.java b/src/com/cyanogenmod/trebuchet/DeleteDropTarget.java index 2cc872a..c4bacfe 100644 --- a/src/com/cyanogenmod/trebuchet/DeleteDropTarget.java +++ b/src/com/cyanogenmod/trebuchet/DeleteDropTarget.java @@ -131,6 +131,9 @@ public class DeleteDropTarget extends ButtonDropTarget { private boolean isWorkspaceFolder(DragSource source, Object info) { return (source instanceof Workspace) && (info instanceof FolderInfo); } + private boolean isAllAppsButton(Object info) { + return (info instanceof AllAppsButtonInfo); + } private void setHoverColor() { setTextColor(mHoverColor); @@ -147,6 +150,10 @@ public class DeleteDropTarget extends ButtonDropTarget { @Override public void onDragStart(DragSource source, Object info, int dragAction) { + // If it's the AllApps button, from Hotseat, don't do anything. + if (isAllAppsButton(info)) { + return; + } boolean isUninstall = false; // If we are dragging an application from AppsCustomize, only show the uninstall control if we diff --git a/src/com/cyanogenmod/trebuchet/DragController.java b/src/com/cyanogenmod/trebuchet/DragController.java index 047c455..b770937 100644 --- a/src/com/cyanogenmod/trebuchet/DragController.java +++ b/src/com/cyanogenmod/trebuchet/DragController.java @@ -34,6 +34,7 @@ import android.view.ViewConfiguration; import android.view.inputmethod.InputMethodManager; import com.cyanogenmod.trebuchet.R; +import com.cyanogenmod.trebuchet.DropTarget.DragObject; import java.util.ArrayList; @@ -440,7 +441,7 @@ public class DragController { case MotionEvent.ACTION_UP: mLastTouchUpTime = System.currentTimeMillis(); if (mDragging) { - PointF vec = isFlingingToDelete(mDragObject.dragSource); + PointF vec = isFlingingToDelete(mDragObject); if (vec != null) { dropOnFlingToDeleteTarget(dragLayerX, dragLayerY, vec); } else { @@ -582,7 +583,7 @@ public class DragController { mHandler.removeCallbacks(mScrollRunnable); if (mDragging) { - PointF vec = isFlingingToDelete(mDragObject.dragSource); + PointF vec = isFlingingToDelete(mDragObject); if (vec != null) { dropOnFlingToDeleteTarget(dragLayerX, dragLayerY, vec); } else { @@ -605,9 +606,10 @@ public class DragController { * * @return the vector at which the item was flung, or null if no fling was detected. */ - private PointF isFlingingToDelete(DragSource source) { + private PointF isFlingingToDelete(DragObject object) { if (mFlingToDeleteDropTarget == null) return null; - if (!source.supportsFlingToDelete()) return null; + if (!object.dragSource.supportsFlingToDelete()) return null; + if (object.dragInfo instanceof AllAppsButtonInfo) return null; ViewConfiguration config = ViewConfiguration.get(mLauncher); mVelocityTracker.computeCurrentVelocity(1000, config.getScaledMaximumFlingVelocity()); diff --git a/src/com/cyanogenmod/trebuchet/Hotseat.java b/src/com/cyanogenmod/trebuchet/Hotseat.java index 9b7c707..d1b9056 100644 --- a/src/com/cyanogenmod/trebuchet/Hotseat.java +++ b/src/com/cyanogenmod/trebuchet/Hotseat.java @@ -27,6 +27,8 @@ import android.view.View; import android.widget.FrameLayout; import com.cyanogenmod.trebuchet.R; +import com.cyanogenmod.trebuchet.preference.Preferences; +import com.cyanogenmod.trebuchet.preference.PreferencesProvider; public class Hotseat extends FrameLayout { @SuppressWarnings("unused") @@ -39,6 +41,8 @@ public class Hotseat extends FrameLayout { private int mCellCountY; private int mAllAppsButtonRank; + private int xrrrr; + private boolean mTransposeLayoutWithOrientation; private boolean mIsLandscape; @@ -58,14 +62,29 @@ public class Hotseat extends FrameLayout { TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.Hotseat, defStyle, 0); - Resources r = context.getResources(); - mCellCountX = a.getInt(R.styleable.Hotseat_cellCountX, -1); - mCellCountY = a.getInt(R.styleable.Hotseat_cellCountY, -1); - mAllAppsButtonRank = r.getInteger(R.integer.hotseat_all_apps_index); - mTransposeLayoutWithOrientation = - r.getBoolean(R.bool.hotseat_transpose_layout_with_orientation); + + int numberHotseatIcons = PreferencesProvider.Interface.Dock.getNumberHotseatIcons(context); + int defaultHotseatIcon = PreferencesProvider.Interface.Dock.getDefaultHotseatIcon(context, + context.getResources().getInteger(R.integer.hotseat_all_apps_index)); + if (defaultHotseatIcon >= numberHotseatIcons) { + defaultHotseatIcon = numberHotseatIcons - 1; + PreferencesProvider.Interface.Dock.setDefaultHotseatIcon(context, defaultHotseatIcon); + } + + mTransposeLayoutWithOrientation = + getResources().getBoolean(R.bool.hotseat_transpose_layout_with_orientation); + mIsLandscape = context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE; + + if (mIsLandscape) { + mCellCountX = a.getInt(R.styleable.Hotseat_cellCountX, -1); + mCellCountY = numberHotseatIcons; + } else { + mCellCountX = numberHotseatIcons; + mCellCountY = a.getInt(R.styleable.Hotseat_cellCountY, -1); + } + mAllAppsButtonRank = defaultHotseatIcon; } public void setup(Launcher launcher) { @@ -139,10 +158,24 @@ public class Hotseat extends FrameLayout { } }); + allAppsButton.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + if (mLauncher != null) { + return mLauncher.onLongClick(v); + } + return false; + } + }); + // Note: We do this to ensure that the hotseat is always laid out in the orientation of // the hotseat in order regardless of which orientation they were added int x = getCellXFromOrder(mAllAppsButtonRank); int y = getCellYFromOrder(mAllAppsButtonRank); + AllAppsButtonInfo allAppsButtonInfo = new AllAppsButtonInfo(); + allAppsButtonInfo.cellX = x; + allAppsButtonInfo.cellY = y; + allAppsButton.setTag(allAppsButtonInfo); CellLayout.LayoutParams lp = new CellLayout.LayoutParams(x,y,1,1); lp.canReorder = false; mContent.addViewToCellLayout(allAppsButton, -1, 0, lp, true); diff --git a/src/com/cyanogenmod/trebuchet/ItemInfo.java b/src/com/cyanogenmod/trebuchet/ItemInfo.java index 34c7364..061cdf8 100644 --- a/src/com/cyanogenmod/trebuchet/ItemInfo.java +++ b/src/com/cyanogenmod/trebuchet/ItemInfo.java @@ -39,6 +39,7 @@ class ItemInfo { /** * One of {@link LauncherSettings.Favorites#ITEM_TYPE_APPLICATION}, * {@link LauncherSettings.Favorites#ITEM_TYPE_SHORTCUT}, + * {@link LauncherSettings.Favorites#ITEM_TYPE_ALLAPPS}, * {@link LauncherSettings.Favorites#ITEM_TYPE_FOLDER}, or * {@link LauncherSettings.Favorites#ITEM_TYPE_APPWIDGET}. */ diff --git a/src/com/cyanogenmod/trebuchet/Launcher.java b/src/com/cyanogenmod/trebuchet/Launcher.java index 5881204..9ef20c6 100644 --- a/src/com/cyanogenmod/trebuchet/Launcher.java +++ b/src/com/cyanogenmod/trebuchet/Launcher.java @@ -2445,7 +2445,7 @@ public final class Launcher extends Activity } public boolean isAllAppsButtonRank(int rank) { - return mHotseat.isAllAppsButtonRank(rank); + return (mHotseat != null) ? mHotseat.isAllAppsButtonRank(rank) : false; } /** diff --git a/src/com/cyanogenmod/trebuchet/LauncherModel.java b/src/com/cyanogenmod/trebuchet/LauncherModel.java index 73b654e..8fd5af2 100644 --- a/src/com/cyanogenmod/trebuchet/LauncherModel.java +++ b/src/com/cyanogenmod/trebuchet/LauncherModel.java @@ -49,6 +49,7 @@ import android.util.Log; import com.cyanogenmod.trebuchet.R; import com.cyanogenmod.trebuchet.InstallWidgetReceiver.WidgetMimeTypeHandlerData; +import com.cyanogenmod.trebuchet.preference.PreferencesProvider; import java.lang.ref.WeakReference; import java.net.URISyntaxException; @@ -1181,13 +1182,15 @@ public class LauncherModel extends BroadcastReceiver { // We use the last index to refer to the hotseat and the screen as the rank, so // test and update the occupied state accordingly - if (occupied[Launcher.MAX_SCREEN_COUNT][item.screen][0] != null) { + if (occupied[PreferencesProvider.Interface.Homescreen.getNumberHomescreens(mContext)] + [item.screen][0] != null) { Log.e(TAG, "Error loading shortcut into hotseat " + item + " into position (" + item.screen + ":" + item.cellX + "," + item.cellY + ") occupied by " + occupied[Launcher.MAX_SCREEN_COUNT][item.screen][0]); return false; } else { - occupied[Launcher.MAX_SCREEN_COUNT][item.screen][0] = item; + occupied[PreferencesProvider.Interface.Homescreen.getNumberHomescreens(mContext)] + [item.screen][0] = item; return true; } } else if (item.container != LauncherSettings.Favorites.CONTAINER_DESKTOP) { @@ -1244,8 +1247,10 @@ public class LauncherModel extends BroadcastReceiver { // +1 for the hotseat (it can be larger than the workspace) // Load workspace in reverse order to ensure that latest items are loaded first (and // before any earlier duplicates) + int numberHotseatIcons = PreferencesProvider.Interface.Dock.getNumberHotseatIcons(mContext); final ItemInfo occupied[][][] = - new ItemInfo[Launcher.MAX_SCREEN_COUNT + 1][mCellCountX + 1][mCellCountY + 1]; + new ItemInfo[PreferencesProvider.Interface.Homescreen.getNumberHomescreens(mContext) + 1] + [Math.max(mCellCountX, numberHotseatIcons)][mCellCountY]; try { final int idIndex = c.getColumnIndexOrThrow(LauncherSettings.Favorites._ID); @@ -1333,6 +1338,8 @@ public class LauncherModel extends BroadcastReceiver { // check & update map of what's occupied if (!checkItemPlacement(occupied, info)) { + id = c.getLong(idIndex); + itemsToRemove.add(id); break; } diff --git a/src/com/cyanogenmod/trebuchet/LauncherSettings.java b/src/com/cyanogenmod/trebuchet/LauncherSettings.java index 361dd69..1cc1303 100644 --- a/src/com/cyanogenmod/trebuchet/LauncherSettings.java +++ b/src/com/cyanogenmod/trebuchet/LauncherSettings.java @@ -56,6 +56,11 @@ class LauncherSettings { static final int ITEM_TYPE_SHORTCUT = 1; /** + * The gesture is the All Apps button + */ + static final int ITEM_TYPE_ALLAPPS = 5; + + /** * The icon type. * <P>Type: INTEGER</P> */ diff --git a/src/com/cyanogenmod/trebuchet/SearchDropTargetBar.java b/src/com/cyanogenmod/trebuchet/SearchDropTargetBar.java index 00b5f38..e9ec7dd 100644 --- a/src/com/cyanogenmod/trebuchet/SearchDropTargetBar.java +++ b/src/com/cyanogenmod/trebuchet/SearchDropTargetBar.java @@ -188,11 +188,21 @@ public class SearchDropTargetBar extends FrameLayout implements DragController.D return sTransitionOutDuration; } + private boolean isAllAppsButton(Object info) { + return (info instanceof AllAppsButtonInfo); + } + /* * DragController.DragListener implementation */ @Override public void onDragStart(DragSource source, Object info, int dragAction) { + // If it's the AllApps button, from Hotseat, don't do anything. + if (isAllAppsButton(info)) { + deferOnDragEnd(); + return; + } + // Animate out the QSB search bar, and animate in the drop target bar prepareStartAnimation(mDropTargetBar); mDropTargetBarAnim.start(); diff --git a/src/com/cyanogenmod/trebuchet/Workspace.java b/src/com/cyanogenmod/trebuchet/Workspace.java index ba73555..e404b5c 100644 --- a/src/com/cyanogenmod/trebuchet/Workspace.java +++ b/src/com/cyanogenmod/trebuchet/Workspace.java @@ -2409,8 +2409,17 @@ public class Workspace extends SmoothPagedView } } - LauncherModel.moveItemInDatabase(mLauncher, info, container, screen, lp.cellX, - lp.cellY); + // No_id check required as the AllApps button doesn't have an item info id + if (info.id != ItemInfo.NO_ID) { + LauncherModel.moveItemInDatabase(mLauncher, info, container, screen, lp.cellX, + lp.cellY); + } else if (info instanceof AllAppsButtonInfo) { + if (!LauncherApplication.isScreenLandscape(getContext())) { + PreferencesProvider.Interface.Dock.setDefaultHotseatIcon(getContext(), lp.cellX); + } else { + PreferencesProvider.Interface.Dock.setDefaultHotseatIcon(getContext(), lp.cellY); + } + } } else { // If we can't find a drop location, we return the item to its original position CellLayout.LayoutParams lp = (CellLayout.LayoutParams) cell.getLayoutParams(); @@ -2860,6 +2869,10 @@ public class Workspace extends SmoothPagedView return d.dragSource != this && isDragWidget(d); } + private boolean isDragAllAppsButton(DragObject d) { + return (d.dragInfo instanceof AllAppsButtonInfo); + } + public void onDragOver(DragObject d) { // Skip drag over events while we are dragging over side pages if (mInScrollArea || mIsSwitchingState || mState == State.SMALL) return; @@ -2903,7 +2916,7 @@ public class Workspace extends SmoothPagedView // Test to see if we are over the hotseat otherwise just use the current page if (mLauncher.getHotseat() != null && !isDragWidget(d)) { mLauncher.getHotseat().getHitRect(r); - if (r.contains(d.x, d.y)) { + if (r.contains(d.x, d.y) || isDragAllAppsButton(d)) { layout = mLauncher.getHotseat().getLayout(); } } diff --git a/src/com/cyanogenmod/trebuchet/preference/Preferences.java b/src/com/cyanogenmod/trebuchet/preference/Preferences.java index 8f90c4f..a4e806f 100644 --- a/src/com/cyanogenmod/trebuchet/preference/Preferences.java +++ b/src/com/cyanogenmod/trebuchet/preference/Preferences.java @@ -22,6 +22,7 @@ import android.os.Bundle; import android.preference.Preference; import android.preference.PreferenceActivity; +import com.cyanogenmod.trebuchet.LauncherApplication; import com.cyanogenmod.trebuchet.R; public class Preferences extends PreferenceActivity @@ -35,6 +36,9 @@ public class Preferences extends PreferenceActivity protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); + if (LauncherApplication.isScreenLarge()) { + findPreference("ui_dock").setEnabled(false); + } mPrefs = getSharedPreferences(PreferencesProvider.PREFERENCES_KEY, Context.MODE_PRIVATE); diff --git a/src/com/cyanogenmod/trebuchet/preference/PreferencesProvider.java b/src/com/cyanogenmod/trebuchet/preference/PreferencesProvider.java index e12bf00..b4228c3 100644 --- a/src/com/cyanogenmod/trebuchet/preference/PreferencesProvider.java +++ b/src/com/cyanogenmod/trebuchet/preference/PreferencesProvider.java @@ -20,6 +20,7 @@ import android.content.Context; import android.content.SharedPreferences; import com.cyanogenmod.trebuchet.LauncherApplication; +import com.cyanogenmod.trebuchet.R; import com.cyanogenmod.trebuchet.Workspace; import com.cyanogenmod.trebuchet.AppsCustomizePagedView; @@ -117,7 +118,18 @@ public final class PreferencesProvider { } public static class Dock { - + public static int getNumberHotseatIcons(Context context) { + final SharedPreferences preferences = context.getSharedPreferences(PREFERENCES_KEY, 0); + return preferences.getInt("ui_dock_hotseat_size", context.getResources().getInteger(R.integer.hotseat_cell_count)); + } + public static int getDefaultHotseatIcon(Context context, int def) { + final SharedPreferences preferences = context.getSharedPreferences(PREFERENCES_KEY, 0); + return preferences.getInt("ui_dock_hotseat_apps_index", def); + } + public static void setDefaultHotseatIcon(Context context, int val) { + final SharedPreferences preferences = context.getSharedPreferences(PREFERENCES_KEY, 0); + preferences.edit().putInt("ui_dock_hotseat_apps_index", val).apply(); + } } public static class Icons { |