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