Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / build / android / pylib / content_settings.py
1 # Copyright 2014 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
4
5
6 class ContentSettings(dict):
7
8   """A dict interface to interact with device content settings.
9
10   System properties are key/value pairs as exposed by adb shell content.
11   """
12
13   def __init__(self, table, device):
14     super(ContentSettings, self).__init__()
15     sdk_version_string = device.old_interface.system_properties[
16         'ro.build.version.sdk']
17     try:
18       sdk_version = int(sdk_version_string)
19       assert sdk_version >= 16, (
20           'ContentSettings supported only on SDK 16 and later')
21     except ValueError:
22       assert False, ('Unknown SDK version %s' % sdk_version_string)
23     self._table = table
24     self._device = device
25
26   @staticmethod
27   def _GetTypeBinding(value):
28     if isinstance(value, bool):
29       return 'b'
30     if isinstance(value, float):
31       return 'f'
32     if isinstance(value, int):
33       return 'i'
34     if isinstance(value, long):
35       return 'l'
36     if isinstance(value, str):
37       return 's'
38     raise ValueError('Unsupported type %s' % type(value))
39
40   def iteritems(self):
41     # Example row:
42     # 'Row: 0 _id=13, name=logging_id2, value=-1fccbaa546705b05'
43     for row in self._device.old_interface.RunShellCommandWithSU(
44         'content query --uri content://%s' % self._table):
45       fields = row.split(', ')
46       key = None
47       value = None
48       for field in fields:
49         k, _, v = field.partition('=')
50         if k == 'name':
51           key = v
52         elif k == 'value':
53           value = v
54       assert key, value
55       yield key, value
56
57   def __getitem__(self, key):
58     return self._device.old_interface.RunShellCommandWithSU(
59         'content query --uri content://%s --where "name=\'%s\'" '
60         '--projection value' % (self._table, key)).strip()
61
62   def __setitem__(self, key, value):
63     if key in self:
64       self._device.old_interface.RunShellCommandWithSU(
65           'content update --uri content://%s '
66           '--bind value:%s:%s --where "name=\'%s\'"' % (
67               self._table,
68               self._GetTypeBinding(value), value, key))
69     else:
70       self._device.old_interface.RunShellCommandWithSU(
71           'content insert --uri content://%s '
72           '--bind name:%s:%s --bind value:%s:%s' % (
73               self._table,
74               self._GetTypeBinding(key), key,
75               self._GetTypeBinding(value), value))
76
77   def __delitem__(self, key):
78     self._device.old_interface.RunShellCommandWithSU(
79         'content delete --uri content://%s '
80         '--bind name:%s:%s' % (
81             self._table,
82             self._GetTypeBinding(key), key))