From 7879ab738b73d762ee0a90c6d4ca1e186b52933f Mon Sep 17 00:00:00 2001 From: Akinwale Ariwodola Date: Fri, 22 May 2020 07:31:47 +0100 Subject: [PATCH] quick skip and playback speed media controls --- .../ui/findcontent/FileViewFragment.java | 71 ++++++++++++- .../browser/ui/library/LibraryFragment.java | 47 +++++++-- .../java/io/lbry/browser/utils/Helper.java | 11 ++ .../res/drawable-anydpi/ic_forward_10.xml | 11 ++ .../main/res/drawable-anydpi/ic_replay_10.xml | 11 ++ .../main/res/drawable-hdpi/ic_forward_10.png | Bin 0 -> 466 bytes .../main/res/drawable-hdpi/ic_replay_10.png | Bin 0 -> 472 bytes .../main/res/drawable-mdpi/ic_forward_10.png | Bin 0 -> 297 bytes .../main/res/drawable-mdpi/ic_replay_10.png | Bin 0 -> 303 bytes .../main/res/drawable-xhdpi/ic_forward_10.png | Bin 0 -> 588 bytes .../main/res/drawable-xhdpi/ic_replay_10.png | Bin 0 -> 595 bytes .../res/drawable-xxhdpi/ic_forward_10.png | Bin 0 -> 887 bytes .../main/res/drawable-xxhdpi/ic_replay_10.png | Bin 0 -> 873 bytes .../res/layout/exo_playback_control_view.xml | 94 ++++++++++++++---- 14 files changed, 211 insertions(+), 34 deletions(-) create mode 100644 app/src/main/res/drawable-anydpi/ic_forward_10.xml create mode 100644 app/src/main/res/drawable-anydpi/ic_replay_10.xml create mode 100644 app/src/main/res/drawable-hdpi/ic_forward_10.png create mode 100644 app/src/main/res/drawable-hdpi/ic_replay_10.png create mode 100644 app/src/main/res/drawable-mdpi/ic_forward_10.png create mode 100644 app/src/main/res/drawable-mdpi/ic_replay_10.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_forward_10.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_replay_10.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_forward_10.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_replay_10.png diff --git a/app/src/main/java/io/lbry/browser/ui/findcontent/FileViewFragment.java b/app/src/main/java/io/lbry/browser/ui/findcontent/FileViewFragment.java index f9b6c945..61bbb09c 100644 --- a/app/src/main/java/io/lbry/browser/ui/findcontent/FileViewFragment.java +++ b/app/src/main/java/io/lbry/browser/ui/findcontent/FileViewFragment.java @@ -13,7 +13,9 @@ import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.text.format.DateUtils; +import android.view.ContextMenu; import android.view.LayoutInflater; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; @@ -37,6 +39,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; import com.github.chrisbanes.photoview.PhotoView; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.database.ExoDatabaseProvider; @@ -125,6 +128,8 @@ import io.lbry.lbrysdk.Utils; public class FileViewFragment extends BaseFragment implements MainActivity.BackPressInterceptor, DownloadActionListener, FetchClaimsListener, SdkStatusListener, StoragePermissionListener { private static final int RELATED_CONTENT_SIZE = 16; + private static final String DEFAULT_PLAYBACK_SPEED = "1x"; + private PlayerControlView castControlView; private Player currentPlayer; private boolean loadingNewClaim; @@ -791,7 +796,28 @@ public class FileViewFragment extends BaseFragment implements } }); - root.findViewById(R.id.player_toggle_fullscreen).setOnClickListener(new View.OnClickListener() { + PlayerView playerView = root.findViewById(R.id.file_view_exoplayer_view); + View playbackSpeedContainer = playerView.findViewById(R.id.player_playback_speed); + TextView textPlaybackSpeed = playerView.findViewById(R.id.player_playback_speed_label); + textPlaybackSpeed.setText(DEFAULT_PLAYBACK_SPEED); + + playbackSpeedContainer.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() { + @Override + public void onCreateContextMenu(ContextMenu contextMenu, View view, ContextMenu.ContextMenuInfo contextMenuInfo) { + Helper.buildPlaybackSpeedMenu(contextMenu); + } + }); + playbackSpeedContainer.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Context context = getContext(); + if (context instanceof MainActivity) { + ((MainActivity) context).openContextMenu(playbackSpeedContainer); + } + } + }); + + playerView.findViewById(R.id.player_toggle_fullscreen).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // check full screen mode @@ -802,6 +828,22 @@ public class FileViewFragment extends BaseFragment implements } } }); + playerView.findViewById(R.id.player_skip_back_10).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (MainActivity.appPlayer != null) { + MainActivity.appPlayer.seekTo(Math.max(0, MainActivity.appPlayer.getCurrentPosition() - 10000)); + } + } + }); + playerView.findViewById(R.id.player_skip_forward_10).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (MainActivity.appPlayer != null) { + MainActivity.appPlayer.seekTo(MainActivity.appPlayer.getCurrentPosition() + 10000); + } + } + }); root.findViewById(R.id.file_view_publisher_name).setOnClickListener(new View.OnClickListener() { @Override @@ -1667,8 +1709,10 @@ public class FileViewFragment extends BaseFragment implements ((ViewGroup) exoplayerContainer.getParent()).removeView(exoplayerContainer); globalLayout.addView(exoplayerContainer); + View playerView = root.findViewById(R.id.file_view_exoplayer_view); + ((ImageView) playerView.findViewById(R.id.player_image_full_screen_toggle)).setImageResource(R.drawable.ic_fullscreen_exit); + root.findViewById(R.id.player_image_full_screen_toggle).setVisibility(View.GONE); - root.findViewById(R.id.player_image_full_screen_exit_toggle).setVisibility(View.VISIBLE); MainActivity activity = (MainActivity) context; activity.enterFullScreenMode(); @@ -1691,8 +1735,8 @@ public class FileViewFragment extends BaseFragment implements ((ViewGroup) exoplayerContainer.getParent()).removeView(exoplayerContainer); mediaContainer.addView(exoplayerContainer); - root.findViewById(R.id.player_image_full_screen_toggle).setVisibility(View.VISIBLE); - root.findViewById(R.id.player_image_full_screen_exit_toggle).setVisibility(View.GONE); + View playerView = root.findViewById(R.id.file_view_exoplayer_view); + ((ImageView) playerView.findViewById(R.id.player_image_full_screen_toggle)).setImageResource(R.drawable.ic_fullscreen); exoplayerContainer.setPadding(0, 0, 0, 0); activity.exitFullScreenMode(); @@ -1750,6 +1794,8 @@ public class FileViewFragment extends BaseFragment implements if (MainActivity.appPlayer != null) { MainActivity.appPlayer.removeListener(fileViewPlayerListener); + PlaybackParameters params = new PlaybackParameters(1.0f); + MainActivity.appPlayer.setPlaybackParameters(params); } } @@ -2021,6 +2067,23 @@ public class FileViewFragment extends BaseFragment implements } } + @Override + public boolean onContextItemSelected(MenuItem item) { + View root = getView(); + if (root != null) { + float speed = item.getItemId() / 100.0f; + String speedString = String.format("%sx", new DecimalFormat("0.##").format(speed)); + PlayerView playerView = root.findViewById(R.id.file_view_exoplayer_view); + ((TextView) playerView.findViewById(R.id.player_playback_speed_label)).setText(speedString); + + if (MainActivity.appPlayer != null) { + PlaybackParameters params = new PlaybackParameters(speed); + MainActivity.appPlayer.setPlaybackParameters(params); + } + } + return true; + } + @Override public boolean shouldHideGlobalPlayer() { return true; diff --git a/app/src/main/java/io/lbry/browser/ui/library/LibraryFragment.java b/app/src/main/java/io/lbry/browser/ui/library/LibraryFragment.java index 22a11a9e..49377b2a 100644 --- a/app/src/main/java/io/lbry/browser/ui/library/LibraryFragment.java +++ b/app/src/main/java/io/lbry/browser/ui/library/LibraryFragment.java @@ -26,12 +26,10 @@ import com.google.android.material.snackbar.Snackbar; import org.json.JSONException; import org.json.JSONObject; -import java.nio.channels.AsynchronousChannel; import java.util.ArrayList; +import java.util.Arrays; import java.util.Date; -import java.util.HashMap; import java.util.List; -import java.util.Map; import io.lbry.browser.MainActivity; import io.lbry.browser.R; @@ -42,20 +40,16 @@ import io.lbry.browser.listener.SdkStatusListener; import io.lbry.browser.listener.SelectionModeListener; import io.lbry.browser.model.Claim; import io.lbry.browser.model.LbryFile; -import io.lbry.browser.model.NavMenuItem; import io.lbry.browser.model.ViewHistory; -import io.lbry.browser.tasks.claim.AbandonChannelTask; -import io.lbry.browser.tasks.claim.AbandonHandler; import io.lbry.browser.tasks.claim.ClaimListResultHandler; +import io.lbry.browser.tasks.claim.ClaimListTask; import io.lbry.browser.tasks.claim.ClaimSearchResultHandler; import io.lbry.browser.tasks.claim.PurchaseListTask; import io.lbry.browser.tasks.claim.ResolveTask; import io.lbry.browser.tasks.file.BulkDeleteFilesTask; -import io.lbry.browser.tasks.file.DeleteFileTask; import io.lbry.browser.tasks.file.FileListTask; import io.lbry.browser.tasks.localdata.FetchViewHistoryTask; import io.lbry.browser.ui.BaseFragment; -import io.lbry.browser.ui.channel.ChannelFormFragment; import io.lbry.browser.utils.Helper; import io.lbry.browser.utils.Lbry; import io.lbry.browser.utils.LbryAnalytics; @@ -85,6 +79,7 @@ public class LibraryFragment extends BaseFragment implements private Date lastDate; private boolean listReachedEnd; private boolean contentListLoading; + private boolean initialOwnClaimsFetched; private CardView cardStats; private TextView linkStats; @@ -252,6 +247,8 @@ public class LibraryFragment extends BaseFragment implements showDownloads(); } else if (currentFilter == FILTER_HISTORY) { showHistory(); + } else if (currentFilter == FILTER_PURCHASES) { + showPurchases(); } } @@ -271,10 +268,42 @@ public class LibraryFragment extends BaseFragment implements layoutSdkInitializing.setVisibility(Lbry.SDK_READY ? View.GONE : View.VISIBLE); currentPage = 1; if (Lbry.SDK_READY) { - fetchDownloads(); + if (!initialOwnClaimsFetched) { + fetchOwnClaimsAndShowDownloads(); + } else { + fetchDownloads(); + } } } + private void fetchOwnClaimsAndShowDownloads() { + if (Lbry.ownClaims != null && Lbry.ownClaims.size() > 0) { + initialOwnClaimsFetched = true; + fetchDownloads(); + return; + } + + linkStats.setVisibility(View.INVISIBLE); + ClaimListTask task = new ClaimListTask(Arrays.asList(Claim.TYPE_STREAM, Claim.TYPE_REPOST), listLoading, new ClaimListResultHandler() { + @Override + public void onSuccess(List claims) { + Lbry.ownClaims = Helper.filterDeletedClaims(new ArrayList<>(claims)); + initialOwnClaimsFetched = true; + if (currentFilter == FILTER_DOWNLOADS) { + fetchDownloads(); + } + checkStatsLink(); + } + + @Override + public void onError(Exception error) { + initialOwnClaimsFetched = true; + checkStatsLink(); + } + }); + task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } + private void showPurchases() { currentFilter = FILTER_PURCHASES; linkFilterDownloads.setTypeface(null, Typeface.NORMAL); diff --git a/app/src/main/java/io/lbry/browser/utils/Helper.java b/app/src/main/java/io/lbry/browser/utils/Helper.java index 69821752..108d287c 100644 --- a/app/src/main/java/io/lbry/browser/utils/Helper.java +++ b/app/src/main/java/io/lbry/browser/utils/Helper.java @@ -18,6 +18,7 @@ import android.os.Environment; import android.provider.DocumentsContract; import android.provider.MediaStore; import android.text.method.LinkMovementMethod; +import android.view.ContextMenu; import android.view.View; import android.widget.LinearLayout; import android.widget.ProgressBar; @@ -77,6 +78,8 @@ public final class Helper { public static final SimpleDateFormat FILESTAMP_FORMAT = new SimpleDateFormat("yyyyMMdd_HHmmss"); public static final String EXPLORER_TX_PREFIX = "https://explorer.lbry.com/tx"; + public static final List PLAYBACK_SPEEDS = Arrays.asList(0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0); + public static boolean isNull(String value) { return value == null; } @@ -84,6 +87,14 @@ public final class Helper { return value == null || value.trim().length() == 0; } + public static void buildPlaybackSpeedMenu(ContextMenu menu) { + int order = 0; + DecimalFormat formatter = new DecimalFormat("0.##"); + for (Double speed : PLAYBACK_SPEEDS) { + menu.add(0, Double.valueOf(speed * 100).intValue(), ++order, String.format("%sx", formatter.format(speed))); + } + } + public static String capitalize(String value) { StringBuilder sb = new StringBuilder(); boolean capitalizeNext = true; diff --git a/app/src/main/res/drawable-anydpi/ic_forward_10.xml b/app/src/main/res/drawable-anydpi/ic_forward_10.xml new file mode 100644 index 00000000..55e7a754 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/ic_forward_10.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/drawable-anydpi/ic_replay_10.xml b/app/src/main/res/drawable-anydpi/ic_replay_10.xml new file mode 100644 index 00000000..a238e2d5 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/ic_replay_10.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/drawable-hdpi/ic_forward_10.png b/app/src/main/res/drawable-hdpi/ic_forward_10.png new file mode 100644 index 0000000000000000000000000000000000000000..d87635373485d7b4c9c0ac62c3b2d342037e6634 GIT binary patch literal 466 zcmV;@0WJQCP)fs9W0RsxvuOCP-VL*+HIfu|5 zdp?3X(7p|zhyj(w*a`GbW2f})4Emzt`2iho8i-fq9WhoTaiC}Dp87-iH`6A$BwcLu z7ZN)w0h*brO?^|jZ^hg)ukg0k5C@vB0ctS6iIrU@fF7VH>fb=;VlF@L23G2j06L&` z^a4Hd`KC`EiC@!trC#IJXFkR=Z~ZJ=;nAkp#HZ!tw9km`QcMy*a&{jQG4+%So$)BT zyfKEIKCVw7)v$G^e8ZUDl(%d6x^eZQGREFF_|>N2VQ4AOHXW07*qo IM6N<$f|_W}>Hq)$ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_replay_10.png b/app/src/main/res/drawable-hdpi/ic_replay_10.png new file mode 100644 index 0000000000000000000000000000000000000000..7a487849839bc03c606d02562aecb9a5e3882a5e GIT binary patch literal 472 zcmV;}0Vn>6P)NklY5QdXzAt{7N6l|kNqOBHQC0GP(1Pc*^f`uYMM6?lX4|E1K~T^b>>u*P$$br_rU=vIej&vg)YGrf1iRoXU?pS;8}!p#I2-^(L%Qpsnvc7 zeg8wDTA(q6(DeYJ(e{v>1f8db5IO|+{Cxq=y`D0O6>0&AA>{!=3nB!bz#~}l8i!;f zGpfdmv_?3Uej>Hx9kr0;qaec?esh^*XtkJR?&crn`p@=K!?2cd3$FSvbH-Z_Nwt^o zfj(nZn%pr6`9Wh-pM9=FPpY$OKCrbLS9E1!!!&4 O0000}dY literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_forward_10.png b/app/src/main/res/drawable-mdpi/ic_forward_10.png new file mode 100644 index 0000000000000000000000000000000000000000..751934c378af0626abf5aeadbe1c5480877f71ca GIT binary patch literal 297 zcmV+^0oMMBP)7w9jhb~$CHA>geu8x9(Zq6N?x^@uS9~xia1wsiT%>^6`JQ^-{_ocZ@ zvh3G}F{Vxpn36&WNC)u%G7uywAq{oVFas=yATWnoXbdEc12FlW30?##sF2!y!vsB4 zi58h>K62-kc$>1IHc6Z0qOn^nK+WuXe%H_e+AamSRxCW*&DMkS3v_}W&`JbAy93z5 z@1U#u3$MF|m?Lt4rw7>3rWn&LF0uzWLT7)S_r%8N=r#@bSM;?pW%NZ0B=70lNIew= v=PlPJ`sOJfyOBP*|M)cC(n}MWZ=m{*00000NkvXXu0mjf1MPgz literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_replay_10.png b/app/src/main/res/drawable-mdpi/ic_replay_10.png new file mode 100644 index 0000000000000000000000000000000000000000..d1a44f6923c425a24b71152c5cf5d9cf72fc3b28 GIT binary patch literal 303 zcmV+~0nq-5P)=w+V6;DCIxr0iX z(xhU#5|u_{y5to3H{wfvXJ7*s-dsilJ68NEx#s^7?7&kloUynm;XYzzQ!TA{WAFfT zZ~^Nv29}Gn4uiXAuo|2qcBm{i9R^!)0%tH8e92O3EIBE?w8#44Whza>9TlHUMmL(Y zJ=?$L?hNxB2YV`LVt91b$1dT;Tb6LR=lVZnya5Qe7MB?R^Z@_>002ovPDHLkV1k96 Bf|>vT literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_forward_10.png b/app/src/main/res/drawable-xhdpi/ic_forward_10.png new file mode 100644 index 0000000000000000000000000000000000000000..c5acd34ff63ecce785f95e3a30d5b84252e74186 GIT binary patch literal 588 zcmV-S0<-;zP)KerQo1QTe>@09HN7Ctk9u4Xag$vht}`l72@M1 zjdJAfBo98wUGjc>$IH8S=Xr(vb6Krceb)(mIZc8HxJx2Nz)cd2fO{ka0&bB=Am9#( z6asdUKrkhs1q^@?cmkpg1k95_05uAFnITwvNWf_s=w)1Gy9m&#KWGTtNbq~WJRz6` zFao;3E>N*?<)z?XfB^8VEu)n4Qrb*_s`VQg{jfZck+ka8wGxy%k+AZ<6U`je`FJ4D zX=!6sJ54+68zT@nbD)9qwooelU+5ce6?pm#UF+vVMxe9d`$OQA%{72?U<@4RO<=|d z)DynDru0(ZOxe!;3A_R~z`G)nCjnkQD+%AJ_W4pEFs8X98eae(z?M}6Sk;LWc%-=| zjZbLY5OjI(6y=seDFmho1e$_wo%x!X_=&R;*cWs=%vYFu85IcJ(%b=!0~+rLx@;ox!$GwtkdP<urDc9=}J%{wJrEP~Tq>w@i aF)rU^B0E~y9f3gr0000o$+GU^ya3LUzM(4h!5@7<(>cquv=NSHw-bn%DUH}DC=FthHK z&hCqS@Ev9tXW!?1^X9#m$)xs=Z9bnjMLQ47L_05%fbP6F0;cn#2-ut#L%`*{2m(RQ zC!WAE=ZPus0`!3vPyupMoOj`iWVWRe&`+lUY)B@dFo^9mLXgMPzNRs63IG=fb|8S=a5r!?!=PyS<1>J(GZi&kwniDostn^L#|hHdNWA0L=`l= z*gApF*k9}@B_*X~hS&pX^+Y>%8R4U4;KG>O0WN_qrIK^}wrUXQ`*i$PlfaWUzsdOz z;2!t}9+hM)dz1_UL!Sgx%6x4hu(+JZ9A9y~Z`mVnhSOCzHZ^mbCF@NB3tjJVT;ur6 z7lEO%X(=Lsu7g0$i-cH7>6=y~61Z~^IQMdiSvl#Owj&Z~>YCT?#EF+MsvZ+#)3Ggr z1P~~5?grQb9)NchoxD6`DrWOp*Eg<*CBV5;;FTft894NsN?2s160gDvL-2Z&IhER4 z!f7u^N)dCQ^{3P99+-tk=Px9@7Bs5NW4Sl8oJ8T5vhiC|Qc5GsM<=|5*^vKwd_}!# zeK<%gLTraElp<4u(Me8gQ9F$m8@6(qyN(yTLdW{752lH2 hucww;YN@TnegMA4K~&fvP=Ejc002ovPDHLkV1f#93NQcw literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_forward_10.png b/app/src/main/res/drawable-xxhdpi/ic_forward_10.png new file mode 100644 index 0000000000000000000000000000000000000000..ac59544cfea4686b5b6da93938d7e59840d427ff GIT binary patch literal 887 zcmV--1Bm>IP)p?^))RVTfg%vL?1Wzp`y%ZtTRcvVg z(DaSG!Vq@eOg6JWX7)Y!g3QF1x1Y?;%zHZ<1Z-??SAov#O2y~kP7aoU~*Kkef*;X635U z6E5i6iws>=vWP4d%$$a^LhP737W}(i0K-b4Dz~Z!RW~e?CILDR*d72~Dgf=xxdRso z>nZ51qF*copFrP1Kk&1wE&v)S0JRPN_dk>|HL*k68>#WOF)XzGz;j1)VD3Q zKatv>X?&|HllP^*#S8&O27r1R-y4b;$EBX6Edtus_--p=967Pf=KyF=5#yyZ8$|-p zM*~35HNMXkF`hV+Y7l@9rM?}heN}2-BmCAemZTVWok>;+K=S-?nowf-Y_J(sRXJCj zDR&TnM4ItM>VJnj>j_?DsPP*qVjDVDFw>+O0@6!q#r%oqh`Jh|AraTU7bVvPVp<{| zL5WzKc?Xn9(SCt=21GnZMWh^=JoZT$OOIGM;=*#bEFK)Dh+$K6Nb8`;#MSzv=M*C+ z)*P6q6`kE%J-jgIoI@SA5izZor37N__=~}Jg$Bp_Cb}&_5s<7Lpd!+T4zUTG9kKng z7Sn7T!E4~(ZR|TEa;v0~Q%*QDw_BcvIORE~8@ONv90R_hGW@ba%Htq;jNefUT(yi| zMYu(ut-u$v^fJp3eKZ4~&ER#YYizr~&xp@12W)I?Y;0_7Y;0_0v41*~C%`O6kJ|tM N002ovPDHLkV1mQ|iWdL? literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_replay_10.png b/app/src/main/res/drawable-xxhdpi/ic_replay_10.png new file mode 100644 index 0000000000000000000000000000000000000000..7a43cc574b622634c8148344d63299188dcc9f0e GIT binary patch literal 873 zcmV-v1D5=WP)PJG1%h{CM-`ZKWb6CKifKr_OI2!2wDNN7FB81bu~i&<3<9aO@gF zE$Ftu;dKgip}PWz*9p{yssf4E0kkBLcpX9OAwXJymZ3Vd4Sj-+9shR%Z3gEkqI@1| zKm&(5E=mo_p`IGeIkuiu&f%7zt`7AUZccg_bhrceH)*NoR=0Aw0N1E%)dHy=!s+fTLwV;zJs}f zGS(h?5Od$U=J@@lebv?d?;P5x8vu=b2Nd_vae%(lwI9$u=oa)vn{1aX?W`Eu8v71N z9p$`@yx~FQo=4iXO+)#PrJV%>ptCG~gD$4QOm=d?h77 zyAFW*-VQMuCUK3|Jpz>9Bu&e0T;p3F0m^Tgr?c|7#`iLugWh}VC{iLpT;s~UpHBhM zns)8ER{lUMf9dU3Lv8q&=v^ZPKvm5#>}%yMD*MAl2))>>QkI32)0Y$wU3;aygwJY7 z(NT{2`;GVE4()BmsWvMhy8amY2Axxn8d6xb>V3dWg)b?LX*z0|%fU>B{-T0gmN)v}?;&qD$+n~%2~-4W;+Rc#OzCyo6rNb7 zKv%g_@MyRlWthBKyd+K)RCkys!cGGw7ocrfhQm!Hk9gc&X73i>rwGgjx5b1?!ugoR z0oEc#CVTYB(}+HS3g>euF)=YQF)=YQv0~dLL82tXBoiu=00000NkvXXu0mjfVrY`v literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/exo_playback_control_view.xml b/app/src/main/res/layout/exo_playback_control_view.xml index 97f6a581..ec3e9d63 100644 --- a/app/src/main/res/layout/exo_playback_control_view.xml +++ b/app/src/main/res/layout/exo_playback_control_view.xml @@ -6,19 +6,56 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - - + + + + + + + + + + + + + + + + + - @@ -99,6 +150,7 @@ android:layout_alignParentRight="true" android:gravity="end" android:fontFamily="@font/inter" + android:singleLine="true" android:text="@string/zero_duration" android:textColor="@color/white" android:textSize="14sp" />