Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1f7488e2 authored by Craig Mautner's avatar Craig Mautner
Browse files

resolved conflicts for merge of 4504de5d to master

Change-Id: I8d96fd2b479aebd6de913e617ca190f66c25aaa5
parents b0574ac0 4504de5d
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -3161,6 +3161,14 @@ package android.app {
    method public void update(android.app.ActivityOptions);
  }
  public class ActivityView extends android.view.ViewGroup {
    ctor public ActivityView(android.content.Context);
    ctor public ActivityView(android.content.Context, android.util.AttributeSet);
    ctor public ActivityView(android.content.Context, android.util.AttributeSet, int);
    method protected void onLayout(boolean, int, int, int, int);
    method public void startActivity(android.content.Intent);
  }
  public class AlarmManager {
    method public void cancel(android.app.PendingIntent);
    method public void set(int, long, android.app.PendingIntent);
+163 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2013 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 android.app;

import android.content.Context;
import android.content.ContextWrapper;
import android.content.Intent;
import android.graphics.SurfaceTexture;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.Surface;
import android.view.TextureView;
import android.view.TextureView.SurfaceTextureListener;
import android.view.ViewGroup;
import android.view.WindowManager;

public class ActivityView extends ViewGroup {
    private final TextureView mTextureView;
    private IActivityContainer mActivityContainer;
    private Activity mActivity;
    private boolean mAttached;
    private int mWidth;
    private int mHeight;

    public ActivityView(Context context) {
        this(context, null);
    }

    public ActivityView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public ActivityView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

        while (context instanceof ContextWrapper) {
            if (context instanceof Activity) {
                mActivity = (Activity)context;
                break;
            }
            context = ((ContextWrapper)context).getBaseContext();
        }
        if (mActivity == null) {
            throw new IllegalStateException("The ActivityView's Context is not an Activity.");
        }

        mTextureView = new TextureView(context);
        mTextureView.setSurfaceTextureListener(new ActivityViewSurfaceTextureListener());
        addView(mTextureView);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        mTextureView.layout(l, t, r, b);
    }

    @Override
    protected void onAttachedToWindow() {
        try {
            final IBinder token = mActivity.getActivityToken();
            mActivityContainer =
                    ActivityManagerNative.getDefault().createActivityContainer(token, null);
        } catch (RemoteException e) {
            throw new IllegalStateException("ActivityView: Unable to create ActivityContainer. "
                    + e);
        }

        final SurfaceTexture surfaceTexture = mTextureView.getSurfaceTexture();
        if (surfaceTexture != null) {
            createActivityView(surfaceTexture);
        }
    }

    @Override
    protected void onDetachedFromWindow() {
        if (mActivityContainer != null) {
            try {
                mActivityContainer.deleteActivityView();
            } catch (RemoteException e) {
            }
            mActivityContainer = null;
        }
        mAttached = false;
    }

    public void startActivity(Intent intent) {
        if (mActivityContainer != null && mAttached) {
            try {
                mActivityContainer.startActivity(intent);
            } catch (RemoteException e) {
                throw new IllegalStateException("ActivityView: Unable to startActivity. " + e);
            }
        }
    }

    /** Call when both mActivityContainer and mTextureView's SurfaceTexture are not null */
    private void createActivityView(SurfaceTexture surfaceTexture) {
        WindowManager wm = (WindowManager)mActivity.getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics metrics = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(metrics);

        try {
            mActivityContainer.createActivityView(new Surface(surfaceTexture), mWidth, mHeight,
                    metrics.densityDpi);
        } catch (RemoteException e) {
            mActivityContainer = null;
            throw new IllegalStateException(
                    "ActivityView: Unable to create ActivityContainer. " + e);
        }
        mAttached = true;
    }

    private class ActivityViewSurfaceTextureListener implements SurfaceTextureListener {
        @Override
        public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width,
                int height) {
            mWidth = width;
            mHeight = height;
            if (mActivityContainer != null) {
                createActivityView(surfaceTexture);
            }
        }

        @Override
        public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int width,
                int height) {
        }

        @Override
        public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
            try {
                mActivityContainer.deleteActivityView();
                // TODO: Add binderDied to handle this nullification.
                mActivityContainer = null;
            } catch (RemoteException r) {
            }
            mAttached = false;
            return false;
        }

        @Override
        public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {

        }

    }
}
+3 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package android.app;
import android.app.IActivityContainerCallback;
import android.content.Intent;
import android.os.IBinder;
import android.view.Surface;

/** @hide */
interface IActivityContainer {
@@ -26,4 +27,6 @@ interface IActivityContainer {
    int getDisplayId();
    void detachFromDisplay();
    int startActivity(in Intent intent);
    void createActivityView(in Surface surface, int width, int height, int density);
    void deleteActivityView();
}
+2 −1
Original line number Diff line number Diff line
@@ -24,7 +24,8 @@ import android.view.LayoutInflater;
public class PhoneLayoutInflater extends LayoutInflater {
    private static final String[] sClassPrefixList = {
        "android.widget.",
        "android.webkit."
        "android.webkit.",
        "android.app."
    };
    
    /**
+80 −11
Original line number Diff line number Diff line
@@ -59,6 +59,8 @@ import android.content.res.Configuration;
import android.graphics.Point;
import android.hardware.display.DisplayManager;
import android.hardware.display.DisplayManager.DisplayListener;
import android.hardware.display.DisplayManagerGlobal;
import android.hardware.display.VirtualDisplay;
import android.os.Binder;
import android.os.Bundle;
import android.os.Debug;
@@ -79,6 +81,7 @@ import android.util.SparseArray;
import android.util.SparseIntArray;
import android.view.Display;
import android.view.DisplayInfo;
import android.view.Surface;
import com.android.internal.app.HeavyWeightSwitcherActivity;
import com.android.internal.os.TransferPipe;
import com.android.server.am.ActivityManagerService.PendingActivityLaunch;
@@ -88,6 +91,7 @@ import com.android.server.wm.WindowManagerService;
import java.io.FileDescriptor;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;

@@ -119,6 +123,7 @@ public final class ActivityStackSupervisor implements DisplayListener {
    static final int HANDLE_DISPLAY_CHANGED = FIRST_SUPERVISOR_STACK_MSG + 6;
    static final int HANDLE_DISPLAY_REMOVED = FIRST_SUPERVISOR_STACK_MSG + 7;

    private final static String VIRTUAL_DISPLAY_BASE_NAME = "ActivityViewVirtualDisplay";

    // For debugging to make sure the caller when acquiring/releasing our
    // wake lock is the system process.
@@ -212,11 +217,13 @@ public final class ActivityStackSupervisor implements DisplayListener {
    /** Stack id of the front stack when user switched, indexed by userId. */
    SparseIntArray mUserStackInFront = new SparseIntArray(2);

    // TODO: Add listener for removal of references.
    /** Mapping from (ActivityStack/TaskStack).mStackId to their current state */
    SparseArray<ActivityContainer> mActivityContainers = new SparseArray<ActivityContainer>();
    SparseArray<WeakReference<ActivityContainer>> mActivityContainers =
            new SparseArray<WeakReference<ActivityContainer>>();

    /** Mapping from displayId to display current state */
    SparseArray<ActivityDisplay> mActivityDisplays = new SparseArray<ActivityDisplay>();
    private SparseArray<ActivityDisplay> mActivityDisplays = new SparseArray<ActivityDisplay>();

    public ActivityStackSupervisor(ActivityManagerService service) {
        mService = service;
@@ -2099,9 +2106,14 @@ public final class ActivityStackSupervisor implements DisplayListener {
    }

    ActivityStack getStack(int stackId) {
        ActivityContainer activityContainer = mActivityContainers.get(stackId);
        WeakReference<ActivityContainer> weakReference = mActivityContainers.get(stackId);
        if (weakReference != null) {
            ActivityContainer activityContainer = weakReference.get();
            if (activityContainer != null) {
                return activityContainer.mStack;
            } else {
                mActivityContainers.remove(stackId);
            }
        }
        return null;
    }
@@ -2135,7 +2147,7 @@ public final class ActivityStackSupervisor implements DisplayListener {
            IActivityContainerCallback callback) {
        ActivityContainer activityContainer = new ActivityContainer(parentActivity, stackId,
                callback);
        mActivityContainers.put(stackId, activityContainer);
        mActivityContainers.put(stackId, new WeakReference<ActivityContainer>(activityContainer));
        if (parentActivity != null) {
            parentActivity.mChildContainers.add(activityContainer.mStack);
        }
@@ -2729,12 +2741,18 @@ public final class ActivityStackSupervisor implements DisplayListener {
    }

    public void handleDisplayAddedLocked(int displayId) {
        boolean newDisplay;
        synchronized (mService) {
            newDisplay = mActivityDisplays.get(displayId) == null;
            if (newDisplay) {
                ActivityDisplay activityDisplay = new ActivityDisplay(displayId);
                mActivityDisplays.put(displayId, activityDisplay);
            }
        }
        if (newDisplay) {
            mWindowManager.onDisplayAdded(displayId);
        }
    }

    public void handleDisplayRemovedLocked(int displayId) {
        synchronized (mService) {
@@ -2961,6 +2979,49 @@ public final class ActivityStackSupervisor implements DisplayListener {
            return this;
        }

        @Override
        public void createActivityView(Surface surface, int width, int height, int density) {
            DisplayManagerGlobal dm = DisplayManagerGlobal.getInstance();
            VirtualDisplay virtualDisplay;
            long ident = Binder.clearCallingIdentity();
            try {
                virtualDisplay = dm.createVirtualDisplay(mService.mContext,
                        VIRTUAL_DISPLAY_BASE_NAME, width, height, density, surface,
                        // TODO: Add VIRTUAL_DISPLAY_FLAG_DISABLE_MIRRORING when it is available.
                        DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC);
            } finally {
                Binder.restoreCallingIdentity(ident);
            }

            final Display display = virtualDisplay.getDisplay();
            final int displayId = display.getDisplayId();

            // Do WindowManager operation first so that it is ahead of CREATE_STACK in the H queue.
            mWindowManager.onDisplayAdded(displayId);

            synchronized (mService) {
                ActivityDisplay activityDisplay = new ActivityDisplay(display);
                mActivityDisplays.put(displayId, activityDisplay);
                attachToDisplayLocked(activityDisplay);
                activityDisplay.mVirtualDisplay = virtualDisplay;
            }
        }

        @Override
        public void deleteActivityView() {
            synchronized (mService) {
                if (!isAttached()) {
                    return;
                }
                VirtualDisplay virtualDisplay = mActivityDisplay.mVirtualDisplay;
                if (virtualDisplay != null) {
                    virtualDisplay.release();
                    mActivityDisplay.mVirtualDisplay = null;
                }
                detachLocked();
            }
        }

        ActivityStackSupervisor getOuter() {
            return ActivityStackSupervisor.this;
        }
@@ -2990,9 +3051,17 @@ public final class ActivityStackSupervisor implements DisplayListener {
         * stacks, bottommost behind. Accessed directly by ActivityManager package classes */
        final ArrayList<ActivityStack> mStacks = new ArrayList<ActivityStack>();

        /** If this display is for an ActivityView then the VirtualDisplay created for it is stored
         * here. */
        VirtualDisplay mVirtualDisplay;

        ActivityDisplay(int displayId) {
            mDisplayId = displayId;
            mDisplay = mDisplayManager.getDisplay(displayId);
            this(mDisplayManager.getDisplay(displayId));
        }

        ActivityDisplay(Display display) {
            mDisplay = display;
            mDisplayId = display.getDisplayId();
            mDisplay.getDisplayInfo(mDisplayInfo);
        }

Loading