/*
 * Copyright (C) 2014 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.wifi;

import android.app.Dialog;
import android.net.wifi.WifiConfiguration;
import android.os.Bundle;
import android.support.v7.preference.PreferenceScreen;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;

import com.android.settings.R;
import com.android.settings.SetupWizardUtils;
import com.android.setupwizardlib.SetupWizardListLayout;
import com.android.setupwizardlib.view.NavigationBar;

/**
 * This customized version of WifiSettings is shown to the user only during Setup Wizard. Menu
 * is not shown, clicking on an access point will auto-advance to the next screen (once connected),
 * and, if the user opts to skip ahead without a wifi connection, a warning message alerts of
 * possible carrier data charges or missing software updates.
 */
public class WifiSettingsForSetupWizard extends WifiSettings {

    private static final String TAG = "WifiSettingsForSetupWizard";

    private SetupWizardListLayout mLayout;
    private View mAddOtherNetworkItem;
    private TextView mEmptyFooter;
    private View mMacAddressFooter;
    private boolean mListLastEmpty = false;

    @Override
    public View onCreateView(final LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        mLayout = (SetupWizardListLayout)
                inflater.inflate(R.layout.setup_wifi_layout, container, false);
        final ListView list = mLayout.getListView();

        mAddOtherNetworkItem = inflater.inflate(R.layout.setup_wifi_add_network, list, false);
        list.addFooterView(mAddOtherNetworkItem, null, true);
        mAddOtherNetworkItem.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mWifiManager.isWifiEnabled()) {
                    onAddNetworkPressed();
                }
            }
        });

        mMacAddressFooter = inflater.inflate(R.layout.setup_wifi_mac_address, list, false);
        list.addFooterView(mMacAddressFooter, null, false);

        final NavigationBar navigationBar = mLayout.getNavigationBar();
        if (navigationBar != null) {
            WifiSetupActivity activity = (WifiSetupActivity) getActivity();
            activity.onNavigationBarCreated(navigationBar);
        }

        return mLayout;
    }

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

        if (hasNextButton()) {
            getNextButton().setVisibility(View.GONE);
        }

        updateMacAddress();
    }

    @Override
    public void onAccessPointsChanged() {
        super.onAccessPointsChanged();
        PreferenceScreen preferenceScreen = getPreferenceScreen();
        updateFooter(preferenceScreen == null || preferenceScreen.getPreferenceCount() == 0);
    }

    @Override
    public void onWifiStateChanged(int state) {
        super.onWifiStateChanged(state);
        updateMacAddress();
    }

    @Override
    public void registerForContextMenu(View view) {
        // Suppressed during setup wizard
    }

    @Override
    /* package */ WifiEnabler createWifiEnabler() {
        // Not shown during setup wizard
        return null;
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        // Do not show menu during setup wizard
    }

    @Override
    public Dialog onCreateDialog(int dialogId) {
        final Dialog dialog = super.onCreateDialog(dialogId);
        SetupWizardUtils.applyImmersiveFlags(dialog);
        return dialog;
    }

    @Override
    protected void connect(final WifiConfiguration config) {
        WifiSetupActivity activity = (WifiSetupActivity) getActivity();
        activity.networkSelected();
        super.connect(config);
    }

    @Override
    protected void connect(final int networkId) {
        WifiSetupActivity activity = (WifiSetupActivity) getActivity();
        activity.networkSelected();
        super.connect(networkId);
    }

    @Override
    protected TextView initEmptyTextView() {
        final LayoutInflater inflater = LayoutInflater.from(getActivity());
        mEmptyFooter = (TextView) inflater.inflate(R.layout.setup_wifi_empty, getListView(), false);
        return mEmptyFooter;
    }

    protected void updateFooter(boolean isEmpty) {
        if (isEmpty != mListLastEmpty) {
            if (isEmpty) {
                setFooterView(mEmptyFooter);
            } else {
                LinearLayout layout = new LinearLayout(getContext());
                layout.setOrientation(LinearLayout.VERTICAL);
                layout.addView(mAddOtherNetworkItem);
                layout.addView(mMacAddressFooter);
                setFooterView(layout);
            }
            mListLastEmpty = isEmpty;
        }
    }

    @Override
    public View setPinnedHeaderView(int layoutResId) {
        // Pinned header is not supported in setup wizard
        return null;
    }

    @Override
    public void setPinnedHeaderView(View pinnedHeader) {
        // Pinned header is not supported in setup wizard
    }

    @Override
    protected void setProgressBarVisible(boolean visible) {
        if (mLayout != null) {
            if (visible) {
                mLayout.showProgressBar();
            } else {
                mLayout.hideProgressBar();
            }
        }
    }

    private void updateMacAddress() {
        if (mMacAddressFooter != null) {
            String macAddress = null;
            if (mWifiManager != null) {
                android.net.wifi.WifiInfo connectionInfo = mWifiManager.getConnectionInfo();
                if (connectionInfo != null) {
                    macAddress = connectionInfo.getMacAddress();
                }
            }
            final TextView macAddressTextView =
                    (TextView) mMacAddressFooter.findViewById(R.id.mac_address);
            macAddressTextView.setText(!TextUtils.isEmpty(macAddress) ?
                    macAddress : getString(R.string.status_unavailable));
        }
    }
}
