From dd8474cecf66a7f2c55a5ef918f50601dc083d11 Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Tue, 6 Jun 2017 13:42:16 +0200 Subject: [PATCH] Add backup export function. --- CHANGELOG.md | 1 + MessengerProj/build.gradle | 4 +- .../java/com/b44t/messenger/MrMailbox.java | 20 ++++ .../b44t/messenger/NotificationCenter.java | 2 + .../com/b44t/ui/SettingsAccountActivity.java | 2 - .../java/com/b44t/ui/SettingsAdvActivity.java | 95 ++++++++++++++++--- .../src/main/res/values-de/strings.xml | 2 +- 7 files changed, 110 insertions(+), 16 deletions(-) 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