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

Commit 1f3ecaae authored by Chong Zhang's avatar Chong Zhang
Browse files

wifi-display: add certification options

When certification mode is enabled:

- Pass wfd session info to wifi display settings

- Allow sink to connect to source

- Add interface in display manager for pausing/resuming session

- Add interface in WifiP2pManager for setting lc, oc and starting
  autonomous GO

Note that we're compliant regardless of certification mode, but
some confusing options (eg. allowing incoming connection from
sink) we want to hide when not being tested.

Bug: 9371882
Change-Id: Icc7dcae4e046453796cfa03f5f197055fabf234b
parent 570cd0f4
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -325,6 +325,16 @@ public final class DisplayManager {
        mGlobal.connectWifiDisplay(deviceAddress);
    }

    /** @hide */
    public void pauseWifiDisplay() {
        mGlobal.pauseWifiDisplay();
    }

    /** @hide */
    public void resumeWifiDisplay() {
        mGlobal.resumeWifiDisplay();
    }

    /**
     * Disconnects from the current Wifi display.
     * The results are sent as a {@link #ACTION_WIFI_DISPLAY_STATUS_CHANGED} broadcast.
+16 −0
Original line number Diff line number Diff line
@@ -287,6 +287,22 @@ public final class DisplayManagerGlobal {
        }
    }

    public void pauseWifiDisplay() {
        try {
            mDm.pauseWifiDisplay();
        } catch (RemoteException ex) {
            Log.e(TAG, "Failed to pause Wifi display.", ex);
        }
    }

    public void resumeWifiDisplay() {
        try {
            mDm.resumeWifiDisplay();
        } catch (RemoteException ex) {
            Log.e(TAG, "Failed to resume Wifi display.", ex);
        }
    }

    public void disconnectWifiDisplay() {
        try {
            mDm.disconnectWifiDisplay();
+6 −0
Original line number Diff line number Diff line
@@ -55,4 +55,10 @@ interface IDisplayManager {

    // No permissions required but must be same Uid as the creator.
    void releaseVirtualDisplay(in IBinder token);

    // Requires CONFIGURE_WIFI_DISPLAY permission.
    void pauseWifiDisplay();

    // Requires CONFIGURE_WIFI_DISPLAY permission.
    void resumeWifiDisplay();
}
+116 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2012 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.hardware.display;

import android.os.Parcel;
import android.os.Parcelable;

/**
 * This class contains information regarding a wifi display session
 * (such as session id, source ip address, etc.). This is needed for
 * Wifi Display Certification process.
 * <p>
 * This object is immutable.
 * </p>
 *
 * @hide
 */
public final class WifiDisplaySessionInfo implements Parcelable {
    private final boolean mClient;
    private final int mSessionId;
    private final String mGroupId;
    private final String mPassphrase;
    private final String mIP;

    public static final Creator<WifiDisplaySessionInfo> CREATOR =
            new Creator<WifiDisplaySessionInfo>() {
        @Override
        public WifiDisplaySessionInfo createFromParcel(Parcel in) {
            boolean client = (in.readInt() != 0);
            int session = in.readInt();
            String group = in.readString();
            String pp = in.readString();
            String ip = in.readString();

            return new WifiDisplaySessionInfo(client, session, group, pp, ip);
        }

        @Override
        public WifiDisplaySessionInfo[] newArray(int size) {
            return new WifiDisplaySessionInfo[size];
        }
    };

    public WifiDisplaySessionInfo() {
        this(true, 0, "", "", "");
    }

    public WifiDisplaySessionInfo(
            boolean client, int session, String group, String pp, String ip) {
        mClient = client;
        mSessionId = session;
        mGroupId = group;
        mPassphrase = pp;
        mIP = ip;
    }

    public boolean isClient() {
        return mClient;
    }

    public int getSessionId() {
        return mSessionId;
    }

    public String getGroupId() {
        return mGroupId;
    }

    public String getPassphrase() {
        return mPassphrase;
    }

    public String getIP() {
        return mIP;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(mClient ? 1 : 0);
        dest.writeInt(mSessionId);
        dest.writeString(mGroupId);
        dest.writeString(mPassphrase);
        dest.writeString(mIP);
    }

    @Override
    public int describeContents() {
        return 0;
    }

    // For debugging purposes only.
    @Override
    public String toString() {
        return "WifiDisplaySessionInfo:"
                +"\n    Client/Owner: " + (mClient ? "Client":"Owner")
                +"\n    GroupId: " + mGroupId
                +"\n    Passphrase: " + mPassphrase
                +"\n    SessionId: " + mSessionId
                +"\n    IP Address: " + mIP
                ;
    }
}
+23 −5
Original line number Diff line number Diff line
@@ -39,6 +39,9 @@ public final class WifiDisplayStatus implements Parcelable {
    private final WifiDisplay mActiveDisplay;
    private final WifiDisplay[] mDisplays;

    /** Session info needed for Miracast Certification */
    private final WifiDisplaySessionInfo mSessionInfo;

    /** Feature state: Wifi display is not available on this device. */
    public static final int FEATURE_STATE_UNAVAILABLE = 0;
    /** Feature state: Wifi display is disabled, probably because Wifi is disabled. */
@@ -76,8 +79,11 @@ public final class WifiDisplayStatus implements Parcelable {
                displays[i] = WifiDisplay.CREATOR.createFromParcel(in);
            }

            WifiDisplaySessionInfo sessionInfo =
                    WifiDisplaySessionInfo.CREATOR.createFromParcel(in);

            return new WifiDisplayStatus(featureState, scanState, activeDisplayState,
                    activeDisplay, displays);
                    activeDisplay, displays, sessionInfo);
        }

        public WifiDisplayStatus[] newArray(int size) {
@@ -87,11 +93,11 @@ public final class WifiDisplayStatus implements Parcelable {

    public WifiDisplayStatus() {
        this(FEATURE_STATE_UNAVAILABLE, SCAN_STATE_NOT_SCANNING, DISPLAY_STATE_NOT_CONNECTED,
                null, WifiDisplay.EMPTY_ARRAY);
                null, WifiDisplay.EMPTY_ARRAY, null);
    }

    public WifiDisplayStatus(int featureState, int scanState,
            int activeDisplayState, WifiDisplay activeDisplay, WifiDisplay[] displays) {
    public WifiDisplayStatus(int featureState, int scanState, int activeDisplayState,
            WifiDisplay activeDisplay, WifiDisplay[] displays, WifiDisplaySessionInfo sessionInfo) {
        if (displays == null) {
            throw new IllegalArgumentException("displays must not be null");
        }
@@ -101,6 +107,8 @@ public final class WifiDisplayStatus implements Parcelable {
        mActiveDisplayState = activeDisplayState;
        mActiveDisplay = activeDisplay;
        mDisplays = displays;

        mSessionInfo = (sessionInfo != null) ? sessionInfo : new WifiDisplaySessionInfo();
    }

    /**
@@ -151,6 +159,13 @@ public final class WifiDisplayStatus implements Parcelable {
        return mDisplays;
    }

    /**
     * Gets the Wifi display session info (required for certification only)
     */
    public WifiDisplaySessionInfo getSessionInfo() {
        return mSessionInfo;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(mFeatureState);
@@ -168,6 +183,8 @@ public final class WifiDisplayStatus implements Parcelable {
        for (WifiDisplay display : mDisplays) {
            display.writeToParcel(dest, flags);
        }

        mSessionInfo.writeToParcel(dest, flags);
    }

    @Override
@@ -183,6 +200,7 @@ public final class WifiDisplayStatus implements Parcelable {
                + ", activeDisplayState=" + mActiveDisplayState
                + ", activeDisplay=" + mActiveDisplay
                + ", displays=" + Arrays.toString(mDisplays)
                + ", sessionInfo=" + mSessionInfo
                + "}";
    }
}
Loading