# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
# You can obtain one at http://mozilla.org/MPL/2.0/.

from devicemanagerADB import DeviceManagerADB
from devicemanagerSUT import DeviceManagerSUT
import StringIO


class DroidMixin(object):
    """Mixin to extend DeviceManager with Android-specific functionality"""

    def launchApplication(self, appName, activityName, intent, url=None,
                          extras=None):
        """
        Launches an Android application
        returns:
        success: True
        failure: False
        """
        # only one instance of an application may be running at once
        if self.processExist(appName):
            return False

        acmd = ["am", "start", "-W", "-n", "%s/%s" % (appName, activityName)]

        if intent:
            acmd.extend(["-a", intent])

        if extras:
            for (key, val) in extras.iteritems():
                if type(val) is int:
                    extraTypeParam = "--ei"
                elif type(val) is bool:
                    extraTypeParam = "--ez"
                else:
                    extraTypeParam = "--es"
                acmd.extend([extraTypeParam, str(key), str(val)])

        if url:
            acmd.extend(["-d", url])

        # shell output not that interesting and debugging logs should already
        # show what's going on here... so just create an empty memory buffer
        # and ignore
        shellOutput = StringIO.StringIO()
        if self.shell(acmd, shellOutput) == 0:
            return True

        return False

    def launchFennec(self, appName, intent="android.intent.action.VIEW",
                     mozEnv=None, extraArgs=None, url=None):
        """
        Convenience method to launch Fennec on Android with various debugging
        arguments
        WARNING: FIXME: This would go better in mozrunner. Please do not
        use this method if you are not comfortable with it going away sometime
        in the near future
        returns:
        success: True
        failure: False
        """
        extras = {}

        if mozEnv:
            # mozEnv is expected to be a dictionary of environment variables: Fennec
            # itself will set them when launched
            for (envCnt, (envkey, envval)) in enumerate(mozEnv.iteritems()):
                extras["env" + str(envCnt)] = envkey + "=" + envval

        # Additional command line arguments that fennec will read and use (e.g.
        # with a custom profile)
        if extraArgs:
            extras['args'] = " ".join(extraArgs)

        return self.launchApplication(appName, ".App", intent, url=url,
                                      extras=extras)


class DroidADB(DeviceManagerADB, DroidMixin):
    pass


class DroidSUT(DeviceManagerSUT, DroidMixin):
    pass
