143c04a7c87404d078db60e09d2da0061d72357c2Steve Paik/*
243c04a7c87404d078db60e09d2da0061d72357c2Steve Paik * Copyright (C) 2016 The Android Open Source Project
343c04a7c87404d078db60e09d2da0061d72357c2Steve Paik *
443c04a7c87404d078db60e09d2da0061d72357c2Steve Paik * Licensed under the Apache License, Version 2.0 (the "License");
543c04a7c87404d078db60e09d2da0061d72357c2Steve Paik * you may not use this file except in compliance with the License.
643c04a7c87404d078db60e09d2da0061d72357c2Steve Paik * You may obtain a copy of the License at
743c04a7c87404d078db60e09d2da0061d72357c2Steve Paik *
843c04a7c87404d078db60e09d2da0061d72357c2Steve Paik *      http://www.apache.org/licenses/LICENSE-2.0
943c04a7c87404d078db60e09d2da0061d72357c2Steve Paik *
1043c04a7c87404d078db60e09d2da0061d72357c2Steve Paik * Unless required by applicable law or agreed to in writing, software
1143c04a7c87404d078db60e09d2da0061d72357c2Steve Paik * distributed under the License is distributed on an "AS IS" BASIS,
1243c04a7c87404d078db60e09d2da0061d72357c2Steve Paik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1343c04a7c87404d078db60e09d2da0061d72357c2Steve Paik * See the License for the specific language governing permissions and
1443c04a7c87404d078db60e09d2da0061d72357c2Steve Paik * limitations under the License.
1543c04a7c87404d078db60e09d2da0061d72357c2Steve Paik */
1643c04a7c87404d078db60e09d2da0061d72357c2Steve Paik
1743c04a7c87404d078db60e09d2da0061d72357c2Steve Paikpackage android.car.hardware.cabin;
1843c04a7c87404d078db60e09d2da0061d72357c2Steve Paik
1943c04a7c87404d078db60e09d2da0061d72357c2Steve Paikimport android.annotation.IntDef;
2043c04a7c87404d078db60e09d2da0061d72357c2Steve Paikimport android.annotation.SystemApi;
2143c04a7c87404d078db60e09d2da0061d72357c2Steve Paikimport android.car.Car;
2243c04a7c87404d078db60e09d2da0061d72357c2Steve Paikimport android.car.CarManagerBase;
2343c04a7c87404d078db60e09d2da0061d72357c2Steve Paikimport android.car.CarNotConnectedException;
2443c04a7c87404d078db60e09d2da0061d72357c2Steve Paikimport android.car.hardware.CarPropertyConfig;
2543c04a7c87404d078db60e09d2da0061d72357c2Steve Paikimport android.car.hardware.CarPropertyValue;
2643c04a7c87404d078db60e09d2da0061d72357c2Steve Paikimport android.car.hardware.property.CarPropertyManagerBase;
27af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Parkimport android.car.hardware.property.CarPropertyManagerBase.CarPropertyEventCallback;
2843c04a7c87404d078db60e09d2da0061d72357c2Steve Paikimport android.content.Context;
293ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrupimport android.os.Handler;
3043c04a7c87404d078db60e09d2da0061d72357c2Steve Paikimport android.os.IBinder;
3143c04a7c87404d078db60e09d2da0061d72357c2Steve Paikimport android.os.Looper;
3243c04a7c87404d078db60e09d2da0061d72357c2Steve Paikimport android.util.ArraySet;
3343c04a7c87404d078db60e09d2da0061d72357c2Steve Paik
34af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Parkimport java.lang.annotation.Retention;
35af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Parkimport java.lang.annotation.RetentionPolicy;
3643c04a7c87404d078db60e09d2da0061d72357c2Steve Paikimport java.lang.ref.WeakReference;
3743c04a7c87404d078db60e09d2da0061d72357c2Steve Paikimport java.util.Collection;
3843c04a7c87404d078db60e09d2da0061d72357c2Steve Paikimport java.util.List;
3943c04a7c87404d078db60e09d2da0061d72357c2Steve Paik
4043c04a7c87404d078db60e09d2da0061d72357c2Steve Paik/**
41150d8de43e71a624106e90bcc04067414c42ef18Keun-young Park * API for controlling Cabin system in cars.
42af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park * Most Car Cabin properties have both a MOVE and POSITION parameter associated with them.
43af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park *
44af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park * The MOVE parameter will start moving the device in the indicated direction.  Magnitude
45af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park * indicates relative speed.  For instance, setting the WINDOW_MOVE parameter to +1 rolls
46af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park * the window up.  Setting it to +2 (if available) will roll it up faster.
47af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park *
48af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park * POSITION parameter will move the device to the desired position.  For instance, if the
49af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park * WINDOW_POS has a range of 0-100, setting this parameter to 50 will open the window
50af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park * halfway.  Depending upon the initial position, the window may move up or down to the
51af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park * 50% value.
52af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park *
53af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park * One or both of the MOVE/POSITION parameters may be implemented depending upon the
54af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park * capability of the hardware.
5543c04a7c87404d078db60e09d2da0061d72357c2Steve Paik * @hide
5643c04a7c87404d078db60e09d2da0061d72357c2Steve Paik */
5743c04a7c87404d078db60e09d2da0061d72357c2Steve Paik@SystemApi
584cf6911619b9fe6ffeba7afeb05299aab165f184Keun-young Parkpublic final class CarCabinManager implements CarManagerBase {
591b1247b5648975dd41ee73c25425825abb256234Vitalii Tomkiv    private final static boolean DBG = false;
6043c04a7c87404d078db60e09d2da0061d72357c2Steve Paik    private final static String TAG = "CarCabinManager";
6143c04a7c87404d078db60e09d2da0061d72357c2Steve Paik    private final CarPropertyManagerBase mMgr;
62af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    private final ArraySet<CarCabinEventCallback> mCallbacks = new ArraySet<>();
6343c04a7c87404d078db60e09d2da0061d72357c2Steve Paik    private CarPropertyEventListenerToBase mListenerToBase = null;
6443c04a7c87404d078db60e09d2da0061d72357c2Steve Paik
65af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    /** Door properties are zoned by VehicleDoor */
6643c04a7c87404d078db60e09d2da0061d72357c2Steve Paik    /**
676817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * door position, int type
68af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * Max value indicates fully open, min value (0) indicates fully closed.
69af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     *
70af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * Some vehicles (minivans) can open the door electronically.  Hence, the ability
71af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * to write this property.
7243c04a7c87404d078db60e09d2da0061d72357c2Steve Paik     */
73af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_DOOR_POS = 0x0001;
746817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik    /** door move, int type
756817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Positive values open the door, negative values close it.
766817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     */
77af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_DOOR_MOVE = 0x0002;
786817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik    /** door lock, bool type
796817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * 'true' indicates door is locked.
80af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     */
81af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_DOOR_LOCK = 0x0003;
8243c04a7c87404d078db60e09d2da0061d72357c2Steve Paik
83af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    /** Mirror properties are zoned by VehicleMirror */
84af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    /**
856817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * mirror z position, int type
866817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Positive value indicates tilt upwards, negative value tilt downwards.
87af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     */
88af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_MIRROR_Z_POS = 0x1001;
896817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik    /** mirror z move, int type
906817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Positive value tilts the mirror upwards, negative value tilts downwards.
916817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     */
92af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_MIRROR_Z_MOVE = 0x1002;
93af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    /**
946817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * mirror y position, int type
956817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Positive value indicates tilt right, negative value tilt left
96af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     */
97af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_MIRROR_Y_POS = 0x1003;
986817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik    /** mirror y move, int type
996817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Positive value tilts the mirror right, negative value tilts left.
1006817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     */
101af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_MIRROR_Y_MOVE = 0x1004;
102af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    /**
1036817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * mirror lock, bool type
1046817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * True indicates mirror positions are locked and not changeable.
105af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     */
106af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_MIRROR_LOCK = 0x1005;
107af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    /**
1086817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * mirror fold, bool type
1096817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * True indicates mirrors are folded.
110af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     */
111af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_MIRROR_FOLD = 0x1006;
11243c04a7c87404d078db60e09d2da0061d72357c2Steve Paik
113af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    /** Seat properties are zoned by VehicleSeat */
114af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    /**
1156817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * seat memory select, int type
116af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * This parameter selects the memory preset to use to select the seat position.
1176817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * The minValue is always 1, and the maxValue determines the number of seat
118af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * positions available.
119af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     *
120af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * For instance, if the driver's seat has 3 memory presets, the maxValue will be 3.
121af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * When the user wants to select a preset, the desired preset number (1, 2, or 3)
122af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * is set.
123af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     */
124af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_SEAT_MEMORY_SELECT = 0x2001;
125af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    /**
1266817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * seat memory set, int type
127af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * This setting allows the user to save the current seat position settings into
128af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * the selected preset slot.  The maxValue for each seat position shall match
129af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * the maxValue for VEHICLE_PROPERTY_SEAT_MEMORY_SELECT.
130af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     */
131af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_SEAT_MEMORY_SET = 0x2002;
132af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    /**
1336817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * seat belt buckled, bool type
134af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * True indicates belt is buckled.
135af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     */
136af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_SEAT_BELT_BUCKLED = 0x2003;
137af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    /**
1386817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * seat belt height position, int type
139af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * Adjusts the shoulder belt anchor point.
1406817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Max value indicates highest position.
1416817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Min value indicates lowest position.
142af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     */
143af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_SEAT_BELT_HEIGHT_POS = 0x2004;
1446817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik    /** seat belt height move, int type
1456817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Adjusts the shoulder belt anchor point.
1466817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Positive value moves towards highest point.
1476817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Negative value moves towards lowest point.
1486817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     */
149af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_SEAT_BELT_HEIGHT_MOVE = 0x2005;
150af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    /**
1516817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * seat fore/aft position, int type
152af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * Sets the seat position forward (closer to steering wheel) and backwards.
1536817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Max value indicates closest to wheel, min value indicates most rearward position.
154af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     */
155af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_SEAT_FORE_AFT_POS = 0x2006;
1566817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik    /**
1576817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * seat fore/aft move, int type
1586817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Positive value moves seat forward (closer to steering wheel).
1596817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Negative value moves seat rearward.
1606817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     */
161af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_SEAT_FORE_AFT_MOVE = 0x2007;
162af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    /**
1636817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * seat backrest angle #1 position, int type
164af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * Backrest angle 1 is the actuator closest to the bottom of the seat.
165af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * Max value indicates angling forward towards the steering wheel.
166af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * Min value indicates full recline.
167af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     */
168af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_SEAT_BACKREST_ANGLE_1_POS = 0x2008;
1696817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik    /** seat backrest angle #1 move, int type
1706817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Backrest angle 1 is the actuator closest to the bottom of the seat.
1716817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Positive value angles seat towards the steering wheel.
1726817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Negatie value angles away from steering wheel.
1736817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     */
174af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_SEAT_BACKREST_ANGLE_1_MOVE = 0x2009;
175af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    /**
1766817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * seat backrest angle #2 position, int type
177af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * Backrest angle 2 is the next actuator up from the bottom of the seat.
178af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * Max value indicates angling forward towards the steering wheel.
179af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * Min value indicates full recline.
180af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     */
181af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_SEAT_BACKREST_ANGLE_2_POS = 0x200A;
1826817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik    /** seat backrest angle #2 move, int type
1836817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Backrest angle 2 is the next actuator up from the bottom of the seat.
1846817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Positive value tilts forward towards the steering wheel.
1856817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Negative value tilts backwards.
1866817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     */
187af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_SEAT_BACKREST_ANGLE_2_MOVE = 0x200B;
188af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    /**
1896817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * seat height position, int type
190af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * Sets the seat height.
191af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * Max value indicates highest position.
192af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * Min value indicates lowest position.
193af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     */
194af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_SEAT_HEIGHT_POS = 0x200C;
1956817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik    /** seat height move, int type
1966817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Sets the seat height.
1976817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Positive value raises the seat.
1986817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Negative value lowers the seat.
1996817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * */
200af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_SEAT_HEIGHT_MOVE = 0x200D;
201af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    /**
2026817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * seat depth position, int type
203af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * Sets the seat depth, distance from back rest to front edge of seat.
204af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * Max value indicates longest depth position.
205af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * Min value indicates shortest position.
206af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     */
207af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_SEAT_DEPTH_POS = 0x200E;
2086817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik    /** seat depth move, int type
2096817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Adjusts the seat depth, distance from back rest to front edge of seat.
2106817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Positive value increases the distance from back rest to front edge of seat.
2116817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Negative value decreases this distance.
2126817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     */
213af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_SEAT_DEPTH_MOVE = 0x200F;
214af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    /**
2156817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * seat tilt position, int type
216af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * Sets the seat tilt.
217af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * Max value indicates front edge of seat higher than back edge.
218af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * Min value indicates front edge of seat lower than back edge.
219af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     */
220af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_SEAT_TILT_POS = 0x2010;
2216817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik    /** seat tilt move, int type
2226817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Adjusts the seat tilt.
2236817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Positive value lifts front edge of seat higher than back edge.
2246817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Negative value lowers front edge of seat in relation to back edge.
2256817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     */
226af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_SEAT_TILT_MOVE = 0x2011;
227af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    /**
2286817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * seat lumbar fore/aft position, int type
2296817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Pushes the lumbar support forward and backwards.
230af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * Max value indicates most forward position.
231af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * Min value indicates most rearward position.
232af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     */
233af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_SEAT_LUMBAR_FORE_AFT_POS = 0x2012;
2346817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik    /** seat lumbar fore/aft move, int type
2356817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Adjusts the lumbar support forwards and backwards.
2366817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Positive value moves lumbar support forward.
2376817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Negative value moves lumbar support rearward.
2386817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     */
239af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_SEAT_LUMBAR_FORE_AFT_MOVE = 0x2013;
240af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    /**
2416817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * seat lumbar side support position, int type
242af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * Sets the amount of lateral lumbar support.
243af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * Max value indicates widest lumbar setting (i.e. least support)
244af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * Min value indicates thinnest lumbar setting.
245af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     */
246af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_SEAT_LUMBAR_SIDE_SUPPORT_POS = 0x2014;
2476817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik    /** seat lumbar side support move, int type
2486817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Adjusts the amount of lateral lumbar support.
2496817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Positive value widens the lumbar area.
2506817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Negative value makes the lumbar area thinner.
2516817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     */
252af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_SEAT_LUMBAR_SIDE_SUPPORT_MOVE = 0x2015;
253af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    /**
2546817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * seat headrest height position, int type
255af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * Sets the headrest height.
256af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * Max value indicates tallest setting.
257af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * Min value indicates shortest setting.
258af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     */
259af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_SEAT_HEADREST_HEIGHT_POS = 0x2016;
2606817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik    /** seat headrest height move, int type
2616817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Postive value moves the headrest higher.
2626817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Negative value moves the headrest lower.
2636817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     */
264af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_SEAT_HEADREST_HEIGHT_MOVE = 0x2017;
265af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    /**
2666817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * seat headrest angle position, int type
267af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * Sets the angle of the headrest.
268af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * Max value indicates most upright angle.
269af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * Min value indicates shallowest headrest angle.
270af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     */
271af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_SEAT_HEADREST_ANGLE_POS = 0x2018;
2726817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik    /** seat headrest angle move, int type
2736817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Adjusts the angle of the headrest.
2746817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Positive value angles headrest towards most upright angle.
2756817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Negative value angles headrest towards shallowest headrest angle.
2766817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     */
277af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_SEAT_HEADREST_ANGLE_MOVE = 0x2019;
278af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    /**
2796817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * seat headrest fore/aft position, int type
2806817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Sets the headrest forwards and backwards.
281af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * Max value indicates position closest to front of car.
282af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * Min value indicates position closest to rear of car.
283af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     */
284af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_SEAT_HEADREST_FORE_AFT_POS = 0x201A;
2856817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik    /** seat headrest fore/aft move, int type
2866817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Adjsuts the headrest forwards and backwards.
2876817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Positive value moves the headrest closer to front of car.
2886817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Negative value moves the headrest closer to rear of car.
2896817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     */
290af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_SEAT_HEADREST_FORE_AFT_MOVE = 0x201B;
29143c04a7c87404d078db60e09d2da0061d72357c2Steve Paik
292af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    /** Window properties are zoned by VehicleWindow */
293af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    /**
2946817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * window position, int type
2956817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Max = window up / closed.
2966817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Min = window down / open.
297af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     */
298af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_WINDOW_POS = 0x3001;
2996817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik    /** window move, int type
3006817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Positive value moves window up / closes window.
3016817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Negative value moves window down / opens window.
3026817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     */
303af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_WINDOW_MOVE = 0x3002;
304af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    /**
3056817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * window vent position, int type
306af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * This feature is used to control the vent feature on a sunroof.
3076817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Max = vent open.
3086817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Min = vent closed.
309af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     */
310af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_WINDOW_VENT_POS = 0x3003;
3116817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik    /** window vent move, int type
3126817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * This feature is used to control the vent feature on a sunroof.
3136817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Positive value opens the vent.
3146817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Negative value closes the vent.
3156817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     */
316af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_WINDOW_VENT_MOVE = 0x3004;
317af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    /**
3186817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * window lock, bool type
319af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     * True indicates windows are locked and can't be moved.
320af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park     */
321af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static final int ID_WINDOW_LOCK = 0x3005;
32243c04a7c87404d078db60e09d2da0061d72357c2Steve Paik
323af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    /** @hide */
324af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    @IntDef({
325af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_DOOR_POS,
326af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_DOOR_MOVE,
327af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_DOOR_LOCK,
328af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_MIRROR_Z_POS,
329af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_MIRROR_Z_MOVE,
330af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_MIRROR_Y_POS,
331af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_MIRROR_Y_MOVE,
332af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_MIRROR_LOCK,
333af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_MIRROR_FOLD,
334af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_SEAT_MEMORY_SELECT,
335af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_SEAT_MEMORY_SET,
336af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_SEAT_BELT_BUCKLED,
337af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_SEAT_BELT_HEIGHT_POS,
338af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_SEAT_BELT_HEIGHT_MOVE,
339af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_SEAT_FORE_AFT_POS,
340af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_SEAT_FORE_AFT_MOVE,
341af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_SEAT_BACKREST_ANGLE_1_POS,
342af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_SEAT_BACKREST_ANGLE_1_MOVE,
343af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_SEAT_BACKREST_ANGLE_2_POS,
344af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_SEAT_BACKREST_ANGLE_2_MOVE,
345af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_SEAT_HEIGHT_POS,
346af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_SEAT_HEIGHT_MOVE,
347af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_SEAT_DEPTH_POS,
348af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_SEAT_DEPTH_MOVE,
349af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_SEAT_TILT_POS,
350af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_SEAT_TILT_MOVE,
351af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_SEAT_LUMBAR_FORE_AFT_POS,
352af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_SEAT_LUMBAR_FORE_AFT_MOVE,
353af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_SEAT_LUMBAR_SIDE_SUPPORT_POS,
354af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_SEAT_LUMBAR_SIDE_SUPPORT_MOVE,
355af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_SEAT_HEADREST_HEIGHT_POS,
356af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_SEAT_HEADREST_HEIGHT_MOVE,
357af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_SEAT_HEADREST_ANGLE_POS,
358af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_SEAT_HEADREST_ANGLE_MOVE,
359af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_SEAT_HEADREST_FORE_AFT_POS,
360af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_SEAT_HEADREST_FORE_AFT_MOVE,
361af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_WINDOW_POS,
362af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_WINDOW_MOVE,
363af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_WINDOW_VENT_POS,
364af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_WINDOW_VENT_MOVE,
365af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        ID_WINDOW_LOCK
366af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    })
367af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    @Retention(RetentionPolicy.SOURCE)
368af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public @interface PropertyId {}
36943c04a7c87404d078db60e09d2da0061d72357c2Steve Paik
3706817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik    /**
3716817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Application registers CarCabinEventCallback object to receive updates and changes to
3726817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * subscribed Car Cabin properties.
3736817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     */
374af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public interface CarCabinEventCallback {
3756817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik        /**
3766817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik         * Called when a property is updated
3776817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik         * @param value Property that has been updated.
3786817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik         */
37943c04a7c87404d078db60e09d2da0061d72357c2Steve Paik        void onChangeEvent(CarPropertyValue value);
38043c04a7c87404d078db60e09d2da0061d72357c2Steve Paik
3816817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik        /**
3826817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik         * Called when an error is detected with a property
3836817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik         * @param propertyId
3846817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik         * @param zone
3856817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik         */
386af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        void onErrorEvent(@PropertyId int propertyId, int zone);
38743c04a7c87404d078db60e09d2da0061d72357c2Steve Paik    }
38843c04a7c87404d078db60e09d2da0061d72357c2Steve Paik
389af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    private static class CarPropertyEventListenerToBase implements CarPropertyEventCallback {
39043c04a7c87404d078db60e09d2da0061d72357c2Steve Paik        private final WeakReference<CarCabinManager> mManager;
39143c04a7c87404d078db60e09d2da0061d72357c2Steve Paik
39243c04a7c87404d078db60e09d2da0061d72357c2Steve Paik        public CarPropertyEventListenerToBase(CarCabinManager manager) {
39343c04a7c87404d078db60e09d2da0061d72357c2Steve Paik            mManager = new WeakReference<>(manager);
39443c04a7c87404d078db60e09d2da0061d72357c2Steve Paik        }
39543c04a7c87404d078db60e09d2da0061d72357c2Steve Paik
39643c04a7c87404d078db60e09d2da0061d72357c2Steve Paik        @Override
39743c04a7c87404d078db60e09d2da0061d72357c2Steve Paik        public void onChangeEvent(CarPropertyValue value) {
39843c04a7c87404d078db60e09d2da0061d72357c2Steve Paik            CarCabinManager manager = mManager.get();
39943c04a7c87404d078db60e09d2da0061d72357c2Steve Paik            if (manager != null) {
40043c04a7c87404d078db60e09d2da0061d72357c2Steve Paik                manager.handleOnChangeEvent(value);
40143c04a7c87404d078db60e09d2da0061d72357c2Steve Paik            }
40243c04a7c87404d078db60e09d2da0061d72357c2Steve Paik        }
40343c04a7c87404d078db60e09d2da0061d72357c2Steve Paik
40443c04a7c87404d078db60e09d2da0061d72357c2Steve Paik        @Override
40543c04a7c87404d078db60e09d2da0061d72357c2Steve Paik        public void onErrorEvent(int propertyId, int zone) {
40643c04a7c87404d078db60e09d2da0061d72357c2Steve Paik            CarCabinManager manager = mManager.get();
40743c04a7c87404d078db60e09d2da0061d72357c2Steve Paik            if (manager != null) {
40843c04a7c87404d078db60e09d2da0061d72357c2Steve Paik                manager.handleOnErrorEvent(propertyId, zone);
40943c04a7c87404d078db60e09d2da0061d72357c2Steve Paik            }
41043c04a7c87404d078db60e09d2da0061d72357c2Steve Paik        }
41143c04a7c87404d078db60e09d2da0061d72357c2Steve Paik    }
41243c04a7c87404d078db60e09d2da0061d72357c2Steve Paik
4136817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik    private void handleOnChangeEvent(CarPropertyValue value) {
414af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        Collection<CarCabinEventCallback> callbacks;
41543c04a7c87404d078db60e09d2da0061d72357c2Steve Paik        synchronized (this) {
416af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park            callbacks = new ArraySet<>(mCallbacks);
41743c04a7c87404d078db60e09d2da0061d72357c2Steve Paik        }
418af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        for (CarCabinEventCallback l: callbacks) {
41943c04a7c87404d078db60e09d2da0061d72357c2Steve Paik            l.onChangeEvent(value);
42043c04a7c87404d078db60e09d2da0061d72357c2Steve Paik        }
42143c04a7c87404d078db60e09d2da0061d72357c2Steve Paik    }
42243c04a7c87404d078db60e09d2da0061d72357c2Steve Paik
4236817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik    private void handleOnErrorEvent(int propertyId, int zone) {
424af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        Collection<CarCabinEventCallback> listeners;
42543c04a7c87404d078db60e09d2da0061d72357c2Steve Paik        synchronized (this) {
426af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park            listeners = new ArraySet<>(mCallbacks);
42743c04a7c87404d078db60e09d2da0061d72357c2Steve Paik        }
42843c04a7c87404d078db60e09d2da0061d72357c2Steve Paik        if (!listeners.isEmpty()) {
429af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park            for (CarCabinEventCallback l: listeners) {
43043c04a7c87404d078db60e09d2da0061d72357c2Steve Paik                l.onErrorEvent(propertyId, zone);
43143c04a7c87404d078db60e09d2da0061d72357c2Steve Paik            }
43243c04a7c87404d078db60e09d2da0061d72357c2Steve Paik        }
43343c04a7c87404d078db60e09d2da0061d72357c2Steve Paik    }
43443c04a7c87404d078db60e09d2da0061d72357c2Steve Paik
43543c04a7c87404d078db60e09d2da0061d72357c2Steve Paik    /**
4366817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Get an instance of CarCabinManager
43743c04a7c87404d078db60e09d2da0061d72357c2Steve Paik     *
43843c04a7c87404d078db60e09d2da0061d72357c2Steve Paik     * Should not be obtained directly by clients, use {@link Car#getCarManager(String)} instead.
4396817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * @param service
4406817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * @param context
4416817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * @param handler
44243c04a7c87404d078db60e09d2da0061d72357c2Steve Paik     * @hide
44343c04a7c87404d078db60e09d2da0061d72357c2Steve Paik     */
4443ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup    public CarCabinManager(IBinder service, Context context, Handler handler) {
4453ee334d8c220f631d2ea7fa225af148f41b43354Jason Tholstrup        mMgr = new CarPropertyManagerBase(service, handler, DBG, TAG);
44643c04a7c87404d078db60e09d2da0061d72357c2Steve Paik    }
44743c04a7c87404d078db60e09d2da0061d72357c2Steve Paik
4486817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik    /**
4496817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * All properties in CarCabinManager are zoned.
4506817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * @param propertyId
4516817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * @return true if property is a zoned type
4526817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     */
453af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public static boolean isZonedProperty(@PropertyId int propertyId) {
45443c04a7c87404d078db60e09d2da0061d72357c2Steve Paik        return true;
45543c04a7c87404d078db60e09d2da0061d72357c2Steve Paik    }
45643c04a7c87404d078db60e09d2da0061d72357c2Steve Paik
4576817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik    /**
4586817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Implement wrappers for contained CarPropertyManagerBase object
4596817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * @param callback
4606817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * @throws CarNotConnectedException
4616817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     */
462af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public synchronized void registerCallback(CarCabinEventCallback callback) throws
46343c04a7c87404d078db60e09d2da0061d72357c2Steve Paik            CarNotConnectedException {
464af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        if (mCallbacks.isEmpty()) {
46543c04a7c87404d078db60e09d2da0061d72357c2Steve Paik            mListenerToBase = new CarPropertyEventListenerToBase(this);
466af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park            mMgr.registerCallback(mListenerToBase);
46743c04a7c87404d078db60e09d2da0061d72357c2Steve Paik        }
468af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        mCallbacks.add(callback);
46943c04a7c87404d078db60e09d2da0061d72357c2Steve Paik    }
47043c04a7c87404d078db60e09d2da0061d72357c2Steve Paik
4716817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik    /**
4726817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Stop getting property updates for the given callback. If there are multiple registrations for
4736817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * this listener, all listening will be stopped.
4746817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * @param callback
4756817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     */
476150d8de43e71a624106e90bcc04067414c42ef18Keun-young Park    public synchronized void unregisterCallback(CarCabinEventCallback callback) {
477af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        mCallbacks.remove(callback);
478af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        if (mCallbacks.isEmpty()) {
479af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park            mMgr.unregisterCallback();
48043c04a7c87404d078db60e09d2da0061d72357c2Steve Paik            mListenerToBase = null;
48143c04a7c87404d078db60e09d2da0061d72357c2Steve Paik        }
48243c04a7c87404d078db60e09d2da0061d72357c2Steve Paik    }
48343c04a7c87404d078db60e09d2da0061d72357c2Steve Paik
4846817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik    /**
4856817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Get list of properties available to Car Cabin Manager
4866817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * @return List of CarPropertyConfig objects available via Car Cabin Manager.
4876817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * @throws CarNotConnectedException if the connection to the car service has been lost.
4886817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     */
48943c04a7c87404d078db60e09d2da0061d72357c2Steve Paik    public List<CarPropertyConfig> getPropertyList() throws CarNotConnectedException {
49043c04a7c87404d078db60e09d2da0061d72357c2Steve Paik        return mMgr.getPropertyList();
49143c04a7c87404d078db60e09d2da0061d72357c2Steve Paik    }
49243c04a7c87404d078db60e09d2da0061d72357c2Steve Paik
4936817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik    /**
4946817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Get value of boolean property
4956817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * @param propertyId
4966817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * @param area
4976817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * @return value of requested boolean property
4986817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * @throws CarNotConnectedException
4996817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     */
500af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public boolean getBooleanProperty(@PropertyId int propertyId, int area)
501af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park            throws CarNotConnectedException {
502af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        return mMgr.getBooleanProperty(propertyId, area);
50343c04a7c87404d078db60e09d2da0061d72357c2Steve Paik    }
50443c04a7c87404d078db60e09d2da0061d72357c2Steve Paik
5056817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik    /**
5066817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Get value of float property
5076817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * @param propertyId
5086817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * @param area
5096817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * @return value of requested float property
5106817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * @throws CarNotConnectedException
5116817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     */
512af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public float getFloatProperty(@PropertyId int propertyId, int area)
513af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park            throws CarNotConnectedException {
514af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        return mMgr.getFloatProperty(propertyId, area);
51543c04a7c87404d078db60e09d2da0061d72357c2Steve Paik    }
51643c04a7c87404d078db60e09d2da0061d72357c2Steve Paik
5176817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik    /**
5186817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Get value of integer property
5196817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * @param propertyId
5206817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * @param area
5216817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * @return value of requested integer property
5226817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * @throws CarNotConnectedException
5236817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     */
524af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public int getIntProperty(@PropertyId int propertyId, int area)
525af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park            throws CarNotConnectedException {
526af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        return mMgr.getIntProperty(propertyId, area);
52743c04a7c87404d078db60e09d2da0061d72357c2Steve Paik    }
52843c04a7c87404d078db60e09d2da0061d72357c2Steve Paik
5296817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik    /**
5306817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Set the value of a boolean property
5316817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * @param propertyId
5326817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * @param area
5336817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * @param val
5346817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * @throws CarNotConnectedException
5356817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     */
536af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public void setBooleanProperty(@PropertyId int propertyId, int area, boolean val)
53743c04a7c87404d078db60e09d2da0061d72357c2Steve Paik            throws CarNotConnectedException {
538af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        mMgr.setBooleanProperty(propertyId, area, val);
53943c04a7c87404d078db60e09d2da0061d72357c2Steve Paik    }
54043c04a7c87404d078db60e09d2da0061d72357c2Steve Paik
5416817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik    /**
5426817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Set the value of a float property
5436817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * @param propertyId
5446817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * @param area
5456817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * @param val
5466817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * @throws CarNotConnectedException
5476817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     */
548af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public void setFloatProperty(@PropertyId int propertyId, int area, float val)
549af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park            throws CarNotConnectedException {
550af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        mMgr.setFloatProperty(propertyId, area, val);
55143c04a7c87404d078db60e09d2da0061d72357c2Steve Paik    }
55243c04a7c87404d078db60e09d2da0061d72357c2Steve Paik
5536817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik    /**
5546817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * Set the value of an integer property
5556817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * @param propertyId
5566817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * @param area
5576817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * @param val
5586817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     * @throws CarNotConnectedException
5596817797a17e4b5a2421a3b109538c4c1831a6b59Steve Paik     */
560af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park    public void setIntProperty(@PropertyId int propertyId, int area, int val)
561af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park            throws CarNotConnectedException {
562af2cc99a2e8eea38a75b20b952ea5c0e7ebb4b1bKeun-young Park        mMgr.setIntProperty(propertyId, area, val);
56343c04a7c87404d078db60e09d2da0061d72357c2Steve Paik    }
56443c04a7c87404d078db60e09d2da0061d72357c2Steve Paik
56543c04a7c87404d078db60e09d2da0061d72357c2Steve Paik    /** @hide */
56643c04a7c87404d078db60e09d2da0061d72357c2Steve Paik    @Override
56743c04a7c87404d078db60e09d2da0061d72357c2Steve Paik    public void onCarDisconnected() {
56843c04a7c87404d078db60e09d2da0061d72357c2Steve Paik        mMgr.onCarDisconnected();
56943c04a7c87404d078db60e09d2da0061d72357c2Steve Paik    }
57043c04a7c87404d078db60e09d2da0061d72357c2Steve Paik}
571