1951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen/*
2951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen * Copyright (C) 2012 The Android Open Source Project
3951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen *
4951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen * Licensed under the Apache License, Version 2.0 (the "License");
5951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen * you may not use this file except in compliance with the License.
6951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen * You may obtain a copy of the License at
7951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen *
8951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen *      http://www.apache.org/licenses/LICENSE-2.0
9951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen *
10951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen * Unless required by applicable law or agreed to in writing, software
11951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen * distributed under the License is distributed on an "AS IS" BASIS,
12951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen * See the License for the specific language governing permissions and
14951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen * limitations under the License.
15951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen */
16e5167f88f3734a048dc44199f3fff0432589db43Elliott Hughes
17e5167f88f3734a048dc44199f3fff0432589db43Elliott Hughes#include <sys/socket.h>
18951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
19951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen#include <common_time/ICommonClock.h>
20951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen#include <binder/Parcel.h>
21951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
22951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen#include "utils.h"
23951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
24951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chennamespace android {
25951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
26951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen/***** ICommonClock *****/
27951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
28951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenenum {
29951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    IS_COMMON_TIME_VALID = IBinder::FIRST_CALL_TRANSACTION,
30951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    COMMON_TIME_TO_LOCAL_TIME,
31951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    LOCAL_TIME_TO_COMMON_TIME,
32951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    GET_COMMON_TIME,
33951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    GET_COMMON_FREQ,
34951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    GET_LOCAL_TIME,
35951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    GET_LOCAL_FREQ,
36951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    GET_ESTIMATED_ERROR,
37951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    GET_TIMELINE_ID,
38951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    GET_STATE,
39951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    GET_MASTER_ADDRESS,
40951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    REGISTER_LISTENER,
41951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    UNREGISTER_LISTENER,
42951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen};
43951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
44951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenconst String16 ICommonClock::kServiceName("common_time.clock");
45951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenconst uint64_t ICommonClock::kInvalidTimelineID = 0;
46951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenconst int32_t ICommonClock::kErrorEstimateUnknown = 0x7FFFFFFF;
47951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
48951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenclass BpCommonClock : public BpInterface<ICommonClock>
49951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen{
50951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen  public:
51951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    BpCommonClock(const sp<IBinder>& impl)
52951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        : BpInterface<ICommonClock>(impl) {}
53951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
54951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    virtual status_t isCommonTimeValid(bool* valid, uint32_t* timelineID) {
55951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        Parcel data, reply;
56951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        data.writeInterfaceToken(ICommonClock::getInterfaceDescriptor());
57951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        status_t status = remote()->transact(IS_COMMON_TIME_VALID,
58951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                                             data,
59951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                                             &reply);
60951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        if (status == OK) {
61951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            status = reply.readInt32();
62951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            if (status == OK) {
63951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                *valid = reply.readInt32();
64951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                *timelineID = reply.readInt32();
65951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            }
66951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        }
67951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        return status;
68951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    }
69951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
70951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    virtual status_t commonTimeToLocalTime(int64_t commonTime,
71951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            int64_t* localTime) {
72951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        Parcel data, reply;
73951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        data.writeInterfaceToken(ICommonClock::getInterfaceDescriptor());
74951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        data.writeInt64(commonTime);
75951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        status_t status = remote()->transact(COMMON_TIME_TO_LOCAL_TIME,
76951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                data, &reply);
77951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        if (status == OK) {
78951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            status = reply.readInt32();
79951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            if (status == OK) {
80951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                *localTime = reply.readInt64();
81951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            }
82951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        }
83951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        return status;
84951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    }
85951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
86951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    virtual status_t localTimeToCommonTime(int64_t localTime,
87951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            int64_t* commonTime) {
88951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        Parcel data, reply;
89951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        data.writeInterfaceToken(ICommonClock::getInterfaceDescriptor());
90951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        data.writeInt64(localTime);
91951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        status_t status = remote()->transact(LOCAL_TIME_TO_COMMON_TIME,
92951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                data, &reply);
93951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        if (status == OK) {
94951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            status = reply.readInt32();
95951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            if (status == OK) {
96951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                *commonTime = reply.readInt64();
97951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            }
98951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        }
99951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        return status;
100951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    }
101951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
102951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    virtual status_t getCommonTime(int64_t* commonTime) {
103951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        Parcel data, reply;
104951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        data.writeInterfaceToken(ICommonClock::getInterfaceDescriptor());
105951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        status_t status = remote()->transact(GET_COMMON_TIME, data, &reply);
106951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        if (status == OK) {
107951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            status = reply.readInt32();
108951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            if (status == OK) {
109951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                *commonTime = reply.readInt64();
110951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            }
111951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        }
112951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        return status;
113951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    }
114951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
115951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    virtual status_t getCommonFreq(uint64_t* freq) {
116951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        Parcel data, reply;
117951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        data.writeInterfaceToken(ICommonClock::getInterfaceDescriptor());
118951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        status_t status = remote()->transact(GET_COMMON_FREQ, data, &reply);
119951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        if (status == OK) {
120951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            status = reply.readInt32();
121951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            if (status == OK) {
122951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                *freq = reply.readInt64();
123951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            }
124951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        }
125951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        return status;
126951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    }
127951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
128951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    virtual status_t getLocalTime(int64_t* localTime) {
129951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        Parcel data, reply;
130951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        data.writeInterfaceToken(ICommonClock::getInterfaceDescriptor());
131951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        status_t status = remote()->transact(GET_LOCAL_TIME, data, &reply);
132951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        if (status == OK) {
133951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            status = reply.readInt32();
134951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            if (status == OK) {
135951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                *localTime = reply.readInt64();
136951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            }
137951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        }
138951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        return status;
139951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    }
140951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
141951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    virtual status_t getLocalFreq(uint64_t* freq) {
142951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        Parcel data, reply;
143951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        data.writeInterfaceToken(ICommonClock::getInterfaceDescriptor());
144951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        status_t status = remote()->transact(GET_LOCAL_FREQ, data, &reply);
145951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        if (status == OK) {
146951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            status = reply.readInt32();
147951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            if (status == OK) {
148951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                *freq = reply.readInt64();
149951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            }
150951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        }
151951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        return status;
152951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    }
153951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
154951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    virtual status_t getEstimatedError(int32_t* estimate) {
155951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        Parcel data, reply;
156951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        data.writeInterfaceToken(ICommonClock::getInterfaceDescriptor());
157951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        status_t status = remote()->transact(GET_ESTIMATED_ERROR, data, &reply);
158951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        if (status == OK) {
159951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            status = reply.readInt32();
160951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            if (status == OK) {
161951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                *estimate = reply.readInt32();
162951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            }
163951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        }
164951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        return status;
165951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    }
166951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
167951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    virtual status_t getTimelineID(uint64_t* id) {
168951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        Parcel data, reply;
169951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        data.writeInterfaceToken(ICommonClock::getInterfaceDescriptor());
170951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        status_t status = remote()->transact(GET_TIMELINE_ID, data, &reply);
171951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        if (status == OK) {
172951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            status = reply.readInt32();
173951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            if (status == OK) {
174951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                *id = static_cast<uint64_t>(reply.readInt64());
175951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            }
176951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        }
177951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        return status;
178951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    }
179951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
180951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    virtual status_t getState(State* state) {
181951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        Parcel data, reply;
182951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        data.writeInterfaceToken(ICommonClock::getInterfaceDescriptor());
183951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        status_t status = remote()->transact(GET_STATE, data, &reply);
184951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        if (status == OK) {
185951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            status = reply.readInt32();
186951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            if (status == OK) {
187951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                *state = static_cast<State>(reply.readInt32());
188951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            }
189951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        }
190951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        return status;
191951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    }
192951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
193951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    virtual status_t getMasterAddr(struct sockaddr_storage* addr) {
194951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        Parcel data, reply;
195951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        data.writeInterfaceToken(ICommonClock::getInterfaceDescriptor());
196951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        status_t status = remote()->transact(GET_MASTER_ADDRESS, data, &reply);
197951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        if (status == OK) {
198951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            status = reply.readInt32();
199951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            if (status == OK)
200951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                deserializeSockaddr(&reply, addr);
201951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        }
202951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        return status;
203951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    }
204951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
205951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    virtual status_t registerListener(
206951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            const sp<ICommonClockListener>& listener) {
207951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        Parcel data, reply;
208951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        data.writeInterfaceToken(ICommonClock::getInterfaceDescriptor());
209951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        data.writeStrongBinder(listener->asBinder());
210951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
211951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        status_t status = remote()->transact(REGISTER_LISTENER, data, &reply);
212951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
213951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        if (status == OK) {
214951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            status = reply.readInt32();
215951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        }
216951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
217951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        return status;
218951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    }
219951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
220951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    virtual status_t unregisterListener(
221951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            const sp<ICommonClockListener>& listener) {
222951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        Parcel data, reply;
223951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        data.writeInterfaceToken(ICommonClock::getInterfaceDescriptor());
224951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        data.writeStrongBinder(listener->asBinder());
225951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        status_t status = remote()->transact(UNREGISTER_LISTENER, data, &reply);
226951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
227951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        if (status == OK) {
228951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            status = reply.readInt32();
229951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        }
230951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
231951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        return status;
232951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    }
233951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen};
234951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
235951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. ChenIMPLEMENT_META_INTERFACE(CommonClock, "android.os.ICommonClock");
236951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
237951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenstatus_t BnCommonClock::onTransact(uint32_t code,
238951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                                   const Parcel& data,
239951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                                   Parcel* reply,
240951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                                   uint32_t flags) {
241951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    switch(code) {
242951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        case IS_COMMON_TIME_VALID: {
243951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            CHECK_INTERFACE(ICommonClock, data, reply);
244951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            bool valid;
245951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            uint32_t timelineID;
246951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            status_t status = isCommonTimeValid(&valid, &timelineID);
247951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            reply->writeInt32(status);
248951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            if (status == OK) {
249951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                reply->writeInt32(valid);
250951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                reply->writeInt32(timelineID);
251951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            }
252951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            return OK;
253951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        } break;
254951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
255951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        case COMMON_TIME_TO_LOCAL_TIME: {
256951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            CHECK_INTERFACE(ICommonClock, data, reply);
257951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            int64_t commonTime = data.readInt64();
258951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            int64_t localTime;
259951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            status_t status = commonTimeToLocalTime(commonTime, &localTime);
260951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            reply->writeInt32(status);
261951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            if (status == OK) {
262951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                reply->writeInt64(localTime);
263951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            }
264951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            return OK;
265951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        } break;
266951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
267951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        case LOCAL_TIME_TO_COMMON_TIME: {
268951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            CHECK_INTERFACE(ICommonClock, data, reply);
269951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            int64_t localTime = data.readInt64();
270951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            int64_t commonTime;
271951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            status_t status = localTimeToCommonTime(localTime, &commonTime);
272951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            reply->writeInt32(status);
273951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            if (status == OK) {
274951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                reply->writeInt64(commonTime);
275951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            }
276951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            return OK;
277951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        } break;
278951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
279951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        case GET_COMMON_TIME: {
280951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            CHECK_INTERFACE(ICommonClock, data, reply);
281951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            int64_t commonTime;
282951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            status_t status = getCommonTime(&commonTime);
283951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            reply->writeInt32(status);
284951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            if (status == OK) {
285951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                reply->writeInt64(commonTime);
286951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            }
287951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            return OK;
288951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        } break;
289951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
290951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        case GET_COMMON_FREQ: {
291951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            CHECK_INTERFACE(ICommonClock, data, reply);
292951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            uint64_t freq;
293951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            status_t status = getCommonFreq(&freq);
294951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            reply->writeInt32(status);
295951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            if (status == OK) {
296951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                reply->writeInt64(freq);
297951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            }
298951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            return OK;
299951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        } break;
300951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
301951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        case GET_LOCAL_TIME: {
302951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            CHECK_INTERFACE(ICommonClock, data, reply);
303951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            int64_t localTime;
304951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            status_t status = getLocalTime(&localTime);
305951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            reply->writeInt32(status);
306951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            if (status == OK) {
307951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                reply->writeInt64(localTime);
308951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            }
309951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            return OK;
310951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        } break;
311951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
312951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        case GET_LOCAL_FREQ: {
313951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            CHECK_INTERFACE(ICommonClock, data, reply);
314951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            uint64_t freq;
315951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            status_t status = getLocalFreq(&freq);
316951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            reply->writeInt32(status);
317951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            if (status == OK) {
318951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                reply->writeInt64(freq);
319951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            }
320951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            return OK;
321951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        } break;
322951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
323951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        case GET_ESTIMATED_ERROR: {
324951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            CHECK_INTERFACE(ICommonClock, data, reply);
325951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            int32_t error;
326951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            status_t status = getEstimatedError(&error);
327951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            reply->writeInt32(status);
328951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            if (status == OK) {
329951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                reply->writeInt32(error);
330951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            }
331951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            return OK;
332951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        } break;
333951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
334951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        case GET_TIMELINE_ID: {
335951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            CHECK_INTERFACE(ICommonClock, data, reply);
336951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            uint64_t id;
337951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            status_t status = getTimelineID(&id);
338951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            reply->writeInt32(status);
339951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            if (status == OK) {
340951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                reply->writeInt64(static_cast<int64_t>(id));
341951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            }
342951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            return OK;
343951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        } break;
344951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
345951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        case GET_STATE: {
346951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            CHECK_INTERFACE(ICommonClock, data, reply);
347951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            State state;
348951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            status_t status = getState(&state);
349951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            reply->writeInt32(status);
350951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            if (status == OK) {
351951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                reply->writeInt32(static_cast<int32_t>(state));
352951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            }
353951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            return OK;
354951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        } break;
355951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
356951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        case GET_MASTER_ADDRESS: {
357951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            CHECK_INTERFACE(ICommonClock, data, reply);
358951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            struct sockaddr_storage addr;
359951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            status_t status = getMasterAddr(&addr);
360951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
361951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            if ((status == OK) && !canSerializeSockaddr(&addr)) {
362951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                status = UNKNOWN_ERROR;
363951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            }
364951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
365951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            reply->writeInt32(status);
366951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
367951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            if (status == OK) {
368951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                serializeSockaddr(reply, &addr);
369951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            }
370951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
371951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            return OK;
372951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        } break;
373951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
374951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        case REGISTER_LISTENER: {
375951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            CHECK_INTERFACE(ICommonClock, data, reply);
376951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            sp<ICommonClockListener> listener =
377951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                interface_cast<ICommonClockListener>(data.readStrongBinder());
378951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            status_t status = registerListener(listener);
379951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            reply->writeInt32(status);
380951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            return OK;
381951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        } break;
382951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
383951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        case UNREGISTER_LISTENER: {
384951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            CHECK_INTERFACE(ICommonClock, data, reply);
385951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            sp<ICommonClockListener> listener =
386951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                interface_cast<ICommonClockListener>(data.readStrongBinder());
387951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            status_t status = unregisterListener(listener);
388951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            reply->writeInt32(status);
389951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            return OK;
390951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        } break;
391951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    }
392951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    return BBinder::onTransact(code, data, reply, flags);
393951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen}
394951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
395951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen/***** ICommonClockListener *****/
396951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
397951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenenum {
398951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    ON_TIMELINE_CHANGED = IBinder::FIRST_CALL_TRANSACTION,
399951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen};
400951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
401951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenclass BpCommonClockListener : public BpInterface<ICommonClockListener>
402951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen{
403951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen  public:
404951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    BpCommonClockListener(const sp<IBinder>& impl)
405951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        : BpInterface<ICommonClockListener>(impl) {}
406951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
407951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    virtual void onTimelineChanged(uint64_t timelineID) {
408951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        Parcel data, reply;
409951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        data.writeInterfaceToken(
410951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                ICommonClockListener::getInterfaceDescriptor());
411951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        data.writeInt64(timelineID);
412951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        remote()->transact(ON_TIMELINE_CHANGED, data, &reply);
413951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    }
414951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen};
415951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
416951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. ChenIMPLEMENT_META_INTERFACE(CommonClockListener,
417951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                         "android.os.ICommonClockListener");
418951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
419951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenstatus_t BnCommonClockListener::onTransact(
420951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) {
421951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    switch(code) {
422951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        case ON_TIMELINE_CHANGED: {
423951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            CHECK_INTERFACE(ICommonClockListener, data, reply);
424951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            uint32_t timelineID = data.readInt64();
425951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            onTimelineChanged(timelineID);
426951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            return NO_ERROR;
427951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        } break;
428951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    }
429951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
430951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    return BBinder::onTransact(code, data, reply, flags);
431951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen}
432951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
433951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen}; // namespace android
434