allow playing videos
This commit is contained in:
parent
b45608a5ab
commit
309e52ef3a
12 changed files with 176 additions and 15 deletions
|
@ -1,18 +1,33 @@
|
|||
package com.simplemobiletools.gallery;
|
||||
|
||||
import android.media.AudioManager;
|
||||
import android.media.MediaPlayer;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.SurfaceHolder;
|
||||
import android.view.SurfaceView;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
|
||||
import com.davemorrissey.labs.subscaleview.ImageSource;
|
||||
import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView;
|
||||
import com.simplemobiletools.gallery.activities.ViewPagerActivity;
|
||||
|
||||
public class ViewPagerFragment extends Fragment implements View.OnClickListener {
|
||||
import java.io.IOException;
|
||||
|
||||
public class ViewPagerFragment extends Fragment
|
||||
implements View.OnClickListener, SurfaceHolder.Callback, MediaPlayer.OnCompletionListener, MediaPlayer.OnVideoSizeChangedListener {
|
||||
private static final String TAG = ViewPagerFragment.class.getSimpleName();
|
||||
private static final String MEDIUM = "medium";
|
||||
private Media medium;
|
||||
private static SurfaceHolder surfaceHolder;
|
||||
private static ImageView playOutline;
|
||||
private static boolean isPlaying;
|
||||
private static MediaPlayer mediaPlayer;
|
||||
|
||||
public void setMedium(Media medium) {
|
||||
this.medium = medium;
|
||||
|
@ -20,23 +35,49 @@ public class ViewPagerFragment extends Fragment implements View.OnClickListener
|
|||
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
final View view = inflater.inflate(R.layout.pager_item, container, false);
|
||||
View view;
|
||||
|
||||
if (medium == null && savedInstanceState != null) {
|
||||
medium = (Media) savedInstanceState.getSerializable(MEDIUM);
|
||||
}
|
||||
|
||||
if (medium != null) {
|
||||
final SubsamplingScaleImageView imageView = (SubsamplingScaleImageView) view.findViewById(R.id.photo);
|
||||
if (medium.getIsVideo()) {
|
||||
view = inflater.inflate(R.layout.pager_video_item, container, false);
|
||||
setupPlayer(view);
|
||||
} else {
|
||||
view = inflater.inflate(R.layout.pager_photo_item, container, false);
|
||||
final SubsamplingScaleImageView imageView = (SubsamplingScaleImageView) view.findViewById(R.id.photo_view);
|
||||
imageView.setOrientation(SubsamplingScaleImageView.ORIENTATION_USE_EXIF);
|
||||
imageView.setImage(ImageSource.uri(medium.getPath()));
|
||||
imageView.setMaxScale(5f);
|
||||
imageView.setOnClickListener(this);
|
||||
}
|
||||
} else {
|
||||
view = inflater.inflate(R.layout.pager_photo_item, container, false);
|
||||
}
|
||||
|
||||
view.setOnClickListener(this);
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
private void setupPlayer(View view) {
|
||||
if (getActivity() == null)
|
||||
return;
|
||||
|
||||
playOutline = (ImageView) view.findViewById(R.id.video_play_outline);
|
||||
playOutline.setOnClickListener(this);
|
||||
|
||||
final SurfaceView surfaceView = (SurfaceView) view.findViewById(R.id.video_surface);
|
||||
surfaceView.setOnClickListener(this);
|
||||
surfaceHolder = surfaceView.getHolder();
|
||||
surfaceHolder.addCallback(this);
|
||||
}
|
||||
|
||||
public void itemDragged() {
|
||||
pauseVideo();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSaveInstanceState(Bundle outState) {
|
||||
super.onSaveInstanceState(outState);
|
||||
|
@ -45,6 +86,95 @@ public class ViewPagerFragment extends Fragment implements View.OnClickListener
|
|||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
switch (v.getId()) {
|
||||
case R.id.video_play_outline:
|
||||
togglePlayPause();
|
||||
break;
|
||||
default:
|
||||
((ViewPagerActivity) getActivity()).photoClicked();
|
||||
}
|
||||
}
|
||||
|
||||
private void pauseVideo() {
|
||||
if (isPlaying) {
|
||||
togglePlayPause();
|
||||
}
|
||||
}
|
||||
|
||||
private void togglePlayPause() {
|
||||
if (getActivity() == null)
|
||||
return;
|
||||
|
||||
if (mediaPlayer == null)
|
||||
initMediaPlayer();
|
||||
|
||||
isPlaying = !isPlaying;
|
||||
if (isPlaying) {
|
||||
mediaPlayer.start();
|
||||
playOutline.setImageDrawable(null);
|
||||
} else {
|
||||
mediaPlayer.pause();
|
||||
playOutline.setImageDrawable(getResources().getDrawable(R.mipmap.play_outline_big));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void surfaceCreated(SurfaceHolder holder) {
|
||||
initMediaPlayer();
|
||||
}
|
||||
|
||||
private void initMediaPlayer() {
|
||||
try {
|
||||
mediaPlayer = new MediaPlayer();
|
||||
mediaPlayer.setDataSource(getContext(), Uri.parse(medium.getPath()));
|
||||
mediaPlayer.setDisplay(surfaceHolder);
|
||||
mediaPlayer.setOnCompletionListener(this);
|
||||
mediaPlayer.setOnVideoSizeChangedListener(this);
|
||||
mediaPlayer.prepare();
|
||||
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
|
||||
addPreviewImage();
|
||||
} catch (IOException e) {
|
||||
Log.e(TAG, "init media player " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
private void addPreviewImage() {
|
||||
mediaPlayer.start();
|
||||
mediaPlayer.pause();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPause() {
|
||||
super.onPause();
|
||||
releaseMediaPlayer();
|
||||
}
|
||||
|
||||
private void releaseMediaPlayer() {
|
||||
pauseVideo();
|
||||
|
||||
if (mediaPlayer != null) {
|
||||
mediaPlayer.release();
|
||||
mediaPlayer = null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void surfaceDestroyed(SurfaceHolder holder) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCompletion(MediaPlayer mp) {
|
||||
pauseVideo();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
|
||||
surfaceHolder.setFixedSize(width, height);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -146,7 +146,7 @@ public class MediaActivity extends AppCompatActivity
|
|||
if (curPath.matches(pattern) && !toBeDeleted.contains(curPath)) {
|
||||
final File file = new File(curPath);
|
||||
if (file.exists()) {
|
||||
myMedia.add(new Media(cursor.getString(pathIndex), (i == 1)));
|
||||
myMedia.add(new Media(curPath, (i == 1)));
|
||||
} else {
|
||||
invalidFiles.add(file.getAbsolutePath());
|
||||
}
|
||||
|
|
|
@ -248,7 +248,7 @@ public class ViewPagerActivity extends AppCompatActivity
|
|||
}
|
||||
|
||||
private List<Media> getMedia() {
|
||||
final List<Media> media = new ArrayList<>();
|
||||
final List<Media> myMedia = new ArrayList<>();
|
||||
int j = 0;
|
||||
for (int i = 0; i < 2; i++) {
|
||||
Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
|
||||
|
@ -267,7 +267,7 @@ public class ViewPagerActivity extends AppCompatActivity
|
|||
do {
|
||||
final String curPath = cursor.getString(pathIndex);
|
||||
if (curPath.matches(pattern) && !curPath.equals(toBeDeleted) && !curPath.equals(beingDeleted)) {
|
||||
media.add(new Media(curPath, j == 1));
|
||||
myMedia.add(new Media(curPath, i == 1));
|
||||
|
||||
if (curPath.equals(path)) {
|
||||
pos = j;
|
||||
|
@ -279,7 +279,7 @@ public class ViewPagerActivity extends AppCompatActivity
|
|||
cursor.close();
|
||||
}
|
||||
}
|
||||
return media;
|
||||
return myMedia;
|
||||
}
|
||||
|
||||
public void photoClicked() {
|
||||
|
@ -355,7 +355,10 @@ public class ViewPagerActivity extends AppCompatActivity
|
|||
|
||||
@Override
|
||||
public void onPageScrollStateChanged(int state) {
|
||||
|
||||
if (state == ViewPager.SCROLL_STATE_DRAGGING) {
|
||||
final MyPagerAdapter adapter = (MyPagerAdapter) pager.getAdapter();
|
||||
adapter.itemDragged();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -11,6 +11,7 @@ import java.util.List;
|
|||
|
||||
public class MyPagerAdapter extends FragmentStatePagerAdapter {
|
||||
private List<Media> media;
|
||||
private ViewPagerFragment fragment;
|
||||
|
||||
public MyPagerAdapter(FragmentManager fm, List<Media> media) {
|
||||
super(fm);
|
||||
|
@ -24,11 +25,15 @@ public class MyPagerAdapter extends FragmentStatePagerAdapter {
|
|||
|
||||
@Override
|
||||
public Fragment getItem(int position) {
|
||||
final ViewPagerFragment fragment = new ViewPagerFragment();
|
||||
fragment = new ViewPagerFragment();
|
||||
fragment.setMedium(media.get(position));
|
||||
return fragment;
|
||||
}
|
||||
|
||||
public void itemDragged() {
|
||||
fragment.itemDragged();
|
||||
}
|
||||
|
||||
public void updateItems(List<Media> newPaths) {
|
||||
media.clear();
|
||||
media.addAll(newPaths);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
|
||||
android:id="@+id/photo"
|
||||
android:id="@+id/photo_view"
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"/>
|
22
app/src/main/res/layout/pager_video_item.xml
Normal file
22
app/src/main/res/layout/pager_video_item.xml
Normal file
|
@ -0,0 +1,22 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout android:id="@+id/video_holder"
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="100dp">
|
||||
|
||||
<SurfaceView
|
||||
android:id="@+id/video_surface"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerInParent="true"
|
||||
android:background="@android:color/transparent"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/video_play_outline"
|
||||
android:layout_width="@dimen/play_outline_size_big"
|
||||
android:layout_height="@dimen/play_outline_size_big"
|
||||
android:layout_centerInParent="true"
|
||||
android:background="@android:color/transparent"
|
||||
android:src="@mipmap/play_outline_big"/>
|
||||
|
||||
</RelativeLayout>
|
BIN
app/src/main/res/mipmap-hdpi/play_outline_big.png
Normal file
BIN
app/src/main/res/mipmap-hdpi/play_outline_big.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 6.6 KiB |
BIN
app/src/main/res/mipmap-mdpi/play_outline_big.png
Normal file
BIN
app/src/main/res/mipmap-mdpi/play_outline_big.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 6.6 KiB |
BIN
app/src/main/res/mipmap-xhdpi/play_outline_big.png
Normal file
BIN
app/src/main/res/mipmap-xhdpi/play_outline_big.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 9.2 KiB |
BIN
app/src/main/res/mipmap-xxhdpi/play_outline_big.png
Normal file
BIN
app/src/main/res/mipmap-xxhdpi/play_outline_big.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 15 KiB |
BIN
app/src/main/res/mipmap-xxxhdpi/play_outline_big.png
Normal file
BIN
app/src/main/res/mipmap-xxxhdpi/play_outline_big.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 18 KiB |
|
@ -3,5 +3,6 @@
|
|||
<dimen name="dir_tmb_size">150dp</dimen>
|
||||
<dimen name="medium_tmb_size">100dp</dimen>
|
||||
<dimen name="play_outline_size">40dp</dimen>
|
||||
<dimen name="play_outline_size_big">160dp</dimen>
|
||||
<dimen name="undo_padding">8dp</dimen>
|
||||
</resources>
|
||||
|
|
Loading…
Reference in a new issue