44import android .text .TextUtils ;
55import androidx .annotation .Nullable ;
66import androidx .media3 .common .C ;
7+ import androidx .media3 .common .ParserException ;
78import androidx .media3 .common .Player ;
89import androidx .media3 .common .Timeline ;
910import androidx .media3 .common .util .Util ;
@@ -15,6 +16,7 @@ public class LimitedSeekRange {
1516
1617 private final long startTimeMs ; // UTC timestamp, millisecond
1718 private final long endTimeMs ; // UTC timestamp, millisecond
19+ @ Deprecated
1820 private final boolean seekToStart ;
1921 private final boolean useAsLive ;
2022
@@ -35,10 +37,23 @@ public long getStartTimeMs() {
3537 return factStartTimeMs ;
3638 }
3739
40+ public long getOriginalStartTimeMs () {
41+ return startTimeMs ;
42+ }
43+
44+ public long getOriginalEndTimeMs () {
45+ return endTimeMs ;
46+ }
47+
48+ @ Deprecated
3849 public boolean isSeekToStart () {
3950 return seekToStart ;
4051 }
4152
53+ public boolean isUseAsLive () {
54+ return useAsLive ;
55+ }
56+
4257 public void onTimelineChanged (Timeline timeline ) {
4358 if (timeline == null || timeline .isEmpty ()) {
4459 return ;
@@ -124,37 +139,36 @@ public static long scaleDurationToSeekbarMs(long durationMs, LimitedSeekRange li
124139 return state ;
125140 }
126141
127- // Generate limited seek range.
128- public static LimitedSeekRange from (String startDate , String endDate , boolean seekToStart ) {
142+ @ Nullable
143+ public static LimitedSeekRange create (String startDate , String endDate ) {
129144 try {
130- long startTimeMs = TextUtils .isEmpty (startDate ) ? C .TIME_UNSET : Util .parseXsDateTime (startDate );
131- long endTimeMs = TextUtils .isEmpty (endDate ) ? C .TIME_UNSET : Util .parseXsDateTime (endDate );
132- return from (startTimeMs , endTimeMs , seekToStart );
145+ return create (toTimeMs (startDate ), toTimeMs (endDate ));
133146 } catch (Exception e ) {
134147 return null ;
135148 }
136149 }
137150
138- // Generate limited seek range.
139- public static LimitedSeekRange from (String startDate , String endDate , boolean seekToStart , boolean useAsLive ) {
151+ @ Nullable
152+ public static LimitedSeekRange create (String startDate , String endDate , boolean useAsLive ) {
140153 try {
141- long startTimeMs = TextUtils .isEmpty (startDate ) ? C .TIME_UNSET : Util .parseXsDateTime (startDate );
142- long endTimeMs = TextUtils .isEmpty (endDate ) ? C .TIME_UNSET : Util .parseXsDateTime (endDate );
143- return from (startTimeMs , endTimeMs , seekToStart , useAsLive );
154+ return create (toTimeMs (startDate ), toTimeMs (endDate ), useAsLive );
144155 } catch (Exception e ) {
145156 return null ;
146157 }
147158 }
148159
149- // Generate limited seek range.
150- public static LimitedSeekRange from (long startTimeMs , long endTimeMs , boolean seekToStart ) {
151- long nowMs = System .currentTimeMillis ();
152- boolean useAsLive = !isValidTimeStamp (endTimeMs ) || endTimeMs > nowMs ;
153- return from (startTimeMs , endTimeMs , seekToStart , useAsLive );
160+ @ Nullable
161+ public static LimitedSeekRange create (long startTimeMs , long endTimeMs ) {
162+ return create (startTimeMs , endTimeMs , isUseAsLive (endTimeMs ));
154163 }
155164
156- // Generate limited seek range.
157- public static LimitedSeekRange from (long startTimeMs , long endTimeMs , boolean seekToStart , boolean useAsLive ) {
165+ @ Nullable
166+ public static LimitedSeekRange create (long startTimeMs , long endTimeMs , boolean useAsLive ) {
167+ return create (startTimeMs , endTimeMs , false , useAsLive );
168+ }
169+
170+ @ Nullable
171+ private static LimitedSeekRange create (long startTimeMs , long endTimeMs , boolean seekToStart , boolean useAsLive ) {
158172 // Normalize the timestamp.
159173 boolean noStartTime = false ;
160174 boolean noEndTime = false ;
@@ -181,6 +195,60 @@ public static LimitedSeekRange from(long startTimeMs, long endTimeMs, boolean se
181195 return new LimitedSeekRange (startTimeMs , endTimeMs , seekToStart , useAsLive );
182196 }
183197
198+ private static long toTimeMs (String date ) throws ParserException {
199+ return TextUtils .isEmpty (date ) ? C .TIME_UNSET : Util .parseXsDateTime (date );
200+ }
201+
202+ private static boolean isUseAsLive (long endTimeMs ) {
203+ long nowMs = System .currentTimeMillis ();
204+ return !isValidTimeStamp (endTimeMs ) || endTimeMs > nowMs ;
205+ }
206+
207+ /**
208+ * @deprecated Use {@link #create(String, String)} instead.
209+ */
210+ @ Deprecated
211+ // Generate limited seek range.
212+ public static LimitedSeekRange from (String startDate , String endDate , boolean seekToStart ) {
213+ try {
214+ return from (toTimeMs (startDate ), toTimeMs (endDate ), seekToStart );
215+ } catch (Exception e ) {
216+ return null ;
217+ }
218+ }
219+
220+ /**
221+ * @deprecated Use {@link #create(String, String, boolean)} instead.
222+ */
223+ @ Deprecated
224+ // Generate limited seek range.
225+ public static LimitedSeekRange from (String startDate , String endDate , boolean seekToStart , boolean useAsLive ) {
226+ try {
227+ return from (toTimeMs (startDate ), toTimeMs (endDate ), seekToStart , useAsLive );
228+ } catch (Exception e ) {
229+ return null ;
230+ }
231+ }
232+
233+ /**
234+ * @deprecated Use {@link #create(long, long)} instead.
235+ */
236+ @ Deprecated
237+ // Generate limited seek range.
238+ public static LimitedSeekRange from (long startTimeMs , long endTimeMs , boolean seekToStart ) {
239+ return from (startTimeMs , endTimeMs , seekToStart , isUseAsLive (endTimeMs ));
240+ }
241+
242+
243+ /**
244+ * @deprecated Use {@link #create(long, long, boolean)} instead.
245+ */
246+ @ Deprecated
247+ // Generate limited seek range.
248+ public static LimitedSeekRange from (long startTimeMs , long endTimeMs , boolean seekToStart , boolean useAsLive ) {
249+ return create (startTimeMs , endTimeMs , seekToStart , useAsLive );
250+ }
251+
184252 // Generate limited seek range based on current time, just for testing
185253 public static LimitedSeekRange mock (int backHours , long durationMs , boolean seekToStart ) {
186254 GregorianCalendar calendar = new GregorianCalendar ();
0 commit comments