merge in jb-mr1-release history after reset to jb-mr1-dev
diff --git a/res/layout-sw720dp/launcher.xml b/res/layout-sw720dp/launcher.xml
index 9ddb135..418469b 100644
--- a/res/layout-sw720dp/launcher.xml
+++ b/res/layout-sw720dp/launcher.xml
@@ -28,9 +28,9 @@
<include
android:id="@+id/dock_divider"
layout="@layout/workspace_divider"
- android:layout_width="@dimen/workspace_divider_width"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginBottom="@dimen/button_bar_height"
+ android:layout_marginBottom="@dimen/button_bar_height_plus_padding"
android:layout_gravity="bottom|center_horizontal" />
<include
android:id="@+id/paged_view_indicator"
@@ -38,7 +38,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
- android:layout_marginBottom="@dimen/button_bar_height" />
+ android:layout_marginBottom="@dimen/button_bar_height_plus_padding" />
<!-- The workspace contains 5 screens of cells -->
<com.android.launcher2.Workspace
diff --git a/res/values-sw600dp/config.xml b/res/values-sw600dp/config.xml
index bbb22c5..eab77f9 100644
--- a/res/values-sw600dp/config.xml
+++ b/res/values-sw600dp/config.xml
@@ -21,5 +21,5 @@
<!-- Hotseat -->
<!-- must be between 0 and 100 -->
- <integer name="hotseat_item_scale_percentage">90</integer>
+ <integer name="hotseat_item_scale_percentage">80</integer>
</resources>
diff --git a/res/values-sw720dp-port/dimens.xml b/res/values-sw720dp-port/dimens.xml
index 5528ae6..84ef395 100644
--- a/res/values-sw720dp-port/dimens.xml
+++ b/res/values-sw720dp-port/dimens.xml
@@ -43,8 +43,9 @@
<integer name="apps_customize_cling_focused_x">2</integer>
<integer name="apps_customize_cling_focused_y">2</integer>
- <!-- Page width set to match a page of icons (96*k) -->
- <dimen name="workspace_divider_width">768dp</dimen>
+ <!-- Divider width set to match the qsb width -->
+ <dimen name="workspace_divider_padding_left">112dp</dimen>
+ <dimen name="workspace_divider_padding_right">112dp</dimen>
<!-- Hotseat -->
<dimen name="hotseat_width_gap">16dp</dimen>
diff --git a/res/values-sw720dp/dimens.xml b/res/values-sw720dp/dimens.xml
index 54ac870..fe7083d 100644
--- a/res/values-sw720dp/dimens.xml
+++ b/res/values-sw720dp/dimens.xml
@@ -16,16 +16,17 @@
<resources>
<dimen name="app_icon_size">72dp</dimen>
+ <dimen name="app_icon_padding_top">0dp</dimen>
<dimen name="reveal_radius">72dp</dimen>
<!-- Hotseat -->
- <dimen name="button_bar_height">96dp</dimen>
- <dimen name="button_bar_height_top_padding">0dp</dimen>
- <dimen name="button_bar_height_bottom_padding">0dp</dimen>
- <dimen name="button_bar_width_left_padding">0dp</dimen>
- <dimen name="button_bar_width_right_padding">0dp</dimen>
- <dimen name="button_bar_height_plus_padding">96dp</dimen>
- <dimen name="hotseat_width_gap">48dp</dimen>
+ <dimen name="button_bar_height">82dp</dimen>
+ <dimen name="button_bar_height_top_padding">12dp</dimen>
+ <dimen name="button_bar_height_bottom_padding">12dp</dimen>
+ <dimen name="button_bar_width_left_padding">12dp</dimen>
+ <dimen name="button_bar_width_right_padding">12dp</dimen>
+ <dimen name="button_bar_height_plus_padding">82dp</dimen>
+ <dimen name="hotseat_width_gap">50dp</dimen>
<!-- QSB -->
<dimen name="toolbar_button_vertical_padding">8dip</dimen>
@@ -58,14 +59,14 @@
<dimen name="dragViewOffsetY">0dp</dimen>
<!-- CellLayout padding land / port-->
- <dimen name="cell_layout_left_padding_port">0dp</dimen>
- <dimen name="cell_layout_left_padding_land">0dp</dimen>
- <dimen name="cell_layout_right_padding_port">0dp</dimen>
- <dimen name="cell_layout_right_padding_land">0dp</dimen>
- <dimen name="cell_layout_top_padding_port">0dp</dimen>
- <dimen name="cell_layout_top_padding_land">0dp</dimen>
- <dimen name="cell_layout_bottom_padding_port">0dp</dimen>
- <dimen name="cell_layout_bottom_padding_land">0dp</dimen>
+ <dimen name="cell_layout_left_padding_port">4dp</dimen>
+ <dimen name="cell_layout_left_padding_land">4dp</dimen>
+ <dimen name="cell_layout_right_padding_port">4dp</dimen>
+ <dimen name="cell_layout_right_padding_land">4dp</dimen>
+ <dimen name="cell_layout_top_padding_port">12dp</dimen>
+ <dimen name="cell_layout_top_padding_land">12dp</dimen>
+ <dimen name="cell_layout_bottom_padding_port">8dp</dimen>
+ <dimen name="cell_layout_bottom_padding_land">8dp</dimen>
<!-- Folders -->
<!-- The size of the image which sits behind the preview of the folder contents -->
@@ -84,15 +85,13 @@
<dimen name="workspace_top_padding_port">@dimen/qsb_bar_height_inset</dimen>
<dimen name="workspace_top_padding_land">@dimen/qsb_bar_height_inset</dimen>
- <!-- XXX: This should be @dimen/button_bar_height + bottom padding, but because we are not using
- the hotseat with the smaller icons, this is slightly larger than final dimensions. -->
- <dimen name="workspace_bottom_padding_port">110dp</dimen>
- <dimen name="workspace_bottom_padding_land">100dp</dimen>
+ <dimen name="workspace_bottom_padding_port">@dimen/button_bar_height_plus_padding</dimen>
+ <dimen name="workspace_bottom_padding_land">@dimen/button_bar_height_plus_padding</dimen>
- <!-- Page width set to match a page of icons (96*k + 46*(k-1) - 2*12[icon padding]) -->
- <dimen name="workspace_divider_width">1066dp</dimen>
- <dimen name="workspace_divider_padding_left">0dp</dimen>
- <dimen name="workspace_divider_padding_right">0dp</dimen>
+ <!-- Divider width set to match the qsb width -->
+ <dimen name="workspace_divider_width">0dp</dimen>
+ <dimen name="workspace_divider_padding_left">249dp</dimen>
+ <dimen name="workspace_divider_padding_right">249dp</dimen>
<dimen name="workspace_divider_padding_top">0dp</dimen>
<dimen name="workspace_divider_padding_bottom">0dp</dimen>
diff --git a/src/com/android/launcher2/DeferredHandler.java b/src/com/android/launcher2/DeferredHandler.java
index b7e48b1..cee27df 100644
--- a/src/com/android/launcher2/DeferredHandler.java
+++ b/src/com/android/launcher2/DeferredHandler.java
@@ -16,12 +16,13 @@
package com.android.launcher2;
-import java.util.LinkedList;
-
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.MessageQueue;
+import android.util.Pair;
+import java.util.LinkedList;
+import java.util.ListIterator;
/**
* Queue of things to run on a looper thread. Items posted with {@link #post} will not
@@ -31,18 +32,20 @@
* This class is fifo.
*/
public class DeferredHandler {
- private LinkedList<Runnable> mQueue = new LinkedList<Runnable>();
+ private LinkedList<Pair<Runnable, Integer>> mQueue = new LinkedList<Pair<Runnable, Integer>>();
private MessageQueue mMessageQueue = Looper.myQueue();
private Impl mHandler = new Impl();
private class Impl extends Handler implements MessageQueue.IdleHandler {
public void handleMessage(Message msg) {
+ Pair<Runnable, Integer> p;
Runnable r;
synchronized (mQueue) {
if (mQueue.size() == 0) {
return;
}
- r = mQueue.removeFirst();
+ p = mQueue.removeFirst();
+ r = p.first;
}
r.run();
synchronized (mQueue) {
@@ -73,8 +76,11 @@
/** Schedule runnable to run after everything that's on the queue right now. */
public void post(Runnable runnable) {
+ post(runnable, 0);
+ }
+ public void post(Runnable runnable, int type) {
synchronized (mQueue) {
- mQueue.add(runnable);
+ mQueue.add(new Pair<Runnable, Integer>(runnable, type));
if (mQueue.size() == 1) {
scheduleNextLocked();
}
@@ -83,7 +89,10 @@
/** Schedule runnable to run when the queue goes idle. */
public void postIdle(final Runnable runnable) {
- post(new IdleRunnable(runnable));
+ postIdle(runnable, 0);
+ }
+ public void postIdle(final Runnable runnable, int type) {
+ post(new IdleRunnable(runnable), type);
}
public void cancelRunnable(Runnable runnable) {
@@ -91,6 +100,18 @@
while (mQueue.remove(runnable)) { }
}
}
+ public void cancelAllRunnablesOfType(int type) {
+ synchronized (mQueue) {
+ ListIterator<Pair<Runnable, Integer>> iter = mQueue.listIterator();
+ Pair<Runnable, Integer> p;
+ while (iter.hasNext()) {
+ p = iter.next();
+ if (p.second == type) {
+ iter.remove();
+ }
+ }
+ }
+ }
public void cancel() {
synchronized (mQueue) {
@@ -100,19 +121,20 @@
/** Runs all queued Runnables from the calling thread. */
public void flush() {
- LinkedList<Runnable> queue = new LinkedList<Runnable>();
+ LinkedList<Pair<Runnable, Integer>> queue = new LinkedList<Pair<Runnable, Integer>>();
synchronized (mQueue) {
queue.addAll(mQueue);
mQueue.clear();
}
- for (Runnable r : queue) {
- r.run();
+ for (Pair<Runnable, Integer> p : queue) {
+ p.first.run();
}
}
void scheduleNextLocked() {
if (mQueue.size() > 0) {
- Runnable peek = mQueue.getFirst();
+ Pair<Runnable, Integer> p = mQueue.getFirst();
+ Runnable peek = p.first;
if (peek instanceof IdleRunnable) {
mMessageQueue.addIdleHandler(mHandler);
} else {
diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index 1e138f7..2fcf869 100644
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -1486,8 +1486,11 @@
TextKeyListener.getInstance().release();
-
- unbindWorkspaceAndHotseatItems();
+ // Disconnect any of the callbacks and drawables associated with ItemInfos on the workspace
+ // to prevent leaking Launcher activities on orientation change.
+ if (mModel != null) {
+ mModel.unbindItemInfosAndClearQueuedBindRunnables();
+ }
getContentResolver().unregisterContentObserver(mWidgetObserver);
unregisterReceiver(mCloseSystemDialogsReceiver);
@@ -1878,16 +1881,6 @@
}
/**
- * Go through the and disconnect any of the callbacks in the drawables and the views or we
- * leak the previous Home screen on orientation change.
- */
- private void unbindWorkspaceAndHotseatItems() {
- if (mModel != null) {
- mModel.unbindWorkspaceItems();
- }
- }
-
- /**
* Launches the intent referred by the clicked shortcut.
*
* @param v The view representing the clicked shortcut.
diff --git a/src/com/android/launcher2/LauncherModel.java b/src/com/android/launcher2/LauncherModel.java
index 7927593..269a0fd 100644
--- a/src/com/android/launcher2/LauncherModel.java
+++ b/src/com/android/launcher2/LauncherModel.java
@@ -82,6 +82,12 @@
private LoaderTask mLoaderTask;
private boolean mIsLoaderTaskRunning;
+ // Specific runnable types that are run on the main thread deferred handler, this allows us to
+ // clear all queued binding runnables when the Launcher activity is destroyed.
+ private static final int MAIN_THREAD_NORMAL_RUNNABLE = 0;
+ private static final int MAIN_THREAD_BINDING_RUNNABLE = 1;
+
+
private static final HandlerThread sWorkerThread = new HandlerThread("launcher-loader");
static {
sWorkerThread.start();
@@ -177,6 +183,9 @@
/** Runs the specified runnable immediately if called from the main thread, otherwise it is
* posted on the main thread handler. */
private void runOnMainThread(Runnable r) {
+ runOnMainThread(r, 0);
+ }
+ private void runOnMainThread(Runnable r, int type) {
if (sWorkerThread.getThreadId() == Process.myTid()) {
// If we are on the worker thread, post onto the main handler
mHandler.post(r);
@@ -200,17 +209,22 @@
return Bitmap.createBitmap(mDefaultIcon);
}
- public void unbindWorkspaceItems() {
- sWorker.post(new Runnable() {
- @Override
- public void run() {
- unbindWorkspaceItemsOnMainThread();
- }
- });
+ public void unbindItemInfosAndClearQueuedBindRunnables() {
+ if (sWorkerThread.getThreadId() == Process.myTid()) {
+ throw new RuntimeException("Expected unbindLauncherItemInfos() to be called from the " +
+ "main thread");
+ }
+
+ // Clear any deferred bind runnables
+ mDeferredBindRunnables.clear();
+ // Remove any queued bind runnables
+ mHandler.cancelAllRunnablesOfType(MAIN_THREAD_BINDING_RUNNABLE);
+ // Unbind all the workspace items
+ unbindWorkspaceItemsOnMainThread();
}
/** Unbinds all the sBgWorkspaceItems and sBgAppWidgets on the main thread */
- private void unbindWorkspaceItemsOnMainThread() {
+ void unbindWorkspaceItemsOnMainThread() {
// Ensure that we don't use the same workspace items data structure on the main thread
// by making a copy of workspace items first.
final ArrayList<ItemInfo> tmpWorkspaceItems = new ArrayList<ItemInfo>();
@@ -880,7 +894,7 @@
// Post the remaining side pages to be loaded
if (!mDeferredBindRunnables.isEmpty()) {
for (final Runnable r : mDeferredBindRunnables) {
- mHandler.post(r);
+ mHandler.post(r, MAIN_THREAD_BINDING_RUNNABLE);
}
mDeferredBindRunnables.clear();
}
@@ -1602,7 +1616,7 @@
if (postOnMainThread) {
deferredBindRunnables.add(r);
} else {
- runOnMainThread(r);
+ runOnMainThread(r, MAIN_THREAD_BINDING_RUNNABLE);
}
}
@@ -1619,7 +1633,7 @@
if (postOnMainThread) {
deferredBindRunnables.add(r);
} else {
- runOnMainThread(r);
+ runOnMainThread(r, MAIN_THREAD_BINDING_RUNNABLE);
}
}
@@ -1638,7 +1652,7 @@
if (postOnMainThread) {
deferredBindRunnables.add(r);
} else {
- runOnMainThread(r);
+ runOnMainThread(r, MAIN_THREAD_BINDING_RUNNABLE);
}
}
}
@@ -1706,7 +1720,7 @@
}
}
};
- runOnMainThread(r);
+ runOnMainThread(r, MAIN_THREAD_BINDING_RUNNABLE);
// Load items on the current page
bindWorkspaceItems(oldCallbacks, currentWorkspaceItems, currentAppWidgets,
@@ -1720,7 +1734,7 @@
}
}
};
- runOnMainThread(r);
+ runOnMainThread(r, MAIN_THREAD_BINDING_RUNNABLE);
}
// Load all the remaining pages (if we are loading synchronously, we want to defer this
@@ -1749,7 +1763,7 @@
if (isLoadingSynchronously) {
mDeferredBindRunnables.add(r);
} else {
- runOnMainThread(r);
+ runOnMainThread(r, MAIN_THREAD_BINDING_RUNNABLE);
}
}