#!/usr/bin/python3
#
# Copyright (C) 2017 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.
#

import functools
import math
import socket
import subprocess
import sys
import tempfile

from android_device import *


def find_free_port():
    s = socket.socket()
    s.bind(('', 0))
    return int(s.getsockname()[1])


class AVD(object):
    def __init__(self, name, emu_path):
        self._name = name
        self._emu_path = emu_path
        self._opts = ''
        self._adb_name = None
        self._emu_proc = None

    def start(self):
        if self._emu_proc:
            raise Exception('Emulator already running')

        port_adb = find_free_port()
        port_tty = find_free_port()
        # -no-window might be useful here
        if self._name == "local":
            emu_cmd = "emulator %s-ports %d,%d -gpu on -wipe-data" \
                      % (self._opts, port_adb, port_tty)
        else:
            emu_cmd = "%s -avd %s %s-ports %d,%d" \
                      % (self._emu_path, self._name, self._opts, port_adb, port_tty)
        print(emu_cmd)

        emu_proc = subprocess.Popen(emu_cmd.split(" "), bufsize=-1, stdout=subprocess.PIPE,
                                    stderr=subprocess.PIPE)

        # The emulator ought to be starting now.
        self._adb_name = "emulator-%d" % (port_tty - 1)
        self._emu_proc = emu_proc

    def stop(self):
        if not self._emu_proc:
            raise Exception('Emulator not currently running')
        self._emu_proc.kill()
        (out, err) = self._emu_proc.communicate()
        self._emu_proc = None
        return out, err

    def get_serial(self):
        if not self._emu_proc:
            raise Exception('Emulator not currently running')
        return self._adb_name

    def get_device(self):
        if not self._emu_proc:
            raise Exception('Emulator not currently running')
        return AndroidDevice(self._adb_name)

    def configure_screen(self, density, width_dp, height_dp):
        width_px = int(math.ceil(width_dp * density / 1600) * 10)
        height_px = int(math.ceil(height_dp * density / 1600) * 10)
        self._opts = "-prop qemu.sf.lcd_density=%d -skin %dx%d " % (density, width_px, height_px)
