summaryrefslogtreecommitdiffstats
path: root/app/src/main/java/app/fedilab/android
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java/app/fedilab/android')
-rw-r--r--app/src/main/java/app/fedilab/android/activities/BaseActivity.java9
-rw-r--r--app/src/main/java/app/fedilab/android/activities/BaseBarActivity.java9
-rw-r--r--app/src/main/java/app/fedilab/android/activities/BaseTransparentActivity.java9
-rw-r--r--app/src/main/java/app/fedilab/android/activities/LoginActivity.java20
-rw-r--r--app/src/main/java/app/fedilab/android/activities/MastodonListActivity.java4
-rw-r--r--app/src/main/java/app/fedilab/android/client/entities/app/MutedAccounts.java1
-rw-r--r--app/src/main/java/app/fedilab/android/helper/Helper.java50
-rw-r--r--app/src/main/java/app/fedilab/android/helper/SettingsStorage.java134
-rw-r--r--app/src/main/java/app/fedilab/android/helper/TimelineHelper.java7
-rw-r--r--app/src/main/java/app/fedilab/android/helper/ZipHelper.java294
-rw-r--r--app/src/main/java/app/fedilab/android/ui/drawer/StatusAdapter.java6
-rw-r--r--app/src/main/java/app/fedilab/android/ui/fragment/login/FragmentLoginMain.java74
-rw-r--r--app/src/main/java/app/fedilab/android/ui/fragment/settings/FragmentSettingsCategories.java35
-rw-r--r--app/src/main/java/app/fedilab/android/viewmodel/mastodon/AccountsVM.java27
14 files changed, 477 insertions, 202 deletions
diff --git a/app/src/main/java/app/fedilab/android/activities/BaseActivity.java b/app/src/main/java/app/fedilab/android/activities/BaseActivity.java
index e7ba4af89..2f2b870f8 100644
--- a/app/src/main/java/app/fedilab/android/activities/BaseActivity.java
+++ b/app/src/main/java/app/fedilab/android/activities/BaseActivity.java
@@ -19,11 +19,8 @@ import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Configuration;
-import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
-import android.view.Window;
-import android.view.WindowManager;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
@@ -84,9 +81,6 @@ public class BaseActivity extends AppCompatActivity {
break;
case "BLACK":
setTheme(R.style.BlackAppTheme);
- Window window = getWindow();
- window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
- window.setStatusBarColor(Color.BLACK);
currentThemeId = R.style.BlackAppTheme;
break;
case "DRACULA":
@@ -121,9 +115,6 @@ public class BaseActivity extends AppCompatActivity {
case "BLACK":
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
setTheme(R.style.BlackAppTheme);
- Window window = getWindow();
- window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
- window.setStatusBarColor(Color.BLACK);
currentThemeId = R.style.BlackAppTheme;
break;
case "DRACULA":
diff --git a/app/src/main/java/app/fedilab/android/activities/BaseBarActivity.java b/app/src/main/java/app/fedilab/android/activities/BaseBarActivity.java
index 2776d2ec2..e8f0111e4 100644
--- a/app/src/main/java/app/fedilab/android/activities/BaseBarActivity.java
+++ b/app/src/main/java/app/fedilab/android/activities/BaseBarActivity.java
@@ -19,11 +19,8 @@ import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Configuration;
-import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
-import android.view.Window;
-import android.view.WindowManager;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
@@ -76,9 +73,6 @@ public class BaseBarActivity extends AppCompatActivity {
setTheme(R.style.SolarizedAppThemeBar);
break;
case "BLACK":
- Window window = getWindow();
- window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
- window.setStatusBarColor(Color.BLACK);
setTheme(R.style.BlackAppThemeBar);
break;
case "DRACULA":
@@ -108,9 +102,6 @@ public class BaseBarActivity extends AppCompatActivity {
break;
case "BLACK":
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
- Window window = getWindow();
- window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
- window.setStatusBarColor(Color.BLACK);
setTheme(R.style.BlackAppThemeBar);
break;
case "DRACULA":
diff --git a/app/src/main/java/app/fedilab/android/activities/BaseTransparentActivity.java b/app/src/main/java/app/fedilab/android/activities/BaseTransparentActivity.java
index 0f2668649..77f2df730 100644
--- a/app/src/main/java/app/fedilab/android/activities/BaseTransparentActivity.java
+++ b/app/src/main/java/app/fedilab/android/activities/BaseTransparentActivity.java
@@ -19,11 +19,8 @@ import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Configuration;
-import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
-import android.view.Window;
-import android.view.WindowManager;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
@@ -76,9 +73,6 @@ public class BaseTransparentActivity extends AppCompatActivity {
setTheme(R.style.TransparentSolarized);
break;
case "BLACK":
- Window window = getWindow();
- window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
- window.setStatusBarColor(Color.BLACK);
setTheme(R.style.TransparentBlack);
break;
case "DRACULA":
@@ -108,9 +102,6 @@ public class BaseTransparentActivity extends AppCompatActivity {
break;
case "BLACK":
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
- Window window = getWindow();
- window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
- window.setStatusBarColor(Color.BLACK);
setTheme(R.style.TransparentBlack);
break;
case "DRACULA":
diff --git a/app/src/main/java/app/fedilab/android/activities/LoginActivity.java b/app/src/main/java/app/fedilab/android/activities/LoginActivity.java
index 4b91601b3..0262a8366 100644
--- a/app/src/main/java/app/fedilab/android/activities/LoginActivity.java
+++ b/app/src/main/java/app/fedilab/android/activities/LoginActivity.java
@@ -54,9 +54,9 @@ public class LoginActivity extends BaseActivity {
public static Account.API apiLogin;
public static String currentInstanceLogin, client_idLogin, client_secretLogin, softwareLogin;
- private final int PICK_IMPORT = 5557;
public static boolean requestedAdmin;
+
@SuppressLint("ApplySharedPref")
public void proceedLogin(Activity activity, Account account) {
new Thread(() -> {
@@ -154,6 +154,8 @@ public class LoginActivity extends BaseActivity {
//The activity handles a redirect URI, it will extract token code and will proceed to authentication
//That happens when the user wants to use an external browser
manageItent(getIntent());
+
+
}
@@ -176,7 +178,6 @@ public class LoginActivity extends BaseActivity {
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
-
if (id == R.id.action_proxy) {
Intent intent = new Intent(LoginActivity.this, ProxyActivity.class);
startActivity(intent);
@@ -188,20 +189,5 @@ public class LoginActivity extends BaseActivity {
return super.onOptionsItemSelected(item);
}
- @Override
- protected void onActivityResult(int requestCode, int resultCode,
- Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
- if (requestCode == PICK_IMPORT && resultCode == RESULT_OK) {
- if (data == null || data.getData() == null) {
- Toasty.error(LoginActivity.this, getString(R.string.toot_select_file_error), Toast.LENGTH_LONG).show();
- return;
- }
- // String filename = Helper.getFilePathFromURI(LoginActivity.this, data.getData());
- // Sqlite.importDB(LoginActivity.this, filename);
- } else {
- Toasty.error(LoginActivity.this, getString(R.string.toot_select_file_error), Toast.LENGTH_LONG).show();
- }
- }
} \ No newline at end of file
diff --git a/app/src/main/java/app/fedilab/android/activities/MastodonListActivity.java b/app/src/main/java/app/fedilab/android/activities/MastodonListActivity.java
index 0d6219316..1ab34d21c 100644
--- a/app/src/main/java/app/fedilab/android/activities/MastodonListActivity.java
+++ b/app/src/main/java/app/fedilab/android/activities/MastodonListActivity.java
@@ -150,9 +150,7 @@ public class MastodonListActivity extends BaseBarActivity implements MastodonLis
timelinesVM.getAccountsInList(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, mastodonList.id, null, null, 0)
.observe(MastodonListActivity.this, accounts -> {
if (accounts != null && accounts.size() > 0) {
- for (Account account : accounts) {
- accountsVM.muteHome(MainActivity.currentAccount, account);
- }
+ accountsVM.muteAccountsHome(MainActivity.currentAccount, accounts);
}
});
dialog.dismiss();
diff --git a/app/src/main/java/app/fedilab/android/client/entities/app/MutedAccounts.java b/app/src/main/java/app/fedilab/android/client/entities/app/MutedAccounts.java
index a1d3b2194..520804e2f 100644
--- a/app/src/main/java/app/fedilab/android/client/entities/app/MutedAccounts.java
+++ b/app/src/main/java/app/fedilab/android/client/entities/app/MutedAccounts.java
@@ -68,6 +68,7 @@ public class MutedAccounts implements Serializable {
try {
return gson.toJson(accounts);
} catch (Exception e) {
+ e.printStackTrace();
return null;
}
}
diff --git a/app/src/main/java/app/fedilab/android/helper/Helper.java b/app/src/main/java/app/fedilab/android/helper/Helper.java
index 3b9855918..fe70d4fed 100644
--- a/app/src/main/java/app/fedilab/android/helper/Helper.java
+++ b/app/src/main/java/app/fedilab/android/helper/Helper.java
@@ -312,7 +312,7 @@ public class Helper {
public static final String INTENT_SEND_MODIFIED_IMAGE = "INTENT_SEND_MODIFIED_IMAGE";
public static final String INTENT_COMPOSE_ERROR_MESSAGE = "INTENT_COMPOSE_ERROR_MESSAGE";
public static final String TEMP_MEDIA_DIRECTORY = "TEMP_MEDIA_DIRECTORY";
-
+ public static final String TEMP_EXPORT_DATA = "TEMP_EXPORT_DATA";
public static final int EXTERNAL_STORAGE_REQUEST_CODE = 84;
public static final int EXTERNAL_STORAGE_REQUEST_CODE_MEDIA_SAVE = 85;
@@ -1276,6 +1276,50 @@ public class Helper {
}).start();
}
+
+ public static void createFileFromUri(Context context, Uri uri, OnFileCopied callBack) {
+ new Thread(() -> {
+ InputStream selectedFileInputStream;
+ File file = null;
+ try {
+ String uriFullPath = uri.getPath();
+ String[] uriFullPathStr = uriFullPath.split(":");
+ String fullPath = uriFullPath;
+ if (uriFullPathStr.length > 1) {
+ fullPath = uriFullPathStr[1];
+ }
+ final String fileName = Helper.dateFileToString(context, new Date()) + ".zip";
+ selectedFileInputStream = context.getContentResolver().openInputStream(uri);
+ if (selectedFileInputStream != null) {
+ final File certCacheDir = new File(context.getCacheDir(), TEMP_EXPORT_DATA);
+ boolean isCertCacheDirExists = certCacheDir.exists();
+ if (!isCertCacheDirExists) {
+ isCertCacheDirExists = certCacheDir.mkdirs();
+ }
+ if (isCertCacheDirExists) {
+ String filePath = certCacheDir.getAbsolutePath() + "/" + fileName;
+ file = new File(filePath);
+ OutputStream selectedFileOutPutStream = new FileOutputStream(filePath);
+ byte[] buffer = new byte[1024];
+ int length;
+ while ((length = selectedFileInputStream.read(buffer)) > 0) {
+ selectedFileOutPutStream.write(buffer, 0, length);
+ }
+ selectedFileOutPutStream.flush();
+ selectedFileOutPutStream.close();
+ }
+ selectedFileInputStream.close();
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ Handler mainHandler = new Handler(Looper.getMainLooper());
+ File finalFile = file;
+ Runnable myRunnable = () -> callBack.onFileCopied(finalFile);
+ mainHandler.post(myRunnable);
+ }).start();
+ }
+
public static void createAttachmentFromPAth(String path, OnAttachmentCopied callBack) {
new Thread(() -> {
Attachment attachment = new Attachment();
@@ -1954,6 +1998,10 @@ public class Helper {
void onAttachmentCopied(Attachment attachment);
}
+ public interface OnFileCopied {
+ void onFileCopied(File file);
+ }
+
public static void addMutedAccount(app.fedilab.android.client.entities.api.Account target) {
if (MainActivity.filteredAccounts == null) {
MainActivity.filteredAccounts = new ArrayList<>();
diff --git a/app/src/main/java/app/fedilab/android/helper/SettingsStorage.java b/app/src/main/java/app/fedilab/android/helper/SettingsStorage.java
deleted file mode 100644
index 86a74a236..000000000
--- a/app/src/main/java/app/fedilab/android/helper/SettingsStorage.java
+++ /dev/null
@@ -1,134 +0,0 @@
-package app.fedilab.android.helper;
-/* Copyright 2022 Thomas Schneider
- *
- * This file is a part of Fedilab
- *
- * 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.
- *
- * Fedilab 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 Fedilab; if not,
- * see <http://www.gnu.org/licenses>. */
-
-import static app.fedilab.android.BaseMainActivity.currentAccount;
-import static app.fedilab.android.helper.LogoHelper.getMainLogo;
-
-import android.annotation.SuppressLint;
-import android.content.Context;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.graphics.BitmapFactory;
-import android.net.Uri;
-import android.os.Environment;
-
-import androidx.preference.PreferenceManager;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.util.Date;
-import java.util.Map;
-
-import app.fedilab.android.R;
-
-
-//From https://stackoverflow.com/a/10864463
-
-public class SettingsStorage {
-
-
- public static boolean saveSharedPreferencesToFile(Context context) {
- boolean res = false;
- ObjectOutputStream output = null;
- String fileName = "Fedilab_settings_export_" + Helper.dateFileToString(context, new Date()) + ".txt";
- String filePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath();
- String fullPath = filePath + "/" + fileName;
- File dst = new File(fullPath);
- try {
- output = new ObjectOutputStream(new FileOutputStream(dst));
- SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context);
- output.writeObject(sharedpreferences.getAll());
- res = true;
- String message = context.getString(R.string.data_export_settings_success);
- Intent intentOpen = new Intent();
- intentOpen.setAction(android.content.Intent.ACTION_VIEW);
- Uri uri = Uri.parse("file://" + fullPath);
- intentOpen.setDataAndType(uri, "text/txt");
- String title = context.getString(R.string.data_export_settings);
- Helper.notify_user(context, currentAccount, intentOpen, BitmapFactory.decodeResource(context.getResources(),
- getMainLogo(context)), Helper.NotifType.BACKUP, title, message);
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- try {
- if (output != null) {
- output.flush();
- output.close();
- }
- } catch (IOException ex) {
- ex.printStackTrace();
- }
- }
- return res;
- }
-
- @SuppressLint("ApplySharedPref")
- @SuppressWarnings({"unchecked", "UnnecessaryUnboxing"})
- public static boolean loadSharedPreferencesFromFile(Context context, Uri srcUri) {
- boolean res = false;
- ObjectInputStream input = null;
- try {
- input = new ObjectInputStream(context.getContentResolver().openInputStream(srcUri));
- SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context);
- SharedPreferences.Editor prefEdit = sharedpreferences.edit();
- prefEdit.clear();
- Map<String, ?> entries = (Map<String, ?>) input.readObject();
- for (Map.Entry<String, ?> entry : entries.entrySet()) {
- Object v = entry.getValue();
- String key = entry.getKey();
- //We skip some values
- if (key.compareTo(Helper.PREF_USER_ID) == 0) {
- continue;
- }
- if (key.compareTo(Helper.PREF_INSTANCE) == 0) {
- continue;
- }
- if (key.compareTo(Helper.PREF_USER_INSTANCE) == 0) {
- continue;
- }
- if (key.compareTo(Helper.PREF_USER_TOKEN) == 0) {
- continue;
- }
- if (v instanceof Boolean)
- prefEdit.putBoolean(key, ((Boolean) v).booleanValue());
- else if (v instanceof Float)
- prefEdit.putFloat(key, ((Float) v).floatValue());
- else if (v instanceof Integer)
- prefEdit.putInt(key, ((Integer) v).intValue());
- else if (v instanceof Long)
- prefEdit.putLong(key, ((Long) v).longValue());
- else if (v instanceof String)
- prefEdit.putString(key, ((String) v));
- }
- prefEdit.commit();
- res = true;
- } catch (IOException | ClassNotFoundException e) {
- e.printStackTrace();
- } finally {
- try {
- if (input != null) {
- input.close();
- }
- } catch (IOException ex) {
- ex.printStackTrace();
- }
- }
- return res;
- }
-}
diff --git a/app/src/main/java/app/fedilab/android/helper/TimelineHelper.java b/app/src/main/java/app/fedilab/android/helper/TimelineHelper.java
index 589528a8c..4ad014c17 100644
--- a/app/src/main/java/app/fedilab/android/helper/TimelineHelper.java
+++ b/app/src/main/java/app/fedilab/android/helper/TimelineHelper.java
@@ -137,8 +137,6 @@ public class TimelineHelper {
if (m.find()) {
status.filteredByApp = filter;
continue;
- } else {
- status.filteredByApp = null;
}
if (status.spoiler_text != null) {
String spoilerText;
@@ -149,8 +147,6 @@ public class TimelineHelper {
Matcher ms = p.matcher(spoilerText);
if (ms.find()) {
status.filteredByApp = filter;
- } else {
- status.filteredByApp = null;
}
}
}
@@ -160,9 +156,6 @@ public class TimelineHelper {
if (filterTimeLineType == Timeline.TimeLineEnum.HOME) {
if (filteredAccounts != null && filteredAccounts.size() > 0) {
for (Status status : statuses) {
- if (status.filteredByApp != null) {
- continue;
- }
for (Account account : filteredAccounts) {
if (account.acct.equals(status.account.acct) || (status.reblog != null && account.acct.equals(status.reblog.account.acct))) {
Filter filterCustom = new Filter();
diff --git a/app/src/main/java/app/fedilab/android/helper/ZipHelper.java b/app/src/main/java/app/fedilab/android/helper/ZipHelper.java
new file mode 100644
index 000000000..e9873b941
--- /dev/null
+++ b/app/src/main/java/app/fedilab/android/helper/ZipHelper.java
@@ -0,0 +1,294 @@
+package app.fedilab.android.helper;
+/* Copyright 2022 Thomas Schneider
+ *
+ * This file is a part of Fedilab
+ *
+ * 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.
+ *
+ * Fedilab 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 Fedilab; if not,
+ * see <http://www.gnu.org/licenses>. */
+
+
+import static app.fedilab.android.BaseMainActivity.currentAccount;
+import static app.fedilab.android.helper.LogoHelper.getMainLogo;
+import static app.fedilab.android.sqlite.Sqlite.DB_NAME;
+import static app.fedilab.android.sqlite.Sqlite.db;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.graphics.BitmapFactory;
+import android.net.Uri;
+import android.os.Environment;
+import android.os.Handler;
+import android.os.Looper;
+import android.widget.Toast;
+
+import androidx.preference.PreferenceManager;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.nio.channels.FileChannel;
+import java.util.Date;
+import java.util.Map;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+import java.util.zip.ZipOutputStream;
+
+import app.fedilab.android.R;
+import es.dmoral.toasty.Toasty;
+
+
+public class ZipHelper {
+
+ final static int BUFFER_SIZE = 2048;
+
+ public static void exportData(Context context) throws IOException {
+ String suffix = Helper.dateFileToString(context, new Date());
+ String fileName = "Fedilab_data_export_" + suffix + ".zip";
+ String filePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath();
+ String zipFile = filePath + "/" + fileName;
+ BufferedInputStream origin;
+ try (ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile)))) {
+ byte[] data = new byte[BUFFER_SIZE];
+ String settingsPath = storeSettings(context, suffix);
+ if (settingsPath != null) {
+ FileInputStream fi = new FileInputStream(settingsPath);
+ origin = new BufferedInputStream(fi, BUFFER_SIZE);
+ try {
+ ZipEntry entry = new ZipEntry(settingsPath.substring(settingsPath.lastIndexOf("/") + 1));
+ out.putNextEntry(entry);
+ int count;
+ while ((count = origin.read(data, 0, BUFFER_SIZE)) != -1) {
+ out.write(data, 0, count);
+ }
+ } finally {
+ origin.close();
+ }
+ //noinspection ResultOfMethodCallIgnored
+ new File(settingsPath).delete();
+ } else {
+ Toasty.error(context, context.getString(R.string.toast_error), Toasty.LENGTH_SHORT).show();
+ return;
+ }
+ String dbPath = exportDB(context, suffix);
+ if (dbPath != null) {
+ FileInputStream fi = new FileInputStream(dbPath);
+ origin = new BufferedInputStream(fi, BUFFER_SIZE);
+ try {
+ ZipEntry entry = new ZipEntry(dbPath.substring(dbPath.lastIndexOf("/") + 1));
+ out.putNextEntry(entry);
+ int count;
+ while ((count = origin.read(data, 0, BUFFER_SIZE)) != -1) {
+ out.write(data, 0, count);
+ }
+ } finally {
+ origin.close();
+ }
+ //noinspection ResultOfMethodCallIgnored
+ new File(dbPath).delete();
+ } else {
+ Toasty.error(context, context.getString(R.string.toast_error), Toasty.LENGTH_SHORT).show();
+ return;
+ }
+ String message = context.getString(R.string.data_export_settings_success);
+ Intent intentOpen = new Intent();
+ intentOpen.setAction(android.content.Intent.ACTION_VIEW);
+ Uri uri = Uri.parse("file://" + zipFile);
+ intentOpen.setDataAndType(uri, "application/zip");
+ String title = context.getString(R.string.data_export_settings);
+ Helper.notify_user(context, currentAccount, intentOpen, BitmapFactory.decodeResource(context.getResources(),
+ getMainLogo(context)), Helper.NotifType.BACKUP, title, message);
+ }
+ }
+
+
+ @SuppressLint("UnspecifiedImmutableFlag")
+ public static void importData(Context context, File file) {
+ new Thread(() -> {
+ try {
+ int size;
+ byte[] buffer = new byte[BUFFER_SIZE];
+
+ String uriFullPath = file.getAbsolutePath();
+ String[] uriFullPathStr = uriFullPath.split(":");
+ String fullPath = uriFullPath;
+ if (uriFullPathStr.length > 1) {
+ fullPath = uriFullPathStr[1];
+ }
+ fullPath = fullPath.replace(".zip", "");
+ File f = new File(fullPath);
+ if (!f.isDirectory()) {
+ //noinspection ResultOfMethodCallIgnored
+ f.mkdirs();
+ }
+ boolean successful = true;
+ try (ZipInputStream zin = new ZipInputStream(new FileInputStream(fullPath + ".zip"))) {
+ ZipEntry ze;
+ while ((ze = zin.getNextEntry()) != null) {
+ if (!successful) {
+ break;
+ }
+ String path = fullPath + ze.getName();
+ File unzipFile = new File(path);
+ FileOutputStream out = new FileOutputStream(unzipFile, false);
+ BufferedOutputStream fout = new BufferedOutputStream(out, BUFFER_SIZE);
+ try {
+ while ((size = zin.read(buffer, 0, BUFFER_SIZE)) != -1) {
+ fout.write(buffer, 0, size);
+ }
+
+ zin.closeEntry();
+ } finally {
+ fout.flush();
+ fout.close();
+ }
+ if (ze.getName().contains("settings")) {
+ successful = restoreSettings(context, Uri.fromFile(new File(path)));
+ } else if (ze.getName().contains("database")) {
+ successful = importDB(context, path);
+ } else {
+ break;
+ }
+ }
+ }
+ Handler mainHandler = new Handler(Looper.getMainLooper());
+ boolean finalSuccessful = successful;
+ Runnable myRunnable = () -> {
+ if (finalSuccessful) {
+ Helper.restart(context);
+ } else {
+ Toasty.error(context, context.getString(R.string.toast_error), Toast.LENGTH_LONG).show();
+ }
+ };
+ mainHandler.post(myRunnable);
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }).start();
+
+ }
+
+ private static String storeSettings(Context context, String suffix) {
+ boolean res = false;
+ ObjectOutputStream output = null;
+ String fileName = "Fedilab_settings_export_" + suffix + ".fedilab";
+ String filePath = context.getCacheDir().getAbsolutePath();
+ String fullPath = filePath + "/" + fileName;
+ File dst = new File(fullPath);
+ try {
+ output = new ObjectOutputStream(new FileOutputStream(dst));
+ SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context);
+ output.writeObject(sharedpreferences.getAll());
+ res = true;
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ if (output != null) {
+ output.flush();
+ output.close();
+ }
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ }
+ return res ? fullPath : null;
+ }
+
+ @SuppressLint("ApplySharedPref")
+ @SuppressWarnings("UnnecessaryUnboxing")
+ private static boolean restoreSettings(Context context, Uri srcUri) {
+ boolean res = false;
+ ObjectInputStream input = null;
+ try {
+ input = new ObjectInputStream(context.getContentResolver().openInputStream(srcUri));
+ SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context);
+ SharedPreferences.Editor prefEdit = sharedpreferences.edit();
+ prefEdit.clear();
+ //noinspection unchecked
+ Map<String, ?> entries = (Map<String, ?>) input.readObject();
+ for (Map.Entry<String, ?> entry : entries.entrySet()) {
+ Object v = entry.getValue();
+ String key = entry.getKey();
+ if (v instanceof Boolean)
+ prefEdit.putBoolean(key, ((Boolean) v).booleanValue());
+ else if (v instanceof Float)
+ prefEdit.putFloat(key, ((Float) v).floatValue());
+ else if (v instanceof Integer)
+ prefEdit.putInt(key, ((Integer) v).intValue());
+ else if (v instanceof Long)
+ prefEdit.putLong(key, ((Long) v).longValue());
+ else if (v instanceof String)
+ prefEdit.putString(key, ((String) v));
+ }
+
+ prefEdit.commit();
+ res = true;
+ } catch (IOException | ClassNotFoundException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ if (input != null) {
+ input.close();
+ }
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ }
+ return res;
+ }
+
+
+ private static String exportDB(Context context, String suffix) {
+ try {
+ String fileName = "Fedilab_database_export_" + suffix + ".fedilab";
+ String filePath = context.getCacheDir().getAbsolutePath();
+ String fullPath = filePath + "/" + fileName;
+ File dbSource = context.getDatabasePath(DB_NAME);
+ File dbDest = new File(fullPath);
+ FileChannel src = new FileInputStream(dbSource).getChannel();
+ FileChannel dst = new FileOutputStream(dbDest).getChannel();
+ dst.transferFrom(src, 0, src.size());
+ src.close();
+ dst.close();
+ return fullPath;
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ private static boolean importDB(Context context, String backupDBPath) {
+ try {
+ if (db != null) {
+ db.close();
+ }
+ File dbDest = context.getDatabasePath(DB_NAME);
+ File dbSource = new File(backupDBPath);