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 androidx.leanback.widget.GuidanceStylist;
24 import androidx.leanback.widget.GuidedAction;
25 import androidx.leanback.widget.VerticalGridView;
26 import android.view.LayoutInflater;
27 import android.view.View;
28 import android.view.ViewGroup;
29 import com.android.tv.MainActivity;
30 import com.android.tv.R;
31 import com.android.tv.TvSingletons;
32 import com.android.tv.common.recording.RecordingStorageStatusManager;
33 import com.android.tv.dialog.HalfSizedDialogFragment.OnActionClickListener;
34 import com.android.tv.dialog.SafeDismissDialogFragment;
35 import com.android.tv.dvr.DvrManager;
36 import java.util.List;
37 
38 public abstract class DvrGuidedStepFragment extends TrackedGuidedStepFragment {
39     /** Action ID for "recording/scheduling the program anyway". */
40     public static final int ACTION_RECORD_ANYWAY = 1;
41     /** Action ID for "deleting existed recordings". */
42     public static final int ACTION_DELETE_RECORDINGS = 2;
43     /** Action ID for "cancelling current recording request". */
44     public static final int ACTION_CANCEL_RECORDING = 3;
45 
46     public static final String UNKNOWN_DVR_ACTION = "Unknown DVR Action";
47 
48     private DvrManager mDvrManager;
49     private OnActionClickListener mOnActionClickListener;
50 
getDvrManager()51     protected DvrManager getDvrManager() {
52         return mDvrManager;
53     }
54 
55     @Override
onAttach(Context context)56     public void onAttach(Context context) {
57         super.onAttach(context);
58         TvSingletons singletons = TvSingletons.getSingletons(context);
59         mDvrManager = singletons.getDvrManager();
60     }
61 
62     @Override
onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)63     public View onCreateView(
64             LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
65         View view = super.onCreateView(inflater, container, savedInstanceState);
66         VerticalGridView actionsList = getGuidedActionsStylist().getActionsGridView();
67         actionsList.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_BOTH_EDGE);
68         VerticalGridView buttonActionsList = getGuidedButtonActionsStylist().getActionsGridView();
69         buttonActionsList.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_BOTH_EDGE);
70         return view;
71     }
72 
73     @Override
onProvideTheme()74     public int onProvideTheme() {
75         return R.style.Theme_TV_Dvr_GuidedStep;
76     }
77 
78     @Override
onTrackedGuidedActionClicked(GuidedAction action)79     public void onTrackedGuidedActionClicked(GuidedAction action) {
80         if (mOnActionClickListener != null) {
81             mOnActionClickListener.onActionClick(action.getId());
82         }
83         dismissDialog();
84     }
85 
86     @Override
getTrackerLabelForGuidedAction(GuidedAction action)87     public String getTrackerLabelForGuidedAction(GuidedAction action) {
88         long actionId = action.getId();
89         if (actionId == ACTION_RECORD_ANYWAY) {
90             return "record-anyway";
91         } else if (actionId == ACTION_DELETE_RECORDINGS) {
92             return "delete-recordings";
93         } else if (actionId == ACTION_CANCEL_RECORDING) {
94             return "cancel-recording";
95         } else {
96             return super.getTrackerLabelForGuidedAction(action);
97         }
98     }
99 
dismissDialog()100     protected void dismissDialog() {
101         if (getActivity() instanceof MainActivity) {
102             SafeDismissDialogFragment currentDialog =
103                     ((MainActivity) getActivity()).getOverlayManager().getCurrentDialog();
104             if (currentDialog instanceof DvrHalfSizedDialogFragment) {
105                 currentDialog.dismiss();
106             }
107         } else if (getParentFragment() instanceof DialogFragment) {
108             ((DialogFragment) getParentFragment()).dismiss();
109         }
110     }
111 
setOnActionClickListener(OnActionClickListener listener)112     protected void setOnActionClickListener(OnActionClickListener listener) {
113         mOnActionClickListener = listener;
114     }
115 
116     /**
117      * The inner guided step fragment for {@link com.android.tv.dvr.ui.DvrHalfSizedDialogFragment
118      * .DvrNoFreeSpaceErrorDialogFragment}.
119      */
120     public static class DvrNoFreeSpaceErrorFragment extends DvrGuidedStepFragment {
121         @Override
onCreateGuidance(Bundle savedInstanceState)122         public GuidanceStylist.Guidance onCreateGuidance(Bundle savedInstanceState) {
123             return new GuidanceStylist.Guidance(
124                     getString(R.string.dvr_error_no_free_space_title),
125                     getString(R.string.dvr_error_no_free_space_description),
126                     null,
127                     null);
128         }
129 
130         @Override
onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState)131         public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
132             Activity activity = getActivity();
133             actions.add(
134                     new GuidedAction.Builder(activity)
135                             .id(ACTION_RECORD_ANYWAY)
136                             .title(R.string.dvr_action_record_anyway)
137                             .build());
138             actions.add(
139                     new GuidedAction.Builder(activity)
140                             .id(ACTION_DELETE_RECORDINGS)
141                             .title(R.string.dvr_action_delete_recordings)
142                             .build());
143             actions.add(
144                     new GuidedAction.Builder(activity)
145                             .id(ACTION_CANCEL_RECORDING)
146                             .title(R.string.dvr_action_record_cancel)
147                             .build());
148         }
149 
150         @Override
getTrackerPrefix()151         public String getTrackerPrefix() {
152             return "DvrNoFreeSpaceErrorFragment";
153         }
154     }
155 
156     /**
157      * The inner guided step fragment for {@link com.android.tv.dvr.ui.DvrHalfSizedDialogFragment
158      * .DvrSmallSizedStorageErrorDialogFragment}.
159      */
160     public static class DvrSmallSizedStorageErrorFragment extends DvrGuidedStepFragment {
161         @Override
onCreateGuidance(Bundle savedInstanceState)162         public GuidanceStylist.Guidance onCreateGuidance(Bundle savedInstanceState) {
163             String title = getResources().getString(R.string.dvr_error_small_sized_storage_title);
164             String description =
165                     getResources()
166                             .getString(
167                                     R.string.dvr_error_small_sized_storage_description,
168                                     RecordingStorageStatusManager.MIN_STORAGE_SIZE_FOR_DVR_IN_BYTES
169                                             / 1024
170                                             / 1024
171                                             / 1024);
172             return new GuidanceStylist.Guidance(title, description, null, null);
173         }
174 
175         @Override
onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState)176         public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
177             Activity activity = getActivity();
178             actions.add(
179                     new GuidedAction.Builder(activity)
180                             .id(GuidedAction.ACTION_ID_OK)
181                             .title(android.R.string.ok)
182                             .build());
183         }
184 
185         @Override
onTrackedGuidedActionClicked(GuidedAction action)186         public void onTrackedGuidedActionClicked(GuidedAction action) {
187             dismissDialog();
188         }
189 
190         @Override
getTrackerPrefix()191         public String getTrackerPrefix() {
192             return "DvrSmallSizedStorageErrorFragment";
193         }
194     }
195 }
196