Audio player in the context menu
This commit is contained in:
parent
c73cedc019
commit
483063cf7a
2 changed files with 128 additions and 81 deletions
|
@ -15,6 +15,7 @@ import net.osmand.plus.activities.MapActivity;
|
||||||
import net.osmand.plus.audionotes.AudioVideoNotesPlugin.Recording;
|
import net.osmand.plus.audionotes.AudioVideoNotesPlugin.Recording;
|
||||||
import net.osmand.plus.mapcontextmenu.MapContextMenuFragment;
|
import net.osmand.plus.mapcontextmenu.MapContextMenuFragment;
|
||||||
import net.osmand.plus.mapcontextmenu.MenuController;
|
import net.osmand.plus.mapcontextmenu.MenuController;
|
||||||
|
import net.osmand.util.Algorithms;
|
||||||
|
|
||||||
import java.lang.ref.WeakReference;
|
import java.lang.ref.WeakReference;
|
||||||
|
|
||||||
|
@ -32,20 +33,14 @@ public class AudioVideoNoteMenuController extends MenuController {
|
||||||
@Override
|
@Override
|
||||||
public void buttonPressed() {
|
public void buttonPressed() {
|
||||||
if (plugin != null) {
|
if (plugin != null) {
|
||||||
plugin.playRecording(getMapActivity(), getRecording());
|
if (plugin.isPlaying(getRecording())) {
|
||||||
|
plugin.stopPlaying();
|
||||||
|
} else {
|
||||||
|
plugin.playRecording(getMapActivity(), getRecording());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
if (!recording.isPhoto()) {
|
|
||||||
leftTitleButtonController.caption = getMapActivity().getString(R.string.recording_context_menu_play);
|
|
||||||
leftTitleButtonController.leftIconId = R.drawable.ic_play_dark;
|
|
||||||
String durationStr = recording.getPlainDuration();
|
|
||||||
leftTitleButtonController.needRightText = true;
|
|
||||||
leftTitleButtonController.rightTextCaption = "— " + durationStr;
|
|
||||||
} else {
|
|
||||||
leftTitleButtonController.caption = getMapActivity().getString(R.string.recording_context_menu_show);
|
|
||||||
leftTitleButtonController.leftIconId = R.drawable.ic_action_view;
|
|
||||||
}
|
|
||||||
|
|
||||||
rightTitleButtonController = new TitleButtonController() {
|
rightTitleButtonController = new TitleButtonController() {
|
||||||
@Override
|
@Override
|
||||||
|
@ -68,6 +63,8 @@ public class AudioVideoNoteMenuController extends MenuController {
|
||||||
};
|
};
|
||||||
rightTitleButtonController.caption = getMapActivity().getString(R.string.shared_string_delete);
|
rightTitleButtonController.caption = getMapActivity().getString(R.string.shared_string_delete);
|
||||||
rightTitleButtonController.leftIconId = R.drawable.ic_action_delete_dark;
|
rightTitleButtonController.leftIconId = R.drawable.ic_action_delete_dark;
|
||||||
|
|
||||||
|
updateData();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -117,6 +114,36 @@ public class AudioVideoNoteMenuController extends MenuController {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateData() {
|
||||||
|
rightTitleButtonController.visible = true;
|
||||||
|
if (!recording.isPhoto()) {
|
||||||
|
if (plugin.isPlaying(recording)) {
|
||||||
|
leftTitleButtonController.caption = getMapActivity().getString(R.string.shared_string_control_stop);
|
||||||
|
leftTitleButtonController.leftIconId = R.drawable.ic_action_rec_stop;
|
||||||
|
int pos = plugin.getPlayingPosition();
|
||||||
|
String durationStr;
|
||||||
|
if (pos == -1) {
|
||||||
|
durationStr = recording.getPlainDuration();
|
||||||
|
} else {
|
||||||
|
durationStr = Algorithms.formatDuration(pos / 1000);
|
||||||
|
}
|
||||||
|
leftTitleButtonController.needRightText = true;
|
||||||
|
leftTitleButtonController.rightTextCaption = "— " + durationStr;
|
||||||
|
rightTitleButtonController.visible = false;
|
||||||
|
} else {
|
||||||
|
leftTitleButtonController.caption = getMapActivity().getString(R.string.recording_context_menu_play);
|
||||||
|
leftTitleButtonController.leftIconId = R.drawable.ic_play_dark;
|
||||||
|
String durationStr = recording.getPlainDuration();
|
||||||
|
leftTitleButtonController.needRightText = true;
|
||||||
|
leftTitleButtonController.rightTextCaption = "— " + durationStr;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
leftTitleButtonController.caption = getMapActivity().getString(R.string.recording_context_menu_show);
|
||||||
|
leftTitleButtonController.leftIconId = R.drawable.ic_action_view;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void share(LatLon latLon, String title) {
|
public void share(LatLon latLon, String title) {
|
||||||
Intent sharingIntent = new Intent(Intent.ACTION_SEND);
|
Intent sharingIntent = new Intent(Intent.ACTION_SEND);
|
||||||
|
|
|
@ -7,10 +7,6 @@ import android.content.DialogInterface;
|
||||||
import android.content.DialogInterface.OnClickListener;
|
import android.content.DialogInterface.OnClickListener;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.res.AssetFileDescriptor;
|
import android.content.res.AssetFileDescriptor;
|
||||||
import android.graphics.Bitmap;
|
|
||||||
import android.graphics.BitmapFactory;
|
|
||||||
import android.graphics.BitmapFactory.Options;
|
|
||||||
import android.graphics.Matrix;
|
|
||||||
import android.hardware.Camera;
|
import android.hardware.Camera;
|
||||||
import android.hardware.Camera.Parameters;
|
import android.hardware.Camera.Parameters;
|
||||||
import android.hardware.Camera.PictureCallback;
|
import android.hardware.Camera.PictureCallback;
|
||||||
|
@ -32,7 +28,6 @@ import android.view.SurfaceView;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
import android.widget.ArrayAdapter;
|
import android.widget.ArrayAdapter;
|
||||||
import android.widget.ImageView;
|
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import net.osmand.AndroidUtils;
|
import net.osmand.AndroidUtils;
|
||||||
|
@ -84,6 +79,8 @@ import java.util.Iterator;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Timer;
|
||||||
|
import java.util.TimerTask;
|
||||||
|
|
||||||
|
|
||||||
public class AudioVideoNotesPlugin extends OsmandPlugin {
|
public class AudioVideoNotesPlugin extends OsmandPlugin {
|
||||||
|
@ -154,6 +151,10 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
|
||||||
private CurrentRecording currentRecording;
|
private CurrentRecording currentRecording;
|
||||||
private boolean recordingDone;
|
private boolean recordingDone;
|
||||||
|
|
||||||
|
private MediaPlayer player;
|
||||||
|
private Recording recordingPlaying;
|
||||||
|
private Timer playerTimer;
|
||||||
|
|
||||||
private final static char SPLIT_DESC = ' ';
|
private final static char SPLIT_DESC = ' ';
|
||||||
|
|
||||||
public enum AVActionType {
|
public enum AVActionType {
|
||||||
|
@ -302,7 +303,7 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isVideo() {
|
public boolean isVideo() {
|
||||||
return file.getName().endsWith(MPEG4_EXTENSION) || file.getName().endsWith(THREEGP_EXTENSION);
|
return file.getName().endsWith(MPEG4_EXTENSION);// || file.getName().endsWith(THREEGP_EXTENSION);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isAudio() {
|
public boolean isAudio() {
|
||||||
|
@ -1404,6 +1405,49 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isPlaying() {
|
||||||
|
try {
|
||||||
|
return player != null && player.isPlaying();
|
||||||
|
} catch (Exception e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isPlaying(Recording r) {
|
||||||
|
return isPlaying() && recordingPlaying == r;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getPlayingPosition() {
|
||||||
|
if (isPlaying()) {
|
||||||
|
return player.getCurrentPosition();
|
||||||
|
} else if (player != null) {
|
||||||
|
return player.getDuration();
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stopPlaying() {
|
||||||
|
if (isPlaying()) {
|
||||||
|
try {
|
||||||
|
player.stop();
|
||||||
|
} finally {
|
||||||
|
player.release();
|
||||||
|
player = null;
|
||||||
|
updateContextMenu();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateContextMenu() {
|
||||||
|
app.runInUIThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
getMapActivity().getContextMenu().updateMenuUI();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public void playRecording(final Context ctx, final Recording r) {
|
public void playRecording(final Context ctx, final Recording r) {
|
||||||
if (r.isVideo()) {
|
if (r.isVideo()) {
|
||||||
Intent vint = new Intent(Intent.ACTION_VIEW);
|
Intent vint = new Intent(Intent.ACTION_VIEW);
|
||||||
|
@ -1423,75 +1467,51 @@ public class AudioVideoNotesPlugin extends OsmandPlugin {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final MediaPlayer player = r.isPhoto() ? null : new MediaPlayer();
|
if (isPlaying()) {
|
||||||
final AccessibleAlertBuilder dlg = new AccessibleAlertBuilder(ctx);
|
stopPlaying();
|
||||||
dlg.setPositiveButton(R.string.recording_open_external_player, new OnClickListener() {
|
}
|
||||||
|
recordingPlaying = r;
|
||||||
@Override
|
player = new MediaPlayer();
|
||||||
public void onClick(DialogInterface v, int w) {
|
|
||||||
if (player == null) {
|
|
||||||
Intent vint = new Intent(Intent.ACTION_VIEW);
|
|
||||||
vint.setDataAndType(Uri.fromFile(r.file), "image/*");
|
|
||||||
vint.setFlags(0x10000000);
|
|
||||||
ctx.startActivity(vint);
|
|
||||||
} else {
|
|
||||||
if (player.isPlaying()) {
|
|
||||||
player.stop();
|
|
||||||
}
|
|
||||||
Intent vint = new Intent(Intent.ACTION_VIEW);
|
|
||||||
vint.setDataAndType(Uri.fromFile(r.file), "video/*");
|
|
||||||
vint.setFlags(0x10000000);
|
|
||||||
try {
|
|
||||||
ctx.startActivity(vint);
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
dlg.setNegativeButton(R.string.shared_string_cancel, new OnClickListener() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
|
||||||
if (player != null && player.isPlaying()) {
|
|
||||||
player.stop();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
try {
|
try {
|
||||||
if (r.isPhoto()) {
|
player.setDataSource(r.file.getAbsolutePath());
|
||||||
ImageView img = new ImageView(ctx);
|
player.setOnPreparedListener(new OnPreparedListener() {
|
||||||
Options opts = new Options();
|
|
||||||
opts.inSampleSize = 4;
|
|
||||||
int rot = r.getBitmapRotation();
|
|
||||||
Bitmap bmp = BitmapFactory.decodeFile(r.file.getAbsolutePath(), opts);
|
|
||||||
if (rot != 0) {
|
|
||||||
Matrix matrix = new Matrix();
|
|
||||||
matrix.postRotate(rot);
|
|
||||||
Bitmap resizedBitmap = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true);
|
|
||||||
bmp.recycle();
|
|
||||||
bmp = resizedBitmap;
|
|
||||||
}
|
|
||||||
img.setImageBitmap(bmp);
|
|
||||||
dlg.setView(img);
|
|
||||||
dlg.show();
|
|
||||||
} else {
|
|
||||||
dlg.setMessage(ctx.getString(R.string.recording_playing, r.getDescription(ctx)));
|
|
||||||
player.setDataSource(r.file.getAbsolutePath());
|
|
||||||
player.setOnPreparedListener(new OnPreparedListener() {
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPrepared(MediaPlayer mp) {
|
public void onPrepared(MediaPlayer mp) {
|
||||||
dlg.show();
|
try {
|
||||||
player.start();
|
player.start();
|
||||||
|
|
||||||
|
if (playerTimer != null) {
|
||||||
|
playerTimer.cancel();
|
||||||
|
}
|
||||||
|
playerTimer = new Timer();
|
||||||
|
playerTimer.schedule(new TimerTask() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
updateContextMenu();
|
||||||
|
if (!isPlaying()) {
|
||||||
|
cancel();
|
||||||
|
playerTimer = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}, 10, 1000);
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
logErr(e);
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
player.prepareAsync();
|
});
|
||||||
}
|
player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
|
||||||
|
@Override
|
||||||
|
public void onCompletion(MediaPlayer mp) {
|
||||||
|
recordingPlaying = null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
player.prepareAsync();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
AccessibleToast.makeText(ctx, R.string.recording_can_not_be_played, Toast.LENGTH_SHORT).show();
|
logErr(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue