am 2fd3cb95: Merge "Fix ActivityContainer callback parcelling." into klp-modular-dev

* commit '2fd3cb9544df1e09caa725a8d542cf2fe1df0c75':
  Fix ActivityContainer callback parcelling.
This commit is contained in:
Craig Mautner
2014-04-16 20:10:26 +00:00
committed by Android Git Automerger
5 changed files with 49 additions and 10 deletions

View File

@ -1998,7 +1998,7 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM
data.enforceInterface(IActivityManager.descriptor);
IBinder parentActivityToken = data.readStrongBinder();
IActivityContainerCallback callback =
(IActivityContainerCallback) data.readStrongBinder();
IActivityContainerCallback.Stub.asInterface(data.readStrongBinder());
IActivityContainer activityContainer =
createActivityContainer(parentActivityToken, callback);
reply.writeNoException();
@ -4627,7 +4627,7 @@ class ActivityManagerProxy implements IActivityManager
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IActivityManager.descriptor);
data.writeStrongBinder(parentActivityToken);
data.writeStrongBinder((IBinder)callback);
data.writeStrongBinder(callback == null ? null : callback.asBinder());
mRemote.transact(CREATE_ACTIVITY_CONTAINER_TRANSACTION, data, reply, 0);
reply.readException();
final int result = reply.readInt();

View File

@ -92,8 +92,8 @@ public class ActivityView extends ViewGroup {
super.onAttachedToWindow();
try {
final IBinder token = mActivity.getActivityToken();
mActivityContainer =
ActivityManagerNative.getDefault().createActivityContainer(token, null);
mActivityContainer = ActivityManagerNative.getDefault().createActivityContainer(token,
new ActivityContainerCallback());
} catch (RemoteException e) {
throw new IllegalStateException("ActivityView: Unable to create ActivityContainer. "
+ e);
@ -282,4 +282,14 @@ public class ActivityView extends ViewGroup {
}
}
private class ActivityContainerCallback extends IActivityContainerCallback.Stub {
@Override
public void setVisible(IBinder container, boolean visible) {
if (DEBUG) Log.v(TAG, "setVisible(): container=" + container + " visible=" + visible);
if (visible) {
} else {
}
}
}
}

View File

@ -20,5 +20,5 @@ import android.os.IBinder;
/** @hide */
interface IActivityContainerCallback {
oneway void onLastActivityRemoved(IBinder container);
oneway void setVisible(IBinder container, boolean visible);
}

View File

@ -1025,6 +1025,16 @@ final class ActivityStack {
return mStackSupervisor.isFrontStack(this);
}
private void setVisibile(ActivityRecord r, boolean visible) {
r.visible = visible;
mWindowManager.setAppVisibility(r.appToken, visible);
final ArrayList<ActivityStack> containers = r.mChildContainers;
for (int containerNdx = containers.size() - 1; containerNdx >= 0; --containerNdx) {
ActivityContainer container = containers.get(containerNdx).mActivityContainer;
container.setVisible(visible);
}
}
/**
* Version of ensureActivitiesVisible that can easily be called anywhere.
*/
@ -1103,8 +1113,7 @@ final class ActivityStack {
if (!r.visible) {
if (DEBUG_VISBILITY) Slog.v(
TAG, "Starting and making visible: " + r);
r.visible = true;
mWindowManager.setAppVisibility(r.appToken, true);
setVisibile(r, true);
}
if (r != starting) {
mStackSupervisor.startSpecificActivityLocked(r, false, false);
@ -1130,7 +1139,7 @@ final class ActivityStack {
if (mTranslucentActivityWaiting != null) {
mUndrawnActivitiesBelowTopTranslucent.add(r);
}
mWindowManager.setAppVisibility(r.appToken, true);
setVisibile(r, true);
r.sleeping = false;
r.app.pendingUiClean = true;
r.app.thread.scheduleWindowVisibility(r.appToken, true);
@ -1166,9 +1175,8 @@ final class ActivityStack {
// sure they no longer are keeping the screen frozen.
if (r.visible) {
if (DEBUG_VISBILITY) Slog.v(TAG, "Making invisible: " + r);
r.visible = false;
try {
mWindowManager.setAppVisibility(r.appToken, false);
setVisibile(r, false);
switch (r.state) {
case STOPPING:
case STOPPED:

View File

@ -126,6 +126,7 @@ public final class ActivityStackSupervisor implements DisplayListener {
static final int HANDLE_DISPLAY_ADDED = FIRST_SUPERVISOR_STACK_MSG + 5;
static final int HANDLE_DISPLAY_CHANGED = FIRST_SUPERVISOR_STACK_MSG + 6;
static final int HANDLE_DISPLAY_REMOVED = FIRST_SUPERVISOR_STACK_MSG + 7;
static final int CONTAINER_CALLBACK_VISIBILITY = FIRST_SUPERVISOR_STACK_MSG + 8;
private final static String VIRTUAL_DISPLAY_BASE_NAME = "ActivityViewVirtualDisplay";
@ -2952,6 +2953,14 @@ public final class ActivityStackSupervisor implements DisplayListener {
case HANDLE_DISPLAY_REMOVED: {
handleDisplayRemovedLocked(msg.arg1);
} break;
case CONTAINER_CALLBACK_VISIBILITY: {
final ActivityContainer container = (ActivityContainer) msg.obj;
try {
// We only send this message if mCallback is non-null.
container.mCallback.setVisible(container.asBinder(), msg.arg1 == 1);
} catch (RemoteException e) {
}
}
}
}
}
@ -2963,6 +2972,8 @@ public final class ActivityStackSupervisor implements DisplayListener {
final ActivityRecord mParentActivity;
final String mIdString;
boolean mVisible = true;
/** Display this ActivityStack is currently on. Null if not attached to a Display. */
ActivityDisplay mActivityDisplay;
@ -3110,6 +3121,16 @@ public final class ActivityStackSupervisor implements DisplayListener {
}
}
void setVisible(boolean visible) {
if (mVisible != visible) {
mVisible = visible;
if (mCallback != null) {
mHandler.obtainMessage(CONTAINER_CALLBACK_VISIBILITY, visible ? 1 : 0,
0 /* unused */, this).sendToTarget();
}
}
}
@Override
public String toString() {
return mIdString + (mActivityDisplay == null ? "N" : "A");