1 /* 2 * Copyright (C) 2016 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 package android.car.navigation; 17 18 import android.annotation.IntDef; 19 import android.annotation.SystemApi; 20 import android.os.Bundle; 21 import android.os.Parcel; 22 import android.os.Parcelable; 23 import java.lang.annotation.Retention; 24 import java.lang.annotation.RetentionPolicy; 25 26 /** 27 * Holds options related to navigation for the car's instrument cluster. 28 * @hide 29 */ 30 @SystemApi 31 public class CarNavigationInstrumentCluster implements Parcelable { 32 33 /** Navigation Next Turn messages contain an image, as well as an enum. */ 34 public static final int CLUSTER_TYPE_CUSTOM_IMAGES_SUPPORTED = 1; 35 /** Navigation Next Turn messages contain only an enum. */ 36 public static final int CLUSTER_TYPE_IMAGE_CODES_ONLY = 2; 37 38 /** @hide */ 39 @Retention(RetentionPolicy.SOURCE) 40 @IntDef({ 41 CLUSTER_TYPE_CUSTOM_IMAGES_SUPPORTED, 42 CLUSTER_TYPE_IMAGE_CODES_ONLY 43 }) 44 public @interface ClusterType {} 45 46 private int mMinIntervalMillis; 47 48 @ClusterType 49 private final int mType; 50 51 private final int mImageWidth; 52 53 private final int mImageHeight; 54 55 private final int mImageColorDepthBits; 56 57 private final Bundle mExtra; 58 59 public static final Parcelable.Creator<CarNavigationInstrumentCluster> CREATOR 60 = new Parcelable.Creator<CarNavigationInstrumentCluster>() { 61 public CarNavigationInstrumentCluster createFromParcel(Parcel in) { 62 return new CarNavigationInstrumentCluster(in); 63 } 64 65 public CarNavigationInstrumentCluster[] newArray(int size) { 66 return new CarNavigationInstrumentCluster[size]; 67 } 68 }; 69 70 public static CarNavigationInstrumentCluster createCluster(int minIntervalMillis) { 71 return new CarNavigationInstrumentCluster(minIntervalMillis, CLUSTER_TYPE_IMAGE_CODES_ONLY, 72 0, 0, 0); 73 } 74 75 public static CarNavigationInstrumentCluster createCustomImageCluster(int minIntervalMs, 76 int imageWidth, int imageHeight, int imageColorDepthBits) { 77 return new CarNavigationInstrumentCluster(minIntervalMs, 78 CLUSTER_TYPE_CUSTOM_IMAGES_SUPPORTED, 79 imageWidth, imageHeight, imageColorDepthBits); 80 } 81 82 /** Minimum time between instrument cluster updates in milliseconds.*/ 83 public int getMinIntervalMillis() { 84 return mMinIntervalMillis; 85 } 86 87 /** 88 * Type of instrument cluster, can be {@link #CLUSTER_TYPE_CUSTOM_IMAGES_SUPPORTED} or 89 * {@link #CLUSTER_TYPE_IMAGE_CODES_ONLY}. 90 */ 91 @ClusterType 92 public int getType() { 93 return mType; 94 } 95 96 /** If instrument cluster is image, width of instrument cluster in pixels. */ 97 public int getImageWidth() { 98 return mImageWidth; 99 } 100 101 /** If instrument cluster is image, height of instrument cluster in pixels. */ 102 public int getImageHeight() { 103 return mImageHeight; 104 } 105 106 /** 107 * Contains extra information about instrument cluster. 108 * @hide 109 */ 110 public Bundle getExtra() { return mExtra; } 111 112 /** 113 * If instrument cluster is image, number of bits of colour depth it supports (8, 16, or 32). 114 */ 115 public int getImageColorDepthBits() { 116 return mImageColorDepthBits; 117 } 118 119 public CarNavigationInstrumentCluster(CarNavigationInstrumentCluster that) { 120 this(that.mMinIntervalMillis, 121 that.mType, 122 that.mImageWidth, 123 that.mImageHeight, 124 that.mImageColorDepthBits); 125 } 126 127 /** 128 * Whether cluster support custom image or not. 129 * @return 130 */ 131 public boolean supportsCustomImages() { 132 return mType == CLUSTER_TYPE_CUSTOM_IMAGES_SUPPORTED; 133 } 134 135 private CarNavigationInstrumentCluster( 136 int minIntervalMillis, 137 @ClusterType int type, 138 int imageWidth, 139 int imageHeight, 140 int imageColorDepthBits) { 141 mMinIntervalMillis = minIntervalMillis; 142 mType = type; 143 mImageWidth = imageWidth; 144 mImageHeight = imageHeight; 145 mImageColorDepthBits = imageColorDepthBits; 146 mExtra = new Bundle(); 147 } 148 149 @Override 150 public int describeContents() { 151 return 0; 152 } 153 154 @Override 155 public void writeToParcel(Parcel dest, int flags) { 156 dest.writeInt(mMinIntervalMillis); 157 dest.writeInt(mType); 158 dest.writeInt(mImageWidth); 159 dest.writeInt(mImageHeight); 160 dest.writeInt(mImageColorDepthBits); 161 dest.writeBundle(mExtra); 162 } 163 164 private CarNavigationInstrumentCluster(Parcel in) { 165 mMinIntervalMillis = in.readInt(); 166 mType = in.readInt(); 167 mImageWidth = in.readInt(); 168 mImageHeight = in.readInt(); 169 mImageColorDepthBits = in.readInt(); 170 mExtra = in.readBundle(getClass().getClassLoader()); 171 } 172 173 /** Converts to string for debug purpose */ 174 @Override 175 public String toString() { 176 return CarNavigationInstrumentCluster.class.getSimpleName() + "{ " + 177 "minIntervalMillis: " + mMinIntervalMillis + ", " + 178 "type: " + mType + ", " + 179 "imageWidth: " + mImageWidth + ", " + 180 "imageHeight: " + mImageHeight + ", " + 181 "imageColourDepthBits: " + mImageColorDepthBits + 182 "extra: " + mExtra + " }"; 183 } 184 } 185