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