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