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}