diff --git a/MessengerProj/jni/mrwrapper.c b/MessengerProj/jni/mrwrapper.c
index f3aeb1dd2..f6dccede3 100644
--- a/MessengerProj/jni/mrwrapper.c
+++ b/MessengerProj/jni/mrwrapper.c
@@ -353,9 +353,9 @@ JNIEXPORT jlong Java_com_b44t_messenger_MrMailbox_MrMailboxGetChat(JNIEnv *env,
}
-JNIEXPORT jint Java_com_b44t_messenger_MrMailbox_MrMailboxGetChatIdByContactId(JNIEnv *env, jclass c, jlong hMailbox, jint contact_id)
+JNIEXPORT jint Java_com_b44t_messenger_MrMailbox_getChatIdByContactId(JNIEnv *env, jclass cls, jint contact_id)
{
- return (jint)mrmailbox_get_chat_id_by_contact_id((mrmailbox_t*)hMailbox, contact_id);
+ return (jint)mrmailbox_get_chat_id_by_contact_id(get_mrmailbox_t(env, cls), contact_id);
}
@@ -371,9 +371,9 @@ JNIEXPORT jint Java_com_b44t_messenger_MrMailbox_markseenChat(JNIEnv *env, jclas
}
-JNIEXPORT jint Java_com_b44t_messenger_MrMailbox_MrMailboxCreateChatByContactId(JNIEnv *env, jclass c, jlong hMailbox, jint contact_id)
+JNIEXPORT jint Java_com_b44t_messenger_MrMailbox_createChatByContactId(JNIEnv *env, jclass cls, jint contact_id)
{
- return (jint)mrmailbox_create_chat_by_contact_id((mrmailbox_t*)hMailbox, contact_id);
+ return (jint)mrmailbox_create_chat_by_contact_id(get_mrmailbox_t(env, cls), contact_id);
}
diff --git a/MessengerProj/src/main/AndroidManifest.xml b/MessengerProj/src/main/AndroidManifest.xml
index 55139ba27..91352d3d0 100644
--- a/MessengerProj/src/main/AndroidManifest.xml
+++ b/MessengerProj/src/main/AndroidManifest.xml
@@ -99,22 +99,13 @@
-
-
-
+
+
+
+
+
colors = new ArrayList<>();
- if ((flag & FLAG_TAG_COLOR) != 0) {
+ if ((flag & FLAG_TAG_COLOR) != 0) { // used eg. by the message preview when following a mailto:-link
while ((start = stringBuilder.indexOf("", start);
diff --git a/MessengerProj/src/main/java/com/b44t/messenger/MrMailbox.java b/MessengerProj/src/main/java/com/b44t/messenger/MrMailbox.java
index c71154e8a..ab21d8f84 100644
--- a/MessengerProj/src/main/java/com/b44t/messenger/MrMailbox.java
+++ b/MessengerProj/src/main/java/com/b44t/messenger/MrMailbox.java
@@ -117,13 +117,8 @@ public class MrMailbox {
public native static int markseenMsg (int msg_id);
public native static int markseenChat (int chat_id);
- public static int getChatIdByContactId (int contact_id) {
- return MrMailboxGetChatIdByContactId(m_hMailbox, contact_id);
- }
-
- public static int createChatByContactId(int contact_id) {
- return MrMailboxCreateChatByContactId(m_hMailbox, contact_id);
- }
+ public native static int getChatIdByContactId (int contact_id);
+ public native static int createChatByContactId(int contact_id); // returns chat_id
public native static int createGroupChat (String name);
public native static int isContactInChat (int chat_id, int contact_id);
@@ -145,8 +140,6 @@ public class MrMailbox {
private native static long MrMailboxGetChatlist (long hMailbox, String query); // returns hChatlist which must be unref'd after usage
private native static long MrMailboxGetChat (long hMailbox, int chat_id); // return hChat which must be unref'd after usage
- private native static int MrMailboxGetChatIdByContactId (long hMailbox, int contact_id);
- private native static int MrMailboxCreateChatByContactId(long hMailbox, int contact_id); // returns chat_id
// msgs
diff --git a/MessengerProj/src/main/java/com/b44t/ui/ChatActivity.java b/MessengerProj/src/main/java/com/b44t/ui/ChatActivity.java
index d37efda1c..869de722e 100644
--- a/MessengerProj/src/main/java/com/b44t/ui/ChatActivity.java
+++ b/MessengerProj/src/main/java/com/b44t/ui/ChatActivity.java
@@ -2691,16 +2691,12 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
private void createChat(String urlFinal)
{
- int contactId = MrMailbox.createContact("", urlFinal);
- int chatId = MrMailbox.createChatByContactId(contactId);
+ int chatId = MrMailbox.createChatByContactId(MrMailbox.createContact("", urlFinal));
if( chatId != 0 ) {
Bundle args = new Bundle();
args.putInt("chat_id", chatId);
presentFragment(new ChatActivity(args), true /*removeLast*/);
}
- else {
- Toast.makeText(getParentActivity(), "Cannot create chat.", Toast.LENGTH_LONG).show(); // should not happen
- }
}
@Override
diff --git a/MessengerProj/src/main/java/com/b44t/ui/DialogsActivity.java b/MessengerProj/src/main/java/com/b44t/ui/DialogsActivity.java
index 9e423adcc..a3f527a57 100644
--- a/MessengerProj/src/main/java/com/b44t/ui/DialogsActivity.java
+++ b/MessengerProj/src/main/java/com/b44t/ui/DialogsActivity.java
@@ -43,7 +43,6 @@ import android.view.MotionEvent;
import android.view.View;
import android.view.ViewOutlineProvider;
import android.view.ViewTreeObserver;
-import android.view.WindowManager;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.widget.EditText;
import android.widget.FrameLayout;
@@ -53,6 +52,7 @@ import android.widget.ListView;
import android.widget.TextView;
import com.b44t.messenger.AndroidUtilities;
+import com.b44t.messenger.ApplicationLoader;
import com.b44t.messenger.ImageLoader;
import com.b44t.messenger.LocaleController;
import com.b44t.messenger.MrChat;
@@ -61,7 +61,6 @@ import com.b44t.messenger.MrMsg;
import com.b44t.messenger.Utilities;
import com.b44t.messenger.support.widget.LinearLayoutManager;
import com.b44t.messenger.support.widget.RecyclerView;
-import com.b44t.messenger.FileLog;
import com.b44t.messenger.NotificationCenter;
import com.b44t.messenger.R;
import com.b44t.messenger.UserConfig;
@@ -107,7 +106,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter.
private boolean checkPermission = true;
- private String selectAlertString;
+ private String selectAlertString, selectAlertPreviewString, selectAlertOkButtonString;
private static boolean dialogsLoaded;
private boolean searching;
@@ -139,6 +138,8 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter.
onlySelectTitle = LocaleController.getString("SelectChat", R.string.SelectChat);
}
selectAlertString = arguments.getString("selectAlertString");
+ selectAlertPreviewString = arguments.getString("selectAlertPreviewString");
+ selectAlertOkButtonString = arguments.getString("selectAlertOkButtonString");
}
NotificationCenter.getInstance().addObserver(this, NotificationCenter.dialogsNeedReload);
@@ -534,8 +535,6 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter.
ArrayList permissons = new ArrayList<>();
if (activity.checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
permissons.add(Manifest.permission.READ_CONTACTS);
- //permissons.add(Manifest.permission.WRITE_CONTACTS);
- //permissons.add(Manifest.permission.GET_ACCOUNTS);
}
if (activity.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
permissons.add(Manifest.permission.READ_EXTERNAL_STORAGE);
@@ -717,10 +716,12 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter.
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
MrChat mrChat = MrMailbox.getChat((int)dialog_id);
- builder.setMessage(AndroidUtilities.replaceTags(LocaleController.formatStringSimple(selectAlertString,
- mrChat.getNameNAddr() /*display addr as there may be contacts with the same name but different addresses*/)));
- builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() {
+ builder.setMessage(AndroidUtilities.replaceTags(
+ LocaleController.formatStringSimple(selectAlertString, mrChat.getNameNAddr()) // display addr as there may be contacts with the same name but different addresses
+ + (selectAlertPreviewString==null? "" : ("\n\n"+selectAlertPreviewString+""))));
+
+ builder.setPositiveButton(selectAlertOkButtonString!=null? selectAlertOkButtonString : ApplicationLoader.applicationContext.getString(R.string.OK), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
didSelectResult(dialog_id, false, false);
diff --git a/MessengerProj/src/main/java/com/b44t/ui/LaunchActivity.java b/MessengerProj/src/main/java/com/b44t/ui/LaunchActivity.java
index 27a225d79..298ba362c 100644
--- a/MessengerProj/src/main/java/com/b44t/ui/LaunchActivity.java
+++ b/MessengerProj/src/main/java/com/b44t/ui/LaunchActivity.java
@@ -33,6 +33,7 @@ import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.graphics.Point;
+import android.net.MailTo;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
@@ -471,11 +472,15 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
return false;
}
+ if( intent==null ) {
+ return false;
+ }
+
int flags = intent.getFlags();
boolean pushOpened = false;
Integer push_chat_id = 0;
- long dialogId = intent != null && intent.getExtras() != null ? intent.getExtras().getLong("dialogId", 0) : 0;
+ long dialogId = intent.getExtras() != null ? intent.getExtras().getLong("dialogId", 0) : 0;
boolean showDialogsList = false;
photoPathsArray = null;
@@ -486,10 +491,14 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
documentsMimeType = null;
documentsUrisArray = null;
contactsToSend = null;
+ String createChatWith = null;
- if ( (flags & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0) {
- if (intent != null && intent.getAction() != null && !restore) {
- if (Intent.ACTION_SEND.equals(intent.getAction())) {
+ if ( (flags & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0)
+ {
+ if (intent.getAction() != null && !restore)
+ {
+ if (Intent.ACTION_SEND.equals(intent.getAction()))
+ {
boolean error = false;
String type = intent.getType();
if (type != null && type.equals(ContactsContract.Contacts.CONTENT_VCARD_TYPE)) {
@@ -654,7 +663,9 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
if (error) {
Toast.makeText(this, "Unsupported content", Toast.LENGTH_SHORT).show();
}
- } else if (intent.getAction().equals(Intent.ACTION_SEND_MULTIPLE)) {
+ }
+ else if (intent.getAction().equals(Intent.ACTION_SEND_MULTIPLE))
+ {
boolean error = false;
try {
ArrayList uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
@@ -724,18 +735,36 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
if (error) {
Toast.makeText(this, "Unsupported content", Toast.LENGTH_SHORT).show();
}
- } else if (Intent.ACTION_VIEW.equals(intent.getAction())) {
- Uri data = intent.getData();
- if (data != null) {
- String scheme = data.getScheme();
- if (scheme != null) {
- if ((scheme.equals("http") || scheme.equals("https"))) {
-
+ }
+ else if( Intent.ACTION_VIEW.equals(intent.getAction()) || Intent.ACTION_SENDTO.equals(intent.getAction()) )
+ {
+ // handle links
+ try {
+ Uri uri = intent.getData();
+ if( uri != null ) {
+ String scheme = uri.getScheme();
+ if( scheme != null && scheme.equals("mailto") ) {
+ // handle mailto:-links
+ MailTo mailto = MailTo.parse(uri.toString());
+ String toList = mailto.getTo(); // toList contains comma-separated email addresses
+ if( toList!=null && !toList.isEmpty() ) {
+ String[] toArr = toList.split(",");
+ createChatWith = toArr[0];
+ }
+ String subject = mailto.getSubject();
+ String body = mailto.getBody();
+ if (subject != null || body != null) {
+ sendingText = subject + ((subject != null && body != null) ? " \u2013 " : "") + body;
+ }
}
}
}
+ catch(Exception e) {
+ Log.e("DeltaChat", "mailto failed", e);
+ }
}
- else if (intent.getAction().startsWith("com.b44t.messenger.openchat")) {
+ else if (intent.getAction().startsWith("com.b44t.messenger.openchat"))
+ {
String temp = intent.getAction().substring(27);
int chatId = 0;
try {
@@ -753,25 +782,39 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
}
}
- /*if (push_user_id != 0) {
- Bundle args = new Bundle();
- args.putInt("user_id", push_user_id);
- if (mainFragmentsStack.isEmpty() || MessagesController.checkCanOpenChat(args, mainFragmentsStack.get(mainFragmentsStack.size() - 1))) {
- ChatActivity fragment = new ChatActivity(args);
- if (actionBarLayout.presentFragment(fragment, false, true, true)) {
- pushOpened = true;
+ if( createChatWith!=null /*should be first as it may be combined with sendingText */ )
+ {
+ final String createChatWithFinal = createChatWith;
+ AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ builder.setPositiveButton(LocaleController.getString("OK", R.string.OK), new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialogInterface, int i) {
+ int chatId = MrMailbox.createChatByContactId(MrMailbox.createContact("", createChatWithFinal));
+ if( chatId != 0 ) {
+ if( sendingText!=null ) { MrMailbox.getChat(chatId).setDraft(sendingText, 0); }
+ Bundle args = new Bundle();
+ args.putInt("chat_id", chatId);
+ boolean removeLast = actionBarLayout.fragmentsStack.size() > 1 && actionBarLayout.fragmentsStack.get(actionBarLayout.fragmentsStack.size() - 1) instanceof ChatActivity;
+ actionBarLayout.presentFragment(new ChatActivity(args), removeLast, true, true);
+ }
+
}
- }
- } else*/ if (push_chat_id != 0) {
+ });
+ builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
+ builder.setMessage(AndroidUtilities.replaceTags(LocaleController.formatString("AskStartChatWith", R.string.AskStartChatWith, createChatWith)));
+ builder.show();
+ }
+ else if (push_chat_id != 0)
+ {
Bundle args = new Bundle();
args.putInt("chat_id", push_chat_id);
- //if (mainFragmentsStack.isEmpty() || MessagesController.checkCanOpenChat(args, mainFragmentsStack.get(mainFragmentsStack.size() - 1))) {
- ChatActivity fragment = new ChatActivity(args);
- if (actionBarLayout.presentFragment(fragment, false, true, true)) {
- pushOpened = true;
- }
- //}
- } else if (showDialogsList) {
+ ChatActivity fragment = new ChatActivity(args);
+ if (actionBarLayout.presentFragment(fragment, false, true, true)) {
+ pushOpened = true;
+ }
+ }
+ else if (showDialogsList)
+ {
if (!AndroidUtilities.isTablet()) {
actionBarLayout.removeAllFragments();
} else {
@@ -786,14 +829,17 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
pushOpened = false;
isNew = false;
}
- else if (videoPath != null || photoPathsArray != null || sendingText != null || documentsPathsArray != null || contactsToSend != null || documentsUrisArray != null) {
+ else if (videoPath != null || photoPathsArray != null || sendingText != null || documentsPathsArray != null || contactsToSend != null || documentsUrisArray != null)
+ {
if (!AndroidUtilities.isTablet()) {
NotificationCenter.getInstance().postNotificationName(NotificationCenter.closeChats);
}
if (dialogId == 0) {
Bundle args = new Bundle();
args.putBoolean("onlySelect", true);
- args.putString("selectAlertString", LocaleController.getString("SendMessagesTo", R.string.SendMessagesTo));
+ args.putString("selectAlertString", ApplicationLoader.applicationContext.getString(R.string.SendMessagesTo));
+ args.putString("selectAlertPreviewString", sendingText /*may be NULL*/);
+ args.putString("selectAlertOkButtonString", ApplicationLoader.applicationContext.getString(R.string.Send));
DialogsActivity fragment = new DialogsActivity(args);
fragment.setDelegate(this);
boolean removeLast;
@@ -820,16 +866,18 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
}
}
- if (!pushOpened && !isNew) {
+ if (!pushOpened && !isNew)
+ {
if (AndroidUtilities.isTablet()) {
- if (actionBarLayout.fragmentsStack.isEmpty()) {
- actionBarLayout.addFragmentToStack(new DialogsActivity(null));
- drawerLayoutContainer.setAllowOpenDrawer(true, false);
- }
- } else {
if (actionBarLayout.fragmentsStack.isEmpty()) {
- actionBarLayout.addFragmentToStack(new DialogsActivity(null));
- drawerLayoutContainer.setAllowOpenDrawer(true, false);
+ actionBarLayout.addFragmentToStack(new DialogsActivity(null));
+ drawerLayoutContainer.setAllowOpenDrawer(true, false);
+ }
+ }
+ else {
+ if (actionBarLayout.fragmentsStack.isEmpty()) {
+ actionBarLayout.addFragmentToStack(new DialogsActivity(null));
+ drawerLayoutContainer.setAllowOpenDrawer(true, false);
}
}
actionBarLayout.showLastFragment();