Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/hss/onlyglide' into hss/onlyglide
Browse files Browse the repository at this point in the history
  • Loading branch information
hss01248 committed Oct 8, 2024
2 parents 810b96b + 79cbd08 commit d93a159
Show file tree
Hide file tree
Showing 23 changed files with 359 additions and 170 deletions.
1 change: 1 addition & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ dependencies {
api('com.davemorrissey.labs:subsampling-scale-image-view:3.10.0') {
exclude group: 'com.android.support'
}
api "com.github.hss01248.media:localvideoplayer:1.0.0"

}

Expand Down
18 changes: 1 addition & 17 deletions app/src/main/java/com/hss01248/imageloaderdemo/MainActivity.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.hss01248.imageloaderdemo;

import android.Manifest;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
Expand All @@ -26,7 +25,6 @@

import com.blankj.utilcode.util.AppUtils;
import com.blankj.utilcode.util.LogUtils;
import com.blankj.utilcode.util.PermissionUtils;
import com.blankj.utilcode.util.ThreadUtils;
import com.blankj.utilcode.util.ToastUtils;
import com.bumptech.glide.Glide;
Expand Down Expand Up @@ -217,21 +215,7 @@ public void onClick(View view) {
pid=31500, uid=10576 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()*/


PermissionUtils.permission(Manifest.permission.WRITE_EXTERNAL_STORAGE).callback(new PermissionUtils.SingleCallback() {
@Override
public void callback(boolean isAllGranted, @NonNull List<String> granted, @NonNull List<String> deniedForever, @NonNull List<String> denied) {

ImageMediaCenterUtil.showViewAsActivity(MainActivity.this, new IViewInit() {
@Override
public View init(Activity activity) {
ImageListView view1 = new ImageListView(activity);
view1.showAllAlbums();
return view1;
}
});

}
}).request();
ImageMediaCenterUtil.showAlbums();


}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ public static void showOne(String path){
public void accept(Pair<ContainerActivity2, ContainerViewHolderWithTitleBar> pair) throws Exception {

MyLargeImageViewBySubSamplingView largeImageView = new MyLargeImageViewBySubSamplingView(pair.first);
largeImageView.loadUri(path);
largeImageView.loadUri(path,true);
pair.second.getBinding().llRoot.setBackgroundColor(Color.BLACK);
pair.second.getBinding().rlContainer.addView(largeImageView);

Expand Down Expand Up @@ -156,7 +156,7 @@ public static void showInDialog(String path){
LogUtils.d("path to load: "+ path);
MyLargeImageViewBySubSamplingView largeImageView = new MyLargeImageViewBySubSamplingView(ActivityUtils.getTopActivity());
FullScreenDialogUtil.showFullScreen(largeImageView);
largeImageView.loadUri(path);
largeImageView.loadUri(path,true);
}


Expand Down Expand Up @@ -202,15 +202,15 @@ public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
MyLargeImageView imageView = null;
MyLargeImageViewBySubSamplingView imageView = null;
if(cacheList.isEmpty()){
imageView = new MyLargeImageView(context);
imageView = new MyLargeImageViewBySubSamplingView(context);
}else {
imageView = (MyLargeImageView) cacheList.remove(0);
imageView = (MyLargeImageViewBySubSamplingView) cacheList.remove(0);
}
String url = uris.get(position);
url = getBigImageUrl(url);
imageView.loadUri(url);
imageView.loadUri(url,true);
container.addView(imageView);
return imageView;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
import io.reactivex.functions.Function;
import io.reactivex.schedulers.Schedulers;

@Deprecated
public class MyLargeImageView extends FrameLayout {
MyGifPhotoView gifView;
MyLargeJpgView jpgView;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,11 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.media3.common.MediaItem;
import androidx.media3.common.PlaybackException;
import androidx.media3.common.Player;
import androidx.media3.exoplayer.ExoPlayer;
import androidx.media3.ui.PlayerView;

import com.blankj.utilcode.util.AppUtils;
import com.blankj.utilcode.util.LogUtils;
Expand All @@ -31,6 +36,7 @@
import com.hss01248.bigimageviewpager.photoview.MyGifPhotoView;
import com.hss01248.glide.aop.file.AddByteUtil;
import com.hss01248.media.metadata.ExifUtil;
import com.hss01248.motion_photos.MotionPhotoUtil;
import com.hss01248.viewstate.StatefulLayout;
import com.hss01248.viewstate.ViewStateConfig;
import com.tencent.qcloud.image.avif.subsampling.AvifSubsamplingImageDecoder;
Expand Down Expand Up @@ -88,7 +94,7 @@ public MyLargeImageViewBySubSamplingView(@NonNull Context context) {
}

}

ImageView ivPlayVideo;
private void init(Context context) {
stateBinding = StateItemLargeImgSubsamplingBinding.inflate(LayoutInflater.from(context),this,true);
largeImgBinding = stateBinding.itemLargeImg;
Expand All @@ -107,6 +113,8 @@ public void run() {
tvScale = largeImgBinding.tvScale;
jpgView = largeImgBinding.ivLarge;
gifView = largeImgBinding.gifLarge;
ivPlayVideo = stateBinding.itemLargeImg.ivPlayVideo;
playerView = stateBinding.itemLargeImg.playView;
jpgView.setDebug(AppUtils.isAppDebug());
jpgView.setMaxScale(12);

Expand Down Expand Up @@ -183,7 +191,7 @@ public void setOritation(boolean isLandscape, boolean fromConfigChange){
}

private void reload() {
loadUri(info.uri);
loadUri(info.uri,true);

}

Expand All @@ -210,7 +218,7 @@ public void setOnClickListener(@Nullable OnClickListener l) {
}
}

private void loadUrl(String url) {
private void loadUrl(String url, boolean loadMotionVideo) {

stateManager.showLoading();

Expand Down Expand Up @@ -245,35 +253,35 @@ public void onFail(Throwable throwable) {

}

private void loadFile(String filePath) {
loadFile(filePath, false);
private void loadFile(String filePath, boolean loadMotionVideo) {
loadFile(filePath, false,loadMotionVideo);
}

private void loadFile(String filePath, boolean isGif) {
loadLocal(filePath, isGif);
private void loadFile(String filePath, boolean isGif, boolean loadMotionVideo) {
loadLocal(filePath, isGif,loadMotionVideo);
}

private void toastMsg(String message) {
Toast.makeText(getContext().getApplicationContext(), message, Toast.LENGTH_LONG).show();
}

public void loadUri(String uri) {
public void loadUri(String uri, boolean loadMotionVideo) {
info.uri = uri;
//if(uri.startsWith("file://") || uri.startsWith("/storage/"))
if (uri.startsWith("http")) {
loadUrl(uri);
loadUrl(uri,loadMotionVideo);
return;
}
if (uri.startsWith("/storage/")) {
loadFile(uri, false);
loadFile(uri, false,loadMotionVideo);
return;
}
if (uri.startsWith("file://")) {
loadFile(uri.substring("file://".length()), false);
loadFile(uri.substring("file://".length()), false,loadMotionVideo);
return;
}
if (uri.startsWith("content://")) {
loadLocal(uri, false);
loadLocal(uri, false,loadMotionVideo);
return;
}
}
Expand All @@ -286,9 +294,30 @@ public String getInfoStr(){
return info.getInfo();
}

private void loadLocal(String uri, boolean isGif) {
PlayerView playerView;

private void loadLocal(String uri, boolean isGif, boolean loadMotionVideo) {
info.localPathOrUri = uri;
largeImgBinding.ivGo360.setVisibility(GONE);
// stateBinding.stateLayout.showContent();
stateManager.showContent();
if( MotionPhotoUtil.isMotionImage(uri,false)){
if(loadMotionVideo){
loadMotionVideo(uri);
return;
}
ivPlayVideo.setVisibility(VISIBLE);
ivPlayVideo.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
loadLocal(info.localPathOrUri,isGif,true);
}
});

}else {
ivPlayVideo.setVisibility(GONE);
}

if (uri.contains(".gif") || isGif) {
gifView.setVisibility(VISIBLE);
jpgView.setVisibility(GONE);
Expand All @@ -301,6 +330,21 @@ private void loadLocal(String uri, boolean isGif) {
}
stateManager.showContent();
} else {
if(MotionPhotoUtil.isMotionImage(uri,false) ){
if(playerView.getVisibility() != View.GONE){
LargeImageViewer.fadeToGone(playerView,500);
}
ivHelper.setVisibility(VISIBLE);
ivHelper.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
loadLocal(info.localPathOrUri, isGif, true);
}
});

}else {
playerView.setVisibility(View.GONE);
}
gifView.setVisibility(GONE);
jpgView.setVisibility(VISIBLE);
//兼容avif格式
Expand Down Expand Up @@ -333,6 +377,96 @@ private void loadLocal(String uri, boolean isGif) {
}
}


ExoPlayer player;
Player.Listener listener;
private void loadMotionVideo(String uri) {
String motionVideoPath = MotionPhotoUtil.getMotionVideoPath(uri);
if(motionVideoPath ==null || motionVideoPath.equals("")){
return;
}
ivHelper.setVisibility(GONE);
playerView.setVisibility(VISIBLE);
gifView.setVisibility(GONE);
LargeImageViewer.fadeToGone(jpgView,300);
//jpgView.setVisibility(GONE);
File file = new File(motionVideoPath);

if(player !=null){
if(player.isPlaying()){
player.stop();
}else if(player.isLoading()){
player.stop();
}
player.release();
player = null;
}

player = new ExoPlayer.Builder(getContext())
.build();
playerView.setPlayer(player);
listener = new Player.Listener() {
@Override
public void onPlaybackStateChanged(int playbackState) {
Player.Listener.super.onPlaybackStateChanged(playbackState);
if(playbackState == Player.STATE_ENDED ){
loadLocal(uri,false,false);
}
}

@Override
public void onPlayerError(PlaybackException error) {
Player.Listener.super.onPlayerError(error);
LogUtils.w(error);
loadLocal(uri,false,false);
}
};
player.addListener(listener);
player.setPlayWhenReady(true);
player.setRepeatMode(Player.REPEAT_MODE_OFF);


//sending message to a Handler on a dead thread
try{
//IllegalStateException: Handler (android.os.Handler) {674e76a} sending message to a Handler on a dead thread
player.setMediaItem(MediaItem.fromUri(Uri.fromFile(file)));
player.prepare();
}catch (Throwable throwable){
LogUtils.w(throwable);
player.release();
player = null;
loadLocal(uri,false,false);
}

}

public void pausePlayer(){
if(player !=null){
if(player.isPlaying() || player.isLoading()){
player.stop();
}
player.release();
player = null;
}
}

@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
LogUtils.w("onDetachedFromWindow-"+this);
try {
if(player !=null){
if(player.isPlaying()){
player.stop();
}
player.release();
}
}catch (Throwable throwable){
LogUtils.w(throwable);
}

}

public static boolean isPanoramaImage(String path){
Map<String, String> map = ExifUtil.readExif(path);
String xml = map.get("Xmp");
Expand All @@ -341,10 +475,10 @@ public static boolean isPanoramaImage(String path){
LogUtils.i("根据exif特征识别出为360全景图,不进行压缩");
return true;
}
if(xml.contains("MotionPhoto")){
/*if(xml.contains("MotionPhoto")){
LogUtils.i("根据exif特征识别出为MotionPhoto,不进行压缩");
return true;
}
}*/
//MotionPhoto
}
return false;
Expand Down
Loading

0 comments on commit d93a159

Please sign in to comment.