Home | History | Annotate | Download | only in app
      1 /*
      2  * Copyright (C) 2017 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.app;
     18 
     19 import android.annotation.IntDef;
     20 import android.annotation.NonNull;
     21 import android.annotation.SystemApi;
     22 import android.os.Parcel;
     23 import android.os.Parcelable;
     24 
     25 import java.io.PrintWriter;
     26 import java.lang.annotation.Retention;
     27 import java.lang.annotation.RetentionPolicy;
     28 
     29 /**
     30  * Display properties to be used by VR mode when creating a virtual display.
     31  *
     32  * @hide
     33  */
     34 @SystemApi
     35 public final class Vr2dDisplayProperties implements Parcelable {
     36 
     37     public static final int FLAG_VIRTUAL_DISPLAY_ENABLED = 1;
     38 
     39     /** @hide */
     40     @Retention(RetentionPolicy.SOURCE)
     41     @IntDef({
     42         FLAG_VIRTUAL_DISPLAY_ENABLED
     43     })
     44     public @interface Vr2dDisplayFlag {}
     45 
     46     /**
     47      * The actual width, height and dpi.
     48      */
     49     private final int mWidth;
     50     private final int mHeight;
     51     private final int mDpi;
     52 
     53     // Flags describing the virtual display behavior.
     54     private final int mAddedFlags;
     55     private final int mRemovedFlags;
     56 
     57     public Vr2dDisplayProperties(int width, int height, int dpi) {
     58         this(width, height, dpi, 0, 0);
     59     }
     60 
     61     private Vr2dDisplayProperties(int width, int height, int dpi, int flags, int removedFlags) {
     62         mWidth = width;
     63         mHeight = height;
     64         mDpi = dpi;
     65         mAddedFlags = flags;
     66         mRemovedFlags = removedFlags;
     67     }
     68 
     69     @Override
     70     public int hashCode() {
     71         int result = getWidth();
     72         result = 31 * result + getHeight();
     73         result = 31 * result + getDpi();
     74         return result;
     75     }
     76 
     77     @Override
     78     public String toString() {
     79         return "Vr2dDisplayProperties{"
     80                 + "mWidth=" + mWidth
     81                 + ", mHeight=" + mHeight
     82                 + ", mDpi=" + mDpi
     83                 + ", flags=" + toReadableFlags(mAddedFlags)
     84                 + ", removed_flags=" + toReadableFlags(mRemovedFlags)
     85                 + "}";
     86     }
     87 
     88     @Override
     89     public boolean equals(Object o) {
     90         if (this == o) return true;
     91         if (o == null || getClass() != o.getClass()) return false;
     92 
     93         Vr2dDisplayProperties that = (Vr2dDisplayProperties) o;
     94 
     95         if (getAddedFlags() != that.getAddedFlags()) return false;
     96         if (getRemovedFlags() != that.getRemovedFlags()) return false;
     97         if (getWidth() != that.getWidth()) return false;
     98         if (getHeight() != that.getHeight()) return false;
     99         return getDpi() == that.getDpi();
    100     }
    101 
    102     @Override
    103     public int describeContents() {
    104         return 0;
    105     }
    106 
    107     @Override
    108     public void writeToParcel(Parcel dest, int flags) {
    109         dest.writeInt(mWidth);
    110         dest.writeInt(mHeight);
    111         dest.writeInt(mDpi);
    112         dest.writeInt(mAddedFlags);
    113         dest.writeInt(mRemovedFlags);
    114     }
    115 
    116     public static final @android.annotation.NonNull Parcelable.Creator<Vr2dDisplayProperties> CREATOR
    117             = new Parcelable.Creator<Vr2dDisplayProperties>() {
    118         @Override
    119         public Vr2dDisplayProperties createFromParcel(Parcel source) {
    120             return new Vr2dDisplayProperties(source);
    121         }
    122 
    123         @Override
    124         public Vr2dDisplayProperties[] newArray(int size) {
    125             return new Vr2dDisplayProperties[size];
    126         }
    127     };
    128 
    129     private Vr2dDisplayProperties(Parcel source) {
    130         mWidth = source.readInt();
    131         mHeight = source.readInt();
    132         mDpi = source.readInt();
    133         mAddedFlags = source.readInt();
    134         mRemovedFlags = source.readInt();
    135     }
    136 
    137     /**
    138      * Prints out dump info.
    139      */
    140     public void dump(@NonNull PrintWriter pw, @NonNull String prefix) {
    141         pw.println(prefix + toString());
    142     }
    143 
    144     /**
    145      * Returns the width of VR 2d display.
    146      */
    147     public int getWidth() {
    148         return mWidth;
    149     }
    150 
    151     /**
    152      * Returns the height of VR 2d display.
    153      */
    154     public int getHeight() {
    155         return mHeight;
    156     }
    157 
    158     /**
    159      * Returns the dpi of VR 2d display.
    160      */
    161     public int getDpi() {
    162         return mDpi;
    163     }
    164 
    165     /**
    166      * Returns the added flags of VR 2d display. Flags are combined by logic or.
    167      */
    168     @Vr2dDisplayFlag
    169     public int getAddedFlags() {
    170         return mAddedFlags;
    171     }
    172 
    173     /**
    174      * Returns the removed flags of VR 2d display. Flags are combined by logic or.
    175      */
    176     @Vr2dDisplayFlag
    177     public int getRemovedFlags() {
    178         return mRemovedFlags;
    179     }
    180 
    181     private static String toReadableFlags(int flags) {
    182         String retval = "{";
    183         if ((flags & FLAG_VIRTUAL_DISPLAY_ENABLED) == FLAG_VIRTUAL_DISPLAY_ENABLED) {
    184             retval += "enabled";
    185         }
    186         return retval + "}";
    187     }
    188 
    189     /**
    190      * Convenience class for creating Vr2dDisplayProperties.
    191      */
    192     public static final class Builder {
    193         private int mAddedFlags = 0;
    194         private int mRemovedFlags = 0;
    195 
    196         // Negative values are translated as an "ignore" to VrManagerService.
    197         private int mWidth = -1;
    198         private int mHeight = -1;
    199         private int mDpi = -1;
    200 
    201         public Builder() {
    202         }
    203 
    204         /**
    205          * Sets the dimensions to use for the virtual display.
    206          */
    207         @NonNull
    208         public Builder setDimensions(int width, int height, int dpi) {
    209             mWidth = width;
    210             mHeight = height;
    211             mDpi = dpi;
    212             return this;
    213         }
    214 
    215         /**
    216          * Toggles the virtual display functionality for 2D activities in VR.
    217          */
    218         @NonNull
    219         public Builder setEnabled(boolean enabled) {
    220             if (enabled) {
    221                 addFlags(FLAG_VIRTUAL_DISPLAY_ENABLED);
    222             } else {
    223                 removeFlags(FLAG_VIRTUAL_DISPLAY_ENABLED);
    224             }
    225             return this;
    226         }
    227 
    228         /**
    229          * Adds property flags.
    230          */
    231         @NonNull
    232         public Builder addFlags(@Vr2dDisplayFlag int flags) {
    233             mAddedFlags |= flags;
    234             mRemovedFlags &= ~flags;
    235             return this;
    236         }
    237 
    238         /**
    239          * Removes property flags.
    240          */
    241         @NonNull
    242         public Builder removeFlags(@Vr2dDisplayFlag int flags) {
    243             mRemovedFlags |= flags;
    244             mAddedFlags &= ~flags;
    245             return this;
    246         }
    247 
    248         /**
    249          * Builds the Vr2dDisplayProperty instance.
    250          */
    251         @NonNull
    252         public Vr2dDisplayProperties build() {
    253             return new Vr2dDisplayProperties(mWidth, mHeight, mDpi, mAddedFlags, mRemovedFlags);
    254         }
    255     }
    256 }
    257