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
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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<Task> tasksToForceLoad = new ArrayList<Task>();
|
||||
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. */
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user