/*
 * Copyright (C) 2016 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.
 */


package com.android.cts.verifier.voicemail;

import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.android.cts.verifier.PassFailButtons;
import com.android.cts.verifier.R;
import com.android.cts.verifier.voicemail.VoicemailBroadcastReceiver.ReceivedListener;

import android.view.View.OnClickListener;
import android.widget.Button;
/**
 * This test ask the tester to set the CTS verifier as the default dialer and leave a voicemail. The
 * test will pass if the verifier is able to receive a broadcast for the incoming voicemail. This
 * depends on telephony to send the broadcast to the default dialer when receiving a Message Waiting
 * Indicator SMS.
 */
public class VoicemailBroadcastActivity extends PassFailButtons.Activity {

    private ImageView mLeaveVoicemailImage;
    private ImageView mRestoreDefaultDialerImage;
    private TextView mLeaveVoicemailText;
    private Button mNotApplicableButton;

    private DefaultDialerChanger mDefaultDialerChanger;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        View view = getLayoutInflater().inflate(R.layout.voicemail_broadcast, null);
        setContentView(view);
        setInfoResources(R.string.voicemail_broadcast_test,
                R.string.voicemail_broadcast_instructions, -1);
        setPassFailButtonClickListeners();
        getPassButton().setEnabled(false);

        mLeaveVoicemailImage = (ImageView) findViewById(R.id.leave_voicemail_image);
        mRestoreDefaultDialerImage = (ImageView) findViewById(R.id.restore_default_dialer_image);
        mLeaveVoicemailText = (TextView) findViewById(R.id.leave_voicemail_text);

        mDefaultDialerChanger = new DefaultDialerChanger(this);

        mNotApplicableButton = findViewById(R.id.call_settings_check_not_applicable);
        mNotApplicableButton.setOnClickListener(
                new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        getPassButton().setEnabled(true);
                        mLeaveVoicemailImage.setImageDrawable(getDrawable(R.drawable.fs_warning));
                        mRestoreDefaultDialerImage.setImageDrawable(getDrawable(R.drawable.fs_warning));
                    }
                }
        );

        VoicemailBroadcastReceiver.setListener(new ReceivedListener() {
            @Override
            public void onReceived() {

                Toast.makeText(VoicemailBroadcastActivity.this,
                        R.string.voicemail_broadcast_received, Toast.LENGTH_SHORT).show();
                mLeaveVoicemailImage.setImageDrawable(getDrawable(R.drawable.fs_good));
                mLeaveVoicemailText.setText(R.string.voicemail_broadcast_received);
                getPassButton().setEnabled(true);
                mDefaultDialerChanger.setRestorePending(true);
            }
        });

        if (TextUtils.isEmpty(getSystemService(TelephonyManager.class).getVoiceMailNumber())) {
            findViewById(R.id.no_carrier_support).setVisibility(View.VISIBLE);
            getPassButton().setEnabled(true);
            ((ImageView) findViewById(R.id.set_default_dialer_image))
                    .setImageDrawable(getDrawable(R.drawable.fs_warning));
            ((ImageView) findViewById(R.id.restore_default_dialer_image))
                    .setImageDrawable(getDrawable(R.drawable.fs_warning));
            mLeaveVoicemailImage.setImageDrawable(getDrawable(R.drawable.fs_warning));
        }
    }

    @Override
    protected void onDestroy() {
        VoicemailBroadcastReceiver.setListener(null);
        mDefaultDialerChanger.destroy();
        super.onDestroy();
    }
}
