Merge "Reset deferred task removal when app token added." into klp-modular-dev

This commit is contained in:
Craig Mautner
2014-02-22 00:50:55 +00:00
committed by Android (Google) Code Review
3 changed files with 29 additions and 27 deletions

View File

@ -1672,7 +1672,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
return view.getParent() != null ? view : null; return view.getParent() != null ? view : null;
} catch (WindowManager.BadTokenException e) { } catch (WindowManager.BadTokenException e) {
// ignore // ignore
Log.w(TAG, appToken + " already running, starting window not displayed"); Log.w(TAG, appToken + " already running, starting window not displayed. " +
e.getMessage());
} catch (RuntimeException e) { } catch (RuntimeException e) {
// don't crash if something else bad happens, for example a // don't crash if something else bad happens, for example a
// failure loading resources because we are loading from an app // failure loading resources because we are loading from an app

View File

@ -16,11 +16,12 @@
package com.android.server.wm; package com.android.server.wm;
import static com.android.server.wm.WindowManagerService.TAG;
import android.util.EventLog; import android.util.EventLog;
import com.android.server.EventLogTags; import android.util.Slog;
class Task { class Task {
// private final String TAG = "TaskGroup";
TaskStack mStack; TaskStack mStack;
final AppTokenList mAppTokens = new AppTokenList(); final AppTokenList mAppTokens = new AppTokenList();
final int taskId; final int taskId;
@ -39,17 +40,24 @@ class Task {
} }
void addAppToken(int addPos, AppWindowToken wtoken) { void addAppToken(int addPos, AppWindowToken wtoken) {
final int lastPos = mAppTokens.size();
if (addPos > lastPos) {
// We lost an app token. Don't crash though.
Slog.e(TAG, "Task.addAppToken: Out of bounds attempt token=" + wtoken + " addPos="
+ addPos + " lastPos=" + lastPos);
addPos = lastPos;
}
mAppTokens.add(addPos, wtoken); mAppTokens.add(addPos, wtoken);
mDeferRemoval = false;
} }
boolean removeAppToken(AppWindowToken wtoken) { boolean removeAppToken(AppWindowToken wtoken) {
mAppTokens.remove(wtoken); boolean removed = mAppTokens.remove(wtoken);
if (mAppTokens.size() == 0) { if (mAppTokens.size() == 0) {
EventLog.writeEvent(com.android.server.EventLogTags.WM_TASK_REMOVED, taskId, EventLog.writeEvent(com.android.server.EventLogTags.WM_TASK_REMOVED, taskId,
"removeAppToken: last token"); "removeAppToken: last token");
return true;
} }
return false; return removed;
} }
@Override @Override

View File

@ -3486,7 +3486,7 @@ public class WindowManagerService extends IWindowManager.Stub
Task task = mTaskIdToTask.get(taskId); Task task = mTaskIdToTask.get(taskId);
if (task == null) { if (task == null) {
task = createTask(taskId, stackId, userId, atoken); createTask(taskId, stackId, userId, atoken);
} else { } else {
task.addAppToken(addPos, atoken); task.addAppToken(addPos, atoken);
} }
@ -3839,27 +3839,23 @@ public class WindowManagerService extends IWindowManager.Stub
} }
synchronized(mWindowMap) { synchronized(mWindowMap) {
boolean changed = false; final AppWindowToken newFocus;
if (token == null) { if (token == null) {
if (DEBUG_FOCUS_LIGHT) Slog.v(TAG, "Clearing focused app, was " + mFocusedApp); if (DEBUG_FOCUS_LIGHT) Slog.v(TAG, "Clearing focused app, was " + mFocusedApp);
changed = mFocusedApp != null; newFocus = null;
mFocusedApp = null;
if (changed) {
mInputMonitor.setFocusedAppLw(null);
}
} else { } else {
AppWindowToken newFocus = findAppWindowToken(token); newFocus = findAppWindowToken(token);
if (newFocus == null) { if (newFocus == null) {
Slog.w(TAG, "Attempted to set focus to non-existing app token: " + token); Slog.w(TAG, "Attempted to set focus to non-existing app token: " + token);
return;
} }
changed = mFocusedApp != newFocus;
if (DEBUG_FOCUS_LIGHT) Slog.v(TAG, "Set focused app to: " + newFocus if (DEBUG_FOCUS_LIGHT) Slog.v(TAG, "Set focused app to: " + newFocus
+ " old focus=" + mFocusedApp + " moveFocusNow=" + moveFocusNow); + " old focus=" + mFocusedApp + " moveFocusNow=" + moveFocusNow);
}
final boolean changed = mFocusedApp != newFocus;
if (changed) {
mFocusedApp = newFocus; mFocusedApp = newFocus;
if (changed) { mInputMonitor.setFocusedAppLw(null);
mInputMonitor.setFocusedAppLw(newFocus);
}
} }
if (moveFocusNow && changed) { if (moveFocusNow && changed) {
@ -4543,11 +4539,9 @@ public class WindowManagerService extends IWindowManager.Stub
void removeAppFromTaskLocked(AppWindowToken wtoken) { void removeAppFromTaskLocked(AppWindowToken wtoken) {
final Task task = mTaskIdToTask.get(wtoken.groupId); final Task task = mTaskIdToTask.get(wtoken.groupId);
if (task != null) { if (task != null) {
task.removeAppToken(wtoken); if (!task.removeAppToken(wtoken)) {
// Remove after bug resolved. Slog.e(TAG, "removeAppFromTaskLocked: token=" + wtoken + " not found.");
Slog.d(TAG, "removeAppFromTaskLocked: wtoken=" + wtoken }
+ " numTokens left=" + task.mAppTokens.size()
+ " Callers=" + Debug.getCallers(5));
} }
} }
@ -4583,6 +4577,8 @@ public class WindowManagerService extends IWindowManager.Stub
TAG, "Removing app " + wtoken + " delayed=" + delayed TAG, "Removing app " + wtoken + " delayed=" + delayed
+ " animation=" + wtoken.mAppAnimator.animation + " animation=" + wtoken.mAppAnimator.animation
+ " animating=" + wtoken.mAppAnimator.animating); + " animating=" + wtoken.mAppAnimator.animating);
if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG, "removeAppToken: "
+ wtoken + " delayed=" + delayed + " Callers=" + Debug.getCallers(4));
final TaskStack stack = mTaskIdToTask.get(wtoken.groupId).mStack; final TaskStack stack = mTaskIdToTask.get(wtoken.groupId).mStack;
if (delayed) { if (delayed) {
// set the token aside because it has an active animation to be finished // set the token aside because it has an active animation to be finished
@ -4598,9 +4594,6 @@ public class WindowManagerService extends IWindowManager.Stub
wtoken.mAppAnimator.animating = false; wtoken.mAppAnimator.animating = false;
removeAppFromTaskLocked(wtoken); removeAppFromTaskLocked(wtoken);
} }
if (DEBUG_ADD_REMOVE || DEBUG_TOKEN_MOVEMENT) Slog.v(TAG,
"removeAppToken: " + wtoken);
wtoken.removed = true; wtoken.removed = true;
if (wtoken.startingData != null) { if (wtoken.startingData != null) {