xref: /aosp_15_r20/external/libchrome-gestures/src/prop_registry.cc (revision aed3e5085e770be5b69ce25295ecf6ddf906af95)
1*aed3e508SAndroid Build Coastguard Worker // Copyright 2012 The ChromiumOS Authors
2*aed3e508SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*aed3e508SAndroid Build Coastguard Worker // found in the LICENSE file.
4*aed3e508SAndroid Build Coastguard Worker 
5*aed3e508SAndroid Build Coastguard Worker #include "include/prop_registry.h"
6*aed3e508SAndroid Build Coastguard Worker 
7*aed3e508SAndroid Build Coastguard Worker #include <set>
8*aed3e508SAndroid Build Coastguard Worker #include <string>
9*aed3e508SAndroid Build Coastguard Worker 
10*aed3e508SAndroid Build Coastguard Worker #include <json/value.h>
11*aed3e508SAndroid Build Coastguard Worker 
12*aed3e508SAndroid Build Coastguard Worker #include "include/activity_log.h"
13*aed3e508SAndroid Build Coastguard Worker #include "include/gestures.h"
14*aed3e508SAndroid Build Coastguard Worker 
15*aed3e508SAndroid Build Coastguard Worker using std::set;
16*aed3e508SAndroid Build Coastguard Worker using std::string;
17*aed3e508SAndroid Build Coastguard Worker 
18*aed3e508SAndroid Build Coastguard Worker namespace gestures {
19*aed3e508SAndroid Build Coastguard Worker 
Register(Property * prop)20*aed3e508SAndroid Build Coastguard Worker void PropRegistry::Register(Property* prop) {
21*aed3e508SAndroid Build Coastguard Worker   props_.insert(prop);
22*aed3e508SAndroid Build Coastguard Worker   if (prop_provider_)
23*aed3e508SAndroid Build Coastguard Worker     prop->CreateProp();
24*aed3e508SAndroid Build Coastguard Worker }
25*aed3e508SAndroid Build Coastguard Worker 
Unregister(Property * prop)26*aed3e508SAndroid Build Coastguard Worker void PropRegistry::Unregister(Property* prop) {
27*aed3e508SAndroid Build Coastguard Worker   if (props_.erase(prop) != 1)
28*aed3e508SAndroid Build Coastguard Worker     Err("Unregister failed?");
29*aed3e508SAndroid Build Coastguard Worker   if (prop_provider_)
30*aed3e508SAndroid Build Coastguard Worker     prop->DestroyProp();
31*aed3e508SAndroid Build Coastguard Worker }
32*aed3e508SAndroid Build Coastguard Worker 
SetPropProvider(GesturesPropProvider * prop_provider,void * data)33*aed3e508SAndroid Build Coastguard Worker void PropRegistry::SetPropProvider(GesturesPropProvider* prop_provider,
34*aed3e508SAndroid Build Coastguard Worker                                    void* data) {
35*aed3e508SAndroid Build Coastguard Worker   if (prop_provider_ == prop_provider)
36*aed3e508SAndroid Build Coastguard Worker     return;
37*aed3e508SAndroid Build Coastguard Worker   if (prop_provider_) {
38*aed3e508SAndroid Build Coastguard Worker     for (std::set<Property*>::iterator it = props_.begin(), e= props_.end();
39*aed3e508SAndroid Build Coastguard Worker          it != e; ++it)
40*aed3e508SAndroid Build Coastguard Worker       (*it)->DestroyProp();
41*aed3e508SAndroid Build Coastguard Worker   }
42*aed3e508SAndroid Build Coastguard Worker   prop_provider_ = prop_provider;
43*aed3e508SAndroid Build Coastguard Worker   prop_provider_data_ = data;
44*aed3e508SAndroid Build Coastguard Worker   if (prop_provider_)
45*aed3e508SAndroid Build Coastguard Worker     for (std::set<Property*>::iterator it = props_.begin(), e= props_.end();
46*aed3e508SAndroid Build Coastguard Worker          it != e; ++it)
47*aed3e508SAndroid Build Coastguard Worker       (*it)->CreateProp();
48*aed3e508SAndroid Build Coastguard Worker }
49*aed3e508SAndroid Build Coastguard Worker 
CreateProp()50*aed3e508SAndroid Build Coastguard Worker void Property::CreateProp() {
51*aed3e508SAndroid Build Coastguard Worker   if (gprop_)
52*aed3e508SAndroid Build Coastguard Worker     Err("Property already created");
53*aed3e508SAndroid Build Coastguard Worker   CreatePropImpl();
54*aed3e508SAndroid Build Coastguard Worker   if (parent_) {
55*aed3e508SAndroid Build Coastguard Worker     parent_->PropProvider()->register_handlers_fn(
56*aed3e508SAndroid Build Coastguard Worker         parent_->PropProviderData(),
57*aed3e508SAndroid Build Coastguard Worker         gprop_,
58*aed3e508SAndroid Build Coastguard Worker         this,
59*aed3e508SAndroid Build Coastguard Worker         &StaticHandleGesturesPropWillRead,
60*aed3e508SAndroid Build Coastguard Worker         &StaticHandleGesturesPropWritten);
61*aed3e508SAndroid Build Coastguard Worker   }
62*aed3e508SAndroid Build Coastguard Worker }
63*aed3e508SAndroid Build Coastguard Worker 
DestroyProp()64*aed3e508SAndroid Build Coastguard Worker void Property::DestroyProp() {
65*aed3e508SAndroid Build Coastguard Worker   if (!gprop_) {
66*aed3e508SAndroid Build Coastguard Worker     Err("gprop_ already freed!");
67*aed3e508SAndroid Build Coastguard Worker     return;
68*aed3e508SAndroid Build Coastguard Worker   }
69*aed3e508SAndroid Build Coastguard Worker   parent_->PropProvider()->free_fn(parent_->PropProviderData(), gprop_);
70*aed3e508SAndroid Build Coastguard Worker   gprop_ = nullptr;
71*aed3e508SAndroid Build Coastguard Worker }
72*aed3e508SAndroid Build Coastguard Worker 
CreatePropImpl()73*aed3e508SAndroid Build Coastguard Worker void BoolProperty::CreatePropImpl() {
74*aed3e508SAndroid Build Coastguard Worker   GesturesPropBool orig_val = val_;
75*aed3e508SAndroid Build Coastguard Worker   gprop_ = parent_->PropProvider()->create_bool_fn(
76*aed3e508SAndroid Build Coastguard Worker       parent_->PropProviderData(),
77*aed3e508SAndroid Build Coastguard Worker       name(),
78*aed3e508SAndroid Build Coastguard Worker       &val_,
79*aed3e508SAndroid Build Coastguard Worker       1,
80*aed3e508SAndroid Build Coastguard Worker       &val_);
81*aed3e508SAndroid Build Coastguard Worker   if (delegate_ && orig_val != val_)
82*aed3e508SAndroid Build Coastguard Worker     delegate_->BoolWasWritten(this);
83*aed3e508SAndroid Build Coastguard Worker }
84*aed3e508SAndroid Build Coastguard Worker 
NewValue() const85*aed3e508SAndroid Build Coastguard Worker Json::Value BoolProperty::NewValue() const {
86*aed3e508SAndroid Build Coastguard Worker   return Json::Value(val_ != 0);
87*aed3e508SAndroid Build Coastguard Worker }
88*aed3e508SAndroid Build Coastguard Worker 
SetValue(const Json::Value & value)89*aed3e508SAndroid Build Coastguard Worker bool BoolProperty::SetValue(const Json::Value& value) {
90*aed3e508SAndroid Build Coastguard Worker   if (value.type() != Json::booleanValue) {
91*aed3e508SAndroid Build Coastguard Worker     return false;
92*aed3e508SAndroid Build Coastguard Worker   }
93*aed3e508SAndroid Build Coastguard Worker   val_ = value.asBool();
94*aed3e508SAndroid Build Coastguard Worker   return true;
95*aed3e508SAndroid Build Coastguard Worker }
96*aed3e508SAndroid Build Coastguard Worker 
HandleGesturesPropWritten()97*aed3e508SAndroid Build Coastguard Worker void BoolProperty::HandleGesturesPropWritten() {
98*aed3e508SAndroid Build Coastguard Worker   if (parent_ && parent_->activity_log()) {
99*aed3e508SAndroid Build Coastguard Worker     ActivityLog::PropChangeEntry entry = {
100*aed3e508SAndroid Build Coastguard Worker       name(), { val_ }
101*aed3e508SAndroid Build Coastguard Worker     };
102*aed3e508SAndroid Build Coastguard Worker     parent_->activity_log()->LogPropChange(entry);
103*aed3e508SAndroid Build Coastguard Worker   }
104*aed3e508SAndroid Build Coastguard Worker   if (delegate_)
105*aed3e508SAndroid Build Coastguard Worker     delegate_->BoolWasWritten(this);
106*aed3e508SAndroid Build Coastguard Worker }
107*aed3e508SAndroid Build Coastguard Worker 
CreatePropImpl()108*aed3e508SAndroid Build Coastguard Worker void BoolArrayProperty::CreatePropImpl() {
109*aed3e508SAndroid Build Coastguard Worker   auto orig_vals = std::make_unique<GesturesPropBool[]>(count_);
110*aed3e508SAndroid Build Coastguard Worker 
111*aed3e508SAndroid Build Coastguard Worker   memcpy(orig_vals.get(), vals_, count_ * sizeof(GesturesPropBool));
112*aed3e508SAndroid Build Coastguard Worker   gprop_ = parent_->PropProvider()->create_bool_fn(
113*aed3e508SAndroid Build Coastguard Worker       parent_->PropProviderData(),
114*aed3e508SAndroid Build Coastguard Worker       name(),
115*aed3e508SAndroid Build Coastguard Worker       vals_,
116*aed3e508SAndroid Build Coastguard Worker       count_,
117*aed3e508SAndroid Build Coastguard Worker       vals_);
118*aed3e508SAndroid Build Coastguard Worker   if (delegate_ && memcmp(orig_vals.get(), vals_,
119*aed3e508SAndroid Build Coastguard Worker                           count_ * sizeof(GesturesPropBool)))
120*aed3e508SAndroid Build Coastguard Worker     delegate_->BoolArrayWasWritten(this);
121*aed3e508SAndroid Build Coastguard Worker }
122*aed3e508SAndroid Build Coastguard Worker 
NewValue() const123*aed3e508SAndroid Build Coastguard Worker Json::Value BoolArrayProperty::NewValue() const {
124*aed3e508SAndroid Build Coastguard Worker   Json::Value list(Json::arrayValue);
125*aed3e508SAndroid Build Coastguard Worker   for (size_t i = 0; i < count_; i++)
126*aed3e508SAndroid Build Coastguard Worker     list.append(Json::Value(vals_[i] != 0));
127*aed3e508SAndroid Build Coastguard Worker   return list;
128*aed3e508SAndroid Build Coastguard Worker }
129*aed3e508SAndroid Build Coastguard Worker 
SetValue(const Json::Value & list)130*aed3e508SAndroid Build Coastguard Worker bool BoolArrayProperty::SetValue(const Json::Value& list) {
131*aed3e508SAndroid Build Coastguard Worker   AssertWithReturnValue(list.type() == Json::arrayValue, false);
132*aed3e508SAndroid Build Coastguard Worker   AssertWithReturnValue(list.size() == count_, false);
133*aed3e508SAndroid Build Coastguard Worker 
134*aed3e508SAndroid Build Coastguard Worker   for (size_t i = 0; i < count_; i++) {
135*aed3e508SAndroid Build Coastguard Worker     const Json::Value& elt_value = list[static_cast<int>(i)];
136*aed3e508SAndroid Build Coastguard Worker     AssertWithReturnValue(elt_value.type() == Json::booleanValue, false);
137*aed3e508SAndroid Build Coastguard Worker     vals_[i] = elt_value.asBool();
138*aed3e508SAndroid Build Coastguard Worker   }
139*aed3e508SAndroid Build Coastguard Worker 
140*aed3e508SAndroid Build Coastguard Worker   return true;
141*aed3e508SAndroid Build Coastguard Worker }
142*aed3e508SAndroid Build Coastguard Worker 
HandleGesturesPropWritten()143*aed3e508SAndroid Build Coastguard Worker void BoolArrayProperty::HandleGesturesPropWritten() {
144*aed3e508SAndroid Build Coastguard Worker   // TODO(b/191802713): Log array property changes
145*aed3e508SAndroid Build Coastguard Worker   if (delegate_)
146*aed3e508SAndroid Build Coastguard Worker     delegate_->BoolArrayWasWritten(this);
147*aed3e508SAndroid Build Coastguard Worker }
148*aed3e508SAndroid Build Coastguard Worker 
CreatePropImpl()149*aed3e508SAndroid Build Coastguard Worker void DoubleProperty::CreatePropImpl() {
150*aed3e508SAndroid Build Coastguard Worker   double orig_val = val_;
151*aed3e508SAndroid Build Coastguard Worker   gprop_ = parent_->PropProvider()->create_real_fn(
152*aed3e508SAndroid Build Coastguard Worker       parent_->PropProviderData(),
153*aed3e508SAndroid Build Coastguard Worker       name(),
154*aed3e508SAndroid Build Coastguard Worker       &val_,
155*aed3e508SAndroid Build Coastguard Worker       1,
156*aed3e508SAndroid Build Coastguard Worker       &val_);
157*aed3e508SAndroid Build Coastguard Worker   if (delegate_ && orig_val != val_)
158*aed3e508SAndroid Build Coastguard Worker     delegate_->DoubleWasWritten(this);
159*aed3e508SAndroid Build Coastguard Worker }
160*aed3e508SAndroid Build Coastguard Worker 
NewValue() const161*aed3e508SAndroid Build Coastguard Worker Json::Value DoubleProperty::NewValue() const {
162*aed3e508SAndroid Build Coastguard Worker   return Json::Value(val_);
163*aed3e508SAndroid Build Coastguard Worker }
164*aed3e508SAndroid Build Coastguard Worker 
SetValue(const Json::Value & value)165*aed3e508SAndroid Build Coastguard Worker bool DoubleProperty::SetValue(const Json::Value& value) {
166*aed3e508SAndroid Build Coastguard Worker   if (value.type() != Json::realValue &&
167*aed3e508SAndroid Build Coastguard Worker       value.type() != Json::intValue &&
168*aed3e508SAndroid Build Coastguard Worker       value.type() != Json::uintValue) {
169*aed3e508SAndroid Build Coastguard Worker     return false;
170*aed3e508SAndroid Build Coastguard Worker   }
171*aed3e508SAndroid Build Coastguard Worker   val_ = value.asDouble();
172*aed3e508SAndroid Build Coastguard Worker   return true;
173*aed3e508SAndroid Build Coastguard Worker }
174*aed3e508SAndroid Build Coastguard Worker 
HandleGesturesPropWritten()175*aed3e508SAndroid Build Coastguard Worker void DoubleProperty::HandleGesturesPropWritten() {
176*aed3e508SAndroid Build Coastguard Worker   if (parent_ && parent_->activity_log()) {
177*aed3e508SAndroid Build Coastguard Worker     ActivityLog::PropChangeEntry entry = {
178*aed3e508SAndroid Build Coastguard Worker       name(), { val_ }
179*aed3e508SAndroid Build Coastguard Worker     };
180*aed3e508SAndroid Build Coastguard Worker     parent_->activity_log()->LogPropChange(entry);
181*aed3e508SAndroid Build Coastguard Worker   }
182*aed3e508SAndroid Build Coastguard Worker   if (delegate_)
183*aed3e508SAndroid Build Coastguard Worker     delegate_->DoubleWasWritten(this);
184*aed3e508SAndroid Build Coastguard Worker }
185*aed3e508SAndroid Build Coastguard Worker 
CreatePropImpl()186*aed3e508SAndroid Build Coastguard Worker void DoubleArrayProperty::CreatePropImpl() {
187*aed3e508SAndroid Build Coastguard Worker   auto orig_vals = std::make_unique<float[]>(count_);
188*aed3e508SAndroid Build Coastguard Worker 
189*aed3e508SAndroid Build Coastguard Worker   memcpy(orig_vals.get(), vals_, count_ * sizeof(float));
190*aed3e508SAndroid Build Coastguard Worker   gprop_ = parent_->PropProvider()->create_real_fn(
191*aed3e508SAndroid Build Coastguard Worker       parent_->PropProviderData(),
192*aed3e508SAndroid Build Coastguard Worker       name(),
193*aed3e508SAndroid Build Coastguard Worker       vals_,
194*aed3e508SAndroid Build Coastguard Worker       count_,
195*aed3e508SAndroid Build Coastguard Worker       vals_);
196*aed3e508SAndroid Build Coastguard Worker   if (delegate_ && memcmp(orig_vals.get(), vals_, count_ * sizeof(float)))
197*aed3e508SAndroid Build Coastguard Worker     delegate_->DoubleArrayWasWritten(this);
198*aed3e508SAndroid Build Coastguard Worker }
199*aed3e508SAndroid Build Coastguard Worker 
NewValue() const200*aed3e508SAndroid Build Coastguard Worker Json::Value DoubleArrayProperty::NewValue() const {
201*aed3e508SAndroid Build Coastguard Worker   Json::Value list(Json::arrayValue);
202*aed3e508SAndroid Build Coastguard Worker   for (size_t i = 0; i < count_; i++) {
203*aed3e508SAndroid Build Coastguard Worker     // Avoid infinity
204*aed3e508SAndroid Build Coastguard Worker     double log_val = std::max(-1e30, std::min(vals_[i], 1e30));
205*aed3e508SAndroid Build Coastguard Worker     list.append(Json::Value(log_val));
206*aed3e508SAndroid Build Coastguard Worker   }
207*aed3e508SAndroid Build Coastguard Worker   return list;
208*aed3e508SAndroid Build Coastguard Worker }
209*aed3e508SAndroid Build Coastguard Worker 
SetValue(const Json::Value & list)210*aed3e508SAndroid Build Coastguard Worker bool DoubleArrayProperty::SetValue(const Json::Value& list) {
211*aed3e508SAndroid Build Coastguard Worker   AssertWithReturnValue(list.type() == Json::arrayValue, false);
212*aed3e508SAndroid Build Coastguard Worker   AssertWithReturnValue(list.size() == count_, false);
213*aed3e508SAndroid Build Coastguard Worker 
214*aed3e508SAndroid Build Coastguard Worker   for (size_t i = 0; i < count_; i++) {
215*aed3e508SAndroid Build Coastguard Worker     Json::Value elt_value = list[static_cast<int>(i)];
216*aed3e508SAndroid Build Coastguard Worker     AssertWithReturnValue(elt_value.type() == Json::realValue ||
217*aed3e508SAndroid Build Coastguard Worker                           elt_value.type() == Json::intValue ||
218*aed3e508SAndroid Build Coastguard Worker                           elt_value.type() == Json::uintValue, false);
219*aed3e508SAndroid Build Coastguard Worker     vals_[i] = elt_value.asDouble();
220*aed3e508SAndroid Build Coastguard Worker   }
221*aed3e508SAndroid Build Coastguard Worker 
222*aed3e508SAndroid Build Coastguard Worker   return true;
223*aed3e508SAndroid Build Coastguard Worker }
224*aed3e508SAndroid Build Coastguard Worker 
HandleGesturesPropWritten()225*aed3e508SAndroid Build Coastguard Worker void DoubleArrayProperty::HandleGesturesPropWritten() {
226*aed3e508SAndroid Build Coastguard Worker   // TODO(b/191802713): Log array property changes
227*aed3e508SAndroid Build Coastguard Worker   if (delegate_)
228*aed3e508SAndroid Build Coastguard Worker     delegate_->DoubleArrayWasWritten(this);
229*aed3e508SAndroid Build Coastguard Worker }
230*aed3e508SAndroid Build Coastguard Worker 
CreatePropImpl()231*aed3e508SAndroid Build Coastguard Worker void IntProperty::CreatePropImpl() {
232*aed3e508SAndroid Build Coastguard Worker   int orig_val = val_;
233*aed3e508SAndroid Build Coastguard Worker   gprop_ = parent_->PropProvider()->create_int_fn(
234*aed3e508SAndroid Build Coastguard Worker       parent_->PropProviderData(),
235*aed3e508SAndroid Build Coastguard Worker       name(),
236*aed3e508SAndroid Build Coastguard Worker       &val_,
237*aed3e508SAndroid Build Coastguard Worker       1,
238*aed3e508SAndroid Build Coastguard Worker       &val_);
239*aed3e508SAndroid Build Coastguard Worker   if (delegate_ && orig_val != val_)
240*aed3e508SAndroid Build Coastguard Worker     delegate_->IntWasWritten(this);
241*aed3e508SAndroid Build Coastguard Worker }
242*aed3e508SAndroid Build Coastguard Worker 
NewValue() const243*aed3e508SAndroid Build Coastguard Worker Json::Value IntProperty::NewValue() const {
244*aed3e508SAndroid Build Coastguard Worker   return Json::Value(val_);
245*aed3e508SAndroid Build Coastguard Worker }
246*aed3e508SAndroid Build Coastguard Worker 
SetValue(const Json::Value & value)247*aed3e508SAndroid Build Coastguard Worker bool IntProperty::SetValue(const Json::Value& value) {
248*aed3e508SAndroid Build Coastguard Worker   if (value.type() != Json::intValue &&
249*aed3e508SAndroid Build Coastguard Worker       value.type() != Json::uintValue) {
250*aed3e508SAndroid Build Coastguard Worker     Err("Failing here %d", value.type());
251*aed3e508SAndroid Build Coastguard Worker     return false;
252*aed3e508SAndroid Build Coastguard Worker   }
253*aed3e508SAndroid Build Coastguard Worker   val_ = value.asInt();
254*aed3e508SAndroid Build Coastguard Worker   return true;
255*aed3e508SAndroid Build Coastguard Worker }
256*aed3e508SAndroid Build Coastguard Worker 
HandleGesturesPropWritten()257*aed3e508SAndroid Build Coastguard Worker void IntProperty::HandleGesturesPropWritten() {
258*aed3e508SAndroid Build Coastguard Worker   if (parent_ && parent_->activity_log()) {
259*aed3e508SAndroid Build Coastguard Worker     ActivityLog::PropChangeEntry entry = {
260*aed3e508SAndroid Build Coastguard Worker       name(), { val_ }
261*aed3e508SAndroid Build Coastguard Worker     };
262*aed3e508SAndroid Build Coastguard Worker     parent_->activity_log()->LogPropChange(entry);
263*aed3e508SAndroid Build Coastguard Worker   }
264*aed3e508SAndroid Build Coastguard Worker   if (delegate_)
265*aed3e508SAndroid Build Coastguard Worker     delegate_->IntWasWritten(this);
266*aed3e508SAndroid Build Coastguard Worker }
267*aed3e508SAndroid Build Coastguard Worker 
CreatePropImpl()268*aed3e508SAndroid Build Coastguard Worker void IntArrayProperty::CreatePropImpl() {
269*aed3e508SAndroid Build Coastguard Worker   auto orig_vals = std::make_unique<int[]>(count_);
270*aed3e508SAndroid Build Coastguard Worker 
271*aed3e508SAndroid Build Coastguard Worker   memcpy(orig_vals.get(), vals_, count_ * sizeof(int));
272*aed3e508SAndroid Build Coastguard Worker   gprop_ = parent_->PropProvider()->create_int_fn(
273*aed3e508SAndroid Build Coastguard Worker       parent_->PropProviderData(),
274*aed3e508SAndroid Build Coastguard Worker       name(),
275*aed3e508SAndroid Build Coastguard Worker       vals_,
276*aed3e508SAndroid Build Coastguard Worker       count_,
277*aed3e508SAndroid Build Coastguard Worker       vals_);
278*aed3e508SAndroid Build Coastguard Worker   if (delegate_ && memcmp(orig_vals.get(), vals_, count_ * sizeof(int)))
279*aed3e508SAndroid Build Coastguard Worker     delegate_->IntArrayWasWritten(this);
280*aed3e508SAndroid Build Coastguard Worker }
281*aed3e508SAndroid Build Coastguard Worker 
NewValue() const282*aed3e508SAndroid Build Coastguard Worker Json::Value IntArrayProperty::NewValue() const {
283*aed3e508SAndroid Build Coastguard Worker   Json::Value list(Json::arrayValue);
284*aed3e508SAndroid Build Coastguard Worker   for (size_t i = 0; i < count_; i++)
285*aed3e508SAndroid Build Coastguard Worker     list.append(Json::Value(vals_[static_cast<int>(i)]));
286*aed3e508SAndroid Build Coastguard Worker   return list;
287*aed3e508SAndroid Build Coastguard Worker }
288*aed3e508SAndroid Build Coastguard Worker 
SetValue(const Json::Value & list)289*aed3e508SAndroid Build Coastguard Worker bool IntArrayProperty::SetValue(const Json::Value& list) {
290*aed3e508SAndroid Build Coastguard Worker   AssertWithReturnValue(list.type() == Json::arrayValue, false);
291*aed3e508SAndroid Build Coastguard Worker   AssertWithReturnValue(list.size() == count_, false);
292*aed3e508SAndroid Build Coastguard Worker 
293*aed3e508SAndroid Build Coastguard Worker   for (size_t i = 0; i < count_; i++) {
294*aed3e508SAndroid Build Coastguard Worker     Json::Value elt_value = list[static_cast<int>(i)];
295*aed3e508SAndroid Build Coastguard Worker     AssertWithReturnValue(elt_value.type() == Json::intValue ||
296*aed3e508SAndroid Build Coastguard Worker                           elt_value.type() == Json::uintValue, false);
297*aed3e508SAndroid Build Coastguard Worker     vals_[i] = elt_value.asInt();
298*aed3e508SAndroid Build Coastguard Worker   }
299*aed3e508SAndroid Build Coastguard Worker 
300*aed3e508SAndroid Build Coastguard Worker   return true;
301*aed3e508SAndroid Build Coastguard Worker }
302*aed3e508SAndroid Build Coastguard Worker 
HandleGesturesPropWritten()303*aed3e508SAndroid Build Coastguard Worker void IntArrayProperty::HandleGesturesPropWritten() {
304*aed3e508SAndroid Build Coastguard Worker   // TODO(b/191802713): Log array property changes
305*aed3e508SAndroid Build Coastguard Worker   if (delegate_)
306*aed3e508SAndroid Build Coastguard Worker     delegate_->IntArrayWasWritten(this);
307*aed3e508SAndroid Build Coastguard Worker }
308*aed3e508SAndroid Build Coastguard Worker 
CreatePropImpl()309*aed3e508SAndroid Build Coastguard Worker void StringProperty::CreatePropImpl() {
310*aed3e508SAndroid Build Coastguard Worker   const char* orig_val = val_;
311*aed3e508SAndroid Build Coastguard Worker   gprop_ = parent_->PropProvider()->create_string_fn(
312*aed3e508SAndroid Build Coastguard Worker       parent_->PropProviderData(),
313*aed3e508SAndroid Build Coastguard Worker       name(),
314*aed3e508SAndroid Build Coastguard Worker       &val_,
315*aed3e508SAndroid Build Coastguard Worker       val_);
316*aed3e508SAndroid Build Coastguard Worker   if (delegate_ && strcmp(orig_val, val_) != 0)
317*aed3e508SAndroid Build Coastguard Worker     delegate_->StringWasWritten(this);
318*aed3e508SAndroid Build Coastguard Worker }
319*aed3e508SAndroid Build Coastguard Worker 
NewValue() const320*aed3e508SAndroid Build Coastguard Worker Json::Value StringProperty::NewValue() const {
321*aed3e508SAndroid Build Coastguard Worker   return Json::Value(val_);
322*aed3e508SAndroid Build Coastguard Worker }
323*aed3e508SAndroid Build Coastguard Worker 
SetValue(const Json::Value & value)324*aed3e508SAndroid Build Coastguard Worker bool StringProperty::SetValue(const Json::Value& value) {
325*aed3e508SAndroid Build Coastguard Worker   if (value.type() != Json::stringValue) {
326*aed3e508SAndroid Build Coastguard Worker     return false;
327*aed3e508SAndroid Build Coastguard Worker   }
328*aed3e508SAndroid Build Coastguard Worker   parsed_val_ = value.asString();
329*aed3e508SAndroid Build Coastguard Worker   val_ = parsed_val_.c_str();
330*aed3e508SAndroid Build Coastguard Worker   return true;
331*aed3e508SAndroid Build Coastguard Worker }
332*aed3e508SAndroid Build Coastguard Worker 
HandleGesturesPropWritten()333*aed3e508SAndroid Build Coastguard Worker void StringProperty::HandleGesturesPropWritten() {
334*aed3e508SAndroid Build Coastguard Worker   if (delegate_)
335*aed3e508SAndroid Build Coastguard Worker     delegate_->StringWasWritten(this);
336*aed3e508SAndroid Build Coastguard Worker }
337*aed3e508SAndroid Build Coastguard Worker 
338*aed3e508SAndroid Build Coastguard Worker }  // namespace gestures
339