22
33import static ir .smartdevelopers .smartfilebrowser .customClasses .Utils .formatTime ;
44
5+ import androidx .activity .OnBackPressedCallback ;
56import androidx .annotation .NonNull ;
67import androidx .annotation .Nullable ;
78import androidx .appcompat .app .AppCompatActivity ;
1112import androidx .core .app .ActivityCompat ;
1213import androidx .core .app .SharedElementCallback ;
1314import androidx .core .view .ViewCompat ;
15+ import androidx .core .view .WindowCompat ;
16+ import androidx .core .view .WindowInsetsControllerCompat ;
1417
18+ import android .animation .ValueAnimator ;
1519import android .annotation .SuppressLint ;
1620import android .content .res .Configuration ;
21+ import android .content .res .Resources ;
1722import android .graphics .Bitmap ;
1823import android .graphics .Color ;
24+ import android .graphics .drawable .ColorDrawable ;
1925import android .graphics .drawable .Drawable ;
2026import android .media .MediaMetadataRetriever ;
2127import android .media .MediaPlayer ;
2935import android .provider .MediaStore ;
3036import android .transition .Transition ;
3137import android .transition .TransitionInflater ;
38+ import android .util .DisplayMetrics ;
3239import android .util .Log ;
3340import android .view .MotionEvent ;
41+ import android .view .SurfaceHolder ;
3442import android .view .View ;
43+ import android .view .ViewTreeObserver ;
3544import android .view .Window ;
45+ import android .view .WindowManager ;
3646import android .widget .ImageView ;
3747import android .widget .MediaController ;
3848import android .widget .TextView ;
3949import android .widget .VideoView ;
50+
51+ import com .bumptech .glide .Glide ;
4052import com .google .android .material .slider .LabelFormatter ;
4153import com .google .android .material .slider .Slider ;
4254
4355import java .io .IOException ;
56+ import java .util .List ;
4457import java .util .Locale ;
58+ import java .util .concurrent .ExecutorService ;
59+ import java .util .concurrent .Executors ;
60+
4561import ir .smartdevelopers .smartfilebrowser .R ;
4662import ir .smartdevelopers .smartfilebrowser .customClasses .MyVideoView ;
4763
4864public class VideoViewActivity extends AppCompatActivity {
4965
5066 public static final String KEY_TRANSITION_NAME ="transition_name" ;
67+ private final long animationDuration = 500 ;
68+
5169 private Uri mVideoUri ;
5270 private ImageView imgThumbnailHolder ;
5371
@@ -59,36 +77,73 @@ public class VideoViewActivity extends AppCompatActivity {
5977 private Handler mTimerHandler ;
6078 private boolean isPlaying ;
6179 private Slider mSlider ;
80+ private boolean mVideoPrapered = false ;
81+ private boolean mTransitionEnds = false ;
6282 @ SuppressLint ("ClickableViewAccessibility" )
6383 @ Override
6484 protected void onCreate (Bundle savedInstanceState ) {
65- if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .LOLLIPOP ) {
66- getWindow ().requestFeature (Window .FEATURE_ACTIVITY_TRANSITIONS );
67- Transition transition = TransitionInflater .from (this ).inflateTransition (R .transition .iten_transition_in );
68- getWindow ().setSharedElementEnterTransition (transition );
69- getWindow ().setSharedElementReturnTransition (transition );
85+ Window window = getWindow ();
86+ String transitionName =getIntent ().getStringExtra (KEY_TRANSITION_NAME );
87+ window .requestFeature (Window .FEATURE_ACTIVITY_TRANSITIONS );
88+ // window.setSharedElementsUseOverlay(false);
89+ Transition transition = TransitionInflater .from (this ).inflateTransition (R .transition .iten_transition_in );
90+ //transition.addTarget(R.id.sfb_activity_videoView_imagePlaceHolder);
91+ window .setSharedElementEnterTransition (transition );
92+ window .setSharedElementReturnTransition (transition );
93+
94+ transition .addListener (new Transition .TransitionListener () {
95+ @ Override
96+ public void onTransitionCancel (Transition transition ) {
97+
98+ }
99+
100+ @ Override
101+ public void onTransitionEnd (Transition transition ) {
102+ if (!isExiting ){
103+ mTransitionEnds = true ;
104+ mVideoView .setVideoURI (mVideoUri );
105+ hideThumbNaile (true );
106+ }
107+ }
108+
109+ @ Override
110+ public void onTransitionPause (Transition transition ) {
111+
112+ }
113+
114+ @ Override
115+ public void onTransitionResume (Transition transition ) {
116+
117+ }
70118
119+ @ Override
120+ public void onTransitionStart (Transition transition ) {
71121
122+ }
123+ });
124+ window .addFlags (WindowManager .LayoutParams .FLAG_FULLSCREEN );
125+ window .setBackgroundDrawable (new ColorDrawable (Color .BLACK ));
126+ WindowCompat .enableEdgeToEdge (window );
127+ WindowInsetsControllerCompat controllerCompat = WindowCompat .getInsetsController (window ,window .getDecorView ());
128+ if (controllerCompat != null ){
129+ controllerCompat .setAppearanceLightStatusBars (false );
72130 }
73131 super .onCreate (savedInstanceState );
74132 setContentView (R .layout .activity_video_view );
133+ supportPostponeEnterTransition ();
75134
76135 mVideoUri =getIntent ().getData ();
77- String transitionName = getIntent (). getStringExtra ( KEY_TRANSITION_NAME );
136+
78137
79138 findViews ();
80- initTimer ();
81139 ViewCompat .setTransitionName (imgThumbnailHolder ,transitionName );
140+ initTimer ();
82141
83142 btnPlay .setOnClickListener (v ->{
84143 btnPlay .setVisibility (View .GONE );
85- mVideoView .setVisibility (View .VISIBLE );
86144 playVideo ();
87- if (imgThumbnailHolder .getVisibility ()==View .VISIBLE ){
88- new Handler ().postDelayed (()->{
89- imgThumbnailHolder .setVisibility (View .INVISIBLE );
90- },900 );
91- }
145+ hideThumbNaile (false );
146+
92147
93148 });
94149
@@ -104,8 +159,22 @@ public boolean onTouch(View v, MotionEvent event) {
104159 return false ;
105160 }
106161 });
162+ mVideoView .setOnInfoListener (new MediaPlayer .OnInfoListener () {
163+ @ Override
164+ public boolean onInfo (MediaPlayer mp , int what , int extra ) {
165+ Log .d ("VideoVieAcivity" ,"Player info = " +what );
166+ return false ;
167+ }
168+ });
107169
108-
170+ mVideoView .setOnPreparedListener (new MediaPlayer .OnPreparedListener () {
171+ @ Override
172+ public void onPrepared (MediaPlayer mp ) {
173+ mVideoPrapered = true ;
174+ mVideoView .seekTo (1 );
175+ hideThumbNaile (true );
176+ }
177+ });
109178 mVideoView .setOnCompletionListener (new MediaPlayer .OnCompletionListener () {
110179 @ Override
111180 public void onCompletion (MediaPlayer mp ) {
@@ -118,13 +187,54 @@ public void onCompletion(MediaPlayer mp) {
118187 }
119188 });
120189
121- mVideoView .setVideoURI (mVideoUri );
122- mVideoView .seekTo (1 );
190+ //mVideoView.setZOrderOnTop(false);
191+
192+ // mVideoView.resume();
193+ // mVideoView.pause();
123194
124195
125- ActivityCompat .postponeEnterTransition (this );
196+ getOnBackPressedDispatcher ().addCallback (this , new OnBackPressedCallback (true ) {
197+ @ Override
198+ public void handleOnBackPressed () {
199+ if (mVideoView !=null ){
200+ mVideoView .pause ();
201+ }
202+
203+ isPlaying =false ;
204+ showThumbnail (false );
205+ isExiting =true ;
206+ remove ();
207+ ActivityCompat .finishAfterTransition (VideoViewActivity .this );
208+
209+ }
210+ });
211+
126212 loadVideoThumbnail ();
213+ // new Handler().postDelayed(()->loadVideoThumbnail(),2000);
214+
215+
127216
217+ }
218+ private void showThumbnail (boolean animate ) {
219+ if (animate ){
220+ imgThumbnailHolder .animate ().setDuration (animationDuration )
221+ .alpha (1 )
222+ .start ();
223+ }else {
224+ imgThumbnailHolder .setAlpha (1f );
225+ mVideoView .setVisibility (View .GONE );
226+ }
227+ }
228+
229+
230+ private void hideThumbNaile (boolean animate ) {
231+ if (mVideoPrapered && mTransitionEnds ){
232+ if (animate ){
233+ imgThumbnailHolder .animate ().setDuration (animationDuration ).alpha (0 );
234+ }else {
235+ imgThumbnailHolder .setAlpha (0f );
236+ }
237+ }
128238 }
129239
130240 private void initTimer () {
@@ -193,7 +303,7 @@ public String getFormattedValue(float value) {
193303 @ Override
194304 public void onValueChange (@ NonNull Slider slider , float value , boolean fromUser ) {
195305 if (fromUser ){
196- mVideoView .seekTo ((int ) slider . getValue () );
306+ mVideoView .seekTo ((int ) value );
197307 }
198308 }
199309 });
@@ -221,25 +331,38 @@ public void onStopTrackingTouch(@NonNull Slider slider) {
221331 }
222332
223333 private void loadVideoThumbnail () {
224- MediaMetadataRetriever retriever =new MediaMetadataRetriever ();
225- retriever .setDataSource (this ,mVideoUri );
226- Bitmap bitmap =retriever .getFrameAtTime ();
227- imgThumbnailHolder .setImageBitmap (bitmap );
228-
229- String durationSt =retriever .extractMetadata (MediaMetadataRetriever .METADATA_KEY_DURATION );
230- if (durationSt !=null ){
231- long duration =Long .parseLong (durationSt );
232- setTime (duration ,txtVideoLength );
233- mSlider .setValueTo (duration );
234- }
334+ imgThumbnailHolder .getViewTreeObserver ().addOnPreDrawListener (new ViewTreeObserver .OnPreDrawListener () {
335+ @ Override
336+ public boolean onPreDraw () {
337+ imgThumbnailHolder .getViewTreeObserver ().removeOnPreDrawListener (this );
338+ int h = imgThumbnailHolder .getMeasuredHeight ();
339+ int w = imgThumbnailHolder .getMeasuredWidth ();
340+ supportStartPostponedEnterTransition ();
341+ return true ;
342+ }
343+ });
344+
345+ try (MediaMetadataRetriever retriever =new MediaMetadataRetriever ()){
346+ retriever .setDataSource (this ,mVideoUri );
347+ DisplayMetrics metrics = getResources ().getDisplayMetrics ();
348+ Bitmap bitmap =retriever .getFrameAtTime ();
349+ Glide .with (imgThumbnailHolder ).load (bitmap ).dontTransform ()
350+ .override (metrics .widthPixels ,metrics .heightPixels )
351+ .into (imgThumbnailHolder );
352+
353+ String durationSt =retriever .extractMetadata (MediaMetadataRetriever .METADATA_KEY_DURATION );
354+ if (durationSt !=null ){
355+ long duration =Long .parseLong (durationSt );
356+ setTime (duration ,txtVideoLength );
357+ mSlider .setValueTo (duration );
358+ }
359+ setTime (0 ,txtCurrentTime );
360+
361+ } catch (IOException e ) {
362+ Log .e (getPackageName (),e .getMessage (),e );
363+ }
364+
235365
236- setTime (0 ,txtCurrentTime );
237- ActivityCompat .startPostponedEnterTransition (VideoViewActivity .this );
238- try {
239- retriever .release ();
240- } catch (IOException e ) {
241- Log .e (getPackageName (),e .getMessage (),e );
242- }
243366 }
244367
245368
@@ -269,18 +392,5 @@ protected void onDestroy() {
269392 super .onDestroy ();
270393 }
271394
272- @ Override
273- public void onBackPressed () {
274- if (mVideoView !=null ){
275- mVideoView .pause ();
276- }
277395
278- isPlaying =false ;
279- imgThumbnailHolder .setVisibility (View .VISIBLE );
280- imgThumbnailHolder .post (()->{
281- mVideoView .setVisibility (View .GONE );
282- });
283- isExiting =true ;
284- super .onBackPressed ();
285- }
286396}
0 commit comments