2019-10-09 18:49:33 +02:00
|
|
|
package app.fedilab.android.fragments;
|
|
|
|
/* Copyright 2019 Thomas Schneider
|
|
|
|
*
|
|
|
|
* This file is a part of Fedilab
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify it under the terms of the
|
|
|
|
* GNU General Public License as published by the Free Software Foundation; either version 3 of the
|
|
|
|
* License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* Fedilab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
|
|
|
|
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
|
|
|
* Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License along with Fedilab; if not,
|
|
|
|
* see <http://www.gnu.org/licenses>. */
|
|
|
|
|
|
|
|
import android.Manifest;
|
|
|
|
import android.app.Activity;
|
|
|
|
import android.content.Context;
|
|
|
|
import android.content.SharedPreferences;
|
|
|
|
import android.content.pm.PackageManager;
|
|
|
|
import android.graphics.Bitmap;
|
2020-05-16 17:06:13 +02:00
|
|
|
import android.graphics.Color;
|
2020-04-09 14:59:36 +02:00
|
|
|
import android.graphics.drawable.Drawable;
|
2019-10-09 18:49:33 +02:00
|
|
|
import android.media.MediaPlayer;
|
|
|
|
import android.net.Uri;
|
|
|
|
import android.os.Build;
|
|
|
|
import android.os.Bundle;
|
2019-10-13 15:44:39 +02:00
|
|
|
import android.os.Handler;
|
2019-10-09 18:49:33 +02:00
|
|
|
import android.view.LayoutInflater;
|
|
|
|
import android.view.View;
|
|
|
|
import android.view.ViewGroup;
|
|
|
|
import android.view.WindowManager;
|
|
|
|
import android.widget.FrameLayout;
|
|
|
|
import android.widget.ImageButton;
|
|
|
|
import android.widget.ImageView;
|
|
|
|
import android.widget.ProgressBar;
|
|
|
|
import android.widget.RelativeLayout;
|
|
|
|
import android.widget.TextView;
|
2019-11-15 16:32:25 +01:00
|
|
|
|
2019-10-09 18:49:33 +02:00
|
|
|
import androidx.annotation.NonNull;
|
2020-04-09 14:59:36 +02:00
|
|
|
import androidx.annotation.Nullable;
|
2020-06-20 16:33:49 +02:00
|
|
|
import androidx.core.app.ActivityCompat;
|
2019-10-09 18:49:33 +02:00
|
|
|
import androidx.core.content.ContextCompat;
|
|
|
|
import androidx.fragment.app.Fragment;
|
2019-11-15 16:32:25 +01:00
|
|
|
|
2019-10-09 18:49:33 +02:00
|
|
|
import com.bumptech.glide.Glide;
|
2020-04-09 14:59:36 +02:00
|
|
|
import com.bumptech.glide.request.target.CustomTarget;
|
2019-10-09 18:49:33 +02:00
|
|
|
import com.bumptech.glide.request.transition.Transition;
|
|
|
|
import com.cleveroad.audiovisualization.DbmHandler;
|
|
|
|
import com.cleveroad.audiovisualization.GLAudioVisualizationView;
|
|
|
|
import com.github.chrisbanes.photoview.PhotoView;
|
|
|
|
import com.google.android.exoplayer2.ExoPlayerFactory;
|
|
|
|
import com.google.android.exoplayer2.Player;
|
|
|
|
import com.google.android.exoplayer2.SimpleExoPlayer;
|
2020-05-16 11:32:09 +02:00
|
|
|
import com.google.android.exoplayer2.source.ProgressiveMediaSource;
|
|
|
|
import com.google.android.exoplayer2.ui.PlayerView;
|
2019-10-09 18:49:33 +02:00
|
|
|
import com.google.android.exoplayer2.upstream.DataSource;
|
|
|
|
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory;
|
|
|
|
import com.google.android.exoplayer2.util.Util;
|
2020-05-16 17:06:13 +02:00
|
|
|
import com.r0adkll.slidr.Slidr;
|
|
|
|
import com.r0adkll.slidr.model.SlidrConfig;
|
|
|
|
import com.r0adkll.slidr.model.SlidrInterface;
|
|
|
|
import com.r0adkll.slidr.model.SlidrListener;
|
|
|
|
import com.r0adkll.slidr.model.SlidrPosition;
|
2019-11-15 16:32:25 +01:00
|
|
|
|
2019-10-09 18:49:33 +02:00
|
|
|
import org.jetbrains.annotations.NotNull;
|
2019-11-15 16:32:25 +01:00
|
|
|
|
2019-10-09 18:49:33 +02:00
|
|
|
import java.security.KeyManagementException;
|
|
|
|
import java.security.NoSuchAlgorithmException;
|
|
|
|
import java.util.Timer;
|
|
|
|
import java.util.TimerTask;
|
2019-11-15 16:32:25 +01:00
|
|
|
|
2019-10-09 18:49:33 +02:00
|
|
|
import javax.net.ssl.HttpsURLConnection;
|
2019-11-15 16:32:25 +01:00
|
|
|
|
2019-10-09 18:49:33 +02:00
|
|
|
import app.fedilab.android.R;
|
2019-10-10 19:28:16 +02:00
|
|
|
import app.fedilab.android.activities.SlideMediaActivity;
|
2019-10-09 18:49:33 +02:00
|
|
|
import app.fedilab.android.client.Entities.Attachment;
|
|
|
|
import app.fedilab.android.client.TLSSocketFactory;
|
2020-05-16 11:32:09 +02:00
|
|
|
import app.fedilab.android.helper.CacheDataSourceFactory;
|
2019-10-09 18:49:33 +02:00
|
|
|
import app.fedilab.android.helper.Helper;
|
2020-04-25 11:18:42 +02:00
|
|
|
import app.fedilab.android.webview.CustomWebview;
|
2019-10-09 18:49:33 +02:00
|
|
|
import app.fedilab.android.webview.MastalabWebChromeClient;
|
|
|
|
import app.fedilab.android.webview.MastalabWebViewClient;
|
|
|
|
|
|
|
|
import static android.content.Context.MODE_PRIVATE;
|
|
|
|
import static app.fedilab.android.helper.Helper.changeDrawableColor;
|
|
|
|
import static cafe.adriel.androidaudiorecorder.Util.formatSeconds;
|
|
|
|
import static cafe.adriel.androidaudiorecorder.Util.getDarkerColor;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Created by Thomas on 09/10/2019.
|
|
|
|
* Fragment to display media from SlideMediaActivity
|
|
|
|
*/
|
2019-10-10 19:28:16 +02:00
|
|
|
public class MediaSliderFragment extends Fragment implements MediaPlayer.OnCompletionListener {
|
|
|
|
|
2019-10-09 18:49:33 +02:00
|
|
|
|
2019-11-15 16:32:25 +01:00
|
|
|
private static final Handler HANDLER = new Handler();
|
2019-10-09 18:49:33 +02:00
|
|
|
private Context context;
|
|
|
|
private SimpleExoPlayer player;
|
|
|
|
private MediaPlayer playeraudio;
|
|
|
|
private Timer timer;
|
|
|
|
private int playerSecondsElapsed;
|
|
|
|
private String url;
|
|
|
|
private RelativeLayout loader;
|
|
|
|
private PhotoView imageView;
|
|
|
|
private TextView message_ready;
|
|
|
|
private boolean canSwipe;
|
|
|
|
private Attachment attachment;
|
|
|
|
private TextView statusView;
|
|
|
|
private TextView timerView;
|
|
|
|
private ImageButton playView;
|
|
|
|
private GLAudioVisualizationView visualizerView;
|
2020-04-08 12:42:15 +02:00
|
|
|
private View rootView;
|
2020-05-16 17:06:13 +02:00
|
|
|
private SlidrInterface slidrInterface;
|
|
|
|
private boolean swipeEnabled;
|
|
|
|
private int bgColor;
|
2019-10-10 19:28:16 +02:00
|
|
|
|
2019-10-09 18:49:33 +02:00
|
|
|
public MediaSliderFragment() {
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
2020-04-08 12:42:15 +02:00
|
|
|
rootView = inflater.inflate(R.layout.fragment_slide_media, container, false);
|
2019-10-09 18:49:33 +02:00
|
|
|
|
|
|
|
context = getContext();
|
|
|
|
Bundle bundle = this.getArguments();
|
|
|
|
|
|
|
|
if (bundle != null) {
|
|
|
|
attachment = bundle.getParcelable("attachment");
|
2020-05-16 17:06:13 +02:00
|
|
|
bgColor = bundle.getInt("bgcolor", R.color.black);
|
2019-10-12 16:02:15 +02:00
|
|
|
|
2020-05-16 17:06:13 +02:00
|
|
|
}
|
|
|
|
swipeEnabled = true;
|
2019-10-09 18:49:33 +02:00
|
|
|
message_ready = rootView.findViewById(R.id.message_ready);
|
2019-10-10 19:28:16 +02:00
|
|
|
|
|
|
|
RelativeLayout content_audio = rootView.findViewById(R.id.content_audio);
|
|
|
|
|
|
|
|
SharedPreferences sharedpreferences = context.getSharedPreferences(Helper.APP_PREFS, MODE_PRIVATE);
|
2019-10-09 18:49:33 +02:00
|
|
|
int theme = sharedpreferences.getInt(Helper.SET_THEME, Helper.THEME_DARK);
|
|
|
|
|
|
|
|
loader = rootView.findViewById(R.id.loader);
|
2019-10-10 19:28:16 +02:00
|
|
|
ImageView prev = rootView.findViewById(R.id.media_prev);
|
|
|
|
ImageView next = rootView.findViewById(R.id.media_next);
|
|
|
|
|
2019-10-09 18:49:33 +02:00
|
|
|
imageView = rootView.findViewById(R.id.media_picture);
|
2020-05-16 11:32:09 +02:00
|
|
|
PlayerView videoView = rootView.findViewById(R.id.media_video);
|
2019-10-09 18:49:33 +02:00
|
|
|
if (theme == Helper.THEME_BLACK) {
|
|
|
|
changeDrawableColor(context, prev, R.color.dark_icon);
|
|
|
|
changeDrawableColor(context, next, R.color.dark_icon);
|
|
|
|
} else if (theme == Helper.THEME_LIGHT) {
|
|
|
|
changeDrawableColor(context, prev, R.color.mastodonC4);
|
|
|
|
changeDrawableColor(context, next, R.color.mastodonC4);
|
|
|
|
} else {
|
|
|
|
changeDrawableColor(context, prev, R.color.white);
|
|
|
|
changeDrawableColor(context, next, R.color.white);
|
|
|
|
}
|
|
|
|
|
|
|
|
url = attachment.getUrl();
|
2020-04-25 19:20:42 +02:00
|
|
|
imageView.setOnMatrixChangeListener(rect -> {
|
|
|
|
canSwipe = (imageView.getScale() == 1);
|
2019-10-13 11:44:23 +02:00
|
|
|
|
2020-04-25 19:20:42 +02:00
|
|
|
if (!canSwipe) {
|
|
|
|
if (!((SlideMediaActivity) context).getFullScreen()) {
|
|
|
|
((SlideMediaActivity) context).setFullscreen(true);
|
2019-10-11 19:39:22 +02:00
|
|
|
}
|
2020-05-16 17:06:13 +02:00
|
|
|
enableSliding(false);
|
2020-04-25 19:20:42 +02:00
|
|
|
} else {
|
2020-05-16 17:06:13 +02:00
|
|
|
enableSliding(true);
|
2019-10-09 18:49:33 +02:00
|
|
|
}
|
|
|
|
});
|
2019-10-10 19:28:16 +02:00
|
|
|
ProgressBar pbar_inf = rootView.findViewById(R.id.pbar_inf);
|
2019-10-09 18:49:33 +02:00
|
|
|
String type = attachment.getType();
|
2019-10-10 19:28:16 +02:00
|
|
|
String preview_url = attachment.getPreview_url();
|
2019-10-09 18:49:33 +02:00
|
|
|
if (type.equals("unknown")) {
|
|
|
|
preview_url = attachment.getRemote_url();
|
|
|
|
if (preview_url.endsWith(".png") || preview_url.endsWith(".jpg") || preview_url.endsWith(".jpeg") || preview_url.endsWith(".gif")) {
|
|
|
|
type = "image";
|
|
|
|
} else if (preview_url.endsWith(".mp4") || preview_url.endsWith(".mp3")) {
|
|
|
|
type = "video";
|
|
|
|
}
|
|
|
|
url = attachment.getRemote_url();
|
|
|
|
attachment.setType(type);
|
|
|
|
}
|
2020-06-20 16:33:49 +02:00
|
|
|
RelativeLayout media_fragment_container = rootView.findViewById(R.id.media_fragment_container);
|
2019-10-09 18:49:33 +02:00
|
|
|
switch (type.toLowerCase()) {
|
|
|
|
case "image":
|
|
|
|
pbar_inf.setScaleY(1f);
|
|
|
|
imageView.setVisibility(View.VISIBLE);
|
|
|
|
pbar_inf.setIndeterminate(true);
|
|
|
|
loader.setVisibility(View.VISIBLE);
|
|
|
|
if (!url.endsWith(".gif")) {
|
|
|
|
Glide.with(context)
|
|
|
|
.asBitmap()
|
|
|
|
.load(preview_url).into(
|
2020-04-09 14:59:36 +02:00
|
|
|
new CustomTarget<Bitmap>() {
|
2019-10-09 18:49:33 +02:00
|
|
|
@Override
|
|
|
|
public void onResourceReady(@NonNull final Bitmap resource, Transition<? super Bitmap> transition) {
|
2020-06-20 16:33:49 +02:00
|
|
|
//Bitmap imageCompressed = Helper.compressImageIfNeeded(resource);
|
|
|
|
imageView.setImageBitmap(resource);
|
|
|
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
|
|
|
imageView.setTransitionName(attachment.getUrl());
|
|
|
|
ActivityCompat.startPostponedEnterTransition((Activity)context);
|
|
|
|
}
|
|
|
|
if (bgColor != -1) {
|
|
|
|
media_fragment_container.setBackgroundColor(bgColor);
|
|
|
|
}
|
2019-10-09 18:49:33 +02:00
|
|
|
Glide.with(context)
|
|
|
|
.asBitmap()
|
|
|
|
.load(url).into(
|
2020-04-09 14:59:36 +02:00
|
|
|
new CustomTarget<Bitmap>() {
|
2019-10-09 18:49:33 +02:00
|
|
|
@Override
|
|
|
|
public void onResourceReady(@NonNull final Bitmap resource, Transition<? super Bitmap> transition) {
|
|
|
|
loader.setVisibility(View.GONE);
|
2020-04-25 19:20:42 +02:00
|
|
|
Bitmap imageCompressed = Helper.compressImageIfNeeded(resource);
|
2019-10-09 18:49:33 +02:00
|
|
|
if (imageView.getScale() < 1.1) {
|
|
|
|
imageView.setImageBitmap(imageCompressed);
|
|
|
|
} else {
|
|
|
|
message_ready.setVisibility(View.VISIBLE);
|
|
|
|
}
|
2020-04-25 19:20:42 +02:00
|
|
|
message_ready.setOnClickListener(view -> {
|
|
|
|
imageView.setImageBitmap(imageCompressed);
|
|
|
|
message_ready.setVisibility(View.GONE);
|
2019-10-09 18:49:33 +02:00
|
|
|
});
|
|
|
|
}
|
2020-04-09 14:59:36 +02:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onLoadCleared(@Nullable Drawable placeholder) {
|
|
|
|
|
|
|
|
}
|
2019-10-09 18:49:33 +02:00
|
|
|
}
|
|
|
|
);
|
|
|
|
}
|
2020-04-09 14:59:36 +02:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onLoadCleared(@Nullable Drawable placeholder) {
|
|
|
|
|
|
|
|
}
|
2019-10-09 18:49:33 +02:00
|
|
|
}
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
loader.setVisibility(View.GONE);
|
|
|
|
Glide.with(context)
|
|
|
|
.load(url).into(imageView);
|
2020-06-20 18:57:41 +02:00
|
|
|
ActivityCompat.startPostponedEnterTransition((Activity)context);
|
2019-10-09 18:49:33 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case "video":
|
|
|
|
case "gifv":
|
2020-06-20 16:33:49 +02:00
|
|
|
if (bgColor != -1) {
|
|
|
|
media_fragment_container.setBackgroundColor(bgColor);
|
|
|
|
}
|
2019-10-09 18:49:33 +02:00
|
|
|
pbar_inf.setIndeterminate(false);
|
|
|
|
pbar_inf.setScaleY(3f);
|
|
|
|
try {
|
2019-10-10 19:28:16 +02:00
|
|
|
HttpsURLConnection.setDefaultSSLSocketFactory(new TLSSocketFactory(Helper.getLiveInstance(context)));
|
2020-03-28 17:18:23 +01:00
|
|
|
} catch (KeyManagementException | NoSuchAlgorithmException e) {
|
2019-10-09 18:49:33 +02:00
|
|
|
e.printStackTrace();
|
|
|
|
}
|
|
|
|
videoView.setVisibility(View.VISIBLE);
|
|
|
|
Uri uri = Uri.parse(url);
|
2020-05-16 11:32:09 +02:00
|
|
|
|
|
|
|
String userAgent = sharedpreferences.getString(Helper.SET_CUSTOM_USER_AGENT, Helper.USER_AGENT);
|
|
|
|
int video_cache = sharedpreferences.getInt(Helper.SET_VIDEO_CACHE, Helper.DEFAULT_VIDEO_CACHE_MB);
|
|
|
|
ProgressiveMediaSource videoSource;
|
2020-05-16 17:06:13 +02:00
|
|
|
if (video_cache == 0) {
|
2020-05-16 11:32:09 +02:00
|
|
|
DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(context,
|
|
|
|
Util.getUserAgent(context, userAgent), null);
|
|
|
|
videoSource = new ProgressiveMediaSource.Factory(dataSourceFactory)
|
|
|
|
.createMediaSource(uri);
|
2020-05-16 17:06:13 +02:00
|
|
|
} else {
|
2020-05-17 17:47:35 +02:00
|
|
|
CacheDataSourceFactory cacheDataSourceFactory = new CacheDataSourceFactory(context);
|
2020-05-16 11:32:09 +02:00
|
|
|
videoSource = new ProgressiveMediaSource.Factory(cacheDataSourceFactory)
|
|
|
|
.createMediaSource(uri);
|
|
|
|
}
|
2019-10-09 18:49:33 +02:00
|
|
|
player = ExoPlayerFactory.newSimpleInstance(context);
|
|
|
|
if (type.toLowerCase().equals("gifv"))
|
|
|
|
player.setRepeatMode(Player.REPEAT_MODE_ONE);
|
|
|
|
videoView.setPlayer(player);
|
|
|
|
loader.setVisibility(View.GONE);
|
|
|
|
player.prepare(videoSource);
|
|
|
|
player.setPlayWhenReady(true);
|
|
|
|
break;
|
|
|
|
case "web":
|
2020-06-20 16:33:49 +02:00
|
|
|
if (bgColor != -1) {
|
|
|
|
media_fragment_container.setBackgroundColor(bgColor);
|
|
|
|
}
|
2019-10-09 18:49:33 +02:00
|
|
|
loader.setVisibility(View.GONE);
|
2020-04-25 11:18:42 +02:00
|
|
|
CustomWebview webview_video = Helper.initializeWebview((Activity) context, R.id.webview_video, null);
|
2019-10-09 18:49:33 +02:00
|
|
|
webview_video.setVisibility(View.VISIBLE);
|
|
|
|
FrameLayout webview_container = rootView.findViewById(R.id.main_media_frame);
|
|
|
|
final ViewGroup videoLayout = rootView.findViewById(R.id.videoLayout);
|
|
|
|
|
2019-11-15 16:32:25 +01:00
|
|
|
MastalabWebChromeClient mastalabWebChromeClient = new MastalabWebChromeClient((Activity) context, webview_video, webview_container, videoLayout);
|
2020-03-28 17:18:23 +01:00
|
|
|
mastalabWebChromeClient.setOnToggledFullscreen(fullscreen -> {
|
|
|
|
|
|
|
|
if (fullscreen) {
|
|
|
|
videoLayout.setVisibility(View.VISIBLE);
|
|
|
|
WindowManager.LayoutParams attrs = ((Activity) context).getWindow().getAttributes();
|
|
|
|
attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
|
|
|
|
attrs.flags |= WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
|
|
|
|
((Activity) context).getWindow().setAttributes(attrs);
|
|
|
|
((Activity) context).getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);
|
|
|
|
} else {
|
|
|
|
WindowManager.LayoutParams attrs = ((Activity) context).getWindow().getAttributes();
|
|
|
|
attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN;
|
|
|
|
attrs.flags &= ~WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
|
|
|
|
((Activity) context).getWindow().setAttributes(attrs);
|
|
|
|
((Activity) context).getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
|
|
|
|
videoLayout.setVisibility(View.GONE);
|
2019-10-09 18:49:33 +02:00
|
|
|
}
|
|
|
|
});
|
|
|
|
webview_video.getSettings().setAllowFileAccess(true);
|
|
|
|
webview_video.setWebChromeClient(mastalabWebChromeClient);
|
|
|
|
webview_video.getSettings().setDomStorageEnabled(true);
|
|
|
|
webview_video.getSettings().setAppCacheEnabled(true);
|
2020-05-16 11:32:09 +02:00
|
|
|
String user_agent = sharedpreferences.getString(Helper.SET_CUSTOM_USER_AGENT, Helper.USER_AGENT);
|
2020-05-16 17:06:13 +02:00
|
|
|
webview_video.getSettings().setUserAgentString(user_agent);
|
2019-10-11 19:39:22 +02:00
|
|
|
webview_video.getSettings().setMediaPlaybackRequiresUserGesture(false);
|
2019-11-15 16:32:25 +01:00
|
|
|
webview_video.setWebViewClient(new MastalabWebViewClient((Activity) context));
|
2019-10-09 18:49:33 +02:00
|
|
|
webview_video.loadUrl(attachment.getUrl());
|
|
|
|
break;
|
|
|
|
case "audio":
|
2020-06-20 16:33:49 +02:00
|
|
|
if (bgColor != -1) {
|
|
|
|
media_fragment_container.setBackgroundColor(bgColor);
|
|
|
|
}
|
2019-10-09 18:49:33 +02:00
|
|
|
loader.setVisibility(View.GONE);
|
|
|
|
content_audio.setVisibility(View.VISIBLE);
|
|
|
|
int color = getResources().getColor(R.color.mastodonC1);
|
|
|
|
visualizerView = new GLAudioVisualizationView.Builder(context)
|
|
|
|
.setLayersCount(1)
|
|
|
|
.setWavesCount(6)
|
|
|
|
.setWavesHeight(R.dimen.aar_wave_height)
|
|
|
|
.setWavesFooterHeight(R.dimen.aar_footer_height)
|
|
|
|
.setBubblesPerLayer(20)
|
|
|
|
.setBubblesSize(R.dimen.aar_bubble_size)
|
|
|
|
.setBubblesRandomizeSize(true)
|
|
|
|
.setBackgroundColor(getDarkerColor(color))
|
|
|
|
.setLayerColors(new int[]{color})
|
|
|
|
.build();
|
|
|
|
|
|
|
|
statusView = rootView.findViewById(R.id.status);
|
|
|
|
timerView = rootView.findViewById(R.id.timer);
|
|
|
|
playView = rootView.findViewById(R.id.play);
|
|
|
|
content_audio.setBackgroundColor(getDarkerColor(color));
|
|
|
|
content_audio.addView(visualizerView, 0);
|
|
|
|
playView.setVisibility(View.INVISIBLE);
|
|
|
|
this.url = attachment.getUrl();
|
|
|
|
|
|
|
|
startPlaying();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return rootView;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void startPlaying() {
|
|
|
|
try {
|
|
|
|
|
|
|
|
playeraudio = new MediaPlayer();
|
|
|
|
playeraudio.setDataSource(url);
|
|
|
|
playeraudio.prepare();
|
|
|
|
playeraudio.start();
|
|
|
|
|
|
|
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
|
|
|
if (ContextCompat.checkSelfPermission(context, Manifest.permission.RECORD_AUDIO) ==
|
|
|
|
PackageManager.PERMISSION_GRANTED) {
|
|
|
|
visualizerView.linkTo(DbmHandler.Factory.newVisualizerHandler(context, playeraudio));
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
2020-04-25 19:20:42 +02:00
|
|
|
visualizerView.post(() -> playeraudio.setOnCompletionListener(MediaSliderFragment.this));
|
2019-10-09 18:49:33 +02:00
|
|
|
|
|
|
|
timerView.setText("00:00:00");
|
|
|
|
playView.setVisibility(View.VISIBLE);
|
|
|
|
statusView.setText(R.string.aar_playing);
|
|
|
|
statusView.setVisibility(View.VISIBLE);
|
|
|
|
playView.setImageResource(R.drawable.aar_ic_stop);
|
|
|
|
|
|
|
|
playerSecondsElapsed = 0;
|
|
|
|
startTimer();
|
|
|
|
} catch (Exception e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void stopPlaying() {
|
|
|
|
statusView.setText("");
|
|
|
|
statusView.setVisibility(View.INVISIBLE);
|
|
|
|
playView.setImageResource(R.drawable.aar_ic_play);
|
|
|
|
|
|
|
|
visualizerView.release();
|
|
|
|
|
|
|
|
if (playeraudio != null) {
|
|
|
|
try {
|
|
|
|
playeraudio.pause();
|
|
|
|
} catch (Exception ignored) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
stopTimer();
|
|
|
|
}
|
|
|
|
|
|
|
|
private void startTimer() {
|
|
|
|
stopTimer();
|
|
|
|
timer = new Timer();
|
|
|
|
timer.scheduleAtFixedRate(new TimerTask() {
|
|
|
|
@Override
|
|
|
|
public void run() {
|
|
|
|
updateTimer();
|
|
|
|
}
|
|
|
|
}, 0, 1000);
|
|
|
|
}
|
|
|
|
|
|
|
|
private void updateTimer() {
|
2020-04-25 19:20:42 +02:00
|
|
|
((Activity) context).runOnUiThread(() -> {
|
|
|
|
playerSecondsElapsed++;
|
|
|
|
timerView.setText(formatSeconds(playerSecondsElapsed));
|
2019-10-09 18:49:33 +02:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
private void stopTimer() {
|
|
|
|
if (timer != null) {
|
|
|
|
timer.cancel();
|
|
|
|
timer.purge();
|
|
|
|
timer = null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private boolean isPlaying() {
|
|
|
|
try {
|
|
|
|
return playeraudio != null && playeraudio.isPlaying();
|
|
|
|
} catch (Exception e) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-04-25 19:20:42 +02:00
|
|
|
public void togglePlaying() {
|
2019-10-13 15:44:39 +02:00
|
|
|
|
2020-03-28 17:18:23 +01:00
|
|
|
HANDLER.postDelayed(() -> {
|
|
|
|
if (isPlaying()) {
|
|
|
|
stopPlaying();
|
|
|
|
} else {
|
|
|
|
startPlaying();
|
2019-10-13 15:44:39 +02:00
|
|
|
}
|
|
|
|
}, 100);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2019-10-09 18:49:33 +02:00
|
|
|
@Override
|
|
|
|
public void onCreate(Bundle saveInstance) {
|
|
|
|
super.onCreate(saveInstance);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onAttach(@NotNull Context context) {
|
|
|
|
super.onAttach(context);
|
|
|
|
this.context = context;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onPause() {
|
|
|
|
super.onPause();
|
|
|
|
if (player != null) {
|
|
|
|
player.setPlayWhenReady(false);
|
|
|
|
}
|
|
|
|
if (playeraudio != null) {
|
|
|
|
playeraudio.pause();
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
visualizerView.onPause();
|
|
|
|
} catch (Exception ignored) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onDestroy() {
|
|
|
|
try {
|
|
|
|
if (visualizerView != null) {
|
|
|
|
visualizerView.release();
|
|
|
|
}
|
|
|
|
if (player != null) {
|
|
|
|
player.release();
|
|
|
|
}
|
|
|
|
if (playeraudio != null) {
|
|
|
|
playeraudio.release();
|
|
|
|
}
|
|
|
|
} catch (Exception ignored) {
|
|
|
|
}
|
2020-05-16 11:32:09 +02:00
|
|
|
if (timer != null) {
|
|
|
|
timer.cancel();
|
|
|
|
timer = null;
|
|
|
|
}
|
2019-10-09 18:49:33 +02:00
|
|
|
super.onDestroy();
|
|
|
|
}
|
|
|
|
|
2020-04-08 12:42:15 +02:00
|
|
|
@Override
|
|
|
|
public void onDestroyView() {
|
|
|
|
super.onDestroyView();
|
|
|
|
rootView = null;
|
|
|
|
}
|
|
|
|
|
2019-10-09 18:49:33 +02:00
|
|
|
@Override
|
|
|
|
public void onResume() {
|
|
|
|
super.onResume();
|
|
|
|
if (player != null) {
|
|
|
|
player.setPlayWhenReady(true);
|
|
|
|
}
|
|
|
|
if (playeraudio != null) {
|
|
|
|
playeraudio.start();
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
visualizerView.onResume();
|
2020-04-08 12:42:15 +02:00
|
|
|
} catch (Exception ignored) {
|
|
|
|
}
|
2020-05-16 17:06:13 +02:00
|
|
|
if (slidrInterface == null && rootView != null) {
|
|
|
|
slidrInterface = Slidr.replace(rootView.findViewById(R.id.media_fragment_container), new SlidrConfig.Builder().sensitivity(1f)
|
|
|
|
.scrimColor(Color.BLACK)
|
|
|
|
.scrimStartAlpha(0.8f)
|
|
|
|
.scrimEndAlpha(0f)
|
|
|
|
.position(SlidrPosition.VERTICAL)
|
|
|
|
.velocityThreshold(2400)
|
|
|
|
.distanceThreshold(0.25f)
|
|
|
|
.edgeSize(0.18f)
|
|
|
|
.listener(new SlidrListener() {
|
|
|
|
@Override
|
|
|
|
public void onSlideStateChanged(int state) {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onSlideChange(float percent) {
|
|
|
|
((SlideMediaActivity) context).setFullscreen(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onSlideOpened() {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean onSlideClosed() {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.build());
|
|
|
|
}
|
2019-10-09 18:49:33 +02:00
|
|
|
}
|
|
|
|
|
2020-05-16 17:06:13 +02:00
|
|
|
private void enableSliding(boolean enable) {
|
|
|
|
if (enable && !swipeEnabled) {
|
|
|
|
slidrInterface.unlock();
|
|
|
|
swipeEnabled = true;
|
|
|
|
} else if (!enable && swipeEnabled) {
|
|
|
|
slidrInterface.lock();
|
|
|
|
swipeEnabled = false;
|
|
|
|
}
|
|
|
|
}
|
2019-10-09 18:49:33 +02:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onCompletion(MediaPlayer mp) {
|
|
|
|
stopPlaying();
|
|
|
|
}
|
|
|
|
}
|