added dedicated 'record video' attachment button. fixes #2592

Daniel Gultsch created

thank you @BlauerHunger

Change summary

art/ic_send_videocam_away.svg                                     | 54 
art/ic_send_videocam_dnd.svg                                      | 54 
art/ic_send_videocam_offline.svg                                  | 54 
art/ic_send_videocam_offline_white.svg                            | 54 
art/ic_send_videocam_online.svg                                   | 55 
art/render.rb                                                     |  5 
src/main/java/eu/siacs/conversations/ui/ConversationActivity.java | 38 
src/main/java/eu/siacs/conversations/ui/ConversationFragment.java | 57 
src/main/res/drawable-hdpi/ic_attach_videocam.png                 |  0 
src/main/res/drawable-hdpi/ic_attach_videocam_white.png           |  0 
src/main/res/drawable-hdpi/ic_send_videocam_away.png              |  0 
src/main/res/drawable-hdpi/ic_send_videocam_dnd.png               |  0 
src/main/res/drawable-hdpi/ic_send_videocam_offline.png           |  0 
src/main/res/drawable-hdpi/ic_send_videocam_offline_white.png     |  0 
src/main/res/drawable-hdpi/ic_send_videocam_online.png            |  0 
src/main/res/drawable-mdpi/ic_attach_videocam.png                 |  0 
src/main/res/drawable-mdpi/ic_attach_videocam_white.png           |  0 
src/main/res/drawable-mdpi/ic_send_videocam_away.png              |  0 
src/main/res/drawable-mdpi/ic_send_videocam_dnd.png               |  0 
src/main/res/drawable-mdpi/ic_send_videocam_offline.png           |  0 
src/main/res/drawable-mdpi/ic_send_videocam_offline_white.png     |  0 
src/main/res/drawable-mdpi/ic_send_videocam_online.png            |  0 
src/main/res/drawable-xhdpi/ic_attach_videocam.png                |  0 
src/main/res/drawable-xhdpi/ic_attach_videocam_white.png          |  0 
src/main/res/drawable-xhdpi/ic_send_videocam_away.png             |  0 
src/main/res/drawable-xhdpi/ic_send_videocam_dnd.png              |  0 
src/main/res/drawable-xhdpi/ic_send_videocam_offline.png          |  0 
src/main/res/drawable-xhdpi/ic_send_videocam_offline_white.png    |  0 
src/main/res/drawable-xhdpi/ic_send_videocam_online.png           |  0 
src/main/res/drawable-xxhdpi/ic_attach_videocam.png               |  0 
src/main/res/drawable-xxhdpi/ic_attach_videocam_white.png         |  0 
src/main/res/drawable-xxhdpi/ic_send_videocam_away.png            |  0 
src/main/res/drawable-xxhdpi/ic_send_videocam_dnd.png             |  0 
src/main/res/drawable-xxhdpi/ic_send_videocam_offline.png         |  0 
src/main/res/drawable-xxhdpi/ic_send_videocam_offline_white.png   |  0 
src/main/res/drawable-xxhdpi/ic_send_videocam_online.png          |  0 
src/main/res/drawable-xxxhdpi/ic_attach_videocam.png              |  0 
src/main/res/drawable-xxxhdpi/ic_attach_videocam_white.png        |  0 
src/main/res/drawable-xxxhdpi/ic_send_videocam_away.png           |  0 
src/main/res/drawable-xxxhdpi/ic_send_videocam_dnd.png            |  0 
src/main/res/drawable-xxxhdpi/ic_send_videocam_offline.png        |  0 
src/main/res/drawable-xxxhdpi/ic_send_videocam_offline_white.png  |  0 
src/main/res/drawable-xxxhdpi/ic_send_videocam_online.png         |  0 
src/main/res/menu/attachment_choices.xml                          | 29 
src/main/res/values-v21/themes.xml                                |  4 
src/main/res/values/arrays.xml                                    | 10 
src/main/res/values/attrs.xml                                     |  2 
src/main/res/values/strings.xml                                   |  1 
src/main/res/values/themes.xml                                    |  4 
49 files changed, 373 insertions(+), 48 deletions(-)

Detailed changes

art/ic_send_videocam_away.svg 🔗

@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="48"
+   height="48"
+   viewBox="0 0 24 24"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="ic_send_videocam_away.svg">
+  <metadata
+     id="metadata12">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs10" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="956"
+     inkscape:window-height="567"
+     id="namedview8"
+     showgrid="false"
+     inkscape:zoom="4.9166667"
+     inkscape:cx="-8.3389831"
+     inkscape:cy="24"
+     inkscape:window-x="960"
+     inkscape:window-y="609"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg2" />
+  <path
+     d="M17 10.5V7c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-3.5l4 4v-11l-4 4z"
+     id="path6"
+     style="fill:#ff9800;fill-opacity:0.627451" />
+</svg>

art/ic_send_videocam_dnd.svg 🔗

@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="48"
+   height="48"
+   viewBox="0 0 24 24"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="ic_send_videocam_dnd.svg">
+  <metadata
+     id="metadata12">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs10" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="956"
+     inkscape:window-height="567"
+     id="namedview8"
+     showgrid="false"
+     inkscape:zoom="4.9166667"
+     inkscape:cx="-8.3389831"
+     inkscape:cy="24"
+     inkscape:window-x="960"
+     inkscape:window-y="609"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg2" />
+  <path
+     d="M17 10.5V7c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-3.5l4 4v-11l-4 4z"
+     id="path6"
+     style="fill:#f44336;fill-opacity:0.627451" />
+</svg>

art/ic_send_videocam_offline.svg 🔗

@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="48"
+   height="48"
+   viewBox="0 0 24 24"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="ic_send_videocam_offline.svg">
+  <metadata
+     id="metadata12">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs10" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="956"
+     inkscape:window-height="567"
+     id="namedview8"
+     showgrid="false"
+     inkscape:zoom="4.9166667"
+     inkscape:cx="-8.3389831"
+     inkscape:cy="24"
+     inkscape:window-x="960"
+     inkscape:window-y="609"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg2" />
+  <path
+     d="M17 10.5V7c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-3.5l4 4v-11l-4 4z"
+     id="path6"
+     style="fill:#000000;fill-opacity:0.627451" />
+</svg>

art/ic_send_videocam_offline_white.svg 🔗

@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="48"
+   height="48"
+   viewBox="0 0 24 24"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="ic_send_videocam_offline_white.svg">
+  <metadata
+     id="metadata12">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs10" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="956"
+     inkscape:window-height="567"
+     id="namedview8"
+     showgrid="false"
+     inkscape:zoom="4.9166667"
+     inkscape:cx="10.5688"
+     inkscape:cy="23.898305"
+     inkscape:window-x="960"
+     inkscape:window-y="609"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg2" />
+  <path
+     d="M17 10.5V7c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-3.5l4 4v-11l-4 4z"
+     id="path6"
+     style="fill:#ffffff;fill-opacity:0.627451" />
+</svg>

art/ic_send_videocam_online.svg 🔗

@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="48"
+   height="48"
+   viewBox="0 0 24 24"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="ic_send_videocam_online.svg">
+  <metadata
+     id="metadata10">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs8" />
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1916"
+     inkscape:window-height="1036"
+     id="namedview6"
+     showgrid="false"
+     inkscape:zoom="4.9166667"
+     inkscape:cx="6.5084746"
+     inkscape:cy="24"
+     inkscape:window-x="0"
+     inkscape:window-y="20"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg2" />
+  <path
+     d="M17 10.5V7c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-3.5l4 4v-11l-4 4z"
+     id="path4"
+     style="fill:#259b24;fill-opacity:0.627451" />
+</svg>

art/render.rb 🔗

@@ -47,6 +47,11 @@ images = {
 	'ic_send_picture_offline_white.svg' => ['ic_send_picture_offline_white', 36],
 	'ic_send_picture_away.svg' => ['ic_send_picture_away', 36],
 	'ic_send_picture_dnd.svg' => ['ic_send_picture_dnd', 36],
+	'ic_send_videocam_online.svg' => ['ic_send_videocam_online', 36],
+	'ic_send_videocam_offline.svg' => ['ic_send_videocam_offline', 36],
+	'ic_send_videocam_offline_white.svg' => ['ic_send_videocam_offline_white', 36],
+	'ic_send_videocam_away.svg' => ['ic_send_videocam_away', 36],
+	'ic_send_videocam_dnd.svg' => ['ic_send_videocam_dnd', 36],
 	'ic_notifications_none_white80.svg' => ['ic_notifications_none_white80', 24],
 	'ic_notifications_off_white80.svg' => ['ic_notifications_off_white80', 24],
 	'ic_notifications_paused_white80.svg' => ['ic_notifications_paused_white80', 24],

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

@@ -72,6 +72,8 @@ import eu.siacs.conversations.xmpp.jid.Jid;
 public class ConversationActivity extends XmppActivity
 	implements OnAccountUpdate, OnConversationUpdate, OnRosterUpdate, OnUpdateBlocklist, XmppConnectionService.OnShowErrorToast {
 
+	public static final String RECENTLY_USED_QUICK_ACTION = "recently_used_quick_action";
+
 	public static final String ACTION_VIEW_CONVERSATION = "eu.siacs.conversations.action.VIEW";
 	public static final String CONVERSATION = "conversationUuid";
 	public static final String EXTRA_DOWNLOAD_UUID = "eu.siacs.conversations.download_uuid";
@@ -92,6 +94,7 @@ public class ConversationActivity extends XmppActivity
 	public static final int ATTACHMENT_CHOICE_RECORD_VOICE = 0x0304;
 	public static final int ATTACHMENT_CHOICE_LOCATION = 0x0305;
 	public static final int ATTACHMENT_CHOICE_INVALID = 0x0306;
+	public static final int ATTACHMENT_CHOICE_RECORD_VIDEO = 0x0307;
 	private static final String STATE_OPEN_CONVERSATION = "state_open_conversation";
 	private static final String STATE_PANEL_OPEN = "state_panel_open";
 	private static final String STATE_PENDING_URI = "state_pending_uri";
@@ -500,14 +503,17 @@ public class ConversationActivity extends XmppActivity
 						intent.setType("image/*");
 						chooser = true;
 						break;
+					case ATTACHMENT_CHOICE_RECORD_VIDEO:
+						intent.setAction(MediaStore.ACTION_VIDEO_CAPTURE);
+						break;
 					case ATTACHMENT_CHOICE_TAKE_PHOTO:
 						Uri uri = xmppConnectionService.getFileBackend().getTakePhotoUri();
+						mPendingImageUris.clear();
+						mPendingImageUris.add(uri);
+						intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
 						intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
 						intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
 						intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
-						intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
-						mPendingImageUris.clear();
-						mPendingImageUris.add(uri);
 						break;
 					case ATTACHMENT_CHOICE_CHOOSE_FILE:
 						chooser = true;
@@ -562,20 +568,30 @@ public class ConversationActivity extends XmppActivity
 				return;
 			}
 		}
+		final ConversationFragment.SendButtonAction action;
 		switch (attachmentChoice) {
 			case ATTACHMENT_CHOICE_LOCATION:
-				getPreferences().edit().putString("recently_used_quick_action", "location").apply();
+				action = ConversationFragment.SendButtonAction.SEND_LOCATION;
 				break;
 			case ATTACHMENT_CHOICE_RECORD_VOICE:
-				getPreferences().edit().putString("recently_used_quick_action", "voice").apply();
+				action = ConversationFragment.SendButtonAction.RECORD_VOICE;
+				break;
+			case ATTACHMENT_CHOICE_RECORD_VIDEO:
+				action = ConversationFragment.SendButtonAction.RECORD_VIDEO;
 				break;
 			case ATTACHMENT_CHOICE_TAKE_PHOTO:
-				getPreferences().edit().putString("recently_used_quick_action", "photo").apply();
+				action = ConversationFragment.SendButtonAction.TAKE_PHOTO;
 				break;
 			case ATTACHMENT_CHOICE_CHOOSE_IMAGE:
-				getPreferences().edit().putString("recently_used_quick_action", "picture").apply();
+				action = ConversationFragment.SendButtonAction.CHOOSE_PICTURE;
+				break;
+			default:
+				action = null;
 				break;
 		}
+		if (action != null) {
+			getPreferences().edit().putString(RECENTLY_USED_QUICK_ACTION,action.toString()).apply();
+		}
 		final Conversation conversation = getSelectedConversation();
 		final int encryption = conversation.getNextEncryption();
 		final int mode = conversation.getMode();
@@ -805,6 +821,9 @@ public class ConversationActivity extends XmppActivity
 					case R.id.attach_take_picture:
 						attachFile(ATTACHMENT_CHOICE_TAKE_PHOTO);
 						break;
+					case R.id.attach_record_video:
+						attachFile(ATTACHMENT_CHOICE_RECORD_VIDEO);
+						break;
 					case R.id.attach_choose_file:
 						attachFile(ATTACHMENT_CHOICE_CHOOSE_FILE);
 						break;
@@ -1414,8 +1433,9 @@ public class ConversationActivity extends XmppActivity
 						attachImageToConversation(getSelectedConversation(), i.next());
 					}
 				}
-			} else if (requestCode == ATTACHMENT_CHOICE_CHOOSE_FILE || requestCode == ATTACHMENT_CHOICE_RECORD_VOICE) {
+			} else if (requestCode == ATTACHMENT_CHOICE_CHOOSE_FILE || requestCode == ATTACHMENT_CHOICE_RECORD_VOICE || requestCode == ATTACHMENT_CHOICE_RECORD_VIDEO) {
 				final List<Uri> uris = extractUriFromIntent(data);
+				Log.d(Config.LOGTAG,"uris "+uris.toString());
 				final Conversation c = getSelectedConversation();
 				final OnPresenceSelected callback = new OnPresenceSelected() {
 					@Override
@@ -1424,7 +1444,7 @@ public class ConversationActivity extends XmppActivity
 						mPendingFileUris.addAll(uris);
 						if (xmppConnectionServiceBound) {
 							for (Iterator<Uri> i = mPendingFileUris.iterator(); i.hasNext(); i.remove()) {
-								Log.d(Config.LOGTAG,"ConversationsActivity.onActivityResult() - attaching file to conversations. CHOOSE_FILE/RECORD_VOICE");
+								Log.d(Config.LOGTAG,"ConversationsActivity.onActivityResult() - attaching file to conversations. CHOOSE_FILE/RECORD_VOICE/RECORD_VIDEO");
 								attachFileToConversation(c, i.next());
 							}
 						}

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

@@ -46,7 +46,6 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
-import java.util.ListIterator;
 import java.util.UUID;
 import java.util.concurrent.atomic.AtomicBoolean;
 
@@ -72,7 +71,6 @@ import eu.siacs.conversations.ui.adapter.MessageAdapter;
 import eu.siacs.conversations.ui.adapter.MessageAdapter.OnContactPictureClicked;
 import eu.siacs.conversations.ui.adapter.MessageAdapter.OnContactPictureLongClicked;
 import eu.siacs.conversations.ui.widget.ListSelectionManager;
-import eu.siacs.conversations.utils.GeoHelper;
 import eu.siacs.conversations.utils.NickValidityChecker;
 import eu.siacs.conversations.utils.UIHelper;
 import eu.siacs.conversations.xmpp.XmppConnection;
@@ -331,6 +329,9 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa
 					case TAKE_PHOTO:
 						activity.attachFile(ConversationActivity.ATTACHMENT_CHOICE_TAKE_PHOTO);
 						break;
+					case RECORD_VIDEO:
+						activity.attachFile(ConversationActivity.ATTACHMENT_CHOICE_RECORD_VIDEO);
+						break;
 					case SEND_LOCATION:
 						activity.attachFile(ConversationActivity.ATTACHMENT_CHOICE_LOCATION);
 						break;
@@ -1152,7 +1153,16 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa
 		mSendingPgpMessage.set(false);
 	}
 
-	enum SendButtonAction {TEXT, TAKE_PHOTO, SEND_LOCATION, RECORD_VOICE, CANCEL, CHOOSE_PICTURE}
+	enum SendButtonAction {TEXT, TAKE_PHOTO, SEND_LOCATION, RECORD_VOICE, CANCEL, CHOOSE_PICTURE, RECORD_VIDEO;
+
+		public static SendButtonAction valueOfOrDefault(String setting, SendButtonAction text) {
+			try {
+				return valueOf(setting);
+			} catch (IllegalArgumentException e) {
+				return TEXT;
+			}
+		}
+	}
 
 	private int getSendButtonImageResource(SendButtonAction action, Presence.Status status) {
 		switch (action) {
@@ -1169,6 +1179,19 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa
 					default:
 						return activity.getThemeResource(R.attr.ic_send_text_offline, R.drawable.ic_send_text_offline);
 				}
+			case RECORD_VIDEO:
+				switch (status) {
+					case CHAT:
+					case ONLINE:
+						return R.drawable.ic_send_videocam_online;
+					case AWAY:
+						return R.drawable.ic_send_videocam_away;
+					case XA:
+					case DND:
+						return R.drawable.ic_send_videocam_dnd;
+					default:
+						return activity.getThemeResource(R.attr.ic_send_videocam_offline, R.drawable.ic_send_videocam_offline);
+				}
 			case TAKE_PHOTO:
 				switch (status) {
 					case CHAT:
@@ -1268,26 +1291,14 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa
 				} else {
 					String setting = activity.getPreferences().getString("quick_action", activity.getResources().getString(R.string.quick_action));
 					if (!setting.equals("none") && UIHelper.receivedLocationQuestion(conversation.getLatestMessage())) {
-						setting = "location";
-					} else if (setting.equals("recent")) {
-						setting = activity.getPreferences().getString("recently_used_quick_action", "text");
-					}
-					switch (setting) {
-						case "photo":
-							action = SendButtonAction.TAKE_PHOTO;
-							break;
-						case "location":
-							action = SendButtonAction.SEND_LOCATION;
-							break;
-						case "voice":
-							action = SendButtonAction.RECORD_VOICE;
-							break;
-						case "picture":
-							action = SendButtonAction.CHOOSE_PICTURE;
-							break;
-						default:
-							action = SendButtonAction.TEXT;
-							break;
+						action = SendButtonAction.SEND_LOCATION;
+					} else {
+						if (setting.equals("recent")) {
+							setting = activity.getPreferences().getString(ConversationActivity.RECENTLY_USED_QUICK_ACTION, SendButtonAction.TEXT.toString());
+							action = SendButtonAction.valueOfOrDefault(setting,SendButtonAction.TEXT);
+						} else {
+							action = SendButtonAction.valueOfOrDefault(setting,SendButtonAction.TEXT);
+						}
 					}
 				}
 			} else {

src/main/res/menu/attachment_choices.xml 🔗

@@ -2,14 +2,14 @@
 <menu xmlns:android="http://schemas.android.com/apk/res/android" >
 
     <item
-        android:id="@+id/attach_location"
-        android:title="@string/send_location"
-        android:icon="?attr/ic_attach_location"/>
+        android:id="@+id/attach_choose_file"
+        android:title="@string/choose_file"
+        android:icon="?attr/ic_attach_document"/>
 
     <item
-        android:id="@+id/attach_record_voice"
-        android:title="@string/attach_record_voice"
-        android:icon="?attr/ic_attach_record"/>
+        android:id="@+id/attach_choose_picture"
+        android:title="@string/attach_choose_picture"
+        android:icon="?attr/ic_attach_photo"/>
 
     <item
         android:id="@+id/attach_take_picture"
@@ -17,13 +17,18 @@
         android:icon="?attr/ic_attach_camera"/>
 
     <item
-        android:id="@+id/attach_choose_picture"
-        android:title="@string/attach_choose_picture"
-        android:icon="?attr/ic_attach_photo"/>
+        android:id="@+id/attach_record_video"
+        android:title="@string/attach_record_video"
+        android:icon="?attr/ic_attach_videocam"/>
 
     <item
-        android:id="@+id/attach_choose_file"
-        android:title="@string/choose_file"
-        android:icon="?attr/ic_attach_document"/>
+        android:id="@+id/attach_record_voice"
+        android:title="@string/attach_record_voice"
+        android:icon="?attr/ic_attach_record"/>
+
+    <item
+        android:id="@+id/attach_location"
+        android:title="@string/send_location"
+        android:icon="?attr/ic_attach_location"/>
 
 </menu>

src/main/res/values-v21/themes.xml 🔗

@@ -29,9 +29,11 @@
         <item name="attr/ic_send_photo_offline">@drawable/ic_send_photo_offline</item>
         <item name="attr/ic_send_picture_offline">@drawable/ic_send_picture_offline</item>
         <item name="attr/ic_send_text_offline">@drawable/ic_send_text_offline</item>
+        <item name="attr/ic_send_videocam_offline">@drawable/ic_send_videocam_offline</item>
         <item name="attr/ic_send_voice_offline">@drawable/ic_send_voice_offline</item>
 
         <item name="attr/ic_attach_camera">@drawable/ic_attach_camera</item>
+        <item name="attr/ic_attach_videocam">@drawable/ic_attach_videocam</item>
         <item name="attr/ic_attach_document">@drawable/ic_attach_document</item>
         <item name="attr/ic_attach_location">@drawable/ic_attach_location</item>
         <item name="attr/ic_attach_photo">@drawable/ic_attach_photo</item>
@@ -107,9 +109,11 @@
         <item name="attr/ic_send_photo_offline">@drawable/ic_send_photo_offline_white</item>
         <item name="attr/ic_send_picture_offline">@drawable/ic_send_picture_offline_white</item>
         <item name="attr/ic_send_text_offline">@drawable/ic_send_text_offline_white</item>
+        <item name="attr/ic_send_videocam_offline">@drawable/ic_send_videocam_offline_white</item>
         <item name="attr/ic_send_voice_offline">@drawable/ic_send_voice_offline_white</item>
 
         <item name="attr/ic_attach_camera">@drawable/ic_attach_camera_white</item>
+        <item name="attr/ic_attach_videocam">@drawable/ic_attach_videocam_white</item>
         <item name="attr/ic_attach_document">@drawable/ic_attach_document_white</item>
         <item name="attr/ic_attach_location">@drawable/ic_attach_location_white</item>
         <item name="attr/ic_attach_photo">@drawable/ic_attach_photo_white</item>

src/main/res/values/arrays.xml 🔗

@@ -52,6 +52,7 @@
 		<item>@string/none</item>
 		<item>@string/recently_used</item>
 		<item>@string/attach_take_picture</item>
+		<item>@string/attach_record_video</item>
 		<item>@string/attach_choose_picture</item>
 		<item>@string/attach_record_voice</item>
 		<item>@string/send_location</item>
@@ -60,10 +61,11 @@
 	<string-array name="quick_action_values">
 		<item>none</item>
 		<item>recent</item>
-		<item>photo</item>
-		<item>picture</item>
-		<item>voice</item>
-		<item>location</item>
+		<item>TAKE_PHOTO</item>
+		<item>RECORD_VIDEO</item>
+		<item>CHOOSE_PICTURE</item>
+		<item>RECORD_VOICE</item>
+		<item>SEND_LOCATION</item>
 	</string-array>
 
 	<string-array name="picture_compression_values">

src/main/res/values/attrs.xml 🔗

@@ -20,9 +20,11 @@
     <attr name="ic_send_photo_offline" format="reference"/>
     <attr name="ic_send_picture_offline" format="reference"/>
     <attr name="ic_send_text_offline" format="reference"/>
+    <attr name="ic_send_videocam_offline" format="reference"/>
     <attr name="ic_send_voice_offline" format="reference"/>
 
     <attr name="ic_attach_camera" format="reference"/>
+    <attr name="ic_attach_videocam" format="reference"/>
     <attr name="ic_attach_document" format="reference"/>
     <attr name="ic_attach_location" format="reference"/>
     <attr name="ic_attach_photo" format="reference"/>

src/main/res/values/strings.xml 🔗

@@ -724,4 +724,5 @@
 	<string name="network_is_unreachable">Network is unreachable</string>
 	<string name="certificate_does_not_contain_jid">Certificate does not contain a Jabber ID</string>
 	<string name="server_info_partial">partial</string>
+    <string name="attach_record_video">Record video</string>
 </resources>

src/main/res/values/themes.xml 🔗

@@ -25,9 +25,11 @@
         <item name="attr/ic_send_photo_offline">@drawable/ic_send_photo_offline</item>
         <item name="attr/ic_send_picture_offline">@drawable/ic_send_picture_offline</item>
         <item name="attr/ic_send_text_offline">@drawable/ic_send_text_offline</item>
+        <item name="attr/ic_send_videocam_offline">@drawable/ic_send_videocam_offline</item>
         <item name="attr/ic_send_voice_offline">@drawable/ic_send_voice_offline</item>
 
         <item name="attr/ic_attach_camera">@drawable/ic_attach_camera</item>
+        <item name="attr/ic_attach_videocam">@drawable/ic_attach_videocam</item>
         <item name="attr/ic_attach_document">@drawable/ic_attach_document</item>
         <item name="attr/ic_attach_location">@drawable/ic_attach_location</item>
         <item name="attr/ic_attach_photo">@drawable/ic_attach_photo</item>
@@ -100,9 +102,11 @@
         <item name="attr/ic_send_photo_offline">@drawable/ic_send_photo_offline_white</item>
         <item name="attr/ic_send_picture_offline">@drawable/ic_send_picture_offline_white</item>
         <item name="attr/ic_send_text_offline">@drawable/ic_send_text_offline_white</item>
+        <item name="attr/ic_send_videocam_offline">@drawable/ic_send_videocam_offline_white</item>
         <item name="attr/ic_send_voice_offline">@drawable/ic_send_voice_offline_white</item>
 
         <item name="attr/ic_attach_camera">@drawable/ic_attach_camera_white</item>
+        <item name="attr/ic_attach_videocam">@drawable/ic_attach_videocam_white</item>
         <item name="attr/ic_attach_document">@drawable/ic_attach_document_white</item>
         <item name="attr/ic_attach_location">@drawable/ic_attach_location_white</item>
         <item name="attr/ic_attach_photo">@drawable/ic_attach_photo_white</item>