/*
 * 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.
 */

package com.android.settings;

import android.content.Context;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.SwitchPreference;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.Switch;

import com.android.ims.ImsConfig;
import com.android.ims.ImsManager;
import com.android.settings.search.Indexable;
import com.android.settings.widget.SwitchBar;

/**
 * "Wi-Fi Calling settings" screen.  This preference screen lets you
 * enable/disable Wi-Fi Calling, change mode, enable/disable
 * handover while on roaming.
 */
public class WifiCallingSettings extends SettingsPreferenceFragment
        implements SwitchBar.OnSwitchChangeListener,
        Preference.OnPreferenceChangeListener, Indexable {

    private static final String TAG = "WifiCallingSettings";

    //String keys for preference lookup
    private static final String BUTTON_WFC_MODE = "wifi_calling_mode";
    private static final String BUTTON_WFC_ROAM = "wifi_calling_roam";

    //UI objects
    private SwitchBar mSwitchBar;
    private Switch mSwitch;
    private ListPreference mButtonWfcMode;
    private SwitchPreference mButtonWfcRoam;

    private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
        /*
         * Enable/disable controls when in/out of a call and depending on
         * TTY mode and TTY support over VoLTE.
         * @see android.telephony.PhoneStateListener#onCallStateChanged(int,
         * java.lang.String)
         */
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            final SettingsActivity activity = (SettingsActivity) getActivity();
            boolean isNonTtyOrTtyOnVolteEnabled = ImsManager
                    .isNonTtyOrTtyOnVolteEnabled(activity);
            final SwitchBar switchBar = activity.getSwitchBar();
            boolean isWfcEnabled = switchBar.getSwitch().isChecked()
                    && isNonTtyOrTtyOnVolteEnabled;

            switchBar.setEnabled((state == TelephonyManager.CALL_STATE_IDLE)
                    && isNonTtyOrTtyOnVolteEnabled);

            Preference pref = getPreferenceScreen().findPreference(BUTTON_WFC_MODE);
            int wfcMode = ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY;
            if (pref != null) {
                pref.setEnabled(isWfcEnabled
                        && (state == TelephonyManager.CALL_STATE_IDLE));
                ListPreference prefWfcMode = (ListPreference) pref;
                wfcMode = Integer.valueOf(prefWfcMode.getValue()).intValue();
            }
            pref = getPreferenceScreen().findPreference(BUTTON_WFC_ROAM);
            if (pref != null) {
                pref.setEnabled(isWfcEnabled
                        && (wfcMode != ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY)
                        && (state == TelephonyManager.CALL_STATE_IDLE));
            }
        }
    };

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        final SettingsActivity activity = (SettingsActivity) getActivity();

        mSwitchBar = activity.getSwitchBar();
        mSwitch = mSwitchBar.getSwitch();
        mSwitchBar.show();
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        mSwitchBar.hide();
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        addPreferencesFromResource(R.xml.wifi_calling_settings);

        mButtonWfcMode = (ListPreference) findPreference(BUTTON_WFC_MODE);
        mButtonWfcMode.setOnPreferenceChangeListener(this);

        mButtonWfcRoam = (SwitchPreference) findPreference(BUTTON_WFC_ROAM);
        mButtonWfcRoam.setOnPreferenceChangeListener(this);
    }

    @Override
    public void onResume() {
        super.onResume();

        final Context context = getActivity();

        if (ImsManager.isWfcEnabledByPlatform(context)) {
            TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
            tm.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);

            mSwitchBar.addOnSwitchChangeListener(this);
        }

        // NOTE: Buttons will be enabled/disabled in mPhoneStateListener
        boolean wfcEnabled = ImsManager.isWfcEnabledByUser(context)
                && ImsManager.isNonTtyOrTtyOnVolteEnabled(context);
        mSwitch.setChecked(wfcEnabled);

        int wfcMode = ImsManager.getWfcMode(context);
        mButtonWfcMode.setValue(Integer.toString(wfcMode));
        mButtonWfcMode.setSummary(getWfcModeSummary(context, ImsManager.getWfcMode(context)));

        mButtonWfcRoam.setChecked(wfcEnabled
                && (wfcMode != ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY)
                && ImsManager.isWfcRoamingEnabledByUser(context));
    }

    @Override
    public void onPause() {
        super.onPause();

        if (ImsManager.isWfcEnabledByPlatform(getActivity())) {
            TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
            tm.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);

            mSwitchBar.removeOnSwitchChangeListener(this);
        }
    }

    /**
     * Listens to the state change of the switch.
     */
    @Override
    public void onSwitchChanged(Switch switchView, boolean isChecked) {
        final Context context = getActivity();

        ImsManager.setWfcSetting(context, isChecked);

        mButtonWfcMode.setEnabled(isChecked);
        boolean wfcHandoffEnabled = (ImsManager.getWfcMode(context)
                != ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY);
        mButtonWfcRoam.setEnabled(isChecked && wfcHandoffEnabled);
        mButtonWfcRoam.setChecked(isChecked && wfcHandoffEnabled
                && ImsManager.isWfcRoamingEnabledByUser(context));
    }

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        final Context context = getActivity();
        if (preference == mButtonWfcMode) {
            mButtonWfcMode.setValue((String) newValue);
            int buttonMode = Integer.valueOf((String) newValue);
            int currentMode = ImsManager.getWfcMode(context);
            if (buttonMode != currentMode) {
                ImsManager.setWfcMode(context, buttonMode);
                mButtonWfcMode.setSummary(getWfcModeSummary(context, buttonMode));
            }
            boolean wfcHandoffEnabled =
                    (buttonMode != ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY);
            mButtonWfcRoam.setEnabled(wfcHandoffEnabled);
            mButtonWfcRoam.setChecked(wfcHandoffEnabled &&
                    ImsManager.isWfcRoamingEnabledByUser(context));
        } else if (preference == mButtonWfcRoam) {
            SwitchPreference wfcRoamPref = (SwitchPreference) preference;
            wfcRoamPref.setChecked(!wfcRoamPref.isChecked());
            ImsManager.setWfcRoamingSetting(context, wfcRoamPref.isChecked());
        }
        return true;
    }

    static int getWfcModeSummary(Context context, int wfcMode) {
        int resId = R.string.wifi_calling_off_summary;
        if (ImsManager.isWfcEnabledByUser(context)) {
            switch (wfcMode) {
                case ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY:
                    resId = R.string.wfc_mode_wifi_only_summary;
                    break;
                case ImsConfig.WfcModeFeatureValueConstants.CELLULAR_PREFERRED:
                    resId = R.string.wfc_mode_cellular_preferred_summary;
                    break;
                case ImsConfig.WfcModeFeatureValueConstants.WIFI_PREFERRED:
                    resId = R.string.wfc_mode_wifi_preferred_summary;
                    break;
                default:
                    Log.e(TAG, "Unexpected WFC mode value: " + wfcMode);
            }
        }
        return resId;
    }
}
