Fixing bug where search bar is not updated when search package is first installed.
- Fixing issue where we weren't disabling HW layers when you don't finish a swipe-to-dismiss
- Preventing tapping on a task that is currently being dismissed
- Adding a debug trigger for internal testing
- Minor refactoring
Change-Id: Id7dcc8a4b5a080402c2761cd555b8a882498ad29
diff --git a/packages/SystemUI/src/com/android/systemui/recents/Constants.java b/packages/SystemUI/src/com/android/systemui/recents/Constants.java
index 2abbad5..8995437 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/Constants.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/Constants.java
@@ -35,8 +35,6 @@
public static final boolean EnableTaskStackClipping = true;
// Enables tapping on the TaskBar to launch the task
public static final boolean EnableTaskBarTouchEvents = true;
- // Enables the use of theme colors as the task bar background
- public static final boolean EnableTaskBarThemeColors = true;
// Enables app-info pane on long-pressing the icon
public static final boolean EnableDevAppInfoOnLongPress = true;
// Enables the search bar layout
@@ -95,6 +93,8 @@
public static class App {
public static int AppWidgetHostId = 1024;
public static String Key_SearchAppWidgetId = "searchAppWidgetId";
+ public static String Key_DebugModeEnabled = "debugModeEnabled";
+ public static String DebugModeVersion = "A";
}
public static class Window {
// The dark background dim is set behind the empty recents view
diff --git a/packages/SystemUI/src/com/android/systemui/recents/DebugTrigger.java b/packages/SystemUI/src/com/android/systemui/recents/DebugTrigger.java
new file mode 100644
index 0000000..d90e2be
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/recents/DebugTrigger.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2014 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.android.systemui.recents;
+
+import android.os.Handler;
+import android.os.SystemClock;
+import android.view.KeyEvent;
+
+/**
+ * A trigger for catching a debug chord.
+ * We currently use volume up then volume down to trigger this mode.
+ */
+public class DebugTrigger {
+
+ Handler mHandler;
+ Runnable mTriggeredRunnable;
+
+ int mLastKeyCode;
+ long mLastKeyCodeTime;
+
+ public DebugTrigger(Runnable triggeredRunnable) {
+ mHandler = new Handler();
+ mTriggeredRunnable = triggeredRunnable;
+ }
+
+ /** Resets the debug trigger */
+ void reset() {
+ mLastKeyCode = 0;
+ mLastKeyCodeTime = 0;
+ }
+
+ /**
+ * Processes a key event and tests if it is a part of the trigger. If the chord is complete,
+ * then we just call the callback.
+ */
+ public void onKeyEvent(int keyCode) {
+ if (mLastKeyCode == 0) {
+ if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
+ mLastKeyCode = keyCode;
+ mLastKeyCodeTime = SystemClock.uptimeMillis();
+ return;
+ }
+ } else {
+ if (mLastKeyCode == KeyEvent.KEYCODE_VOLUME_UP &&
+ keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
+ if ((SystemClock.uptimeMillis() - mLastKeyCodeTime) < 750) {
+ mTriggeredRunnable.run();
+ }
+ }
+ }
+ reset();
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
index dfc0750..ecdc9dd 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
@@ -18,6 +18,7 @@
import android.app.Activity;
import android.app.ActivityOptions;
+import android.app.SearchManager;
import android.appwidget.AppWidgetHostView;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProviderInfo;
@@ -25,12 +26,14 @@
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.UserHandle;
import android.util.Pair;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewStub;
+import android.widget.Toast;
import com.android.systemui.R;
import com.android.systemui.recents.model.RecentsTaskLoader;
import com.android.systemui.recents.model.SpaceNode;
@@ -110,7 +113,7 @@
}
// Broadcast receiver to handle messages from our RecentsService
- BroadcastReceiver mServiceBroadcastReceiver = new BroadcastReceiver() {
+ final BroadcastReceiver mServiceBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
@@ -144,18 +147,29 @@
mRecentsView.startEnterRecentsAnimation(new ViewAnimation.TaskViewEnterContext(mFullScreenOverlayView));
// Call our callback
onEnterAnimationTriggered();
+ } else if (action.equals(SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED)) {
+ // Refresh the search widget
+ refreshSearchWidget();
}
}
};
// Broadcast receiver to handle messages from the system
- BroadcastReceiver mScreenOffReceiver = new BroadcastReceiver() {
+ final BroadcastReceiver mScreenOffReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
mFinishWithoutAnimationRunnable.run();
}
};
+ // Debug trigger
+ final DebugTrigger mDebugTrigger = new DebugTrigger(new Runnable() {
+ @Override
+ public void run() {
+ onDebugModeTriggered();
+ }
+ });
+
/** Updates the set of recent tasks */
void updateRecentsTasks(Intent launchIntent) {
RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
@@ -432,6 +446,7 @@
filter.addAction(RecentsService.ACTION_HIDE_RECENTS_ACTIVITY);
filter.addAction(RecentsService.ACTION_TOGGLE_RECENTS_ACTIVITY);
filter.addAction(RecentsService.ACTION_START_ENTER_ANIMATION);
+ filter.addAction(SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED);
registerReceiver(mServiceBroadcastReceiver, filter);
// Register the broadcast receiver to handle messages when the screen is turned off
@@ -514,7 +529,8 @@
mRecentsView.focusNextTask(!backward);
return true;
}
-
+ // Pass through the debug trigger
+ mDebugTrigger.onKeyEvent(keyCode);
return super.onKeyDown(keyCode, event);
}
@@ -547,6 +563,23 @@
}
}
+ /** Called when debug mode is triggered */
+ public void onDebugModeTriggered() {
+ if (mConfig.developerOptionsEnabled) {
+ SharedPreferences settings = getSharedPreferences(getPackageName(), 0);
+ if (settings.getBoolean(Constants.Values.App.Key_DebugModeEnabled, false)) {
+ // Disable the debug mode
+ settings.edit().remove(Constants.Values.App.Key_DebugModeEnabled).apply();
+ } else {
+ // Enable the debug mode
+ settings.edit().putBoolean(Constants.Values.App.Key_DebugModeEnabled, true).apply();
+ }
+ Toast.makeText(this, "Debug mode (" + Constants.Values.App.DebugModeVersion +
+ ") toggled, please restart Recents now", Toast.LENGTH_SHORT).show();
+ }
+ }
+
+ /** Called when the enter recents animation is triggered. */
public void onEnterAnimationTriggered() {
// Animate the scrims in
mScrimViews.startEnterRecentsAnimation();
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java
index 10978ca..d57f779 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java
@@ -103,6 +103,7 @@
/** Dev options */
public boolean developerOptionsEnabled;
+ public boolean debugModeEnabled;
/** Private constructor */
private RecentsConfiguration(Context context) {
@@ -141,10 +142,14 @@
/** Updates the state, given the specified context */
void update(Context context) {
+ SharedPreferences settings = context.getSharedPreferences(context.getPackageName(), 0);
Resources res = context.getResources();
DisplayMetrics dm = res.getDisplayMetrics();
mDisplayMetrics = dm;
+ // Debug mode
+ debugModeEnabled = settings.getBoolean(Constants.Values.App.Key_DebugModeEnabled, false);
+
// Animations
animationPxMovementPerSecond =
res.getDimensionPixelSize(R.dimen.recents_animation_movement_in_dps_per_second);
@@ -168,7 +173,6 @@
searchBarSpaceHeightPx = res.getDimensionPixelSize(R.dimen.recents_search_bar_space_height);
// Update the search widget id
- SharedPreferences settings = context.getSharedPreferences(context.getPackageName(), 0);
searchBarAppWidgetId = settings.getInt(Constants.Values.App.Key_SearchAppWidgetId, -1);
// Task stack
diff --git a/packages/SystemUI/src/com/android/systemui/recents/Utilities.java b/packages/SystemUI/src/com/android/systemui/recents/Utilities.java
index 25875bc..6d6376f 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/Utilities.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/Utilities.java
@@ -68,20 +68,20 @@
}
/** Calculates the luminance-preserved greyscale of a given color. */
- private static int colorToGreyscale(int color) {
+ public static int colorToGreyscale(int color) {
return Math.round(0.2126f * Color.red(color) + 0.7152f * Color.green(color) +
0.0722f * Color.blue(color));
}
/** Returns the ideal color to draw on top of a specified background color. */
- public static int getIdealColorForBackgroundColor(int color, int lightRes, int darkRes) {
- int greyscale = colorToGreyscale(color);
+ public static int getIdealColorForBackgroundColorGreyscale(int greyscale, int lightRes,
+ int darkRes) {
return (greyscale < 128) ? lightRes : darkRes;
}
/** Returns the ideal drawable to draw on top of a specified background color. */
- public static Drawable getIdealResourceForBackgroundColor(int color, Drawable lightRes,
- Drawable darkRes) {
- int greyscale = colorToGreyscale(color);
+ public static Drawable getIdealResourceForBackgroundColorGreyscale(int greyscale,
+ Drawable lightRes,
+ Drawable darkRes) {
return (greyscale < 128) ? lightRes : darkRes;
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java
index a07670b..99910c7 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java
@@ -30,6 +30,7 @@
import android.util.Pair;
import com.android.systemui.recents.Console;
import com.android.systemui.recents.Constants;
+import com.android.systemui.recents.RecentsConfiguration;
import com.android.systemui.recents.SystemServicesProxy;
import java.util.ArrayList;
@@ -254,7 +255,7 @@
mMainThreadHandler.post(new Runnable() {
@Override
public void run() {
- t.notifyTaskDataLoaded(newThumbnail, newIcon, forceLoadTask);
+ t.notifyTaskDataLoaded(newThumbnail, newIcon);
}
});
}
@@ -388,6 +389,7 @@
if (Console.Enabled) {
Console.log(Constants.Log.App.TaskDataLoader, "[RecentsTaskLoader|reload]");
}
+ RecentsConfiguration config = RecentsConfiguration.getInstance();
Resources res = context.getResources();
ArrayList<Task> tasksToForceLoad = new ArrayList<Task>();
TaskStack stack = new TaskStack(context);
@@ -409,7 +411,7 @@
ActivityManager.TaskDescription av = t.taskDescription;
String activityLabel = null;
BitmapDrawable activityIcon = null;
- int activityColor = 0;
+ int activityColor = config.taskBarViewDefaultBackgroundColor;
if (av != null) {
activityLabel = (av.getLabel() != null ? av.getLabel() : ssp.getActivityLabel(info));
activityIcon = (av.getIcon() != null) ? new BitmapDrawable(res, av.getIcon()) : null;
@@ -500,7 +502,7 @@
return root;
}
- /** Acquires the task resource data from the pool. */
+ /** Acquires the task resource data directly from the pool. */
public void loadTaskData(Task t) {
Drawable applicationIcon = mApplicationIconCache.get(t.key);
Bitmap thumbnail = mThumbnailCache.get(t.key);
@@ -523,7 +525,7 @@
if (requiresLoad) {
mLoadQueue.addTask(t, false);
}
- t.notifyTaskDataLoaded(thumbnail, applicationIcon, false);
+ t.notifyTaskDataLoaded(thumbnail, applicationIcon);
}
/** Releases the task resource data back into the pool. */
diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/Task.java b/packages/SystemUI/src/com/android/systemui/recents/model/Task.java
index cba9e5a..6b63b61 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/model/Task.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/model/Task.java
@@ -20,6 +20,7 @@
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
+import com.android.systemui.recents.Utilities;
/**
@@ -29,7 +30,7 @@
/* Task callbacks */
public interface TaskCallbacks {
/* Notifies when a task has been bound */
- public void onTaskDataLoaded(boolean reloadingTaskData);
+ public void onTaskDataLoaded();
/* Notifies when a task has been unbound */
public void onTaskDataUnloaded();
}
@@ -80,6 +81,7 @@
public Drawable activityIcon;
public String activityLabel;
public int colorPrimary;
+ public int colorPrimaryGreyscale;
public Bitmap thumbnail;
public boolean isActive;
public int userId;
@@ -96,6 +98,7 @@
this.activityLabel = activityTitle;
this.activityIcon = activityIcon;
this.colorPrimary = colorPrimary;
+ this.colorPrimaryGreyscale = Utilities.colorToGreyscale(colorPrimary);
this.isActive = isActive;
this.userId = userId;
}
@@ -106,12 +109,11 @@
}
/** Notifies the callback listeners that this task has been loaded */
- public void notifyTaskDataLoaded(Bitmap thumbnail, Drawable applicationIcon,
- boolean reloadingTaskData) {
+ public void notifyTaskDataLoaded(Bitmap thumbnail, Drawable applicationIcon) {
this.applicationIcon = applicationIcon;
this.thumbnail = thumbnail;
if (mCb != null) {
- mCb.onTaskDataLoaded(reloadingTaskData);
+ mCb.onTaskDataLoaded();
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
index 4370653..3856311 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
@@ -24,6 +24,7 @@
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Canvas;
+import android.graphics.Paint;
import android.graphics.Rect;
import android.net.Uri;
import android.os.UserHandle;
@@ -60,6 +61,7 @@
RecentsConfiguration mConfig;
LayoutInflater mInflater;
+ Paint mDebugModePaint;
// The space partitioning root of this container
SpaceNode mBSP;
@@ -107,6 +109,15 @@
addView(stackView);
mHasTasks |= (stack.getTaskCount() > 0);
}
+
+ // Enable debug mode drawing
+ if (mConfig.debugModeEnabled) {
+ mDebugModePaint = new Paint();
+ mDebugModePaint.setColor(0xFFff0000);
+ mDebugModePaint.setStyle(Paint.Style.STROKE);
+ mDebugModePaint.setStrokeWidth(5f);
+ setWillNotDraw(false);
+ }
}
/** Launches the focused task from the first stack if possible */
@@ -322,6 +333,29 @@
}
}
+ @Override
+ protected void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+ // Debug mode drawing
+ if (mConfig.debugModeEnabled) {
+ canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), mDebugModePaint);
+ }
+ }
+
+ @Override
+ public WindowInsets onApplyWindowInsets(WindowInsets insets) {
+ if (Console.Enabled) {
+ Console.log(Constants.Log.UI.MeasureAndLayout,
+ "[RecentsView|fitSystemWindows]", "insets: " + insets, Console.AnsiGreen);
+ }
+
+ // Update the configuration with the latest system insets and trigger a relayout
+ mConfig.updateSystemInsets(insets.getSystemWindowInsets());
+ requestLayout();
+
+ return insets.consumeSystemWindowInsets(false, false, false, true);
+ }
+
/** Notifies each task view of the user interaction. */
public void onUserInteraction() {
// Get the first stack view
@@ -354,29 +388,6 @@
}
}
- @Override
- protected void dispatchDraw(Canvas canvas) {
- if (Console.Enabled) {
- Console.log(Constants.Log.UI.Draw, "[RecentsView|dispatchDraw]", "",
- Console.AnsiPurple);
- }
- super.dispatchDraw(canvas);
- }
-
- @Override
- public WindowInsets onApplyWindowInsets(WindowInsets insets) {
- if (Console.Enabled) {
- Console.log(Constants.Log.UI.MeasureAndLayout,
- "[RecentsView|fitSystemWindows]", "insets: " + insets, Console.AnsiGreen);
- }
-
- // Update the configuration with the latest system insets and trigger a relayout
- mConfig.updateSystemInsets(insets.getSystemWindowInsets());
- requestLayout();
-
- return insets.consumeSystemWindowInsets(false, false, false, true);
- }
-
/** Unfilters any filtered stacks */
public boolean unfilterFilteredStacks() {
if (mBSP != null) {
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskBarView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskBarView.java
index 80f804d..2c0dea3 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskBarView.java
@@ -90,11 +90,11 @@
@Override
public boolean onTouchEvent(MotionEvent event) {
- if (Constants.DebugFlags.App.EnableTaskBarTouchEvents) {
- return super.onTouchEvent(event);
- }
// We ignore taps on the task bar except on the filter and dismiss buttons
- return true;
+ if (!Constants.DebugFlags.App.EnableTaskBarTouchEvents) return true;
+ if (mConfig.debugModeEnabled) return true;
+
+ return super.onTouchEvent(event);
}
@Override
@@ -149,7 +149,7 @@
}
/** Binds the bar view to the task */
- void rebindToTask(Task t, boolean animate) {
+ void rebindToTask(Task t) {
mTask = t;
// If an activity icon is defined, then we use that as the primary icon to show in the bar,
// otherwise, we fall back to the application icon
@@ -160,15 +160,12 @@
}
mActivityDescription.setText(t.activityLabel);
// Try and apply the system ui tint
- int tint = t.colorPrimary;
- if (!Constants.DebugFlags.App.EnableTaskBarThemeColors || tint == 0) {
- tint = mConfig.taskBarViewDefaultBackgroundColor;
- }
- setBackgroundColor(tint);
- mActivityDescription.setTextColor(Utilities.getIdealColorForBackgroundColor(tint,
- mConfig.taskBarViewLightTextColor, mConfig.taskBarViewDarkTextColor));
- mDismissButton.setImageDrawable(Utilities.getIdealResourceForBackgroundColor(tint,
- mLightDismissDrawable, mDarkDismissDrawable));
+ setBackgroundColor(t.colorPrimary);
+ mActivityDescription.setTextColor(Utilities.getIdealColorForBackgroundColorGreyscale(
+ t.colorPrimaryGreyscale, mConfig.taskBarViewLightTextColor,
+ mConfig.taskBarViewDarkTextColor));
+ mDismissButton.setImageDrawable(Utilities.getIdealResourceForBackgroundColorGreyscale(
+ t.colorPrimaryGreyscale, mLightDismissDrawable, mDarkDismissDrawable));
}
/** Unbinds the bar view from the task */
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
index 861c180..452665a 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
@@ -935,6 +935,11 @@
mUIDozeTrigger.poke();
}
+ /** Disables handling touch on this task view. */
+ void setTouchOnTaskView(TaskView tv, boolean enabled) {
+ tv.setOnClickListener(enabled ? this : null);
+ }
+
/**** TaskStackCallbacks Implementation ****/
@Override
@@ -1177,47 +1182,34 @@
@Override
public void prepareViewToEnterPool(TaskView tv) {
Task task = tv.getTask();
- tv.resetViewProperties();
if (Console.Enabled) {
Console.log(Constants.Log.ViewPool.PoolCallbacks, "[TaskStackView|returnToPool]",
tv.getTask() + " tv: " + tv);
}
// Report that this tasks's data is no longer being used
- RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
- loader.unloadTaskData(task);
+ RecentsTaskLoader.getInstance().unloadTaskData(task);
// Detach the view from the hierarchy
detachViewFromParent(tv);
- // Disable hw layers on this view
+ // Disable HW layers
tv.disableHwLayers();
+
+ // Reset the view properties
+ tv.resetViewProperties();
}
@Override
- public void prepareViewToLeavePool(TaskView tv, Task prepareData, boolean isNewView) {
+ public void prepareViewToLeavePool(TaskView tv, Task task, boolean isNewView) {
if (Console.Enabled) {
Console.log(Constants.Log.ViewPool.PoolCallbacks, "[TaskStackView|leavePool]",
"isNewView: " + isNewView);
}
- // Setup and attach the view to the window
- Task task = prepareData;
- // We try and rebind the task (this MUST be done before the task filled)
+ // Rebind the task and request that this task's data be filled into the TaskView
tv.onTaskBound(task);
- // Request that this tasks's data be filled
- RecentsTaskLoader loader = RecentsTaskLoader.getInstance();
- loader.loadTaskData(task);
- // Find the index where this task should be placed in the children
- int insertIndex = -1;
- int childCount = getChildCount();
- for (int i = 0; i < childCount; i++) {
- Task tvTask = ((TaskView) getChildAt(i)).getTask();
- if (mStack.containsTask(task) && (mStack.indexOfTask(task) < mStack.indexOfTask(tvTask))) {
- insertIndex = i;
- break;
- }
- }
+ RecentsTaskLoader.getInstance().loadTaskData(task);
// Sanity check, the task view should always be clipping against the stack at this point,
// but just in case, re-enable it here
@@ -1228,6 +1220,20 @@
tv.setNoUserInteractionState();
}
+ // Find the index where this task should be placed in the stack
+ int insertIndex = -1;
+ int taskIndex = mStack.indexOfTask(task);
+ if (taskIndex != -1) {
+ int childCount = getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ Task tvTask = ((TaskView) getChildAt(i)).getTask();
+ if (taskIndex < mStack.indexOfTask(tvTask)) {
+ insertIndex = i;
+ break;
+ }
+ }
+ }
+
// Add/attach the view to the hierarchy
if (Console.Enabled) {
Console.log(Constants.Log.ViewPool.PoolCallbacks, " [TaskStackView|insertIndex]",
@@ -1237,7 +1243,7 @@
addView(tv, insertIndex);
// Set the callbacks and listeners for this new view
- tv.setOnClickListener(this);
+ setTouchOnTaskView(tv, true);
tv.setCallbacks(this);
} else {
attachViewToParent(tv, insertIndex, tv.getLayoutParams());
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java
index d2f18ae..f9c5f13 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java
@@ -371,11 +371,13 @@
@Override
public void onBeginDrag(View v) {
- // Enable HW layers
- mSv.addHwLayersRefCount("swipeBegin");
- // Disable clipping with the stack while we are swiping
TaskView tv = (TaskView) v;
+ // Disable clipping with the stack while we are swiping
tv.setClipViewInStack(false);
+ // Enable HW layers on that task
+ tv.enableHwLayers();
+ // Disallow touch events from this task view
+ mSv.setTouchOnTaskView(tv, false);
// Disallow parents from intercepting touch events
final ViewParent parent = mSv.getParent();
if (parent != null) {
@@ -391,25 +393,31 @@
@Override
public void onChildDismissed(View v) {
TaskView tv = (TaskView) v;
- mSv.onTaskDismissed(tv);
-
+ // Disable HW layers on that task
+ if (mSv.mHwLayersTrigger.getCount() == 0) {
+ tv.disableHwLayers();
+ }
// Re-enable clipping with the stack (we will reuse this view)
tv.setClipViewInStack(true);
-
- // Disable HW layers
- mSv.decHwLayersRefCount("swipeComplete");
+ // Remove the task view from the stack
+ mSv.onTaskDismissed(tv);
}
@Override
public void onSnapBackCompleted(View v) {
- // Re-enable clipping with the stack
- TaskView tv = (TaskView) v;
- tv.setClipViewInStack(true);
+ onDragCancelled(v);
}
@Override
public void onDragCancelled(View v) {
- // Disable HW layers
- mSv.decHwLayersRefCount("swipeCancelled");
+ TaskView tv = (TaskView) v;
+ // Disable HW layers on that task
+ if (mSv.mHwLayersTrigger.getCount() == 0) {
+ tv.disableHwLayers();
+ }
+ // Re-enable clipping with the stack
+ tv.setClipViewInStack(true);
+ // Re-enable touch events from this task view
+ mSv.setTouchOnTaskView(tv, true);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskThumbnailView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskThumbnailView.java
index c2b2094..636746d 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskThumbnailView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskThumbnailView.java
@@ -83,7 +83,7 @@
}
/** Binds the thumbnail view to the task */
- void rebindToTask(Task t, boolean animate) {
+ void rebindToTask(Task t) {
mTask = t;
if (t.thumbnail != null) {
setImageBitmap(t.thumbnail);
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java
index cfba74c..f9d5a65 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java
@@ -123,7 +123,7 @@
mThumbnailView = (TaskThumbnailView) findViewById(R.id.task_view_thumbnail);
if (mTaskDataLoaded) {
- onTaskDataLoaded(false);
+ onTaskDataLoaded();
}
}
@@ -551,11 +551,11 @@
}
@Override
- public void onTaskDataLoaded(boolean reloadingTaskData) {
+ public void onTaskDataLoaded() {
if (mThumbnailView != null && mBarView != null) {
// Bind each of the views to the new task data
- mThumbnailView.rebindToTask(mTask, reloadingTaskData);
- mBarView.rebindToTask(mTask, reloadingTaskData);
+ mThumbnailView.rebindToTask(mTask);
+ mBarView.rebindToTask(mTask);
// Rebind any listeners
mBarView.mApplicationIcon.setOnClickListener(this);
mBarView.mDismissButton.setOnClickListener(this);