Merge "Avoid making post state to RESUMED for a PAUSING activity" into qt-dev

This commit is contained in:
TreeHugger Robot
2019-07-03 06:20:07 +00:00
committed by Android (Google) Code Review
6 changed files with 56 additions and 10 deletions

View File

@@ -17,6 +17,7 @@
package android.app.servertransaction;
import static android.app.servertransaction.ActivityLifecycleItem.ON_RESUME;
import static android.app.servertransaction.ActivityLifecycleItem.UNDEFINED;
import android.annotation.UnsupportedAppUsage;
import android.app.ClientTransactionHandler;
@@ -38,10 +39,11 @@ public class NewIntentItem extends ClientTransactionItem {
@UnsupportedAppUsage
private List<ReferrerIntent> mIntents;
private boolean mResume;
@Override
public int getPostExecutionState() {
return ON_RESUME;
return mResume ? ON_RESUME : UNDEFINED;
}
@Override
@@ -58,12 +60,13 @@ public class NewIntentItem extends ClientTransactionItem {
private NewIntentItem() {}
/** Obtain an instance initialized with provided params. */
public static NewIntentItem obtain(List<ReferrerIntent> intents) {
public static NewIntentItem obtain(List<ReferrerIntent> intents, boolean resume) {
NewIntentItem instance = ObjectPool.obtain(NewIntentItem.class);
if (instance == null) {
instance = new NewIntentItem();
}
instance.mIntents = intents;
instance.mResume = resume;
return instance;
}
@@ -71,6 +74,7 @@ public class NewIntentItem extends ClientTransactionItem {
@Override
public void recycle() {
mIntents = null;
mResume = false;
ObjectPool.recycle(this);
}
@@ -80,11 +84,13 @@ public class NewIntentItem extends ClientTransactionItem {
/** Write to Parcel. */
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeBoolean(mResume);
dest.writeTypedList(mIntents, flags);
}
/** Read from Parcel. */
private NewIntentItem(Parcel in) {
mResume = in.readBoolean();
mIntents = in.createTypedArrayList(ReferrerIntent.CREATOR);
}
@@ -108,18 +114,19 @@ public class NewIntentItem extends ClientTransactionItem {
return false;
}
final NewIntentItem other = (NewIntentItem) o;
return Objects.equals(mIntents, other.mIntents);
return mResume == other.mResume && Objects.equals(mIntents, other.mIntents);
}
@Override
public int hashCode() {
int result = 17;
result = 31 * result + (mResume ? 1 : 0);
result = 31 * result + mIntents.hashCode();
return result;
}
@Override
public String toString() {
return "NewIntentItem{intents=" + mIntents + "}";
return "NewIntentItem{intents=" + mIntents + ",resume=" + mResume + "}";
}
}

View File

@@ -19,6 +19,8 @@ package android.app.activity;
import static android.content.Intent.ACTION_EDIT;
import static android.content.Intent.ACTION_VIEW;
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNull;
@@ -31,6 +33,7 @@ import android.app.servertransaction.ActivityConfigurationChangeItem;
import android.app.servertransaction.ActivityRelaunchItem;
import android.app.servertransaction.ClientTransaction;
import android.app.servertransaction.ClientTransactionItem;
import android.app.servertransaction.NewIntentItem;
import android.app.servertransaction.ResumeActivityItem;
import android.app.servertransaction.StopActivityItem;
import android.content.Intent;
@@ -45,9 +48,13 @@ import androidx.test.filters.MediumTest;
import androidx.test.rule.ActivityTestRule;
import androidx.test.runner.AndroidJUnit4;
import com.android.internal.content.ReferrerIntent;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
/**
@@ -307,6 +314,24 @@ public class ActivityThreadTest {
assertEquals(400, activity.mConfig.smallestScreenWidthDp);
}
@Test
public void testResumeAfterNewIntent() {
final Activity activity = mActivityTestRule.launchActivity(new Intent());
final ActivityThread activityThread = activity.getActivityThread();
final ArrayList<ReferrerIntent> rIntents = new ArrayList<>();
rIntents.add(new ReferrerIntent(new Intent(), "android.app.activity"));
InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
activityThread.executeTransaction(newNewIntentTransaction(activity, rIntents, false));
});
assertThat(activity.isResumed()).isFalse();
InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
activityThread.executeTransaction(newNewIntentTransaction(activity, rIntents, true));
});
assertThat(activity.isResumed()).isTrue();
}
/**
* Calls {@link ActivityThread#handleActivityConfigurationChanged(IBinder, Configuration, int)}
* to try to push activity configuration to the activity for the given sequence number.
@@ -386,6 +411,16 @@ public class ActivityThreadTest {
return transaction;
}
private static ClientTransaction newNewIntentTransaction(Activity activity,
List<ReferrerIntent> intents, boolean resume) {
final NewIntentItem item = NewIntentItem.obtain(intents, resume);
final ClientTransaction transaction = newTransaction(activity);
transaction.addCallback(item);
return transaction;
}
private static ClientTransaction newTransaction(Activity activity) {
final IApplicationThread appThread = activity.getActivityThread().getApplicationThread();
return ClientTransaction.obtain(appThread, activity.getActivityToken());

View File

@@ -214,15 +214,15 @@ public class ObjectPoolTests {
@Test
public void testRecycleNewIntentItem() {
NewIntentItem emptyItem = NewIntentItem.obtain(null);
NewIntentItem item = NewIntentItem.obtain(referrerIntentList());
NewIntentItem emptyItem = NewIntentItem.obtain(null, false);
NewIntentItem item = NewIntentItem.obtain(referrerIntentList(), false);
assertNotSame(item, emptyItem);
assertFalse(item.equals(emptyItem));
item.recycle();
assertEquals(item, emptyItem);
NewIntentItem item2 = NewIntentItem.obtain(referrerIntentList());
NewIntentItem item2 = NewIntentItem.obtain(referrerIntentList(), false);
assertSame(item, item2);
assertFalse(item2.equals(emptyItem));
}

View File

@@ -128,7 +128,7 @@ public class TransactionParcelTests {
@Test
public void testNewIntent() {
// Write to parcel
NewIntentItem item = NewIntentItem.obtain(referrerIntentList());
NewIntentItem item = NewIntentItem.obtain(referrerIntentList(), false);
writeAndPrepareForReading(item);
// Read from parcel and assert

View File

@@ -1616,8 +1616,11 @@ final class ActivityRecord extends ConfigurationContainer {
try {
ArrayList<ReferrerIntent> ar = new ArrayList<>(1);
ar.add(rintent);
// Making sure the client state is RESUMED after transaction completed and doing
// so only if activity is currently RESUMED. Otherwise, client may have extra
// life-cycle calls to RESUMED (and PAUSED later).
mAtmService.getLifecycleManager().scheduleTransaction(app.getThread(), appToken,
NewIntentItem.obtain(ar));
NewIntentItem.obtain(ar, mState == RESUMED));
unsent = false;
} catch (RemoteException e) {
Slog.w(TAG, "Exception thrown sending new intent to " + this, e);

View File

@@ -2964,7 +2964,8 @@ class ActivityStack extends ConfigurationContainer {
}
if (next.newIntents != null) {
transaction.addCallback(NewIntentItem.obtain(next.newIntents));
transaction.addCallback(
NewIntentItem.obtain(next.newIntents, true /* resume */));
}
// Well the app will no longer be stopped.