audio player now requests permission when hitting play

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/ui/ConversationActivity.java   |  4 
src/main/java/eu/siacs/conversations/ui/ConversationFragment.java   |  7 
src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java |  9 
src/main/java/eu/siacs/conversations/ui/service/AudioPlayer.java    | 23 
4 files changed, 43 insertions(+)

Detailed changes

src/main/java/eu/siacs/conversations/ui/ConversationActivity.java 🔗

@@ -85,6 +85,7 @@ public class ConversationActivity extends XmppActivity implements OnConversation
 	public static final String EXTRA_IS_PRIVATE_MESSAGE = "pm";
 
 	public static final int REQUEST_OPEN_MESSAGE = 0x9876;
+	public static final int REQUEST_PLAY_PAUSE = 0x5432;
 
 
 	//secondary fragment (when holding the conversation, must be initialized before refreshing the overview fragment
@@ -291,6 +292,9 @@ public class ConversationActivity extends XmppActivity implements OnConversation
 						refreshUiReal();
 						ConversationFragment.openPendingMessage(this);
 						break;
+					case REQUEST_PLAY_PAUSE:
+						ConversationFragment.startStopPending(this);
+						break;
 				}
 			}
 		}

src/main/java/eu/siacs/conversations/ui/ConversationFragment.java 🔗

@@ -424,6 +424,13 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
 		return null;
 	}
 
+	public static void startStopPending(Activity activity) {
+		ConversationFragment fragment = findConversationFragment(activity);
+		if (fragment != null) {
+			fragment.messageListAdapter.startStopPending();
+		}
+	}
+
 	public static void downloadFile(Activity activity, Message message) {
 		ConversationFragment fragment = findConversationFragment(activity);
 		if (fragment != null) {

src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java 🔗

@@ -1,6 +1,7 @@
 package eu.siacs.conversations.ui.adapter;
 
 import android.Manifest;
+import android.app.Activity;
 import android.content.ActivityNotFoundException;
 import android.content.Intent;
 import android.content.SharedPreferences;
@@ -182,6 +183,10 @@ public class MessageAdapter extends ArrayAdapter<Message> implements CopyTextVie
 		this.mOnContactPictureClickedListener = listener;
 	}
 
+	public Activity getActivity() {
+		return activity;
+	}
+
 	public void setOnContactPictureLongClicked(
 			OnContactPictureLongClicked listener) {
 		this.mOnContactPictureLongClickedListener = listener;
@@ -903,6 +908,10 @@ public class MessageAdapter extends ArrayAdapter<Message> implements CopyTextVie
 		audioPlayer.stop();
 	}
 
+	public void startStopPending() {
+		audioPlayer.startStopPending();
+	}
+
 	public void openDownloadable(Message message) {
 		if (ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
 			ConversationFragment.registerPendingMessage(activity, message);

src/main/java/eu/siacs/conversations/ui/service/AudioPlayer.java 🔗

@@ -1,9 +1,13 @@
 package eu.siacs.conversations.ui.service;
 
+import android.Manifest;
+import android.content.pm.PackageManager;
 import android.content.res.ColorStateList;
+import android.media.Image;
 import android.media.MediaPlayer;
 import android.os.Build;
 import android.os.Handler;
+import android.support.v4.app.ActivityCompat;
 import android.support.v4.content.ContextCompat;
 import android.view.View;
 import android.widget.ImageButton;
@@ -16,7 +20,9 @@ import java.util.Locale;
 
 import eu.siacs.conversations.R;
 import eu.siacs.conversations.entities.Message;
+import eu.siacs.conversations.ui.ConversationActivity;
 import eu.siacs.conversations.ui.adapter.MessageAdapter;
+import eu.siacs.conversations.ui.util.PendingItem;
 import eu.siacs.conversations.utils.WeakReferenceSet;
 
 public class AudioPlayer implements View.OnClickListener, MediaPlayer.OnCompletionListener, SeekBar.OnSeekBarChangeListener, Runnable {
@@ -28,6 +34,8 @@ public class AudioPlayer implements View.OnClickListener, MediaPlayer.OnCompleti
 	private final MessageAdapter messageAdapter;
 	private final WeakReferenceSet<RelativeLayout> audioPlayerLayouts = new WeakReferenceSet<>();
 
+	private final PendingItem<WeakReference<ImageButton>> pendingOnClickView = new PendingItem<>();
+
 	private final Handler handler = new Handler();
 
 	public AudioPlayer(MessageAdapter adapter) {
@@ -97,6 +105,11 @@ public class AudioPlayer implements View.OnClickListener, MediaPlayer.OnCompleti
 	}
 
 	private void startStop(ImageButton playPause) {
+		if (ContextCompat.checkSelfPermission(messageAdapter.getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
+			pendingOnClickView.push(new WeakReference<>(playPause));
+			ActivityCompat.requestPermissions(messageAdapter.getActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, ConversationActivity.REQUEST_PLAY_PAUSE);
+			return;
+		}
 		final RelativeLayout audioPlayer = (RelativeLayout) playPause.getParent();
 		final ViewHolder viewHolder = ViewHolder.get(audioPlayer);
 		final Message message = (Message) audioPlayer.getTag();
@@ -143,6 +156,16 @@ public class AudioPlayer implements View.OnClickListener, MediaPlayer.OnCompleti
 		}
 	}
 
+	public void startStopPending() {
+		WeakReference<ImageButton> reference = pendingOnClickView.pop();
+		if (reference != null) {
+			ImageButton imageButton = reference.get();
+			if (imageButton != null) {
+				startStop(imageButton);
+			}
+		}
+	}
+
 	private boolean startStop(ViewHolder viewHolder, Message message) {
 		if (message == currentlyPlayingMessage && player != null) {
 			return playPauseCurrent(viewHolder);