1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.tv.dvr.ui; 18 19 import android.app.Activity; 20 import android.app.DialogFragment; 21 import android.content.Context; 22 import android.os.Bundle; 23 import android.support.v17.leanback.widget.GuidanceStylist; 24 import android.support.v17.leanback.widget.GuidedAction; 25 import android.support.v17.leanback.widget.VerticalGridView; 26 import android.view.LayoutInflater; 27 import android.view.View; 28 import android.view.ViewGroup; 29 30 import com.android.tv.ApplicationSingletons; 31 import com.android.tv.MainActivity; 32 import com.android.tv.R; 33 import com.android.tv.TvApplication; 34 import com.android.tv.dialog.HalfSizedDialogFragment.OnActionClickListener; 35 import com.android.tv.dialog.SafeDismissDialogFragment; 36 import com.android.tv.dvr.DvrManager; 37 import com.android.tv.dvr.DvrStorageStatusManager; 38 39 import java.util.List; 40 41 public abstract class DvrGuidedStepFragment extends TrackedGuidedStepFragment { 42 /** 43 * Action ID for "recording/scheduling the program anyway". 44 */ 45 public static final int ACTION_RECORD_ANYWAY = 1; 46 /** 47 * Action ID for "deleting existed recordings". 48 */ 49 public static final int ACTION_DELETE_RECORDINGS = 2; 50 /** 51 * Action ID for "cancelling current recording request". 52 */ 53 public static final int ACTION_CANCEL_RECORDING = 3; 54 public static final String UNKNOWN_DVR_ACTION = "Unknown DVR Action"; 55 56 private DvrManager mDvrManager; 57 private OnActionClickListener mOnActionClickListener; 58 59 protected DvrManager getDvrManager() { 60 return mDvrManager; 61 } 62 63 @Override 64 public void onAttach(Context context) { 65 super.onAttach(context); 66 ApplicationSingletons singletons = TvApplication.getSingletons(context); 67 mDvrManager = singletons.getDvrManager(); 68 } 69 70 @Override 71 public View onCreateView(LayoutInflater inflater, ViewGroup container, 72 Bundle savedInstanceState) { 73 View view = super.onCreateView(inflater, container, savedInstanceState); 74 VerticalGridView actionsList = getGuidedActionsStylist().getActionsGridView(); 75 actionsList.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_BOTH_EDGE); 76 VerticalGridView buttonActionsList = getGuidedButtonActionsStylist().getActionsGridView(); 77 buttonActionsList.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_BOTH_EDGE); 78 return view; 79 } 80 81 @Override 82 public int onProvideTheme() { 83 return R.style.Theme_TV_Dvr_GuidedStep; 84 } 85 86 @Override 87 public void onTrackedGuidedActionClicked(GuidedAction action) { 88 if (mOnActionClickListener != null) { 89 mOnActionClickListener.onActionClick(action.getId()); 90 } 91 dismissDialog(); 92 } 93 94 @Override 95 public String getTrackerLabelForGuidedAction(GuidedAction action) { 96 long actionId = action.getId(); 97 if (actionId == ACTION_RECORD_ANYWAY) { 98 return "record-anyway"; 99 } else if (actionId == ACTION_DELETE_RECORDINGS) { 100 return "delete-recordings"; 101 } else if (actionId == ACTION_CANCEL_RECORDING) { 102 return "cancel-recording"; 103 } else { 104 return super.getTrackerLabelForGuidedAction(action); 105 } 106 } 107 108 protected void dismissDialog() { 109 if (getActivity() instanceof MainActivity) { 110 SafeDismissDialogFragment currentDialog = 111 ((MainActivity) getActivity()).getOverlayManager().getCurrentDialog(); 112 if (currentDialog instanceof DvrHalfSizedDialogFragment) { 113 currentDialog.dismiss(); 114 } 115 } else if (getParentFragment() instanceof DialogFragment) { 116 ((DialogFragment) getParentFragment()).dismiss(); 117 } 118 } 119 120 protected void setOnActionClickListener(OnActionClickListener listener) { 121 mOnActionClickListener = listener; 122 } 123 124 /** 125 * The inner guided step fragment for 126 * {@link com.android.tv.dvr.ui.DvrHalfSizedDialogFragment 127 * .DvrNoFreeSpaceErrorDialogFragment}. 128 */ 129 public static class DvrNoFreeSpaceErrorFragment extends DvrGuidedStepFragment { 130 @Override 131 public GuidanceStylist.Guidance onCreateGuidance(Bundle savedInstanceState) { 132 return new GuidanceStylist.Guidance(getString(R.string.dvr_error_no_free_space_title), 133 getString(R.string.dvr_error_no_free_space_description), null, null); 134 } 135 136 @Override 137 public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) { 138 Activity activity = getActivity(); 139 actions.add(new GuidedAction.Builder(activity) 140 .id(ACTION_RECORD_ANYWAY) 141 .title(R.string.dvr_action_record_anyway) 142 .build()); 143 actions.add(new GuidedAction.Builder(activity) 144 .id(ACTION_DELETE_RECORDINGS) 145 .title(R.string.dvr_action_delete_recordings) 146 .build()); 147 actions.add(new GuidedAction.Builder(activity) 148 .id(ACTION_CANCEL_RECORDING) 149 .title(R.string.dvr_action_record_cancel) 150 .build()); 151 } 152 153 @Override 154 public String getTrackerPrefix() { 155 return "DvrNoFreeSpaceErrorFragment"; 156 } 157 } 158 159 /** 160 * The inner guided step fragment for 161 * {@link com.android.tv.dvr.ui.DvrHalfSizedDialogFragment 162 * .DvrSmallSizedStorageErrorDialogFragment}. 163 */ 164 public static class DvrSmallSizedStorageErrorFragment extends DvrGuidedStepFragment { 165 @Override 166 public GuidanceStylist.Guidance onCreateGuidance(Bundle savedInstanceState) { 167 String title = getResources().getString( 168 R.string.dvr_error_small_sized_storage_title); 169 String description = getResources().getString( 170 R.string.dvr_error_small_sized_storage_description, 171 DvrStorageStatusManager.MIN_STORAGE_SIZE_FOR_DVR_IN_BYTES / 1024 172 / 1024 / 1024); 173 return new GuidanceStylist.Guidance(title, description, null, null); 174 } 175 176 @Override 177 public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) { 178 Activity activity = getActivity(); 179 actions.add(new GuidedAction.Builder(activity) 180 .id(GuidedAction.ACTION_ID_OK) 181 .title(android.R.string.ok) 182 .build()); 183 } 184 185 @Override 186 public void onTrackedGuidedActionClicked(GuidedAction action) { 187 dismissDialog(); 188 } 189 190 @Override 191 public String getTrackerPrefix() { 192 return "DvrSmallSizedStorageErrorFragment"; 193 } 194 } 195 }