From 8eaeb7dc93ed71b768a2ea8d45021cca010e8263 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Wed, 25 Jun 2014 15:10:59 -0700 Subject: [PATCH] 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 --- .../android/systemui/recents/Constants.java | 4 +- .../systemui/recents/DebugTrigger.java | 67 +++++++++++++++++++ .../systemui/recents/RecentsActivity.java | 39 ++++++++++- .../recents/RecentsConfiguration.java | 6 +- .../android/systemui/recents/Utilities.java | 12 ++-- .../recents/model/RecentsTaskLoader.java | 10 +-- .../android/systemui/recents/model/Task.java | 10 +-- .../systemui/recents/views/RecentsView.java | 57 +++++++++------- .../systemui/recents/views/TaskBarView.java | 25 +++---- .../systemui/recents/views/TaskStackView.java | 50 ++++++++------ .../views/TaskStackViewTouchHandler.java | 34 ++++++---- .../recents/views/TaskThumbnailView.java | 2 +- .../systemui/recents/views/TaskView.java | 8 +-- 13 files changed, 227 insertions(+), 97 deletions(-) create mode 100644 packages/SystemUI/src/com/android/systemui/recents/DebugTrigger.java diff --git a/packages/SystemUI/src/com/android/systemui/recents/Constants.java b/packages/SystemUI/src/com/android/systemui/recents/Constants.java index 2abbad5e0a295..8995437570ad8 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 class Constants { 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 class Constants { 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 0000000000000..d90e2beccbd94 --- /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 dfc075014c105..ecdc9dd01ca64 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 @@ package com.android.systemui.recents; 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.BroadcastReceiver; 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 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView } // 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 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView 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 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView 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 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView mRecentsView.focusNextTask(!backward); return true; } - + // Pass through the debug trigger + mDebugTrigger.onKeyEvent(keyCode); return super.onKeyDown(keyCode, event); } @@ -547,6 +563,23 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView } } + /** 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 10978ca59bc52..d57f779382ee8 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 @@ public class RecentsConfiguration { /** Dev options */ public boolean developerOptionsEnabled; + public boolean debugModeEnabled; /** Private constructor */ private RecentsConfiguration(Context context) { @@ -141,10 +142,14 @@ public class RecentsConfiguration { /** 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 @@ public class RecentsConfiguration { 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 25875bc6fef48..6d6376ffb30d9 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 @@ public class Utilities { } /** 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 a07670b544432..99910c7fa53cb 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.os.UserHandle; 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 @@ class TaskResourceLoader implements Runnable { mMainThreadHandler.post(new Runnable() { @Override public void run() { - t.notifyTaskDataLoaded(newThumbnail, newIcon, forceLoadTask); + t.notifyTaskDataLoaded(newThumbnail, newIcon); } }); } @@ -388,6 +389,7 @@ public class RecentsTaskLoader { if (Console.Enabled) { Console.log(Constants.Log.App.TaskDataLoader, "[RecentsTaskLoader|reload]"); } + RecentsConfiguration config = RecentsConfiguration.getInstance(); Resources res = context.getResources(); ArrayList tasksToForceLoad = new ArrayList(); TaskStack stack = new TaskStack(context); @@ -409,7 +411,7 @@ public class RecentsTaskLoader { 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 @@ public class RecentsTaskLoader { 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 @@ public class RecentsTaskLoader { 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 cba9e5ab56756..6b63b6114e893 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.content.Intent; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; +import com.android.systemui.recents.Utilities; /** @@ -29,7 +30,7 @@ public class Task { /* 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 class Task { 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 @@ public class Task { this.activityLabel = activityTitle; this.activityIcon = activityIcon; this.colorPrimary = colorPrimary; + this.colorPrimaryGreyscale = Utilities.colorToGreyscale(colorPrimary); this.isActive = isActive; this.userId = userId; } @@ -106,12 +109,11 @@ public class Task { } /** 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 43706533d0498..3856311b75de7 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.Context; 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 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV RecentsConfiguration mConfig; LayoutInflater mInflater; + Paint mDebugModePaint; // The space partitioning root of this container SpaceNode mBSP; @@ -107,6 +109,15 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV 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 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV } } + @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 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV } } - @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 80f804d6c9fa6..2c0dea333c1cf 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 @@ class TaskBarView extends FrameLayout { @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 @@ class TaskBarView extends FrameLayout { } /** 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 @@ class TaskBarView extends FrameLayout { } 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 861c1804832c6..452665a124f1d 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 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal 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 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal @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 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal 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 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal 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 d2f18aecbcaec..f9c5f13736d28 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 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback { @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 @@ class TaskStackViewTouchHandler implements SwipeHelper.Callback { @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 c2b2094629633..636746d4abd92 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 @@ public class TaskThumbnailView extends ImageView { } /** 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 cfba74cba9044..f9d5a65cabf62 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 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks, View.On mThumbnailView = (TaskThumbnailView) findViewById(R.id.task_view_thumbnail); if (mTaskDataLoaded) { - onTaskDataLoaded(false); + onTaskDataLoaded(); } } @@ -551,11 +551,11 @@ public class TaskView extends FrameLayout implements Task.TaskCallbacks, View.On } @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);