mirror of
https://github.com/ArcaneChat/android.git
synced 2026-07-03 14:05:24 +02:00
Compare commits
51 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 930facc457 | |||
| 5a428458b5 | |||
| fa12c90f23 | |||
| 2e16ccb041 | |||
| df7dda0e96 | |||
| 28c86b4784 | |||
| 175a4ddf95 | |||
| e4b24b0d99 | |||
| 989fcd9564 | |||
| 4877ef1407 | |||
| c1487e3f74 | |||
| 6d4650bba9 | |||
| fb6f02696d | |||
| 8ed4abebb7 | |||
| f90de9c0de | |||
| 206d2a58d2 | |||
| 6001d2fb3a | |||
| 1ceab73dfe | |||
| dc38b949a8 | |||
| 96b740d4da | |||
| 1455f7849b | |||
| 7f14a4da90 | |||
| 0d04064969 | |||
| 37fbda3126 | |||
| 023e62fbd4 | |||
| b818007398 | |||
| 7c1bb82dd4 | |||
| e3a6fa4cac | |||
| 6e6aa88b3a | |||
| c266bd6eba | |||
| e383c2b79a | |||
| 56a5b23d98 | |||
| 10eb41aca7 | |||
| a0a50e3433 | |||
| 07449e9018 | |||
| 5027373b54 | |||
| 1d1e08fc15 | |||
| 6eabf32464 | |||
| acb4a2e5a0 | |||
| ba1b5211a2 | |||
| eb8d248fd9 | |||
| f248a86ce2 | |||
| 8e9b55958d | |||
| 6decd0ee76 | |||
| 16384c12c2 | |||
| 9be5c50e31 | |||
| 46421d8821 | |||
| 13cb356aef | |||
| b210b72460 | |||
| 6aa63f48e1 | |||
| eaba4a4ab7 |
@@ -1,5 +1,24 @@
|
||||
# Delta Chat Changelog
|
||||
|
||||
## v0.9.6
|
||||
2017-10-18
|
||||
|
||||
* Support keys generated with multiple subkeys eg. from K-9
|
||||
* Show PDFs and other attachments with bad names
|
||||
* Bug fixes
|
||||
|
||||
## v0.9.5
|
||||
2017-10-08
|
||||
|
||||
* Backup export and import function
|
||||
* Query password before export
|
||||
* Move replies from normal E-Mail-Clients to the "Chats" folder
|
||||
* Improve helping MUAs on showing chat threads
|
||||
* Improve onboarding
|
||||
* Add URL to default footer
|
||||
* Test a different approach for battery saving in this release
|
||||
* Update French, Italian, German, Polish, Portuguese, Russian and Ukrainian translations
|
||||
|
||||
## v0.9.4
|
||||
2017-08-23
|
||||
|
||||
@@ -7,6 +26,7 @@
|
||||
* Editable and synchronized group images
|
||||
* Show the subject of messages that cannot be decrypted
|
||||
* Do not send "Read receipts" when decryption fails
|
||||
* Do not request "Read receipts" from normal MUAs as there are too many MUAs responding with weird, non-standard formats
|
||||
* Deleting a chat always deletes all messages from the device permanently
|
||||
* Ignore messages from mailing lists
|
||||
* Do not spread the original authors name nor address on forwarding
|
||||
|
||||
@@ -79,7 +79,7 @@ android {
|
||||
}
|
||||
}
|
||||
|
||||
defaultConfig.versionCode = 43
|
||||
defaultConfig.versionCode = 45
|
||||
|
||||
sourceSets.main {
|
||||
jniLibs.srcDir 'libs'
|
||||
@@ -121,6 +121,6 @@ android {
|
||||
minSdkVersion 14 // 14: Android 4.0 Ice Cream Sandwich 2011 (Telegram default), 21: Android 5.0 Lollipop 2014 (recommended for InstantRun)
|
||||
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.9.4" // do NOT forget to increase defaultConfig.versionCode!
|
||||
versionName "0.9.6" // do NOT forget to increase defaultConfig.versionCode!
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1311,6 +1311,7 @@ LOCAL_MODULE := sqlite
|
||||
LOCAL_CFLAGS := -w -std=c11 -Os -DNULL=0 -DSOCKLEN_T=socklen_t -DLOCALE_NOT_USED -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64
|
||||
LOCAL_CFLAGS += -DANDROID_NDK -DDISABLE_IMPORTGL -fno-strict-aliasing -fprefetch-loop-arrays -DAVOID_TABLES -DANDROID_TILE_BASED_DECODE -DANDROID_ARMV6_IDCT -DHAVE_STRCHRNUL=0
|
||||
LOCAL_CFLAGS += -DSQLITE_OMIT_LOAD_EXTENSION
|
||||
LOCAL_CFLAGS += -DSQLITE_MAX_MMAP_SIZE=0 -DSQLITE_OMIT_WAL # HACK: the defines are used to skip the pointer reference to mmap set in aSyscall[] - mmap seems to be a #define that cannot be used this way on Android - otherwise we get the error: 'mmap' undeclared here (not in a function)
|
||||
|
||||
LOCAL_SRC_FILES := \
|
||||
./messenger-backend/libs/sqlite/sqlite3.c
|
||||
@@ -1636,6 +1637,7 @@ LOCAL_SRC_FILES += \
|
||||
./messenger-backend/src/mrchatlist.c \
|
||||
./messenger-backend/src/mrcmdline.c \
|
||||
./messenger-backend/src/mrcontact.c \
|
||||
./messenger-backend/src/mrdehtml.c \
|
||||
./messenger-backend/src/mrimap.c \
|
||||
./messenger-backend/src/mrjob.c \
|
||||
./messenger-backend/src/mrkey.c \
|
||||
@@ -1646,6 +1648,7 @@ 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/mrmimefactory.c \
|
||||
./messenger-backend/src/mrmimeparser.c \
|
||||
./messenger-backend/src/mrmsg.c \
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
APP_PLATFORM := android-9
|
||||
APP_PLATFORM := android-14
|
||||
APP_ABI := armeabi armeabi-v7a x86
|
||||
NDK_TOOLCHAIN_VERSION := 4.9
|
||||
APP_STL := gnustl_static
|
||||
|
||||
Submodule MessengerProj/jni/messenger-backend updated: 3bb04e0e28...94c9db2ed4
@@ -555,6 +555,29 @@ JNIEXPORT void Java_com_b44t_messenger_MrMailbox_imex(JNIEnv *env, jclass cls, j
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jint Java_com_b44t_messenger_MrMailbox_checkPassword(JNIEnv *env, jclass cls, jstring pw)
|
||||
{
|
||||
CHAR_REF(pw);
|
||||
jint r = mrmailbox_check_password(get_mrmailbox_t(env, cls), pwPtr);
|
||||
CHAR_UNREF(pw);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jstring Java_com_b44t_messenger_MrMailbox_imexHasBackup(JNIEnv *env, jclass cls, jstring dir)
|
||||
{
|
||||
CHAR_REF(dir);
|
||||
jstring ret = NULL;
|
||||
char* temp = mrmailbox_imex_has_backup(get_mrmailbox_t(env, cls), dirPtr);
|
||||
if( temp ) {
|
||||
ret = JSTRING_NEW(temp);
|
||||
free(temp);
|
||||
}
|
||||
CHAR_UNREF(dir);
|
||||
return ret; /* may be NULL! */
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT void Java_com_b44t_messenger_MrMailbox_heartbeat(JNIEnv *env, jclass cls)
|
||||
{
|
||||
mrmailbox_heartbeat(get_mrmailbox_t(env, cls));
|
||||
|
||||
@@ -106,7 +106,7 @@
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<activity
|
||||
android:name="com.b44t.ui.IntroActivity"
|
||||
android:name="com.b44t.ui.WelcomeActivity"
|
||||
android:configChanges="keyboard|keyboardHidden|orientation|screenSize">
|
||||
</activity>
|
||||
<activity
|
||||
|
||||
@@ -51,6 +51,7 @@ import android.support.v4.content.FileProvider;
|
||||
import android.text.SpannableStringBuilder;
|
||||
import android.text.Spanned;
|
||||
import android.text.style.ForegroundColorSpan;
|
||||
import android.text.style.StyleSpan;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.util.Log;
|
||||
import android.util.StateSet;
|
||||
@@ -458,59 +459,67 @@ public class AndroidUtilities {
|
||||
}
|
||||
}
|
||||
|
||||
public static final int FLAG_TAG_BR = 1;
|
||||
public static final int FLAG_TAG_BOLD = 2;
|
||||
public static final int FLAG_TAG_COLOR = 4;
|
||||
public static final int FLAG_TAG_ALL = FLAG_TAG_BR | FLAG_TAG_BOLD | FLAG_TAG_COLOR;
|
||||
|
||||
public static SpannableStringBuilder replaceTags(String str) {
|
||||
return replaceTags(str, FLAG_TAG_ALL);
|
||||
}
|
||||
|
||||
public static SpannableStringBuilder replaceTags(String str, int flag) {
|
||||
try {
|
||||
int start;
|
||||
int end;
|
||||
StringBuilder stringBuilder = new StringBuilder(str);
|
||||
if ((flag & FLAG_TAG_BR) != 0) {
|
||||
while ((start = stringBuilder.indexOf("<br>")) != -1) {
|
||||
stringBuilder.replace(start, start + 4, "\n");
|
||||
}
|
||||
while ((start = stringBuilder.indexOf("<br/>")) != -1) {
|
||||
stringBuilder.replace(start, start + 5, "\n");
|
||||
}
|
||||
|
||||
// breaks
|
||||
while ((start = stringBuilder.indexOf("<br>")) != -1) {
|
||||
stringBuilder.replace(start, start + 4, "\n");
|
||||
}
|
||||
while ((start = stringBuilder.indexOf("<br/>")) != -1) {
|
||||
stringBuilder.replace(start, start + 5, "\n");
|
||||
}
|
||||
|
||||
// bold
|
||||
ArrayList<Integer> bolds = new ArrayList<>();
|
||||
if ((flag & FLAG_TAG_BOLD) != 0) {
|
||||
while ((start = stringBuilder.indexOf("<b>")) != -1) {
|
||||
stringBuilder.replace(start, start + 3, "");
|
||||
end = stringBuilder.indexOf("</b>");
|
||||
if (end == -1) {
|
||||
end = stringBuilder.indexOf("<b>");
|
||||
}
|
||||
stringBuilder.replace(end, end + 4, "");
|
||||
bolds.add(start);
|
||||
bolds.add(end);
|
||||
while ((start = stringBuilder.indexOf("<b>")) != -1) {
|
||||
stringBuilder.replace(start, start + 3, "");
|
||||
end = stringBuilder.indexOf("</b>");
|
||||
if (end == -1) {
|
||||
end = stringBuilder.indexOf("<b>");
|
||||
}
|
||||
stringBuilder.replace(end, end + 4, "");
|
||||
bolds.add(start);
|
||||
bolds.add(end);
|
||||
}
|
||||
|
||||
// italics
|
||||
ArrayList<Integer> italics = new ArrayList<>();
|
||||
while ((start = stringBuilder.indexOf("<i>")) != -1) {
|
||||
stringBuilder.replace(start, start + 3, "");
|
||||
end = stringBuilder.indexOf("</i>");
|
||||
if (end == -1) {
|
||||
end = stringBuilder.indexOf("<i>");
|
||||
}
|
||||
stringBuilder.replace(end, end + 4, "");
|
||||
italics.add(start);
|
||||
italics.add(end);
|
||||
}
|
||||
|
||||
// color - used eg. by the message preview when following a mailto:-link
|
||||
ArrayList<Integer> colors = new ArrayList<>();
|
||||
if ((flag & FLAG_TAG_COLOR) != 0) { // used eg. by the message preview when following a mailto:-link
|
||||
while ((start = stringBuilder.indexOf("<c#")) != -1) {
|
||||
stringBuilder.replace(start, start + 2, "");
|
||||
end = stringBuilder.indexOf(">", start);
|
||||
int color = Color.parseColor(stringBuilder.substring(start, end));
|
||||
stringBuilder.replace(start, end + 1, "");
|
||||
end = stringBuilder.indexOf("</c>");
|
||||
stringBuilder.replace(end, end + 4, "");
|
||||
colors.add(start);
|
||||
colors.add(end);
|
||||
colors.add(color);
|
||||
}
|
||||
while ((start = stringBuilder.indexOf("<c#")) != -1) {
|
||||
stringBuilder.replace(start, start + 2, "");
|
||||
end = stringBuilder.indexOf(">", start);
|
||||
int color = Color.parseColor(stringBuilder.substring(start, end));
|
||||
stringBuilder.replace(start, end + 1, "");
|
||||
end = stringBuilder.indexOf("</c>");
|
||||
stringBuilder.replace(end, end + 4, "");
|
||||
colors.add(start);
|
||||
colors.add(end);
|
||||
colors.add(color);
|
||||
}
|
||||
|
||||
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(stringBuilder);
|
||||
for (int a = 0; a < bolds.size() / 2; a++) {
|
||||
spannableStringBuilder.setSpan(new TypefaceSpan(Typeface.DEFAULT_BOLD), bolds.get(a * 2), bolds.get(a * 2 + 1), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
}
|
||||
for (int a = 0; a < italics.size() / 2; a++) {
|
||||
spannableStringBuilder.setSpan(new StyleSpan(Typeface.ITALIC), italics.get(a * 2), italics.get(a * 2 + 1), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
}
|
||||
for (int a = 0; a < colors.size() / 3; a++) {
|
||||
spannableStringBuilder.setSpan(new ForegroundColorSpan(colors.get(a * 3 + 2)), colors.get(a * 3), colors.get(a * 3 + 1), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||
}
|
||||
|
||||
@@ -70,10 +70,13 @@ public class MrMailbox {
|
||||
public native static String getInfo();
|
||||
public native static String cmdline(String cmd);
|
||||
|
||||
public final static int MR_IMEX_EXPORT_SELF_KEYS = 0x01;
|
||||
public final static int MR_IMEX_EXPORT_BACKUP = 0x02;
|
||||
public final static int MR_IMEX_IMPORT_SELF_KEYS = 0x00010000;
|
||||
public final static int MR_IMEX_EXPORT_SELF_KEYS = 1;
|
||||
public final static int MR_IMEX_IMPORT_SELF_KEYS = 2;
|
||||
public final static int MR_IMEX_EXPORT_BACKUP = 11;
|
||||
public final static int MR_IMEX_IMPORT_BACKUP = 12;
|
||||
public native static void imex(int what, String dir);
|
||||
public native static String imexHasBackup(String dir);
|
||||
public native static int checkPassword(String pw);
|
||||
|
||||
public native static void heartbeat();
|
||||
|
||||
@@ -191,9 +194,9 @@ public class MrMailbox {
|
||||
public final static int MR_EVENT_CONFIGURE_ENDED = 2040;
|
||||
public final static int MR_EVENT_CONFIGURE_PROGRESS = 2041;
|
||||
|
||||
public final static int MR_EVENT_EXPORT_ENDED = 2050;
|
||||
public final static int MR_EVENT_EXPORT_PROGRESS = 2051;
|
||||
public final static int MR_EVENT_EXPORT_FILE_WRITTEN = 2052;
|
||||
public final static int MR_EVENT_IMEX_ENDED = 2050;
|
||||
public final static int MR_EVENT_IMEX_PROGRESS = 2051;
|
||||
public final static int MR_EVENT_IMEX_FILE_WRITTEN = 2052;
|
||||
|
||||
public final static int MR_EVENT_IS_ONLINE = 2080;
|
||||
public final static int MR_EVENT_GET_STRING = 2091;
|
||||
@@ -228,33 +231,30 @@ public class MrMailbox {
|
||||
});
|
||||
return 0;
|
||||
|
||||
case MR_EVENT_EXPORT_ENDED:
|
||||
case MR_EVENT_IMEX_ENDED:
|
||||
AndroidUtilities.runOnUIThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
NotificationCenter.getInstance().postNotificationName(NotificationCenter.exportEnded, (int)data1);
|
||||
NotificationCenter.getInstance().postNotificationName(NotificationCenter.imexEnded, (int)data1);
|
||||
}
|
||||
});
|
||||
return 0;
|
||||
|
||||
case MR_EVENT_EXPORT_PROGRESS:
|
||||
case MR_EVENT_IMEX_PROGRESS:
|
||||
AndroidUtilities.runOnUIThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
NotificationCenter.getInstance().postNotificationName(NotificationCenter.exportProgress, (int)data1);
|
||||
NotificationCenter.getInstance().postNotificationName(NotificationCenter.imexProgress, (int)data1);
|
||||
}
|
||||
});
|
||||
return 0;
|
||||
|
||||
case MR_EVENT_EXPORT_FILE_WRITTEN: {
|
||||
final String file_name = CPtr2String(data1);
|
||||
final String file_mime = CPtr2String(data2);
|
||||
case MR_EVENT_IMEX_FILE_WRITTEN: {
|
||||
final String fileName = CPtr2String(data1);
|
||||
AndroidUtilities.runOnUIThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
File file = new File(file_name);
|
||||
DownloadManager downloadManager = (DownloadManager) ApplicationLoader.applicationContext.getSystemService(Context.DOWNLOAD_SERVICE);
|
||||
downloadManager.addCompletedDownload(file.getName(), file.getName(), true, file_mime, file.getAbsolutePath(), file.length(), true);
|
||||
NotificationCenter.getInstance().postNotificationName(NotificationCenter.imexFileWritten, fileName);
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -425,7 +425,7 @@ public class MrMailbox {
|
||||
}
|
||||
else {
|
||||
if( !ApplicationLoader.wakeupWakeLock.isHeld()) {
|
||||
ApplicationLoader.wakeupWakeLock.acquire(1 * 1000); /* make sure, subsequent release/acquires do not make the CPU sleep */
|
||||
ApplicationLoader.wakeupWakeLock.acquire(500); /* make sure, subsequent release/acquires do not make the CPU sleep */
|
||||
}
|
||||
ApplicationLoader.backendWakeLock.release();
|
||||
}
|
||||
|
||||
@@ -33,8 +33,9 @@ public class NotificationCenter {
|
||||
|
||||
public static final int configureEnded = totalEvents++;
|
||||
public static final int configureProgress = totalEvents++;
|
||||
public static final int exportEnded = totalEvents++;
|
||||
public static final int exportProgress = totalEvents++;
|
||||
public static final int imexEnded = totalEvents++;
|
||||
public static final int imexProgress = totalEvents++;
|
||||
public static final int imexFileWritten = totalEvents++;
|
||||
public static final int didReceivedNewMessages = totalEvents++;
|
||||
public static final int updateInterfaces = totalEvents++;
|
||||
public static final int dialogsNeedReload = totalEvents++;
|
||||
@@ -131,12 +132,6 @@ public class NotificationCenter {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public boolean isAnimationInProgress() {
|
||||
return animationInProgress;
|
||||
}
|
||||
|
||||
|
||||
public void postNotificationName(int id, Object... args) {
|
||||
boolean allowDuringAnimation = false;
|
||||
if (allowedNotifications != null) {
|
||||
|
||||
@@ -108,8 +108,6 @@ public class TLRPC {
|
||||
|
||||
public static class User extends TLObject {
|
||||
public int id;
|
||||
public String first_name;
|
||||
public String last_name;
|
||||
public String username;
|
||||
public UserProfilePhoto photo;
|
||||
public int flags;
|
||||
@@ -150,7 +148,6 @@ public class TLRPC {
|
||||
|
||||
public static class InputStickerSet extends TLObject {
|
||||
public long id;
|
||||
public String short_name;
|
||||
}
|
||||
|
||||
public static class TL_inputStickerSetEmpty extends InputStickerSet {
|
||||
|
||||
@@ -35,19 +35,24 @@ import android.util.Log;
|
||||
public class TimerReceiver extends BroadcastReceiver {
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
|
||||
// acquire for 3 seconds, this should wake up the threads,
|
||||
// _if_ there is more to do, the backend acquires an additional wakelock using MR_EVENT_WAKE_LOCK
|
||||
ApplicationLoader.wakeupWakeLock.acquire(3*1000); // do this first!
|
||||
MrMailbox.log_i("DeltaChat", "*** TimerReceiver.onReceive()");
|
||||
// for a discussion about the different approaches to save batter, see https://github.com/deltachat/deltachat-android/issues/104#issuecomment-331670326
|
||||
|
||||
// we assume, the IMAP thread is alive. I cannot imagine, the thread was killed with the App being running.
|
||||
// (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();
|
||||
try {
|
||||
ApplicationLoader.wakeupWakeLock.acquire(); // do this first!
|
||||
MrMailbox.log_i("DeltaChat", "*** TimerReceiver.onReceive()");
|
||||
|
||||
// create the next alarm in about a minute
|
||||
scheduleNextAlarm();
|
||||
// we assume, the IMAP thread is alive. I cannot imagine, the thread was killed with the App being running.
|
||||
// (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();
|
||||
|
||||
// create the next alarm in about a minute
|
||||
scheduleNextAlarm();
|
||||
} finally {
|
||||
// Always release the wakelock, _if_ there is more to do, the backend acquires an additional wakelock using MR_EVENT_WAKE_LOCK
|
||||
ApplicationLoader.wakeupWakeLock.release();
|
||||
}
|
||||
}
|
||||
|
||||
public static void scheduleNextAlarm()
|
||||
|
||||
@@ -60,7 +60,6 @@ public class ActionBarLayout extends FrameLayout {
|
||||
boolean needPresentFragment(BaseFragment fragment, boolean removeLast, boolean forceWithoutAnimation, ActionBarLayout layout);
|
||||
boolean needAddFragmentToStack(BaseFragment fragment, ActionBarLayout layout);
|
||||
boolean needCloseLastFragment(ActionBarLayout layout);
|
||||
void onRebuildAllFragments(ActionBarLayout layout);
|
||||
}
|
||||
|
||||
public class LinearLayoutContainer extends LinearLayout {
|
||||
@@ -152,8 +151,6 @@ public class ActionBarLayout extends FrameLayout {
|
||||
private int startedTrackingPointerId;
|
||||
private Runnable onCloseAnimationEndRunnable;
|
||||
private Runnable onOpenAnimationEndRunnable;
|
||||
private boolean useAlphaAnimations;
|
||||
private View backgroundView;
|
||||
private boolean removeActionBarExtraHeight;
|
||||
private Runnable animationRunnable;
|
||||
|
||||
@@ -697,96 +694,56 @@ public class ActionBarLayout extends FrameLayout {
|
||||
bringChildToFront(containerView);
|
||||
if (!needAnimation) {
|
||||
presentFragmentInternalRemoveOld(removeLast, currentFragment);
|
||||
if (backgroundView != null) {
|
||||
backgroundView.setVisibility(VISIBLE);
|
||||
}
|
||||
}
|
||||
|
||||
if (needAnimation) {
|
||||
if (useAlphaAnimations && fragmentsStack.size() == 1) {
|
||||
presentFragmentInternalRemoveOld(removeLast, currentFragment);
|
||||
|
||||
transitionAnimationStartTime = System.currentTimeMillis();
|
||||
transitionAnimationInProgress = true;
|
||||
onOpenAnimationEndRunnable = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
fragment.onTransitionAnimationEnd(true, false);
|
||||
fragment.onBecomeFullyVisible();
|
||||
transitionAnimationStartTime = System.currentTimeMillis();
|
||||
transitionAnimationInProgress = true;
|
||||
onOpenAnimationEndRunnable = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (Build.VERSION.SDK_INT > 15) {
|
||||
containerView.setLayerType(LAYER_TYPE_NONE, null);
|
||||
containerViewBack.setLayerType(LAYER_TYPE_NONE, null);
|
||||
}
|
||||
};
|
||||
ArrayList<Animator> animators = new ArrayList<>();
|
||||
animators.add(ObjectAnimator.ofFloat(this, "alpha", 0.0f, 1.0f));
|
||||
if (backgroundView != null) {
|
||||
backgroundView.setVisibility(VISIBLE);
|
||||
animators.add(ObjectAnimator.ofFloat(backgroundView, "alpha", 0.0f, 1.0f));
|
||||
presentFragmentInternalRemoveOld(removeLast, currentFragment);
|
||||
fragment.onTransitionAnimationEnd(true, false);
|
||||
fragment.onBecomeFullyVisible();
|
||||
containerView.setTranslationX(0);
|
||||
}
|
||||
|
||||
fragment.onTransitionAnimationStart(true, false);
|
||||
currentAnimation = new AnimatorSet();
|
||||
currentAnimation.playTogether(animators);
|
||||
currentAnimation.setInterpolator(accelerateDecelerateInterpolator);
|
||||
currentAnimation.setDuration(200);
|
||||
currentAnimation.addListener(new AnimatorListenerAdapterProxy() {
|
||||
@Override
|
||||
public void onAnimationEnd(Animator animation) {
|
||||
onAnimationEndCheck(false);
|
||||
}
|
||||
});
|
||||
currentAnimation.start();
|
||||
} else {
|
||||
transitionAnimationStartTime = System.currentTimeMillis();
|
||||
transitionAnimationInProgress = true;
|
||||
onOpenAnimationEndRunnable = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (Build.VERSION.SDK_INT > 15) {
|
||||
containerView.setLayerType(LAYER_TYPE_NONE, null);
|
||||
containerViewBack.setLayerType(LAYER_TYPE_NONE, null);
|
||||
};
|
||||
fragment.onTransitionAnimationStart(true, false);
|
||||
{
|
||||
containerView.setAlpha(0.0f);
|
||||
containerView.setTranslationX(48.0f);
|
||||
if (containerView.isKeyboardVisible || containerViewBack.isKeyboardVisible) {
|
||||
waitingForKeyboardCloseRunnable = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (waitingForKeyboardCloseRunnable != this) {
|
||||
return;
|
||||
}
|
||||
startLayoutAnimation(true, true);
|
||||
}
|
||||
presentFragmentInternalRemoveOld(removeLast, currentFragment);
|
||||
fragment.onTransitionAnimationEnd(true, false);
|
||||
fragment.onBecomeFullyVisible();
|
||||
containerView.setTranslationX(0);
|
||||
}
|
||||
};
|
||||
fragment.onTransitionAnimationStart(true, false);
|
||||
{
|
||||
containerView.setAlpha(0.0f);
|
||||
containerView.setTranslationX(48.0f);
|
||||
if (containerView.isKeyboardVisible || containerViewBack.isKeyboardVisible) {
|
||||
waitingForKeyboardCloseRunnable = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (waitingForKeyboardCloseRunnable != this) {
|
||||
return;
|
||||
}
|
||||
startLayoutAnimation(true, true);
|
||||
};
|
||||
AndroidUtilities.runOnUIThread(waitingForKeyboardCloseRunnable, 200);
|
||||
} else if (fragment.needDelayOpenAnimation()) {
|
||||
delayedOpenAnimationRunnable = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (delayedOpenAnimationRunnable != this) {
|
||||
return;
|
||||
}
|
||||
};
|
||||
AndroidUtilities.runOnUIThread(waitingForKeyboardCloseRunnable, 200);
|
||||
} else if (fragment.needDelayOpenAnimation()) {
|
||||
delayedOpenAnimationRunnable = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (delayedOpenAnimationRunnable != this) {
|
||||
return;
|
||||
}
|
||||
delayedOpenAnimationRunnable = null;
|
||||
startLayoutAnimation(true, true);
|
||||
}
|
||||
};
|
||||
AndroidUtilities.runOnUIThread(delayedOpenAnimationRunnable, 200);
|
||||
} else {
|
||||
startLayoutAnimation(true, true);
|
||||
}
|
||||
delayedOpenAnimationRunnable = null;
|
||||
startLayoutAnimation(true, true);
|
||||
}
|
||||
};
|
||||
AndroidUtilities.runOnUIThread(delayedOpenAnimationRunnable, 200);
|
||||
} else {
|
||||
startLayoutAnimation(true, true);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (backgroundView != null) {
|
||||
backgroundView.setAlpha(1.0f);
|
||||
backgroundView.setVisibility(VISIBLE);
|
||||
}
|
||||
fragment.onTransitionAnimationStart(true, false);
|
||||
fragment.onTransitionAnimationEnd(true, false);
|
||||
fragment.onBecomeFullyVisible();
|
||||
@@ -935,50 +892,8 @@ public class ActionBarLayout extends FrameLayout {
|
||||
previousFragment.onBecomeFullyVisible();
|
||||
}
|
||||
} else {
|
||||
if (useAlphaAnimations) {
|
||||
transitionAnimationStartTime = System.currentTimeMillis();
|
||||
transitionAnimationInProgress = true;
|
||||
|
||||
onCloseAnimationEndRunnable = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
removeFragmentFromStackInternal(currentFragment);
|
||||
setVisibility(GONE);
|
||||
if (backgroundView != null) {
|
||||
backgroundView.setVisibility(GONE);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
ArrayList<Animator> animators = new ArrayList<>();
|
||||
animators.add(ObjectAnimator.ofFloat(this, "alpha", 1.0f, 0.0f));
|
||||
if (backgroundView != null) {
|
||||
animators.add(ObjectAnimator.ofFloat(backgroundView, "alpha", 1.0f, 0.0f));
|
||||
}
|
||||
|
||||
currentAnimation = new AnimatorSet();
|
||||
currentAnimation.playTogether(animators);
|
||||
currentAnimation.setInterpolator(accelerateDecelerateInterpolator);
|
||||
currentAnimation.setDuration(200);
|
||||
currentAnimation.addListener(new AnimatorListenerAdapterProxy() {
|
||||
@Override
|
||||
public void onAnimationStart(Animator animation) {
|
||||
transitionAnimationStartTime = System.currentTimeMillis();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAnimationEnd(Animator animation) {
|
||||
onAnimationEndCheck(false);
|
||||
}
|
||||
});
|
||||
currentAnimation.start();
|
||||
} else {
|
||||
removeFragmentFromStackInternal(currentFragment);
|
||||
setVisibility(GONE);
|
||||
if (backgroundView != null) {
|
||||
backgroundView.setVisibility(GONE);
|
||||
}
|
||||
}
|
||||
removeFragmentFromStackInternal(currentFragment);
|
||||
setVisibility(GONE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1053,16 +968,6 @@ public class ActionBarLayout extends FrameLayout {
|
||||
}
|
||||
}
|
||||
|
||||
public void rebuildAllFragmentViews(boolean last) {
|
||||
for (int a = 0; a < fragmentsStack.size() - (last ? 0 : 1); a++) {
|
||||
fragmentsStack.get(a).clearViews();
|
||||
fragmentsStack.get(a).setParentLayout(this);
|
||||
}
|
||||
if (delegate != null) {
|
||||
delegate.onRebuildAllFragments(this);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean onKeyUp(int keyCode, KeyEvent event) {
|
||||
if (keyCode == KeyEvent.KEYCODE_MENU && !checkTransitionAnimation() && !startedTracking && currentActionBar != null) {
|
||||
currentActionBar.onMenuButtonPressed();
|
||||
@@ -1145,14 +1050,6 @@ public class ActionBarLayout extends FrameLayout {
|
||||
}
|
||||
}
|
||||
|
||||
public void setUseAlphaAnimations(boolean value) {
|
||||
useAlphaAnimations = value;
|
||||
}
|
||||
|
||||
public void setBackgroundView(View view) {
|
||||
backgroundView = view;
|
||||
}
|
||||
|
||||
public void setRemoveActionBarExtraHeight(boolean value) {
|
||||
removeActionBarExtraHeight = value;
|
||||
}
|
||||
|
||||
@@ -466,7 +466,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
||||
builder.setMessage(context.getString(R.string.AreYouSureDeleteThisChat));
|
||||
builder.setPositiveButton(context.getString(R.string.OK), new DialogInterface.OnClickListener() {
|
||||
builder.setPositiveButton(R.string.OK, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
if( MrMailbox.deleteChat((int)dialog_id)!=0 ) {
|
||||
@@ -478,7 +478,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||
}
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(context.getString(R.string.Cancel), null);
|
||||
builder.setNegativeButton(R.string.Cancel, null);
|
||||
showDialog(builder.create());
|
||||
} else if (id == ID_MUTE) {
|
||||
toggleMute();
|
||||
@@ -497,12 +497,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||
String info_str = MrMailbox.getMsgInfo(getFirstSelectedId());
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
||||
builder.setMessage(info_str);
|
||||
builder.setPositiveButton(context.getString(R.string.OK), new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
;
|
||||
}
|
||||
});
|
||||
builder.setPositiveButton(R.string.OK, null);
|
||||
showDialog(builder.create());
|
||||
actionBar.hideActionMode();
|
||||
updateVisibleRowsFast();
|
||||
@@ -1480,7 +1475,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||
|
||||
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
||||
builder.setPositiveButton(context.getString(R.string.OK), new DialogInterface.OnClickListener() {
|
||||
builder.setPositiveButton(R.string.OK, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
int chatId = MrMailbox.createChatByContactId(fromId);
|
||||
@@ -1494,7 +1489,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||
}
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(context.getString(R.string.Cancel), null);
|
||||
builder.setNegativeButton(R.string.Cancel, null);
|
||||
builder.setMessage(AndroidUtilities.replaceTags(String.format(context.getString(R.string.AskStartChatWith), name)));
|
||||
showDialog(builder.create());
|
||||
}
|
||||
@@ -2355,7 +2350,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||
private void createDeleteMessagesAlert() {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
||||
builder.setMessage(ApplicationLoader.applicationContext.getResources().getQuantityString(R.plurals.AreYouSureDeleteMessages, selectedMessagesIds.size(), selectedMessagesIds.size()));
|
||||
builder.setPositiveButton(ApplicationLoader.applicationContext.getString(R.string.OK), new DialogInterface.OnClickListener() {
|
||||
builder.setPositiveButton(R.string.OK, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
|
||||
@@ -2376,7 +2371,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||
NotificationCenter.getInstance().postNotificationName(NotificationCenter.dialogsNeedReload);
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(ApplicationLoader.applicationContext.getString(R.string.Cancel), null);
|
||||
builder.setNegativeButton(R.string.Cancel, null);
|
||||
showDialog(builder.create());
|
||||
}
|
||||
|
||||
@@ -2746,13 +2741,13 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
|
||||
if( isMailto )
|
||||
{
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
||||
builder.setPositiveButton(mContext.getString(R.string.OK), new DialogInterface.OnClickListener() {
|
||||
builder.setPositiveButton(R.string.OK, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
createChat(urlFinal);
|
||||
createChat(urlFinal);
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(mContext.getString(R.string.Cancel), null);
|
||||
builder.setNegativeButton(R.string.Cancel, null);
|
||||
builder.setMessage(AndroidUtilities.replaceTags(String.format(mContext.getString(R.string.AskStartChatWith), urlTitle)));
|
||||
showDialog(builder.create());
|
||||
}
|
||||
|
||||
@@ -1408,13 +1408,13 @@ public class ChatActivityEnterView extends FrameLayout implements NotificationCe
|
||||
}
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(parentActivity);
|
||||
builder.setMessage(ApplicationLoader.applicationContext.getString(R.string.ClearRecentEmoji));
|
||||
builder.setPositiveButton(ApplicationLoader.applicationContext.getString(R.string.ClearButton).toUpperCase(), new DialogInterface.OnClickListener() {
|
||||
builder.setPositiveButton(R.string.ClearButton, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
emojiView.clearRecentEmoji();
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(ApplicationLoader.applicationContext.getString(R.string.Cancel), null);
|
||||
builder.setNegativeButton(R.string.Cancel, null);
|
||||
parentFragment.showDialog(builder.create());
|
||||
}
|
||||
});
|
||||
|
||||
@@ -530,7 +530,7 @@ public class PasscodeView extends FrameLayout {
|
||||
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
|
||||
builder.setView(relativeLayout);
|
||||
builder.setNegativeButton(ApplicationLoader.applicationContext.getString(R.string.Cancel), null);
|
||||
builder.setNegativeButton(R.string.Cancel, null);
|
||||
builder.setOnDismissListener(new DialogInterface.OnDismissListener() {
|
||||
@Override
|
||||
public void onDismiss(DialogInterface dialog) {
|
||||
|
||||
@@ -428,7 +428,7 @@ public class ContactsActivity extends BaseFragment implements NotificationCenter
|
||||
}
|
||||
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
||||
builder.setPositiveButton(context.getString(R.string.OK), new DialogInterface.OnClickListener() {
|
||||
builder.setPositiveButton(R.string.OK, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
int belonging_chat_id = MrMailbox.createChatByContactId(user.id);
|
||||
@@ -439,7 +439,7 @@ public class ContactsActivity extends BaseFragment implements NotificationCenter
|
||||
}
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(context.getString(R.string.Cancel), null);
|
||||
builder.setNegativeButton(R.string.Cancel, null);
|
||||
builder.setMessage(AndroidUtilities.replaceTags(String.format(context.getString(R.string.AskStartChatWith), name)));
|
||||
showDialog(builder.create());
|
||||
}
|
||||
|
||||
@@ -588,14 +588,14 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter.
|
||||
if (!pm.isIgnoringBatteryOptimizations(ApplicationLoader.applicationContext.getPackageName())) {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
||||
builder.setMessage(AndroidUtilities.replaceTags(ApplicationLoader.applicationContext.getString(R.string.PermissionBattery)));
|
||||
builder.setPositiveButton(ApplicationLoader.applicationContext.getString(R.string.OK), new DialogInterface.OnClickListener() {
|
||||
builder.setPositiveButton(R.string.OK, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
askForIgnoreBatteryOptimization();
|
||||
}
|
||||
});
|
||||
builder.setCancelable(false);
|
||||
builder.setNegativeButton(ApplicationLoader.applicationContext.getString(R.string.Cancel), new DialogInterface.OnClickListener() {
|
||||
builder.setNegativeButton(R.string.Cancel, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
askForOtherPermissons();
|
||||
@@ -802,7 +802,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter.
|
||||
didSelectResult(dialog_id, false, false);
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(ApplicationLoader.applicationContext.getString(R.string.Cancel), null);
|
||||
builder.setNegativeButton(R.string.Cancel, null);
|
||||
showDialog(builder.create());
|
||||
} else {
|
||||
if (delegate != null) {
|
||||
|
||||
@@ -1,409 +0,0 @@
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Delta Chat Android
|
||||
* (C) 2013-2016 Nikolai Kudashov
|
||||
* (C) 2017 Björn Petersen
|
||||
* Contact: r10s@b44t.com, http://b44t.com
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License as published by the Free Software
|
||||
* Foundation, either version 3 of the License, or (at your option) any later
|
||||
* version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||
* details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see http://www.gnu.org/licenses/ .
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
package com.b44t.ui;
|
||||
|
||||
import android.animation.ObjectAnimator;
|
||||
import android.animation.StateListAnimator;
|
||||
import android.app.Activity;
|
||||
import android.app.AlertDialog;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.ActivityInfo;
|
||||
import android.content.pm.PackageInfo;
|
||||
import android.database.DataSetObserver;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.Parcelable;
|
||||
import android.os.PowerManager;
|
||||
import android.support.v4.view.PagerAdapter;
|
||||
import android.support.v4.view.ViewPager;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.Window;
|
||||
import android.view.animation.Animation;
|
||||
import android.view.animation.AnimationUtils;
|
||||
import android.widget.Button;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.b44t.messenger.AndroidUtilities;
|
||||
import com.b44t.messenger.ApplicationLoader;
|
||||
import com.b44t.messenger.BuildConfig;
|
||||
import com.b44t.messenger.LocaleController;
|
||||
import com.b44t.messenger.MrMailbox;
|
||||
import com.b44t.messenger.R;
|
||||
import com.b44t.ui.ActionBar.Theme;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
import static java.lang.Math.min;
|
||||
|
||||
public class IntroActivity extends Activity {
|
||||
|
||||
private ViewPager viewPager;
|
||||
private ImageView topImage1;
|
||||
private ImageView topImage2;
|
||||
private ViewGroup bottomPages;
|
||||
private int lastPage = 0;
|
||||
private boolean justCreated = false;
|
||||
private boolean startPressed = false;
|
||||
private int[] icons;
|
||||
private int[] titles;
|
||||
private int[] messages;
|
||||
|
||||
private boolean isAbout = false;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
setTheme(R.style.Theme_MessengerProj);
|
||||
super.onCreate(savedInstanceState);
|
||||
Theme.loadRecources(this);
|
||||
requestWindowFeature(Window.FEATURE_NO_TITLE);
|
||||
|
||||
Bundle extras = getIntent().getExtras();
|
||||
if( extras != null && extras.getBoolean("com.b44t.ui.IntroActivity.isAbout") ) {
|
||||
isAbout = true;
|
||||
}
|
||||
|
||||
float heightOnLandscape = min(AndroidUtilities.displaySize.x,AndroidUtilities.displaySize.y)/AndroidUtilities.density;
|
||||
if( heightOnLandscape < 450 ) {
|
||||
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
|
||||
}
|
||||
|
||||
setContentView(R.layout.intro_layout);
|
||||
|
||||
if (LocaleController.isRTL) {
|
||||
icons = new int[]{
|
||||
R.drawable.intro7,
|
||||
R.drawable.intro6,
|
||||
R.drawable.intro5,
|
||||
R.drawable.intro4,
|
||||
R.drawable.intro3,
|
||||
R.drawable.intro2,
|
||||
R.drawable.intro1
|
||||
};
|
||||
titles = new int[]{
|
||||
R.string.Intro7Headline,
|
||||
R.string.Intro6Headline,
|
||||
R.string.Intro5Headline,
|
||||
R.string.Intro4Headline,
|
||||
R.string.Intro3Headline,
|
||||
R.string.Intro2Headline,
|
||||
R.string.Intro1Headline
|
||||
};
|
||||
messages = new int[]{
|
||||
R.string.Intro7Message,
|
||||
R.string.Intro6Message,
|
||||
R.string.Intro5Message,
|
||||
R.string.Intro4Message,
|
||||
R.string.Intro3Message,
|
||||
R.string.Intro2Message,
|
||||
R.string.Intro1Message
|
||||
};
|
||||
} else {
|
||||
icons = new int[]{
|
||||
R.drawable.intro1,
|
||||
R.drawable.intro2,
|
||||
R.drawable.intro3,
|
||||
R.drawable.intro4,
|
||||
R.drawable.intro5,
|
||||
R.drawable.intro6,
|
||||
R.drawable.intro7
|
||||
};
|
||||
titles = new int[]{
|
||||
R.string.Intro1Headline,
|
||||
R.string.Intro2Headline,
|
||||
R.string.Intro3Headline,
|
||||
R.string.Intro4Headline,
|
||||
R.string.Intro5Headline,
|
||||
R.string.Intro6Headline,
|
||||
R.string.Intro7Headline
|
||||
};
|
||||
messages = new int[]{
|
||||
R.string.Intro1Message,
|
||||
R.string.Intro2Message,
|
||||
R.string.Intro3Message,
|
||||
R.string.Intro4Message,
|
||||
R.string.Intro5Message,
|
||||
R.string.Intro6Message,
|
||||
R.string.Intro7Message
|
||||
};
|
||||
}
|
||||
viewPager = (ViewPager) findViewById(R.id.intro_view_pager);
|
||||
|
||||
Button startMessagingButton = (Button) findViewById(R.id.start_messaging_button);
|
||||
Button detailsButton = (Button) findViewById(R.id.details_button);
|
||||
if( isAbout ) {
|
||||
startMessagingButton.setText(ApplicationLoader.applicationContext.getString(R.string.OK));
|
||||
detailsButton.setText(ApplicationLoader.applicationContext.getString(R.string.Info));
|
||||
detailsButton.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
new AlertDialog.Builder(IntroActivity.this)
|
||||
.setTitle(ApplicationLoader.applicationContext.getString(R.string.AppName) + " v" + getVersion())
|
||||
.setMessage("© 2017 Delta Chat contributors" + "\n\n" + MrMailbox.getInfo() + "\n\n" + getAndroidInfo())
|
||||
.setPositiveButton(ApplicationLoader.applicationContext.getString(R.string.OK), new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
;
|
||||
}
|
||||
})
|
||||
.show();
|
||||
}
|
||||
});
|
||||
}
|
||||
else {
|
||||
startMessagingButton.setText(ApplicationLoader.applicationContext.getString(R.string.IntroStartMessaging));
|
||||
detailsButton.setVisibility(View.GONE);
|
||||
}
|
||||
startMessagingButton.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
if(!isAbout) {
|
||||
if(startPressed) {
|
||||
return;
|
||||
}
|
||||
startPressed = true;
|
||||
Intent intent2 = new Intent(IntroActivity.this, LaunchActivity.class);
|
||||
intent2.putExtra("fromIntro", true);
|
||||
startActivity(intent2);
|
||||
}
|
||||
finish();
|
||||
}
|
||||
});
|
||||
|
||||
topImage1 = (ImageView) findViewById(R.id.icon_image1);
|
||||
topImage2 = (ImageView) findViewById(R.id.icon_image2);
|
||||
bottomPages = (ViewGroup) findViewById(R.id.bottom_pages);
|
||||
topImage2.setVisibility(View.GONE);
|
||||
viewPager.setAdapter(new IntroAdapter());
|
||||
viewPager.setPageMargin(0);
|
||||
viewPager.setOffscreenPageLimit(1);
|
||||
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
|
||||
@Override
|
||||
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPageSelected(int i) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPageScrollStateChanged(int i) {
|
||||
if (i == ViewPager.SCROLL_STATE_IDLE || i == ViewPager.SCROLL_STATE_SETTLING) {
|
||||
if (lastPage != viewPager.getCurrentItem()) {
|
||||
lastPage = viewPager.getCurrentItem();
|
||||
|
||||
final ImageView fadeoutImage;
|
||||
final ImageView fadeinImage;
|
||||
if (topImage1.getVisibility() == View.VISIBLE) {
|
||||
fadeoutImage = topImage1;
|
||||
fadeinImage = topImage2;
|
||||
|
||||
} else {
|
||||
fadeoutImage = topImage2;
|
||||
fadeinImage = topImage1;
|
||||
}
|
||||
|
||||
fadeinImage.bringToFront();
|
||||
fadeinImage.setImageResource(icons[lastPage]);
|
||||
fadeinImage.clearAnimation();
|
||||
fadeoutImage.clearAnimation();
|
||||
|
||||
Animation outAnimation = AnimationUtils.loadAnimation(IntroActivity.this, R.anim.icon_anim_fade_out);
|
||||
outAnimation.setAnimationListener(new Animation.AnimationListener() {
|
||||
@Override
|
||||
public void onAnimationStart(Animation animation) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAnimationEnd(Animation animation) {
|
||||
fadeoutImage.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAnimationRepeat(Animation animation) {
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
Animation inAnimation = AnimationUtils.loadAnimation(IntroActivity.this, R.anim.icon_anim_fade_in);
|
||||
inAnimation.setAnimationListener(new Animation.AnimationListener() {
|
||||
@Override
|
||||
public void onAnimationStart(Animation animation) {
|
||||
fadeinImage.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAnimationEnd(Animation animation) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAnimationRepeat(Animation animation) {
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
fadeoutImage.startAnimation(outAnimation);
|
||||
fadeinImage.startAnimation(inAnimation);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
justCreated = true;
|
||||
}
|
||||
|
||||
public static String getVersion()
|
||||
{
|
||||
try {
|
||||
PackageInfo pInfo = ApplicationLoader.applicationContext.getPackageManager().getPackageInfo(ApplicationLoader.applicationContext.getPackageName(), 0);
|
||||
return pInfo.versionName;
|
||||
}
|
||||
catch(Exception e) {
|
||||
return "ErrVersion";
|
||||
}
|
||||
}
|
||||
|
||||
private String getAndroidInfo()
|
||||
{
|
||||
String abi = "ErrAbi";
|
||||
int versionCode = 0, ignoreBatteryOptimizations = -1;
|
||||
try {
|
||||
PackageInfo pInfo = ApplicationLoader.applicationContext.getPackageManager().getPackageInfo(ApplicationLoader.applicationContext.getPackageName(), 0);
|
||||
versionCode = pInfo.versionCode;
|
||||
switch (versionCode % 10) {
|
||||
case 0:
|
||||
abi = "arm";
|
||||
break;
|
||||
case 1:
|
||||
abi = "arm-v7a";
|
||||
break;
|
||||
case 2:
|
||||
abi = "x86";
|
||||
break;
|
||||
case 3:
|
||||
abi = "universal";
|
||||
break;
|
||||
}
|
||||
if( Build.VERSION.SDK_INT >= 23 ) {
|
||||
PowerManager pm = (PowerManager) ApplicationLoader.applicationContext.getSystemService(Context.POWER_SERVICE);
|
||||
ignoreBatteryOptimizations = pm.isIgnoringBatteryOptimizations(ApplicationLoader.applicationContext.getPackageName())? 1 : 0;
|
||||
}
|
||||
} catch (Exception e) {}
|
||||
|
||||
return "SDK_INT=" + Build.VERSION.SDK_INT
|
||||
+ "\nMANUFACTURER=" + Build.MANUFACTURER
|
||||
+ "\nMODEL=" + Build.MODEL
|
||||
+ "\nAPPLICATION_ID=" + BuildConfig.APPLICATION_ID
|
||||
+ "\nBUILD_TYPE=" + BuildConfig.BUILD_TYPE
|
||||
+ "\nABI=" + abi // ABI = Application Binary Interface
|
||||
+ "\nignoreBatteryOptimizations=" + ignoreBatteryOptimizations
|
||||
+ "\nversionCode=" + versionCode;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
if (justCreated) {
|
||||
if (LocaleController.isRTL) {
|
||||
viewPager.setCurrentItem(6);
|
||||
lastPage = 6;
|
||||
} else {
|
||||
viewPager.setCurrentItem(0);
|
||||
lastPage = 0;
|
||||
}
|
||||
justCreated = false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
}
|
||||
|
||||
private class IntroAdapter extends PagerAdapter {
|
||||
@Override
|
||||
public int getCount() {
|
||||
return 7;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object instantiateItem(ViewGroup container, int position) {
|
||||
View view = View.inflate(container.getContext(), R.layout.intro_view_layout, null);
|
||||
TextView headerTextView = (TextView) view.findViewById(R.id.header_text);
|
||||
TextView messageTextView = (TextView) view.findViewById(R.id.message_text);
|
||||
container.addView(view, 0);
|
||||
|
||||
headerTextView.setText(getString(titles[position]));
|
||||
messageTextView.setText(AndroidUtilities.replaceTags(getString(messages[position])));
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void destroyItem(ViewGroup container, int position, Object object) {
|
||||
container.removeView((View) object);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setPrimaryItem(ViewGroup container, int position, Object object) {
|
||||
super.setPrimaryItem(container, position, object);
|
||||
int count = bottomPages.getChildCount();
|
||||
for (int a = 0; a < count; a++) {
|
||||
View child = bottomPages.getChildAt(a);
|
||||
if (a == position) {
|
||||
child.setBackgroundColor(0xff2ca5e0);
|
||||
} else {
|
||||
child.setBackgroundColor(0xffbbbbbb);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isViewFromObject(View view, Object object) {
|
||||
return view.equals(object);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void restoreState(Parcelable arg0, ClassLoader arg1) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Parcelable saveState() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unregisterDataSetObserver(DataSetObserver observer) {
|
||||
if (observer != null) {
|
||||
super.unregisterDataSetObserver(observer);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -102,7 +102,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
|
||||
if( MrMailbox.isConfigured()==0 ) {
|
||||
Intent intent = getIntent();
|
||||
if (intent != null && !intent.getBooleanExtra("fromIntro", false)) {
|
||||
Intent intent2 = new Intent(this, IntroActivity.class);
|
||||
Intent intent2 = new Intent(this, WelcomeActivity.class);
|
||||
startActivity(intent2);
|
||||
super.onCreate(savedInstanceState);
|
||||
finish();
|
||||
@@ -577,7 +577,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
|
||||
{
|
||||
final String createChatWithFinal = createChatWith;
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||
builder.setPositiveButton(ApplicationLoader.applicationContext.getString(R.string.OK), new DialogInterface.OnClickListener() {
|
||||
builder.setPositiveButton(R.string.OK, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
int chatId = MrMailbox.createChatByContactId(MrMailbox.createContact("", createChatWithFinal));
|
||||
@@ -591,7 +591,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
|
||||
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(ApplicationLoader.applicationContext.getString(R.string.Cancel), null);
|
||||
builder.setNegativeButton(R.string.Cancel, null);
|
||||
builder.setMessage(AndroidUtilities.replaceTags(String.format(ApplicationLoader.applicationContext.getString(R.string.AskStartChatWith), createChatWith)));
|
||||
builder.show();
|
||||
}
|
||||
@@ -786,8 +786,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||
builder.setMessage(msg.trim());
|
||||
|
||||
builder.setPositiveButton(ApplicationLoader.applicationContext.getString(R.string.PermissionOpenSettings), new DialogInterface.OnClickListener() {
|
||||
@TargetApi(Build.VERSION_CODES.GINGERBREAD)
|
||||
builder.setPositiveButton(R.string.PermissionOpenSettings, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
try {
|
||||
@@ -801,7 +800,7 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
|
||||
}
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(ApplicationLoader.applicationContext.getString(R.string.Cancel), null);
|
||||
builder.setNegativeButton(R.string.Cancel, null);
|
||||
builder.show();
|
||||
return;
|
||||
}
|
||||
@@ -1053,8 +1052,4 @@ public class LaunchActivity extends Activity implements ActionBarLayout.ActionBa
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRebuildAllFragments(ActionBarLayout layout) {
|
||||
}
|
||||
}
|
||||
|
||||
@@ -382,7 +382,7 @@ public class PasscodeActivity extends BaseFragment implements NotificationCenter
|
||||
});
|
||||
numberPicker.setWrapSelectorWheel(false);
|
||||
builder.setView(numberPicker);
|
||||
builder.setPositiveButton(context.getString(R.string.OK), new DialogInterface.OnClickListener() {
|
||||
builder.setPositiveButton(R.string.OK, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
which = numberPicker.getValue();
|
||||
|
||||
@@ -1018,7 +1018,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
||||
}
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
|
||||
builder.setNegativeButton(R.string.Cancel, null);
|
||||
showAlertDialog(builder);
|
||||
*/
|
||||
}
|
||||
@@ -1471,7 +1471,7 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
||||
mentionsAdapter.clearRecentHashtags();
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(LocaleController.getString("Cancel", R.string.Cancel), null);
|
||||
builder.setNegativeButton(R.string.Cancel, null);
|
||||
showAlertDialog(builder);
|
||||
return true;
|
||||
}
|
||||
@@ -2004,13 +2004,13 @@ public class PhotoViewer implements NotificationCenter.NotificationCenterDelegat
|
||||
}
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(parentActivity);
|
||||
builder.setMessage(ApplicationLoader.applicationContext.getString(R.string.DiscardChanges));
|
||||
builder.setPositiveButton(ApplicationLoader.applicationContext.getString(R.string.OK), new DialogInterface.OnClickListener() {
|
||||
builder.setPositiveButton(R.string.OK, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
switchToEditMode(0);
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(ApplicationLoader.applicationContext.getString(R.string.Cancel), null);
|
||||
builder.setNegativeButton(R.string.Cancel, null);
|
||||
showAlertDialog(builder);
|
||||
} else {
|
||||
switchToEditMode(0);
|
||||
|
||||
@@ -252,14 +252,14 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
|
||||
else {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
||||
builder.setMessage(context.getString(R.string.AreYouSureBlockContact));
|
||||
builder.setPositiveButton(context.getString(R.string.OK), new DialogInterface.OnClickListener() {
|
||||
builder.setPositiveButton(R.string.OK, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
MrMailbox.blockContact(user_id, 1);
|
||||
finishFragment(); /* got to the parent, this is important eg. when editing blocking in the BlockedUserActivitiy. Moreover, this saves us updating all the states in the profile */
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(context.getString(R.string.Cancel), null);
|
||||
builder.setNegativeButton(R.string.Cancel, null);
|
||||
showDialog(builder.create());
|
||||
}
|
||||
}
|
||||
@@ -267,7 +267,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
|
||||
{
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
||||
builder.setMessage(context.getString(R.string.AreYouSureDeleteContact));
|
||||
builder.setPositiveButton(context.getString(R.string.OK), new DialogInterface.OnClickListener() {
|
||||
builder.setPositiveButton(R.string.OK, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
if( MrMailbox.deleteContact(user_id)==0 ) {
|
||||
@@ -279,7 +279,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
|
||||
}
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(context.getString(R.string.Cancel), null);
|
||||
builder.setNegativeButton(R.string.Cancel, null);
|
||||
showDialog(builder.create());
|
||||
}
|
||||
else if (id == ID_ADD_SHORTCUT)
|
||||
@@ -379,14 +379,9 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
|
||||
{
|
||||
String info_str = MrMailbox.getContactEncrInfo(user_id);
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
||||
builder.setTitle(ApplicationLoader.applicationContext.getString(R.string.Encryption));
|
||||
builder.setTitle(R.string.Encryption);
|
||||
builder.setMessage(AndroidUtilities.replaceTags(info_str));
|
||||
builder.setPositiveButton(context.getString(R.string.OK), new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
;
|
||||
}
|
||||
});
|
||||
builder.setPositiveButton(R.string.OK, null);
|
||||
showDialog(builder.create());
|
||||
}
|
||||
else if(position==startChatRow)
|
||||
@@ -403,7 +398,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
|
||||
|
||||
String name = MrMailbox.getContact(user_id).getNameNAddr();
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
||||
builder.setPositiveButton(context.getString(R.string.OK), new DialogInterface.OnClickListener() {
|
||||
builder.setPositiveButton(R.string.OK, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
int belonging_chat_id = MrMailbox.createChatByContactId(user_id);
|
||||
@@ -417,7 +412,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
|
||||
}
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(context.getString(R.string.Cancel), null);
|
||||
builder.setNegativeButton(R.string.Cancel, null);
|
||||
builder.setMessage(AndroidUtilities.replaceTags(String.format(context.getString(R.string.AskStartChatWith), name)));
|
||||
showDialog(builder.create());
|
||||
}
|
||||
@@ -435,14 +430,14 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
|
||||
}
|
||||
else {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
||||
builder.setPositiveButton(context.getString(R.string.OK), new DialogInterface.OnClickListener() {
|
||||
builder.setPositiveButton(R.string.OK, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
MrMailbox.addContactToChat(chat_id, added_user_id);
|
||||
NotificationCenter.getInstance().postNotificationName(NotificationCenter.updateInterfaces, MrMailbox.UPDATE_MASK_CHAT_MEMBERS);
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(context.getString(R.string.Cancel), null);
|
||||
builder.setNegativeButton(R.string.Cancel, null);
|
||||
String name = MrMailbox.getContact(added_user_id).getDisplayName();
|
||||
builder.setMessage(AndroidUtilities.replaceTags(String.format(context.getString(R.string.AskAddMemberToGroup), name)));
|
||||
showDialog(builder.create());
|
||||
@@ -482,14 +477,14 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
||||
builder.setPositiveButton(context.getString(R.string.OK), new DialogInterface.OnClickListener() {
|
||||
builder.setPositiveButton(R.string.OK, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
MrMailbox.removeContactFromChat(chat_id, curr_user_id);
|
||||
NotificationCenter.getInstance().postNotificationName(NotificationCenter.updateInterfaces, MrMailbox.UPDATE_MASK_CHAT_MEMBERS);
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(context.getString(R.string.Cancel), null);
|
||||
builder.setNegativeButton(R.string.Cancel, null);
|
||||
String name = MrMailbox.getContact(curr_user_id).getDisplayName();
|
||||
builder.setMessage(AndroidUtilities.replaceTags(String.format(context.getString(R.string.AskRemoveMemberFromGroup), name)));
|
||||
showDialog(builder.create());
|
||||
@@ -532,7 +527,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
|
||||
items = new CharSequence[]{context.getString(R.string.FromCamera), context.getString(R.string.FromGalley), context.getString(R.string.Delete)};
|
||||
}
|
||||
|
||||
builder.setTitle(context.getString(R.string.EditImage));
|
||||
builder.setTitle(R.string.EditImage);
|
||||
builder.setItems(items, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
@@ -543,7 +538,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
|
||||
} else if (i == 2) {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
||||
builder.setMessage(context.getString(R.string.AskDeleteGroupImage));
|
||||
builder.setPositiveButton(context.getString(R.string.OK), new DialogInterface.OnClickListener() {
|
||||
builder.setPositiveButton(R.string.OK, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
if( MrMailbox.setChatImage(chat_id, null)!=0 ) {
|
||||
@@ -551,7 +546,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
|
||||
}
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(context.getString(R.string.Cancel), null);
|
||||
builder.setNegativeButton(R.string.Cancel, null);
|
||||
showDialog(builder.create());
|
||||
|
||||
|
||||
|
||||
@@ -149,7 +149,7 @@ public class ProfileNotificationsActivity extends BaseFragment implements Notifi
|
||||
public void onItemClick(AdapterView<?> adapterView, View view, final int i, long l) {
|
||||
if (i == settingsVibrateRow) {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
||||
builder.setTitle(context.getString(R.string.Vibrate));
|
||||
builder.setTitle(R.string.Vibrate);
|
||||
builder.setItems(new CharSequence[]{
|
||||
context.getString(R.string.Disabled),
|
||||
context.getString(R.string.Default),
|
||||
@@ -177,7 +177,7 @@ public class ProfileNotificationsActivity extends BaseFragment implements Notifi
|
||||
}
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(context.getString(R.string.Cancel), null);
|
||||
builder.setNegativeButton(R.string.Cancel, null);
|
||||
showDialog(builder.create());
|
||||
} else if (i == settingsNotificationsRow) {
|
||||
if (getParentActivity() == null) {
|
||||
@@ -212,7 +212,7 @@ public class ProfileNotificationsActivity extends BaseFragment implements Notifi
|
||||
NotificationCenter.getInstance().postNotificationName(NotificationCenter.notificationsSettingsUpdated);
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(context.getString(R.string.Cancel), null);
|
||||
builder.setNegativeButton(R.string.Cancel, null);
|
||||
showDialog(builder.create());
|
||||
} else if (i == settingsSoundRow) {
|
||||
try {
|
||||
@@ -261,9 +261,9 @@ public class ProfileNotificationsActivity extends BaseFragment implements Notifi
|
||||
}
|
||||
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
||||
builder.setTitle(context.getString(R.string.LedColor));
|
||||
builder.setTitle(R.string.LedColor);
|
||||
builder.setView(linearLayout);
|
||||
builder.setPositiveButton(context.getString(R.string.Set), new DialogInterface.OnClickListener() {
|
||||
builder.setPositiveButton(R.string.Set, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int which) {
|
||||
final SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE);
|
||||
@@ -273,7 +273,7 @@ public class ProfileNotificationsActivity extends BaseFragment implements Notifi
|
||||
listView.invalidateViews();
|
||||
}
|
||||
});
|
||||
builder.setNeutralButton(context.getString(R.string.Disabled), new DialogInterface.OnClickListener() {
|
||||
builder.setNeutralButton(R.string.Disabled, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
final SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE);
|
||||
@@ -283,7 +283,7 @@ public class ProfileNotificationsActivity extends BaseFragment implements Notifi
|
||||
listView.invalidateViews();
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(context.getString(R.string.Default), new DialogInterface.OnClickListener() {
|
||||
builder.setNegativeButton(R.string.Default, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
final SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE);
|
||||
@@ -296,7 +296,7 @@ public class ProfileNotificationsActivity extends BaseFragment implements Notifi
|
||||
showDialog(builder.create());
|
||||
} else if (i == settingsPriorityRow) {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
||||
builder.setTitle(context.getString(R.string.NotificationsPriority));
|
||||
builder.setTitle(R.string.NotificationsPriority);
|
||||
builder.setItems(new CharSequence[]{
|
||||
context.getString(R.string.Default),
|
||||
context.getString(R.string.NotificationsPriorityDefault),
|
||||
@@ -317,7 +317,7 @@ public class ProfileNotificationsActivity extends BaseFragment implements Notifi
|
||||
}
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(context.getString(R.string.Cancel), null);
|
||||
builder.setNegativeButton(R.string.Cancel, null);
|
||||
showDialog(builder.create());
|
||||
} else if (i == smartRow) {
|
||||
if (getParentActivity() == null) {
|
||||
@@ -412,9 +412,9 @@ public class ProfileNotificationsActivity extends BaseFragment implements Notifi
|
||||
textView.setLayoutParams(layoutParams1);
|
||||
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
||||
builder.setTitle(context.getString(R.string.SmartNotifications));
|
||||
builder.setTitle(R.string.SmartNotifications);
|
||||
builder.setView(linearLayout);
|
||||
builder.setPositiveButton(context.getString(R.string.OK), new DialogInterface.OnClickListener() {
|
||||
builder.setPositiveButton(R.string.OK, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE);
|
||||
@@ -425,7 +425,7 @@ public class ProfileNotificationsActivity extends BaseFragment implements Notifi
|
||||
}
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(context.getString(R.string.Disabled), new DialogInterface.OnClickListener() {
|
||||
builder.setNegativeButton(R.string.Disabled, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE);
|
||||
|
||||
@@ -248,7 +248,7 @@ public class SettingsAccountActivity extends BaseFragment implements Notificatio
|
||||
else if( i==rowMailSecurity || i==rowSendSecurity )
|
||||
{
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
||||
builder.setTitle(ApplicationLoader.applicationContext.getString(R.string.SecurityTitle));
|
||||
builder.setTitle(R.string.SecurityTitle);
|
||||
builder.setItems(new CharSequence[]{
|
||||
ApplicationLoader.applicationContext.getString(R.string.Automatic),
|
||||
"SSL/TLS", /*1*/
|
||||
@@ -276,7 +276,7 @@ public class SettingsAccountActivity extends BaseFragment implements Notificatio
|
||||
listView.invalidateViews();
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(context.getString(R.string.Cancel), null);
|
||||
builder.setNegativeButton(R.string.Cancel, null);
|
||||
showDialog(builder.create());
|
||||
|
||||
}
|
||||
@@ -400,12 +400,7 @@ public class SettingsAccountActivity extends BaseFragment implements Notificatio
|
||||
else if( ! MrMailbox.m_lastErrorString.isEmpty() ){
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
||||
builder.setMessage(errorString);
|
||||
builder.setPositiveButton(ApplicationLoader.applicationContext.getString(R.string.OK), new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
;
|
||||
}
|
||||
});
|
||||
builder.setPositiveButton(R.string.OK, null);
|
||||
showDialog(builder.create());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -165,7 +165,7 @@ public class SettingsActivity extends BaseFragment {
|
||||
presentFragment(new SettingsAdvActivity());
|
||||
}
|
||||
else if (i == aboutRow ) {
|
||||
Intent intent2 = new Intent(getParentActivity(), IntroActivity.class);
|
||||
Intent intent2 = new Intent(getParentActivity(), WelcomeActivity.class);
|
||||
intent2.putExtra("com.b44t.ui.IntroActivity.isAbout", true);
|
||||
getParentActivity().startActivity(intent2);
|
||||
}
|
||||
@@ -293,7 +293,7 @@ public class SettingsActivity extends BaseFragment {
|
||||
}
|
||||
TextDetailSettingsCell textCell = (TextDetailSettingsCell) view;
|
||||
if (i == aboutRow) {
|
||||
textCell.setTextAndValue(mContext.getString(R.string.AboutThisProgram), "v" + IntroActivity.getVersion(), true);
|
||||
textCell.setTextAndValue(mContext.getString(R.string.AboutThisProgram), "v" + WelcomeActivity.getVersion(), true);
|
||||
}
|
||||
}
|
||||
else if (type == ROWTYPE_CHECK ) {
|
||||
|
||||
@@ -28,14 +28,19 @@ import android.app.AlertDialog;
|
||||
import android.app.ProgressDialog;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.media.MediaScannerConnection;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.Environment;
|
||||
import android.text.InputType;
|
||||
import android.view.Gravity;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.EditText;
|
||||
import android.widget.FrameLayout;
|
||||
import android.widget.ListView;
|
||||
|
||||
@@ -47,6 +52,7 @@ import com.b44t.messenger.MrMailbox;
|
||||
import com.b44t.messenger.NotificationCenter;
|
||||
import com.b44t.messenger.R;
|
||||
import com.b44t.ui.Adapters.BaseFragmentAdapter;
|
||||
import com.b44t.ui.Cells.HeaderCell;
|
||||
import com.b44t.ui.Cells.ShadowSectionCell;
|
||||
import com.b44t.ui.Cells.TextCheckCell;
|
||||
import com.b44t.ui.Cells.TextSettingsCell;
|
||||
@@ -61,23 +67,36 @@ import java.io.File;
|
||||
public class SettingsAdvActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate {
|
||||
|
||||
// the list
|
||||
private int directShareRow, cacheRow, raiseToSpeakRow, sendByEnterRow, autoplayGifsRow, textSizeRow, showUnknownSendersRow, finalShadowRow;
|
||||
private int blockedRow;
|
||||
private int accountSettingsRow;
|
||||
private int directShareRow;
|
||||
private int cacheRow;
|
||||
private int autoplayGifsRow;
|
||||
private int textSizeRow;
|
||||
private int showUnknownSendersRow;
|
||||
private int sendByEnterRow;
|
||||
private int raiseToSpeakRow;
|
||||
private int blockedRow;
|
||||
private int e2eEncryptionRow;
|
||||
private int settingsShadowRow;
|
||||
|
||||
private int imexHeaderRow;
|
||||
private int manageKeysRow;
|
||||
private int backupRow;
|
||||
private int backupShadowRow;
|
||||
private int rowCount;
|
||||
|
||||
private static final int ROWTYPE_SHADOW = 0;
|
||||
private static final int ROWTYPE_TEXT_SETTINGS = 1;
|
||||
private static final int ROWTYPE_CHECK = 2;
|
||||
private static final int ROWTYPE_COUNT = 3;
|
||||
private static final int ROWTYPE_HEADER = 3;
|
||||
private static final int ROWTYPE_COUNT = 4;
|
||||
|
||||
private ListView listView;
|
||||
|
||||
public final int MR_E2EE_DEFAULT_ENABLED = 1; // when changing this constant, also change it in the C-part
|
||||
|
||||
private File imexDir;
|
||||
|
||||
public static int defMsgFontSize() {
|
||||
return 16;
|
||||
}
|
||||
@@ -86,8 +105,9 @@ public class SettingsAdvActivity extends BaseFragment implements NotificationCen
|
||||
public boolean onFragmentCreate() {
|
||||
super.onFragmentCreate();
|
||||
|
||||
NotificationCenter.getInstance().addObserver(this, NotificationCenter.exportEnded);
|
||||
NotificationCenter.getInstance().addObserver(this, NotificationCenter.exportProgress);
|
||||
NotificationCenter.getInstance().addObserver(this, NotificationCenter.imexEnded);
|
||||
NotificationCenter.getInstance().addObserver(this, NotificationCenter.imexProgress);
|
||||
NotificationCenter.getInstance().addObserver(this, NotificationCenter.imexFileWritten);
|
||||
|
||||
rowCount = 0;
|
||||
accountSettingsRow = rowCount++;
|
||||
@@ -105,9 +125,12 @@ public class SettingsAdvActivity extends BaseFragment implements NotificationCen
|
||||
cacheRow = -1;// for now, the - non-functional - page is reachable by the "storage settings" in the "android App Settings" only
|
||||
blockedRow = rowCount++;
|
||||
e2eEncryptionRow = rowCount++;
|
||||
settingsShadowRow = rowCount++;
|
||||
|
||||
imexHeaderRow = rowCount++;
|
||||
manageKeysRow = rowCount++;
|
||||
backupRow = -1; //rowCount++; -- disabled for now
|
||||
finalShadowRow = rowCount++;
|
||||
backupRow = rowCount++;
|
||||
backupShadowRow = rowCount++;
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -115,8 +138,9 @@ public class SettingsAdvActivity extends BaseFragment implements NotificationCen
|
||||
@Override
|
||||
public void onFragmentDestroy() {
|
||||
super.onFragmentDestroy();
|
||||
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.exportEnded);
|
||||
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.exportProgress);
|
||||
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.imexEnded);
|
||||
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.imexProgress);
|
||||
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.imexFileWritten);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -220,18 +244,22 @@ public class SettingsAdvActivity extends BaseFragment implements NotificationCen
|
||||
}
|
||||
else if(i==manageKeysRow )
|
||||
{
|
||||
imexShowMenu(ApplicationLoader.applicationContext.getString(R.string.E2EManagePrivateKeys), MrMailbox.MR_IMEX_EXPORT_SELF_KEYS, MrMailbox.MR_IMEX_IMPORT_SELF_KEYS);
|
||||
imexShowMenu(ApplicationLoader.applicationContext.getString(R.string.E2EManagePrivateKeys),
|
||||
MrMailbox.MR_IMEX_EXPORT_SELF_KEYS, ApplicationLoader.applicationContext.getString(R.string.ExportPrivateKeys),
|
||||
MrMailbox.MR_IMEX_IMPORT_SELF_KEYS, ApplicationLoader.applicationContext.getString(R.string.ImportPrivateKeys));
|
||||
}
|
||||
else if( i == backupRow )
|
||||
{
|
||||
imexShowMenu(ApplicationLoader.applicationContext.getString(R.string.Backup), MrMailbox.MR_IMEX_EXPORT_BACKUP, 0);
|
||||
imexShowMenu(ApplicationLoader.applicationContext.getString(R.string.Backup),
|
||||
MrMailbox.MR_IMEX_EXPORT_BACKUP, ApplicationLoader.applicationContext.getString(R.string.ExportBackup),
|
||||
0, ApplicationLoader.applicationContext.getString(R.string.ImportBackup));
|
||||
}
|
||||
else if (i == textSizeRow) {
|
||||
if (getParentActivity() == null) {
|
||||
return;
|
||||
}
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
||||
builder.setTitle(ApplicationLoader.applicationContext.getString(R.string.TextSize));
|
||||
builder.setTitle(R.string.TextSize);
|
||||
final NumberPicker numberPicker = new NumberPicker(getParentActivity());
|
||||
final int MIN_VAL = 12;
|
||||
final int MAX_VAL = 30;
|
||||
@@ -250,7 +278,7 @@ public class SettingsAdvActivity extends BaseFragment implements NotificationCen
|
||||
numberPicker.setWrapSelectorWheel(false);
|
||||
numberPicker.setValue(ApplicationLoader.fontSize);
|
||||
builder.setView(numberPicker);
|
||||
builder.setPositiveButton(ApplicationLoader.applicationContext.getString(R.string.OK), new DialogInterface.OnClickListener() {
|
||||
builder.setPositiveButton(R.string.OK, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("mainconfig", Activity.MODE_PRIVATE);
|
||||
@@ -271,23 +299,76 @@ public class SettingsAdvActivity extends BaseFragment implements NotificationCen
|
||||
return fragmentView;
|
||||
}
|
||||
|
||||
private void imexShowMenu(String title, final int exportCommand, final int importCommand)
|
||||
static public File getImexDir()
|
||||
{
|
||||
// DIRECTORY_DOCUMENTS is only available since KitKat; as we also support Ice Cream Sandwich and Jellybean (2017: 11% in total), this is no option
|
||||
// moreover, DIRECTORY_DOWNLOADS is easier accessible.
|
||||
// CAVE: do not use DownloadManager to add the file as it is deleted on uninstall then ...
|
||||
File imexDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
|
||||
return imexDir;
|
||||
}
|
||||
|
||||
private void imexShowMenu(String title, final int exportCommand, final String exportMenuEntry, final int importCommand, final String importMenuEntry)
|
||||
{
|
||||
imexDir = getImexDir();
|
||||
imexDir.mkdirs();
|
||||
imexDir.setExecutable(true);
|
||||
imexDir.setReadable(true);
|
||||
imexDir.setWritable(true);
|
||||
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); // was: BottomSheet.Builder
|
||||
builder.setTitle(title);
|
||||
CharSequence[] items = new CharSequence[]{
|
||||
ApplicationLoader.applicationContext.getString(R.string.ExportToDownloads),
|
||||
ApplicationLoader.applicationContext.getString(R.string.ImportFromDownloads),
|
||||
};
|
||||
CharSequence[] items = new CharSequence[]{exportMenuEntry, importMenuEntry};
|
||||
builder.setItems(items, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
|
||||
/* when and why do we ask for a password on import/export?
|
||||
- we ask for a password on exporting private keys to prevent them from being stolen
|
||||
if the user hands out the device for a moment.
|
||||
this is important as esp. the user won't even recognise keys stolen this way.
|
||||
- we do _not_ ask for a password on import - of course, this can result in data loss, however,
|
||||
if the device is under control of an attacker he can also just delete all data.
|
||||
in difference to export, all these attacks are typically visible to the user.
|
||||
so, asking for a password here won't increase the security significally. */
|
||||
|
||||
if( i==0 ) /*export*/ {
|
||||
if (Build.VERSION.SDK_INT >= 23 && getParentActivity().checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
|
||||
getParentActivity().requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 4);
|
||||
return;
|
||||
}
|
||||
startImex(exportCommand);
|
||||
AlertDialog.Builder builderPw = new AlertDialog.Builder(getParentActivity());
|
||||
|
||||
final EditText input = new EditText(getParentActivity());
|
||||
input.setSingleLine();
|
||||
|
||||
FrameLayout container = new FrameLayout(getParentActivity());
|
||||
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
|
||||
params.leftMargin = AndroidUtilities.dp(24);
|
||||
params.rightMargin = AndroidUtilities.dp(24);
|
||||
params.topMargin = AndroidUtilities.dp(16);
|
||||
input.setLayoutParams(params);
|
||||
input.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS| InputType.TYPE_TEXT_VARIATION_PASSWORD);
|
||||
container.addView(input);
|
||||
|
||||
builderPw.setView(container);
|
||||
builderPw.setTitle(exportMenuEntry);
|
||||
String enterPwMsg = String.format(ApplicationLoader.applicationContext.getString(R.string.ImportExportExplain)+"\n\n"+ApplicationLoader.applicationContext.getString(R.string.EnterPasswordToContinue), MrMailbox.getConfig("addr", ""));
|
||||
builderPw.setMessage(enterPwMsg);
|
||||
builderPw.setNegativeButton(R.string.Cancel, null);
|
||||
builderPw.setPositiveButton(R.string.OK, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
String pw = input.getText().toString().trim();
|
||||
if( MrMailbox.checkPassword(pw)!=0 ) {
|
||||
startImex(exportCommand);
|
||||
}
|
||||
else {
|
||||
AndroidUtilities.showHint(ApplicationLoader.applicationContext, ApplicationLoader.applicationContext.getString(R.string.IncorrectPassword));
|
||||
}
|
||||
}
|
||||
});
|
||||
showDialog(builderPw.create());
|
||||
}
|
||||
else /*import*/ {
|
||||
if( importCommand ==MrMailbox.MR_IMEX_IMPORT_SELF_KEYS ) {
|
||||
@@ -295,26 +376,25 @@ public class SettingsAdvActivity extends BaseFragment implements NotificationCen
|
||||
getParentActivity().requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 4);
|
||||
return;
|
||||
}
|
||||
AlertDialog.Builder builder2 = new AlertDialog.Builder(getParentActivity());
|
||||
builder2.setPositiveButton(ApplicationLoader.applicationContext.getString(R.string.OK), new DialogInterface.OnClickListener() {
|
||||
|
||||
AlertDialog.Builder builder3 = new AlertDialog.Builder(getParentActivity());
|
||||
builder3.setTitle(importMenuEntry);
|
||||
builder3.setMessage(AndroidUtilities.replaceTags(String.format(ApplicationLoader.applicationContext.getString(R.string.ImportPrivateKeysAsk2), imexDir.getAbsolutePath())));
|
||||
builder3.setNegativeButton(R.string.Cancel, null);
|
||||
builder3.setPositiveButton(R.string.OK, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
startImex(importCommand);
|
||||
}
|
||||
});
|
||||
builder2.setNegativeButton(ApplicationLoader.applicationContext.getString(R.string.Cancel), null);
|
||||
builder2.setMessage(ApplicationLoader.applicationContext.getString(R.string.ImportPrivateKeysAsk));
|
||||
showDialog(builder2.create());
|
||||
showDialog(builder3.create());
|
||||
}
|
||||
else {
|
||||
AlertDialog.Builder builder2 = new AlertDialog.Builder(getParentActivity());
|
||||
builder2.setPositiveButton(ApplicationLoader.applicationContext.getString(R.string.OK), new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
}
|
||||
});
|
||||
builder2.setMessage(ApplicationLoader.applicationContext.getString(R.string.ImportBackupExplain));
|
||||
showDialog(builder2.create());
|
||||
AlertDialog.Builder builder3 = new AlertDialog.Builder(getParentActivity());
|
||||
builder3.setTitle(importMenuEntry);
|
||||
builder3.setPositiveButton(R.string.OK, null);
|
||||
builder3.setMessage(AndroidUtilities.replaceTags(String.format(ApplicationLoader.applicationContext.getString(R.string.ImportBackupExplain2), imexDir.getAbsolutePath())));
|
||||
showDialog(builder3.create());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -324,13 +404,14 @@ public class SettingsAdvActivity extends BaseFragment implements NotificationCen
|
||||
}
|
||||
|
||||
private ProgressDialog progressDialog = null;
|
||||
private int progressWhat = 0;
|
||||
private void startImex(int what)
|
||||
{
|
||||
if( progressDialog!=null ) {
|
||||
progressDialog.dismiss();
|
||||
progressDialog = null;
|
||||
}
|
||||
|
||||
progressWhat = what;
|
||||
progressDialog = new ProgressDialog(getParentActivity());
|
||||
progressDialog.setMessage(ApplicationLoader.applicationContext.getString(R.string.OneMoment));
|
||||
progressDialog.setCanceledOnTouchOutside(false);
|
||||
@@ -348,21 +429,28 @@ public class SettingsAdvActivity extends BaseFragment implements NotificationCen
|
||||
MrMailbox.m_lastErrorString = "";
|
||||
}
|
||||
|
||||
File downloadsDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
|
||||
downloadsDir.mkdirs();
|
||||
MrMailbox.imex(what, downloadsDir.getAbsolutePath());
|
||||
MrMailbox.imex(what, imexDir.getAbsolutePath());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void didReceivedNotification(int id, Object... args) {
|
||||
if( id==NotificationCenter.exportProgress ) {
|
||||
if( id==NotificationCenter.imexProgress ) {
|
||||
if( progressDialog!=null ) {
|
||||
// we want the spinner together with a progress info
|
||||
int percent = (Integer)args[0];
|
||||
int percent = (Integer)args[0] / 10;
|
||||
progressDialog.setMessage(ApplicationLoader.applicationContext.getString(R.string.OneMoment)+String.format(" %d%%", percent));
|
||||
}
|
||||
}
|
||||
else if( id==NotificationCenter.exportEnded ) {
|
||||
else if( id==NotificationCenter.imexFileWritten ) {
|
||||
// Force media scanner to scan the new file - otherwise, it may not be visible eg. via USB/MTP.
|
||||
// Do _not_ add the file with DownloadManager.addCompletedDownload() as the file would be deleted when the app is uninstalled. This frustrates the usecase export-uninstall-install-import.
|
||||
Intent mediaScannerIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
|
||||
File permFile = new File((String)args[0]);
|
||||
Uri fileContentUri = Uri.fromFile(permFile);
|
||||
mediaScannerIntent.setData(fileContentUri);
|
||||
getParentActivity().sendBroadcast(mediaScannerIntent);
|
||||
}
|
||||
else if( id==NotificationCenter.imexEnded ) {
|
||||
final String errorString;
|
||||
|
||||
synchronized (MrMailbox.m_lastErrorLock) {
|
||||
@@ -376,17 +464,22 @@ public class SettingsAdvActivity extends BaseFragment implements NotificationCen
|
||||
}
|
||||
|
||||
if( (int)args[0]==1 ) {
|
||||
AndroidUtilities.showDoneHint(ApplicationLoader.applicationContext);
|
||||
// success
|
||||
if( progressWhat==MrMailbox.MR_IMEX_EXPORT_SELF_KEYS || progressWhat==MrMailbox.MR_IMEX_EXPORT_BACKUP ) {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
||||
builder.setMessage(AndroidUtilities.replaceTags(String.format(ApplicationLoader.applicationContext.getString(R.string.FilesSuccessfullyExported), imexDir.getAbsoluteFile()) + "\n\n" + ApplicationLoader.applicationContext.getString(R.string.ImportExportExplain)));
|
||||
builder.setPositiveButton(R.string.OK, null);
|
||||
showDialog(builder.create());
|
||||
}
|
||||
else {
|
||||
AndroidUtilities.showDoneHint(ApplicationLoader.applicationContext);
|
||||
}
|
||||
}
|
||||
else if( !errorString.isEmpty() /*usually empty if export is cancelled by the user*/ ) {
|
||||
else if( !errorString.isEmpty() ) {
|
||||
// error (errorString is empty when the user has cancelled the export manually, don't show a message in this case)
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
||||
builder.setMessage(errorString);
|
||||
builder.setPositiveButton(ApplicationLoader.applicationContext.getString(R.string.OK), new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
;
|
||||
}
|
||||
});
|
||||
builder.setPositiveButton(R.string.OK, null);
|
||||
showDialog(builder.create());
|
||||
}
|
||||
}
|
||||
@@ -407,7 +500,7 @@ public class SettingsAdvActivity extends BaseFragment implements NotificationCen
|
||||
@Override
|
||||
public boolean isEnabled(int i) {
|
||||
int type = getItemViewType(i);
|
||||
return type!=ROWTYPE_SHADOW;
|
||||
return (type!=ROWTYPE_SHADOW && type!=ROWTYPE_HEADER);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -437,9 +530,7 @@ public class SettingsAdvActivity extends BaseFragment implements NotificationCen
|
||||
if (view == null) {
|
||||
view = new ShadowSectionCell(mContext);
|
||||
}
|
||||
if( i==finalShadowRow ) {
|
||||
view.setBackgroundResource(R.drawable.greydivider_bottom);
|
||||
}
|
||||
view.setBackgroundResource(i==backupShadowRow? R.drawable.greydivider_bottom : R.drawable.greydivider);
|
||||
} else if (type == ROWTYPE_TEXT_SETTINGS) {
|
||||
if (view == null) {
|
||||
view = new TextSettingsCell(mContext);
|
||||
@@ -490,16 +581,28 @@ public class SettingsAdvActivity extends BaseFragment implements NotificationCen
|
||||
}
|
||||
else if( i == e2eEncryptionRow ) {
|
||||
textCell.setTextAndCheck(mContext.getString(R.string.PreferE2EEncryption),
|
||||
MrMailbox.getConfigInt("e2ee_enabled", MR_E2EE_DEFAULT_ENABLED)!=0, true);
|
||||
MrMailbox.getConfigInt("e2ee_enabled", MR_E2EE_DEFAULT_ENABLED)!=0, false);
|
||||
}
|
||||
}
|
||||
else if (type == ROWTYPE_HEADER) {
|
||||
if (view == null) {
|
||||
view = new HeaderCell(mContext);
|
||||
view.setBackgroundColor(0xffffffff);
|
||||
}
|
||||
if (i == imexHeaderRow) {
|
||||
((HeaderCell) view).setText(mContext.getString(R.string.ExportImportHeader));
|
||||
}
|
||||
}
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getItemViewType(int i) {
|
||||
if (i == finalShadowRow ) {
|
||||
if (i== settingsShadowRow || i==backupShadowRow ) {
|
||||
return ROWTYPE_SHADOW;
|
||||
} else if( i==imexHeaderRow ) {
|
||||
return ROWTYPE_HEADER;
|
||||
} else if ( i == sendByEnterRow || i == raiseToSpeakRow || i == autoplayGifsRow || i==showUnknownSendersRow || i == directShareRow || i==e2eEncryptionRow) {
|
||||
return ROWTYPE_CHECK;
|
||||
} else {
|
||||
|
||||
@@ -148,11 +148,7 @@ public class SettingsNameActivity extends BaseFragment {
|
||||
}
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
||||
builder.setMessage(execute_result);
|
||||
builder.setPositiveButton(ApplicationLoader.applicationContext.getString(R.string.OK), new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
}
|
||||
});
|
||||
builder.setPositiveButton(R.string.OK, null);
|
||||
showDialog(builder.create());
|
||||
return;
|
||||
}
|
||||
@@ -261,7 +257,6 @@ public class SettingsNameActivity extends BaseFragment {
|
||||
((TextInfoCell) view).setText(mContext.getString(R.string.MyStatusExplain));
|
||||
view.setBackgroundResource(R.drawable.greydivider_bottom);
|
||||
}
|
||||
|
||||
}
|
||||
return view;
|
||||
}
|
||||
|
||||
@@ -228,8 +228,8 @@ public class SettingsNotificationsActivity extends BaseFragment implements Notif
|
||||
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
||||
builder.setMessage(context.getString(R.string.AskResetNotifications));
|
||||
builder.setNegativeButton(context.getString(R.string.Cancel), null);
|
||||
builder.setPositiveButton(context.getString(R.string.OK), new DialogInterface.OnClickListener() {
|
||||
builder.setNegativeButton(R.string.Cancel, null);
|
||||
builder.setPositiveButton(R.string.OK, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE);
|
||||
@@ -284,9 +284,9 @@ public class SettingsNotificationsActivity extends BaseFragment implements Notif
|
||||
colorPickerView.setColor(preferences.getInt(i == messageLedRow? "MessagesLed" : "GroupLed", NotificationsController.DEF_LED_COLOR));
|
||||
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
||||
builder.setTitle(context.getString(R.string.LedColor));
|
||||
builder.setTitle(R.string.LedColor);
|
||||
builder.setView(linearLayout);
|
||||
builder.setPositiveButton(context.getString(R.string.Set), new DialogInterface.OnClickListener() {
|
||||
builder.setPositiveButton(R.string.Set, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int which) {
|
||||
final SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE);
|
||||
@@ -300,7 +300,7 @@ public class SettingsNotificationsActivity extends BaseFragment implements Notif
|
||||
listView.invalidateViews();
|
||||
}
|
||||
});
|
||||
builder.setNeutralButton(context.getString(R.string.Disabled), new DialogInterface.OnClickListener() {
|
||||
builder.setNeutralButton(R.string.Disabled, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
final SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE);
|
||||
@@ -314,7 +314,7 @@ public class SettingsNotificationsActivity extends BaseFragment implements Notif
|
||||
listView.invalidateViews();
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(context.getString(R.string.Default), new DialogInterface.OnClickListener() {
|
||||
builder.setNegativeButton(R.string.Default, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
final SharedPreferences preferences = ApplicationLoader.applicationContext.getSharedPreferences("Notifications", Activity.MODE_PRIVATE);
|
||||
@@ -331,7 +331,7 @@ public class SettingsNotificationsActivity extends BaseFragment implements Notif
|
||||
showDialog(builder.create());
|
||||
} else if (i == messageVibrateRow || i == groupVibrateRow) {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
||||
builder.setTitle(context.getString(R.string.Vibrate));
|
||||
builder.setTitle(R.string.Vibrate);
|
||||
builder.setItems(new CharSequence[]{
|
||||
context.getString(R.string.Disabled),
|
||||
context.getString(R.string.Default),
|
||||
@@ -364,11 +364,11 @@ public class SettingsNotificationsActivity extends BaseFragment implements Notif
|
||||
}
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(context.getString(R.string.Cancel), null);
|
||||
builder.setNegativeButton(R.string.Cancel, null);
|
||||
showDialog(builder.create());
|
||||
} else if (i == messagePriorityRow || i == groupPriorityRow || i == inappPriorityRow ) {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
||||
builder.setTitle(context.getString(R.string.NotificationsPriority));
|
||||
builder.setTitle(R.string.NotificationsPriority);
|
||||
builder.setItems(new CharSequence[]{
|
||||
context.getString(R.string.NotificationsPriorityDefault),
|
||||
context.getString(R.string.NotificationsPriorityHigh),
|
||||
@@ -389,11 +389,11 @@ public class SettingsNotificationsActivity extends BaseFragment implements Notif
|
||||
}
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(context.getString(R.string.Cancel), null);
|
||||
builder.setNegativeButton(R.string.Cancel, null);
|
||||
showDialog(builder.create());
|
||||
} else if (i == repeatRow) {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
|
||||
builder.setTitle(context.getString(R.string.RepeatNotifications));
|
||||
builder.setTitle(R.string.RepeatNotifications);
|
||||
builder.setItems(new CharSequence[]{
|
||||
context.getString(R.string.Disabled),
|
||||
context.getResources().getQuantityString(R.plurals.Minutes, 5, 5),
|
||||
@@ -426,7 +426,7 @@ public class SettingsNotificationsActivity extends BaseFragment implements Notif
|
||||
}
|
||||
}
|
||||
});
|
||||
builder.setNegativeButton(context.getString(R.string.Cancel), null);
|
||||
builder.setNegativeButton(R.string.Cancel, null);
|
||||
showDialog(builder.create());
|
||||
}
|
||||
if (view instanceof TextCheckCell) {
|
||||
|
||||
@@ -0,0 +1,390 @@
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Delta Chat Android
|
||||
* (C) 2017 Björn Petersen
|
||||
* Contact: r10s@b44t.com, http://b44t.com
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it under
|
||||
* the terms of the GNU General Public License as published by the Free Software
|
||||
* Foundation, either version 3 of the License, or (at your option) any later
|
||||
* version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||
* details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see http://www.gnu.org/licenses/ .
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
package com.b44t.ui;
|
||||
|
||||
import android.Manifest;
|
||||
import android.app.Activity;
|
||||
import android.app.AlertDialog;
|
||||
import android.app.ProgressDialog;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.ActivityInfo;
|
||||
import android.content.pm.PackageInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.Environment;
|
||||
import android.os.PowerManager;
|
||||
import android.support.v4.view.PagerAdapter;
|
||||
import android.support.v4.view.ViewPager;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.Window;
|
||||
import android.widget.Button;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.b44t.messenger.AndroidUtilities;
|
||||
import com.b44t.messenger.ApplicationLoader;
|
||||
import com.b44t.messenger.BuildConfig;
|
||||
import com.b44t.messenger.LocaleController;
|
||||
import com.b44t.messenger.MrMailbox;
|
||||
import com.b44t.messenger.NotificationCenter;
|
||||
import com.b44t.messenger.R;
|
||||
import com.b44t.ui.ActionBar.Theme;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import static java.lang.Math.min;
|
||||
|
||||
public class WelcomeActivity extends Activity implements NotificationCenter.NotificationCenterDelegate {
|
||||
|
||||
private boolean isAbout = false;
|
||||
private final static int NUM_PAGES = 7;
|
||||
private final static int REQ_PERMISSION_CODE = 42;
|
||||
|
||||
private static final String TAG = "WelcomeActivity";
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
setTheme(R.style.Theme_MessengerProj);
|
||||
super.onCreate(savedInstanceState);
|
||||
Theme.loadRecources(this);
|
||||
requestWindowFeature(Window.FEATURE_NO_TITLE);
|
||||
|
||||
NotificationCenter.getInstance().addObserver(this, NotificationCenter.imexProgress);
|
||||
NotificationCenter.getInstance().addObserver(this, NotificationCenter.imexEnded);
|
||||
NotificationCenter.getInstance().addObserver(this, NotificationCenter.configureEnded);
|
||||
|
||||
Bundle extras = getIntent().getExtras();
|
||||
if( extras != null && extras.getBoolean("com.b44t.ui.IntroActivity.isAbout") ) {
|
||||
isAbout = true;
|
||||
}
|
||||
|
||||
float heightOnLandscape = min(AndroidUtilities.displaySize.x,AndroidUtilities.displaySize.y)/AndroidUtilities.density;
|
||||
if( heightOnLandscape < 450 ) {
|
||||
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
|
||||
}
|
||||
|
||||
setContentView(R.layout.welcome_layout);
|
||||
|
||||
ViewPager viewPager = (ViewPager) findViewById(R.id.welcome_pager);
|
||||
Button primaryButton = (Button) findViewById(R.id.welcome_primary_button);
|
||||
TextView secondaryButton = (TextView) findViewById(R.id.welcome_secondary_button);
|
||||
|
||||
if( isAbout ) {
|
||||
primaryButton.setText(ApplicationLoader.applicationContext.getString(R.string.OK));
|
||||
primaryButton.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
finish();
|
||||
}
|
||||
});
|
||||
|
||||
secondaryButton.setText("v" + getVersion() + " | " + ApplicationLoader.applicationContext.getString(R.string.Info));
|
||||
secondaryButton.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
new AlertDialog.Builder(WelcomeActivity.this)
|
||||
.setTitle(ApplicationLoader.applicationContext.getString(R.string.AppName) + " v" + getVersion())
|
||||
.setMessage("© 2017 Delta Chat contributors" + "\n\n" + MrMailbox.getInfo() + "\n\n" + getAndroidInfo())
|
||||
.setPositiveButton(R.string.OK, null)
|
||||
.show();
|
||||
}
|
||||
});
|
||||
}
|
||||
else {
|
||||
primaryButton.setText(ApplicationLoader.applicationContext.getString(R.string.IntroStartMessaging));
|
||||
primaryButton.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
Intent intent2 = new Intent(WelcomeActivity.this, LaunchActivity.class);
|
||||
intent2.putExtra("fromIntro", true);
|
||||
startActivity(intent2);
|
||||
}
|
||||
});
|
||||
|
||||
secondaryButton.setText(ApplicationLoader.applicationContext.getString(R.string.ImportBackup));
|
||||
secondaryButton.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
if (Build.VERSION.SDK_INT >= 23 && checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
|
||||
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQ_PERMISSION_CODE);
|
||||
return;
|
||||
}
|
||||
tryToStartImport();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
viewPager.setAdapter(new IntroAdapter());
|
||||
viewPager.setPageMargin(0);
|
||||
viewPager.setCurrentItem(LocaleController.isRTL? NUM_PAGES-1 : 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.imexProgress);
|
||||
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.imexEnded);
|
||||
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.configureEnded);
|
||||
}
|
||||
|
||||
private class IntroAdapter extends PagerAdapter {
|
||||
@Override
|
||||
public int getCount() {
|
||||
return NUM_PAGES;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object instantiateItem(ViewGroup container, int position) {
|
||||
View view = View.inflate(container.getContext(), R.layout.welcome_page_layout, null);
|
||||
ImageView imgView = (ImageView)view.findViewById(R.id.welcome_img);
|
||||
TextView titleView = (TextView) view.findViewById(R.id.welcome_title);
|
||||
TextView msgView = (TextView) view.findViewById(R.id.welcome_msg);
|
||||
container.addView(view, 0);
|
||||
|
||||
int icons[] = new int[]{R.drawable.intro1, R.drawable.intro2, R.drawable.intro3, R.drawable.intro4, R.drawable.intro5, R.drawable.intro6, R.drawable.intro7 };
|
||||
int titles[] = new int[]{ R.string.Intro1Headline, R.string.Intro2Headline, R.string.Intro3Headline, R.string.Intro4Headline, R.string.Intro5Headline, R.string.Intro6Headline, R.string.Intro7Headline };
|
||||
int messages[] = new int[]{ R.string.Intro1Message, R.string.Intro2Message, R.string.Intro3Message,R.string.Intro4Message, R.string.Intro5Message, R.string.Intro6Message, R.string.Intro7Message };
|
||||
|
||||
if( LocaleController.isRTL ) {
|
||||
position = NUM_PAGES-1-position;
|
||||
}
|
||||
|
||||
imgView.setImageResource(icons[position]);
|
||||
titleView.setText(getString(titles[position]));
|
||||
msgView.setText(AndroidUtilities.replaceTags(getString(messages[position])));
|
||||
|
||||
return view;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setPrimaryItem(ViewGroup container, int position, Object object) {
|
||||
super.setPrimaryItem(container, position, object);
|
||||
ViewGroup bottomPages = (ViewGroup) findViewById(R.id.bottom_pages);
|
||||
int count = bottomPages.getChildCount();
|
||||
for (int a = 0; a < count; a++) {
|
||||
View child = bottomPages.getChildAt(a);
|
||||
if (a == position) {
|
||||
child.setBackgroundColor(0xff2ca5e0);
|
||||
} else {
|
||||
child.setBackgroundColor(0xffcccccc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isViewFromObject(View view, Object object) {
|
||||
return view.equals(object);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void destroyItem(ViewGroup container, int position, Object object) {
|
||||
container.removeView((View) object);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Specials for the use as the about-screen
|
||||
**********************************************************************************************/
|
||||
|
||||
public static String getVersion()
|
||||
{
|
||||
try {
|
||||
PackageInfo pInfo = ApplicationLoader.applicationContext.getPackageManager().getPackageInfo(ApplicationLoader.applicationContext.getPackageName(), 0);
|
||||
return pInfo.versionName;
|
||||
}
|
||||
catch(Exception e) {
|
||||
return "ErrVersion";
|
||||
}
|
||||
}
|
||||
|
||||
private String getAndroidInfo()
|
||||
{
|
||||
String abi = "ErrAbi";
|
||||
int versionCode = 0, ignoreBatteryOptimizations = -1;
|
||||
try {
|
||||
PackageInfo pInfo = ApplicationLoader.applicationContext.getPackageManager().getPackageInfo(ApplicationLoader.applicationContext.getPackageName(), 0);
|
||||
versionCode = pInfo.versionCode;
|
||||
switch (versionCode % 10) {
|
||||
case 0:
|
||||
abi = "arm";
|
||||
break;
|
||||
case 1:
|
||||
abi = "arm-v7a";
|
||||
break;
|
||||
case 2:
|
||||
abi = "x86";
|
||||
break;
|
||||
case 3:
|
||||
abi = "universal";
|
||||
break;
|
||||
}
|
||||
if( Build.VERSION.SDK_INT >= 23 ) {
|
||||
PowerManager pm = (PowerManager) ApplicationLoader.applicationContext.getSystemService(Context.POWER_SERVICE);
|
||||
ignoreBatteryOptimizations = pm.isIgnoringBatteryOptimizations(ApplicationLoader.applicationContext.getPackageName())? 1 : 0;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Cannot get package info.", e);
|
||||
}
|
||||
|
||||
return "SDK_INT=" + Build.VERSION.SDK_INT
|
||||
+ "\nMANUFACTURER=" + Build.MANUFACTURER
|
||||
+ "\nMODEL=" + Build.MODEL
|
||||
+ "\nAPPLICATION_ID=" + BuildConfig.APPLICATION_ID
|
||||
+ "\nBUILD_TYPE=" + BuildConfig.BUILD_TYPE
|
||||
+ "\nABI=" + abi // ABI = Application Binary Interface
|
||||
+ "\nignoreBatteryOptimizations=" + ignoreBatteryOptimizations
|
||||
+ "\nversionCode=" + versionCode;
|
||||
}
|
||||
|
||||
|
||||
/* Specials for importing and configuration
|
||||
**********************************************************************************************/
|
||||
|
||||
@Override
|
||||
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
|
||||
super.onRequestPermissionsResult(requestCode, permissions, grantResults); // this may forward the notification to fragments
|
||||
if (requestCode == REQ_PERMISSION_CODE
|
||||
&& grantResults.length > 0
|
||||
&& grantResults[0]==PackageManager.PERMISSION_GRANTED ) {
|
||||
tryToStartImport();
|
||||
}
|
||||
else {
|
||||
new AlertDialog.Builder(this)
|
||||
.setMessage(ApplicationLoader.applicationContext.getString(R.string.PermissionStorage))
|
||||
.setPositiveButton(R.string.PermissionOpenSettings, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
try {
|
||||
// the settings button is needed as the user may have selected "do not ask again" and
|
||||
// may get in trouble to activate the feature otherwise ...
|
||||
Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
|
||||
intent.setData(Uri.parse("package:" + ApplicationLoader.applicationContext.getPackageName()));
|
||||
startActivity(intent);
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "Cannot open app settings.", e);
|
||||
}
|
||||
}
|
||||
})
|
||||
.setNegativeButton(R.string.Cancel, null)
|
||||
.show();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void tryToStartImport() {
|
||||
File imexDir = SettingsAdvActivity.getImexDir();
|
||||
final String backupFile = MrMailbox.imexHasBackup(imexDir.getAbsolutePath());
|
||||
if (backupFile != null) {
|
||||
new AlertDialog.Builder(this)
|
||||
.setTitle(R.string.ImportBackup)
|
||||
.setMessage(AndroidUtilities.replaceTags(String.format(ApplicationLoader.applicationContext.getString(R.string.ImportBackupAsk), backupFile)))
|
||||
.setNegativeButton(R.string.Cancel, null)
|
||||
.setPositiveButton(R.string.OK, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialogInterface, int i) {
|
||||
startImport(backupFile);
|
||||
}
|
||||
})
|
||||
.show();
|
||||
}
|
||||
else {
|
||||
new AlertDialog.Builder(this)
|
||||
.setTitle(R.string.ImportBackup)
|
||||
.setMessage(AndroidUtilities.replaceTags(String.format(ApplicationLoader.applicationContext.getString(R.string.NoBackupFound), imexDir.getAbsolutePath())))
|
||||
.setPositiveButton(R.string.OK, null)
|
||||
.show();
|
||||
}
|
||||
}
|
||||
|
||||
private ProgressDialog progressDialog = null;
|
||||
private void startImport(String backupFile)
|
||||
{
|
||||
if( progressDialog!=null ) {
|
||||
progressDialog.dismiss();
|
||||
progressDialog = null;
|
||||
}
|
||||
|
||||
progressDialog = new ProgressDialog(this);
|
||||
progressDialog.setMessage(ApplicationLoader.applicationContext.getString(R.string.OneMoment));
|
||||
progressDialog.setCanceledOnTouchOutside(false);
|
||||
progressDialog.setCancelable(false);
|
||||
progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, ApplicationLoader.applicationContext.getString(R.string.Cancel), new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
MrMailbox.imex(0, null);
|
||||
}
|
||||
});
|
||||
progressDialog.show();
|
||||
|
||||
synchronized (MrMailbox.m_lastErrorLock) {
|
||||
MrMailbox.m_showNextErrorAsToast = false;
|
||||
MrMailbox.m_lastErrorString = "";
|
||||
}
|
||||
|
||||
MrMailbox.imex(MrMailbox.MR_IMEX_IMPORT_BACKUP, backupFile);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void didReceivedNotification(int id, Object... args) {
|
||||
if (id == NotificationCenter.imexProgress) {
|
||||
// we want the spinner together with a progress info
|
||||
int percent = (Integer)args[0] / 10;
|
||||
progressDialog.setMessage(ApplicationLoader.applicationContext.getString(R.string.OneMoment)+String.format(" %d%%", percent));
|
||||
} else if (id == NotificationCenter.imexEnded) {
|
||||
|
||||
final String errorString;
|
||||
|
||||
synchronized (MrMailbox.m_lastErrorLock) {
|
||||
MrMailbox.m_showNextErrorAsToast = true;
|
||||
errorString = MrMailbox.m_lastErrorString;
|
||||
}
|
||||
|
||||
if( progressDialog!=null ) {
|
||||
progressDialog.dismiss();
|
||||
progressDialog = null;
|
||||
}
|
||||
|
||||
if( (int)args[0]==1 ) {
|
||||
startActivity(new Intent(WelcomeActivity.this, LaunchActivity.class));
|
||||
finish();
|
||||
}
|
||||
else if( !errorString.isEmpty() /*usually empty if export is cancelled by the user*/ ) {
|
||||
new AlertDialog.Builder(this)
|
||||
.setTitle(R.string.ImportBackup)
|
||||
.setMessage(errorString)
|
||||
.setPositiveButton(R.string.OK, null)
|
||||
.show();
|
||||
}
|
||||
}
|
||||
else if(id == NotificationCenter.configureEnded ) {
|
||||
// no need to start a new activitiy, this is done in SettingsAccountActivity(), just close self
|
||||
finish();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<alpha android:fromAlpha="0.0"
|
||||
android:toAlpha="1.0"
|
||||
android:duration="200"
|
||||
android:interpolator="@android:anim/accelerate_decelerate_interpolator"/>
|
||||
</set>
|
||||
@@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<alpha android:fromAlpha="1.0"
|
||||
android:toAlpha="0.0"
|
||||
android:duration="200"
|
||||
android:interpolator="@android:anim/accelerate_decelerate_interpolator"/>
|
||||
</set>
|
||||
@@ -1,141 +0,0 @@
|
||||
<ScrollView
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_width="match_parent"
|
||||
android:fillViewport="true">
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="#fafafa">
|
||||
|
||||
<FrameLayout
|
||||
android:layout_gravity="top"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="88dp">
|
||||
|
||||
<ImageView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/icon_image1"
|
||||
android:src="@drawable/intro1"/>
|
||||
|
||||
<ImageView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_gravity="center"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/icon_image2"/>
|
||||
|
||||
</FrameLayout>
|
||||
|
||||
<android.support.v4.view.ViewPager
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:id="@+id/intro_view_pager"/>
|
||||
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/bottom_pages"
|
||||
android:orientation="horizontal"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginTop="336dp">
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="7dp"
|
||||
android:layout_height="7dp"
|
||||
android:background="#bbbbbb"/>
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="7dp"
|
||||
android:layout_height="7dp"
|
||||
android:background="#bbbbbb"
|
||||
android:layout_marginLeft="8dp"
|
||||
android:layout_marginStart="8dp"/>
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="7dp"
|
||||
android:layout_height="7dp"
|
||||
android:background="#bbbbbb"
|
||||
android:layout_marginLeft="8dp"
|
||||
android:layout_marginStart="8dp"/>
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="7dp"
|
||||
android:layout_height="7dp"
|
||||
android:background="#bbbbbb"
|
||||
android:layout_marginLeft="8dp"
|
||||
android:layout_marginStart="8dp"/>
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="7dp"
|
||||
android:layout_height="7dp"
|
||||
android:background="#bbbbbb"
|
||||
android:layout_marginLeft="8dp"
|
||||
android:layout_marginStart="8dp"/>
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="7dp"
|
||||
android:layout_height="7dp"
|
||||
android:background="#bbbbbb"
|
||||
android:layout_marginLeft="8dp"
|
||||
android:layout_marginStart="8dp"/>
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="7dp"
|
||||
android:layout_height="7dp"
|
||||
android:background="#bbbbbb"
|
||||
android:layout_marginLeft="8dp"
|
||||
android:layout_marginStart="8dp"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/button_area"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginTop="380dp"
|
||||
android:gravity="center"
|
||||
android:orientation="horizontal"
|
||||
style="?android:attr/buttonBarStyle">
|
||||
|
||||
<Button
|
||||
android:id="@+id/details_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginLeft="10dp"
|
||||
android:layout_marginRight="10dp"
|
||||
android:layout_marginStart="10dp"
|
||||
android:layout_marginEnd="10dp"
|
||||
android:background="#bbbbbb"
|
||||
android:paddingLeft="16dp"
|
||||
android:paddingRight="16dp"
|
||||
android:textColor="#ffffff"
|
||||
style="?android:attr/buttonBarButtonStyle" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/start_messaging_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginLeft="10dp"
|
||||
android:layout_marginRight="10dp"
|
||||
android:layout_marginStart="10dp"
|
||||
android:layout_marginEnd="10dp"
|
||||
android:background="#2ca5e0"
|
||||
android:paddingLeft="16dp"
|
||||
android:paddingRight="16dp"
|
||||
android:textColor="#ffffff"
|
||||
style="?android:attr/buttonBarButtonStyle" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
|
||||
</FrameLayout>
|
||||
|
||||
</ScrollView>
|
||||
@@ -0,0 +1,106 @@
|
||||
<ScrollView
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_width="match_parent"
|
||||
android:fillViewport="true">
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="#fafafa">
|
||||
|
||||
<android.support.v4.view.ViewPager
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:id="@+id/welcome_pager"/>
|
||||
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/bottom_pages"
|
||||
android:orientation="horizontal"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginTop="336dp">
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="8dp"
|
||||
android:layout_height="8dp"
|
||||
android:background="#cccccc"/>
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="8dp"
|
||||
android:layout_height="8dp"
|
||||
android:background="#cccccc"
|
||||
android:layout_marginLeft="8dp"
|
||||
android:layout_marginStart="8dp"/>
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="8dp"
|
||||
android:layout_height="8dp"
|
||||
android:background="#cccccc"
|
||||
android:layout_marginLeft="8dp"
|
||||
android:layout_marginStart="8dp"/>
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="8dp"
|
||||
android:layout_height="8dp"
|
||||
android:background="#cccccc"
|
||||
android:layout_marginLeft="8dp"
|
||||
android:layout_marginStart="8dp"/>
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="8dp"
|
||||
android:layout_height="8dp"
|
||||
android:background="#cccccc"
|
||||
android:layout_marginLeft="8dp"
|
||||
android:layout_marginStart="8dp"/>
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="8dp"
|
||||
android:layout_height="8dp"
|
||||
android:background="#cccccc"
|
||||
android:layout_marginLeft="8dp"
|
||||
android:layout_marginStart="8dp"/>
|
||||
|
||||
<FrameLayout
|
||||
android:layout_width="8dp"
|
||||
android:layout_height="8dp"
|
||||
android:background="#cccccc"
|
||||
android:layout_marginLeft="8dp"
|
||||
android:layout_marginStart="8dp"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<Button android:id="@+id/welcome_primary_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal"
|
||||
android:layout_marginStart="10dp"
|
||||
android:layout_marginEnd="10dp"
|
||||
android:layout_marginTop="380dp"
|
||||
android:paddingLeft="16dp"
|
||||
android:paddingRight="16dp"
|
||||
android:textColor="#ffffff"
|
||||
android:gravity="center"
|
||||
android:background="#2ca5e0"
|
||||
style="?android:attr/buttonBarButtonStyle" />
|
||||
|
||||
<TextView android:id="@+id/welcome_secondary_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_horizontal|bottom"
|
||||
android:layout_marginStart="10dp"
|
||||
android:layout_marginEnd="10dp"
|
||||
android:layout_marginTop="420dp"
|
||||
android:paddingLeft="16dp"
|
||||
android:paddingRight="16dp"
|
||||
android:paddingTop="16dp"
|
||||
android:paddingBottom="24dp"
|
||||
android:textColor="#808080"
|
||||
android:gravity="center"
|
||||
android:textSize="15sp" />
|
||||
|
||||
</FrameLayout>
|
||||
|
||||
</ScrollView>
|
||||
+10
-2
@@ -3,9 +3,17 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<ImageView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_gravity="top|center_horizontal"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="90dp"
|
||||
android:id="@+id/welcome_img"
|
||||
android:src="@drawable/intro1"/>
|
||||
|
||||
<TextView android:layout_height="wrap_content"
|
||||
android:layout_width="match_parent"
|
||||
android:id="@+id/header_text"
|
||||
android:id="@+id/welcome_title"
|
||||
android:textSize="26sp"
|
||||
android:gravity="center"
|
||||
android:layout_gravity="top|start"
|
||||
@@ -18,7 +26,7 @@
|
||||
|
||||
<TextView android:layout_height="wrap_content"
|
||||
android:layout_width="match_parent"
|
||||
android:id="@+id/message_text"
|
||||
android:id="@+id/welcome_msg"
|
||||
android:textSize="15sp"
|
||||
android:gravity="center"
|
||||
android:layout_gravity="top|start"
|
||||
@@ -219,8 +219,8 @@
|
||||
<string name="Intro4Headline">Leistungsstark</string>
|
||||
<string name="Intro4Message"><![CDATA[<b>Unbegrenzte</b>]]> Chats, Bilder, Videos, Sprachnachrichten und mehr. Multi-Client-fähig.</string>
|
||||
|
||||
<string name="Intro5Headline">Kostenlos</string>
|
||||
<string name="Intro5Message"><![CDATA[<b>Delta Chat</b>]]> ist für immer kostenlos.<![CDATA[<br/>]]>OpenSource. Keine Werbung. Kein Abo. Kein Lock-In.</string>
|
||||
<string name="Intro5Headline">Frei</string>
|
||||
<string name="Intro5Message"><![CDATA[<b>Delta Chat</b>]]> ist für immer kostenlos.<![CDATA[<br/>]]>OpenSource. Keine Werbung. Kein Abo.</string>
|
||||
|
||||
<string name="Intro6Headline">Sicher</string>
|
||||
<string name="Intro6Message"><![CDATA[<b>Verschlüsselung</b>]]> mit allen gängigen Verfahren. Die Nachrichten bleiben auf Ihren Servern.</string>
|
||||
@@ -323,7 +323,7 @@
|
||||
<string name="AskStartChatWith">Chat mit <![CDATA[<b>]]>%1$s<![CDATA[</b>]]> starten?</string>
|
||||
<string name="DeaddropHint">Ein Klick auf die Antwort-Pfeile startet einen Chat.</string>
|
||||
<string name="NotYetImplemented">Diese Funktion ist nicht oder nur unvollständig eingebaut.</string>
|
||||
<string name="DefaultStatusText">Mit meinem Delta Chat Messenger gesendet.</string>
|
||||
<string name="DefaultStatusText">Mit meinem Delta Chat Messenger gesendet: https://delta.chat</string>
|
||||
<string name="Name" >Name</string>
|
||||
<string name="EmailAddress">E-Mail-Adresse</string>
|
||||
<string name="CannotDeleteContact">Der Kontakt kann nicht gelöscht werden, da er verwendet wird; er kann aber blockiert werden.</string>
|
||||
@@ -370,9 +370,6 @@
|
||||
<string name="AutoplayGifs">GIFs automatisch abspielen</string>
|
||||
<string name="HelpUrl">https://delta.chat/de/help</string>
|
||||
<string name="EncryptedMessage">Verschlüsselte Nachricht</string>
|
||||
<string name="ImportFromDownloads">Aus \"Downloads\" importieren</string>
|
||||
<string name="ExportToDownloads">Nach \"Downloads\" exportieren</string>
|
||||
<string name="ImportPrivateKeysAsk">Private Schlüssel aus \"Downloads\" importieren?\n\n• Bereits vorhandene private Schlüssel bleiben erhalten\n\n• Der zuletzt importierte private Schlüssel wird der Standardschlüssel\n\nFortfahren?</string>
|
||||
<string name="Encryption">Verschlüsselung</string>
|
||||
<string name="EncrinfoE2E">Ende-zu-Ende-Verschlüsselung ist aktiv.</string>
|
||||
<string name="EncrinfoE2EExplain">Wenn die angezeigten Fingerabdrücke auf dem anderen Gerät genauso angezeigt werden, ist die Verbindung sicher.</string>
|
||||
@@ -381,7 +378,6 @@
|
||||
<string name="EncrinfoNoE2EExplain">Die Ende-zu-Ende-Verschlüsselung wird automatisch aktiviert, sobald der Kontakt Delta Chat oder eine andere Autocrypt-kompatible App verwendet.</string>
|
||||
<string name="EncrinfoFingerprints">Fingerabdrücke</string>
|
||||
<string name="Backup">Backup</string>
|
||||
<string name="ImportBackupExplain">Um ein Backup zu importieren, kopieren Sie es auf dem Zielgerät in das \"Downloads\"-Verzeichnis und installieren die App neu.</string>
|
||||
<string name="ReadReceiptMailBody">Dies ist eine Empfangsbestätigung für die Nachricht \"%1$s\".\n\nDiese Empfangsbestätigung sagt nur aus, dass die Nachricht am Gerät des Empfängers angezeigt wurde. Es gibt keine Garantie, dass der Empfänger die Nachricht gelesen hat.</string>
|
||||
<string name="ReadReceipt">Empfangsbestätigung</string>
|
||||
<string name="NameAndStatus">Name und Status</string>
|
||||
@@ -389,4 +385,10 @@
|
||||
<string name="MyStatusExplain">Der Status wird im Profil und in der E-Mail-Fußzeile angezeigt</string>
|
||||
<string name="MsgGroupImageDeleted">Gruppenbild gelöscht.</string>
|
||||
<string name="AskDeleteGroupImage">Soll das Gruppenbild für alle Gruppenmitglieder gelöscht werden?</string>
|
||||
</resources>
|
||||
<string name="ExportImportHeader">Export und Import</string>
|
||||
<string name="IncorrectPassword">Falsches Passwort.</string>
|
||||
<string name="ImportBackup">Backup importieren</string>
|
||||
<string name="ExportBackup">Backup exportieren</string>
|
||||
<string name="ExportPrivateKeys">Private Schlüssel exportieren</string>
|
||||
<string name="ImportPrivateKeys">Private Schlüssel importieren</string>
|
||||
</resources>
|
||||
|
||||
@@ -13,13 +13,14 @@
|
||||
<string name="SelectChat">Selectionner la conversation…</string>
|
||||
<string name="Search">Rechercher</string>
|
||||
<string name="MuteNotifications">Désactiver les notifications</string>
|
||||
<string name="MuteFor">Silencieux pendant %1$s</string>
|
||||
<string name="UnmuteNotifications">Activer les notifications</string>
|
||||
<string name="Draft">Brouillons</string>
|
||||
<!--audio view-->
|
||||
<string name="NoAudio">Veuillez ajouter des fichiers dans votre bibliotèque musicale pour les voir ici.</string>
|
||||
<string name="AttachMusic">Musique</string>
|
||||
<!--documents view-->
|
||||
<string name="SelectFile">Selectionner le fichier</string>
|
||||
<string name="SelectFile">Sélectionner le fichier</string>
|
||||
<string name="FreeOfTotal">Libre %1$s sur %2$s</string>
|
||||
<string name="ErrorHint">Erreur inconnue</string>
|
||||
<string name="AccessError">Erreur d\'accès</string>
|
||||
@@ -28,7 +29,7 @@
|
||||
<string name="UsbActive">Transfert USB en cours</string>
|
||||
<string name="InternalStorage">Stockage interne</string>
|
||||
<string name="ExternalStorage">Stockage externe</string>
|
||||
<string name="SystemRoot">Racine</string>
|
||||
<string name="SystemRoot">Racine système</string>
|
||||
<string name="SdCard">Carte SD</string>
|
||||
<string name="Folder">Dossier</string>
|
||||
<string name="GalleryInfo">Pour envoyer des images sans compression</string>
|
||||
@@ -41,8 +42,8 @@
|
||||
<string name="NoRecent">Pas de récents</string>
|
||||
<string name="TypeMessage">Message</string>
|
||||
<string name="SlideToCancel">GLISSER POUR ANNULER</string>
|
||||
<string name="SaveToDownloads">Enregistrer dans les téléchargements</string>
|
||||
<string name="SaveToMusic">Enregistrer dans les musiques</string>
|
||||
<string name="SaveToDownloads">Enregistrer dans Téléchargements</string>
|
||||
<string name="SaveToMusic">Enregistrer dans Musique</string>
|
||||
<string name="Share">Partager</string>
|
||||
<string name="SendItems">Envoyer %1$s</string>
|
||||
<string name="ClearRecentEmoji">Vider les emojis récents ?</string>
|
||||
@@ -53,7 +54,7 @@
|
||||
<string name="ReplyToGroup">Répondre à %1$s</string>
|
||||
<string name="ReplyToContact">Répondre à %1$s</string>
|
||||
<!--contacts view-->
|
||||
<string name="NoContacts">Aucun utilisateur pour le moment.</string>
|
||||
<string name="NoContacts">Aucun contact pour le moment.</string>
|
||||
<!--group create view-->
|
||||
<string name="SendMessageTo">Envoyer un message à…</string>
|
||||
<string name="EnterGroupNamePlaceholder">Saisissez le nom du groupe</string>
|
||||
@@ -62,7 +63,7 @@
|
||||
<string name="Notifications">Notifications</string>
|
||||
<string name="RemoveMember">Supprimer un membre</string>
|
||||
<!--contact info view-->
|
||||
<string name="NewContactTitle">Nouvel utilisateur</string>
|
||||
<string name="NewContactTitle">Nouveau contact</string>
|
||||
<string name="BlockContact">Bloquer le contact</string>
|
||||
<string name="DeleteContact">Supprimer le contact</string>
|
||||
<string name="Info">Info</string>
|
||||
@@ -72,7 +73,7 @@
|
||||
<string name="NoBlocked">Aucun contact bloqué</string>
|
||||
<string name="DefaultForNormalMessages">Messages normaux</string>
|
||||
<string name="MessagePreview">Prévisualisation du message</string>
|
||||
<string name="DefaultForGroupMessages">Message de groupe</string>
|
||||
<string name="DefaultForGroupMessages">Messages du groupe</string>
|
||||
<string name="Sound">Son</string>
|
||||
<string name="InAppNotifications">Notifications dans l\'application</string>
|
||||
<string name="Vibrate">Vibrer</string>
|
||||
@@ -80,14 +81,14 @@
|
||||
<string name="NotificationsAndSounds">Notifications et sons</string>
|
||||
<string name="BlockedContacts">Contacts bloqués</string>
|
||||
<string name="Default">Defaut</string>
|
||||
<string name="OnlyIfSilent">Seulement en silencieux</string>
|
||||
<string name="ChatBackground">Arrière-plan de conversation</string>
|
||||
<string name="OnlyIfSilent">Seulement si silencieux</string>
|
||||
<string name="ChatBackground">Arrière-plan des conversations</string>
|
||||
<string name="SendByEnter">Envoyer avec "Entrée"</string>
|
||||
<string name="Help">Aide</string>
|
||||
<string name="Enabled">Activé</string>
|
||||
<string name="Disabled">Désactivé</string>
|
||||
<string name="LedColor">Couleur de la notification par LED</string>
|
||||
<string name="BadgeNumber">Montrer le compte dans l\'icône, si possible</string>
|
||||
<string name="BadgeNumber">Montrer le nombre dans l\'icône, si possible</string>
|
||||
<string name="Short">Court</string>
|
||||
<string name="Long">Long</string>
|
||||
<string name="RaiseToSpeak">Lever pour parler</string>
|
||||
@@ -100,7 +101,7 @@
|
||||
<string name="NotificationsOther">Autres</string>
|
||||
<string name="InChatSound">Sons dans la conversation</string>
|
||||
<string name="SmartNotifications">Limiter les notifications</string>
|
||||
<string name="SmartNotificationsSoundAtMost">Notifier au maximum</string>
|
||||
<string name="SmartNotificationsSoundAtMost">Son au maximum</string>
|
||||
<string name="SmartNotificationsTimes">fois</string>
|
||||
<string name="SmartNotificationsWithin">toutes les</string>
|
||||
<string name="SmartNotificationsMinutes">minutes</string>
|
||||
@@ -109,12 +110,12 @@
|
||||
<!--cache view-->
|
||||
<string name="CacheSettings">Stockage</string>
|
||||
<string name="KeepMedia">Conserver les fichiers média</string>
|
||||
<string name="KeepMediaInfo">Les photos, vidéos et autres fichiers venant des conversations du cloud que vous n\'avez <![CDATA[<b>pas</b>]]> consultés pendant cette période seront supprimés pour libérer de l\'espace.</string>
|
||||
<string name="KeepMediaInfo">Les photos, vidéos et autres fichiers venant des conversations que vous n\'avez <![CDATA[<b>pas</b>]]> consultés pendant cette période seront supprimés pour libérer de l\'espace.</string>
|
||||
<string name="KeepMediaForever">Toujours</string>
|
||||
<!--passcode view-->
|
||||
<string name="Passcode">Verrouiller par mot de passe</string>
|
||||
<string name="ChangePasscode">Modifier le mot de passe</string>
|
||||
<string name="ChangePasscodeInfo">Quand vous ajoutez un verrouillage par mot de passe, une icône de verrouillage apparaîtra sur la page des conversations. Appuyez sur cette icône et déverrouillez l\'application.\n\nNote : si vous oubliez le mot de passe, vous devrez supprimer et réinstaller l\'application.</string>
|
||||
<string name="ChangePasscodeInfo">Quand vous ajoutez un verrouillage par mot de passe, une icône de verrouillage apparaîtra sur la page des conversations. Appuyez sur cette icône pour verrouiller l\'application.\n\nNote: si vous oubliez le mot de passe, vous devrez supprimer et réinstaller l\'application.</string>
|
||||
<string name="PasscodePIN">PIN</string>
|
||||
<string name="PasscodePassword">Mot de passe</string>
|
||||
<string name="EnterCurrentPasscode">Saisissez votre mot de passe actuel</string>
|
||||
@@ -131,15 +132,15 @@
|
||||
<!--photo gallery view-->
|
||||
<string name="SaveToGallery">Enregistrer dans la galerie</string>
|
||||
<string name="Of">%1$d de %2$d</string>
|
||||
<string name="Gallery">Gallerie</string>
|
||||
<string name="Gallery">Galerie</string>
|
||||
<string name="AllPhotos">Toutes les photos</string>
|
||||
<string name="AllVideo">Toutes les vidéos</string>
|
||||
<string name="NoPhotos">Aucune photo pour le moment</string>
|
||||
<string name="NoVideo">Aucune vidéo pour le moment</string>
|
||||
<string name="CropImage">Couper les images</string>
|
||||
<string name="EditImage">Modifier les images</string>
|
||||
<string name="CropImage">Rogner l\'image</string>
|
||||
<string name="EditImage">Modifier l\'image</string>
|
||||
<string name="Enhance">Améliorer</string>
|
||||
<string name="Highlights">Surbriller</string>
|
||||
<string name="Highlights">Hautes-lumières</string>
|
||||
<string name="Contrast">Contraste</string>
|
||||
<string name="Exposure">Exposition</string>
|
||||
<string name="Warmth">Température</string>
|
||||
@@ -151,7 +152,7 @@
|
||||
<string name="Fade">Fondu</string>
|
||||
<string name="Tint">Teinte</string>
|
||||
<string name="TintShadows">OMBRES</string>
|
||||
<string name="TintHighlights">SURBRILLANCE</string>
|
||||
<string name="TintHighlights">HAUTES-LUMIERES</string>
|
||||
<string name="Curves">Courbes</string>
|
||||
<string name="CurvesAll">TOUT</string>
|
||||
<string name="CurvesRed">ROUGE</string>
|
||||
@@ -178,12 +179,12 @@
|
||||
<string name="Send">Envoyer</string>
|
||||
<string name="CopyToClipboard">Copier vers le presse-papier</string>
|
||||
<string name="Delete">Supprimer</string>
|
||||
<string name="Forward">Renvoyer</string>
|
||||
<string name="Forward">Transférer</string>
|
||||
<string name="FromCamera">Depuis la caméra</string>
|
||||
<string name="FromGalley">Depuis la galerie</string>
|
||||
<string name="Set">Définir</string>
|
||||
<string name="OK">OK</string>
|
||||
<string name="Crop">DÉCOUPER</string>
|
||||
<string name="Crop">ROGNER</string>
|
||||
<!--messages-->
|
||||
<string name="AttachPhoto">Photo</string>
|
||||
<string name="AttachVideo">Vidéo</string>
|
||||
@@ -193,15 +194,15 @@
|
||||
<string name="AttachVoiceMessage">Message vocal</string>
|
||||
<string name="FromSelf">Moi</string>
|
||||
<!--Alert messages-->
|
||||
<string name="NoHandleAppInstalled">Vous n\'avez pas d\'application qui peut gérer le type \'%1$s\', veuillez en installer une pour continuer</string>
|
||||
<string name="NoHandleAppInstalled">Vous n\'avez pas d\'application qui peut gérer des fichiers de type \'%1$s\', veuillez en installer une pour continuer</string>
|
||||
<string name="ContactAlreadyInGroup">Ce contact est déjà dans ce groupe</string>
|
||||
<string name="ForwardMessagesTo">Renvoyer les messages sélectionnés à <![CDATA[<b>]]>%1$s<![CDATA[</b>]]> ?</string>
|
||||
<string name="SendMessagesTo">Envoyer les messages à <![CDATA[<b>]]>%1$s<![CDATA[</b>]]> ?</string>
|
||||
<string name="AreYouSureDeleteThisChat">Êtes-vous sûr de vouloir supprimer cette conversation ? La conversation n\'apparaîtra plus dans la liste des conversations, mais les messages resteront sur le serveur.</string>
|
||||
<string name="AreYouSureBlockContact">Êtes-vous sûr de vouloir bloquer cet utilisateur ?</string>
|
||||
<string name="AreYouSureDeleteContact">Êtes-vous sûr de vouloir supprimer cet utilisateur ?</string>
|
||||
<string name="AreYouSureBlockContact">Êtes-vous sûr de vouloir bloquer ce contact?</string>
|
||||
<string name="AreYouSureDeleteContact">Êtes-vous sûr de vouloir supprimer ce contact?</string>
|
||||
<!--permissions-->
|
||||
<string name="PermissionContacts">Delta Chat a besoin d\'accéder aux contacts de façon à pouvoir vous connecter avec vos amis avec tous vos appareils.</string>
|
||||
<string name="PermissionContacts">Delta Chat a besoin d\'accéder à vos contacts afin de pouvoir vous connecter avec vos amis sur tous vos appareils.</string>
|
||||
<string name="PermissionStorage">Delta Chat a besoin d\'accéder au stockage pour envoyer vos photos, vidéos, musiques et autres médias.</string>
|
||||
<string name="PermissionNoAudio">Delta Chat a besoin d\'accéder à votre microphone pour envoyer des messages vocaux.</string>
|
||||
<string name="PermissionOpenSettings">Paramètres</string>
|
||||
@@ -209,7 +210,7 @@
|
||||
<string name="Intro1Headline">Delta Chat</string>
|
||||
<string name="Intro1Message">La messagerie <![CDATA[<b>la plus étendue</b>]]> dans le monde.<![CDATA[<br/><b>Libre</b>]]> et <![CDATA[<b>sécurisée</b>]]>.</string>
|
||||
|
||||
<string name="Intro2Headline">Indépendent</string>
|
||||
<string name="Intro2Headline">Indépendant</string>
|
||||
<string name="Intro2Message"><![CDATA[<b>Aucune dépendance</b>]]> à des serveurs ou services tiers. L\'application utilise juste votre serveur d\'e-mail.</string>
|
||||
|
||||
<string name="Intro3Headline">Rapide</string>
|
||||
@@ -219,7 +220,7 @@
|
||||
<string name="Intro4Message">Envoyer et recevez des messages, des photos, des vidéos, des messages audios et plus <![CDATA[<b>sans limite</b>]]>. Compatible multi-plateforme.</string>
|
||||
|
||||
<string name="Intro5Headline">Libre</string>
|
||||
<string name="Intro5Message"><![CDATA[<b>Delta Chat</b>]]> sera toujours libre.<![CDATA[<br/>]]>OpenSource. Pas de pub. Pas d\'inscription.</string>
|
||||
<string name="Intro5Message"><![CDATA[<b>Delta Chat</b>]]> sera toujours libre.<![CDATA[<br/>]]>OpenSource. Pas de pub. Pas d\'inscription. Pas lié a un fournisseur.</string>
|
||||
|
||||
<string name="Intro6Headline">Sûr</string>
|
||||
<string name="Intro6Message"><![CDATA[<b>Chiffré</b>]]> avec des algorithmes reconnus. Les messages restent sur vos serveurs.</string>
|
||||
@@ -248,6 +249,14 @@
|
||||
<item quantity="one">%d message</item>
|
||||
<item quantity="other">%d messages</item>
|
||||
</plurals>
|
||||
<plurals name="AreYouSureDeleteMessages">
|
||||
<item quantity="one">Effacer %d message? Ce message sera aussi effacé du serveur.</item>
|
||||
<item quantity="other">Effacer %d messages? Ces messages seront aussi effacés du serveur.</item>
|
||||
</plurals>
|
||||
<plurals name="NewMessagesInChats">
|
||||
<item quantity="one">1%1$s dans 2%2$d conversation</item>
|
||||
<item quantity="other">%1$s dans %2$d conversations</item>
|
||||
</plurals>
|
||||
<plurals name="Chats">
|
||||
<item quantity="one">%d conversation</item>
|
||||
<item quantity="other">%d conversations</item>
|
||||
@@ -272,6 +281,10 @@
|
||||
<item quantity="one">%d mois</item>
|
||||
<item quantity="other">%d mois</item>
|
||||
</plurals>
|
||||
<plurals name="MaxNotifications">
|
||||
<item quantity="one">Maximum %1$d notification dans 2%2$s</item>
|
||||
<item quantity="other">Maximum %1$d notifications dans %2$s</item>
|
||||
</plurals>
|
||||
<!--date formatters-->
|
||||
<string name="formatterMonthYear">MMMM yyyy</string>
|
||||
<string name="formatterMonth">dd MMM</string>
|
||||
@@ -285,6 +298,7 @@
|
||||
<string name="AccountSettings">Paramètres du compte</string>
|
||||
<string name="MyAccount">Mon compte</string>
|
||||
<string name="MyName">Mon nom</string>
|
||||
<string name="MyNameExplain">Votre nom présenté aux destinataires. Si vous ne renseignez aucun nom ici, les destinataires verront uniquement votre adresse e-mail.</string>
|
||||
<string name="Password">Mot de passe</string>
|
||||
<string name="SmtpPassword">Mot de passe SMTP</string>
|
||||
<string name="FromAbove">Le même qu\'au dessus</string>
|
||||
@@ -297,18 +311,19 @@
|
||||
<string name="ImapPort">Port IMAP</string>
|
||||
<string name="InboxHeadline">Boîte de reception</string>
|
||||
<string name="OutboxHeadline">Boîte d\'envoi</string>
|
||||
<string name="MyAccountExplain">Pour les fournisseurs e-mails connus, les paramètres suivants sont déterminés automatiquement.</string>
|
||||
<string name="MyAccountExplain">Pour les fournisseurs e-mails connus, les paramètres suivants seront déterminés automatiquement.</string>
|
||||
<string name="MyAccountExplain2" >Parfois, les protocoles IMAP/SMTP doivent êtres activés depuis l\'interface web.\n\nSi vous rencontrez des problème, demandez à votre fournisseur ou à vos amis.</string>
|
||||
<string name="AccountNotConfigured">Compte non configuré</string>
|
||||
<string name="AboutThisProgram">À propos Delta Chat</string>
|
||||
<string name="NotSet">Non défini</string>
|
||||
<string name="NewChat">Nouvelle conversation</string>
|
||||
<string name="Deaddrop">Boîte de reception</string>
|
||||
<string name="DeaddropInChatlist">Montrer la boîte de reception dans la liste des conversations</string>
|
||||
<string name="Deaddrop">Demandes de contact</string>
|
||||
<string name="DeaddropInChatlist">Monter les demandes de contact dans la liste des convesations</string>
|
||||
<string name="MuteAlways">Toujours muet</string>
|
||||
<string name="AskStartChatWith">Lancer une conversation avec <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>?</string>
|
||||
<string name="DeaddropHint">Pour lancer une conversation, cliquez sur le bouton de réponse en forme de flèche.</string>
|
||||
<string name="NotYetImplemented">Cette fonction n\'est pas disponible ou non supportée complètement.</string>
|
||||
<string name="DefaultStatusText">Envoyé avec Delta Chat: https://delta.chat</string>
|
||||
<string name="Name" >Nom</string>
|
||||
<string name="EmailAddress">Adresse e-mail</string>
|
||||
<string name="CannotDeleteContact">Impossible de supprimer les contacts en cours d\'utilisation, bloquez-les à la place.</string>
|
||||
@@ -323,10 +338,10 @@
|
||||
<string name="InviteMenuEntry">Envoyer des invitations</string>
|
||||
<string name="InviteText">J\'utilise la messagerie Delta Chat maintenant - %1$s - vous pouvez me contacter à %2$s</string>
|
||||
<string name="AdvancedSettings">Paramètres avancés</string>
|
||||
<string name="AskResetNotifications" >Êtes-vous sûr de vouloir réinitialiser toutes les paramètres de notification et les sons de cette page et de vos contacts et groupes?</string>
|
||||
<string name="AskResetNotifications" >Réinitialiser toutes les paramètres de notification et les sons de cette page ainsi que de vos contacts et groupes?</string>
|
||||
<string name="AttachFiles">Joindre des fichiers</string>
|
||||
<string name="ErrGroupNameEmpty">Merci de saisir un nom pour le groupe.</string>
|
||||
<string name="MsgNewGroupDraftHint">Écrivez un premier message pour permettre aux autres de répondre dans ce groupe.\n\n• Ça ne devrait pas poser de problème si tout les membres du groupe n\'utilisent pas Delta Chat.\n\n• La livraison du premier message peut prendre un moment.</string>
|
||||
<string name="MsgNewGroupDraftHint">Écrivez un premier message pour permettre aux autres de répondre dans ce groupe.\n\n• Ça ne devrait pas poser de problème si tout les membres du groupe n\'utilisent pas Delta Chat.\n\n• L\'envoi du premier message peut prendre un moment.</string>
|
||||
<string name="MsgNewGroupDraft">Bonjour, je viens juste de créer le groupe \"%1$s\" pour nous.</string>
|
||||
<string name="MsgGroupNameChanged">Le nom du groupe a changé de \"%1$s\" à \"%2$s\".</string>
|
||||
<string name="MsgGroupImageChanged">L\'image du groupe a changé.</string>
|
||||
@@ -336,10 +351,13 @@
|
||||
<string name="AskRemoveMemberFromGroup">Voulez-vous retirer <![CDATA[<b>]]>%1$s<![CDATA[</b>]]> du groupe ?</string>
|
||||
<string name="ErrSelfNotInGroup">Vous devez être membre du groupe pour effectuer cette action.</string>
|
||||
<string name="MsgGroupLeft">Groupe quitté.</string>
|
||||
<string name="NoMessagesHint">Envoyez un message à <![CDATA[<b>]]>%1$s<![CDATA[</b>]]> :\n\n• Ça ne devrait pas poser de problème si <![CDATA[<b>]]>%2$s<![CDATA[</b>]]> n\'utilise pas Delta Chat\n\n• La livraison du premier message peut prendre un moment.</string>
|
||||
<string name="NoMessagesHint">Envoyez un message à <![CDATA[<b>]]>%1$s<![CDATA[</b>]]> :\n\n• Ça ne devrait pas poser de problème si <![CDATA[<b>]]>%2$s<![CDATA[</b>]]> n\'utilise pas Delta Chat\n\n• L\'envoi du premier message peut prendre un moment.</string>
|
||||
<string name="SendNRcvReadReceipts">Recevoir et renvoyer des accusés de réception.</string>
|
||||
<string name="PreferE2EEncryption">Préféré le chiffrement de bout-en-bout.</string>
|
||||
<string name="E2EManagePrivateKeys">Gérer les clefs privées</string>
|
||||
<string name="E2ECompareKeys">Comparer les clefs</string>
|
||||
<string name="ForwardToTitle">Renvoyer à…</string>
|
||||
<string name="SelectContact">Sélectionner un contact</string>
|
||||
<string name="DoneHint">Fait.</string>
|
||||
<string name="FileNotFound">Fichier %1$s non trouvé.</string>
|
||||
<string name="Error">Erreur: %1$s</string>
|
||||
@@ -352,15 +370,22 @@
|
||||
<string name="AutoplayGifs">Lecture automatique des GIFs</string>
|
||||
<string name="HelpUrl">https://delta.chat/en/help</string>
|
||||
<string name="EncryptedMessage">Message chiffré</string>
|
||||
<string name="ImportFromDownloads">Importer depuis \"Downloads\"</string>
|
||||
<string name="ExportToDownloads">Exporter vers \"Downloads\"</string>
|
||||
<string name="ImportPrivateKeysAsk">Importer des clefs privées depuis \"Downloads\"?\n\n• Les clefs privées existantes ne sont pas supprimées\n\n• Les dernières clefs importées seront utilisées par défaut\n\nContinuer ?</string>
|
||||
<string name="Encryption">Chiffrement</string>
|
||||
<string name="EncrinfoE2EExplain">Si toutes les empreintes digitales correspondent sur l\'autre appareil, la connexion est sûre.</string>
|
||||
<string name="EncrinfoTransport">Le chiffrement du transport au moins active sur mon serveur.</string>
|
||||
<string name="EncrinfoE2E">Chiffrement de bout-en-bout activé.</string>
|
||||
<string name="EncrinfoE2EExplain">Si toutes les clefs de chiffrement correspondent sur l\'autre appareil, la connexion est sûre.</string>
|
||||
<string name="EncrinfoTransport">Le chiffrement est active au moins jusqu\'à mon serveur</string>
|
||||
<string name="EncrinfoNone">Aucun chiffrement sur mon serveur.</string>
|
||||
<string name="EncrinfoNoE2EExplain">Le chiffrement de bout-à-bout sera activé automatiquement dès que le contact utilisera Delta Chat ou n\'importe quelle autre application de chiffrement automatique.</string>
|
||||
<string name="EncrinfoFingerprints">Empreintes digitales</string>
|
||||
<string name="EncrinfoFingerprints">Clefs de chiffrement</string>
|
||||
<string name="Backup">Sauvegarde</string>
|
||||
<string name="ImportBackupExplain">Pour importer une sauvegarde, copiez celle-ci vers le répertoire \"Downloads\" et réinstallez l\'application.</string>
|
||||
<string name="ReadReceiptMailBody">Ceci est un accusé de réception pour le message \"1%1$s\".\n\nCet accusé indique seulement la bonne réception du message sur l\'appareil du destinataire. Il n\'y a pas de garantie que le destinataire a lu le contenu du message.</string>
|
||||
<string name="ReadReceipt">Accusé de réception</string>
|
||||
<string name="NameAndStatus">Nom et statut</string>
|
||||
<string name="MyStatus">Mon statut</string>
|
||||
<string name="MyStatusExplain">Le statut est affiché dans votre profil et dans la signature de votre e-mail.</string>
|
||||
<string name="MsgGroupImageDeleted">Image du groupe effacée.</string>
|
||||
<string name="AskDeleteGroupImage">Êtes-vous sûr de vouloir effacer l\'image du groupe?\n\nCeci affectera tous les appareils de tous les membres du groupe.</string>
|
||||
<string name="ExportImportHeader">Exporter et importer</string>
|
||||
<string name="EnterPasswordToContinue">Entrer le mot de passe pour %1$s pour continuer:</string>
|
||||
<string name="IncorrectPassword">Mot de passe incorrect.</string>
|
||||
</resources>
|
||||
|
||||
@@ -323,7 +323,7 @@
|
||||
<string name="AskStartChatWith">Iniziare una conversazione con <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>?</string>
|
||||
<string name="DeaddropHint">Per iniziare una conversazione toccare le frecce di risposta.</string>
|
||||
<string name="NotYetImplemented">Funzione non disponibile o incompleta.</string>
|
||||
<string name="DefaultStatusText">Inviato con la mia app di messaggistica Delta Chat. Perdonate la brevità.</string>
|
||||
<string name="DefaultStatusText">Inviato con l\'app di messaggistica Delta Chat: https://delta.chat</string>
|
||||
<string name="Name" >Nome</string>
|
||||
<string name="EmailAddress">Indirizzo email</string>
|
||||
<string name="CannotDeleteContact">Impossibile cancellare i contatti in uso, provare a bloccarli.</string>
|
||||
@@ -352,7 +352,7 @@
|
||||
<string name="ErrSelfNotInGroup">È necessario essere un membro del gruppo per eseguire questa azione.</string>
|
||||
<string name="MsgGroupLeft">Gruppo abbandonato.</string>
|
||||
<string name="NoMessagesHint">Invia un messaggio a <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>:\n\n• Va bene anche se <![CDATA[<b>]]>%2$s<![CDATA[</b>]]> non usa Delta Chat.\n\n• L\'invio del primo messaggio può richiedere del tempo.</string>
|
||||
<string name="SendNRcvReadReceipts">Ricevi e invia ricevute di ritorno.</string>
|
||||
<string name="SendNRcvReadReceipts">Ricevi e invia ricevute di ritorno</string>
|
||||
<string name="PreferE2EEncryption">Preferisci crittografia end-to-end</string>
|
||||
<string name="E2EManagePrivateKeys">Gestione chiavi private</string>
|
||||
<string name="E2ECompareKeys">Compara chiavi</string>
|
||||
@@ -364,15 +364,12 @@
|
||||
<string name="NoNetwork">Rete non disponibile.</string>
|
||||
<string name="Audio">Audio</string>
|
||||
<string name="PleaseCutVideoToMaxSize">Ridurre il video alla dimensione massima di %1$s.</string>
|
||||
<string name="PermNotificationTitle">Connesso a%1$s</string>
|
||||
<string name="PermNotificationTitle">Connesso a %1$s</string>
|
||||
<string name="PermNotificationText">In attesa di messaggi...</string>
|
||||
<string name="SettingsFor">Impostazioni per %1$s</string>
|
||||
<string name="AutoplayGifs">Riproduzione automatica GIF</string>
|
||||
<string name="HelpUrl">https://delta.chat/en/help</string>
|
||||
<string name="EncryptedMessage">Messaggio cifrato</string>
|
||||
<string name="ImportFromDownloads">Importa da \"Download\"</string>
|
||||
<string name="ExportToDownloads">Esporta in \"Download\"</string>
|
||||
<string name="ImportPrivateKeysAsk">Importare chiavi private da \"Download\"?\n\n• Le chiavi private esistenti non vengono cancellate\n\n• L\'ultima chiave importata sarà usata come predefinita\n\nContinuare?</string>
|
||||
<string name="Encryption">Crittografia</string>
|
||||
<string name="EncrinfoE2E">Crittografia end-to-end abilitata.</string>
|
||||
<string name="EncrinfoE2EExplain">Se tutte le impronte corrispondono sull\'altro dispositivo, la connessione è sicura.</string>
|
||||
@@ -381,7 +378,6 @@
|
||||
<string name="EncrinfoNoE2EExplain">La crittografia end-to-end verrà attivata automaticamente quando il contatto usa Delta Chat o un altra applicazione che utilizza Autocrypt.</string>
|
||||
<string name="EncrinfoFingerprints">Impronte digitali</string>
|
||||
<string name="Backup">Backup</string>
|
||||
<string name="ImportBackupExplain">Per importare un backup, copiarlo nella cartella \"Download\" e reinstalla l\'app.</string>
|
||||
<string name="ReadReceiptMailBody">Questa è una ricevuta di ritorno del messaggio \"%1$s\".\n\nQuesta ricevuta conferma solo che il messaggio è arrivato sul dispositivo del destinatario. Non c\'è alcuna garanzia che il destinatario abbia letto il contenuto del messaggio.</string>
|
||||
<string name="ReadReceipt">Ricevuta di ritorno</string>
|
||||
<string name="NameAndStatus">Nome e stato</string>
|
||||
@@ -389,4 +385,5 @@
|
||||
<string name="MyStatusExplain">Lo stato viene mostrato nel proprio profilo e nel piè di pagina delle email.</string>
|
||||
<string name="MsgGroupImageDeleted">Immagine del gruppo eliminata.</string>
|
||||
<string name="AskDeleteGroupImage">Rimuovere veramente l\'immagine del gruppo?\n\nQuesto avrà effetto su tutti i dispositivi di tutti i membri del gruppo.</string>
|
||||
</resources>
|
||||
<string name="ExportImportHeader">Esporta e importa</string>
|
||||
</resources>
|
||||
|
||||
@@ -351,7 +351,7 @@
|
||||
<string name="AskStartChatWith">Rozpocząć czat z <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>?</string>
|
||||
<string name="DeaddropHint">Aby rozpocząć czat, naciśnij strzałkę odpowiedzi.</string>
|
||||
<string name="NotYetImplemented">Ta funkcja jest niedostępna lub niekompletna.</string>
|
||||
<string name="DefaultStatusText">Wysłano moim komunikatorem Delta Chat. Proszę o wybaczenie mojej lakoniczności.</string>
|
||||
<string name="DefaultStatusText">Wysłane z komunikatora Delta Chat: https://delta.chat</string>
|
||||
<string name="Name" >Nazwa</string>
|
||||
<string name="EmailAddress">Adres e-mail</string>
|
||||
<string name="CannotDeleteContact">Nie możesz usunąć kontaktu w użyciu, zamiast tego zablokuj kontakt.</string>
|
||||
@@ -398,9 +398,6 @@
|
||||
<string name="AutoplayGifs">Automatycznie odtwórz GIFy</string>
|
||||
<string name="HelpUrl">https://jaworski-pawel.github.io/Delta/#help</string>
|
||||
<string name="EncryptedMessage">Szyfrowana wiadomość</string>
|
||||
<string name="ImportFromDownloads">Importuj z katalogu „Downloads”</string>
|
||||
<string name="ExportToDownloads">Eksportuj do katalogu „Downloads”</string>
|
||||
<string name="ImportPrivateKeysAsk">Zaimportować prywatne klucze z „Downloads”?\n\n• Istniejące prywatne klucze nie są usuwane\n\n• Ostatni zaimportowany klucz zostanie użyty jako nowy klucz domyślny\n\nKontynuować?</string>
|
||||
<string name="Encryption">Szyfrowanie</string>
|
||||
<string name="EncrinfoE2E">Połączenie jest w pełni szyfrowane.</string>
|
||||
<string name="EncrinfoE2EExplain">Jeśli wszystkie odciski palców są zgodne z drugim urządzeniem, połączenie jest bezpieczne.</string>
|
||||
@@ -409,7 +406,7 @@
|
||||
<string name="EncrinfoNoE2EExplain">Szyfrowanie przełączy się automatycznie na PEŁNE, gdy tylko kontakt użyje programu Delta Chat lub innej aplikacji obsługującej funkcję Autocrypt.</string>
|
||||
<string name="EncrinfoFingerprints">Odciski palców</string>
|
||||
<string name="Backup">Backup</string>
|
||||
<string name="ImportBackupExplain">Aby zaimportować kopię zapasową, skopiuj ją do folderu \"Downloads\" i ponownie zainstaluj aplikację.</string>
|
||||
<string name="ImportBackupExplain2">Aby zaimportować kopię zapasową, skopiuj ją do folderu <![CDATA[<i>]]>%1$s<![CDATA[</i>]]> i ponownie zainstaluj aplikację.</string>
|
||||
<string name="ReadReceiptMailBody">To jest potwierdzenie odczytu dla wiadomości ”%1$s„.\n\nTo potwierdzenie odczytu tylko informuje, że wiadomość została wyświetlona na urządzeniu odbiorcy. Nie ma gwarancji, że odbiorca przeczytał treść wiadomości.</string>
|
||||
<string name="ReadReceipt">Potwierdzenie odczytu</string>
|
||||
<string name="NameAndStatus">Nazwa i status</string>
|
||||
@@ -417,4 +414,16 @@
|
||||
<string name="MyStatusExplain">Status jest widoczny w twoim profilu i w stopce maili.</string>
|
||||
<string name="MsgGroupImageDeleted">Usunięto obraz grupy.</string>
|
||||
<string name="AskDeleteGroupImage">Czy na pewno usunąć obraz grupy?\n\nTo wpłynie na wszystkie urządzenia, wszystkich członków grupy.</string>
|
||||
<string name="ExportImportHeader">Export i import</string>
|
||||
<string name="ImportExportExplain">Eksportowane pliki mogą zawierać prywatne klucze! Przechowuj je w bezpiecznym miejscu lub usuń jak najszybciej.</string>
|
||||
<string name="EnterPasswordToContinue">Aby kontynuować, wprowadź hasło dla %1$s;</string>
|
||||
<string name="IncorrectPassword">Nieprawidłowe hasło.</string>
|
||||
<string name="ImportBackupAsk">Delta Chat znalazł kopię zapasową w katalogu <![CDATA[<i>]]>%1$s<![CDATA[</i>]]>.\n\nCzy chcesz zaimportować i używać wszystkich danych i ustawień z tej kopii zapasowej?</string>
|
||||
<string name="ImportBackup">Importuj kopię zapasową</string>
|
||||
<string name="NoBackupFound">Nie znaleziono kopii zapasowej.\n\nSkopiuj kopię zapasową do katalogu <![CDATA[<i>]]>%1$s<![CDATA[</i>]]> i spróbuj ponownie. Alternatywnie dotknij \"Uruchom komunikator\", aby rozpocząć normalny proces instalacji.</string>
|
||||
<string name="FilesSuccessfullyExported">Plik został pomyślnie wyeksportowany do <![CDATA[<i>]]>%1$s<![CDATA[</i>]]>.</string>
|
||||
<string name="ExportBackup">Eksportuj kopię zapasową</string>
|
||||
<string name="ExportPrivateKeys">Eksportuj prywatne klucze</string>
|
||||
<string name="ImportPrivateKeys">Importuj prywatne klucze</string>
|
||||
<string name="ImportPrivateKeysAsk2">Zaimportować prywatne klucze z <![CDATA[<i>]]>%1$s<![CDATA[]]>?\n\n• Istniejące prywatne klucze nie są usuwane\n\n• Ostatni zaimportowany klucz zostanie użyty jako nowy klucz domyślny</string>
|
||||
</resources>
|
||||
|
||||
@@ -323,7 +323,7 @@
|
||||
<string name="AskStartChatWith">Começar uma conversa com <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>?</string>
|
||||
<string name="DeaddropHint">Para conversar toque na seta.</string>
|
||||
<string name="NotYetImplemented">Esta função ainda não está disponível ou ainda não está completamente desenvolvida.</string>
|
||||
<string name="DefaultStatusText">Enviado pelo meu Dela Chat. Desculpas pela brevidade.</string>
|
||||
<string name="DefaultStatusText">Enviado pelo meu Delta Chat Messenger: https://delta.chat</string>
|
||||
<string name="Name" >Nome</string>
|
||||
<string name="EmailAddress">Endereço de e-mail</string>
|
||||
<string name="CannotDeleteContact">Impossível deletar um contato em uso! Bloqueie-o.</string>
|
||||
@@ -370,9 +370,6 @@
|
||||
<string name="AutoplayGifs">Animar GIFs automaticamente</string>
|
||||
<string name="HelpUrl">https://delta.chat/pt/help</string>
|
||||
<string name="EncryptedMessage">Mensagem criptografada</string>
|
||||
<string name="ImportFromDownloads">Importar de \"Downloads"</string>
|
||||
<string name="ExportToDownloads">Exportar para \"Downloads"</string>
|
||||
<string name="ImportPrivateKeysAsk">Importar chaves privadas da pasta \"Downloads\"?\n\n• As chaves já constantes do aplicativo não serão deletadas\n\n• A última chave importada será usada como a padrão\n\nContinuar?</string>
|
||||
<string name="Encryption">Criptografia</string>
|
||||
<string name="EncrinfoE2E">Criptografia ponta-a-ponta habilitada.</string>
|
||||
<string name="EncrinfoE2EExplain">Se ambas impressões combinam no outro dispositivo, a conexão é segura.</string>
|
||||
@@ -381,7 +378,6 @@
|
||||
<string name="EncrinfoNoE2EExplain">A criptografia ponta-a-ponta será ativada automaticamente tão logo o seu contato utilize algum aplicativo que tenha suporte ao Autocrypt, como o Delta Chat.</string>
|
||||
<string name="EncrinfoFingerprints">Impressões</string>
|
||||
<string name="Backup">Becape</string>
|
||||
<string name="ImportBackupExplain">Para importar um becape, copie-o na pasta \"Downloads\" e reinstale o aplicativo.</string>
|
||||
<string name="ReadReceiptMailBody">Confirmação de recebimento da mensagem \"%1$s\". \n\n Esta confirmação somente assegura que a mensagem foi exibida no aparelho do destinatário, mas não há garantia de que ele tenha lido o seu conteúdo.</string>
|
||||
<string name="ReadReceipt">Confirmação de recebimento</string>
|
||||
<string name="NameAndStatus">Nome e status</string>
|
||||
@@ -389,4 +385,4 @@
|
||||
<string name="MyStatusExplain">Seu status será exibido no seu perfil e na assinatura de seus e-mails.</string>
|
||||
<string name="MsgGroupImageDeleted">Imagem do grupo apagada.</string>
|
||||
<string name="AskDeleteGroupImage">Tem certeza que quer apagar a imagem do grupo?\n\nEsta ação repercutirá nos dispositivos dos outros membros do grupo.</string>
|
||||
</resources>
|
||||
</resources>
|
||||
|
||||
@@ -17,15 +17,15 @@
|
||||
<string name="UnmuteNotifications">Включить уведомления</string>
|
||||
<string name="Draft">Черновик</string>
|
||||
<!--audio view-->
|
||||
<string name="NoAudio">Добавьте файл в музыкальную коллекцию на вашем устройстве для того чтобы увидеть его здесь.</string>
|
||||
<string name="NoAudio">Добавьте файлы в музыкальную коллекцию на вашем устройстве для того, чтобы увидеть его здесь.</string>
|
||||
<string name="AttachMusic">Музыка</string>
|
||||
<!--documents view-->
|
||||
<string name="SelectFile">Выбрать файл</string>
|
||||
<string name="FreeOfTotal">Свободно %1$s от %2$s</string>
|
||||
<string name="ErrorHint">Неизвестная ошибка</string>
|
||||
<string name="AccessError">Ошибка входа</string>
|
||||
<string name="AccessError">Ошибка доступа</string>
|
||||
<string name="NoFiles">Нет файлов …</string>
|
||||
<string name="NotMounted">Устройство не смонтированно</string>
|
||||
<string name="NotMounted">Устройство хранения не подключено</string>
|
||||
<string name="UsbActive">Передача по USB активирована</string>
|
||||
<string name="InternalStorage">Внутренняя память</string>
|
||||
<string name="ExternalStorage">Внешняя память</string>
|
||||
@@ -41,12 +41,12 @@
|
||||
<string name="From">От</string>
|
||||
<string name="NoRecent">Нет последних</string>
|
||||
<string name="TypeMessage">Сообщение</string>
|
||||
<string name="SlideToCancel">ОТПУСТИТЕ ДЛЯ ОСТАНОВКИ</string>
|
||||
<string name="SlideToCancel">СДВИНЬТЕ ДЛЯ ОТМЕНЫ</string>
|
||||
<string name="SaveToDownloads">Сохранить в папку Загрузки</string>
|
||||
<string name="SaveToMusic">Сохранить в музыку</string>
|
||||
<string name="Share">Поделиться</string>
|
||||
<string name="SendItems">Отправить %1$s</string>
|
||||
<string name="ClearRecentEmoji">Очистить актуальные смайлики?</string>
|
||||
<string name="ClearRecentEmoji">Очистить недавние смайлики?</string>
|
||||
<string name="AddShortcut">Добавить виджет на домашний экран</string>
|
||||
<string name="ShortcutAdded">Виджет добавлен на домашний экран</string>
|
||||
<!--notification-->
|
||||
@@ -64,7 +64,7 @@
|
||||
<string name="RemoveMember">Удалить участника</string>
|
||||
<!--contact info view-->
|
||||
<string name="NewContactTitle">Новый контакт</string>
|
||||
<string name="BlockContact">Блокировать контакт</string>
|
||||
<string name="BlockContact">Заблокировать контакт</string>
|
||||
<string name="DeleteContact">Удалить контакт</string>
|
||||
<string name="Info">Инфо</string>
|
||||
<!--settings view-->
|
||||
@@ -79,7 +79,7 @@
|
||||
<string name="Vibrate">Вибрация</string>
|
||||
<string name="ResetAllNotifications">Сбросить все уведомления</string>
|
||||
<string name="NotificationsAndSounds">Уведомления и Звуки</string>
|
||||
<string name="BlockedContacts">Блокированные контакты</string>
|
||||
<string name="BlockedContacts">Заблокированные контакты</string>
|
||||
<string name="Default">По умолчанию</string>
|
||||
<string name="OnlyIfSilent">Только если тишина</string>
|
||||
<string name="ChatBackground">Фон чата</string>
|
||||
@@ -113,19 +113,19 @@
|
||||
<string name="KeepMediaInfo">Фотографии, видео и другие файлы из облачных чатов, имеющиеся у вас <![CDATA[<b>not accessed</b>]]> в течение этого периода, будут удалены с этого устройства, чтобы сэкономить место на диске.</string>
|
||||
<string name="KeepMediaForever">Навсегда</string>
|
||||
<!--passcode view-->
|
||||
<string name="Passcode">Код блокировки</string>
|
||||
<string name="ChangePasscode">Изменить код блокировки</string>
|
||||
<string name="ChangePasscodeInfo">Когда вы установите дополнительный код доступа, на странице чатов появится значок блокировки. Нажмите, чтобы заблокировать и разблокировать приложение.\n\nПримечание: если вы забудете пароль, вам нужно будет удалить и переустановить приложение.</string>
|
||||
<string name="Passcode">Код доступа</string>
|
||||
<string name="ChangePasscode">Изменить код доступа</string>
|
||||
<string name="ChangePasscodeInfo">Когда вы установите дополнительный код доступа, на странице чатов появится значок блокировки. Нажмите на нём, чтобы заблокировать приложение.\n\nПримечание: если вы забудете код доступа, вам нужно будет удалить и переустановить приложение.</string>
|
||||
<string name="PasscodePIN">ПИН</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="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="AutoLockInfo">Необходим код блокировки если лимит времени превышен.</string>
|
||||
<string name="AutoLockInfo">Запрашивать код доступа, если превышено время ожидания.</string>
|
||||
<string name="UnlockFingerprint">Разблокировать с помощью отпечатка пальца</string>
|
||||
<string name="FingerprintInfo">Подтвердите отпечаток пальца для продолжения</string>
|
||||
<string name="FingerprintNotRecognized">Отпечаток пальца не опознан. Повторите снова</string>
|
||||
@@ -143,7 +143,7 @@
|
||||
<string name="Highlights">Световые эффекты</string>
|
||||
<string name="Contrast">Контраст</string>
|
||||
<string name="Exposure">Выдержка</string>
|
||||
<string name="Warmth">Тёплый </string>
|
||||
<string name="Warmth">Теплый </string>
|
||||
<string name="Saturation">Насыщенность</string>
|
||||
<string name="Vignette">Виньетка</string>
|
||||
<string name="Shadows">Тени</string>
|
||||
@@ -156,9 +156,9 @@
|
||||
<string name="Curves">Линии</string>
|
||||
<string name="CurvesAll">ВСЕ</string>
|
||||
<string name="CurvesRed">КРАСНЫЙ</string>
|
||||
<string name="CurvesGreen">ЗЕЛЁНЫЙ</string>
|
||||
<string name="CurvesGreen">ЗЕЛЕНЫЙ</string>
|
||||
<string name="CurvesBlue">СИНИЙ</string>
|
||||
<string name="Blur">Пятно</string>
|
||||
<string name="Blur">Размытие</string>
|
||||
<string name="BlurOff">Выкл</string>
|
||||
<string name="BlurLinear">Линейность</string>
|
||||
<string name="BlurRadial">Радиальный</string>
|
||||
@@ -194,16 +194,16 @@
|
||||
<string name="AttachVoiceMessage">Голосовое сообщение</string>
|
||||
<string name="FromSelf">Мне</string>
|
||||
<!--Alert messages-->
|
||||
<string name="NoHandleAppInstalled">У вас нет приложений, которые могут обрабатывать тип файла \'%1$s\', пожалуйста, установите его, чтобы продолжить</string>
|
||||
<string name="NoHandleAppInstalled">У вас нет приложений, которые могут обрабатывать тип файла \'%1$s\', пожалуйста, установите такое приложение, чтобы продолжить</string>
|
||||
<string name="ContactAlreadyInGroup">Контакт уже находится в этой группе.</string>
|
||||
<string name="ForwardMessagesTo">Переслать выбранные сообщения в <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>?</string>
|
||||
<string name="SendMessagesTo">Отправить сообщения в <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>?</string>
|
||||
<string name="AreYouSureDeleteThisChat">Удалить этот чат? Чат больше не будет отображаться в списке чата, сообщения останутся на сервере.</string>
|
||||
<string name="AreYouSureDeleteThisChat">Удалить этот чат? Чат больше не будет отображаться в списке чатов, сообщения останутся на сервере.</string>
|
||||
<string name="AreYouSureBlockContact">Вы действительно хотите заблокировать этот контакт?</string>
|
||||
<string name="AreYouSureDeleteContact">Вы уверены, что хотите удалить этот контакт?</string>
|
||||
<!--permissions-->
|
||||
<string name="PermissionContacts">Delta Chat необходим доступ к вашим контактам, чтобы вы могли общаться со своими друзьями на всех ваших устройствах.</string>
|
||||
<string name="PermissionStorage">Delta Chat необходим доступ к вашему хранилищу, чтобы вы могли отправлять и сохранять фотографии, видео, музыку и другие носители.</string>
|
||||
<string name="PermissionStorage">Delta Chat необходим доступ к вашему хранилищу, чтобы вы могли отправлять и сохранять фотографии, видео, музыку и другие материалы.</string>
|
||||
<string name="PermissionNoAudio">Delta Chat необходим доступ к вашему микрофону, чтобы вы могли отправлять голосовые сообщения.</string>
|
||||
<string name="PermissionOpenSettings">Адаптировать настройки</string>
|
||||
<!--Intro view-->
|
||||
@@ -225,39 +225,39 @@
|
||||
<string name="Intro6Headline">Безопасный</string>
|
||||
<string name="Intro6Message"><![CDATA[<b>Шифрование</b>]]> со всеми известными алгоритмами. Сообщения остаются на ваших серверах.</string>
|
||||
|
||||
<string name="Intro7Headline">Надёжный</string>
|
||||
<string name="Intro7Headline">Надежный</string>
|
||||
|
||||
<string name="IntroStartMessaging">Начать обмен сообщениями</string>
|
||||
<!--plural-->
|
||||
<plurals name="Members">
|
||||
<item quantity="one">%d участник</item>
|
||||
<item quantity="few">%d участники</item>
|
||||
<item quantity="many">%d участники</item>
|
||||
<item quantity="other">%d участники</item>
|
||||
<item quantity="few">%d участника</item>
|
||||
<item quantity="many">%d участников</item>
|
||||
<item quantity="other">%d участников</item>
|
||||
</plurals>
|
||||
<plurals name="Contacts">
|
||||
<item quantity="one">%d контакт</item>
|
||||
<item quantity="few">%d контактов</item>
|
||||
<item quantity="few">%d контакта</item>
|
||||
<item quantity="many">%d контактов</item>
|
||||
<item quantity="other">%d контактов</item>
|
||||
</plurals>
|
||||
<plurals name="MeAndMembers">
|
||||
<item quantity="one">Я и %d участник</item>
|
||||
<item quantity="few">Я и %d участников</item>
|
||||
<item quantity="few">Я и %d участника</item>
|
||||
<item quantity="many">Я и %d участников</item>
|
||||
<item quantity="other">Я и %d участников</item>
|
||||
</plurals>
|
||||
<plurals name="NewMessages">
|
||||
<item quantity="one">%d новое сообщение</item>
|
||||
<item quantity="few">%d новых сообщений</item>
|
||||
<item quantity="few">%d новых сообщения</item>
|
||||
<item quantity="many">%d новых сообщений</item>
|
||||
<item quantity="other">%d новых сообщений</item>
|
||||
</plurals>
|
||||
<plurals name="messages">
|
||||
<item quantity="one">%d сообщение</item>
|
||||
<item quantity="few">%d сообщения</item>
|
||||
<item quantity="many">%d сообщения</item>
|
||||
<item quantity="other">%d сообщения</item>
|
||||
<item quantity="many">%d сообщений</item>
|
||||
<item quantity="other">%d сообщений</item>
|
||||
</plurals>
|
||||
<plurals name="AreYouSureDeleteMessages">
|
||||
<item quantity="one">Удалить %d сообщение? Сообщение также будет удалено с сервера.</item>
|
||||
@@ -273,37 +273,37 @@
|
||||
</plurals>
|
||||
<plurals name="Chats">
|
||||
<item quantity="one">%d чат</item>
|
||||
<item quantity="few">%d чатах</item>
|
||||
<item quantity="many">%d чатах</item>
|
||||
<item quantity="other">%d чатах</item>
|
||||
<item quantity="few">%d чата</item>
|
||||
<item quantity="many">%d чатов</item>
|
||||
<item quantity="other">%d чатов</item>
|
||||
</plurals>
|
||||
<plurals name="Minutes">
|
||||
<item quantity="one">%d минута</item>
|
||||
<item quantity="few">%d минут</item>
|
||||
<item quantity="few">%d минуты</item>
|
||||
<item quantity="many">%d минут</item>
|
||||
<item quantity="other">%d минут</item>
|
||||
</plurals>
|
||||
<plurals name="Hours">
|
||||
<item quantity="one">%d час</item>
|
||||
<item quantity="few">%d часов</item>
|
||||
<item quantity="few">%d часа</item>
|
||||
<item quantity="many">%d часов</item>
|
||||
<item quantity="other">%d часов</item>
|
||||
</plurals>
|
||||
<plurals name="Days">
|
||||
<item quantity="one">%d день</item>
|
||||
<item quantity="few">%d дней</item>
|
||||
<item quantity="few">%d дня</item>
|
||||
<item quantity="many">%d дней</item>
|
||||
<item quantity="other">%d дней</item>
|
||||
</plurals>
|
||||
<plurals name="Weeks">
|
||||
<item quantity="one">%d неделя</item>
|
||||
<item quantity="few">%d недель</item>
|
||||
<item quantity="few">%d недели</item>
|
||||
<item quantity="many">%d недель</item>
|
||||
<item quantity="other">%d недель</item>
|
||||
</plurals>
|
||||
<plurals name="Months">
|
||||
<item quantity="one">%d месяц</item>
|
||||
<item quantity="few">%d месяцев</item>
|
||||
<item quantity="few">%d месяца</item>
|
||||
<item quantity="many">%d месяцев</item>
|
||||
<item quantity="other">%d месяцев</item>
|
||||
</plurals>
|
||||
@@ -314,22 +314,22 @@
|
||||
<item quantity="other">Не более %1$d сообщений в течении %2$s</item>
|
||||
</plurals>
|
||||
<!--date formatters-->
|
||||
<string name="formatterMonthYear">ММММ гггг</string>
|
||||
<string name="formatterMonth">МММ дд</string>
|
||||
<string name="formatterYear">дд.ММ.гггг</string>
|
||||
<string name="chatDate">EEE, ММММ д</string>
|
||||
<string name="chatFullDate">EEE, ММММ д, гггг</string>
|
||||
<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">ЧЧ:мм</string>
|
||||
<string name="formatterDay12H">ч:мм a</string>
|
||||
<string name="formatterDay24H">HH:mm</string>
|
||||
<string name="formatterDay12H">h:mm a</string>
|
||||
<string name="formatDateAtTime">%1$s в %2$s</string>
|
||||
<string name="AccountSettings">Настройки аккаунта</string>
|
||||
<string name="MyAccount">Мой аккаунт</string>
|
||||
<string name="MyName">Моё имя</string>
|
||||
<string name="MyNameExplain">Ваше имя, будут видеть все участники переписки. Если вы не введёте своё имя, участники переписки увидят только адрес вашей эл.почты.</string>
|
||||
<string name="MyName">Мое имя</string>
|
||||
<string name="MyNameExplain">Ваше имя, которое будут видеть все участники переписки. Если вы не введете свое имя, участники переписки увидят только адрес вашей эл.почты.</string>
|
||||
<string name="Password">Пароль</string>
|
||||
<string name="SmtpPassword">SMTP пароль</string>
|
||||
<string name="FromAbove">Сверху</string>
|
||||
<string name="FromAbove">Как указан выше</string>
|
||||
<string name="SmtpLoginname">SMTP логин</string>
|
||||
<string name="SmtpPort">SMTP порт</string>
|
||||
<string name="Automatic">Автоматически</string>
|
||||
@@ -345,46 +345,46 @@
|
||||
<string name="AboutThisProgram">Delta Chat (Дельта Чат)</string>
|
||||
<string name="NotSet">Не задано</string>
|
||||
<string name="NewChat">Новый чат</string>
|
||||
<string name="Deaddrop">Почтовый ящик</string>
|
||||
<string name="DeaddropInChatlist">Показывать почтовый ящик в чате</string>
|
||||
<string name="MuteAlways">Всегда отключено</string>
|
||||
<string name="Deaddrop">Запросы контактов</string>
|
||||
<string name="DeaddropInChatlist">Показывать запросы контактов в списке чатов</string>
|
||||
<string name="MuteAlways">Никогда не оповещать</string>
|
||||
<string name="AskStartChatWith">Начать чат с <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>?</string>
|
||||
<string name="DeaddropHint">Чтобы начать чат, нажмите стрелку ответа.</string>
|
||||
<string name="NotYetImplemented">Эта функция недоступна или в разработке.</string>
|
||||
<string name="DefaultStatusText">Отправлено с помощью Delta Chat Messenger. Простите за краткость.</string>
|
||||
<string name="DefaultStatusText">Отправлено с помощью Delta Chat Messenger: https://delta.chat</string>
|
||||
<string name="Name" >Имя</string>
|
||||
<string name="EmailAddress">Адрес электронной почты</string>
|
||||
<string name="CannotDeleteContact">Невозможно удалить контакты во время использования, сперва заблокируйте его.</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="NoChatsHelp">Начните обмен сообщениями, нажав кнопку нового чата в нижнем правом углу или коснитесь кнопки меню для получения дополнительных параметров.</string>
|
||||
<string name="NoChatsHelp">Начните обмен сообщениями, нажав кнопку нового чата в нижнем правом углу или коснитесь кнопки меню для получения дополнительных возможностей.</string>
|
||||
<string name="Intro7Message"><![CDATA[<b>Delta Chat</b>]]> безопасен для использования в бизнесе, основан на совместимых стандартах.</string>
|
||||
<string name="InviteMenuEntry">Отправить приглашение</string>
|
||||
<string name="InviteText">Я использую систему мгновенных сообщений Delta Chat - %1$s - вы тоже можете мне написать на %2$s</string>
|
||||
<string name="InviteMenuEntry">Отправить приглашения</string>
|
||||
<string name="InviteText">Я использую систему мгновенных сообщений Delta Chat - %1$s - вы можете написать мне на %2$s</string>
|
||||
<string name="AdvancedSettings">Расширенные настройки</string>
|
||||
<string name="AskResetNotifications" >Сбросить все настройки уведомлений и звуки этой страницы, а также ваших контактов и групп?</string>
|
||||
<string name="AttachFiles">Прикрепить файлы</string>
|
||||
<string name="ErrGroupNameEmpty">Введите название группы.</string>
|
||||
<string name="MsgNewGroupDraftHint">Напишите первое сообщение, чтобы другие могли отвечать в этой группе.\n\n• Это нормально, если не все участники используют Delta Chat.\n\n• Доставка первого сообщения может занять некоторое время.</string>
|
||||
<string name="MsgNewGroupDraftHint">Напишите первое сообщение, чтобы другие могли отвечать в этой группе.\n\n• Группа будет нормально общаться, даже если не все участники используют Delta Chat.\n\n• Доставка первого сообщения может занять некоторое время.</string>
|
||||
<string name="MsgNewGroupDraft">Привет! Я только что создал группу \"%1$s\" для нас.</string>
|
||||
<string name="MsgGroupNameChanged">Название группы изменено с \"%1$s\" в \"%2$s\".</string>
|
||||
<string name="MsgGroupImageChanged">Изображение группы изменено.</string>
|
||||
<string name="MsgMemberAddedToGroup">Участник %1$s добавлен.</string>
|
||||
<string name="MsgMemberRemovedFromToGroup">Участник %1$s удалён.</string>
|
||||
<string name="MsgMemberRemovedFromToGroup">Участник %1$s удален.</string>
|
||||
<string name="AskAddMemberToGroup">Добавить <![CDATA[<b>]]>%1$s<![CDATA[</b>]]> в группу?</string>
|
||||
<string name="AskRemoveMemberFromGroup">Удалить <![CDATA[<b>]]>%1$s<![CDATA[</b>]]> из группы?</string>
|
||||
<string name="ErrSelfNotInGroup">Чтобы выполнить это действие, вы должны быть участником группы.</string>
|
||||
<string name="MsgGroupLeft">Группа оставлена.</string>
|
||||
<string name="NoMessagesHint">Отправить сообщение <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>:\n\n• Это нормально если <![CDATA[<b>]]>%2$s<![CDATA[</b>]]> не используют Delta Chat.\n\n• Доставка первого сообщения может занять некоторое время.</string>
|
||||
<string name="SendNRcvReadReceipts">Получение и отправка уведомлений о доставке</string>
|
||||
<string name="PreferE2EEncryption">Предпочтение сквозному шифрованию</string>
|
||||
<string name="NoMessagesHint">Отправить сообщение <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>:\n\n• Общение будет возможным, даже если <![CDATA[<b>]]>%2$s<![CDATA[</b>]]> не используют Delta Chat.\n\n• Доставка первого сообщения может занять некоторое время.</string>
|
||||
<string name="SendNRcvReadReceipts">Получать и отправлять уведомления о доставке</string>
|
||||
<string name="PreferE2EEncryption">Предпочитать сквозное шифрование</string>
|
||||
<string name="E2EManagePrivateKeys">Управление закрытыми ключами</string>
|
||||
<string name="E2ECompareKeys">Сравнение ключей</string>
|
||||
<string name="ForwardToTitle">Переслать в …</string>
|
||||
<string name="ForwardToTitle">Переслать …</string>
|
||||
<string name="SelectContact">Выберите контакт</string>
|
||||
<string name="DoneHint">Готово.</string>
|
||||
<string name="FileNotFound">Файл %1$s не найден.</string>
|
||||
@@ -392,29 +392,38 @@
|
||||
<string name="NoNetwork">Сеть недоступна.</string>
|
||||
<string name="Audio">Аудио</string>
|
||||
<string name="PleaseCutVideoToMaxSize">Обрежьте видео до максимального размера в %1$s.</string>
|
||||
<string name="PermNotificationTitle">Связан с %1$s</string>
|
||||
<string name="PermNotificationText">Подключён…</string>
|
||||
<string name="PermNotificationTitle">Соединен с %1$s</string>
|
||||
<string name="PermNotificationText">Ожидание сообщений …</string>
|
||||
<string name="SettingsFor">Настройки для %1$s</string>
|
||||
<string name="AutoplayGifs">Автозапуск GIF</string>
|
||||
<string name="HelpUrl">https://delta.chat/en/help</string>
|
||||
<string name="EncryptedMessage">Зашифрованное сообщение</string>
|
||||
<string name="ImportFromDownloads">Импорт из \"Загрузки\"</string>
|
||||
<string name="ExportToDownloads">Экспорт из \"Загрузки\"</string>
|
||||
<string name="ImportPrivateKeysAsk">Импортировать приватные ключи из \"Загрузки\"?\n\n• Существующие ключи не удалены\n\n• Последний ключ будет использован как новый по умолчанию\n\nПродолжить?</string>
|
||||
<string name="Encryption">Шифрование</string>
|
||||
<string name="EncrinfoE2E">Включено сквозное шифрование.</string>
|
||||
<string name="EncrinfoE2EExplain">Если все отпечатки пальцев совпадают на другом устройстве, соединение безопасно.</string>
|
||||
<string name="EncrinfoTransport">Защищённая передача данных между узлами в сети по крайней мере до моего сервера.</string>
|
||||
<string name="EncrinfoNone">Нет шифрования до моего сервера.</string>
|
||||
<string name="EncrinfoNoE2EExplain">Сквозное шифрование включится автоматически, как только контакт начнёт использовать Delta Chat или другое приложение с поддержкой Autocrypt.</string>
|
||||
<string name="EncrinfoTransport">Защищенное соединение по крайней мере до моего сервера.</string>
|
||||
<string name="EncrinfoNone">Незащищенное соединение до моего сервера.</string>
|
||||
<string name="EncrinfoNoE2EExplain">Сквозное шифрование включится автоматически, как только контакт начнет использовать Delta Chat или другое приложение с поддержкой Autocrypt.</string>
|
||||
<string name="EncrinfoFingerprints">Отпечатки пальцев</string>
|
||||
<string name="Backup">Резервное копирование</string>
|
||||
<string name="ImportBackupExplain">Чтобы импортировать резервную копию, скопируйте ее в каталог «Загрузки» и переустановите приложение.</string>
|
||||
<string name="ReadReceiptMailBody">Это уведомление о получении сообщения \"%1$s\".\n\nОно подтверждает что сообщение было отображено на устройстве адресата. Однако это не означает что получатель прочитал его содержимое.</string>
|
||||
<string name="ReadReceipt">Уведомление о получении</string>
|
||||
<string name="ImportBackupExplain2">Для восстановления из резервной копии скопируйте резервную копию в <![CDATA[<i>]]>%1$s<![CDATA[</i>]]> и переустановите приложение.</string>
|
||||
<string name="ReadReceiptMailBody">Это уведомление о доставке сообщения \"%1$s\".\n\nОно подтверждает, что сообщение было отображено на устройстве адресата. Однако это не означает, что получатель прочитал его содержимое.</string>
|
||||
<string name="ReadReceipt">Уведомление о доставке</string>
|
||||
<string name="NameAndStatus">Имя и статус</string>
|
||||
<string name="MyStatus">Мой статус</string>
|
||||
<string name="MyStatusExplain">Статус указан в вашем профиле и нижнем колонтитуле эл.почты.</string>
|
||||
<string name="MyStatusExplain">Статус указан в вашем профиле и в нижней части письма эл.почты.</string>
|
||||
<string name="MsgGroupImageDeleted">Изображение группы удалено.</string>
|
||||
<string name="AskDeleteGroupImage">Вы действительно хотите удалить изображение группы?\n\nИзменение вступит в силу на всех устройствах участников группы.</string>
|
||||
<string name="ExportImportHeader">Экспорт и импорт</string>
|
||||
<string name="ImportExportExplain">Файлы экспорта будут содержать закрытые ключи! Храните их в защищенном месте или удалите их по первой возможности.</string>
|
||||
<string name="EnterPasswordToContinue">Введите пароль для %1$s, чтобы продолжить:</string>
|
||||
<string name="IncorrectPassword">Неверный пароль.</string>
|
||||
<string name="ImportBackupAsk">Delta Chat нашел резервную копию в <![CDATA[<i>]]>%1$s<![CDATA[</i>]]>.\n\nИмпортировать и использовать все данные и настройки из резервной копии?</string>
|
||||
<string name="ImportBackup">Восстановить из резервной копии</string>
|
||||
<string name="NoBackupFound">Резервная копия не найдена.\n\nСкопируйте резервную копию в <![CDATA[<i>]]>%1$s<![CDATA[</i>]]> и попробуйте снова. Иначе нажмите \"Начать обмен сообщениями\" для обычного процесса установки.</string>
|
||||
<string name="FilesSuccessfullyExported">Файлы успешно экспортированы в <![CDATA[<i>]]>%1$s<![CDATA[</i>]]>.</string>
|
||||
<string name="ExportBackup">Сохранить резервную копию</string>
|
||||
<string name="ExportPrivateKeys">Экспорт закрытых ключей</string>
|
||||
<string name="ImportPrivateKeys">Импорт закрытых ключей</string>
|
||||
<string name="ImportPrivateKeysAsk2">Импорт закрытых ключей из <![CDATA[<i>]]>%1$s<![CDATA[</i>]]>?\n\n• Существующие закрытые ключи удалены не будут\n\n• Последний импортированный ключ будет использован по умолчанию.</string>
|
||||
</resources>
|
||||
|
||||
@@ -36,10 +36,10 @@
|
||||
<!--chat view-->
|
||||
<string name="ChatGallery">Галерея</string>
|
||||
<string name="ChatCamera">Камера</string>
|
||||
<string name="NoMessages">Повідомлень не має.</string>
|
||||
<string name="NoMessages">Повідомлень немає.</string>
|
||||
<string name="ForwardedMessage">Переслане повідомлення</string>
|
||||
<string name="From">Від</string>
|
||||
<string name="NoRecent">Не має нових</string>
|
||||
<string name="NoRecent">Немає нових</string>
|
||||
<string name="TypeMessage">Повідомлення</string>
|
||||
<string name="SlideToCancel">КОВЗНІТЬ ДЛЯ СКАСУВАННЯ</string>
|
||||
<string name="SaveToDownloads">Зберегти до теки звантажень</string>
|
||||
@@ -51,7 +51,7 @@
|
||||
<string name="ShortcutAdded">Віджет був доданий до головного екрану</string>
|
||||
<!--notification-->
|
||||
<string name="Reply">Відповісти</string>
|
||||
<string name="ReplyToGroup">Відповісти групі %1$s</string>
|
||||
<string name="ReplyToGroup">Відповісти спільноті %1$s</string>
|
||||
<string name="ReplyToContact">Відповісти контактові %1$s</string>
|
||||
<!--contacts view-->
|
||||
<string name="NoContacts">Контакти відсутні</string>
|
||||
@@ -115,7 +115,7 @@
|
||||
<!--passcode view-->
|
||||
<string name="Passcode">Блокування кодом доступу</string>
|
||||
<string name="ChangePasscode">Змінити код доступу</string>
|
||||
<string name="ChangePasscodeInfo">По встановці додаткового коду доступу на сторінках розмов з\'явиться ікона блокування. Натисніть її, аби заблокувати/розблокувати застосунок.\n\nУвага: якщо ви забудете код доступу, ви муситимете видалити та перевстановити застосунок.</string>
|
||||
<string name="ChangePasscodeInfo">По встановці додаткового коду доступу, на сторінках розмов з\'явиться ікона блокування. Натисніть її, аби заблокувати/розблокувати застосунок.\n\nУвага: якщо ви забудете код доступу, ви муситимете видалити та перевстановити застосунок.</string>
|
||||
<string name="PasscodePIN">PIN</string>
|
||||
<string name="PasscodePassword">Гасло</string>
|
||||
<string name="EnterCurrentPasscode">Упишіть чинний код доступу</string>
|
||||
@@ -202,13 +202,13 @@
|
||||
<string name="AreYouSureBlockContact">Чи ви певні що хочете заблокувати цей контакт?</string>
|
||||
<string name="AreYouSureDeleteContact">Чи ви певні що хочете видалити цей контакт?</string>
|
||||
<!--permissions-->
|
||||
<string name="PermissionContacts">Аби можна було зв\'язатися з друзями на усіх пристроях, Delta Chat мусить мати доступ списку контактів.</string>
|
||||
<string name="PermissionContacts">Аби можна було зв\'язатися з друзями на усіх пристроях, Delta Chat мусить мати доступ до списку контактів.</string>
|
||||
<string name="PermissionStorage">Аби надсилати та зберігати світлини, відео, музику та інші мультимедія, Delta Chat мусить мати доступ до пам\'яті.</string>
|
||||
<string name="PermissionNoAudio">Аби надсилати голосові повідомлення, Delta Chat мусить мати доступ до мікрофону.</string>
|
||||
<string name="PermissionOpenSettings">Пристосувати налаштування</string>
|
||||
<!--Intro view-->
|
||||
<string name="Intro1Headline">Delta Chat</string>
|
||||
<string name="Intro1Message">Оповісник з <![CDATA[<b>найбільшим діапазоном</b>]]> у світі.<![CDATA[<br/><b>Даровий</b>]]> та <![CDATA[<b>безпечний</b>]]>.</string>
|
||||
<string name="Intro1Message">Оповісник з <![CDATA[<b>найбільшим діяпазоном</b>]]> у світі.<![CDATA[<br/><b>Безкоштовний</b>]]> та <![CDATA[<b>безпечний</b>]]>.</string>
|
||||
|
||||
<string name="Intro2Headline">Незалежний</string>
|
||||
<string name="Intro2Message"><![CDATA[<b>Незалежний</b>]]> від іноземних комп\'ютерів та послуг. Застосунок тільки використовує ваш email-сервер.</string>
|
||||
@@ -217,13 +217,13 @@
|
||||
<string name="Intro3Message"><![CDATA[<b>Push-повідомлення</b>]]> за секунди.<![CDATA[<br/>]]>Швидкий інтерфейс.</string>
|
||||
|
||||
<string name="Intro4Headline">Потужний</string>
|
||||
<string name="Intro4Message"><![CDATA[<b>Безмежні</b>]]> розмови, зображення, відео, звукових повідомлень та багато іншого. Підтримка не багатьох пристроях.</string>
|
||||
<string name="Intro4Message"><![CDATA[<b>Безмежні</b>]]> розмови, зображення, відео, звукові повідомлення та багато іншого. Мається підтримка на багатьох пристроях.</string>
|
||||
|
||||
<string name="Intro5Headline">Даровий</string>
|
||||
<string name="Intro5Message"><![CDATA[<b>Delta Chat</b>]]> даровий назавше.<![CDATA[<br/>]]>Open-source. Без реклам. Без передплат. Без залежності від поставників послуг.</string>
|
||||
<string name="Intro5Headline">Безкоштовний</string>
|
||||
<string name="Intro5Message"><![CDATA[<b>Delta Chat</b>]]> безкоштовний назавше.<![CDATA[<br/>]]>Open-source. Без реклам. Без передплат. Без залежності від сторонніх поставників послуг.</string>
|
||||
|
||||
<string name="Intro6Headline">Безпечний</string>
|
||||
<string name="Intro6Message"><![CDATA[<b>Зашифровано</b>]]> всіма відомими алґоритмами. Повідомлення залишаються на ваших серверах.</string>
|
||||
<string name="Intro6Message"><![CDATA[<b>Зашифровано</b>]]> відомими алґоритмами. Повідомлення залишаються на ваших серверах.</string>
|
||||
|
||||
<string name="Intro7Headline">Заслуговує на довіру</string>
|
||||
|
||||
@@ -311,22 +311,22 @@
|
||||
<string name="formatDateAtTime">%1$sо%2$s</string>
|
||||
<string name="AccountSettings">Налаштування обліківки</string>
|
||||
<string name="MyAccount">Моя обліківка</string>
|
||||
<string name="MyName">Моя назва</string>
|
||||
<string name="MyNameExplain">Назва, яка показується отримувачам. Якщо ви не впишете назву, вони отримають лише вашу адресу email.</string>
|
||||
<string name="MyName">Моє псевдо</string>
|
||||
<string name="MyNameExplain">Ваше псевдо, яке показуватиметься отримувачам. Якщо ви не впишете псевдонім, вони отримають лише вашу адресу email.</string>
|
||||
<string name="Password">Гасло</string>
|
||||
<string name="SmtpPassword">SMTP гасло</string>
|
||||
<string name="FromAbove">Згори</string>
|
||||
<string name="SmtpLoginname">SMTP назва користувача</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="ImapLoginname">IMAP псевдонім користувача</string>
|
||||
<string name="SmtpServer">SMTP сервер</string>
|
||||
<string name="ImapPort">IMAP порт</string>
|
||||
<string name="InboxHeadline">Скринька для вхідних</string>
|
||||
<string name="OutboxHeadline">Скринька для вихідних</string>
|
||||
<string name="MyAccountExplain">Для відомих email-поставників, додаткові налаштування обираються автоматично.</string>
|
||||
<string name="MyAccountExplain2" >Інколи, <![CDATA[<b>]]>IMAP має бути увімкненим<![CDATA[</b>]]> у верстці email.\n\nУ разі виникнення проблем, спитайте поради у вашого email-поставника або друзів.</string>
|
||||
<string name="MyAccountExplain2" >Інколи, <![CDATA[<b>]]>IMAP має бути ввімкненим<![CDATA[</b>]]> у верстці email.\n\nУ разі виникнення проблем, спитайте поради у вашого email-поставника або друзів.</string>
|
||||
<string name="AccountNotConfigured">Обліківка не налаштована</string>
|
||||
<string name="AboutThisProgram">Про оповісник</string>
|
||||
<string name="NotSet">Не встановлено</string>
|
||||
@@ -337,8 +337,8 @@
|
||||
<string name="AskStartChatWith">Почати розмову з <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>?</string>
|
||||
<string name="DeaddropHint">Аби почати розмову, клацніть на стрілки відповіді.</string>
|
||||
<string name="NotYetImplemented">Ця функція є недоступною або незавершеною.</string>
|
||||
<string name="DefaultStatusText">Надіслано за допомогою оповісника Delta Chat. Прошу вибачення за стислий текст.</string>
|
||||
<string name="Name" >Назва</string>
|
||||
<string name="DefaultStatusText">Надіслано за допомогою оповісника Delta Chat: https://delta.chat</string>
|
||||
<string name="Name" >Псевдо</string>
|
||||
<string name="EmailAddress">Адреса e-mail</string>
|
||||
<string name="CannotDeleteContact">Не можливо видалити уживані контакти, заблокуйте їх натомість.</string>
|
||||
<string name="BadEmailAddress">Хибна адреса e-mail</string>
|
||||
@@ -348,11 +348,11 @@
|
||||
the string needed for video time+size (0:00, 12,3 Mib) -->
|
||||
<string name="OneMoment">Зачекайте...</string>
|
||||
<string name="NoChatsHelp">Почніть листування за натиском ґудзика нових розмов у верхньому правому кутку. Аби отримати більше можливостей, натисніть на ґудзик меню.</string>
|
||||
<string name="Intro7Message"><![CDATA[<b>Delta Chat]</b>]> безпечний для бізнесових застосувань, підлаштовний та відповідає всім стандартам.</string>
|
||||
<string name="Intro7Message"><![CDATA[<b>Delta Chat</b>]]> безпечний для бізнесових застосувань, підлаштовний та відповідає всім сучасним стандартам.</string>
|
||||
<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>
|
||||
@@ -366,7 +366,7 @@
|
||||
<string name="ErrSelfNotInGroup">Щоби виконати дію, ви мусите бути учасником цієї спільноти.</string>
|
||||
<string name="MsgGroupLeft">Ви полишили спільноту.</string>
|
||||
<string name="NoMessagesHint">Надіслати повідомлення до <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>:\n\n• Нічого страшного, якщо <![CDATA[<b>]]>%2$s<![CDATA[</b>]]> не користується Delta Chatом.\n\n• Доставлення першого повідомлення відбере лише мить.</string>
|
||||
<string name="SendNRcvReadReceipts">Одержуйте та відправляйте звіти про доставлення</string>
|
||||
<string name="SendNRcvReadReceipts">Одержуйте та надсилайте звіти про доставлення</string>
|
||||
<string name="PreferE2EEncryption">Надати перевагу повному шифруванню</string>
|
||||
<string name="E2EManagePrivateKeys">Управління особистими ключами</string>
|
||||
<string name="E2ECompareKeys">Порівняти ключі</string>
|
||||
@@ -384,9 +384,6 @@
|
||||
<string name="AutoplayGifs">А́втопрогравання GIFів</string>
|
||||
<string name="HelpUrl">https://delta.chat/en/help</string>
|
||||
<string name="EncryptedMessage">Зашифроване повідомлення</string>
|
||||
<string name="ImportFromDownloads">Затягти з теки звантажень.</string>
|
||||
<string name="ExportToDownloads">Витягти з теки звантажень.</string>
|
||||
<string name="ImportPrivateKeysAsk">Затягти особисті ключі з теки завантажень?\n\n• Чинні особисті ключі не були видалені\n\n• Найостатніший затягнений ключ буде використовуватись як типовий\n\nПродовжити?</string>
|
||||
<string name="Encryption">Шифрування</string>
|
||||
<string name="EncrinfoE2E">Повне шифрування було ввімкнено.</string>
|
||||
<string name="EncrinfoE2EExplain">Якщо відбитки пальців збігаються на іншому пристрої, підключення є безпечним.</string>
|
||||
@@ -395,12 +392,14 @@
|
||||
<string name="EncrinfoNoE2EExplain">Шифрування стане повним відразу ж, як контакт почне користуватися Delta Chat або іншим автошифрувальним застосунком.</string>
|
||||
<string name="EncrinfoFingerprints">Відбитки пальців</string>
|
||||
<string name="Backup">Backup</string>
|
||||
<string name="ImportBackupExplain">Аби імпортувати backup, сколіть backup до теки звантажень та перевстановіть застосунок.</string>
|
||||
<string name="ReadReceiptMailBody">Це звіт про доставлення до повідомлення \"%1$s\".\n\nЦей звіт лиш інформує про те, що повідомлення було показано на пристрої отримувача. Не має ніяких гарантій того, що отримувач прочитав уміст.</string>
|
||||
<string name="ReadReceipt">Звіт про доставлення.</string>
|
||||
<string name="NameAndStatus">Назва та стан</string>
|
||||
<string name="NameAndStatus">Псевдо та стан</string>
|
||||
<string name="MyStatus">Стан</string>
|
||||
<string name="MyStatusExplain">Стан висвітлюється у вашому профілю та у стовпці email.</string>
|
||||
<string name="MsgGroupImageDeleted">Зображення спільноти було видалено.</string>
|
||||
<string name="AskDeleteGroupImage">Чи ви певні, що хочете видалити зображення спільноти?\n\nЦе матиме вплив на пристрої усіх її учасників. </string>
|
||||
</resources>
|
||||
<string name="ExportImportHeader">Витягнене та затягнене</string>
|
||||
<string name="EnterPasswordToContinue">Унесіть гасло для%1$sаби продовжити:</string>
|
||||
<string name="IncorrectPassword">Помилкове гасло.</string>
|
||||
</resources>
|
||||
|
||||
@@ -329,7 +329,7 @@
|
||||
<string name="AskStartChatWith">Start a chat with <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>?</string>
|
||||
<string name="DeaddropHint">To start a chat, click on the reply-arrows.</string>
|
||||
<string name="NotYetImplemented">This function is not available or incomplete.</string>
|
||||
<string name="DefaultStatusText">Sent with my Delta Chat Messenger. Please excuse my brevity.</string>
|
||||
<string name="DefaultStatusText">Sent with my Delta Chat Messenger: https://delta.chat</string>
|
||||
<string name="Name" >Name</string>
|
||||
<string name="EmailAddress">Email address</string>
|
||||
<string name="CannotDeleteContact">Cannot delete contacts in use, block contact instead.</string>
|
||||
@@ -376,9 +376,6 @@
|
||||
<string name="AutoplayGifs">Autoplay GIFs</string>
|
||||
<string name="HelpUrl">https://delta.chat/en/help</string>
|
||||
<string name="EncryptedMessage">Encrypted message</string>
|
||||
<string name="ImportFromDownloads">Import from \"Downloads\"</string>
|
||||
<string name="ExportToDownloads">Export to \"Downloads\"</string>
|
||||
<string name="ImportPrivateKeysAsk">Import private keys from \"Downloads\"?\n\n• Existing private keys are not deleted\n\n• The last imported key will be used as the new default key\n\nContinue?</string>
|
||||
<string name="Encryption">Encryption</string>
|
||||
<string name="EncrinfoE2E">End-to-end encryption enabled.</string>
|
||||
<string name="EncrinfoE2EExplain">If all fingerprints match on the other device, the connection is safe.</string>
|
||||
@@ -387,7 +384,7 @@
|
||||
<string name="EncrinfoNoE2EExplain">Encryption will switch to end-to-end automatically as soon as the contact uses Delta Chat or another Autocrypt-enabled app.</string>
|
||||
<string name="EncrinfoFingerprints">Fingerprints</string>
|
||||
<string name="Backup">Backup</string>
|
||||
<string name="ImportBackupExplain">To import a backup, copy to the backup to the \"Downloads\" directory and reinstall the app.</string>
|
||||
<string name="ImportBackupExplain2">To import a backup, copy a backup to <![CDATA[<i>]]>%1$s<![CDATA[</i>]]> and reinstall the app.</string>
|
||||
<string name="ReadReceiptMailBody">This is a return receipt for the message \"%1$s\".\n\nThis return receipt only acknowledges that the message was displayed on the recipient\'s device. There is no guarantee that the recipient has read the message contents.</string>
|
||||
<string name="ReadReceipt">Return receipt</string>
|
||||
<string name="NameAndStatus">Name and status</string>
|
||||
@@ -395,4 +392,16 @@
|
||||
<string name="MyStatusExplain">The status is shown in your profile and in email footers.</string>
|
||||
<string name="MsgGroupImageDeleted">Group image deleted.</string>
|
||||
<string name="AskDeleteGroupImage">Are you sure to delete the group image?\n\nThis will affect all devices of all group members.</string>
|
||||
<string name="ExportImportHeader">Export and import</string>
|
||||
<string name="ImportExportExplain">Exported files will contain private keys! Keep them in a safe place or delete them as soon as possible.</string>
|
||||
<string name="EnterPasswordToContinue">Enter the password for %1$s to continue:</string>
|
||||
<string name="IncorrectPassword">Incorrect password.</string>
|
||||
<string name="ImportBackupAsk">Delta Chat has found a backup at <![CDATA[<i>]]>%1$s<![CDATA[</i>]]>.\n\nDo you want to import and use all data and settings from this backup?</string>
|
||||
<string name="ImportBackup">Import backup</string>
|
||||
<string name="NoBackupFound">No backup to import found.\n\nCopy the backup to <![CDATA[<i>]]>%1$s<![CDATA[</i>]]> and try again. Alternatively, hit \"Start messaging\" for a normal setup process.</string>
|
||||
<string name="FilesSuccessfullyExported">Files successfully exported to <![CDATA[<i>]]>%1$s<![CDATA[</i>]]>.</string>
|
||||
<string name="ExportBackup">Export backup</string>
|
||||
<string name="ExportPrivateKeys">Export private keys</string>
|
||||
<string name="ImportPrivateKeys">Import private keys</string>
|
||||
<string name="ImportPrivateKeysAsk2">Import private keys from <![CDATA[<i>]]>%1$s<![CDATA[</i>]]>?\n\n• Existing private keys are not deleted\n\n• The last imported key will be used as the new default key</string>
|
||||
</resources>
|
||||
|
||||
@@ -7,21 +7,67 @@ For ready-to-use binaries, please go to https://delta.chat .
|
||||
|
||||

|
||||
|
||||
<a href="https://f-droid.org/packages/com.b44t.messenger/" target="_blank">
|
||||
<img src="https://f-droid.org/badge/get-it-on.png" alt="Get it on F-Droid" height="90"/></a>
|
||||
[<img src="https://f-droid.org/badge/get-it-on.png" alt="Get it on F-Droid" height="75"/>](https://f-droid.org/packages/com.b44t.messenger)
|
||||
|
||||
|
||||
Build
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
If the core library (https://github.com/deltachat/deltachat-core) is not checked
|
||||
out together with this deltachat-android, you must check out it manually using
|
||||
`git submodule update --init --recursive` for this purpose. There is no need to
|
||||
build the core library itself, deltachat-android just references them.
|
||||
When checking out _deltachat-android_, make sure also to check out the
|
||||
subproject _deltachat-core_:
|
||||
|
||||
After that, call `ndk-build` in the `MessengerProj` directory to build the C-part
|
||||
and run the project in Android Atudio.
|
||||
- When using Git, you can can do this initially by
|
||||
`$ git clone --recursive https://github.com/deltachat/deltachat-android.git`
|
||||
or later by `git submodule update --init --recursive`.
|
||||
|
||||
With chance, that's it :)
|
||||
- Alternatively, you can download the [deltachat-android zip-file](https://github.com/deltachat/deltachat-android/archive/master.zip); in this case, also download the [deltachat-core zip-file](https://github.com/deltachat/deltachat-core/archive/master.zip) and place its contents to `MessengerProj/jni/messenger-backend`
|
||||
|
||||
There is no need to build the core library itself, deltachat-android just
|
||||
references them.
|
||||
|
||||
Then, call `ndk-build` in the `MessengerProj` directory to build the C-part
|
||||
and run the project in Android Studio. The project required API 25.
|
||||
|
||||
With chance, that's it :) - if not, read on how to setup a proper development
|
||||
environment.
|
||||
|
||||
|
||||
Install Development Environment
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
1. Some libs required for Android Studio may be missing on 64 bit linux machines
|
||||
[[Source](https://developer.android.com/studio/install.html)], so for Ubuntu execute
|
||||
`$ sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386 lib32z1 libbz2-1.0:i386`
|
||||
and for Fedora execute
|
||||
`$ sudo yum install zlib.i686 ncurses-libs.i686 bzip2-libs.i686`
|
||||
|
||||
2. Download Android Studio from <https://developer.android.com> (android-studio-ide-...-linux.zip)
|
||||
and unzip the archive which contains a single folder called `android-studio`;
|
||||
move this folder eg. to `~/android-studio`
|
||||
|
||||
3. To launch Android Studio for the first time, open a terminal, navigate to
|
||||
`~/android-studio/bin` and execute `studio.sh` and use all standard values
|
||||
from the wizard
|
||||
|
||||
4. Android Studio now ask you if you want to download an existing project;
|
||||
choose `~/deltachat-android` as created in step 1 (Android Studio starts to
|
||||
build the project, however, there are some steps missing before this will
|
||||
succeed)
|
||||
|
||||
5. As Delta Chat uses API 25 for some reasons, go to "Tools / Android /
|
||||
SDK Manager / SDK Platforms" and enable "Nougat 7.1.1 (API 25)" -
|
||||
now the build should succeed - but the app still misses the native part
|
||||
|
||||
6. Download Android NDK from <https://developer.android.com/ndk/downloads/> (eg. android-ndk-r15c-linux-x86_64.zip)
|
||||
and unzip the archive which contains a single folder called eg.
|
||||
`android-ndk-r15c`; move this folder eg. to `~/android-ndk-r15c`
|
||||
|
||||
7. Export the folder path to your environment as ANDROID_NDK and add it to PATH.
|
||||
You can archive this eg. by adding the following lines to `.bashrc`
|
||||
`export ANDROID_NDK=/home/bpetersen/android-ndk-r15c`
|
||||
`export PATH=$PATH:$ANDROID_NDK`
|
||||
|
||||
The last two steps may be replaced by using the new Android Studio NDK options, however, up to now, we did not found any time to do so.
|
||||
|
||||
---
|
||||
|
||||
|
||||
+1
-1
@@ -5,6 +5,6 @@ buildscript {
|
||||
mavenCentral()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:2.3.1'
|
||||
classpath 'com.android.tools.build:gradle:2.3.3'
|
||||
}
|
||||
}
|
||||
|
||||
+10
-7
@@ -1,6 +1,7 @@
|
||||
|
||||
# this script updates the messenger-backend subfile from github;
|
||||
# make sure, messenger-backend is committed successfull before calling this script
|
||||
# this script updates the deltachat-core sub-repository from github
|
||||
# - make sure, deltachat-core is committed successfull before calling this script
|
||||
# - the script assumes, deltachat-core is placed in the same directory as deltachat-android
|
||||
|
||||
# remove links to the files
|
||||
rm -r MessengerProj/jni/messenger-backend/*
|
||||
@@ -18,11 +19,13 @@ git pull
|
||||
cd ../../..
|
||||
git commit -am "Update messenger-backend submodule."
|
||||
|
||||
# re-link all files
|
||||
# remove files downloaded just for committing
|
||||
rm -r MessengerProj/jni/messenger-backend/*
|
||||
rm -r MessengerProj/jni/messenger-backend/.??*
|
||||
mkdir MessengerProj/jni/messenger-backend/src
|
||||
cp -al ../deltachat-core/src MessengerProj/jni/messenger-backend/
|
||||
mkdir MessengerProj/jni/messenger-backend/libs
|
||||
cp -al ../deltachat-core/libs MessengerProj/jni/messenger-backend/
|
||||
|
||||
# re-link all files (symbolic links may contain arbitrary text, so no relative paths, please)
|
||||
cd ..
|
||||
ln --symbolic `pwd`/deltachat-core/src deltachat-android/MessengerProj/jni/messenger-backend/src
|
||||
ln --symbolic `pwd`/deltachat-core/libs deltachat-android/MessengerProj/jni/messenger-backend/libs
|
||||
cd deltachat-android
|
||||
|
||||
|
||||
Reference in New Issue
Block a user