# Copyright 2014 The Chromium Authors. All rights reserved.
# 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(ContentSettings, self).__init__()
    sdk_version_string = device.GetProp('ro.build.version.sdk')
    try:
      sdk_version = int(sdk_version_string)
      assert sdk_version >= 16, (
          'ContentSettings supported only on SDK 16 and later')
    except ValueError:
      assert False, ('Unknown SDK version %s' % sdk_version_string)
    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, long):
      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
      assert key, 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)
