|
20 | 20 |
|
21 | 21 | import android.annotation.SuppressLint;
|
22 | 22 | import android.app.Activity;
|
| 23 | +import android.content.BroadcastReceiver; |
| 24 | +import android.content.Context; |
23 | 25 | import android.content.DialogInterface;
|
24 | 26 | import android.content.Intent;
|
| 27 | +import android.content.IntentFilter; |
| 28 | +import android.media.AudioManager; |
| 29 | +import android.media.MediaPlayer; |
25 | 30 | import android.net.Uri;
|
26 | 31 | import android.os.Bundle;
|
27 | 32 | import android.text.TextUtils;
|
| 33 | +import android.util.Base64; |
28 | 34 | import android.view.LayoutInflater;
|
29 | 35 | import android.view.MotionEvent;
|
30 | 36 | import android.view.View;
|
|
70 | 76 | import org.matrix.androidsdk.rest.model.message.Message;
|
71 | 77 | import org.matrix.androidsdk.rest.model.message.VideoMessage;
|
72 | 78 |
|
| 79 | +import java.io.BufferedInputStream; |
73 | 80 | import java.io.File;
|
| 81 | +import java.io.FileInputStream; |
| 82 | +import java.io.IOException; |
74 | 83 | import java.util.ArrayList;
|
75 | 84 | import java.util.Collections;
|
76 | 85 | import java.util.HashMap;
|
@@ -110,6 +119,19 @@ public class VectorMessageListFragment extends MatrixMessageListFragment<VectorM
|
110 | 119 | private String mPendingFilename;
|
111 | 120 | private EncryptedFileInfo mPendingEncryptedFileInfo;
|
112 | 121 |
|
| 122 | + private Map<String, MediaPlayer> mMediaPlayers = new HashMap<>(); |
| 123 | + private IntentFilter mBecomingNoisyIntentFilter = new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY); |
| 124 | + private BroadcastReceiver mBecomingNoisyReceiver = new BroadcastReceiver() { |
| 125 | + @Override |
| 126 | + public void onReceive(Context context, Intent intent) { |
| 127 | + if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent.getAction())) { |
| 128 | + for (MediaPlayer mp : mMediaPlayers.values()) { |
| 129 | + mp.pause(); |
| 130 | + } |
| 131 | + } |
| 132 | + } |
| 133 | + }; |
| 134 | + |
113 | 135 | private static int VERIF_REQ_CODE = 12;
|
114 | 136 |
|
115 | 137 | public interface VectorMessageListFragmentListener {
|
@@ -248,18 +270,32 @@ protected String getMatrixMessagesFragmentTag() {
|
248 | 270 | public void onPause() {
|
249 | 271 | super.onPause();
|
250 | 272 |
|
251 |
| - mAdapter.setVectorMessagesAdapterActionsListener(null); |
| 273 | + for (MediaPlayer mediaPlayer : mMediaPlayers.values()) { |
| 274 | + mediaPlayer.pause(); |
| 275 | + } |
| 276 | + getContext().unregisterReceiver(mBecomingNoisyReceiver); |
| 277 | + mAdapter.setVectorMessagesAdapterActionsListener(null, mMediaPlayers); |
252 | 278 | mAdapter.onPause();
|
253 | 279 |
|
254 | 280 | mVectorImageGetter.setListener(null);
|
255 | 281 | }
|
256 | 282 |
|
| 283 | + @Override |
| 284 | + public void onDestroy() { |
| 285 | + super.onDestroy(); |
| 286 | + |
| 287 | + for (MediaPlayer mediaPlayer : mMediaPlayers.values()) { |
| 288 | + mediaPlayer.stop(); |
| 289 | + mediaPlayer.release(); |
| 290 | + } |
| 291 | + } |
257 | 292 |
|
258 | 293 | @Override
|
259 | 294 | public void onResume() {
|
260 | 295 | super.onResume();
|
261 | 296 |
|
262 |
| - mAdapter.setVectorMessagesAdapterActionsListener(this); |
| 297 | + getContext().registerReceiver(mBecomingNoisyReceiver, mBecomingNoisyIntentFilter); |
| 298 | + mAdapter.setVectorMessagesAdapterActionsListener(this, mMediaPlayers); |
263 | 299 |
|
264 | 300 | mVectorImageGetter.setListener(new VectorImageGetter.OnImageDownloadListener() {
|
265 | 301 | @Override
|
@@ -752,6 +788,20 @@ public void onDismiss(DialogInterface dialog) {
|
752 | 788 | }
|
753 | 789 | })
|
754 | 790 | .show();
|
| 791 | + } else if (action == R.id.ic_action_play_audio) { |
| 792 | + Message message = JsonUtils.toMessage(event.getContent()); |
| 793 | + FileMessage fileMessage = JsonUtils.toFileMessage(event.getContent()); |
| 794 | + |
| 795 | + if (null != fileMessage.getUrl()) { |
| 796 | + onMediaAction(ACTION_VECTOR_OPEN, fileMessage.getUrl(), fileMessage.getMimeType(), fileMessage.body, fileMessage.file); |
| 797 | + } |
| 798 | + } else if (action == R.id.ic_action_pause_audio) { |
| 799 | + Message message = JsonUtils.toMessage(event.getContent()); |
| 800 | + FileMessage fileMessage = JsonUtils.toFileMessage(event.getContent()); |
| 801 | + |
| 802 | + if (null != fileMessage.getUrl() && mMediaPlayers.containsKey(fileMessage.getUrl())) { |
| 803 | + mMediaPlayers.get(fileMessage.getUrl()).pause(); |
| 804 | + } |
755 | 805 | }
|
756 | 806 | }
|
757 | 807 |
|
@@ -894,7 +944,37 @@ public void onSuccess(File file) {
|
894 | 944 | return;
|
895 | 945 | }
|
896 | 946 |
|
897 |
| - if (menuAction == ACTION_VECTOR_SAVE || menuAction == ACTION_VECTOR_OPEN) { |
| 947 | + if (menuAction == ACTION_VECTOR_OPEN && mediaMimeType.startsWith("audio/")) { |
| 948 | + Log.e(LOG_TAG, "Using Media player " + file.getAbsolutePath()); |
| 949 | + |
| 950 | + for (MediaPlayer mp : mMediaPlayers.values()) { |
| 951 | + mp.pause(); |
| 952 | + } |
| 953 | + |
| 954 | + MediaPlayer mediaPlayer; |
| 955 | + if (!mMediaPlayers.containsKey(mediaUrl)) { |
| 956 | + mediaPlayer = new MediaPlayer(); |
| 957 | + mMediaPlayers.put(mediaUrl, mediaPlayer); |
| 958 | + mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); |
| 959 | + try { |
| 960 | + int size = (int) file.length(); |
| 961 | + byte[] callData = new byte[size]; |
| 962 | + BufferedInputStream buf = new BufferedInputStream(new FileInputStream(file)); |
| 963 | + buf.read(callData, 0, callData.length); |
| 964 | + buf.close(); |
| 965 | + String base64EncodedString = Base64.encodeToString(callData, Base64.DEFAULT); |
| 966 | + |
| 967 | + String url = "data:audio/amr;base64," + base64EncodedString; |
| 968 | + mediaPlayer.setDataSource(url); |
| 969 | + mediaPlayer.prepare(); |
| 970 | + } catch (IOException e) { |
| 971 | + e.printStackTrace(); |
| 972 | + } |
| 973 | + } else { |
| 974 | + mediaPlayer = mMediaPlayers.get(mediaUrl); |
| 975 | + } |
| 976 | + mediaPlayer.start(); |
| 977 | + } else if (menuAction == ACTION_VECTOR_SAVE || menuAction == ACTION_VECTOR_OPEN) { |
898 | 978 | if (PermissionsToolsKt.checkPermissions(PermissionsToolsKt.PERMISSIONS_FOR_WRITING_FILES,
|
899 | 979 | VectorMessageListFragment.this, PermissionsToolsKt.PERMISSION_REQUEST_CODE)) {
|
900 | 980 | CommonActivityUtils.saveMediaIntoDownloads(getActivity(), file, trimmedFileName, mediaMimeType, new SimpleApiCallback<String>() {
|
@@ -1152,7 +1232,7 @@ public void onContentClick(int position) {
|
1152 | 1232 |
|
1153 | 1233 | getActivity().startActivity(viewImageIntent);
|
1154 | 1234 | }
|
1155 |
| - } else if (Message.MSGTYPE_FILE.equals(message.msgtype) || Message.MSGTYPE_AUDIO.equals(message.msgtype)) { |
| 1235 | + } else if (Message.MSGTYPE_FILE.equals(message.msgtype)) { |
1156 | 1236 | FileMessage fileMessage = JsonUtils.toFileMessage(event.getContent());
|
1157 | 1237 |
|
1158 | 1238 | if (null != fileMessage.getUrl()) {
|
|
0 commit comments