diff --git a/CHANGELOG.md b/CHANGELOG.md
index ba033b250..294eebc4e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,7 @@
## UNRELEASED
+* Add a function to create a full backup of all data
* Update Polish translation
## v0.9.1
diff --git a/MessengerProj/build.gradle b/MessengerProj/build.gradle
index 6a68178b8..2e8b6ca15 100644
--- a/MessengerProj/build.gradle
+++ b/MessengerProj/build.gradle
@@ -76,7 +76,7 @@ android {
}
}
- defaultConfig.versionCode = 40
+ defaultConfig.versionCode = 41
sourceSets.main {
jniLibs.srcDir 'libs'
@@ -118,6 +118,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.1" // do NOT forget to increase defaultConfig.versionCode!
+ versionName "0.9.2" // do NOT forget to increase defaultConfig.versionCode!
}
}
diff --git a/MessengerProj/src/main/java/com/b44t/messenger/MrMailbox.java b/MessengerProj/src/main/java/com/b44t/messenger/MrMailbox.java
index 4989a318a..6b817b270 100644
--- a/MessengerProj/src/main/java/com/b44t/messenger/MrMailbox.java
+++ b/MessengerProj/src/main/java/com/b44t/messenger/MrMailbox.java
@@ -192,6 +192,8 @@ 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_IS_ONLINE = 2080;
@@ -227,6 +229,24 @@ public class MrMailbox {
});
return 0;
+ case MR_EVENT_EXPORT_ENDED:
+ AndroidUtilities.runOnUIThread(new Runnable() {
+ @Override
+ public void run() {
+ NotificationCenter.getInstance().postNotificationName(NotificationCenter.exportEnded, (int)data1);
+ }
+ });
+ return 0;
+
+ case MR_EVENT_EXPORT_PROGRESS:
+ AndroidUtilities.runOnUIThread(new Runnable() {
+ @Override
+ public void run() {
+ NotificationCenter.getInstance().postNotificationName(NotificationCenter.exportProgress, (int)data1);
+ }
+ });
+ return 0;
+
case MR_EVENT_EXPORT_FILE_WRITTEN: {
final String file_name = CPtr2String(data1);
final String file_mime = CPtr2String(data2);
diff --git a/MessengerProj/src/main/java/com/b44t/messenger/NotificationCenter.java b/MessengerProj/src/main/java/com/b44t/messenger/NotificationCenter.java
index 4a2f77271..15b91f1cc 100644
--- a/MessengerProj/src/main/java/com/b44t/messenger/NotificationCenter.java
+++ b/MessengerProj/src/main/java/com/b44t/messenger/NotificationCenter.java
@@ -33,6 +33,8 @@ 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 didReceivedNewMessages = totalEvents++;
public static final int updateInterfaces = totalEvents++;
public static final int dialogsNeedReload = totalEvents++;
diff --git a/MessengerProj/src/main/java/com/b44t/ui/SettingsAccountActivity.java b/MessengerProj/src/main/java/com/b44t/ui/SettingsAccountActivity.java
index c07d102b4..0d6494f32 100644
--- a/MessengerProj/src/main/java/com/b44t/ui/SettingsAccountActivity.java
+++ b/MessengerProj/src/main/java/com/b44t/ui/SettingsAccountActivity.java
@@ -54,8 +54,6 @@ import com.b44t.ui.Cells.TextInfoCell;
import com.b44t.ui.Cells.TextSettingsCell;
import com.b44t.ui.Components.LayoutHelper;
-import static android.app.ProgressDialog.STYLE_HORIZONTAL;
-
public class SettingsAccountActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate {
diff --git a/MessengerProj/src/main/java/com/b44t/ui/SettingsAdvActivity.java b/MessengerProj/src/main/java/com/b44t/ui/SettingsAdvActivity.java
index 7cdb9febb..cdd09025d 100644
--- a/MessengerProj/src/main/java/com/b44t/ui/SettingsAdvActivity.java
+++ b/MessengerProj/src/main/java/com/b44t/ui/SettingsAdvActivity.java
@@ -25,6 +25,7 @@ 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.SharedPreferences;
@@ -37,13 +38,13 @@ import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.FrameLayout;
import android.widget.ListView;
-import android.widget.Toast;
import com.b44t.messenger.AndroidUtilities;
import com.b44t.messenger.MediaController;
import com.b44t.messenger.ApplicationLoader;
import com.b44t.messenger.MrChat;
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.ShadowSectionCell;
@@ -56,7 +57,7 @@ import com.b44t.ui.Components.LayoutHelper;
import java.io.File;
-public class SettingsAdvActivity extends BaseFragment {
+public class SettingsAdvActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate {
// the list
private int directShareRow, cacheRow, raiseToSpeakRow, sendByEnterRow, autoplayGifsRow, showUnknownSendersRow, finalShadowRow;
@@ -83,6 +84,9 @@ public class SettingsAdvActivity extends BaseFragment {
public boolean onFragmentCreate() {
super.onFragmentCreate();
+ NotificationCenter.getInstance().addObserver(this, NotificationCenter.exportEnded);
+ NotificationCenter.getInstance().addObserver(this, NotificationCenter.exportProgress);
+
rowCount = 0;
accountSettingsRow = rowCount++;
if (Build.VERSION.SDK_INT >= 23) {
@@ -104,6 +108,13 @@ public class SettingsAdvActivity extends BaseFragment {
return true;
}
+ @Override
+ public void onFragmentDestroy() {
+ super.onFragmentDestroy();
+ NotificationCenter.getInstance().removeObserver(this, NotificationCenter.exportEnded);
+ NotificationCenter.getInstance().removeObserver(this, NotificationCenter.exportProgress);
+ }
+
@Override
public View createView(Context context)
{
@@ -231,14 +242,7 @@ public class SettingsAdvActivity extends BaseFragment {
showDialog(builder2.create());
}
else /*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;
- }
- File downloadsDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
- downloadsDir.mkdirs();
- MrMailbox.exportStuff(MrMailbox.MR_IMEX_SELF_KEYS, downloadsDir.getAbsolutePath());
- AndroidUtilities.showDoneHint(ApplicationLoader.applicationContext);
+ startExport(MrMailbox.MR_IMEX_SELF_KEYS);
}
}
}
@@ -247,7 +251,7 @@ public class SettingsAdvActivity extends BaseFragment {
}
else if( i == backupRow )
{
- Toast.makeText(getParentActivity(), ApplicationLoader.applicationContext.getString(R.string.NotYetImplemented), Toast.LENGTH_SHORT).show();
+ startExport(MrMailbox.MR_EXPORT_BACKUP);
}
}
});
@@ -255,6 +259,75 @@ public class SettingsAdvActivity extends BaseFragment {
return fragmentView;
}
+ private ProgressDialog progressDialog = null;
+
+ private void startExport(int what)
+ {
+ 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;
+ }
+
+ if( progressDialog!=null ) {
+ progressDialog.dismiss();
+ progressDialog = null;
+ }
+
+ progressDialog = new ProgressDialog(getParentActivity());
+ progressDialog.setMessage(ApplicationLoader.applicationContext.getString(R.string.OneMoment));
+ progressDialog.setCanceledOnTouchOutside(false);
+ progressDialog.setCancelable(false);
+ progressDialog.show();
+
+ synchronized (MrMailbox.m_lastErrorLock) {
+ MrMailbox.m_showNextErrorAsToast = false;
+ MrMailbox.m_lastErrorString = "";
+ }
+
+ File downloadsDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
+ downloadsDir.mkdirs();
+ MrMailbox.exportStuff(what, downloadsDir.getAbsolutePath());
+ }
+
+ @Override
+ public void didReceivedNotification(int id, Object... args) {
+ if( id==NotificationCenter.exportProgress ) {
+ if( progressDialog!=null ) {
+ // we want the spinner together with a progress info
+ int percent = (Integer)args[0];
+ progressDialog.setMessage(ApplicationLoader.applicationContext.getString(R.string.OneMoment)+String.format(" %d%%", percent));
+ }
+ }
+ else if( id==NotificationCenter.exportEnded ) {
+ 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 ) {
+ AndroidUtilities.showDoneHint(ApplicationLoader.applicationContext);
+ }
+ else {
+ AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
+ builder.setMessage(errorString.isEmpty()? "Export error." : errorString);
+ builder.setPositiveButton(ApplicationLoader.applicationContext.getString(R.string.OK), new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialogInterface, int i) {
+ ;
+ }
+ });
+ showDialog(builder.create());
+ }
+ }
+ }
+
private class ListAdapter extends BaseFragmentAdapter {
private Context mContext;
diff --git a/MessengerProj/src/main/res/values-de/strings.xml b/MessengerProj/src/main/res/values-de/strings.xml
index f574caf31..bbab6917d 100644
--- a/MessengerProj/src/main/res/values-de/strings.xml
+++ b/MessengerProj/src/main/res/values-de/strings.xml
@@ -386,7 +386,7 @@
Aus \"Downloads\" importieren
Nach \"Downloads\" exportieren
- 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\n• Fortfahren?
+ 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?
- %d Schlüssel importiert
- %d Schlüssel importiert