aboutsummaryrefslogtreecommitdiff
path: root/src/com/android/tv/dvr/ui
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/tv/dvr/ui')
-rw-r--r--src/com/android/tv/dvr/ui/DvrAlreadyRecordedFragment.java30
-rw-r--r--src/com/android/tv/dvr/ui/DvrAlreadyScheduledFragment.java36
-rw-r--r--src/com/android/tv/dvr/ui/DvrConflictFragment.java4
-rw-r--r--src/com/android/tv/dvr/ui/DvrRecordingSettingsActivity.java60
-rw-r--r--src/com/android/tv/dvr/ui/DvrRecordingSettingsFragment.java342
-rw-r--r--src/com/android/tv/dvr/ui/DvrScheduleFragment.java46
-rw-r--r--src/com/android/tv/dvr/ui/DvrUiHelper.java16
7 files changed, 503 insertions, 31 deletions
diff --git a/src/com/android/tv/dvr/ui/DvrAlreadyRecordedFragment.java b/src/com/android/tv/dvr/ui/DvrAlreadyRecordedFragment.java
index 1f4faf31..028265b2 100644
--- a/src/com/android/tv/dvr/ui/DvrAlreadyRecordedFragment.java
+++ b/src/com/android/tv/dvr/ui/DvrAlreadyRecordedFragment.java
@@ -28,12 +28,16 @@ import androidx.leanback.widget.GuidedAction;
import com.android.tv.R;
import com.android.tv.TvSingletons;
+import com.android.tv.common.flags.DvrFlags;
import com.android.tv.data.api.Program;
import com.android.tv.dvr.DvrManager;
import com.android.tv.dvr.data.RecordedProgram;
import java.util.List;
+import javax.inject.Inject;
+import dagger.android.AndroidInjection;
+
/**
* A fragment which notifies the user that the same episode has already been scheduled.
*
@@ -47,9 +51,11 @@ public class DvrAlreadyRecordedFragment extends DvrGuidedStepFragment {
private Program mProgram;
private RecordedProgram mDuplicate;
+ @Inject DvrFlags mDvrFlags;
@Override
public void onAttach(Context context) {
+ AndroidInjection.inject(this);
super.onAttach(context);
mProgram = getArguments().getParcelable(DvrHalfSizedDialogFragment.KEY_PROGRAM);
DvrManager dvrManager = TvSingletons.getSingletons(context).getDvrManager();
@@ -59,13 +65,17 @@ public class DvrAlreadyRecordedFragment extends DvrGuidedStepFragment {
mProgram.getSeasonNumber(),
mProgram.getEpisodeNumber());
if (mDuplicate == null) {
- dvrManager.addSchedule(mProgram);
- DvrUiHelper.showAddScheduleToast(
- context,
- mProgram.getTitle(),
- mProgram.getStartTimeUtcMillis(),
- mProgram.getEndTimeUtcMillis());
- dismissDialog();
+ if (mDvrFlags.startEarlyEndLateEnabled()) {
+ DvrUiHelper.startRecordingSettingsActivity(getContext(), mProgram);
+ } else {
+ dvrManager.addSchedule(mProgram);
+ DvrUiHelper.showAddScheduleToast(
+ context,
+ mProgram.getTitle(),
+ mProgram.getStartTimeUtcMillis(),
+ mProgram.getEndTimeUtcMillis());
+ dismissDialog();
+ }
}
}
@@ -101,7 +111,11 @@ public class DvrAlreadyRecordedFragment extends DvrGuidedStepFragment {
@Override
public void onTrackedGuidedActionClicked(GuidedAction action) {
if (action.getId() == ACTION_RECORD_ANYWAY) {
- getDvrManager().addSchedule(mProgram);
+ if (mDvrFlags.startEarlyEndLateEnabled()) {
+ DvrUiHelper.startRecordingSettingsActivity(getContext(), mProgram);
+ } else {
+ getDvrManager().addSchedule(mProgram);
+ }
} else if (action.getId() == ACTION_WATCH) {
DvrUiHelper.startDetailsActivity(getActivity(), mDuplicate, null, false);
}
diff --git a/src/com/android/tv/dvr/ui/DvrAlreadyScheduledFragment.java b/src/com/android/tv/dvr/ui/DvrAlreadyScheduledFragment.java
index 56ffc884..4a3a5d4d 100644
--- a/src/com/android/tv/dvr/ui/DvrAlreadyScheduledFragment.java
+++ b/src/com/android/tv/dvr/ui/DvrAlreadyScheduledFragment.java
@@ -29,12 +29,16 @@ import androidx.leanback.widget.GuidedAction;
import com.android.tv.R;
import com.android.tv.TvSingletons;
+import com.android.tv.common.flags.DvrFlags;
import com.android.tv.data.api.Program;
import com.android.tv.dvr.DvrManager;
import com.android.tv.dvr.data.ScheduledRecording;
import java.util.List;
+import javax.inject.Inject;
+import dagger.android.AndroidInjection;
+
/**
* A fragment which notifies the user that the same episode has already been scheduled.
*
@@ -48,9 +52,11 @@ public class DvrAlreadyScheduledFragment extends DvrGuidedStepFragment {
private Program mProgram;
private ScheduledRecording mDuplicate;
+ @Inject DvrFlags mDvrFlags;
@Override
public void onAttach(Context context) {
+ AndroidInjection.inject(this);
super.onAttach(context);
mProgram = getArguments().getParcelable(DvrHalfSizedDialogFragment.KEY_PROGRAM);
DvrManager dvrManager = TvSingletons.getSingletons(context).getDvrManager();
@@ -60,13 +66,17 @@ public class DvrAlreadyScheduledFragment extends DvrGuidedStepFragment {
mProgram.getSeasonNumber(),
mProgram.getEpisodeNumber());
if (mDuplicate == null) {
- dvrManager.addSchedule(mProgram);
- DvrUiHelper.showAddScheduleToast(
- context,
- mProgram.getTitle(),
- mProgram.getStartTimeUtcMillis(),
- mProgram.getEndTimeUtcMillis());
- dismissDialog();
+ if (mDvrFlags.startEarlyEndLateEnabled()) {
+ DvrUiHelper.startRecordingSettingsActivity(getContext(), mProgram);
+ } else {
+ dvrManager.addSchedule(mProgram);
+ DvrUiHelper.showAddScheduleToast(
+ context,
+ mProgram.getTitle(),
+ mProgram.getStartTimeUtcMillis(),
+ mProgram.getEndTimeUtcMillis());
+ dismissDialog();
+ }
}
}
@@ -108,10 +118,18 @@ public class DvrAlreadyScheduledFragment extends DvrGuidedStepFragment {
@Override
public void onTrackedGuidedActionClicked(GuidedAction action) {
if (action.getId() == ACTION_RECORD_ANYWAY) {
- getDvrManager().addSchedule(mProgram);
+ if (mDvrFlags.startEarlyEndLateEnabled()) {
+ DvrUiHelper.startRecordingSettingsActivity(getContext(), mProgram);
+ } else {
+ getDvrManager().addSchedule(mProgram);
+ }
} else if (action.getId() == ACTION_RECORD_INSTEAD) {
- getDvrManager().addSchedule(mProgram);
getDvrManager().removeScheduledRecording(mDuplicate);
+ if (mDvrFlags.startEarlyEndLateEnabled()) {
+ DvrUiHelper.startRecordingSettingsActivity(getContext(), mProgram);
+ } else {
+ getDvrManager().addSchedule(mProgram);
+ }
}
dismissDialog();
}
diff --git a/src/com/android/tv/dvr/ui/DvrConflictFragment.java b/src/com/android/tv/dvr/ui/DvrConflictFragment.java
index 5e0a96bb..47a436da 100644
--- a/src/com/android/tv/dvr/ui/DvrConflictFragment.java
+++ b/src/com/android/tv/dvr/ui/DvrConflictFragment.java
@@ -92,6 +92,10 @@ public abstract class DvrConflictFragment extends DvrGuidedStepFragment {
getContext(), getConflicts());
}
dismissDialog();
+ // Finish the Recording setting Activity on dismissal.
+ if (getActivity() instanceof DvrRecordingSettingsActivity) {
+ getActivity().finish();
+ }
}
@Override
diff --git a/src/com/android/tv/dvr/ui/DvrRecordingSettingsActivity.java b/src/com/android/tv/dvr/ui/DvrRecordingSettingsActivity.java
new file mode 100644
index 00000000..9cf0bad2
--- /dev/null
+++ b/src/com/android/tv/dvr/ui/DvrRecordingSettingsActivity.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2019 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.dvr.ui;
+
+import android.app.Activity;
+import android.graphics.drawable.ColorDrawable;
+import android.os.Bundle;
+import androidx.leanback.app.GuidedStepFragment;
+import com.android.tv.R;
+import com.android.tv.Starter;
+
+/** Activity to show details view in DVR. */
+public class DvrRecordingSettingsActivity extends Activity {
+
+ /**
+ * Name of the boolean flag to decide if the setting fragment should be translucent. Type:
+ * boolean
+ */
+ public static final String IS_WINDOW_TRANSLUCENT = "windows_translucent";
+ /**
+ * Name of the program added for recording.
+ */
+ public static final String PROGRAM = "program";
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ Starter.start(this);
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_dvr_series_settings);
+
+ if (savedInstanceState == null) {
+ DvrRecordingSettingsFragment settingFragment = new DvrRecordingSettingsFragment();
+ settingFragment.setArguments(getIntent().getExtras());
+ GuidedStepFragment.addAsRoot(this, settingFragment, R.id.dvr_settings_view_frame);
+ }
+ }
+
+ @Override
+ public void onAttachedToWindow() {
+ if (!getIntent().getExtras().getBoolean(IS_WINDOW_TRANSLUCENT, true)) {
+ getWindow()
+ .setBackgroundDrawable(
+ new ColorDrawable(getColor(R.color.common_tv_background)));
+ }
+ }
+}
diff --git a/src/com/android/tv/dvr/ui/DvrRecordingSettingsFragment.java b/src/com/android/tv/dvr/ui/DvrRecordingSettingsFragment.java
new file mode 100644
index 00000000..8e651b81
--- /dev/null
+++ b/src/com/android/tv/dvr/ui/DvrRecordingSettingsFragment.java
@@ -0,0 +1,342 @@
+/*
+ * Copyright (C) 2019 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.dvr.ui;
+
+import android.annotation.TargetApi;
+import android.app.DialogFragment;
+import android.content.Context;
+import android.os.Build;
+import android.os.Bundle;
+
+import com.android.tv.MainActivity;
+import com.android.tv.R;
+import com.android.tv.TvSingletons;
+import com.android.tv.data.ProgramImpl;
+import com.android.tv.data.api.Program;
+import com.android.tv.dialog.SafeDismissDialogFragment;
+import com.android.tv.dvr.DvrManager;
+import com.android.tv.dvr.data.ScheduledRecording;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import androidx.leanback.app.GuidedStepFragment;
+import androidx.leanback.widget.GuidanceStylist.Guidance;
+import androidx.leanback.widget.GuidedAction;
+import androidx.leanback.widget.GuidedActionsStylist;
+
+/** Fragment for DVR recording settings. */
+@TargetApi(Build.VERSION_CODES.N)
+@SuppressWarnings("AndroidApiChecker") // TODO(b/32513850) remove when error prone is updated
+public class DvrRecordingSettingsFragment extends GuidedStepFragment {
+ private static final String TAG = "RecordingSettingsFragment";
+
+ private static final long ACTION_ID_START_EARLY = 100;
+ private static final long ACTION_ID_END_LATE = 101;
+
+ private static final int SUB_ACTION_ID_START_ON_TIME = 1;
+ private static final int SUB_ACTION_ID_START_ONE_MIN = 2;
+ private static final int SUB_ACTION_ID_START_FIVE_MIN = 3;
+ private static final int SUB_ACTION_ID_START_FIFTEEN_MIN = 4;
+ private static final int SUB_ACTION_ID_START_HALF_HOUR = 5;
+
+ private static final int SUB_ACTION_ID_END_ON_TIME = 6;
+ private static final int SUB_ACTION_ID_END_ONE_MIN = 7;
+ private static final int SUB_ACTION_ID_END_FIFTEEN_MIN = 8;
+ private static final int SUB_ACTION_ID_END_HALF_HOUR = 9;
+ private static final int SUB_ACTION_ID_END_ONE_HOUR = 10;
+ private static final int SUB_ACTION_ID_END_TWO_HOURS = 11;
+ private static final int SUB_ACTION_ID_END_THREE_HOURS = 12;
+
+ private Program mProgram;
+ private String mFragmentTitle;
+ private String mStartEarlyActionTitle;
+ private String mEndLateActionTitle;
+ private String mTimeActionOnTimeText;
+ private String mTimeActionOneMinText;
+ private String mTimeActionFiveMinText;
+ private String mTimeActionFifteenMinText;
+ private String mTimeActionHalfHourText;
+ private String mTimeActionOneHourText;
+ private String mTimeActionTwoHoursText;
+ private String mTimeActionThreeHoursText;
+
+ private GuidedAction mStartEarlyGuidedAction;
+ private GuidedAction mEndLateGuidedAction;
+ private long mStartEarlyTime = 0;
+ private long mEndLateTime = 0;
+ private DvrManager mDvrManager;
+
+ @Override
+ public void onAttach(Context context) {
+ super.onAttach(context);
+ mDvrManager = TvSingletons.getSingletons(getContext()).getDvrManager();
+ mProgram = getArguments().getParcelable(DvrRecordingSettingsActivity.PROGRAM);
+ if (mProgram == null) {
+ getActivity().finish();
+ return;
+ }
+ mFragmentTitle = getString(R.string.dvr_recording_settings_title);
+ mStartEarlyActionTitle = getString(R.string.dvr_start_early_title);
+ mEndLateActionTitle = getString(R.string.dvr_end_late_title);
+ mTimeActionOnTimeText = getString(R.string.dvr_recording_settings_time_none);
+ mTimeActionOneMinText = getString(R.string.dvr_recording_settings_time_one_min);
+ mTimeActionFiveMinText = getString(R.string.dvr_recording_settings_time_five_mins);
+ mTimeActionFifteenMinText = getString(R.string.dvr_recording_settings_time_fifteen_mins);
+ mTimeActionHalfHourText = getString(R.string.dvr_recording_settings_time_half_hour);
+ mTimeActionOneHourText = getString(R.string.dvr_recording_settings_time_one_hour);
+ mTimeActionTwoHoursText = getString(R.string.dvr_recording_settings_time_two_hours);
+ mTimeActionThreeHoursText = getString(R.string.dvr_recording_settings_time_three_hours);
+ }
+
+ @Override
+ public Guidance onCreateGuidance(Bundle savedInstanceState) {
+ String breadcrumb = mProgram.getTitle();
+ String title = mFragmentTitle;
+ String description = mProgram.getEpisodeTitle() + "\n" + mProgram.getDescription();
+ return new Guidance(title, description, breadcrumb, null);
+ }
+
+ @Override
+ public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
+ mStartEarlyGuidedAction =
+ new GuidedAction.Builder(getActivity())
+ .id(ACTION_ID_START_EARLY)
+ .title(mStartEarlyActionTitle)
+ .description(mTimeActionOnTimeText)
+ .subActions(buildChannelSubActionStart())
+ .build();
+ actions.add(mStartEarlyGuidedAction);
+
+ mEndLateGuidedAction =
+ new GuidedAction.Builder(getActivity())
+ .id(ACTION_ID_END_LATE)
+ .title(mEndLateActionTitle)
+ .description(mTimeActionOnTimeText)
+ .subActions(buildChannelSubActionEnd())
+ .build();
+ actions.add(mEndLateGuidedAction);
+ }
+
+ @Override
+ public void onCreateButtonActions(List<GuidedAction> actions, Bundle savedInstanceState) {
+ actions.add(
+ new GuidedAction.Builder(getActivity())
+ .clickAction(GuidedAction.ACTION_ID_OK)
+ .build());
+ actions.add(
+ new GuidedAction.Builder(getActivity())
+ .clickAction(GuidedAction.ACTION_ID_CANCEL)
+ .build());
+ }
+
+ @Override
+ public void onGuidedActionClicked(GuidedAction action) {
+ long actionId = action.getId();
+ if (actionId == GuidedAction.ACTION_ID_OK) {
+ long startEarlyTimeMs = TimeUnit.MINUTES.toMillis(mStartEarlyTime);
+ long endLateTimeMs = TimeUnit.MINUTES.toMillis(mEndLateTime);
+ long startTimeMs = mProgram.getStartTimeUtcMillis() - startEarlyTimeMs;
+ if (startTimeMs < System.currentTimeMillis()) {
+ startTimeMs = System.currentTimeMillis();
+ startEarlyTimeMs = mProgram.getStartTimeUtcMillis() - startTimeMs;
+ }
+ long endTimeMs = mProgram.getEndTimeUtcMillis() + endLateTimeMs;
+ Program customizedProgram =
+ new ProgramImpl.Builder(mProgram)
+ .setStartTimeUtcMillis(startTimeMs)
+ .setEndTimeUtcMillis(endTimeMs)
+ .build();
+ mDvrManager.addSchedule(customizedProgram , startEarlyTimeMs, endLateTimeMs);
+ List<ScheduledRecording> conflicts =
+ mDvrManager.getConflictingSchedules(customizedProgram);
+ if (conflicts.isEmpty()) {
+ DvrUiHelper.showAddScheduleToast(
+ getContext(),
+ customizedProgram.getTitle(),
+ customizedProgram.getStartTimeUtcMillis(),
+ customizedProgram.getEndTimeUtcMillis());
+ dismissDialog();
+ finishGuidedStepFragments();
+ } else {
+ DvrUiHelper.showScheduleConflictDialog(getActivity(), customizedProgram);
+ }
+ } else if (actionId == GuidedAction.ACTION_ID_CANCEL) {
+ finishGuidedStepFragments();
+ }
+ }
+
+ @Override
+ public boolean onSubGuidedActionClicked(GuidedAction action) {
+ long actionId = action.getId();
+ switch ((int) actionId) {
+ case SUB_ACTION_ID_START_ON_TIME :
+ mStartEarlyTime = 0;
+ updateGuidedActions(true, mTimeActionOnTimeText);
+ break;
+ case SUB_ACTION_ID_START_ONE_MIN :
+ mStartEarlyTime = 1;
+ updateGuidedActions(true, mTimeActionOneMinText);
+ break;
+ case SUB_ACTION_ID_START_FIVE_MIN :
+ mStartEarlyTime = 5;
+ updateGuidedActions(true, mTimeActionFiveMinText);
+ break;
+ case SUB_ACTION_ID_START_FIFTEEN_MIN :
+ mStartEarlyTime = 15;
+ updateGuidedActions(true, mTimeActionFifteenMinText);
+ break;
+ case SUB_ACTION_ID_START_HALF_HOUR :
+ mStartEarlyTime = 30;
+ updateGuidedActions(true, mTimeActionHalfHourText);
+ break;
+ case SUB_ACTION_ID_END_ON_TIME :
+ mEndLateTime = 0;
+ updateGuidedActions(false, mTimeActionOnTimeText);
+ break;
+ case SUB_ACTION_ID_END_ONE_MIN :
+ mEndLateTime = 1;
+ updateGuidedActions(false, mTimeActionOneMinText);
+ break;
+ case SUB_ACTION_ID_END_FIFTEEN_MIN :
+ mEndLateTime = 15;
+ updateGuidedActions(false, mTimeActionFifteenMinText);
+ break;
+ case SUB_ACTION_ID_END_HALF_HOUR :
+ mEndLateTime = 30;
+ updateGuidedActions(false, mTimeActionHalfHourText);
+ break;
+ case SUB_ACTION_ID_END_ONE_HOUR :
+ mEndLateTime = 60;
+ updateGuidedActions(false, mTimeActionOneHourText);
+ break;
+ case SUB_ACTION_ID_END_TWO_HOURS :
+ mEndLateTime = 120;
+ updateGuidedActions(false, mTimeActionTwoHoursText);
+ break;
+ case SUB_ACTION_ID_END_THREE_HOURS :
+ mEndLateTime = 180;
+ updateGuidedActions(false, mTimeActionThreeHoursText);
+ break;
+ default :
+ mStartEarlyTime = 0;
+ mEndLateTime = 0;
+ updateGuidedActions(true, mTimeActionOnTimeText);
+ updateGuidedActions(false, mTimeActionOnTimeText);
+ break;
+ }
+ return true;
+ }
+
+ private void updateGuidedActions(boolean start, CharSequence description) {
+ if (start) {
+ mStartEarlyGuidedAction.setDescription(description);
+ notifyActionChanged(findActionPositionById(ACTION_ID_START_EARLY));
+ } else {
+ mEndLateGuidedAction.setDescription(description);
+ notifyActionChanged(findActionPositionById(ACTION_ID_END_LATE));
+ }
+ }
+
+ @Override
+ public GuidedActionsStylist onCreateButtonActionsStylist() {
+ return new DvrGuidedActionsStylist(true);
+ }
+
+ private List<GuidedAction> buildChannelSubActionStart() {
+ List<GuidedAction> timeSubActions = new ArrayList<>();
+ timeSubActions.add(
+ new GuidedAction.Builder(getActivity())
+ .id(SUB_ACTION_ID_START_ON_TIME)
+ .title(mTimeActionOnTimeText)
+ .build());
+ timeSubActions.add(
+ new GuidedAction.Builder(getActivity())
+ .id(SUB_ACTION_ID_START_ONE_MIN)
+ .title(mTimeActionOneMinText)
+ .build());
+ timeSubActions.add(
+ new GuidedAction.Builder(getActivity())
+ .id(SUB_ACTION_ID_START_FIVE_MIN)
+ .title(mTimeActionFiveMinText)
+ .build());
+ timeSubActions.add(
+ new GuidedAction.Builder(getActivity())
+ .id(SUB_ACTION_ID_START_FIFTEEN_MIN)
+ .title(mTimeActionFifteenMinText)
+ .build());
+ timeSubActions.add(
+ new GuidedAction.Builder(getActivity())
+ .id(SUB_ACTION_ID_START_HALF_HOUR)
+ .title(mTimeActionHalfHourText)
+ .build());
+ return timeSubActions;
+ }
+
+ private List<GuidedAction> buildChannelSubActionEnd() {
+ List<GuidedAction> timeSubActions = new ArrayList<>();
+ timeSubActions.add(
+ new GuidedAction.Builder(getActivity())
+ .id(SUB_ACTION_ID_END_ON_TIME)
+ .title(mTimeActionOnTimeText)
+ .build());
+ timeSubActions.add(
+ new GuidedAction.Builder(getActivity())
+ .id(SUB_ACTION_ID_END_ONE_MIN)
+ .title(mTimeActionOneMinText)
+ .build());
+ timeSubActions.add(
+ new GuidedAction.Builder(getActivity())
+ .id(SUB_ACTION_ID_END_FIFTEEN_MIN)
+ .title(mTimeActionFifteenMinText)
+ .build());
+ timeSubActions.add(
+ new GuidedAction.Builder(getActivity())
+ .id(SUB_ACTION_ID_END_HALF_HOUR)
+ .title(mTimeActionHalfHourText)
+ .build());
+ timeSubActions.add(
+ new GuidedAction.Builder(getActivity())
+ .id(SUB_ACTION_ID_END_ONE_HOUR)
+ .title(mTimeActionOneHourText)
+ .build());
+ timeSubActions.add(
+ new GuidedAction.Builder(getActivity())
+ .id(SUB_ACTION_ID_END_TWO_HOURS)
+ .title(mTimeActionTwoHoursText)
+ .build());
+ timeSubActions.add(
+ new GuidedAction.Builder(getActivity())
+ .id(SUB_ACTION_ID_END_THREE_HOURS)
+ .title(mTimeActionThreeHoursText)
+ .build());
+ return timeSubActions;
+ }
+
+ protected void dismissDialog() {
+ if (getActivity() instanceof MainActivity) {
+ SafeDismissDialogFragment currentDialog =
+ ((MainActivity) getActivity()).getOverlayManager().getCurrentDialog();
+ if (currentDialog instanceof DvrHalfSizedDialogFragment) {
+ currentDialog.dismiss();
+ }
+ } else if (getParentFragment() instanceof DialogFragment) {
+ ((DialogFragment) getParentFragment()).dismiss();
+ }
+ }
+}
diff --git a/src/com/android/tv/dvr/ui/DvrScheduleFragment.java b/src/com/android/tv/dvr/ui/DvrScheduleFragment.java
index 7131f626..249e63db 100644
--- a/src/com/android/tv/dvr/ui/DvrScheduleFragment.java
+++ b/src/com/android/tv/dvr/ui/DvrScheduleFragment.java
@@ -31,6 +31,7 @@ import androidx.leanback.widget.GuidedAction;
import com.android.tv.R;
import com.android.tv.TvSingletons;
import com.android.tv.common.SoftPreconditions;
+import com.android.tv.common.flags.DvrFlags;
import com.android.tv.data.ProgramImpl;
import com.android.tv.dvr.DvrManager;
import com.android.tv.dvr.data.ScheduledRecording;
@@ -40,6 +41,9 @@ import com.android.tv.dvr.ui.DvrConflictFragment.DvrProgramConflictFragment;
import java.util.Collections;
import java.util.List;
+import javax.inject.Inject;
+import dagger.android.AndroidInjection;
+
/**
* A fragment which asks the user the type of the recording.
*
@@ -57,6 +61,7 @@ public class DvrScheduleFragment extends DvrGuidedStepFragment {
private ProgramImpl mProgram;
private boolean mAddCurrentProgramToSeries;
+ @Inject DvrFlags mDvrFlags;
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -81,6 +86,12 @@ public class DvrScheduleFragment extends DvrGuidedStepFragment {
}
@Override
+ public void onAttach(Context context) {
+ AndroidInjection.inject(this);
+ super.onAttach(context);
+ }
+
+ @Override
public int onProvideTheme() {
return R.style.Theme_TV_Dvr_GuidedStep_Twoline_Action;
}
@@ -125,21 +136,28 @@ public class DvrScheduleFragment extends DvrGuidedStepFragment {
@Override
public void onTrackedGuidedActionClicked(GuidedAction action) {
if (action.getId() == ACTION_RECORD_EPISODE) {
- getDvrManager().addSchedule(mProgram);
- List<ScheduledRecording> conflicts = getDvrManager().getConflictingSchedules(mProgram);
- if (conflicts.isEmpty()) {
- DvrUiHelper.showAddScheduleToast(
- getContext(),
- mProgram.getTitle(),
- mProgram.getStartTimeUtcMillis(),
- mProgram.getEndTimeUtcMillis());
- dismissDialog();
+ if (mDvrFlags.startEarlyEndLateEnabled()) {
+ DvrUiHelper.startRecordingSettingsActivity(getContext(), mProgram);
} else {
- GuidedStepFragment fragment = new DvrProgramConflictFragment();
- Bundle args = new Bundle();
- args.putParcelable(DvrHalfSizedDialogFragment.KEY_PROGRAM, mProgram);
- fragment.setArguments(args);
- GuidedStepFragment.add(getFragmentManager(), fragment, R.id.halfsized_dialog_host);
+ getDvrManager().addSchedule(mProgram);
+ List<ScheduledRecording> conflicts = getDvrManager().getConflictingSchedules
+ (mProgram);
+
+ if (conflicts.isEmpty()) {
+ DvrUiHelper.showAddScheduleToast(
+ getContext(),
+ mProgram.getTitle(),
+ mProgram.getStartTimeUtcMillis(),
+ mProgram.getEndTimeUtcMillis());
+ dismissDialog();
+ } else {
+ GuidedStepFragment fragment = new DvrProgramConflictFragment();
+ Bundle args = new Bundle();
+ args.putParcelable(DvrHalfSizedDialogFragment.KEY_PROGRAM, mProgram);
+ fragment.setArguments(args);
+ GuidedStepFragment.add(getFragmentManager(), fragment, R.id
+ .halfsized_dialog_host);
+ }
}
} else if (action.getId() == ACTION_RECORD_SERIES) {
SeriesRecording seriesRecording =
diff --git a/src/com/android/tv/dvr/ui/DvrUiHelper.java b/src/com/android/tv/dvr/ui/DvrUiHelper.java
index 657abfa2..1ab1d173 100644
--- a/src/com/android/tv/dvr/ui/DvrUiHelper.java
+++ b/src/com/android/tv/dvr/ui/DvrUiHelper.java
@@ -525,6 +525,22 @@ public class DvrUiHelper {
}
}
+ /**
+ * Shows the episode recording settings activity.
+ *
+ * @param program Program to be recorded
+ */
+ public static void startRecordingSettingsActivity(
+ Context context,
+ Program program) {
+ if (program != null) {
+ Intent intent = new Intent(context, DvrRecordingSettingsActivity.class);
+ intent.putExtra(DvrRecordingSettingsActivity.IS_WINDOW_TRANSLUCENT, true);
+ intent.putExtra(DvrRecordingSettingsActivity.PROGRAM, program.toParcelable());
+ context.startActivity(intent);
+ }
+ }
+
private static void startSeriesSettingsActivityInternal(
Context context,
long seriesRecordingId,