#!/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)
