Compare commits

..

28 Commits

Author SHA1 Message Date
B. Petersen c01eab9b00 changelog 2018-03-19 15:36:13 +01:00
B. Petersen 76a1fc4803 changelog 2018-03-19 15:33:51 +01:00
B. Petersen 01e46c72cd typo 2018-03-19 15:32:13 +01:00
B. Petersen 957153e79e bump version 2018-03-19 15:27:32 +01:00
B. Petersen c3d1b6814c Update messenger-backend submodule. 2018-03-19 15:26:07 +01:00
B. Petersen d0672865ce changelog 2018-03-19 15:25:42 +01:00
B. Petersen 74ffbf48be hide qr-code options, you can enabled them by entering '.set qr_enabled 1' into the 'my name' field (a little weired, see #215) 2018-03-19 14:06:19 +01:00
B. Petersen 06cb0ff325 Update messenger-backend submodule. 2018-03-18 22:04:23 +01:00
B. Petersen 5af70bc27c allow formatting the message info dialog 2018-03-18 22:04:06 +01:00
B. Petersen 3240a25aef Update messenger-backend submodule. 2018-03-18 00:44:31 +01:00
B. Petersen 88688e6a81 improve qr code error handling 2018-03-17 22:59:18 +01:00
B. Petersen 081e2b23b1 recognize basic qr codes 2018-03-17 19:29:58 +01:00
B. Petersen cc8e178e85 update Tamil translation 2018-03-15 15:44:31 +01:00
B. Petersen 1411e7be15 Update messenger-backend submodule. 2018-03-15 15:41:51 +01:00
B. Petersen d5c2a8b9fa do not call heartbeat() from the main thread - this retults in massive hangs in the past if the network was down when trying to connect to IMAP 2018-03-15 14:23:17 +01:00
B. Petersen 60b9085237 add option to scan qr code 2018-03-14 20:58:43 +01:00
B. Petersen 828f96a73d add an option to show the fingerprint as an OPENPGP4FPR qr-code 2018-03-14 01:19:18 +01:00
B. Petersen 2b8cb0c495 remove unsed parameter 2018-03-13 19:25:23 +01:00
B. Petersen c0457803c7 update Turkish translation 2018-03-11 22:36:41 +01:00
B. Petersen 3a8b40bfa0 Update messenger-backend submodule. 2018-03-11 22:35:31 +01:00
B. Petersen 8e8ade004c update Russian, Tamil, Turkish translations 2018-03-05 16:31:22 +01:00
B. Petersen bb7452918d Update messenger-backend submodule. 2018-03-02 16:23:12 +01:00
B. Petersen 3731884843 add file 2018-03-02 16:22:48 +01:00
B. Petersen 28f9eca5e4 Update messenger-backend submodule. 2018-03-02 13:40:21 +01:00
Björn Petersen deda874741 Merge pull request #257 from deltachat/fix53
Use new function to create groups directly from the Contact requests
2018-03-02 13:32:02 +01:00
B. Petersen ed4ba18767 adapt chat creation to the new deaddrop behavior 2018-03-01 23:03:55 +01:00
B. Petersen edfbab06db simplify drawing deaddrop-reply button condition 2018-03-01 21:36:33 +01:00
B. Petersen bdee370b7e hide 'please start chatting' hint if the overview shows and empty archived-chats list (may happen when chats are unarchived in subsequent screens) 2018-03-01 00:53:17 +01:00
26 changed files with 698 additions and 88 deletions
+15
View File
@@ -1,5 +1,20 @@
# Delta Chat Changelog
## v0.16.0
2018-03-19
* Messages from normal clients to more than one recipient create an implicit "ad-hoc group"
* Allow group creation though contact requests
* Always display the _sending_ time in the chat list; the list itself is sorted by _receiving_ time and "Message info" shows both times now
* If parts but the footnote are cut from mails, this is indicated "..."; use "Message info" to get the full text
* Highlight the subject in the "Message info"
* Autoconfigure prefers 'https' over 'http'
* Bug fixes, eg. avoid freezes if the connection is lost
* Update Russian, Tamil and Turkish translations
This function requires access to the camera for upcoming qr code scanning
options which may be tested already in this version, see commit 74ffbf4.
## v0.15.0
2018-02-27
+4 -2
View File
@@ -27,6 +27,8 @@ dependencies {
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.googlecode.mp4parser:isoparser:1.0.6'
compile 'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1'
compile 'com.google.zxing:core:3.3.0'
compile 'com.journeyapps:zxing-android-embedded:3.4.0'
compile fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar')
}
@@ -122,7 +124,7 @@ android {
targetSdkVersion 25 // 25: Nougat. CAVE: Do NOT target "Andoid O" without checking the background tasks carefully, see https://developer.android.com/preview/behavior-changes.html#back-all . As long as we target "Nougat", everything works as expected even for "Andoid O" or later
// in general, we should not change the target without reason; eg. after the switch to Nougat, the camera stops working (see https://inthecheesefactory.com/blog/how-to-share-access-to-file-with-fileprovider-on-android-nougat/en )
versionName "0.15.0" // do NOT forget to increase defaultConfig.versionCode!
versionCode 513
versionName "0.16.0" // do NOT forget to increase defaultConfig.versionCode!
versionCode 514
}
}
+2 -1
View File
@@ -1650,7 +1650,8 @@ LOCAL_SRC_FILES += \
./messenger-backend/src/mrmailbox_e2ee.c \
./messenger-backend/src/mrmailbox_imex.c \
./messenger-backend/src/mrmailbox_log.c \
./messenger-backend/src/mrmailbox_tools.c \
./messenger-backend/src/mrmailbox_oob.c \
./messenger-backend/src/mrmailbox_receive_imf.c \
./messenger-backend/src/mrmimefactory.c \
./messenger-backend/src/mrmimeparser.c \
./messenger-backend/src/mrmsg.c \
+32
View File
@@ -405,6 +405,12 @@ JNIEXPORT jint Java_com_b44t_messenger_MrMailbox_createChatByContactId(JNIEnv *e
}
JNIEXPORT jint Java_com_b44t_messenger_MrMailbox_createChatByMsgId(JNIEnv *env, jclass cls, jint msg_id)
{
return (jint)mrmailbox_create_chat_by_msg_id(get_mrmailbox_t(env, cls), msg_id);
}
JNIEXPORT jint Java_com_b44t_messenger_MrMailbox_createGroupChat(JNIEnv *env, jclass cls, jstring name)
{
CHAR_REF(name);
@@ -580,6 +586,26 @@ JNIEXPORT jint Java_com_b44t_messenger_MrMailbox_getConfigInt(JNIEnv *env, jclas
}
/* MrMailbox - out-of-band verification */
JNIEXPORT jstring Java_com_b44t_messenger_MrMailbox_getQr(JNIEnv *env, jclass cls)
{
char* temp = mrmailbox_get_qr(get_mrmailbox_t(env, cls));
jstring ret = JSTRING_NEW(temp);
free(temp);
return ret;
}
JNIEXPORT jlong Java_com_b44t_messenger_MrMailbox_checkScannedQrCPtr(JNIEnv *env, jclass cls, jstring qr)
{
CHAR_REF(qr);
jlong ret = (jlong)mrmailbox_check_scanned_qr(get_mrmailbox_t(env, cls), qrPtr);
CHAR_UNREF(qr);
return ret;
}
/* MrMailbox - misc. */
JNIEXPORT jstring Java_com_b44t_messenger_MrMailbox_getInfo(JNIEnv *env, jclass cls)
@@ -1184,6 +1210,12 @@ JNIEXPORT jint Java_com_b44t_messenger_MrLot_getState(JNIEnv *env, jobject obj)
}
JNIEXPORT jint Java_com_b44t_messenger_MrLot_getId(JNIEnv *env, jobject obj)
{
return mrlot_get_id(get_mrlot_t(env, obj));
}
JNIEXPORT void Java_com_b44t_messenger_MrLot_MrLotUnref(JNIEnv *env, jclass c, jlong hLot)
{
mrlot_unref((mrlot_t*)hLot);
+7 -2
View File
@@ -41,7 +41,7 @@
<uses-permission android:name="android.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<!-- <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" /> - required for AndroidUtilities.uninstallShortcut() -->
<!-- <uses-permission android:name="android.permission.CAMERA" /> - also disabled in T'gram; we're using the camera via an intent only -->
<uses-permission android:name="android.permission.CAMERA" /> <!-- needed for qr code scanning, not needed for taking photos (we're using an intent for this) -->
<application
android:name=".ApplicationLoader"
@@ -112,7 +112,12 @@
</activity>
<activity
android:name=".SettingsAdvActivity"
android:name=".QRshowActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize">
</activity>
<activity
android:name=".QRscanActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize">
</activity>
@@ -212,7 +212,7 @@ public class ActionBarMenuItem extends FrameLayout {
subMenuOpenSide = side;
}
public TextView addSubItem(int id, String text, int icon) {
public TextView addSubItem(int id, String text) {
if (popupLayout == null) {
rect = new Rect();
location = new int[2];
@@ -249,15 +249,6 @@ public class ActionBarMenuItem extends FrameLayout {
textView.setMinWidth(AndroidUtilities.dp(196));
textView.setTag(id);
textView.setText(text);
if (icon != 0) {
textView.setCompoundDrawablePadding(AndroidUtilities.dp(12));
if (!LocaleController.isRTL) {
textView.setCompoundDrawablesWithIntrinsicBounds(getResources().getDrawable(icon), null, null, null);
} else {
textView.setCompoundDrawablesWithIntrinsicBounds(null, null, getResources().getDrawable(icon), null);
}
}
//popupLayout.setShowedFromBotton(showFromBottom);
popupLayout.addView(textView);
LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) textView.getLayoutParams();
layoutParams.gravity = Gravity.START;
@@ -1189,7 +1189,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
}
}
public void setMessageObject(MessageObject messageObject) {
public void setMessageObject(MessageObject messageObject, boolean drawNewchatButton_) {
boolean messageChanged = currentMessageObject != messageObject || messageObject.forceUpdate;
boolean dataChanged = currentMessageObject == messageObject && isUserDataChanged();
if (messageChanged || dataChanged || isPhotoDataChanged(messageObject)) {
@@ -1200,7 +1200,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
isCheckPressed = true;
isAvatarVisible = false;
wasLayout = false;
drawNewchatButton = checkNeedDrawNewchatButton(messageObject);
drawNewchatButton = drawNewchatButton_;
currentUser = null;
drawNameLayout = false;
@@ -1315,7 +1315,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
photoImage.setForcePreview(false);
if (messageObject.type == MessageObject.MO_TYPE9_FILE) {
backgroundWidth = Math.min(displaySize.x - dp(isGroupChat && messageObject.isFromUser() && !messageObject.isOutOwner() ? 102 : 50), dp(270));
if (checkNeedDrawNewchatButton(messageObject)) {
if (drawNewchatButton) {
backgroundWidth -= dp(20);
}
int maxWidth = backgroundWidth - dp(86 + 52);
@@ -1387,7 +1387,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
int maxPhotoWidth;
maxPhotoWidth = photoWidth = (int) (Math.min(displaySize.x, displaySize.y) * 0.7f);
photoHeight = photoWidth + dp(100);
if (checkNeedDrawNewchatButton(messageObject)) {
if (drawNewchatButton) {
maxPhotoWidth -= dp(20);
photoWidth -= dp(20);
}
@@ -2040,13 +2040,6 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
return isPressed() && isCheckPressed || !isCheckPressed && isPressed || isHighlighted;
}
private boolean checkNeedDrawNewchatButton(MessageObject messageObject) {
if( messageObject.getDialogId()== MrChat.MR_CHAT_ID_DEADDROP) {
return true;
}
return false;
}
private void setMessageObjectInternal(MessageObject messageObject) {
if (currentMessageObject.isFromUser()) {
@@ -498,7 +498,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
} else if (id == ID_INFO) {
String info_str = MrMailbox.getMsgInfo(getFirstSelectedId());
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
builder.setMessage(info_str);
builder.setMessage(AndroidUtilities.replaceTags(info_str));
builder.setPositiveButton(R.string.OK, null);
showDialog(builder.create());
actionBar.hideActionMode();
@@ -600,7 +600,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
headerItem = menu.addItem(0, R.drawable.ic_ab_other);
headerItem.addSubItem(ID_SEARCH, context.getString(R.string.Search), 0);
headerItem.addSubItem(ID_SEARCH, context.getString(R.string.Search));
m_canMute = true;
if( m_isChatWithDeaddrop /*&& !m_isDeaddropInChatlist*/ ) {
@@ -608,7 +608,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
}
if( m_canMute ) {
muteMenuEntry = headerItem.addSubItem(ID_MUTE, null, 0);
muteMenuEntry = headerItem.addSubItem(ID_MUTE, null);
}
//if( !m_isChatWithDeaddrop ) {
@@ -616,12 +616,12 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
//}
if( !m_isChatWithDeaddrop ) {
headerItem.addSubItem(ID_SHOW_PROFILE, context.getString(R.string.ViewProfile), 0);
headerItem.addSubItem(ID_SHOW_PROFILE, context.getString(R.string.ViewProfile));
if( m_mrChat.getType()== MrChat.MR_CHAT_GROUP ) {
headerItem.addSubItem(ID_LEAVE_GROUP, context.getString(R.string.LeaveGroup), 0);
headerItem.addSubItem(ID_LEAVE_GROUP, context.getString(R.string.LeaveGroup));
}
headerItem.addSubItem(ID_ARCHIVE_CHAT, context.getString(m_mrChat.getArchived()==0? R.string.ArchiveChat : R.string.UnarchiveChat), 0);
headerItem.addSubItem(ID_DELETE_CHAT, context.getString(R.string.DeleteChat), 0);
headerItem.addSubItem(ID_ARCHIVE_CHAT, context.getString(m_mrChat.getArchived()==0? R.string.ArchiveChat : R.string.UnarchiveChat));
headerItem.addSubItem(ID_DELETE_CHAT, context.getString(R.string.DeleteChat));
}
updateTitle();
@@ -707,13 +707,13 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
actionModeViews.add(actionMode.addItem(ID_FORWARD, R.drawable.ic_ab_fwd_forward, Theme.ACTION_BAR_MODE_SELECTOR_COLOR, null, AndroidUtilities.dp(54)));
ActionBarMenuItem submenu = actionMode.addItem(0, R.drawable.ic_ab_other_grey);
if( m_isChatWithDeaddrop ) {
m_replyMenuItem = submenu.addSubItem(ID_REPLY, context.getString(R.string.Reply), 0);
m_replyMenuItem = submenu.addSubItem(ID_REPLY, context.getString(R.string.Reply));
}
submenu.addSubItem(ID_COPY, context.getString(R.string.CopyToClipboard), 0);
m_saveToXXMenuItem = submenu.addSubItem(ID_SAVE_TO_XX, "", 0);
m_openMenuItem = submenu.addSubItem(ID_OPEN, context.getString(R.string.Open), 0);
m_shareMenuItem = submenu.addSubItem(ID_SHARE, context.getString(R.string.Share), 0);
m_infoMenuItem = submenu.addSubItem(ID_INFO, context.getString(R.string.Info), 0);
submenu.addSubItem(ID_COPY, context.getString(R.string.CopyToClipboard));
m_saveToXXMenuItem = submenu.addSubItem(ID_SAVE_TO_XX, "");
m_openMenuItem = submenu.addSubItem(ID_OPEN, context.getString(R.string.Open));
m_shareMenuItem = submenu.addSubItem(ID_SHARE, context.getString(R.string.Share));
m_infoMenuItem = submenu.addSubItem(ID_INFO, context.getString(R.string.Info));
actionModeViews.add(submenu);
checkActionBarMenu();
@@ -1453,7 +1453,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
}
}
private void createChatByDeaddropMsgId(int messageId)
private void createChatByDeaddropMsgId(final int messageId)
{
final Context context = getParentActivity();
if (context == null) {
@@ -1475,7 +1475,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
builder.setPositiveButton(R.string.OK, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
int chatId = MrMailbox.createChatByContactId(fromId);
int chatId = MrMailbox.createChatByMsgId(messageId);
if( chatId != 0 ) {
Bundle args = new Bundle();
args.putInt("chat_id", chatId);
@@ -2823,7 +2823,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
ChatMessageCell messageCell = (ChatMessageCell) view;
messageCell.isGroupChat = m_mrChat.getType()==MrChat.MR_CHAT_GROUP;
messageCell.setMessageObject(msgDrawObj);
messageCell.setMessageObject(msgDrawObj, m_isChatWithDeaddrop);
messageCell.setCheckPressed(!disableSelection, disableSelection && selected);
messageCell.setHighlighted(highlightMessageId != 0 && msgDrawObj.getId() == highlightMessageId);
@@ -51,6 +51,10 @@ import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;
import com.b44t.messenger.Cells.GreySectionCell;
import com.b44t.messenger.aosp.LinearLayoutManager;
@@ -115,6 +119,8 @@ public class ChatlistActivity extends BaseFragment implements NotificationCenter
private static final int ID_NEW_GROUP= 3;
private static final int ID_SETTINGS = 5;
private static final int ID_DEADDROP = 7;
private static final int ID_SCAN_QR = 8;
private static final int ID_SHOW_QR = 9;
public interface ChatlistActivityDelegate {
void didSelectChat(ChatlistActivity fragment, long dialog_id, boolean param);
@@ -262,11 +268,15 @@ public class ChatlistActivity extends BaseFragment implements NotificationCenter
item.getSearchField().setHint(ApplicationLoader.applicationContext.getString(R.string.Search));
headerItem = menu.addItem(0, R.drawable.ic_ab_other);
headerItem.addSubItem(ID_NEW_CHAT, ApplicationLoader.applicationContext.getString(R.string.NewChat), 0);
headerItem.addSubItem(ID_NEW_GROUP, ApplicationLoader.applicationContext.getString(R.string.NewGroup), 0);
headerItem.addSubItem(ID_NEW_CHAT, ApplicationLoader.applicationContext.getString(R.string.NewChat));
headerItem.addSubItem(ID_NEW_GROUP, ApplicationLoader.applicationContext.getString(R.string.NewGroup));
if(!onlySelect) {
headerItem.addSubItem(ID_DEADDROP, ApplicationLoader.applicationContext.getString(R.string.Deaddrop), 0);
headerItem.addSubItem(ID_SETTINGS, ApplicationLoader.applicationContext.getString(R.string.Settings), 0);
if( MrMailbox.getConfigInt("qr_enabled", 0) != 0 ) {
headerItem.addSubItem(ID_SCAN_QR, ApplicationLoader.applicationContext.getString(R.string.QrScan));
headerItem.addSubItem(ID_SHOW_QR, ApplicationLoader.applicationContext.getString(R.string.QrShow));
}
headerItem.addSubItem(ID_DEADDROP, ApplicationLoader.applicationContext.getString(R.string.Deaddrop));
headerItem.addSubItem(ID_SETTINGS, ApplicationLoader.applicationContext.getString(R.string.Settings));
}
}
@@ -332,6 +342,14 @@ public class ChatlistActivity extends BaseFragment implements NotificationCenter
} else if (id == ID_SETTINGS) {
presentFragment(new SettingsFragment());
}
else if(id == ID_SCAN_QR) {
new IntentIntegrator(getParentActivity()).setCaptureActivity(QRscanActivity.class).initiateScan();
}
else if(id == ID_SHOW_QR) {
Intent intent2 = new Intent(getParentActivity(), QRshowActivity.class);
getParentActivity().startActivity(intent2);
}
}
}
});
@@ -404,7 +422,7 @@ public class ChatlistActivity extends BaseFragment implements NotificationCenter
builder.setPositiveButton(R.string.OK, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
int belonging_chat_id = MrMailbox.createChatByContactId(msg.getFromId());
int belonging_chat_id = MrMailbox.createChatByMsgId(msg.getId());
if( belonging_chat_id != 0 ) {
Bundle args = new Bundle();
args.putInt("chat_id", belonging_chat_id);
@@ -521,22 +539,24 @@ public class ChatlistActivity extends BaseFragment implements NotificationCenter
}
});
TextView textView = new TextView(context);
textView.setText(context.getString(R.string.NoChats));
textView.setTextColor(0xff959595);
textView.setGravity(Gravity.CENTER);
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20);
emptyView.addView(textView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT));
if( !showArchivedOnly ) {
TextView textView = new TextView(context);
textView.setText(context.getString(R.string.NoChats));
textView.setTextColor(0xff959595);
textView.setGravity(Gravity.CENTER);
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20);
emptyView.addView(textView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT));
textView = new TextView(context);
String help = context.getString(R.string.NoChatsHelp);
textView.setText(help);
textView.setTextColor(0xff959595);
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15);
textView.setGravity(Gravity.CENTER);
textView.setPadding(AndroidUtilities.dp(8), AndroidUtilities.dp(8), AndroidUtilities.dp(8), AndroidUtilities.dp(64) /*move the whole stuff a little bit up*/);
textView.setLineSpacing(AndroidUtilities.dp(2), 1);
emptyView.addView(textView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT));
textView = new TextView(context);
String help = context.getString(R.string.NoChatsHelp);
textView.setText(help);
textView.setTextColor(0xff959595);
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15);
textView.setGravity(Gravity.CENTER);
textView.setPadding(AndroidUtilities.dp(8), AndroidUtilities.dp(8), AndroidUtilities.dp(8), AndroidUtilities.dp(64) /*move the whole stuff a little bit up*/);
textView.setLineSpacing(AndroidUtilities.dp(2), 1);
emptyView.addView(textView, LayoutHelper.createLinear(LayoutHelper.WRAP_CONTENT, LayoutHelper.WRAP_CONTENT));
}
if(!onlySelect && !showArchivedOnly) {
floatingButton = new ImageView(context);
@@ -690,6 +710,69 @@ public class ChatlistActivity extends BaseFragment implements NotificationCenter
@Override
public void onActivityResultFragment(int requestCode, int resultCode, Intent data) {
if (requestCode == IntentIntegrator.REQUEST_CODE) {
IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
if (scanResult == null || scanResult.getFormatName() == null) {
return; // Should not happen!
}
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
String qrRawString = scanResult.getContents();
final MrLot qrParsed = MrMailbox.checkScannedQr(qrRawString);
switch( qrParsed.getState() ) {
case MrMailbox.MR_QR_FINGERPRINT_WITHOUT_ADDR:
builder.setMessage(AndroidUtilities.replaceTags(ApplicationLoader.applicationContext.getString(R.string.OobFingerprintWithoutAddr)+"\n\n<c#808080>"+ApplicationLoader.applicationContext.getString(R.string.OobFingerprint)+":\n"+qrParsed.getText2()+"</c>"));
builder.setPositiveButton(R.string.OK, null);
builder.setNeutralButton(R.string.CopyToClipboard, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
AndroidUtilities.addToClipboard(qrParsed.getText2());
AndroidUtilities.showDoneHint(getParentActivity());
}
});
break;
case MrMailbox.MR_QR_ASK_CMP_FINGERPRINT:
case MrMailbox.MR_QR_ADDR:
String name = MrMailbox.getContact(qrParsed.getId()).getNameNAddr();
builder.setMessage(AndroidUtilities.replaceTags(String.format(ApplicationLoader.applicationContext.getString(R.string.AskStartChatWith), name)));
builder.setPositiveButton(R.string.OK, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Bundle args = new Bundle();
args.putInt("chat_id", MrMailbox.createChatByContactId(qrParsed.getId()));
presentFragment(new ChatActivity(args), false /*removeLast*/);
}
});
builder.setNegativeButton(R.string.Cancel, null);
break;
default:
String msg;
final String scannedText;
switch( qrParsed.getState() ) {
case MrMailbox.MR_QR_ERROR:scannedText = qrRawString; msg = qrParsed.getText1()+"\n\n<c#808080>"+String.format(ApplicationLoader.applicationContext.getString(R.string.QrScanContainsText), scannedText)+"</c>"; break;
case MrMailbox.MR_QR_TEXT: scannedText = qrParsed.getText1(); msg = String.format(ApplicationLoader.applicationContext.getString(R.string.QrScanContainsText), scannedText); break;
default: scannedText = qrRawString; msg = String.format(ApplicationLoader.applicationContext.getString(R.string.QrScanContainsText), scannedText); break;
}
builder.setMessage(AndroidUtilities.replaceTags(msg));
builder.setPositiveButton(R.string.OK, null);
builder.setNeutralButton(R.string.CopyToClipboard, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
AndroidUtilities.addToClipboard(scannedText);
AndroidUtilities.showDoneHint(getParentActivity());
}
});
break;
}
showDialog(builder.create());
}
/* -- see comment above
if (requestCode == BaseFragment.RC600_BATTERY_REQUEST_DONE) {
boolean requestIgnoreActivityMaybeRestarted = false;
@@ -250,9 +250,9 @@ public class ContactsActivity extends BaseFragment implements NotificationCenter
ActionBarMenuItem item = menu.addItem(10, R.drawable.ic_ab_other);
if (do_what == SELECT_CONTACT_FOR_NEW_CHAT || do_what == SELECT_CONTACTS_FOR_NEW_GROUP) {
item.addSubItem(id_toggle, do_what == SELECT_CONTACT_FOR_NEW_CHAT ? context.getString(R.string.NewGroup) : context.getString(R.string.NewChat), 0);
item.addSubItem(id_toggle, do_what == SELECT_CONTACT_FOR_NEW_CHAT ? context.getString(R.string.NewGroup) : context.getString(R.string.NewChat));
}
item.addSubItem(id_add_contact, context.getString(R.string.NewContactTitle), 0);
item.addSubItem(id_add_contact, context.getString(R.string.NewContactTitle));
listViewAdapter = new ContactsAdapter(context);
@@ -49,6 +49,7 @@ public class MrLot {
public native String getText2();
public native long getTimestamp();
public native int getState();
public native int getId();
private long m_hLot;
private native static void MrLotUnref(long hLot);
@@ -133,7 +133,8 @@ public class MrMailbox {
public native static void archiveChat (int chat_id, int archive);
public native static int getChatIdByContactId (int contact_id);
public native static int createChatByContactId(int contact_id); // returns chat_id
public native static int createChatByContactId(int contact_id);
public native static int createChatByMsgId (int msg_id);
public native static int createGroupChat (String name);
public native static int isContactInChat (int chat_id, int contact_id);
@@ -179,6 +180,17 @@ public class MrMailbox {
private native static long MrMailboxGetMsg (long hMailbox, int id); // return hMsg which must be unref'd after usage
private native static String MrMailboxGetMsgInfo (long hMailbox, int id);
// out-of-band verification
public native static String getQr();
public final static int MR_QR_ASK_CMP_FINGERPRINT = 200;
public final static int MR_QR_FINGERPRINT_WITHOUT_ADDR = 210;
public final static int MR_QR_ADDR = 220;
public final static int MR_QR_TEXT = 230;
public final static int MR_QR_ERROR = 400;
public static MrLot checkScannedQr(String qr) { return new MrLot(checkScannedQrCPtr(qr)); }
public native static int checkScannedQrCPtr(String qr);
// static
public native static String MrGetVersionStr ();
public native static String CPtr2String (long hString); // get strings eg. from data1 from the callback
@@ -257,8 +257,8 @@ public class PasscodeActivity extends BaseFragment implements NotificationCenter
if (screen == SCREEN1_ENTER_CODE1) {
dropDownContainer = new ActionBarMenuItem(context, menu, 0);
dropDownContainer.setSubMenuOpenSide(1);
dropDownContainer.addSubItem(pin_item, context.getString(R.string.PasscodePIN), 0);
dropDownContainer.addSubItem(password_item, context.getString(R.string.PasscodePassword), 0);
dropDownContainer.addSubItem(pin_item, context.getString(R.string.PasscodePIN));
dropDownContainer.addSubItem(password_item, context.getString(R.string.PasscodePassword));
actionBar.addView(dropDownContainer);
layoutParams = (FrameLayout.LayoutParams) dropDownContainer.getLayoutParams();
layoutParams.height = LayoutHelper.MATCH_PARENT;
@@ -158,8 +158,8 @@ public class PhotoAlbumPickerActivity extends BaseFragment implements Notificati
dropDownContainer = new ActionBarMenuItem(context, menu, 0);
dropDownContainer.setSubMenuOpenSide(1);
dropDownContainer.addSubItem(ID_ITEM_PHOTOS, context.getString(R.string.PickerPhotos), 0);
dropDownContainer.addSubItem(ID_ITEM_VIDEO, context.getString(R.string.PickerVideo), 0);
dropDownContainer.addSubItem(ID_ITEM_PHOTOS, context.getString(R.string.PickerPhotos));
dropDownContainer.addSubItem(ID_ITEM_VIDEO, context.getString(R.string.PickerVideo));
actionBar.addView(dropDownContainer);
FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) dropDownContainer.getLayoutParams();
layoutParams.height = LayoutHelper.MATCH_PARENT;
@@ -936,10 +936,10 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
ActionBarMenu menu = actionBar.createMenu();
menuItem = menu.addItem(0, R.drawable.ic_ab_other);
menuItem.addSubItem(gallery_menu_save, ApplicationLoader.applicationContext.getString(R.string.SaveToGallery), 0);
menuItem.addSubItem(gallery_menu_share, ApplicationLoader.applicationContext.getString(R.string.Share), 0);
//menuItem.addSubItem(gallery_menu_forward, LocaleController.getString("Forward", R.string.Forward), 0);
//menuItem.addSubItem(gallery_menu_delete, LocaleController.getString("Delete", R.string.Delete), 0);
menuItem.addSubItem(gallery_menu_save, ApplicationLoader.applicationContext.getString(R.string.SaveToGallery));
menuItem.addSubItem(gallery_menu_share, ApplicationLoader.applicationContext.getString(R.string.Share));
//menuItem.addSubItem(gallery_menu_forward, LocaleController.getString("Forward", R.string.Forward));
//menuItem.addSubItem(gallery_menu_delete, LocaleController.getString("Delete", R.string.Delete));
//captionDoneItem = menu.addItemWithWidth(gallery_menu_caption_done, R.drawable.ic_done, AndroidUtilities.dp(56));
//captionItem = menu.addItemWithWidth(gallery_menu_caption, R.drawable.photo_text, AndroidUtilities.dp(56));
@@ -164,7 +164,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
avatarUpdater.delegate = new AvatarUpdater.AvatarUpdaterDelegate() {
@Override
public void didUploadedPhoto(TLRPC.InputFile file, TLRPC.PhotoSize small, TLRPC.PhotoSize big) {
if (user_id==0 && chat_id > MrChat.MR_CHAT_ID_LAST_SPECIAL) {
if (user_id==0 && chat_id != 0 ) {
String nameonly = big.location.volume_id + "_" + big.location.local_id + ".jpg";
File fileobj = new File(FileLoader.getInstance().getDirectory(FileLoader.MEDIA_DIR_CACHE), nameonly);
String fullpath = fileobj.getAbsolutePath();
@@ -511,7 +511,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
avatarImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (user_id==0 && chat_id > MrChat.MR_CHAT_ID_LAST_SPECIAL) {
if (user_id==0 && chat_id != 0 ) {
// show menu to change the group image
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
CharSequence[] items;
@@ -913,16 +913,16 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
ActionBarMenuItem item = menu.addItem(10, R.drawable.ic_ab_other);
if( chat_id!=0 || MrMailbox.getChatIdByContactId(user_id)!=0 ) {
item.addSubItem(ID_ADD_SHORTCUT, ApplicationLoader.applicationContext.getString(R.string.AddShortcut), 0);
item.addSubItem(ID_ADD_SHORTCUT, ApplicationLoader.applicationContext.getString(R.string.AddShortcut));
}
if (user_id != 0) {
item.addSubItem(ID_COPY_EMAIL_TO_CLIPBOARD, ApplicationLoader.applicationContext.getString(R.string.CopyToClipboard), 0);
item.addSubItem(ID_COPY_EMAIL_TO_CLIPBOARD, ApplicationLoader.applicationContext.getString(R.string.CopyToClipboard));
}
if( user_id != 0 && user_id != MrContact.MR_CONTACT_ID_SELF ) {
item.addSubItem(ID_BLOCK_CONTACT, userBlocked()? ApplicationLoader.applicationContext.getString(R.string.UnblockContact) : ApplicationLoader.applicationContext.getString(R.string.BlockContact), 0);
item.addSubItem(ID_DELETE_CONTACT, ApplicationLoader.applicationContext.getString(R.string.DeleteContact), 0);
item.addSubItem(ID_BLOCK_CONTACT, userBlocked()? ApplicationLoader.applicationContext.getString(R.string.UnblockContact) : ApplicationLoader.applicationContext.getString(R.string.BlockContact));
item.addSubItem(ID_DELETE_CONTACT, ApplicationLoader.applicationContext.getString(R.string.DeleteContact));
}
@@ -0,0 +1,132 @@
package com.b44t.messenger;
import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.view.KeyEvent;
import android.widget.Toast;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;
import com.journeyapps.barcodescanner.CaptureManager;
import com.journeyapps.barcodescanner.CompoundBarcodeView;
public class QRscanActivity extends Activity {
private CaptureManager capture;
private CompoundBarcodeView barcodeScannerView;
public static final int MY_PERMISSIONS_REQUEST_CAMERA = 42;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_qrscan);
barcodeScannerView = (CompoundBarcodeView)findViewById(R.id.zxing_barcode_scanner);
barcodeScannerView.setStatusText(getString(R.string.QrScan));
if (savedInstanceState != null) {
init(barcodeScannerView, getIntent(), savedInstanceState);
}
// check Android 6 permission
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
== PackageManager.PERMISSION_GRANTED) {
init(barcodeScannerView, getIntent(), null);
} else {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA},
MY_PERMISSIONS_REQUEST_CAMERA);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[],
@NonNull int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_CAMERA: {
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted
init(barcodeScannerView, getIntent(), null);
} else {
setResult(Activity.RESULT_CANCELED);
finish();
}
}
}
}
private void init(CompoundBarcodeView barcodeScannerView, Intent intent, Bundle savedInstanceState) {
capture = new CaptureManager(this, barcodeScannerView);
capture.initializeFromIntent(intent, savedInstanceState);
capture.decode();
}
@Override
protected void onResume() {
super.onResume();
if (capture != null) {
capture.onResume();
}
}
@Override
protected void onPause() {
super.onPause();
if (capture != null) {
capture.onPause();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (capture != null) {
capture.onDestroy();
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (capture != null) {
capture.onSaveInstanceState(outState);
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
return barcodeScannerView.onKeyDown(keyCode, event) || super.onKeyDown(keyCode, event);
}
/**
* Copied from older Barcode Scanner Integration library
*
* IntentIntegrator for the V4 Android compatibility package.
*
* @author Lachezar Dobrev
*/
/*public final class IntentIntegratorSupportV4 extends IntentIntegrator {
private final Fragment mFragment;
public IntentIntegratorSupportV4(Fragment fragment) {
super(fragment.getActivity());
this.mFragment = fragment;
}
@Override
protected void startActivityForResult(Intent intent, int code) {
mFragment.startActivityForResult(intent, code);
}
}
*/
}
@@ -0,0 +1,59 @@
package com.b44t.messenger;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.app.Activity;
import android.widget.ImageView;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
public class QRshowActivity extends Activity {
public final static int WHITE = 0xFFFFFFFF;
public final static int BLACK = 0xFF000000;
public final static int WIDTH = 400;
public final static int HEIGHT = 400;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_qrshow);
ImageView imageView = (ImageView) findViewById(R.id.myImage);
try {
Bitmap bitmap = encodeAsBitmap(MrMailbox.getQr());
imageView.setImageBitmap(bitmap);
} catch (WriterException e) {
e.printStackTrace();
}
}
Bitmap encodeAsBitmap(String str) throws WriterException {
BitMatrix result;
try {
result = new MultiFormatWriter().encode(str,
BarcodeFormat.QR_CODE, WIDTH, HEIGHT, null);
} catch (IllegalArgumentException iae) {
// Unsupported format
return null;
}
int w = result.getWidth();
int h = result.getHeight();
int[] pixels = new int[w * h];
for (int y = 0; y < h; y++) {
int offset = y * w;
for (int x = 0; x < w; x++) {
pixels[offset + x] = result.get(x, y) ? BLACK : WHITE;
}
}
Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, w, 0, 0, w, h);
return bitmap;
}
}
@@ -45,7 +45,15 @@ public class TimerReceiver extends BroadcastReceiver {
// (if the whole App was killed, the IMAP thread is already started by MrMailbox.connect() if we're here)
// (the thread itself will reconnect to the IMAP server as needed)
// however, it seems as if the threads sleep longer than ususal, check this by calling heartbeat() manually
MrMailbox.heartbeat();
//
// CAVE: MrMailbox.heartbeat() must not be called from the mainthread - otherwise eg. when the network hangs,
// this function returns only after the network timeout and the ui thread may hang for minutes ...
Utilities.searchQueue.postRunnable(new Runnable() {
@Override
public void run() {
MrMailbox.heartbeat();
}
});
// create the next alarm in about a minute
scheduleNextAlarm();
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.journeyapps.barcodescanner.CompoundBarcodeView
android:id="@+id/zxing_barcode_scanner"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentBottom="true" />
</RelativeLayout>
@@ -0,0 +1,12 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:id="@+id/myImage"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true" />
</RelativeLayout>
@@ -77,7 +77,7 @@
<string name="Sound">Звук</string>
<string name="InAppNotifications">Уведомления программы</string>
<string name="Vibrate">Вибрация</string>
<string name="ResetAllNotifications">Сбросить все уведомления</string>
<string name="ResetAllNotifications">Сбросить настройки уведомлений</string>
<string name="NotificationsAndSounds">Уведомления и звуки</string>
<string name="BlockedContacts">Заблокированные контакты</string>
<string name="Default">По умолчанию</string>
@@ -366,7 +366,7 @@
<string name="InviteMenuEntry">Отправить приглашения</string>
<string name="InviteText">Я использую систему мгновенных сообщений Delta Chat - %1$s - вы можете написать мне на %2$s</string>
<string name="AdvancedSettings">Расширенные настройки</string>
<string name="AskResetNotifications">Сбросить все настройки уведомлений и звуки этой страницы, а также ваших контактов и групп?</string>
<string name="AskResetNotifications">Сбросить все настройки и звуки уведомлений, перечисленных выше, а также у ваших контактов и групп?</string>
<string name="AttachFiles">Прикрепить файлы</string>
<string name="ErrGroupNameEmpty">Введите название группы.</string>
<string name="MsgNewGroupDraftHint">Напишите первое сообщение, чтобы другие могли отвечать в этой группе.\n\n• Группа будет нормально общаться, даже если не все участники используют Delta Chat.\n\n• Доставка первого сообщения может занять некоторое время.</string>
@@ -42,8 +42,8 @@
<string name="NoRecent">சமீபமாக ஏதுமில்லை </string>
<string name="TypeMessage">சேதி </string>
<string name="SlideToCancel">ரத்து செய்ய திரையில் சறுக்கவும் </string>
<string name="SaveToDownloads">பதிவிறக்கத்தில் சேமி</string>
<string name="SaveToMusic">இசையில் சேமிக்கவும் </string>
<string name="SaveToDownloads">\"பதிவிறக்கத்தில்\" சேமி</string>
<string name="SaveToMusic">\"இசையில்\" சேமிக்கவும் </string>
<string name="Share">பகிர் </string>
<string name="SendItems">%1$sஅனுப்பவும் </string>
<string name="ClearRecentEmoji">சமீபத்தைய emoji களை நீக்கவும் </string>
@@ -103,9 +103,241 @@
<string name="SmartNotifications">அறிவிப்புகளை கட்டுப்படுத்து </string>
<string name="SmartNotificationsSoundAtMost">அதிகத்தில் ஒலிக்கவும் </string>
<string name="SmartNotificationsTimes">வேளைகள் </string>
<string name="SmartNotificationsWithin">இதற்குள்</string>
<string name="SmartNotificationsMinutes">நிமிடங்கள்</string>
<string name="DirectShare">நேரடியான பகிர்வு </string>
<string name="DirectShareInfo">சமீபத்திய அரட்டைகளை பகிர் பட்டியலில் காட்டுக </string>
<!--cache view-->
<string name="CacheSettings">சேமிப்பகம் </string>
<string name="KeepMedia">ஊடகத்தை தக்க வைக்கவும் </string>
<string name="KeepMediaForever">என்றென்றைக்கும் </string>
<!--passcode view-->
<string name="Passcode">கடவு குறியீடு மூலம் பூட்டு </string>
<string name="ChangePasscode">கடவு குறியீட்டை மாற்றவும் </string>
<string name="PasscodePIN">தனிப்பட்ட அடையாள எண் (PIN)</string>
<string name="PasscodePassword">கடவுச்சொல் </string>
<string name="EnterCurrentPasscode">தற்போதைய கடவு குறியீட்டை உள்ளீடவும் </string>
<string name="EnterNewFirstPasscode">கடவு குறியீடை உள்ளிடவும் </string>
<string name="EnterNewPasscode">உங்களது புதிய கடவு குறியீட்டை உள்ளீடவும் </string>
<string name="EnterYourPasscode">கடவு குறியீடை உள்ளீடவும் </string>
<string name="ReEnterYourPasscode">மீண்டும் கடவு குறியீடை உள்ளீடவும் </string>
<string name="PasscodeDoNotMatch">கடவு குறியீடுகள் வேறு வேறாக உள்ளது </string>
<string name="AutoLock">தானியங்கி பூட்டு </string>
<string name="UnlockFingerprint">கைரேகையை கொண்டு திறக்கவும் </string>
<string name="FingerprintInfo">மீண்டும் தொடர்வதற்கு உங்களின் கைரேகையை உறுதி செய்யவும் </string>
<string name="FingerprintNotRecognized">கைரேகையை ஏற்க முடியவில்லை மீண்டும் முயற்சி செய்யவும் </string>
<!--photo gallery view-->
<string name="SaveToGallery">காட்சியகத்தில் (Gallery) சேமிக்கவும் </string>
<string name="Gallery">காட்சி கூடம் </string>
<string name="AllPhotos">எல்லா படங்களும் </string>
<string name="AllVideo">எல்லா காணொளிகளும் </string>
<string name="NoPhotos">எந்த படங்களும் இல்லை </string>
<string name="NoVideo">எந்த காணொளியும் இல்லை </string>
<string name="CropImage">படத்தை தேவைக்கேற்றபடி நறுக்கு (Crop)</string>
<string name="EditImage">படத்தை திருத்தவும் </string>
<string name="Enhance">மேம்படுத்து </string>
<string name="Exposure">வெளிப்பாடு </string>
<string name="Warmth">வெப்பநிலை </string>
<string name="Saturation">செறிவூட்டல்</string>
<string name="Vignette">விக்னெட்டி</string>
<string name="Shadows">நிழல்கள்</string>
<string name="Grain">தானிய விளைவு</string>
<string name="Sharpen">கூர்மையாக்கு</string>
<string name="Fade">மங்கலாக்குதல்</string>
<string name="Tint">நிறமேற்றம்</string>
<string name="TintShadows">நிழல்கள்</string>
<string name="TintHighlights">வெளிப்பாடு </string>
<string name="Curves">வளைவுகள் </string>
<string name="CurvesAll">எல்லாம் </string>
<string name="CurvesRed">சிகப்பு</string>
<string name="CurvesGreen">பச்சை</string>
<string name="CurvesBlue">நீலம்</string>
<string name="Blur">மங்கலாக்கு</string>
<string name="BlurOff">நிறுத்தவும்</string>
<string name="BlurLinear">நேரியல்</string>
<string name="BlurRadial">ஆரத்திசையில்</string>
<string name="DiscardChanges">மாற்றங்களை நீக்கவா ?</string>
<string name="ClearButton">அழிக்கவும் </string>
<string name="PickerPhotos">புகைப்படங்கள் </string>
<string name="PickerVideo">காணொளி </string>
<!--privacy settings-->
<string name="PrivacySettings">அந்தரங்கம் மற்றும் பாதுகாப்பு </string>
<string name="SecurityTitle">பாதுகாப்பு</string>
<!--edit video view-->
<string name="SendVideo">காணொளியை அனுப்பு </string>
<!--button titles-->
<string name="Done">முடிந்தது </string>
<string name="Open">திற </string>
<string name="Cancel">ரத்து செய் </string>
<string name="Edit">திருத்து </string>
<string name="Send">அனுப்பு </string>
<string name="CopyToClipboard">பிடிப்பு பலகை </string>
<string name="Delete">நீக்கவும் </string>
<string name="Forward">முன்னோக்கு </string>
<string name="FromCamera">புகைப்பட கருவியில் இருந்து </string>
<string name="FromGalley">காட்சியகத்தில் இருந்து </string>
<string name="Set">அமை </string>
<string name="OK">சரி </string>
<string name="Crop">நறுக்கு </string>
<!--messages-->
<string name="AttachPhoto">புகைப்படம் </string>
<string name="AttachVideo">காணொளி </string>
<string name="AttachGif">GIF </string>
<string name="AttachContact">தொடர்பு</string>
<string name="AttachDocument">கோப்பு </string>
<string name="AttachVoiceMessage">குரல் செய்தி </string>
<string name="FromSelf">நான் </string>
<!--Alert messages-->
<string name="NoHandleAppInstalled">இந்த வகையான ஆவணத்தை திறக்க எந்த செயலியும் உங்கள் சாதனத்தில் நிறுவப்படவில்லை \'%1$s\', இந்த ஆவணத்தை திறக்கக்கூடிய ஏதேனும் ஒரு செயலியை நிறுவவும் </string>
<string name="ContactAlreadyInGroup">இந்த தொடர்பு இந்த குழுவில் ஏற்கனவே உள்ளது </string>
<string name="ForwardMessagesTo">தேர்வு செய்யப்பட்ட செய்திகளை இவற்றுக்கு <![CDATA[]]>%1$s<![CDATA[]]> முன்னோக்கி அனுப்பவா ? </string>
<string name="AreYouSureDeleteThisChat">இந்த அரட்டையை அழிக்கவா ? இதை இனிமேல் அரட்டை பட்டியலில் காணமுடியாது .
அனால் இந்த அரட்டையின் செய்திகள் சேவக கணிப்பொறியில் இருக்கும் </string>
<string name="AreYouSureBlockContact">இந்த தொடர்பை முடக்கவா ?</string>
<string name="AreYouSureDeleteContact">இந்த தொடர்பை நீக்கவா ?</string>
<string name="PermissionStorage">புகைப்படங்கள், காணொளிகள், இசை கோப்புகள் மற்றும் ஏனைய கோப்புகளை அனுப்பவும் , சேமிக்கவும் நினைவக அணுகல் தேவைப்படுகிறது </string>
<string name="PermissionNoAudio">குரல் செய்திகளை அனுப்ப நுண் ஒலிப்பேசி அணுகல் தேவைப்படுகிறது </string>
<string name="PermissionOpenSettings">அமைப்புகள் </string>
<!--Intro view-->
<string name="Intro1Headline">டெல்டா அரட்டை </string>
</resources>
<string name="Intro2Headline">சுதந்திரமான </string>
<string name="Intro3Headline">வேகமான </string>
<string name="Intro4Headline">திறன்மிகு </string>
<string name="Intro5Headline">இலவசம் </string>
<string name="Intro6Headline">மறைகுறியீடாக்கப்பட்டது </string>
<string name="Intro7Headline">நம்பத்தகுந்த </string>
<string name="IntroStartMessaging">செய்திகளை அனுப்ப தொடங்குங்கள் </string>
<!--plural-->
<plurals name="Members">
<item quantity="one">%d </item>
<item quantity="other"> %dஉறுப்பினர்கள் </item>
</plurals>
<plurals name="Contacts">
<item quantity="one">%dதொடர்புகள் </item>
<item quantity="other">%dதொடர்புகள் </item>
</plurals>
<plurals name="MeAndMembers">
<item quantity="one">%dநானும் மற்றும் உறுப்பினர்களும் </item>
<item quantity="other">%dநானும் மற்றும் உறுப்பினர்களும் </item>
</plurals>
<plurals name="NewMessages">
<item quantity="one">%d புதிய செய்திகள் </item>
<item quantity="other">%d புதிய செய்திகள் </item>
</plurals>
<plurals name="messages">
<item quantity="one">%d செய்திகள் </item>
<item quantity="other">%dசெய்திகள் </item>
</plurals>
<plurals name="Chats">
<item quantity="one">%d அரட்டை</item>
<item quantity="other">%dஅரட்டைகள் </item>
</plurals>
<plurals name="Minutes">
<item quantity="one">%d நிமிடம் </item>
<item quantity="other">%dநிமிடங்கள் </item>
</plurals>
<plurals name="Hours">
<item quantity="one">%d மணி
</item>
<item quantity="other">%d மணிகள் </item>
</plurals>
<plurals name="Days">
<item quantity="one">%d நாள் </item>
<item quantity="other">%d நாட்கள் </item>
</plurals>
<plurals name="Weeks">
<item quantity="one">%dவாரம் </item>
<item quantity="other">%dவாரங்கள் </item>
</plurals>
<plurals name="Months">
<item quantity="one">%dமாதம் </item>
<item quantity="other">%dமாதங்கள் </item>
</plurals>
<!--date formatters-->
<string name="formatterMonthYear">MMMM yyyy</string>
<string name="formatterMonth">MMM dd</string>
<string name="formatterYear">dd.MM.yyyy</string>
<string name="chatDate">EEE, MMMM d</string>
<string name="chatFullDate">EEE, MMMM d, yyyy</string>
<string name="formatterWeek">EEE</string>
<string name="formatterDay24H">HH:mm</string>
<string name="formatterDay12H">h:mm a</string>
<string name="AccountSettings">கணக்கு அமைப்புகள் </string>
<string name="MyAccount">எனது அமைப்புகள் </string>
<string name="MyName">எனது பெயர் </string>
<string name="MyNameExplain">உங்கள் அனுப்புநர்களுக்கு காட்டப்படும் தங்களின் பெயர் , இதை வெற்றிடமாக விட்டால் உங்கள் மின் அஞ்சல் முகவரி உங்கள் அனுப்புநர்களுக்கு காட்டப்படும் </string>
<string name="Password">கடவுச்சொல் </string>
<string name="SmtpPassword">SMTP க்கான கடவுச்சொல் </string>
<string name="FromAbove">மேலே இருந்து </string>
<string name="SmtpLoginname">SMTP க் கான உள் நுழைவு பெயர் </string>
<string name="SmtpPort">SMTP போர்ட் </string>
<string name="Automatic">தானியங்கி </string>
<string name="ImapServer">IMAP சேவகன் </string>
<string name="ImapLoginname">IMAP க் கான உள் நுழைவு பெயர் </string>
<string name="SmtpServer">SMTP க்கான சேவகன் </string>
<string name="ImapPort">IMAP போர்ட் </string>
<string name="InboxHeadline">உட்பெட்டி</string>
<string name="OutboxHeadline">வெளிப்பெட்டி </string>
<string name="MyAccountExplain">அறியப்பட்ட மின் அஞ்சல் வழங்குநர்களுக்கு மற்ற அமைப்புகள் தானாக தீர்மானிக்கப்படும் </string>
<string name="AccountNotConfigured">கணக்கு உள்ளமைக்கப்படவில்லை</string>
<string name="AboutThisProgram">டெல்டா அரட்டையை பற்றி </string>
<string name="NotSet">இன்னும் அமைக்கப்படவில்லை </string>
<string name="NewChat">புது அரட்டை </string>
<string name="Deaddrop">தொடர்பு கோரிக்கை </string>
<string name="DeaddropInChatlist">அரட்டை பட்டியலில் தொடர்பு கோரிக்கைகளை காட்டவும் </string>
<string name="MuteAlways">எப்போதுமே ஊமையாக்கு </string>
<string name="DeaddropHint">மறு உத்தரவிற்கான அம்பு குறியை தட்டி அரட்டையை ஆரம்பிக்கவும் </string>
<string name="NotYetImplemented">இந்த செயல்பாடு தற்போது இல்லை அல்லது முழுமையடையவில்லை </string>
<string name="DefaultStatusText">என்னுடைய டெல்டா அரட்டை செயலியில் இருந்து அனுப்பி உள்ளேன் : https://delta.chat</string>
<string name="Name" >பெயர் </string>
<string name="EmailAddress">மின் அஞ்சல் முகவரி </string>
<string name="CannotDeleteContact">பயன்பாட்டில் உள்ள தொடர்புகளை நீக்க முடியாது , அதற்கு பதில் தொடர்பை முடக்கவும் </string>
<string name="BadEmailAddress">தவறான மின் அஞ்சல் முகவரி </string>
<string name="ContactCreated">தொடர்பு உருவாக்கப்பட்டது </string>
<string name="ViewProfile">சுயவிவரத்தை காண்பி</string>
<!-- Translators: please use a very short string here, it should not much longer than
the string needed for video time+size (0:00, 12,3 Mib) -->
<string name="OneMoment">ஒரு நிமிடம் காத்திருக்கவும் ...</string>
<string name="InviteMenuEntry">அழைப்பிதழ்களை அனுப்பு </string>
<string name="InviteText">நான் தற்போது டெல்டா அரட்டை செயலியை பயன்படுத்தி வருகிறேன் - %1$s - நீங்கள் இதில் எனக்கு செய்தி அனுப்பலாம் %2$s </string>
<string name="AdvancedSettings">மேம்பட்ட அமைப்புகள் </string>
<string name="AskResetNotifications">தற்போதைய பக்கம், தொடர்புகள் மற்றும் குழுக்களுக்கு எல்லா நினைவூட்டல் அமைப்புகள் மற்றும் நினைவூட்டல் சத்தங்களை மீட்டமைக்கவா ?</string>
<string name="AttachFiles">கோப்புகளை இணைக்கவும் </string>
<string name="ErrGroupNameEmpty">குழுவிற்கு ஒரு பெயரை சூட்டவும் </string>
<string name="MsgNewGroupDraft">வணக்கம் , நான் நமக்கு \"%1$s\" என்ற பெயரில் குழுவை உருவாக்கி உள்ளேன் </string>
<string name="MsgGroupImageChanged">குழு படம் மாற்றப்பட்டது.</string>
<string name="MsgMemberAddedToGroup"> %1$s உறுப்பினராக சேர்க்கப்பட்டார் </string>
<string name="MsgMemberRemovedFromToGroup">உறுப்பினர் %1$s நீக்கப்பட்டார் </string>
<string name="ErrSelfNotInGroup">இந்த செயலை செய்ய நீங்கள் குழு உறுப்பினராக இருக்க வேண்டும் </string>
<string name="MsgGroupLeft">குழுவில் இருந்து வெளியேறினது </string>
<string name="SelectContact">ஏதேனும் ஒரு தொடர்பை தெரிவு செய்யவும் </string>
<string name="DoneHint">முடிந்தது </string>
<string name="FileNotFound">%1$sகண்டுபிடிக்க முடியவில்லை. </string>
<string name="Error">பிழை: %1$s</string>
<string name="NoNetwork">இணைய பிணைப்பு இல்லை </string>
<string name="Audio">ஒலி </string>
<string name="PermNotificationTitle">%1$s இதனுடன் இணைக்கப்பட்டது </string>
<string name="PermNotificationText">செய்திகளுக்காக காத்திருக்கிறது ...</string>
<string name="HelpUrl">https://delta.chat/en/help</string>
<string name="EncryptedMessage">மறைகுறியாக்கப்பட்ட செய்தி</string>
<string name="Encryption">மறைகுறியாக்கம் </string>
<string name="EncrinfoE2E">இரண்டு பக்கமும் மறைகுறியாக்கம் செயலாக்கப்பட்டது </string>
<string name="EncrinfoFingerprints">கைரேகைகள் </string>
<string name="Backup">காப்பு நகல் </string>
<string name="NameAndStatus">பெயர் மற்றும் நிலை </string>
<string name="MyStatus">என் நிலை </string>
<string name="MsgGroupImageDeleted">குழு படம் நீக்கப்பட்டது </string>
<string name="AskDeleteGroupImage">குழுவிற்கான படத்தை நீக்கவா ? இந்த செயல் அணைத்து குழு உறுப்பினர்களின் சாதனத்திலும் பாதிக்கும் </string>
<string name="ExportImportHeader">ஏற்றுமதி மற்றும் இறக்குமதி </string>
<string name="IncorrectPassword">தவறான கடவு சொல் </string>
<string name="NoRecentEmoji">கடைசியாக பயன்படுத்த பட்ட எமோஜிகள் இங்கே காண்பிக்கப்படும் </string>
<string name="NotNow">இப்போது இல்லை </string>
<string name="Archived">ஆவண காக்கப்படுத்தப்பட்டது </string>
<string name="LeaveGroup">குழுவில் இருந்து வெளியேறு </string>
<string name="AskLeaveGroup">இந்த குழுவில் இருந்து வெளியேறவா ?</string>
<string name="Never">எப்போதும் இல்லை </string>
<string name="AutocryptKeyTransferPleaseEnterCode">மற்ற சாதனத்தில் காணப்படும் அமைப்பு குறியீடை தயவு செய்து உள்ளீடவும் </string>
<string name="Retry">மீண்டும் முயற்சி செய்யவும் </string>
<string name="SelfTalkSubtitle">தங்களுக்கே அனுப்பி கொண்ட செய்திகள் </string>
</resources>
@@ -85,8 +85,8 @@
<string name="ChatBackground">Söyleşi arkaplanı</string>
<string name="SendByEnter">Enter tuşu ile gönder</string>
<string name="Help">Yardım</string>
<string name="Enabled"></string>
<string name="Disabled">Kapat</string>
<string name="Enabled">ık</string>
<string name="Disabled">Kapalı</string>
<string name="LedColor">LED rengi</string>
<string name="BadgeNumber">Sayıyı akılda tutmak için mümkünse simge kullanın</string>
<string name="Short">Kısa</string>
@@ -194,6 +194,7 @@
<string name="NoHandleAppInstalled">\'%1$s\' dosya türünü açacak kurulu bir uygulama yok, bir tane kurun ve devam edin.</string>
<string name="ContactAlreadyInGroup">Kişi zaten bu grupta.</string>
<string name="ForwardMessagesTo">Seçili iletiler <![CDATA[<b>]]>%1$s<![CDATA[</b>]]> a iletilsin mi?</string>
<string name="SendMessagesTo"><![CDATA[<b>]]>%1$s<![CDATA[</b>]]>\'a ileti gönderilsin mi?</string>
<string name="AreYouSureDeleteThisChat">Bu söyleşiyi silinsin mi? Söyleşi listesinde artık gösterilmeyecek, iletileri sunucuda kalacak.</string>
<string name="AreYouSureBlockContact">Bu kişiyi engellemek istediğinizden emin misiniz?</string>
<string name="AreYouSureDeleteContact">Bu kişiyi silmek istediğizden emin misiniz?</string>
@@ -304,12 +305,15 @@
the string needed for video time+size (0:00, 12,3 Mib) -->
<string name="OneMoment">Bir dakika ...</string>
<string name="NoChatsHelp">Sayfanın sağ altındaki \'\'Yeni söyleşi\'\' düğmesine basarak başlayın ya da daha fazla seçenek için \'\'Menü\'\' düğmesine dokunun.</string>
<string name="Intro7Message"><![CDATA[<b>Delta Chat</b>]]> uyumlu ve standartlara dayalıdır ve iş kullanımı için güvenlidir.</string>
<string name="InviteMenuEntry">Davetiye gönderin</string>
<string name="InviteText">Şimdi Delta Chat kullanıyorum - %1$s- bana yazabilirsin%2$s</string>
<string name="AdvancedSettings">Gelişmiş ayarlar</string>
<string name="AskResetNotifications">Geçerli sayfanın grupların ve kişilerin bütün bildirim ayarları ve sesleri sıfırlansın mı?</string>
<string name="AttachFiles">Dosyaları iliştir</string>
<string name="ErrGroupNameEmpty">Grup için bir ad girin</string>
<string name="MsgNewGroupDraftHint">İlk iletiyi diğerlerinin bu grupta yanıtlamasına izin verin.\n\ n• Tüm üyeler Delta Chat kullanmıyorsa sorun yoktur.\n\n• İlk iletiyi teslim etmek biraz zaman alabilir.</string>
<string name="MsgNewGroupDraft">Selam, bizim için \"%1$s\" grubunu oluşturdum. </string>
<string name="MsgGroupNameChanged">Grup adı \"%1$s\" den \"%2$s\"ye değişti.</string>
<string name="MsgGroupImageChanged">Grup resmi değişti.</string>
<string name="MsgMemberAddedToGroup">%1$s üye eklendi</string>
@@ -344,18 +348,24 @@
<string name="EncrinfoNoE2EExplain">Alıcı tarafından Delta Chat veya başka bir Otomatik şifreleme uygulaması kullanıldığında uçtan uca şifreleme uygulanacaktır.</string>
<string name="EncrinfoFingerprints">Parmak izleri</string>
<string name="Backup">Yedekleme</string>
<string name="ImportBackupExplain2"><![CDATA[<i>]]>%1$s<![CDATA[</i>]]>dan bir yedeği içe aktarmak ve yeniden kurmak.</string>
<string name="ReadReceipt">İletim raporu</string>
<string name="NameAndStatus">Ad ve durum</string>
<string name="MyStatus">Durumum</string>
<string name="MyStatusExplain">Durum, diğer yerlerin yanı sıra e-posta altbilgisinde gösterilir.</string>
<string name="MsgGroupImageDeleted">Grup resmi silindi</string>
<string name="AskDeleteGroupImage">Grup resmini silmek istediğinizden emin misiniz?\n\nBu tüm grup üyelerinin aygıtlarını etkileyecek.</string>
<string name="ExportImportHeader">Dışa aktarım ve içe aktarım</string>
<string name="ImportExportExplain">Dışa aktarılan dosyalar gizli anahtarları içerecektir! Onları güvenli bir yerde saklayın veya mümkün olan en kısa sürede silin.</string>
<string name="EnterPasswordToContinue">Devam etmek için %1$s parolasını girin:</string>
<string name="IncorrectPassword">Geçersiz parola</string>
<string name="ImportBackupAsk"><![CDATA[<i>]]>%1$s<![CDATA[</i>]]> de yedekleme bulundu.\n\nTüm verileri ve ayarları buradan içe aktarmak ve kullanmak istiyor musunuz?</string>
<string name="ImportBackup">Yedeklemeyi içe aktar</string>
<string name="FilesSuccessfullyExported">Dosyalar <![CDATA[<i>]]>%1$s<![CDATA[</i>]]>\'a dışa aktarıldı.</string>
<string name="ExportBackup">Yedeklemeyi dışa aktar</string>
<string name="ExportPrivateKeys">Özel anahtarları dışa aktar</string>
<string name="ImportPrivateKeys">Özel anahtarları içe aktar</string>
<string name="ImportPrivateKeysAsk2">Gizli anahtarlar <![CDATA[<i>]]>%1$s<![CDATA[</i>]]>dan içe aktarılsın mı?\n\n•Var olan gizli anahtarlar silinmeyecek\n\n• Son içe aktarılan anahtar yeni öntanımlı anahtar olarak kullanılacak.</string>
<string name="NoRecentEmoji">Son kullanılan duygu simgeleri burada gösterilecek.</string>
<string name="E2eeOffBecauseOfUser">Uçtan uca şifrelemeyi etkinleştirmek için, ayarlarınızdaki ilgili seçeneği işaretleyin.</string>
<string name="E2eeOffBecauseOfRecipient">Karşı tarafın da ayarı etkinleştirmesi durumunda uçtan uca şifreleme uygulanacaktır.</string>
@@ -371,6 +381,10 @@
<string name="AutocryptKeyTransfer">Autocrypt Anahtar Aktarımı</string>
<string name="AutocryptKeyTransferMsgAfterSend">Anahtarınız kendinize gönderildi. Diğer aygıta geçin ve kurulum iletisini açın. Sizden bir kurulum şifresi girmeniz istenecektir. İsteğe aşağıdaki rakamları yazın:\n\n%1$s\n\nİşiniz bittiğinde, diğer aygıtınız Autocrypt\'i kullanmaya hazır hale gelecektir.</string>
<string name="AutocryptSetupMessageSubject">Autocrypt Kurulum İletisi</string>
<string name="AutocryptSetupMessageTapBody">Bu istemciler arasındaki anahtarınızı aktarım için kullanılan Autocrypt Kurulum İletisidir.\n\nBu iletiye dokun, şifreyi kaldır ve anahtarını kullan.</string>
<string name="AutocryptKeyTransferPleaseEnterCode">Lütfen diğer aygıtta görüntülenen kurulum kodunu giriniz.</string>
<string name="AutocryptKeyTransferBadCode">Kötü kurulum kodu. Lütfen tekrar deneyin.\n\nKurulum kodunu anımsamıyorsanız, diğer aygıttaki anahtar aktarımını yeniden başlatmanız yeterlidir.</string>
<string name="AutocryptKeyTransferSucceeded">Anahtar transferi başarılı.Bu aygıt artık Autocrypt\'i diğer aygıtla aynı tuşla kullanmaya hazırdır.</string>
<string name="Retry">Yeniden dene</string>
<string name="SelfTalkSubtitle">Kendime gönderdiğim iletiler</string>
</resources>
@@ -427,4 +427,9 @@
<string name="AutocryptKeyTransferSucceeded">Key transferred successfully. This device is now ready to use Autocrypt with the same key as the other device.</string>
<string name="Retry">Retry</string>
<string name="SelfTalkSubtitle">Messages I sent to myself</string>
<string name="QrScan">Scan QR code</string>
<string name="QrShow">Show QR code</string>
<string name="QrScanContainsText">The scanned QR code contains the following text:\n\n%s</string>
<string name="OobFingerprint">Fingerprint</string>
<string name="OobFingerprintWithoutAddr">This QR code contains a fingerprint but no e-mail address.\n\nFor an out-of-band-verification, please first establish an encrpyted connection to the recipient.</string>
</resources>