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