/*
 * 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.tv.dialog;

import android.app.Dialog;
import android.app.DialogFragment;
import android.content.Context;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;

import com.android.tv.MainActivity;
import com.android.tv.R;

/**
 * Dialog fragment with full screen.
 */
public class FullscreenDialogFragment extends SafeDismissDialogFragment {
    public static final String DIALOG_TAG = FullscreenDialogFragment.class.getSimpleName();
    public static final String VIEW_LAYOUT_ID = "viewLayoutId";
    public static final String TRACKER_LABEL = "trackerLabel";

    /**
     * Creates a FullscreenDialogFragment. View class of viewLayoutResId should
     * implement {@link DialogView}.
     */
    public static FullscreenDialogFragment newInstance(int viewLayoutResId, String trackerLabel) {
        FullscreenDialogFragment f = new FullscreenDialogFragment();
        Bundle args = new Bundle();
        args.putInt(VIEW_LAYOUT_ID, viewLayoutResId);
        args.putString(TRACKER_LABEL, trackerLabel);
        f.setArguments(args);
        return f;
    }

    private String mTrackerLabel;
    private DialogView mDialogView;

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        FullscreenDialog dialog =
                new FullscreenDialog(getActivity(), R.style.Theme_TV_dialog_Fullscreen);
        LayoutInflater inflater = LayoutInflater.from(getActivity());
        Bundle args = getArguments();
        mTrackerLabel = args.getString(TRACKER_LABEL);
        int viewLayoutResId = args.getInt(VIEW_LAYOUT_ID);
        View v = inflater.inflate(viewLayoutResId, null);
        dialog.setContentView(v);
        mDialogView = (DialogView) v;
        mDialogView.initialize((MainActivity) getActivity(), dialog);
        return dialog;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mDialogView.onDestroy();
    }

    @Override
    public String getTrackerLabel() {
        return mTrackerLabel;
    }

    private class FullscreenDialog extends TvDialog {
        public FullscreenDialog(Context context, int theme) {
            super(context, theme);
        }

        @Override
        public void setContentView(View dialogView) {
            super.setContentView(dialogView);
            mDialogView = (DialogView) dialogView;
        }

        @Override
        public boolean dispatchKeyEvent(KeyEvent event) {
            boolean handled = super.dispatchKeyEvent(event);
            return handled || ((View) mDialogView).dispatchKeyEvent(event);
        }

        @Override
        public void onBackPressed() {
            mDialogView.onBackPressed();
        }
    }

    /**
     * Interface for the view of {@link FullscreenDialogFragment}.
     */
    public interface DialogView {
        /**
         * Called after the view is inflated and attached to the dialog.
         */
        void initialize(MainActivity activity, Dialog dialog);
        /**
         * Called when a back key is pressed.
         */
        void onBackPressed();
        /**
         * Called when {@link DialogFragment#onDestroy} is called.
         */
        void onDestroy();
    }
}
