165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko/*
265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * Copyright (C) 2016 The Android Open Source Project
365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko *
465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * Licensed under the Apache License, Version 2.0 (the "License");
565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * you may not use this file except in compliance with the License.
665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * You may obtain a copy of the License at
765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko *
865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko *      http://www.apache.org/licenses/LICENSE-2.0
965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko *
1065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * Unless required by applicable law or agreed to in writing, software
1165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * distributed under the License is distributed on an "AS IS" BASIS,
1265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * See the License for the specific language governing permissions and
1465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * limitations under the License.
1565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko */
1665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
176ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkopackage com.android.tv.dialog;
182e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko
196ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport android.app.Dialog;
2065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport android.content.DialogInterface;
212e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalkoimport android.os.Bundle;
2265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport android.os.Handler;
2365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport android.view.KeyEvent;
242e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalkoimport android.view.LayoutInflater;
252e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalkoimport android.view.View;
262e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalkoimport android.view.ViewGroup;
272e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko
282e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalkoimport com.android.tv.R;
2965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
3065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport java.util.concurrent.TimeUnit;
312e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko
322e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalkopublic class HalfSizedDialogFragment extends SafeDismissDialogFragment {
332e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    public static final String DIALOG_TAG = HalfSizedDialogFragment.class.getSimpleName();
342e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    public static final String TRACKER_LABEL = "Half sized dialog";
352e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko
3665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    private static final long AUTO_DISMISS_TIME_THRESHOLD_MS = TimeUnit.SECONDS.toMillis(30);
3765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
38d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko    private OnActionClickListener mOnActionClickListener;
39d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko
4065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    private Handler mHandler = new Handler();
4165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    private Runnable mAutoDismisser = new Runnable() {
4265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        @Override
4365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        public void run() {
4465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            dismiss();
4565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
4665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    };
4765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
482e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    @Override
492e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    public View onCreateView(LayoutInflater inflater, ViewGroup container,
502e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko            Bundle savedInstanceState) {
5165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        return inflater.inflate(R.layout.halfsized_dialog, container, false);
5265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
5365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
5465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    @Override
5565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public void onStart() {
5665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        super.onStart();
5765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        mHandler.postDelayed(mAutoDismisser, AUTO_DISMISS_TIME_THRESHOLD_MS);
5865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
5965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
6065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    @Override
61d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko    public void onPause() {
62d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko        super.onPause();
63d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko        if (mOnActionClickListener != null) {
64d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko            // Dismisses the dialog to prevent the callback being forgotten during
65d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko            // fragment re-creating.
66d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko            dismiss();
67d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko        }
68d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko    }
69d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko
70d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko    @Override
7165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public void onStop() {
7265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        super.onStop();
7365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        mHandler.removeCallbacks(mAutoDismisser);
742e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    }
752e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko
762e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    @Override
776ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    public Dialog onCreateDialog(Bundle savedInstanceState) {
786ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        Dialog dialog = super.onCreateDialog(savedInstanceState);
796ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        dialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
806ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent keyEvent) {
816ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                mHandler.removeCallbacks(mAutoDismisser);
826ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                mHandler.postDelayed(mAutoDismisser, AUTO_DISMISS_TIME_THRESHOLD_MS);
836ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                return false;
846ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            }
856ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        });
866ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        return dialog;
876ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    }
886ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko
896ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    @Override
902e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    public int getTheme() {
912e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        return R.style.Theme_TV_dialog_HalfSizedDialog;
922e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    }
932e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko
942e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    @Override
952e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    public String getTrackerLabel() {
962e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko        return TRACKER_LABEL;
972e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko    }
98d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko
99d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko    /**
100d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko     * Sets {@link OnActionClickListener} for the dialog fragment. If listener is set, the dialog
101d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko     * will be automatically closed when it's paused to prevent the fragment being re-created by
102d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko     * the framework, which will result the listener being forgotten.
103d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko     */
104d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko    public void setOnActionClickListener(OnActionClickListener listener) {
105d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko        mOnActionClickListener = listener;
106d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko    }
107d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko
108d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko    /**
109d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko     * Returns {@link OnActionClickListener} for sub-classes or any inner fragments.
110d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko     */
111d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko    protected OnActionClickListener getOnActionClickListener() {
112d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko        return mOnActionClickListener;
113d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko    }
114d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko
115d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko    /**
116d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko     * An interface to provide callbacks for half-sized dialogs. Subclasses or inner fragments
117d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko     * should invoke {@link OnActionClickListener#onActionClick(long)} and provide the identifier
118d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko     * of the action user clicked.
119d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko     */
120d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko    public interface OnActionClickListener {
121d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko        void onActionClick(long actionId);
122d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko    }
12365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko}