# python3.4
# Copyright (C) 2015 The Android Open Source Project
#
# 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.

"""
JSON RPC interface to android scripting engine.

Example:
    a = Android()
    a.makeToast("poptart")
    a.close()

Also supports serializing data objects (class instances). Register them with the android client object.


class Mydata:
    def __init__(self, value):
        self.value = value

a = Android()
a.register(Mydata)

data = Mydata(2)
a.makeCall(data)
a.close()

This feature requires support on the SL4A side for the Jackson ObjectMapper.

http://jackson.codehaus.org/1.7.3/javadoc/org/codehaus/jackson/map/ObjectMapper.html

Where you also need a POJO on the server side. Otherwise this feature cannot be used.
"""

__author__ = 'Keith Dart <dart@google.com>'
__oldauthor__ = 'Damon Kohler <damonkohler@gmail.com>'

import os
import sys
import socket
import logging
from json.decoder import JSONDecoder
from json.encoder import JSONEncoder


HOST = os.environ.get('AP_HOST', None)
PORT = os.environ.get('AP_PORT', 9999)

LAUNCH_CMD=("adb {} shell am start -a com.googlecode.android_scripting.action.LAUNCH_SERVER "
        "-n com.googlecode.android_scripting/.activity.ScriptingLayerServiceLauncher "
        "--ei com.googlecode.android_scripting.extra.USE_SERVICE_PORT {}")

class SL4AException(Exception):
    pass

class SL4AAPIError(SL4AException):
    """Raised when remote API reports an error."""

class SL4AProtocolError(SL4AException):
    """Raised when there is some error in exchanging data with server on device."""


class AndroidJSONDecoder(JSONDecoder):
    def __init__(self):
        super().__init__(object_hook=self._decode_object, parse_float=None, parse_int=None,
                parse_constant=None, strict=True, object_pairs_hook=None)
        self._regs = {}

    def _decode_object(self, d):
        if "@class" in d:
            cname = d.pop("@class")
            cls = _load_class(cname)
            o = cls.__new__(cls)
            while d:
                k, v = d.popitem()
                setattr(o, k, v)
            return o
        else:
            return d

    def register(self, cls, decoder=None):
        self._regs[cls] = decoder

    def decode(self, s):
        return super().decode(str(s, encoding="utf8"))


def _load_class(path):
    modname, clsname = path.rsplit(".", 1)
    try:
        mod = sys.modules[modname]
    except KeyError:
        pass
    __import__(modname)
    mod = sys.modules[modname]
    return getattr(mod, clsname)


class AndroidJSONEncoder(JSONEncoder):
    def __init__(self):
        super().__init__ (skipkeys=False, ensure_ascii=False,
                check_circular=True, allow_nan=True, sort_keys=False,
                indent=None, separators=None, default=None)
        self._regs = {}

    def default(self, o):
        try:
            encoder = self._regs[type(o)]
        except KeyError:
            return super().default(o)
        if encoder is not None:
            return encoder(o)
        d = o.__dict__.copy()
        t = type(o)
        d["@class"] = "{}.{}".format(t.__module__, t.__name__)
        return d

    def encode(self, o):
        s = super().encode(o)
        return s.encode("utf8")+b'\n'

    def register(self, cls, encoder=None):
        self._regs[cls] = encoder


def IDCounter():
    i = 0
    while True:
        yield i
        i += 1

class Android(object):
    """Client interface to SL4A server running on Android.

    Supports generic calling to SL4A APIs by getting an API method as an attribute.

    Example:
        a = Android()
        a.makeToast("poptart")
    """
    COUNTER = IDCounter()

    def __init__(self, cmd='initiate', uid=-1, port=PORT, addr=HOST):
        self.client = None # prevent close errors on connect failure
        self.uid = None
        self._encoder = AndroidJSONEncoder()
        self._decoder = AndroidJSONDecoder()
        conn = socket.create_connection((addr, port))
        self.client = conn.makefile(mode="brw")
        handshake = {'cmd':cmd, 'uid':uid}
        self.client.write(self._encoder.encode(handshake))
        self.client.flush()
        resp = self.client.readline(36384)
        if not resp:
            raise SL4AProtocolError("No response from handshake.")
        result = self._decoder.decode(resp)
        if result['status']:
          self.uid = result['uid']
        else:
          self.uid = -1

    def close(self):
        if self.client is not None:
            c = self.client
            self.client = None
            try:
                # TODO gracefully terminate session when supported on server side.
                # e.g.: c.write(self._encoder.encode({"cmd":"terminate", "uid":self.uid}))
                c.close()
            except (ValueError, OSError):
                logging.warn("Closing Android interface that was already closed.")

    def __del__(self):
        self.close()

    def register(self, cls, encoder=None, decoder=None):
        """Register a class object that will support serialization to and
        from sl4a server.

        Different encoder and decoder callables may be supplied. If not
        supplied, generic ones will be used.

        A factory function can register objects as server side POJOs are developed.
        """
        self._encoder.register(cls, encoder)
        self._decoder.register(cls, decoder)

    def _rpc(self, method, *args):
        apiid = next(Android.COUNTER)
        data = {'id': apiid,
                    'method': method,
                    'params': args}
        self.client.write(self._encoder.encode(data))
        self.client.flush()
        response = self.client.readline(16384)
        if not response:
            raise SL4AProtocolError("No response from server.")
        result = self._decoder.decode(response)
        if result['error']:
            raise SL4AAPIError(result['error'])
        if result['id'] != apiid:
            raise SL4AProtocolError("Mismatched API id")
        return result['result']

    def __getattr__(self, name):
        def rpc_call(*args):
            return self._rpc(name, *args)
        return rpc_call


def start_forwarding(port, localport=PORT,serial=""):
    if serial:
        serial = " -s " + serial
    os.system("adb {} forward tcp:{} tcp:{}".format(serial,localport, port))


def kill_adb_server(serial=""):
    if serial:
        serial = " -s " + serial
    os.system("adb {} kill-server".format(serial))


def start_adb_server(serial=""):
    if serial:
        serial = " -s "+serial
    os.system("adb {} start-server".format(serial))


def start_sl4a(port=8080,serial=""):
    if is_sl4a_running(serial):
        return
    start_adb_server(serial)
    if serial:
        serial = " -s " + serial
    os.system(LAUNCH_CMD.format(serial,port))

def is_sl4a_running(serial=""):
    if serial:
      serial = " -s " + serial
    status = os.system("adb {} shell ps | grep com.googlecode.android_scripting".format(serial))
    return status != 256

def android(argv):
    import getopt

    def _usage():
        print("""Usage: android [-p <remoteport>] [-l <localport>] [-u <uid>] <apicall>|start [<apiargs>...]
            Example: android.py -p 8080 makeToast hello""")

    localport = PORT
    port = 8080
    uid = -1
    cmd = "initiate"
    try:
        opts, args = getopt.getopt(argv[1:], "l:p:u:", ["localport=", "port=", "uid="])
    except getopt.GetoptError:
        _usage()
        return
    for opt, optarg in opts:
        if opt in ("-p", "--port"):
            try:
                port = int(optarg)
            except ValueError:
                _usage()
                return
        elif opt in ("-u", "--uid"):
            try:
                uid = int(optarg)
            except ValueError:
                _usage()
                return
            cmd = "continue"
        elif opt in ("-l", "--localport"):
            try:
                localport = int(optarg)
            except ValueError:
                _usage()
                return

    if not args:
        _usage()
        return

    if args[0] == "start":
        kill_adb_server()
        start_adb_server()
        start_sl4a(port)
        return

    if cmd == "initiate":
        start_forwarding(port, localport)

    a = Android(cmd=cmd, uid=uid, port=localport)
    print ("UID:", a.uid)
    rpc = getattr(a, args[0])
    rpc(*args[1:])
    a.close()


# Run as top-level script for handy test utility
if __name__ == "__main__":
    android(sys.argv)
