Fix issue #17536024: The am start's wait option doesn't...
...give time in some cases This switch to multiple stacks broke the check to determine if it should actually wait for a new activity to be shown. The new check now also requires that the top activity be resumed, which means we may get some false positives where we decide to wait and shouldn't, but that is better than consistently not deciding to wait in some cases when we should. (And we will always finish waiting then next time something becomes visible). Also add another time, which is how long it took from the startActivity call to return with the result. And fix when we decide to report that we are done so that, in the case where we are bringing an existing activity to the foreground, we don't wait until its animation is complete. Change-Id: Id38ca0070f04e7bf8c73e131fb055808553a0e2f
This commit is contained in:
@@ -48,6 +48,7 @@ import android.os.IBinder;
|
||||
import android.os.ParcelFileDescriptor;
|
||||
import android.os.RemoteException;
|
||||
import android.os.ServiceManager;
|
||||
import android.os.SystemClock;
|
||||
import android.os.SystemProperties;
|
||||
import android.os.UserHandle;
|
||||
import android.text.TextUtils;
|
||||
@@ -726,6 +727,7 @@ public class Am extends BaseCommand {
|
||||
|
||||
IActivityManager.WaitResult result = null;
|
||||
int res;
|
||||
final long startTime = SystemClock.uptimeMillis();
|
||||
if (mWaitOption) {
|
||||
result = mAm.startActivityAndWait(null, null, intent, mimeType,
|
||||
null, null, 0, mStartFlags, profilerInfo, null, mUserId);
|
||||
@@ -734,6 +736,7 @@ public class Am extends BaseCommand {
|
||||
res = mAm.startActivityAsUser(null, null, intent, mimeType,
|
||||
null, null, 0, mStartFlags, profilerInfo, null, mUserId);
|
||||
}
|
||||
final long endTime = SystemClock.uptimeMillis();
|
||||
PrintStream out = mWaitOption ? System.out : System.err;
|
||||
boolean launched = false;
|
||||
switch (res) {
|
||||
@@ -811,6 +814,7 @@ public class Am extends BaseCommand {
|
||||
if (result.totalTime >= 0) {
|
||||
System.out.println("TotalTime: " + result.totalTime);
|
||||
}
|
||||
System.out.println("WaitTime: " + (endTime-startTime));
|
||||
System.out.println("Complete");
|
||||
}
|
||||
mRepeat--;
|
||||
|
||||
@@ -917,6 +917,7 @@ final class ActivityRecord {
|
||||
if (displayStartTime != 0) {
|
||||
reportLaunchTimeLocked(SystemClock.uptimeMillis());
|
||||
}
|
||||
mStackSupervisor.sendWaitingVisibleReportLocked(this);
|
||||
startTime = 0;
|
||||
finishLaunchTickingLocked();
|
||||
if (task != null) {
|
||||
|
||||
@@ -650,31 +650,47 @@ public final class ActivityStackSupervisor implements DisplayListener {
|
||||
}
|
||||
|
||||
void reportActivityVisibleLocked(ActivityRecord r) {
|
||||
sendWaitingVisibleReportLocked(r);
|
||||
notifyActivityDrawnForKeyguard();
|
||||
}
|
||||
|
||||
void sendWaitingVisibleReportLocked(ActivityRecord r) {
|
||||
boolean changed = false;
|
||||
for (int i = mWaitingActivityVisible.size()-1; i >= 0; i--) {
|
||||
WaitResult w = mWaitingActivityVisible.get(i);
|
||||
w.timeout = false;
|
||||
if (r != null) {
|
||||
w.who = new ComponentName(r.info.packageName, r.info.name);
|
||||
if (w.who == null) {
|
||||
changed = true;
|
||||
w.timeout = false;
|
||||
if (r != null) {
|
||||
w.who = new ComponentName(r.info.packageName, r.info.name);
|
||||
}
|
||||
w.totalTime = SystemClock.uptimeMillis() - w.thisTime;
|
||||
w.thisTime = w.totalTime;
|
||||
}
|
||||
w.totalTime = SystemClock.uptimeMillis() - w.thisTime;
|
||||
w.thisTime = w.totalTime;
|
||||
}
|
||||
mService.notifyAll();
|
||||
notifyActivityDrawnForKeyguard();
|
||||
if (changed) {
|
||||
mService.notifyAll();
|
||||
}
|
||||
}
|
||||
|
||||
void reportActivityLaunchedLocked(boolean timeout, ActivityRecord r,
|
||||
long thisTime, long totalTime) {
|
||||
boolean changed = false;
|
||||
for (int i = mWaitingActivityLaunched.size() - 1; i >= 0; i--) {
|
||||
WaitResult w = mWaitingActivityLaunched.remove(i);
|
||||
w.timeout = timeout;
|
||||
if (r != null) {
|
||||
w.who = new ComponentName(r.info.packageName, r.info.name);
|
||||
if (w.who == null) {
|
||||
changed = true;
|
||||
w.timeout = timeout;
|
||||
if (r != null) {
|
||||
w.who = new ComponentName(r.info.packageName, r.info.name);
|
||||
}
|
||||
w.thisTime = thisTime;
|
||||
w.totalTime = totalTime;
|
||||
}
|
||||
w.thisTime = thisTime;
|
||||
w.totalTime = totalTime;
|
||||
}
|
||||
mService.notifyAll();
|
||||
if (changed) {
|
||||
mService.notifyAll();
|
||||
}
|
||||
}
|
||||
|
||||
ActivityRecord topRunningActivityLocked() {
|
||||
@@ -933,7 +949,7 @@ public final class ActivityStackSupervisor implements DisplayListener {
|
||||
} while (!outResult.timeout && outResult.who == null);
|
||||
} else if (res == ActivityManager.START_TASK_TO_FRONT) {
|
||||
ActivityRecord r = stack.topRunningActivityLocked(null);
|
||||
if (r.nowVisible) {
|
||||
if (r.nowVisible && r.state == ActivityState.RESUMED) {
|
||||
outResult.timeout = false;
|
||||
outResult.who = new ComponentName(r.info.packageName, r.info.name);
|
||||
outResult.totalTime = 0;
|
||||
|
||||
Reference in New Issue
Block a user