#!/usr/bin/env python3.4
#
# Copyright 2016 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Tool to interactively call sl4a methods.

SL4A (Scripting Layer for Android) is an RPC service exposing API calls on
Android.

Original version: https://github.com/damonkohler/sl4a

Fork in AOSP (can make direct system privileged calls):
https://android.googlesource.com/platform/external/sl4a/

Also allows access to Event Dispatcher, which allows waiting for asynchronous
actions. For more information see the Mobly codelab:
https://github.com/google/mobly#event-dispatcher

Usage:
$ sl4a_shell
>>> s.getBuildID()
u'N2F52'
"""

import argparse
import logging

from mobly.controllers.android_device_lib import jsonrpc_shell_base
from mobly.controllers.android_device_lib.services import sl4a_service


class Sl4aShell(jsonrpc_shell_base.JsonRpcShellBase):
  def _start_services(self, console_env):
    """Overrides superclass."""
    self._ad.services.register('sl4a', sl4a_service.Sl4aService)
    console_env['s'] = self._ad.services.sl4a
    console_env['sl4a'] = self._ad.sl4a
    console_env['ed'] = self._ad.ed

  def _get_banner(self, serial):
    lines = [
      'Connected to %s.' % serial, 'Call methods against:',
      '    ad (android_device.AndroidDevice)', '    sl4a or s (SL4A)',
      '    ed (EventDispatcher)'
    ]
    return '\n'.join(lines)


if __name__ == '__main__':
  parser = argparse.ArgumentParser(
    description='Interactive client for sl4a.')
  parser.add_argument(
    '-s',
    '--serial',
    help=
    'Device serial to connect to (if more than one device is connected)')
  args = parser.parse_args()
  logging.basicConfig(level=logging.INFO)
  Sl4aShell().main(args.serial)
