#!/usr/bin/env python3.4
#
#   Copyright 2018 - Google
#
#   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.

from acts_contrib.test_utils.tel.tel_voice_utils \
        import two_phone_call_msim_short_seq, phone_setup_voice_general_for_slot
from acts.test_decorators import test_tracker_info
from acts_contrib.test_utils.tel.TelephonyBaseTest import TelephonyBaseTest
from acts_contrib.test_utils.tel.tel_test_utils import multithread_func
from acts_contrib.test_utils.tel.tel_defines import MULTI_SIM_CONFIG


class TelLiveMSIMVoiceTest(TelephonyBaseTest):
    def setup_class(self):
        super().setup_class()
        self.sim_config = {
                            "config":MULTI_SIM_CONFIG,
                            "number_of_sims":2
                           }

    @TelephonyBaseTest.tel_test_wrap
    @test_tracker_info(uuid="3639cd85-7dba-4a81-8723-4f554e3ddcf8")
    def test_msim_voice_general(self):
        """ DSDS voice to voice call.

        1. Make Sure PhoneA attached to voice network.
        2. Make Sure PhoneB attached to voice network.
        3. Call from PhoneA to PhoneB, accept on PhoneB, hang up on PhoneA.
        4. Call from PhoneA to PhoneB, accept on PhoneB, hang up on PhoneB.
        5. Perform steps 3 and 4 with both sub_ids

        Returns:
            True if pass; False if fail.
        """
        ads = self.android_devices

        tasks = [(phone_setup_voice_general_for_slot, (self.log, ads[0], 0)),
                 (phone_setup_voice_general_for_slot, (self.log, ads[1], 0)),
                 (phone_setup_voice_general_for_slot, (self.log, ads[0], 1)),
                 (phone_setup_voice_general_for_slot, (self.log, ads[1], 1))
                 ]

        if not multithread_func(self.log, tasks):
            self.log.error("Phone Failed to Set Up Properly.")
            return False

        return two_phone_call_msim_short_seq(self.log, ads[0], None, None,
                                             ads[1], None, None, None)
