forked from mirrors/Fedilab
Merge branch 'develop'
This commit is contained in:
commit
8e3b146a77
44 changed files with 666 additions and 236 deletions
|
@ -13,8 +13,8 @@ android {
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
minSdk 21
|
minSdk 21
|
||||||
targetSdk 32
|
targetSdk 32
|
||||||
versionCode 449
|
versionCode 450
|
||||||
versionName "3.11.3"
|
versionName "3.12.0"
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
}
|
}
|
||||||
flavorDimensions "default"
|
flavorDimensions "default"
|
||||||
|
|
|
@ -1,4 +1,9 @@
|
||||||
[
|
[
|
||||||
|
{
|
||||||
|
"version": "3.12.0",
|
||||||
|
"code": "450",
|
||||||
|
"note": "Added:\n- Full data import/export feature\n- Android 13 themed icon support\n\nFixed:\n- Fix a regression with filters\n- Fix dark solarized theme\n- Fix hide link previews for CW\n- Fix status bar color for all themes\n- Fix language in compose \"...\"\n- Fix add all home muted accounts from lists\n- Fix top notification badges"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"version": "3.11.3",
|
"version": "3.11.3",
|
||||||
"code": "449",
|
"code": "449",
|
||||||
|
|
|
@ -19,11 +19,8 @@ import android.annotation.SuppressLint;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
import android.graphics.Color;
|
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.view.Window;
|
|
||||||
import android.view.WindowManager;
|
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
@ -84,9 +81,6 @@ public class BaseActivity extends AppCompatActivity {
|
||||||
break;
|
break;
|
||||||
case "BLACK":
|
case "BLACK":
|
||||||
setTheme(R.style.BlackAppTheme);
|
setTheme(R.style.BlackAppTheme);
|
||||||
Window window = getWindow();
|
|
||||||
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
|
|
||||||
window.setStatusBarColor(Color.BLACK);
|
|
||||||
currentThemeId = R.style.BlackAppTheme;
|
currentThemeId = R.style.BlackAppTheme;
|
||||||
break;
|
break;
|
||||||
case "DRACULA":
|
case "DRACULA":
|
||||||
|
@ -121,9 +115,6 @@ public class BaseActivity extends AppCompatActivity {
|
||||||
case "BLACK":
|
case "BLACK":
|
||||||
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
|
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
|
||||||
setTheme(R.style.BlackAppTheme);
|
setTheme(R.style.BlackAppTheme);
|
||||||
Window window = getWindow();
|
|
||||||
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
|
|
||||||
window.setStatusBarColor(Color.BLACK);
|
|
||||||
currentThemeId = R.style.BlackAppTheme;
|
currentThemeId = R.style.BlackAppTheme;
|
||||||
break;
|
break;
|
||||||
case "DRACULA":
|
case "DRACULA":
|
||||||
|
|
|
@ -19,11 +19,8 @@ import android.annotation.SuppressLint;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
import android.graphics.Color;
|
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.view.Window;
|
|
||||||
import android.view.WindowManager;
|
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
@ -76,9 +73,6 @@ public class BaseBarActivity extends AppCompatActivity {
|
||||||
setTheme(R.style.SolarizedAppThemeBar);
|
setTheme(R.style.SolarizedAppThemeBar);
|
||||||
break;
|
break;
|
||||||
case "BLACK":
|
case "BLACK":
|
||||||
Window window = getWindow();
|
|
||||||
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
|
|
||||||
window.setStatusBarColor(Color.BLACK);
|
|
||||||
setTheme(R.style.BlackAppThemeBar);
|
setTheme(R.style.BlackAppThemeBar);
|
||||||
break;
|
break;
|
||||||
case "DRACULA":
|
case "DRACULA":
|
||||||
|
@ -108,9 +102,6 @@ public class BaseBarActivity extends AppCompatActivity {
|
||||||
break;
|
break;
|
||||||
case "BLACK":
|
case "BLACK":
|
||||||
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
|
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);
|
setTheme(R.style.BlackAppThemeBar);
|
||||||
break;
|
break;
|
||||||
case "DRACULA":
|
case "DRACULA":
|
||||||
|
|
|
@ -19,11 +19,8 @@ import android.annotation.SuppressLint;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
import android.graphics.Color;
|
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.view.Window;
|
|
||||||
import android.view.WindowManager;
|
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
@ -76,9 +73,6 @@ public class BaseTransparentActivity extends AppCompatActivity {
|
||||||
setTheme(R.style.TransparentSolarized);
|
setTheme(R.style.TransparentSolarized);
|
||||||
break;
|
break;
|
||||||
case "BLACK":
|
case "BLACK":
|
||||||
Window window = getWindow();
|
|
||||||
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
|
|
||||||
window.setStatusBarColor(Color.BLACK);
|
|
||||||
setTheme(R.style.TransparentBlack);
|
setTheme(R.style.TransparentBlack);
|
||||||
break;
|
break;
|
||||||
case "DRACULA":
|
case "DRACULA":
|
||||||
|
@ -108,9 +102,6 @@ public class BaseTransparentActivity extends AppCompatActivity {
|
||||||
break;
|
break;
|
||||||
case "BLACK":
|
case "BLACK":
|
||||||
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
|
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);
|
setTheme(R.style.TransparentBlack);
|
||||||
break;
|
break;
|
||||||
case "DRACULA":
|
case "DRACULA":
|
||||||
|
|
|
@ -54,9 +54,9 @@ public class LoginActivity extends BaseActivity {
|
||||||
|
|
||||||
public static Account.API apiLogin;
|
public static Account.API apiLogin;
|
||||||
public static String currentInstanceLogin, client_idLogin, client_secretLogin, softwareLogin;
|
public static String currentInstanceLogin, client_idLogin, client_secretLogin, softwareLogin;
|
||||||
private final int PICK_IMPORT = 5557;
|
|
||||||
public static boolean requestedAdmin;
|
public static boolean requestedAdmin;
|
||||||
|
|
||||||
|
|
||||||
@SuppressLint("ApplySharedPref")
|
@SuppressLint("ApplySharedPref")
|
||||||
public void proceedLogin(Activity activity, Account account) {
|
public void proceedLogin(Activity activity, Account account) {
|
||||||
new Thread(() -> {
|
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
|
//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
|
//That happens when the user wants to use an external browser
|
||||||
manageItent(getIntent());
|
manageItent(getIntent());
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -176,7 +178,6 @@ public class LoginActivity extends BaseActivity {
|
||||||
// automatically handle clicks on the Home/Up button, so long
|
// automatically handle clicks on the Home/Up button, so long
|
||||||
// as you specify a parent activity in AndroidManifest.xml.
|
// as you specify a parent activity in AndroidManifest.xml.
|
||||||
int id = item.getItemId();
|
int id = item.getItemId();
|
||||||
|
|
||||||
if (id == R.id.action_proxy) {
|
if (id == R.id.action_proxy) {
|
||||||
Intent intent = new Intent(LoginActivity.this, ProxyActivity.class);
|
Intent intent = new Intent(LoginActivity.this, ProxyActivity.class);
|
||||||
startActivity(intent);
|
startActivity(intent);
|
||||||
|
@ -188,20 +189,5 @@ public class LoginActivity extends BaseActivity {
|
||||||
return super.onOptionsItemSelected(item);
|
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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -150,9 +150,7 @@ public class MastodonListActivity extends BaseBarActivity implements MastodonLis
|
||||||
timelinesVM.getAccountsInList(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, mastodonList.id, null, null, 0)
|
timelinesVM.getAccountsInList(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, mastodonList.id, null, null, 0)
|
||||||
.observe(MastodonListActivity.this, accounts -> {
|
.observe(MastodonListActivity.this, accounts -> {
|
||||||
if (accounts != null && accounts.size() > 0) {
|
if (accounts != null && accounts.size() > 0) {
|
||||||
for (Account account : accounts) {
|
accountsVM.muteAccountsHome(MainActivity.currentAccount, accounts);
|
||||||
accountsVM.muteHome(MainActivity.currentAccount, account);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
dialog.dismiss();
|
dialog.dismiss();
|
||||||
|
|
|
@ -68,6 +68,7 @@ public class MutedAccounts implements Serializable {
|
||||||
try {
|
try {
|
||||||
return gson.toJson(accounts);
|
return gson.toJson(accounts);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -312,7 +312,7 @@ public class Helper {
|
||||||
public static final String INTENT_SEND_MODIFIED_IMAGE = "INTENT_SEND_MODIFIED_IMAGE";
|
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 INTENT_COMPOSE_ERROR_MESSAGE = "INTENT_COMPOSE_ERROR_MESSAGE";
|
||||||
public static final String TEMP_MEDIA_DIRECTORY = "TEMP_MEDIA_DIRECTORY";
|
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 = 84;
|
||||||
public static final int EXTERNAL_STORAGE_REQUEST_CODE_MEDIA_SAVE = 85;
|
public static final int EXTERNAL_STORAGE_REQUEST_CODE_MEDIA_SAVE = 85;
|
||||||
|
@ -1276,6 +1276,50 @@ public class Helper {
|
||||||
}).start();
|
}).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) {
|
public static void createAttachmentFromPAth(String path, OnAttachmentCopied callBack) {
|
||||||
new Thread(() -> {
|
new Thread(() -> {
|
||||||
Attachment attachment = new Attachment();
|
Attachment attachment = new Attachment();
|
||||||
|
@ -1954,6 +1998,10 @@ public class Helper {
|
||||||
void onAttachmentCopied(Attachment attachment);
|
void onAttachmentCopied(Attachment attachment);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public interface OnFileCopied {
|
||||||
|
void onFileCopied(File file);
|
||||||
|
}
|
||||||
|
|
||||||
public static void addMutedAccount(app.fedilab.android.client.entities.api.Account target) {
|
public static void addMutedAccount(app.fedilab.android.client.entities.api.Account target) {
|
||||||
if (MainActivity.filteredAccounts == null) {
|
if (MainActivity.filteredAccounts == null) {
|
||||||
MainActivity.filteredAccounts = new ArrayList<>();
|
MainActivity.filteredAccounts = new ArrayList<>();
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -137,8 +137,6 @@ public class TimelineHelper {
|
||||||
if (m.find()) {
|
if (m.find()) {
|
||||||
status.filteredByApp = filter;
|
status.filteredByApp = filter;
|
||||||
continue;
|
continue;
|
||||||
} else {
|
|
||||||
status.filteredByApp = null;
|
|
||||||
}
|
}
|
||||||
if (status.spoiler_text != null) {
|
if (status.spoiler_text != null) {
|
||||||
String spoilerText;
|
String spoilerText;
|
||||||
|
@ -149,8 +147,6 @@ public class TimelineHelper {
|
||||||
Matcher ms = p.matcher(spoilerText);
|
Matcher ms = p.matcher(spoilerText);
|
||||||
if (ms.find()) {
|
if (ms.find()) {
|
||||||
status.filteredByApp = filter;
|
status.filteredByApp = filter;
|
||||||
} else {
|
|
||||||
status.filteredByApp = null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -160,9 +156,6 @@ public class TimelineHelper {
|
||||||
if (filterTimeLineType == Timeline.TimeLineEnum.HOME) {
|
if (filterTimeLineType == Timeline.TimeLineEnum.HOME) {
|
||||||
if (filteredAccounts != null && filteredAccounts.size() > 0) {
|
if (filteredAccounts != null && filteredAccounts.size() > 0) {
|
||||||
for (Status status : statuses) {
|
for (Status status : statuses) {
|
||||||
if (status.filteredByApp != null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
for (Account account : filteredAccounts) {
|
for (Account account : filteredAccounts) {
|
||||||
if (account.acct.equals(status.account.acct) || (status.reblog != null && account.acct.equals(status.reblog.account.acct))) {
|
if (account.acct.equals(status.account.acct) || (status.reblog != null && account.acct.equals(status.reblog.account.acct))) {
|
||||||
Filter filterCustom = new Filter();
|
Filter filterCustom = new Filter();
|
||||||
|
|
294
app/src/main/java/app/fedilab/android/helper/ZipHelper.java
Normal file
294
app/src/main/java/app/fedilab/android/helper/ZipHelper.java
Normal file
|
@ -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);
|
||||||
|
FileChannel src = new FileInputStream(dbSource).getChannel();
|
||||||
|
FileChannel dst = new FileOutputStream(dbDest).getChannel();
|
||||||
|
dst.transferFrom(src, 0, src.size());
|
||||||
|
src.close();
|
||||||
|
dst.close();
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1129,10 +1129,16 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
||||||
holder.binding.mediaContainer.setVisibility(View.GONE);
|
holder.binding.mediaContainer.setVisibility(View.GONE);
|
||||||
} else {
|
} else {
|
||||||
holder.binding.statusContent.setVisibility(View.VISIBLE);
|
holder.binding.statusContent.setVisibility(View.VISIBLE);
|
||||||
|
if (statusToDeal.card != null && (display_card || statusToDeal.isFocused)) {
|
||||||
|
holder.binding.card.setVisibility(View.VISIBLE);
|
||||||
|
} else {
|
||||||
|
holder.binding.card.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
holder.binding.statusContent.setVisibility(View.GONE);
|
holder.binding.statusContent.setVisibility(View.GONE);
|
||||||
holder.binding.mediaContainer.setVisibility(View.GONE);
|
holder.binding.mediaContainer.setVisibility(View.GONE);
|
||||||
|
holder.binding.card.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
|
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
|
||||||
|
|
|
@ -15,6 +15,7 @@ package app.fedilab.android.ui.fragment.login;
|
||||||
* see <http://www.gnu.org/licenses>. */
|
* see <http://www.gnu.org/licenses>. */
|
||||||
|
|
||||||
|
|
||||||
|
import static android.app.Activity.RESULT_OK;
|
||||||
import static app.fedilab.android.activities.LoginActivity.apiLogin;
|
import static app.fedilab.android.activities.LoginActivity.apiLogin;
|
||||||
import static app.fedilab.android.activities.LoginActivity.client_idLogin;
|
import static app.fedilab.android.activities.LoginActivity.client_idLogin;
|
||||||
import static app.fedilab.android.activities.LoginActivity.client_secretLogin;
|
import static app.fedilab.android.activities.LoginActivity.client_secretLogin;
|
||||||
|
@ -22,8 +23,9 @@ import static app.fedilab.android.activities.LoginActivity.currentInstanceLogin;
|
||||||
import static app.fedilab.android.activities.LoginActivity.requestedAdmin;
|
import static app.fedilab.android.activities.LoginActivity.requestedAdmin;
|
||||||
import static app.fedilab.android.activities.LoginActivity.softwareLogin;
|
import static app.fedilab.android.activities.LoginActivity.softwareLogin;
|
||||||
|
|
||||||
|
import android.Manifest;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
import android.content.pm.PackageManager;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.text.Editable;
|
import android.text.Editable;
|
||||||
|
@ -36,11 +38,13 @@ import android.view.ViewGroup;
|
||||||
import android.widget.ArrayAdapter;
|
import android.widget.ArrayAdapter;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import androidx.activity.result.ActivityResultLauncher;
|
||||||
|
import androidx.activity.result.contract.ActivityResultContracts;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.appcompat.widget.PopupMenu;
|
import androidx.appcompat.widget.PopupMenu;
|
||||||
|
import androidx.core.app.ActivityCompat;
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
import androidx.lifecycle.ViewModelProvider;
|
import androidx.lifecycle.ViewModelProvider;
|
||||||
import androidx.preference.PreferenceManager;
|
|
||||||
|
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
|
@ -55,6 +59,7 @@ import app.fedilab.android.client.entities.app.InstanceSocial;
|
||||||
import app.fedilab.android.databinding.FragmentLoginMainBinding;
|
import app.fedilab.android.databinding.FragmentLoginMainBinding;
|
||||||
import app.fedilab.android.helper.Helper;
|
import app.fedilab.android.helper.Helper;
|
||||||
import app.fedilab.android.helper.MastodonHelper;
|
import app.fedilab.android.helper.MastodonHelper;
|
||||||
|
import app.fedilab.android.helper.ZipHelper;
|
||||||
import app.fedilab.android.viewmodel.mastodon.AppsVM;
|
import app.fedilab.android.viewmodel.mastodon.AppsVM;
|
||||||
import app.fedilab.android.viewmodel.mastodon.InstanceSocialVM;
|
import app.fedilab.android.viewmodel.mastodon.InstanceSocialVM;
|
||||||
import app.fedilab.android.viewmodel.mastodon.NodeInfoVM;
|
import app.fedilab.android.viewmodel.mastodon.NodeInfoVM;
|
||||||
|
@ -65,7 +70,9 @@ public class FragmentLoginMain extends Fragment {
|
||||||
private FragmentLoginMainBinding binding;
|
private FragmentLoginMainBinding binding;
|
||||||
private boolean searchInstanceRunning = false;
|
private boolean searchInstanceRunning = false;
|
||||||
private String oldSearch;
|
private String oldSearch;
|
||||||
|
private static final int REQUEST_CODE = 5412;
|
||||||
|
private final int PICK_IMPORT = 5557;
|
||||||
|
private ActivityResultLauncher<String> permissionLauncher;
|
||||||
|
|
||||||
public View onCreateView(@NonNull LayoutInflater inflater,
|
public View onCreateView(@NonNull LayoutInflater inflater,
|
||||||
ViewGroup container, Bundle savedInstanceState) {
|
ViewGroup container, Bundle savedInstanceState) {
|
||||||
|
@ -76,6 +83,24 @@ public class FragmentLoginMain extends Fragment {
|
||||||
InstanceSocialVM instanceSocialVM = new ViewModelProvider(FragmentLoginMain.this).get(InstanceSocialVM.class);
|
InstanceSocialVM instanceSocialVM = new ViewModelProvider(FragmentLoginMain.this).get(InstanceSocialVM.class);
|
||||||
binding.menuIcon.setOnClickListener(this::showMenu);
|
binding.menuIcon.setOnClickListener(this::showMenu);
|
||||||
binding.loginInstance.setOnItemClickListener((parent, view, position, id) -> oldSearch = parent.getItemAtPosition(position).toString().trim());
|
binding.loginInstance.setOnItemClickListener((parent, view, position, id) -> oldSearch = parent.getItemAtPosition(position).toString().trim());
|
||||||
|
|
||||||
|
permissionLauncher = registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> {
|
||||||
|
if (isGranted) {
|
||||||
|
Intent openFileIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
|
||||||
|
openFileIntent.addCategory(Intent.CATEGORY_OPENABLE);
|
||||||
|
openFileIntent.setType("application/zip");
|
||||||
|
String[] mimeTypes = new String[]{"application/zip"};
|
||||||
|
openFileIntent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
|
||||||
|
//noinspection deprecation
|
||||||
|
startActivityForResult(
|
||||||
|
Intent.createChooser(
|
||||||
|
openFileIntent,
|
||||||
|
getString(R.string.load_settings)), PICK_IMPORT);
|
||||||
|
} else {
|
||||||
|
ActivityCompat.requestPermissions(requireActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
binding.loginInstance.addTextChangedListener(new TextWatcher() {
|
binding.loginInstance.addTextChangedListener(new TextWatcher() {
|
||||||
@Override
|
@Override
|
||||||
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
|
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
|
||||||
|
@ -184,7 +209,6 @@ public class FragmentLoginMain extends Fragment {
|
||||||
MenuInflater menuInflater = popupMenu.getMenuInflater();
|
MenuInflater menuInflater = popupMenu.getMenuInflater();
|
||||||
menuInflater.inflate(R.menu.main_login, popupMenu.getMenu());
|
menuInflater.inflate(R.menu.main_login, popupMenu.getMenu());
|
||||||
MenuItem adminTabItem = popupMenu.getMenu().findItem(R.id.action_request_admin);
|
MenuItem adminTabItem = popupMenu.getMenu().findItem(R.id.action_request_admin);
|
||||||
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(requireActivity());
|
|
||||||
adminTabItem.setChecked(requestedAdmin);
|
adminTabItem.setChecked(requestedAdmin);
|
||||||
popupMenu.setOnMenuItemClickListener(item -> {
|
popupMenu.setOnMenuItemClickListener(item -> {
|
||||||
int itemId = item.getItemId();
|
int itemId = item.getItemId();
|
||||||
|
@ -208,6 +232,8 @@ public class FragmentLoginMain extends Fragment {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
} else if (itemId == R.id.action_import_data) {
|
||||||
|
permissionLauncher.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE);
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
@ -258,4 +284,44 @@ public class FragmentLoginMain extends Fragment {
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
@Override
|
||||||
|
public 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(requireActivity(), getString(R.string.toot_select_file_error), Toast.LENGTH_LONG).show();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Helper.createFileFromUri(requireActivity(), data.getData(), file -> ZipHelper.importData(requireActivity(), file));
|
||||||
|
} else {
|
||||||
|
Toasty.error(requireActivity(), getString(R.string.toot_select_file_error), Toast.LENGTH_LONG).show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
@Override
|
||||||
|
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
||||||
|
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
||||||
|
if (requestCode == REQUEST_CODE) {
|
||||||
|
if (grantResults.length > 0
|
||||||
|
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
||||||
|
Intent openFileIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
|
||||||
|
openFileIntent.addCategory(Intent.CATEGORY_OPENABLE);
|
||||||
|
openFileIntent.setType("application/zip");
|
||||||
|
String[] mimeTypes = new String[]{"application/zip"};
|
||||||
|
openFileIntent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
|
||||||
|
startActivityForResult(
|
||||||
|
Intent.createChooser(
|
||||||
|
openFileIntent,
|
||||||
|
getString(R.string.load_settings)), PICK_IMPORT);
|
||||||
|
} else {
|
||||||
|
Toasty.error(requireActivity(), getString(R.string.permission_missing), Toasty.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -19,6 +19,8 @@ import android.app.Activity;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.webkit.URLUtil;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
import androidx.activity.result.ActivityResultLauncher;
|
import androidx.activity.result.ActivityResultLauncher;
|
||||||
import androidx.activity.result.contract.ActivityResultContracts;
|
import androidx.activity.result.contract.ActivityResultContracts;
|
||||||
|
@ -30,8 +32,11 @@ import androidx.navigation.Navigation;
|
||||||
import androidx.preference.Preference;
|
import androidx.preference.Preference;
|
||||||
import androidx.preference.PreferenceFragmentCompat;
|
import androidx.preference.PreferenceFragmentCompat;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
import app.fedilab.android.R;
|
import app.fedilab.android.R;
|
||||||
import app.fedilab.android.helper.SettingsStorage;
|
import app.fedilab.android.helper.Helper;
|
||||||
|
import app.fedilab.android.helper.ZipHelper;
|
||||||
import es.dmoral.toasty.Toasty;
|
import es.dmoral.toasty.Toasty;
|
||||||
|
|
||||||
public class FragmentSettingsCategories extends PreferenceFragmentCompat {
|
public class FragmentSettingsCategories extends PreferenceFragmentCompat {
|
||||||
|
@ -117,7 +122,11 @@ public class FragmentSettingsCategories extends PreferenceFragmentCompat {
|
||||||
}
|
}
|
||||||
ActivityResultLauncher<String> permissionLauncher = registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> {
|
ActivityResultLauncher<String> permissionLauncher = registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> {
|
||||||
if (isGranted) {
|
if (isGranted) {
|
||||||
SettingsStorage.saveSharedPreferencesToFile(requireActivity());
|
try {
|
||||||
|
ZipHelper.exportData(requireActivity());
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
ActivityCompat.requestPermissions(requireActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
|
ActivityCompat.requestPermissions(requireActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
|
||||||
}
|
}
|
||||||
|
@ -152,12 +161,18 @@ public class FragmentSettingsCategories extends PreferenceFragmentCompat {
|
||||||
@Override
|
@Override
|
||||||
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
|
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
|
||||||
if (resultCode == Activity.RESULT_OK && requestCode == PICKUP_FILE) {
|
if (resultCode == Activity.RESULT_OK && requestCode == PICKUP_FILE) {
|
||||||
boolean result = data != null && SettingsStorage.loadSharedPreferencesFromFile(requireActivity(), data.getData());
|
if (data == null || data.getData() == null) {
|
||||||
if (result) {
|
Toasty.error(requireActivity(), getString(R.string.toot_select_file_error), Toast.LENGTH_LONG).show();
|
||||||
Toasty.success(requireActivity(), getString(R.string.data_import_settings_success), Toasty.LENGTH_LONG).show();
|
return;
|
||||||
} else {
|
|
||||||
Toasty.error(requireActivity(), getString(R.string.toast_error), Toasty.LENGTH_LONG).show();
|
|
||||||
}
|
}
|
||||||
|
String uriFullPath = data.getData().getPath();
|
||||||
|
String[] uriFullPathStr = uriFullPath.split(":");
|
||||||
|
String fullPath = uriFullPath;
|
||||||
|
if (uriFullPathStr.length > 1) {
|
||||||
|
fullPath = uriFullPathStr[1];
|
||||||
|
}
|
||||||
|
final String fileName = URLUtil.guessFileName(fullPath, null, null);
|
||||||
|
Helper.createFileFromUri(requireActivity(), data.getData(), file -> ZipHelper.importData(requireActivity(), file));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -167,7 +182,11 @@ public class FragmentSettingsCategories extends PreferenceFragmentCompat {
|
||||||
if (requestCode == REQUEST_CODE) {
|
if (requestCode == REQUEST_CODE) {
|
||||||
if (grantResults.length > 0
|
if (grantResults.length > 0
|
||||||
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
||||||
SettingsStorage.saveSharedPreferencesToFile(requireActivity());
|
try {
|
||||||
|
ZipHelper.exportData(requireActivity());
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
Toasty.error(requireActivity(), getString(R.string.permission_missing), Toasty.LENGTH_SHORT).show();
|
Toasty.error(requireActivity(), getString(R.string.permission_missing), Toasty.LENGTH_SHORT).show();
|
||||||
}
|
}
|
||||||
|
|
|
@ -813,7 +813,6 @@ public class AccountsVM extends AndroidViewModel {
|
||||||
public LiveData<Account> muteHome(@NonNull BaseAccount forAccount, @NonNull Account target) {
|
public LiveData<Account> muteHome(@NonNull BaseAccount forAccount, @NonNull Account target) {
|
||||||
accountMutableLiveData = new MutableLiveData<>();
|
accountMutableLiveData = new MutableLiveData<>();
|
||||||
new Thread(() -> {
|
new Thread(() -> {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
new MutedAccounts(getApplication().getApplicationContext()).muteAccount(forAccount, target);
|
new MutedAccounts(getApplication().getApplicationContext()).muteAccount(forAccount, target);
|
||||||
addMutedAccount(target);
|
addMutedAccount(target);
|
||||||
|
@ -828,6 +827,32 @@ public class AccountsVM extends AndroidViewModel {
|
||||||
return accountMutableLiveData;
|
return accountMutableLiveData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mute the given account in db
|
||||||
|
*
|
||||||
|
* @return {@link LiveData} containing the {@link Account} to the given account
|
||||||
|
*/
|
||||||
|
public LiveData<List<Account>> muteAccountsHome(@NonNull BaseAccount forAccount, @NonNull List<Account> targets) {
|
||||||
|
accountListMutableLiveData = new MutableLiveData<>();
|
||||||
|
new Thread(() -> {
|
||||||
|
try {
|
||||||
|
for (Account target : targets) {
|
||||||
|
new MutedAccounts(getApplication().getApplicationContext()).muteAccount(forAccount, target);
|
||||||
|
sendAction(getApplication().getApplicationContext(), Helper.ARG_STATUS_ACCOUNT_ID_DELETED, null, target.id);
|
||||||
|
addMutedAccount(target);
|
||||||
|
}
|
||||||
|
} catch (DBException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
Handler mainHandler = new Handler(Looper.getMainLooper());
|
||||||
|
Runnable myRunnable = () -> accountListMutableLiveData.setValue(targets);
|
||||||
|
mainHandler.post(myRunnable);
|
||||||
|
}).start();
|
||||||
|
return accountListMutableLiveData;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unmute the given account in db
|
* Unmute the given account in db
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:shape="rectangle">
|
android:shape="rectangle">
|
||||||
<solid android:color="?colorPrimary" />
|
<solid android:color="?colorErrorContainer" />
|
||||||
<padding
|
<padding
|
||||||
android:left="2dp"
|
android:left="2dp"
|
||||||
android:right="2dp" />
|
android:right="2dp" />
|
||||||
|
|
|
@ -190,7 +190,7 @@
|
||||||
<com.google.android.material.button.MaterialButton
|
<com.google.android.material.button.MaterialButton
|
||||||
android:id="@+id/button_language"
|
android:id="@+id/button_language"
|
||||||
style="@style/Widget.Material3.Button.OutlinedButton.Icon"
|
style="@style/Widget.Material3.Button.OutlinedButton.Icon"
|
||||||
android:layout_width="60dp"
|
android:layout_width="70dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:textColor="?colorPrimary"
|
android:textColor="?colorPrimary"
|
||||||
app:iconGravity="textStart"
|
app:iconGravity="textStart"
|
||||||
|
|
|
@ -8,10 +8,12 @@
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="top|center_horizontal"
|
android:layout_gravity="top|center_horizontal"
|
||||||
android:layout_marginStart="10dp"
|
android:layout_marginStart="10dp"
|
||||||
|
android:paddingStart="5dp"
|
||||||
|
android:paddingEnd="5dp"
|
||||||
android:background="@drawable/shape_counter"
|
android:background="@drawable/shape_counter"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:padding="3dp"
|
android:padding="3dp"
|
||||||
android:textColor="?colorOnPrimary"
|
android:textColor="?colorOnErrorContainer"
|
||||||
android:textSize="11sp"
|
android:textSize="11sp"
|
||||||
tools:text="9+" />
|
tools:text="9+" />
|
||||||
</merge>
|
</merge>
|
|
@ -21,11 +21,13 @@
|
||||||
android:checkable="true"
|
android:checkable="true"
|
||||||
android:title="@string/admin_scope"
|
android:title="@string/admin_scope"
|
||||||
app:actionViewClass="android.widget.CheckBox" />
|
app:actionViewClass="android.widget.CheckBox" />
|
||||||
<!--
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/action_import_data"
|
android:id="@+id/action_import_data"
|
||||||
android:title="@string/import_data"
|
android:title="@string/import_data"
|
||||||
app:showAsAction="never" />
|
app:showAsAction="never" />
|
||||||
|
|
||||||
|
<!--
|
||||||
<item
|
<item
|
||||||
android:id="@+id/action_provider"
|
android:id="@+id/action_provider"
|
||||||
android:checkable="true"
|
android:checkable="true"
|
||||||
|
|
|
@ -2,4 +2,5 @@
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@color/ic_launcher_background" />
|
<background android:drawable="@color/ic_launcher_background" />
|
||||||
<foreground android:drawable="@drawable/ic_launcher_foreground" />
|
<foreground android:drawable="@drawable/ic_launcher_foreground" />
|
||||||
|
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
|
@ -2,4 +2,5 @@
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@color/ic_launcher_atom_background" />
|
<background android:drawable="@color/ic_launcher_atom_background" />
|
||||||
<foreground android:drawable="@drawable/ic_launcher_atom_foreground" />
|
<foreground android:drawable="@drawable/ic_launcher_atom_foreground" />
|
||||||
|
<monochrome android:drawable="@drawable/ic_launcher_atom_foreground" />
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
|
@ -2,4 +2,5 @@
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@color/ic_launcher_atom_background" />
|
<background android:drawable="@color/ic_launcher_atom_background" />
|
||||||
<foreground android:drawable="@drawable/ic_launcher_atom_foreground" />
|
<foreground android:drawable="@drawable/ic_launcher_atom_foreground" />
|
||||||
|
<monochrome android:drawable="@drawable/ic_launcher_atom_foreground" />
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
|
@ -2,4 +2,5 @@
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@color/ic_launcher_bubbles_background" />
|
<background android:drawable="@color/ic_launcher_bubbles_background" />
|
||||||
<foreground android:drawable="@drawable/ic_launcher_bubbles_foreground" />
|
<foreground android:drawable="@drawable/ic_launcher_bubbles_foreground" />
|
||||||
|
<monochrome android:drawable="@drawable/ic_launcher_bubbles_foreground" />
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
|
@ -2,4 +2,5 @@
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@color/ic_launcher_bubbles_background" />
|
<background android:drawable="@color/ic_launcher_bubbles_background" />
|
||||||
<foreground android:drawable="@drawable/ic_launcher_bubbles_foreground" />
|
<foreground android:drawable="@drawable/ic_launcher_bubbles_foreground" />
|
||||||
|
<monochrome android:drawable="@drawable/ic_launcher_bubbles_foreground" />
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
|
@ -2,4 +2,5 @@
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@color/ic_launcher_crash_background" />
|
<background android:drawable="@color/ic_launcher_crash_background" />
|
||||||
<foreground android:drawable="@drawable/ic_launcher_crash_foreground" />
|
<foreground android:drawable="@drawable/ic_launcher_crash_foreground" />
|
||||||
|
<monochrome android:drawable="@drawable/ic_launcher_crash_foreground" />
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
|
@ -2,4 +2,5 @@
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@color/ic_launcher_crash_background" />
|
<background android:drawable="@color/ic_launcher_crash_background" />
|
||||||
<foreground android:drawable="@drawable/ic_launcher_crash_foreground" />
|
<foreground android:drawable="@drawable/ic_launcher_crash_foreground" />
|
||||||
|
<monochrome android:drawable="@drawable/ic_launcher_crash_foreground" />
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
|
@ -2,4 +2,5 @@
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@color/ic_launcher_fediverse_background" />
|
<background android:drawable="@color/ic_launcher_fediverse_background" />
|
||||||
<foreground android:drawable="@drawable/ic_launcher_fediverse_foreground" />
|
<foreground android:drawable="@drawable/ic_launcher_fediverse_foreground" />
|
||||||
|
<monochrome android:drawable="@drawable/ic_launcher_fediverse_foreground" />
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
|
@ -2,4 +2,5 @@
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@color/ic_launcher_fediverse_background" />
|
<background android:drawable="@color/ic_launcher_fediverse_background" />
|
||||||
<foreground android:drawable="@drawable/ic_launcher_fediverse_foreground" />
|
<foreground android:drawable="@drawable/ic_launcher_fediverse_foreground" />
|
||||||
|
<monochrome android:drawable="@drawable/ic_launcher_fediverse_foreground" />
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
|
@ -2,4 +2,5 @@
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@color/ic_launcher_hero_background" />
|
<background android:drawable="@color/ic_launcher_hero_background" />
|
||||||
<foreground android:drawable="@drawable/ic_launcher_hero_foreground" />
|
<foreground android:drawable="@drawable/ic_launcher_hero_foreground" />
|
||||||
|
<monochrome android:drawable="@drawable/ic_launcher_hero_foreground" />
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
|
@ -2,4 +2,5 @@
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@color/ic_launcher_hero_background" />
|
<background android:drawable="@color/ic_launcher_hero_background" />
|
||||||
<foreground android:drawable="@drawable/ic_launcher_hero_foreground" />
|
<foreground android:drawable="@drawable/ic_launcher_hero_foreground" />
|
||||||
|
<monochrome android:drawable="@drawable/ic_launcher_hero_foreground" />
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
|
@ -2,4 +2,5 @@
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@color/ic_launcher_mastalab_background" />
|
<background android:drawable="@color/ic_launcher_mastalab_background" />
|
||||||
<foreground android:drawable="@drawable/ic_launcher_mastalab_foreground" />
|
<foreground android:drawable="@drawable/ic_launcher_mastalab_foreground" />
|
||||||
|
<monochrome android:drawable="@drawable/ic_launcher_mastalab_foreground" />
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
|
@ -2,4 +2,5 @@
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@color/ic_launcher_mastalab_background" />
|
<background android:drawable="@color/ic_launcher_mastalab_background" />
|
||||||
<foreground android:drawable="@drawable/ic_launcher_mastalab_foreground" />
|
<foreground android:drawable="@drawable/ic_launcher_mastalab_foreground" />
|
||||||
|
<monochrome android:drawable="@drawable/ic_launcher_mastalab_foreground" />
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
|
@ -2,4 +2,5 @@
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@color/ic_launcher_background" />
|
<background android:drawable="@color/ic_launcher_background" />
|
||||||
<foreground android:drawable="@drawable/ic_launcher_foreground" />
|
<foreground android:drawable="@drawable/ic_launcher_foreground" />
|
||||||
|
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
|
@ -160,9 +160,9 @@
|
||||||
<string name="toot_scheduled_date">Plánované datum musí být vyšší než aktuální hodina!</string>
|
<string name="toot_scheduled_date">Plánované datum musí být vyšší než aktuální hodina!</string>
|
||||||
<!-- timed mute -->
|
<!-- timed mute -->
|
||||||
<string name="timed_mute_date_error">Časový interval pro ztlumení musí být delší než jedna minuta.</string>
|
<string name="timed_mute_date_error">Časový interval pro ztlumení musí být delší než jedna minuta.</string>
|
||||||
<string name="timed_mute_date">%1$s byl ztlumen až do %2$s.
|
<string name="timed_mute_date">%1$s byl(a) ztlumen(a) až do %2$s.
|
||||||
\n Ztlumení účtu můžete zrušit z jeho/její profilové stránky.</string>
|
\n Ztlumení účtu můžete zrušit z jeho/její profilové stránky.</string>
|
||||||
<string name="timed_mute_profile">%1$s je ztlumen do %2$s.
|
<string name="timed_mute_profile">%1$s je ztlumen(a) do %2$s.
|
||||||
\n Klikněte zde pro zrušení ztlumení.</string>
|
\n Klikněte zde pro zrušení ztlumení.</string>
|
||||||
<!-- Notifications -->
|
<!-- Notifications -->
|
||||||
<string name="no_notifications">Žádné upozornění k zobrazení</string>
|
<string name="no_notifications">Žádné upozornění k zobrazení</string>
|
||||||
|
@ -299,10 +299,10 @@
|
||||||
<string name="context_drop_explanations">Filtrované zprávy zmizí nezvratně i v případě, že je filtr později odstraněn</string>
|
<string name="context_drop_explanations">Filtrované zprávy zmizí nezvratně i v případě, že je filtr později odstraněn</string>
|
||||||
<string name="context_whole_word_explanations">V případě, že klíčové slovo nebo fráze je pouze alfanumerické, filtr se uplatní, pouze pokud odpovídá celému slovu</string>
|
<string name="context_whole_word_explanations">V případě, že klíčové slovo nebo fráze je pouze alfanumerické, filtr se uplatní, pouze pokud odpovídá celému slovu</string>
|
||||||
<string name="context_whole_word">Celé slovo</string>
|
<string name="context_whole_word">Celé slovo</string>
|
||||||
<string name="filter_context">Kontext filtru</string>
|
<string name="filter_context">Kontexty filtru</string>
|
||||||
<string name="filter_context_explanations">Jeden nebo několik kontextů pro aplikaci filtru</string>
|
<string name="filter_context_explanations">Jeden nebo několik kontextů pro aplikaci filtru</string>
|
||||||
<string name="filter_expire">Vyprší po</string>
|
<string name="filter_expire">Vyprší po</string>
|
||||||
<string name="action_filter_delete">Vymazat filtr?</string>
|
<string name="action_filter_delete">Smazat filtr\?</string>
|
||||||
<string name="action_update_filter">Aktualizovat filtr</string>
|
<string name="action_update_filter">Aktualizovat filtr</string>
|
||||||
<string name="action_list_add">Žádný seznam dosud nebyl vytvořen. Můžete vytvořit nový seznam klepnutím na tlačítko \"+\".</string>
|
<string name="action_list_add">Žádný seznam dosud nebyl vytvořen. Můžete vytvořit nový seznam klepnutím na tlačítko \"+\".</string>
|
||||||
<string name="expand_image">Automaticky zobrazovat skrytá média</string>
|
<string name="expand_image">Automaticky zobrazovat skrytá média</string>
|
||||||
|
@ -387,7 +387,7 @@
|
||||||
<string name="calls_blocked">volání http je blokováno aplikací</string>
|
<string name="calls_blocked">volání http je blokováno aplikací</string>
|
||||||
<string name="list_of_blocked_domains">Seznam blokovaných volání</string>
|
<string name="list_of_blocked_domains">Seznam blokovaných volání</string>
|
||||||
<string name="submit">Odeslat</string>
|
<string name="submit">Odeslat</string>
|
||||||
<string name="filter_timeline_with_a_tag">Filtrovat časovou osu s hashtagy</string>
|
<string name="filter_timeline_with_a_tag">Filtrovat časovou osu s tagy</string>
|
||||||
<string name="no_tags">Žádné tagy</string>
|
<string name="no_tags">Žádné tagy</string>
|
||||||
<string name="set_retrieve_metadata_share_from_extras">Při sdílení URL připojit obrázek</string>
|
<string name="set_retrieve_metadata_share_from_extras">Při sdílení URL připojit obrázek</string>
|
||||||
<!-- end languages -->
|
<!-- end languages -->
|
||||||
|
@ -926,4 +926,16 @@
|
||||||
<string name="pin_tag">Připnout tag</string>
|
<string name="pin_tag">Připnout tag</string>
|
||||||
<string name="unfollow_tag">Nesledovat tag</string>
|
<string name="unfollow_tag">Nesledovat tag</string>
|
||||||
<string name="unpin_tag">Odepnout tag</string>
|
<string name="unpin_tag">Odepnout tag</string>
|
||||||
|
<string name="mute_tag">Opravdu chcete ztlumit tag %1$s\?</string>
|
||||||
|
<string name="mute_tag_action">Ztlumit tag</string>
|
||||||
|
<string name="unmute_tag_action">Zrušit ztlumení tagu</string>
|
||||||
|
<string name="reject_media">Odmítat média</string>
|
||||||
|
<string name="admin_domainblock_severity">Ztišení učiní příspěvky účtu neviditelné pro kohokoliv, kdo ho nesleduje. Pozastavení odstraní všechen obsah, média a profilová data účtu. Použijte Žádný, pokud chcete jen odmítat soubory médií.</string>
|
||||||
|
<string name="account_unsilenced">Zrušeno ztišení účtu</string>
|
||||||
|
<string name="mute_them_all">Ztlumit všechny</string>
|
||||||
|
<string name="muted_menu_home">Domácí ztlumení uživatelé</string>
|
||||||
|
<string name="account_silenced">Účet ztišen</string>
|
||||||
|
<string name="mute_home">Ztlumit pro domovskou časovou osu</string>
|
||||||
|
<string name="unmute_home">Zrušit ztlumení pro domovskou časovou osu</string>
|
||||||
|
<string name="put_all_accounts_in_home_muted">Všechny účtu budou na domovské časové ose ztlumeny.</string>
|
||||||
</resources>
|
</resources>
|
|
@ -440,7 +440,7 @@
|
||||||
<string name="agreement_check">J\'accepte les %1$s et les %2$s</string>
|
<string name="agreement_check">J\'accepte les %1$s et les %2$s</string>
|
||||||
<string name="server_rules">règles du serveur</string>
|
<string name="server_rules">règles du serveur</string>
|
||||||
<string name="tos">conditions de service</string>
|
<string name="tos">conditions de service</string>
|
||||||
<string name="sign_up">S’inscrire</string>
|
<string name="sign_up">S\'inscrire</string>
|
||||||
<string name="validation_needed">Cette instance fonctionne avec des invitations. Votre compte devra être approuvé manuellement par un·e administrateur·rice pour qu\'il devienne utilisable.</string>
|
<string name="validation_needed">Cette instance fonctionne avec des invitations. Votre compte devra être approuvé manuellement par un·e administrateur·rice pour qu\'il devienne utilisable.</string>
|
||||||
<string name="password_error">Les mots de passe ne sont pas identiques !</string>
|
<string name="password_error">Les mots de passe ne sont pas identiques !</string>
|
||||||
<string name="email_error">L\'adresse ne semble pas être valide !</string>
|
<string name="email_error">L\'adresse ne semble pas être valide !</string>
|
||||||
|
@ -541,7 +541,7 @@
|
||||||
<string name="make_an_action">Faire une action</string>
|
<string name="make_an_action">Faire une action</string>
|
||||||
<string name="translation">Traduction</string>
|
<string name="translation">Traduction</string>
|
||||||
<string name="text_color_title">Couleur du texte</string>
|
<string name="text_color_title">Couleur du texte</string>
|
||||||
<string name="text_color">Changer la couleur du texte dans les publications/messages</string>
|
<string name="text_color">Changer la couleur du texte dans les messages</string>
|
||||||
<string name="pref_custom_theme">Utiliser un thème personnalisé</string>
|
<string name="pref_custom_theme">Utiliser un thème personnalisé</string>
|
||||||
<string name="theming">Thème</string>
|
<string name="theming">Thème</string>
|
||||||
<string name="data_export_theme">Le thème a été exporté</string>
|
<string name="data_export_theme">Le thème a été exporté</string>
|
||||||
|
@ -894,5 +894,43 @@
|
||||||
<string name="not_interested">Pas intéressé</string>
|
<string name="not_interested">Pas intéressé</string>
|
||||||
<string name="set_notif_update">Avertir des mises à jour</string>
|
<string name="set_notif_update">Avertir des mises à jour</string>
|
||||||
<string name="delete_timeline">Supprimer le fil chronologique</string>
|
<string name="delete_timeline">Supprimer le fil chronologique</string>
|
||||||
<string name="notif_signed_up">Signé</string>
|
<string name="notif_signed_up">Inscrit·e</string>
|
||||||
|
<string name="type_default_theme_dark">Thème sombre par défaut</string>
|
||||||
|
<string name="toast_error_fetch_message">L\'app n\'a pas trouvé le message distant.</string>
|
||||||
|
<string name="order_lists">Ordonner les listes</string>
|
||||||
|
<string name="severity">Sévérité</string>
|
||||||
|
<string name="admin_domainblock_domain">Le blocage de domaine n\'empêchera pas la création d\'entrées de compte dans la base de données, mais appliquera rétroactivement et automatiquement des méthodes de modération spécifiques à ces comptes.</string>
|
||||||
|
<string name="admin_reject_media">Rejeter les fichiers médias</string>
|
||||||
|
<string name="pref_customize">Personnaliser les couleurs</string>
|
||||||
|
<string name="type_of_theme">Choisissez un mode pour le thème</string>
|
||||||
|
<string name="pref_customize_summary">Permet de définir vos propres couleurs pour les thèmes.</string>
|
||||||
|
<string name="set_dynamic_color">Couleur dynamique</string>
|
||||||
|
<string name="set_dynamic_color_indication">Aligne le ton avec les couleurs de votre fond d\'écran.</string>
|
||||||
|
<string name="set_customize_light_indication">Permet de personnaliser certains éléments des messages pour le thème clair.</string>
|
||||||
|
<string name="display_remote_conversation">Afficher la conversation distante</string>
|
||||||
|
<string name="cark_custom_colors">Sombre - Couleurs personnalisées</string>
|
||||||
|
<string name="toast_try_later">Veuillez réessayer plus tard.</string>
|
||||||
|
<string name="unmute_tag_action">Rétablir l\'étiquette</string>
|
||||||
|
<string name="set_cardview">Surélever les cartes</string>
|
||||||
|
<string name="set_customize_light">Personnaliser le thème clair</string>
|
||||||
|
<string name="set_customize_dark">Personnaliser le thème sombre</string>
|
||||||
|
<string name="set_customize_dark_indication">Permet de personnaliser certains éléments des messages pour le thème sombre.</string>
|
||||||
|
<string name="set_custom_colors">Définir les couleurs personnalisés</string>
|
||||||
|
<string name="light_custom_colors">Clair - Couleurs personnalisées</string>
|
||||||
|
<string name="toast_on_your_instance">La conversation a débuté sur votre instance !</string>
|
||||||
|
<string name="mute_tag_action">Silencer l\'étiquette</string>
|
||||||
|
<string name="pin_tag">Épingler l\'étiquette</string>
|
||||||
|
<string name="unpin_tag">Désépingler l\'étiquette</string>
|
||||||
|
<string name="unfollow_tag">Ne plus suivre l\'étiquette</string>
|
||||||
|
<string name="mute_home">Silencer sur l\'accueil</string>
|
||||||
|
<string name="unmute_home">Rétablir sur l\'accueil</string>
|
||||||
|
<string name="mute_them_all">Les silencer tous</string>
|
||||||
|
<string name="set_cardview_indication">Si actif, les éléments des timelines auront une ombre et seront surélevés.</string>
|
||||||
|
<string name="put_all_accounts_in_home_muted">Tous les comptes seront silencés sur la timeline d\'accueil.</string>
|
||||||
|
<string name="set_display_translate_indication">Toujours afficher le bouton de traduction</string>
|
||||||
|
<string name="type_default_theme_light">Thème clair par défaut</string>
|
||||||
|
<string name="admin_domainblock_severity">Silencier rendra les publications du compte invisibles à quiconque n\'étant pas abonné. Suspendre supprimera tous les contenus du compte, médias, et données du profil. Utilisez Aucun si vous souhaitez rejeter uniquement les fichiers médias.</string>
|
||||||
|
<string name="muted_menu_home">utilisateur·ices silencé·es sur l\'accueil</string>
|
||||||
|
<string name="notif_submitted_report">Soumettre un rapport</string>
|
||||||
|
<string name="admin_domainblock_reject_obfuscate">Masquer partiellement le nom de domaine dans la liste si l\'option de publication restreinte de la liste de domaine est activée</string>
|
||||||
</resources>
|
</resources>
|
|
@ -865,7 +865,7 @@
|
||||||
<string name="report_sent">Il report é stato inviato!</string>
|
<string name="report_sent">Il report é stato inviato!</string>
|
||||||
<string name="about_mastodon">\"Mastodon non é un singolo sito come Twitter o Facebook, é una rete di migliaia di communità gestite da organizzazioni e individui differenti che forniscono un\'esperienza social integrata.\"</string>
|
<string name="about_mastodon">\"Mastodon non é un singolo sito come Twitter o Facebook, é una rete di migliaia di communità gestite da organizzazioni e individui differenti che forniscono un\'esperienza social integrata.\"</string>
|
||||||
<string name="mark_all_as_read">Segna tutte le notifiche come lette</string>
|
<string name="mark_all_as_read">Segna tutte le notifiche come lette</string>
|
||||||
<string name="delete_notification_all_warning">Sei sicuro di voler eliminare tutte le notifiche\? L\'azione non puó essere annulata.</string>
|
<string name="delete_notification_all_warning">Sei sicuro di voler eliminare tutte le notifiche\? L\'azione non puó essere annullata.</string>
|
||||||
<string name="notif_display_poll_results">Risultati sondaggio</string>
|
<string name="notif_display_poll_results">Risultati sondaggio</string>
|
||||||
<string name="msg_save_image">Vuoi uscire senza salvare l\'immagine\?</string>
|
<string name="msg_save_image">Vuoi uscire senza salvare l\'immagine\?</string>
|
||||||
<string name="permission_missing">Permessi non abilitati!</string>
|
<string name="permission_missing">Permessi non abilitati!</string>
|
||||||
|
@ -901,4 +901,18 @@
|
||||||
<string name="show_anyway">Mostra comunque</string>
|
<string name="show_anyway">Mostra comunque</string>
|
||||||
<string name="toast_error_add_to_list">L\'app non é riuscita ad aggiungere l\'account nella lista!</string>
|
<string name="toast_error_add_to_list">L\'app non é riuscita ad aggiungere l\'account nella lista!</string>
|
||||||
<string name="delete_timeline">Elimina timeline</string>
|
<string name="delete_timeline">Elimina timeline</string>
|
||||||
|
<string name="toast_try_later">Riprova piú tardi.</string>
|
||||||
|
<string name="light_custom_colors">Chiaro - colori personalizzati</string>
|
||||||
|
<string name="cark_custom_colors">Scuro - Colori personalizzati</string>
|
||||||
|
<string name="toast_on_your_instance">La conversazione é iniziata sulla tua istanza!</string>
|
||||||
|
<string name="toast_error_fetch_message">L\'app non ha trovato il messaggio remoto.</string>
|
||||||
|
<string name="set_discoverable_content">Account suggeribile</string>
|
||||||
|
<string name="set_custom_colors">Imposta colori personalizzati</string>
|
||||||
|
<string name="mute_tag_action">Silenzia etichetta</string>
|
||||||
|
<string name="unmute_tag_action">Non silenziare etichetta</string>
|
||||||
|
<string name="pin_tag">Fissa etichetta</string>
|
||||||
|
<string name="unpin_tag">Non fissare etichetta</string>
|
||||||
|
<string name="unfollow_tag">Non seguire etichetta</string>
|
||||||
|
<string name="set_language_picker_title">Selettore lingua</string>
|
||||||
|
<string name="display_remote_conversation">Mostra conversazione remota</string>
|
||||||
</resources>
|
</resources>
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
<style name="AppTheme" parent="Theme.Material3.Dark.NoActionBar">
|
<style name="AppTheme" parent="Theme.Material3.Dark.NoActionBar">
|
||||||
<item name="linkColor">@color/md_theme_dark_primary</item>
|
<item name="linkColor">@color/md_theme_dark_primary</item>
|
||||||
|
<item name="android:statusBarColor">?android:colorBackground</item>
|
||||||
<item name="colorPrimary">@color/md_theme_dark_primary</item>
|
<item name="colorPrimary">@color/md_theme_dark_primary</item>
|
||||||
<item name="colorOnPrimary">@color/md_theme_dark_onPrimary</item>
|
<item name="colorOnPrimary">@color/md_theme_dark_onPrimary</item>
|
||||||
<item name="colorPrimaryContainer">@color/md_theme_dark_primaryContainer</item>
|
<item name="colorPrimaryContainer">@color/md_theme_dark_primaryContainer</item>
|
||||||
|
@ -23,6 +23,7 @@
|
||||||
<item name="colorOnErrorContainer">@color/md_theme_dark_onErrorContainer</item>
|
<item name="colorOnErrorContainer">@color/md_theme_dark_onErrorContainer</item>
|
||||||
<item name="colorOutline">@color/md_theme_dark_outline</item>
|
<item name="colorOutline">@color/md_theme_dark_outline</item>
|
||||||
<item name="android:colorBackground">@color/md_theme_dark_background</item>
|
<item name="android:colorBackground">@color/md_theme_dark_background</item>
|
||||||
|
<item name="statusBar">@color/md_theme_dark_background</item>
|
||||||
<item name="colorOnBackground">@color/md_theme_dark_onBackground</item>
|
<item name="colorOnBackground">@color/md_theme_dark_onBackground</item>
|
||||||
<item name="colorSurface">@color/md_theme_dark_surface</item>
|
<item name="colorSurface">@color/md_theme_dark_surface</item>
|
||||||
<item name="colorOnSurface">@color/md_theme_dark_onSurface</item>
|
<item name="colorOnSurface">@color/md_theme_dark_onSurface</item>
|
||||||
|
@ -47,6 +48,7 @@
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="AppThemeBar" parent="Theme.Material3.Dark">
|
<style name="AppThemeBar" parent="Theme.Material3.Dark">
|
||||||
|
<item name="android:statusBarColor">?android:colorBackground</item>
|
||||||
<item name="linkColor">@color/md_theme_dark_primary</item>
|
<item name="linkColor">@color/md_theme_dark_primary</item>
|
||||||
<item name="colorPrimary">@color/md_theme_dark_primary</item>
|
<item name="colorPrimary">@color/md_theme_dark_primary</item>
|
||||||
<item name="colorOnPrimary">@color/md_theme_dark_onPrimary</item>
|
<item name="colorOnPrimary">@color/md_theme_dark_onPrimary</item>
|
||||||
|
@ -66,6 +68,7 @@
|
||||||
<item name="colorOnErrorContainer">@color/md_theme_dark_onErrorContainer</item>
|
<item name="colorOnErrorContainer">@color/md_theme_dark_onErrorContainer</item>
|
||||||
<item name="colorOutline">@color/md_theme_dark_outline</item>
|
<item name="colorOutline">@color/md_theme_dark_outline</item>
|
||||||
<item name="android:colorBackground">@color/md_theme_dark_background</item>
|
<item name="android:colorBackground">@color/md_theme_dark_background</item>
|
||||||
|
<item name="statusBar">@color/md_theme_dark_background</item>
|
||||||
<item name="colorOnBackground">@color/md_theme_dark_onBackground</item>
|
<item name="colorOnBackground">@color/md_theme_dark_onBackground</item>
|
||||||
<item name="colorSurface">@color/md_theme_dark_surface</item>
|
<item name="colorSurface">@color/md_theme_dark_surface</item>
|
||||||
<item name="colorOnSurface">@color/md_theme_dark_onSurface</item>
|
<item name="colorOnSurface">@color/md_theme_dark_onSurface</item>
|
||||||
|
@ -101,6 +104,7 @@
|
||||||
<item name="colorOnErrorContainer">@color/md_theme_dark_onErrorContainer</item>
|
<item name="colorOnErrorContainer">@color/md_theme_dark_onErrorContainer</item>
|
||||||
<item name="colorOutline">@color/md_theme_dark_outline</item>
|
<item name="colorOutline">@color/md_theme_dark_outline</item>
|
||||||
<item name="android:colorBackground">@color/md_theme_dark_background</item>
|
<item name="android:colorBackground">@color/md_theme_dark_background</item>
|
||||||
|
<item name="statusBar">@color/md_theme_dark_background</item>
|
||||||
<item name="colorOnBackground">@color/md_theme_dark_onBackground</item>
|
<item name="colorOnBackground">@color/md_theme_dark_onBackground</item>
|
||||||
<item name="colorSurface">@color/md_theme_dark_surface</item>
|
<item name="colorSurface">@color/md_theme_dark_surface</item>
|
||||||
<item name="colorOnSurface">@color/md_theme_dark_onSurface</item>
|
<item name="colorOnSurface">@color/md_theme_dark_onSurface</item>
|
||||||
|
@ -138,6 +142,7 @@
|
||||||
<item name="colorOnError">@color/solarized_md_theme_dark_onError</item>
|
<item name="colorOnError">@color/solarized_md_theme_dark_onError</item>
|
||||||
<item name="colorOnErrorContainer">@color/solarized_md_theme_dark_onErrorContainer</item>
|
<item name="colorOnErrorContainer">@color/solarized_md_theme_dark_onErrorContainer</item>
|
||||||
<item name="android:colorBackground">@color/solarized_md_theme_dark_background</item>
|
<item name="android:colorBackground">@color/solarized_md_theme_dark_background</item>
|
||||||
|
<item name="statusBar">@color/solarized_md_theme_dark_background</item>
|
||||||
<item name="colorOnBackground">@color/solarized_md_theme_dark_onBackground</item>
|
<item name="colorOnBackground">@color/solarized_md_theme_dark_onBackground</item>
|
||||||
<item name="colorSurface">@color/solarized_md_theme_dark_surface</item>
|
<item name="colorSurface">@color/solarized_md_theme_dark_surface</item>
|
||||||
<item name="colorOnSurface">@color/solarized_md_theme_dark_onSurface</item>
|
<item name="colorOnSurface">@color/solarized_md_theme_dark_onSurface</item>
|
||||||
|
@ -172,6 +177,7 @@
|
||||||
<item name="colorOnError">@color/solarized_md_theme_dark_onError</item>
|
<item name="colorOnError">@color/solarized_md_theme_dark_onError</item>
|
||||||
<item name="colorOnErrorContainer">@color/solarized_md_theme_dark_onErrorContainer</item>
|
<item name="colorOnErrorContainer">@color/solarized_md_theme_dark_onErrorContainer</item>
|
||||||
<item name="android:colorBackground">@color/solarized_md_theme_dark_background</item>
|
<item name="android:colorBackground">@color/solarized_md_theme_dark_background</item>
|
||||||
|
<item name="statusBar">@color/solarized_md_theme_dark_background</item>
|
||||||
<item name="colorOnBackground">@color/solarized_md_theme_dark_onBackground</item>
|
<item name="colorOnBackground">@color/solarized_md_theme_dark_onBackground</item>
|
||||||
<item name="colorSurface">@color/solarized_md_theme_dark_surface</item>
|
<item name="colorSurface">@color/solarized_md_theme_dark_surface</item>
|
||||||
<item name="colorOnSurface">@color/solarized_md_theme_dark_onSurface</item>
|
<item name="colorOnSurface">@color/solarized_md_theme_dark_onSurface</item>
|
||||||
|
@ -185,6 +191,7 @@
|
||||||
|
|
||||||
<style name="TransparentSolarized" parent="SolarizedAppThemeBar">
|
<style name="TransparentSolarized" parent="SolarizedAppThemeBar">
|
||||||
<item name="android:colorBackgroundCacheHint">@null</item>
|
<item name="android:colorBackgroundCacheHint">@null</item>
|
||||||
|
<item name="statusBar">@null</item>
|
||||||
<item name="android:windowContentOverlay">@null</item>
|
<item name="android:windowContentOverlay">@null</item>
|
||||||
<item name="android:windowIsFloating">false</item>
|
<item name="android:windowIsFloating">false</item>
|
||||||
<item name="android:windowIsTranslucent">true</item>
|
<item name="android:windowIsTranslucent">true</item>
|
||||||
|
@ -214,6 +221,7 @@
|
||||||
<item name="colorOnError">@color/solarized_md_theme_dark_onError</item>
|
<item name="colorOnError">@color/solarized_md_theme_dark_onError</item>
|
||||||
<item name="colorOnErrorContainer">@color/solarized_md_theme_dark_onErrorContainer</item>
|
<item name="colorOnErrorContainer">@color/solarized_md_theme_dark_onErrorContainer</item>
|
||||||
<item name="android:colorBackground">@color/solarized_md_theme_dark_background</item>
|
<item name="android:colorBackground">@color/solarized_md_theme_dark_background</item>
|
||||||
|
<item name="statusBar">@color/solarized_md_theme_dark_background</item>
|
||||||
<item name="colorOnBackground">@color/solarized_md_theme_dark_onBackground</item>
|
<item name="colorOnBackground">@color/solarized_md_theme_dark_onBackground</item>
|
||||||
<item name="colorSurface">@color/solarized_md_theme_dark_surface</item>
|
<item name="colorSurface">@color/solarized_md_theme_dark_surface</item>
|
||||||
<item name="colorOnSurface">@color/solarized_md_theme_dark_onSurface</item>
|
<item name="colorOnSurface">@color/solarized_md_theme_dark_onSurface</item>
|
||||||
|
@ -246,6 +254,7 @@
|
||||||
<item name="colorOnError">@color/solarized_md_theme_dark_onError</item>
|
<item name="colorOnError">@color/solarized_md_theme_dark_onError</item>
|
||||||
<item name="colorOnErrorContainer">@color/solarized_md_theme_dark_onErrorContainer</item>
|
<item name="colorOnErrorContainer">@color/solarized_md_theme_dark_onErrorContainer</item>
|
||||||
<item name="android:colorBackground">@color/black</item>
|
<item name="android:colorBackground">@color/black</item>
|
||||||
|
<item name="statusBar">@color/black</item>
|
||||||
<item name="colorOnBackground">@color/white</item>
|
<item name="colorOnBackground">@color/white</item>
|
||||||
<item name="colorSurface">@color/black</item>
|
<item name="colorSurface">@color/black</item>
|
||||||
<item name="colorOnSurface">@color/white</item>
|
<item name="colorOnSurface">@color/white</item>
|
||||||
|
@ -276,6 +285,7 @@
|
||||||
<item name="colorOnError">@color/solarized_md_theme_dark_onError</item>
|
<item name="colorOnError">@color/solarized_md_theme_dark_onError</item>
|
||||||
<item name="colorOnErrorContainer">@color/solarized_md_theme_dark_onErrorContainer</item>
|
<item name="colorOnErrorContainer">@color/solarized_md_theme_dark_onErrorContainer</item>
|
||||||
<item name="android:colorBackground">@color/black</item>
|
<item name="android:colorBackground">@color/black</item>
|
||||||
|
<item name="statusBar">@color/black</item>
|
||||||
<item name="colorOnBackground">@color/white</item>
|
<item name="colorOnBackground">@color/white</item>
|
||||||
<item name="colorSurface">@color/black</item>
|
<item name="colorSurface">@color/black</item>
|
||||||
<item name="colorOnSurface">@color/white</item>
|
<item name="colorOnSurface">@color/white</item>
|
||||||
|
@ -289,6 +299,7 @@
|
||||||
|
|
||||||
<style name="TransparentBlack" parent="BlackAppThemeBar">
|
<style name="TransparentBlack" parent="BlackAppThemeBar">
|
||||||
<item name="android:colorBackgroundCacheHint">@null</item>
|
<item name="android:colorBackgroundCacheHint">@null</item>
|
||||||
|
<item name="statusBar">@null</item>
|
||||||
<item name="android:windowContentOverlay">@null</item>
|
<item name="android:windowContentOverlay">@null</item>
|
||||||
<item name="android:windowIsFloating">false</item>
|
<item name="android:windowIsFloating">false</item>
|
||||||
<item name="android:windowIsTranslucent">true</item>
|
<item name="android:windowIsTranslucent">true</item>
|
||||||
|
@ -314,6 +325,7 @@
|
||||||
<item name="colorOnError">@color/solarized_md_theme_dark_onError</item>
|
<item name="colorOnError">@color/solarized_md_theme_dark_onError</item>
|
||||||
<item name="colorOnErrorContainer">@color/solarized_md_theme_dark_onErrorContainer</item>
|
<item name="colorOnErrorContainer">@color/solarized_md_theme_dark_onErrorContainer</item>
|
||||||
<item name="android:colorBackground">@color/black</item>
|
<item name="android:colorBackground">@color/black</item>
|
||||||
|
<item name="statusBar">@color/black</item>
|
||||||
<item name="colorOnBackground">@color/white</item>
|
<item name="colorOnBackground">@color/white</item>
|
||||||
<item name="colorSurface">@color/black</item>
|
<item name="colorSurface">@color/black</item>
|
||||||
<item name="colorOnSurface">@color/white</item>
|
<item name="colorOnSurface">@color/white</item>
|
||||||
|
@ -347,6 +359,7 @@
|
||||||
<item name="colorOnError">@color/solarized_md_theme_dark_onError</item>
|
<item name="colorOnError">@color/solarized_md_theme_dark_onError</item>
|
||||||
<item name="colorOnErrorContainer">@color/solarized_md_theme_dark_onErrorContainer</item>
|
<item name="colorOnErrorContainer">@color/solarized_md_theme_dark_onErrorContainer</item>
|
||||||
<item name="android:colorBackground">@color/dracula_background</item>
|
<item name="android:colorBackground">@color/dracula_background</item>
|
||||||
|
<item name="statusBar">@color/dracula_background</item>
|
||||||
<item name="colorOnBackground">@color/dracula_foreground</item>
|
<item name="colorOnBackground">@color/dracula_foreground</item>
|
||||||
<item name="colorSurface">@color/dracula_background</item>
|
<item name="colorSurface">@color/dracula_background</item>
|
||||||
<item name="colorOnSurface">@color/dracula_foreground</item>
|
<item name="colorOnSurface">@color/dracula_foreground</item>
|
||||||
|
@ -378,6 +391,7 @@
|
||||||
<item name="colorOnError">@color/solarized_md_theme_dark_onError</item>
|
<item name="colorOnError">@color/solarized_md_theme_dark_onError</item>
|
||||||
<item name="colorOnErrorContainer">@color/solarized_md_theme_dark_onErrorContainer</item>
|
<item name="colorOnErrorContainer">@color/solarized_md_theme_dark_onErrorContainer</item>
|
||||||
<item name="android:colorBackground">@color/dracula_background</item>
|
<item name="android:colorBackground">@color/dracula_background</item>
|
||||||
|
<item name="statusBar">@color/dracula_background</item>
|
||||||
<item name="colorOnBackground">@color/dracula_foreground</item>
|
<item name="colorOnBackground">@color/dracula_foreground</item>
|
||||||
<item name="colorSurface">@color/dracula_background</item>
|
<item name="colorSurface">@color/dracula_background</item>
|
||||||
<item name="colorOnSurface">@color/dracula_foreground</item>
|
<item name="colorOnSurface">@color/dracula_foreground</item>
|
||||||
|
@ -391,6 +405,7 @@
|
||||||
|
|
||||||
<style name="TransparentDracula" parent="DraculaAppThemeBar">
|
<style name="TransparentDracula" parent="DraculaAppThemeBar">
|
||||||
<item name="android:colorBackgroundCacheHint">@null</item>
|
<item name="android:colorBackgroundCacheHint">@null</item>
|
||||||
|
<item name="statusBar">@null</item>
|
||||||
<item name="android:windowContentOverlay">@null</item>
|
<item name="android:windowContentOverlay">@null</item>
|
||||||
<item name="android:windowIsFloating">false</item>
|
<item name="android:windowIsFloating">false</item>
|
||||||
<item name="android:windowIsTranslucent">true</item>
|
<item name="android:windowIsTranslucent">true</item>
|
||||||
|
@ -416,6 +431,7 @@
|
||||||
<item name="colorOnError">@color/solarized_md_theme_dark_onError</item>
|
<item name="colorOnError">@color/solarized_md_theme_dark_onError</item>
|
||||||
<item name="colorOnErrorContainer">@color/solarized_md_theme_dark_onErrorContainer</item>
|
<item name="colorOnErrorContainer">@color/solarized_md_theme_dark_onErrorContainer</item>
|
||||||
<item name="android:colorBackground">@color/dracula_background</item>
|
<item name="android:colorBackground">@color/dracula_background</item>
|
||||||
|
<item name="statusBar">@color/dracula_background</item>
|
||||||
<item name="colorOnBackground">@color/dracula_foreground</item>
|
<item name="colorOnBackground">@color/dracula_foreground</item>
|
||||||
<item name="colorSurface">@color/dracula_background</item>
|
<item name="colorSurface">@color/dracula_background</item>
|
||||||
<item name="colorOnSurface">@color/dracula_foreground</item>
|
<item name="colorOnSurface">@color/dracula_foreground</item>
|
||||||
|
|
|
@ -609,7 +609,7 @@
|
||||||
<string name="profiled_updated">Profiel is bijgewerkt!</string>
|
<string name="profiled_updated">Profiel is bijgewerkt!</string>
|
||||||
<string name="select_a_theme">Kies een thema</string>
|
<string name="select_a_theme">Kies een thema</string>
|
||||||
<string name="types_of_notifications_to_display">Soorten meldingen tonen</string>
|
<string name="types_of_notifications_to_display">Soorten meldingen tonen</string>
|
||||||
<string name="fetch_more_messages">Haal meer berichten op…</string>
|
<string name="fetch_more_messages">Laad meer berichten…</string>
|
||||||
<string name="label_oval">Ovaal</string>
|
<string name="label_oval">Ovaal</string>
|
||||||
<string name="label_rectangle">Rechthoek</string>
|
<string name="label_rectangle">Rechthoek</string>
|
||||||
<string name="label_eraser_mode">Wis modus</string>
|
<string name="label_eraser_mode">Wis modus</string>
|
||||||
|
@ -910,4 +910,29 @@
|
||||||
<string name="type_of_theme">Kies het type thema</string>
|
<string name="type_of_theme">Kies het type thema</string>
|
||||||
<string name="pref_customize_summary">Sta toe je aangepaste kleuren in te stellen voor thema\'s.</string>
|
<string name="pref_customize_summary">Sta toe je aangepaste kleuren in te stellen voor thema\'s.</string>
|
||||||
<string name="set_dynamic_color_indication">Stem af op het kleurenschema van uw persoonlijke wallpaper.</string>
|
<string name="set_dynamic_color_indication">Stem af op het kleurenschema van uw persoonlijke wallpaper.</string>
|
||||||
|
<string name="toast_error_fetch_message">De app vond het remote bericht niet.</string>
|
||||||
|
<string name="set_cardview_indication">Ingeschakeld geeft dit een schaduw en verhoging bij items in tijdlijnen.</string>
|
||||||
|
<string name="light_custom_colors">Licht - aangepaste kleuren</string>
|
||||||
|
<string name="toast_on_your_instance">De conversatie begon op jouw server!</string>
|
||||||
|
<string name="toast_try_later">Probeer het later nog eens.</string>
|
||||||
|
<string name="unfollow_tag">Ontvolg tag</string>
|
||||||
|
<string name="muted_menu_home">Genegeerde gebruikers bij Home</string>
|
||||||
|
<string name="set_cardview">Verhoogde kaarten</string>
|
||||||
|
<string name="set_customize_light">Lichte thema aanpassen</string>
|
||||||
|
<string name="set_customize_light_indication">Sta toe om bij het lichte thema sommige elementen in berichten aan te passen.</string>
|
||||||
|
<string name="set_customize_dark">Donkere thema aanpassen</string>
|
||||||
|
<string name="set_customize_dark_indication">Sta toe om bij het donkere thema sommige elementen in berichten aan te passen.</string>
|
||||||
|
<string name="set_custom_colors">Aangepaste kleuren instellen</string>
|
||||||
|
<string name="cark_custom_colors">Donker - aangepaste kleuren</string>
|
||||||
|
<string name="unmute_tag_action">Negeer tag niet meer</string>
|
||||||
|
<string name="pin_tag">Zet tag vast</string>
|
||||||
|
<string name="mute_home">Negeer voor home</string>
|
||||||
|
<string name="unmute_home">Negeer niet meer voor home</string>
|
||||||
|
<string name="display_remote_conversation">Remote conversatie tonen</string>
|
||||||
|
<string name="add_all_users_home_muted">Voeg alle gebruikers genegeerd toe aan home</string>
|
||||||
|
<string name="put_all_accounts_in_home_muted">Alle accounts worden genegeerd op de Home tijdlijn.</string>
|
||||||
|
<string name="mute_them_all">Negeer ze allemaal</string>
|
||||||
|
<string name="mute_tag_action">Negeer tag</string>
|
||||||
|
<string name="set_display_translate_indication">Vertaalknop altijd tonen</string>
|
||||||
|
<string name="unpin_tag">Maak tag los</string>
|
||||||
</resources>
|
</resources>
|
|
@ -920,4 +920,10 @@
|
||||||
<string name="unmute_tag_action">Torra a ativare s\'eticheta</string>
|
<string name="unmute_tag_action">Torra a ativare s\'eticheta</string>
|
||||||
<string name="pin_tag">Apica s\'eticheta</string>
|
<string name="pin_tag">Apica s\'eticheta</string>
|
||||||
<string name="unfollow_tag">Non sigas prus s\'eticheta</string>
|
<string name="unfollow_tag">Non sigas prus s\'eticheta</string>
|
||||||
|
<string name="mute_home">Pone a sa muda pro sa pàgina printzipale</string>
|
||||||
|
<string name="muted_menu_home">Serbidores a sa muda in sa pàgina printzipale</string>
|
||||||
|
<string name="add_all_users_home_muted">Annanghe totu is utentes in sa pàgina printzipale a sa muda</string>
|
||||||
|
<string name="unmute_home">Torra a ativare pro sa pàgina printzipale</string>
|
||||||
|
<string name="put_all_accounts_in_home_muted">Totu is contos ant a abarrare a sa muda in sa lìnia de tempus printzipale.</string>
|
||||||
|
<string name="mute_them_all">Pone·los totus a sa muda</string>
|
||||||
</resources>
|
</resources>
|
|
@ -178,25 +178,25 @@
|
||||||
<color name="solarized_md_theme_light_surfaceTint">#576500</color>
|
<color name="solarized_md_theme_light_surfaceTint">#576500</color>
|
||||||
<color name="solarized_md_theme_light_outlineVariant">#C7C7B7</color>
|
<color name="solarized_md_theme_light_outlineVariant">#C7C7B7</color>
|
||||||
<color name="solarized_md_theme_light_scrim">#000000</color>
|
<color name="solarized_md_theme_light_scrim">#000000</color>
|
||||||
<color name="solarized_md_theme_dark_primary">#BBD144</color>
|
<color name="solarized_md_theme_dark_primary">#859900</color>
|
||||||
<color name="solarized_md_theme_dark_onPrimary">#2C3400</color>
|
<color name="solarized_md_theme_dark_onPrimary">#eee8d5</color>
|
||||||
<color name="solarized_md_theme_dark_primaryContainer">#414C00</color>
|
<color name="solarized_md_theme_dark_primaryContainer">#414C00</color>
|
||||||
<color name="solarized_md_theme_dark_onPrimaryContainer">#D7EE5E</color>
|
<color name="solarized_md_theme_dark_onPrimaryContainer">#eee8d5</color>
|
||||||
<color name="solarized_md_theme_dark_secondary">#C6C9A8</color>
|
<color name="solarized_md_theme_dark_secondary">#C6C9A8</color>
|
||||||
<color name="solarized_md_theme_dark_onSecondary">#2F321B</color>
|
<color name="solarized_md_theme_dark_onSecondary">#2F321B</color>
|
||||||
<color name="solarized_md_theme_dark_secondaryContainer">#45492F</color>
|
<color name="solarized_md_theme_dark_secondaryContainer">#45492F</color>
|
||||||
<color name="solarized_md_theme_dark_onSecondaryContainer">#E2E5C2</color>
|
<color name="solarized_md_theme_dark_onSecondaryContainer">#E2E5C2</color>
|
||||||
<color name="solarized_md_theme_dark_tertiary">#A2D0C3</color>
|
<color name="solarized_md_theme_dark_tertiary">#073642</color>
|
||||||
<color name="solarized_md_theme_dark_onTertiary">#05372E</color>
|
<color name="solarized_md_theme_dark_onTertiary">#fdf6e3</color>
|
||||||
<color name="solarized_md_theme_dark_tertiaryContainer">#224E44</color>
|
<color name="solarized_md_theme_dark_tertiaryContainer">#073642</color>
|
||||||
<color name="solarized_md_theme_dark_onTertiaryContainer">#BDECDF</color>
|
<color name="solarized_md_theme_dark_onTertiaryContainer">#fdf6e3</color>
|
||||||
<color name="solarized_md_theme_dark_error">#FFB4AB</color>
|
<color name="solarized_md_theme_dark_error">#FFB4AB</color>
|
||||||
<color name="solarized_md_theme_dark_errorContainer">#93000A</color>
|
<color name="solarized_md_theme_dark_errorContainer">#93000A</color>
|
||||||
<color name="solarized_md_theme_dark_onError">#690005</color>
|
<color name="solarized_md_theme_dark_onError">#690005</color>
|
||||||
<color name="solarized_md_theme_dark_onErrorContainer">#FFDAD6</color>
|
<color name="solarized_md_theme_dark_onErrorContainer">#FFDAD6</color>
|
||||||
<color name="solarized_md_theme_dark_background">#002b36</color>
|
<color name="solarized_md_theme_dark_background">#002b36</color>
|
||||||
<color name="solarized_md_theme_dark_onBackground">#E5E2DA</color>
|
<color name="solarized_md_theme_dark_onBackground">#E5E2DA</color>
|
||||||
<color name="solarized_md_theme_dark_surface">#073642</color>
|
<color name="solarized_md_theme_dark_surface">#002b36</color>
|
||||||
<color name="solarized_md_theme_dark_onSurface">#E5E2DA</color>
|
<color name="solarized_md_theme_dark_onSurface">#E5E2DA</color>
|
||||||
<color name="solarized_md_theme_dark_surfaceVariant">#46483B</color>
|
<color name="solarized_md_theme_dark_surfaceVariant">#46483B</color>
|
||||||
<color name="solarized_md_theme_dark_onSurfaceVariant">#C7C7B7</color>
|
<color name="solarized_md_theme_dark_onSurfaceVariant">#C7C7B7</color>
|
||||||
|
|
|
@ -2107,4 +2107,5 @@
|
||||||
<string name="add_all_users_home_muted">Add all users in muted home</string>
|
<string name="add_all_users_home_muted">Add all users in muted home</string>
|
||||||
<string name="put_all_accounts_in_home_muted">All accounts will be muted for the Home timeline.</string>
|
<string name="put_all_accounts_in_home_muted">All accounts will be muted for the Home timeline.</string>
|
||||||
<string name="mute_them_all">Mute them all</string>
|
<string name="mute_them_all">Mute them all</string>
|
||||||
|
<string name="import_data">Import data</string>
|
||||||
</resources>
|
</resources>
|
|
@ -1,6 +1,7 @@
|
||||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
|
||||||
<attr name="linkColor" type="color" />
|
<attr name="linkColor" type="color" />
|
||||||
|
<attr name="statusBar" type="color" />
|
||||||
|
|
||||||
<style name="AppTheme" parent="Theme.Material3.Light.NoActionBar">
|
<style name="AppTheme" parent="Theme.Material3.Light.NoActionBar">
|
||||||
<item name="linkColor">@color/md_theme_light_primary</item>
|
<item name="linkColor">@color/md_theme_light_primary</item>
|
||||||
|
@ -22,6 +23,7 @@
|
||||||
<item name="colorOnErrorContainer">@color/md_theme_light_onErrorContainer</item>
|
<item name="colorOnErrorContainer">@color/md_theme_light_onErrorContainer</item>
|
||||||
<item name="colorOutline">@color/md_theme_light_outline</item>
|
<item name="colorOutline">@color/md_theme_light_outline</item>
|
||||||
<item name="android:colorBackground">@color/md_theme_light_background</item>
|
<item name="android:colorBackground">@color/md_theme_light_background</item>
|
||||||
|
<item name="statusBar">@color/md_theme_light_background</item>
|
||||||
<item name="colorOnBackground">@color/md_theme_light_onBackground</item>
|
<item name="colorOnBackground">@color/md_theme_light_onBackground</item>
|
||||||
<item name="colorSurface">@color/md_theme_light_surface</item>
|
<item name="colorSurface">@color/md_theme_light_surface</item>
|
||||||
<item name="colorOnSurface">@color/md_theme_light_onSurface</item>
|
<item name="colorOnSurface">@color/md_theme_light_onSurface</item>
|
||||||
|
@ -43,6 +45,7 @@
|
||||||
</item>
|
</item>
|
||||||
<item name="android:windowSharedElementExitTransition">@transition/change_image_transform
|
<item name="android:windowSharedElementExitTransition">@transition/change_image_transform
|
||||||
</item>
|
</item>
|
||||||
|
<item name="android:statusBarColor">?android:colorBackground</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="AppThemeBar" parent="Theme.Material3.Light">
|
<style name="AppThemeBar" parent="Theme.Material3.Light">
|
||||||
|
@ -65,6 +68,7 @@
|
||||||
<item name="colorOnErrorContainer">@color/md_theme_light_onErrorContainer</item>
|
<item name="colorOnErrorContainer">@color/md_theme_light_onErrorContainer</item>
|
||||||
<item name="colorOutline">@color/md_theme_light_outline</item>
|
<item name="colorOutline">@color/md_theme_light_outline</item>
|
||||||
<item name="android:colorBackground">@color/md_theme_light_background</item>
|
<item name="android:colorBackground">@color/md_theme_light_background</item>
|
||||||
|
<item name="statusBar">@color/md_theme_light_background</item>
|
||||||
<item name="colorOnBackground">@color/md_theme_light_onBackground</item>
|
<item name="colorOnBackground">@color/md_theme_light_onBackground</item>
|
||||||
<item name="colorSurface">@color/md_theme_light_surface</item>
|
<item name="colorSurface">@color/md_theme_light_surface</item>
|
||||||
<item name="colorOnSurface">@color/md_theme_light_onSurface</item>
|
<item name="colorOnSurface">@color/md_theme_light_onSurface</item>
|
||||||
|
@ -77,6 +81,7 @@
|
||||||
<item name="android:windowLightStatusBar" tools:targetApi="m">true</item>
|
<item name="android:windowLightStatusBar" tools:targetApi="m">true</item>
|
||||||
<item name="android:windowLightNavigationBar" tools:targetApi="o_mr1">true</item>
|
<item name="android:windowLightNavigationBar" tools:targetApi="o_mr1">true</item>
|
||||||
<item name="android:isLightTheme" tools:targetApi="q">true</item>
|
<item name="android:isLightTheme" tools:targetApi="q">true</item>
|
||||||
|
<item name="android:statusBarColor">?android:colorBackground</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="Transparent" parent="AppThemeBar">
|
<style name="Transparent" parent="AppThemeBar">
|
||||||
|
@ -107,6 +112,7 @@
|
||||||
<item name="colorOnErrorContainer">@color/md_theme_light_onErrorContainer</item>
|
<item name="colorOnErrorContainer">@color/md_theme_light_onErrorContainer</item>
|
||||||
<item name="colorOutline">@color/md_theme_light_outline</item>
|
<item name="colorOutline">@color/md_theme_light_outline</item>
|
||||||
<item name="android:colorBackground">@color/md_theme_light_background</item>
|
<item name="android:colorBackground">@color/md_theme_light_background</item>
|
||||||
|
<item name="statusBar">@color/md_theme_light_background</item>
|
||||||
<item name="colorOnBackground">@color/md_theme_light_onBackground</item>
|
<item name="colorOnBackground">@color/md_theme_light_onBackground</item>
|
||||||
<item name="colorSurface">@color/md_theme_light_surface</item>
|
<item name="colorSurface">@color/md_theme_light_surface</item>
|
||||||
<item name="colorOnSurface">@color/md_theme_light_onSurface</item>
|
<item name="colorOnSurface">@color/md_theme_light_onSurface</item>
|
||||||
|
@ -143,6 +149,7 @@
|
||||||
<item name="colorOnError">@color/solarized_md_theme_light_onError</item>
|
<item name="colorOnError">@color/solarized_md_theme_light_onError</item>
|
||||||
<item name="colorOnErrorContainer">@color/solarized_md_theme_light_onErrorContainer</item>
|
<item name="colorOnErrorContainer">@color/solarized_md_theme_light_onErrorContainer</item>
|
||||||
<item name="android:colorBackground">@color/solarized_md_theme_light_background</item>
|
<item name="android:colorBackground">@color/solarized_md_theme_light_background</item>
|
||||||
|
<item name="statusBar">@color/solarized_md_theme_light_background</item>
|
||||||
<item name="colorOnBackground">@color/solarized_md_theme_light_onBackground</item>
|
<item name="colorOnBackground">@color/solarized_md_theme_light_onBackground</item>
|
||||||
<item name="colorSurface">@color/solarized_md_theme_light_surface</item>
|
<item name="colorSurface">@color/solarized_md_theme_light_surface</item>
|
||||||
<item name="colorOnSurface">@color/solarized_md_theme_light_onSurface</item>
|
<item name="colorOnSurface">@color/solarized_md_theme_light_onSurface</item>
|
||||||
|
@ -186,6 +193,7 @@
|
||||||
<item name="colorOnError">@color/solarized_md_theme_light_onError</item>
|
<item name="colorOnError">@color/solarized_md_theme_light_onError</item>
|
||||||
<item name="colorOnErrorContainer">@color/solarized_md_theme_light_onErrorContainer</item>
|
<item name="colorOnErrorContainer">@color/solarized_md_theme_light_onErrorContainer</item>
|
||||||
<item name="android:colorBackground">@color/solarized_md_theme_light_background</item>
|
<item name="android:colorBackground">@color/solarized_md_theme_light_background</item>
|
||||||
|
<item name="statusBar">@color/solarized_md_theme_light_background</item>
|
||||||
<item name="colorOnBackground">@color/solarized_md_theme_light_onBackground</item>
|
<item name="colorOnBackground">@color/solarized_md_theme_light_onBackground</item>
|
||||||
<item name="colorSurface">@color/solarized_md_theme_light_surface</item>
|
<item name="colorSurface">@color/solarized_md_theme_light_surface</item>
|
||||||
<item name="colorOnSurface">@color/solarized_md_theme_light_onSurface</item>
|
<item name="colorOnSurface">@color/solarized_md_theme_light_onSurface</item>
|
||||||
|
|
12
src/fdroid/fastlane/metadata/android/en/changelogs/450.txt
Normal file
12
src/fdroid/fastlane/metadata/android/en/changelogs/450.txt
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
Added:
|
||||||
|
- Full data import/export feature
|
||||||
|
- Android 13 themed icon support
|
||||||
|
|
||||||
|
Fixed:
|
||||||
|
- Fix a regression with filters
|
||||||
|
- Fix dark solarized theme
|
||||||
|
- Fix hide link previews for CW
|
||||||
|
- Fix status bar color for all themes
|
||||||
|
- Fix language in compose "..."
|
||||||
|
- Fix add all home muted accounts from lists
|
||||||
|
- Fix top notification badges
|
Loading…
Reference in a new issue