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,8 +119,22 @@ public class VectorMessageListFragment extends MatrixMessageListFragment<VectorM
110
119
private String mPendingFilename ;
111
120
private EncryptedFileInfo mPendingEncryptedFileInfo ;
112
121
122
+ private IntentFilter mBecomingNoisyIntentFilter = new IntentFilter (AudioManager .ACTION_AUDIO_BECOMING_NOISY );
123
+ private BroadcastReceiver mBecomingNoisyReceiver = new BroadcastReceiver () {
124
+ @ Override
125
+ public void onReceive (Context context , Intent intent ) {
126
+ if (AudioManager .ACTION_AUDIO_BECOMING_NOISY .equals (intent .getAction ())) {
127
+ for (MediaPlayer mp : mMediaPlayers .values ()) {
128
+ mp .pause ();
129
+ }
130
+ }
131
+ }
132
+ };
133
+
113
134
private static int VERIF_REQ_CODE = 12 ;
114
135
136
+ private HashMap <String , MediaPlayer > mMediaPlayers ;
137
+
115
138
public interface VectorMessageListFragmentListener {
116
139
/**
117
140
* Display a spinner to warn the user that a back pagination is in progress.
@@ -217,6 +240,8 @@ public void onItemClick(AdapterView<?> parent, View view, int position, long id)
217
240
}
218
241
});
219
242
243
+ mMediaPlayers = new HashMap <>();
244
+
220
245
v .setBackgroundColor (ThemeUtils .INSTANCE .getColor (getActivity (), android .R .attr .colorBackground ));
221
246
222
247
return v ;
@@ -248,7 +273,11 @@ protected String getMatrixMessagesFragmentTag() {
248
273
public void onPause () {
249
274
super .onPause ();
250
275
251
- mAdapter .setVectorMessagesAdapterActionsListener (null );
276
+ for (MediaPlayer mediaPlayer : mMediaPlayers .values ()) {
277
+ mediaPlayer .pause ();
278
+ }
279
+ getContext ().unregisterReceiver (mBecomingNoisyReceiver );
280
+ mAdapter .setVectorMessagesAdapterActionsListener (null , mMediaPlayers );
252
281
mAdapter .onPause ();
253
282
254
283
mVectorImageGetter .setListener (null );
@@ -259,7 +288,8 @@ public void onPause() {
259
288
public void onResume () {
260
289
super .onResume ();
261
290
262
- mAdapter .setVectorMessagesAdapterActionsListener (this );
291
+ getContext ().registerReceiver (mBecomingNoisyReceiver , mBecomingNoisyIntentFilter );
292
+ mAdapter .setVectorMessagesAdapterActionsListener (this , mMediaPlayers );
263
293
264
294
mVectorImageGetter .setListener (new VectorImageGetter .OnImageDownloadListener () {
265
295
@ Override
@@ -752,6 +782,20 @@ public void onDismiss(DialogInterface dialog) {
752
782
}
753
783
})
754
784
.show ();
785
+ } else if (action == R .id .ic_action_play_audio ) {
786
+ Message message = JsonUtils .toMessage (event .getContent ());
787
+ FileMessage fileMessage = JsonUtils .toFileMessage (event .getContent ());
788
+
789
+ if (null != fileMessage .getUrl ()) {
790
+ onMediaAction (ACTION_VECTOR_OPEN , fileMessage .getUrl (), fileMessage .getMimeType (), fileMessage .body , fileMessage .file );
791
+ }
792
+ } else if (action == R .id .ic_action_pause_audio ) {
793
+ Message message = JsonUtils .toMessage (event .getContent ());
794
+ FileMessage fileMessage = JsonUtils .toFileMessage (event .getContent ());
795
+
796
+ if (null != fileMessage .getUrl () && mMediaPlayers .containsKey (fileMessage .getUrl ())) {
797
+ mMediaPlayers .get (fileMessage .getUrl ()).pause ();
798
+ }
755
799
}
756
800
}
757
801
@@ -894,7 +938,37 @@ public void onSuccess(File file) {
894
938
return ;
895
939
}
896
940
897
- if (menuAction == ACTION_VECTOR_SAVE || menuAction == ACTION_VECTOR_OPEN ) {
941
+ if (menuAction == ACTION_VECTOR_OPEN && mediaMimeType .startsWith ("audio/" )) {
942
+ Log .e (LOG_TAG , "Using Media player " + file .getAbsolutePath ());
943
+
944
+ for (MediaPlayer mp : mMediaPlayers .values ()) {
945
+ mp .pause ();
946
+ }
947
+
948
+ MediaPlayer mediaPlayer ;
949
+ if (!mMediaPlayers .containsKey (mediaUrl )) {
950
+ mediaPlayer = new MediaPlayer ();
951
+ mMediaPlayers .put (mediaUrl , mediaPlayer );
952
+ mediaPlayer .setAudioStreamType (AudioManager .STREAM_MUSIC );
953
+ try {
954
+ int size = (int ) file .length ();
955
+ byte [] callData = new byte [size ];
956
+ BufferedInputStream buf = new BufferedInputStream (new FileInputStream (file ));
957
+ buf .read (callData , 0 , callData .length );
958
+ buf .close ();
959
+ String base64EncodedString = Base64 .encodeToString (callData , Base64 .DEFAULT );
960
+
961
+ String url = "data:audio/amr;base64," + base64EncodedString ;
962
+ mediaPlayer .setDataSource (url );
963
+ mediaPlayer .prepare ();
964
+ } catch (IOException e ) {
965
+ e .printStackTrace ();
966
+ }
967
+ } else {
968
+ mediaPlayer = mMediaPlayers .get (mediaUrl );
969
+ }
970
+ mediaPlayer .start ();
971
+ } else if (menuAction == ACTION_VECTOR_SAVE || menuAction == ACTION_VECTOR_OPEN ) {
898
972
if (PermissionsToolsKt .checkPermissions (PermissionsToolsKt .PERMISSIONS_FOR_WRITING_FILES ,
899
973
VectorMessageListFragment .this , PermissionsToolsKt .PERMISSION_REQUEST_CODE )) {
900
974
CommonActivityUtils .saveMediaIntoDownloads (getActivity (), file , trimmedFileName , mediaMimeType , new SimpleApiCallback <String >() {
@@ -1152,7 +1226,7 @@ public void onContentClick(int position) {
1152
1226
1153
1227
getActivity ().startActivity (viewImageIntent );
1154
1228
}
1155
- } else if (Message .MSGTYPE_FILE .equals (message .msgtype ) || Message . MSGTYPE_AUDIO . equals ( message . msgtype ) ) {
1229
+ } else if (Message .MSGTYPE_FILE .equals (message .msgtype )) {
1156
1230
FileMessage fileMessage = JsonUtils .toFileMessage (event .getContent ());
1157
1231
1158
1232
if (null != fileMessage .getUrl ()) {
0 commit comments