Context menu: added Audio/Video notes menu

This commit is contained in:
Alexey Kulish 2015-10-30 11:16:24 +03:00
parent 78666cdb6a
commit 8e4e5e3f2e
7 changed files with 142 additions and 53 deletions

View file

@ -111,41 +111,6 @@ public class AudioNotesLayer extends OsmandMapLayer implements IContextMenuProvi
return true; return true;
} }
@Override
public void populateObjectContextMenu(Object o, ContextMenuAdapter adapter) {
if (o instanceof Recording) {
final Recording r = (Recording) o;
OnContextMenuClick listener = new ContextMenuAdapter.OnContextMenuClick() {
@Override
public boolean onContextMenuClick(ArrayAdapter<?> adapter, int itemId, int pos, boolean isChecked) {
if (itemId == R.string.recording_context_menu_delete) {
deleteRecording(r);
}
return true;
}
};
adapter.item(R.string.recording_context_menu_delete).iconColor(R.drawable.ic_action_delete_dark
).listen(listener).reg();
}
}
private void deleteRecording(final Recording r) {
AccessibleAlertBuilder bld = new AccessibleAlertBuilder(activity);
bld.setMessage(R.string.recording_delete_confirm);
bld.setPositiveButton(R.string.shared_string_yes, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
plugin.deleteRecording(r);
}
});
bld.setNegativeButton(R.string.shared_string_no, null);
bld.show();
}
@Override @Override
public String getObjectDescription(Object o) { public String getObjectDescription(Object o) {
if(o instanceof Recording){ if(o instanceof Recording){

View file

@ -9,7 +9,9 @@ import android.text.util.Linkify;
import android.util.TypedValue; import android.util.TypedValue;
import android.view.Gravity; import android.view.Gravity;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
@ -82,7 +84,7 @@ public class MenuBuilder {
firstRow = false; firstRow = false;
} }
private void buildRow(View view, int iconId, String text, int textColor) { protected void buildRow(View view, int iconId, String text, int textColor) {
buildRow(view, getRowIcon(iconId), text, textColor); buildRow(view, getRowIcon(iconId), text, textColor);
} }
@ -147,6 +149,48 @@ public class MenuBuilder {
rowBuilt(); rowBuilt();
} }
protected void buildButtonRow(final View view, Drawable buttonIcon, String text, OnClickListener onClickListener) {
LinearLayout ll = new LinearLayout(view.getContext());
ll.setOrientation(LinearLayout.HORIZONTAL);
LinearLayout.LayoutParams llParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
ll.setLayoutParams(llParams);
// Empty
LinearLayout llIcon = new LinearLayout(view.getContext());
llIcon.setOrientation(LinearLayout.HORIZONTAL);
llIcon.setLayoutParams(new LinearLayout.LayoutParams(dpToPx(62f), isFirstRow() ? dpToPx(58f) - dpToPx(SHADOW_HEIGHT_BOTTOM_DP) : dpToPx(58f)));
llIcon.setGravity(Gravity.CENTER_VERTICAL);
ll.addView(llIcon);
// Button
LinearLayout llButton = new LinearLayout(view.getContext());
llButton.setOrientation(LinearLayout.VERTICAL);
ll.addView(llButton);
Button buttonView = new Button(view.getContext());
buttonView.setBackgroundResource(resolveAttribute(view.getContext(), android.R.attr.selectableItemBackground));
LinearLayout.LayoutParams llBtnParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
buttonView.setLayoutParams(llBtnParams);
buttonView.setPadding(dpToPx(10f), 0, dpToPx(10f), 0);
buttonView.setGravity(Gravity.START | Gravity.CENTER_VERTICAL);
//buttonView.setTextSize(view.getResources().getDimension(resolveAttribute(view.getContext(), R.dimen.default_desc_text_size)));
buttonView.setTextColor(view.getResources().getColor(resolveAttribute(view.getContext(), R.attr.contextMenuButtonColor)));
buttonView.setText(text);
if (buttonIcon != null) {
buttonView.setCompoundDrawablesWithIntrinsicBounds(buttonIcon, null, null, null);
buttonView.setCompoundDrawablePadding(dpToPx(8f));
}
buttonView.setOnClickListener(onClickListener);
llButton.addView(buttonView);
((LinearLayout) view).addView(ll);
rowBuilt();
}
public void addPlainMenuItem(int iconId, String text) { public void addPlainMenuItem(int iconId, String text) {
plainMenuItems.add(new PlainMenuItem(iconId, text)); plainMenuItems.add(new PlainMenuItem(iconId, text));
} }
@ -167,6 +211,12 @@ public class MenuBuilder {
} }
} }
public int resolveAttribute(Context ctx, int attribute) {
TypedValue outValue = new TypedValue();
ctx.getTheme().resolveAttribute(attribute, outValue, true);
return outValue.resourceId;
}
public int dpToPx(float dp) { public int dpToPx(float dp) {
Resources r = app.getResources(); Resources r = app.getResources();
return (int) TypedValue.applyDimension( return (int) TypedValue.applyDimension(

View file

@ -20,7 +20,7 @@ import net.osmand.plus.mapcontextmenu.controllers.MyLocationMenuController;
import net.osmand.plus.mapcontextmenu.controllers.OsMoMenuController; import net.osmand.plus.mapcontextmenu.controllers.OsMoMenuController;
import net.osmand.plus.mapcontextmenu.controllers.ParkingPositionMenuController; import net.osmand.plus.mapcontextmenu.controllers.ParkingPositionMenuController;
import net.osmand.plus.mapcontextmenu.controllers.PointDescriptionMenuController; import net.osmand.plus.mapcontextmenu.controllers.PointDescriptionMenuController;
import net.osmand.plus.mapcontextmenu.controllers.RecordingItemMenuController; import net.osmand.plus.mapcontextmenu.controllers.AudioVideoNoteMenuController;
import net.osmand.plus.mapcontextmenu.controllers.TargetPointMenuController; import net.osmand.plus.mapcontextmenu.controllers.TargetPointMenuController;
import net.osmand.plus.osmo.OsMoGroupsStorage.OsMoDevice; import net.osmand.plus.osmo.OsMoGroupsStorage.OsMoDevice;
@ -93,7 +93,7 @@ public abstract class MenuController extends BaseMenuController {
} else if (object instanceof OsMoDevice) { } else if (object instanceof OsMoDevice) {
menuController = new OsMoMenuController(app, mapActivity, (OsMoDevice) object); menuController = new OsMoMenuController(app, mapActivity, (OsMoDevice) object);
} else if (object instanceof Recording) { } else if (object instanceof Recording) {
menuController = new RecordingItemMenuController(app, mapActivity, (Recording) object); menuController = new AudioVideoNoteMenuController(app, mapActivity, (Recording) object);
} else if (object instanceof LatLon) { } else if (object instanceof LatLon) {
if (pointDescription.isParking()) { if (pointDescription.isParking()) {
menuController = new ParkingPositionMenuController(app, mapActivity, pointDescription); menuController = new ParkingPositionMenuController(app, mapActivity, pointDescription);

View file

@ -34,11 +34,11 @@ public class AmenityMenuBuilder extends MenuBuilder {
this.amenity = amenity; this.amenity = amenity;
} }
private void buildRow(View view, int iconId, String text, int textColor, boolean isWiki) { private void buildRow(View view, int iconId, String text, int textColor, boolean isWiki, boolean needLinks) {
buildRow(view, getRowIcon(iconId), text, textColor, isWiki); buildRow(view, getRowIcon(iconId), text, textColor, isWiki, needLinks);
} }
protected void buildRow(final View view, Drawable icon, String text, int textColor, final boolean isWiki) { protected void buildRow(final View view, Drawable icon, String text, int textColor, boolean isWiki, boolean needLinks) {
boolean light = app.getSettings().isLightContent(); boolean light = app.getSettings().isLightContent();
LinearLayout ll = new LinearLayout(view.getContext()); LinearLayout ll = new LinearLayout(view.getContext());
@ -74,8 +74,10 @@ public class AmenityMenuBuilder extends MenuBuilder {
textView.setTextSize(16); textView.setTextSize(16);
textView.setTextColor(app.getResources().getColor(light ? R.color.ctx_menu_info_text_light : R.color.ctx_menu_info_text_dark)); textView.setTextColor(app.getResources().getColor(light ? R.color.ctx_menu_info_text_light : R.color.ctx_menu_info_text_dark));
if (needLinks) {
textView.setAutoLinkMask(Linkify.ALL); textView.setAutoLinkMask(Linkify.ALL);
textView.setLinksClickable(true); textView.setLinksClickable(true);
}
textView.setEllipsize(TextUtils.TruncateAt.END); textView.setEllipsize(TextUtils.TruncateAt.END);
if (isWiki) { if (isWiki) {
textView.setMinLines(1); textView.setMinLines(1);
@ -124,10 +126,12 @@ public class AmenityMenuBuilder extends MenuBuilder {
int iconId; int iconId;
Drawable icon = null; Drawable icon = null;
int textColor = 0; int textColor = 0;
boolean isWiki = false;
String key = e.getKey(); String key = e.getKey();
String vl = e.getValue(); String vl = e.getValue();
boolean isWiki = false;
boolean needLinks = !"population".equals(key);
if (amenity.getType().isWiki()) { if (amenity.getType().isWiki()) {
if (!hasWiki) { if (!hasWiki) {
iconId = R.drawable.ic_action_note_dark; iconId = R.drawable.ic_action_note_dark;
@ -197,9 +201,9 @@ public class AmenityMenuBuilder extends MenuBuilder {
} }
if (icon != null) { if (icon != null) {
buildRow(view, icon, vl, textColor, isWiki); buildRow(view, icon, vl, textColor, isWiki, needLinks);
} else { } else {
buildRow(view, iconId, vl, textColor, isWiki); buildRow(view, iconId, vl, textColor, isWiki, needLinks);
} }
} }
} }

View file

@ -0,0 +1,73 @@
package net.osmand.plus.mapcontextmenu.builders;
import android.content.DialogInterface;
import android.view.View;
import android.view.View.OnClickListener;
import net.osmand.access.AccessibleAlertBuilder;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.audionotes.AudioVideoNotesPlugin;
import net.osmand.plus.audionotes.AudioVideoNotesPlugin.Recording;
import net.osmand.plus.mapcontextmenu.MenuBuilder;
import net.osmand.util.Algorithms;
import java.io.File;
import java.text.DateFormat;
import java.util.Date;
public class AudioVideoNoteMenuBuilder extends MenuBuilder {
private final Recording recording;
public AudioVideoNoteMenuBuilder(OsmandApplication app, final Recording recording) {
super(app);
this.recording = recording;
}
@Override
protected boolean needBuildPlainMenuItems() {
return false;
}
@Override
public void build(View view) {
super.build(view);
File file = recording.getFile();
if (file != null) {
DateFormat dateFormat = android.text.format.DateFormat.getMediumDateFormat(view.getContext());
DateFormat timeFormat = android.text.format.DateFormat.getTimeFormat(view.getContext());
Date date = new Date(recording.getFile().lastModified());
buildRow(view, R.drawable.ic_action_data, dateFormat.format(date) + "" + timeFormat.format(date), 0);
}
buildPlainMenuItems(view);
buildButtonRow(view, null, view.getResources().getString(R.string.recording_context_menu_delete), new OnClickListener() {
@Override
public void onClick(View v) {
AccessibleAlertBuilder bld = new AccessibleAlertBuilder(v.getContext());
bld.setMessage(R.string.recording_delete_confirm);
final View fView = v;
bld.setPositiveButton(R.string.shared_string_yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
AudioVideoNotesPlugin plugin = OsmandPlugin.getPlugin(AudioVideoNotesPlugin.class);
if (plugin != null) {
plugin.deleteRecording(recording);
if (fView.getContext() instanceof MapActivity) {
((MapActivity)fView.getContext()).getContextMenu().close();
}
}
}
});
bld.setNegativeButton(R.string.shared_string_no, null);
bld.show();
}
});
}
}

View file

@ -17,10 +17,6 @@ public class FavouritePointMenuBuilder extends MenuBuilder {
this.fav = fav; this.fav = fav;
} }
private void buildRow(View view, int iconId, String text, int textColor) {
buildRow(view, getRowIcon(iconId), text, textColor);
}
@Override @Override
protected boolean needBuildPlainMenuItems() { protected boolean needBuildPlainMenuItems() {
return false; return false;

View file

@ -10,19 +10,20 @@ import net.osmand.plus.audionotes.AudioVideoNotesPlugin;
import net.osmand.plus.audionotes.AudioVideoNotesPlugin.Recording; import net.osmand.plus.audionotes.AudioVideoNotesPlugin.Recording;
import net.osmand.plus.mapcontextmenu.MenuBuilder; import net.osmand.plus.mapcontextmenu.MenuBuilder;
import net.osmand.plus.mapcontextmenu.MenuController; import net.osmand.plus.mapcontextmenu.MenuController;
import net.osmand.plus.mapcontextmenu.builders.AudioVideoNoteMenuBuilder;
import java.io.File; import java.io.File;
import java.text.DateFormat; import java.text.DateFormat;
import java.util.Date; import java.util.Date;
public class RecordingItemMenuController extends MenuController { public class AudioVideoNoteMenuController extends MenuController {
private Recording recording; private Recording recording;
private DateFormat dateFormat; private DateFormat dateFormat;
private AudioVideoNotesPlugin plugin; private AudioVideoNotesPlugin plugin;
public RecordingItemMenuController(OsmandApplication app, MapActivity mapActivity, final Recording recording) { public AudioVideoNoteMenuController(OsmandApplication app, MapActivity mapActivity, final Recording recording) {
super(new MenuBuilder(app), mapActivity); super(new AudioVideoNoteMenuBuilder(app, recording), mapActivity);
this.recording = recording; this.recording = recording;
plugin = OsmandPlugin.getPlugin(AudioVideoNotesPlugin.class); plugin = OsmandPlugin.getPlugin(AudioVideoNotesPlugin.class);
dateFormat = android.text.format.DateFormat.getMediumDateFormat(mapActivity); dateFormat = android.text.format.DateFormat.getMediumDateFormat(mapActivity);