Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 15 additions & 1 deletion app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,13 @@ plugins {

dependencies {
implementation(project(":cats"))
implementation(project(":relay"))
implementation(project(":relay")) {
// Excluding com.google.crypto.tink:tink in favor of com.google.crypto.tink:tink-android
// that is pulled by androidx.security:security-crypto
exclude("com.google.crypto.tink", "tink")
}

implementation(libs.androidx.security.crypto)

// these two are required for logging within the relay module. todo remove?
implementation(libs.slf4j.api)
Expand Down Expand Up @@ -49,6 +55,10 @@ dependencies {

testImplementation(libs.junit.jupiter)
testImplementation(libs.junit.jupiter.params)
testImplementation(libs.robolectric)
testImplementation(libs.androidx.text.ext.junit)
testImplementation(libs.junit.vintage.engine)
testImplementation(libs.sharedpreferencesmock)
}

tasks.withType<JavaCompile> {
Expand Down Expand Up @@ -123,6 +133,10 @@ android {
viewBinding = true
buildConfig = true
}

testOptions {
unitTests.isIncludeAndroidResources = true
}
}

fun versionBanner(): String {
Expand Down
5 changes: 4 additions & 1 deletion app/proguard-rules.pro
Original file line number Diff line number Diff line change
Expand Up @@ -133,13 +133,16 @@
-dontwarn java.beans.PropertyDescriptor


# Gets rid of the warning,
# Gets rid of the warnings such as:
# Missing class com.google.errorprone.annotations.Immutable
# (referenced from: com.google.crypto.tink.util.Bytes)
# Should be safe to use. See:
# https://github.com/google/tink/issues/536
# https://issuetracker.google.com/issues/195752905
-dontwarn com.google.errorprone.annotations.Immutable
-dontwarn com.google.errorprone.annotations.CanIgnoreReturnValue
-dontwarn com.google.errorprone.annotations.CheckReturnValue
-dontwarn com.google.errorprone.annotations.RestrictedApi

# ~*~*~*~ Historical rules, left here for lamenting and general amusement ~*~*~*~

Expand Down
2 changes: 2 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@
<application
android:name=".Weechat"
android:allowBackup="true"
android:fullBackupContent="@xml/backup_rules_for_api_30_and_below"
android:dataExtractionRules="@xml/backup_rules_for_api_31_and_above"
android:icon="@mipmap/ic_launcher_kitty"
android:label="@string/etc__application_name"
android:theme="@style/Weechat"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package androidx.preference

import android.annotation.SuppressLint
import android.content.SharedPreferences
import android.os.Bundle
import androidx.annotation.CallSuper
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty


inline fun <reified T, V> privateFieldMadeAccessible(fieldName: String) =
object : ReadWriteProperty<T, V> {
private val field = T::class.java
.getDeclaredField(fieldName)
.apply { isAccessible = true }

override fun getValue(thisRef: T, property: KProperty<*>): V {
return field.get(thisRef) as V
}

override fun setValue(thisRef: T, property: KProperty<*>, value: V) {
field.set(thisRef, value)
}
}


/**
* A somewhat hacky way of having custom shared preferences in a preference fragment.
* In [onCreate], `PreferenceFragmentCompat` assigns to `mPreferenceManager`,
* and then calls `onCreatePreferences`. We intercept this call and replace the manager.
*
* Overriding [PreferenceManager.getSharedPreferences] should be safe,
* as [PreferenceManager.mSharedPreferences] seems not be used elsewhere.
*/
@SuppressLint("RestrictedApi")
abstract class PreferenceFragmentCompatWithCustomSharedPreferences : PreferenceFragmentCompat() {
abstract fun getCustomSharedPreferences(): SharedPreferences

private var mPreferenceManager: PreferenceManager
by privateFieldMadeAccessible<PreferenceFragmentCompat, _>("mPreferenceManager")

@CallSuper override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
val customSharedPreferences = getCustomSharedPreferences()

val customPreferenceManager = object : PreferenceManager(requireContext()) {
override fun getSharedPreferences() = customSharedPreferences
}

mPreferenceManager = customPreferenceManager
mPreferenceManager.onNavigateToScreenListener = this
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ class PrivateKeyPickerPreference(context: Context?, attrs: AttributeSet?) :
successMessage = context.getString(R.string.pref__PrivateKeyPickerPreference__success_key_forgotten)
}

sharedPreferences!!.edit { putString(Constants.PREF_SSH_KEY_FILE, valueToStore) }
sharedPreferences!!.edit { putString(key, valueToStore) }
notifyChanged()

return successMessage
Expand Down
5 changes: 3 additions & 2 deletions app/src/main/java/androidx/preference/ThemeManager.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,13 @@ import android.content.Intent
import com.ubergeek42.WeechatAndroid.R
import com.ubergeek42.WeechatAndroid.service.P
import com.ubergeek42.WeechatAndroid.upload.Suri
import com.ubergeek42.WeechatAndroid.upload.applicationContext
import com.ubergeek42.WeechatAndroid.utils.applicationContext
import com.ubergeek42.WeechatAndroid.upload.resolver
import com.ubergeek42.WeechatAndroid.upload.suppress
import com.ubergeek42.WeechatAndroid.utils.Constants
import com.ubergeek42.WeechatAndroid.utils.Toaster
import com.ubergeek42.WeechatAndroid.utils.getUris
import com.ubergeek42.WeechatAndroid.utils.multiSharedPreferences
import com.ubergeek42.WeechatAndroid.utils.saveUriToFile
import com.ubergeek42.weechat.ColorScheme
import okhttp3.MediaType.Companion.toMediaTypeOrNull
Expand All @@ -27,7 +28,7 @@ object ThemeManager {
}

@JvmStatic fun loadColorSchemeFromPreferences(context: Context) {
val path = PreferenceManager.getDefaultSharedPreferences(context)
val path = multiSharedPreferences
.getString(if (P.darkThemeActive) Constants.PREF_COLOR_SCHEME_NIGHT else Constants.PREF_COLOR_SCHEME_DAY,
if (P.darkThemeActive) Constants.PREF_COLOR_SCHEME_NIGHT_D else Constants.PREF_COLOR_SCHEME_DAY_D)
suppress<Exception>(showToast = true) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.ubergeek42.WeechatAndroid;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
Expand All @@ -20,6 +21,7 @@
import androidx.preference.FontManager;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.PreferenceFragmentCompatWithCustomSharedPreferences;
import androidx.preference.PreferenceGroup;
import androidx.preference.PreferenceScreen;
import androidx.preference.RingtonePreferenceFix;
Expand All @@ -40,6 +42,7 @@
import static androidx.preference.FontManagerKt.IMPORT_FONTS_REQUEST_CODE;
import static androidx.preference.ThemeManagerKt.IMPORT_THEMES_REQUEST_CODE;
import static com.ubergeek42.WeechatAndroid.utils.Constants.*;
import static com.ubergeek42.WeechatAndroid.utils.MultiSharedPreferencesKt.multiSharedPreferences;
import static com.ubergeek42.WeechatAndroid.utils.Toaster.ErrorToast;

public class PreferencesActivity extends AppCompatActivity implements PreferenceFragmentCompat.OnPreferenceStartScreenCallback {
Expand Down Expand Up @@ -112,7 +115,12 @@ public class PreferencesActivity extends AppCompatActivity implements Preference

////////////////////////////////////////////////////////////////////////////////////////////////

public static class PreferencesFragment extends PreferenceFragmentCompat implements DialogPreference.TargetFragment, Preference.OnPreferenceChangeListener {
public static class PreferencesFragment extends PreferenceFragmentCompatWithCustomSharedPreferences implements DialogPreference.TargetFragment, Preference.OnPreferenceChangeListener {

@NonNull @Override public SharedPreferences getCustomSharedPreferences() {
return multiSharedPreferences;
}


private static final String FRAGMENT_DIALOG_TAG = "android.support.v7.preference.PreferenceFragment.DIALOG";
private String key;
Expand Down Expand Up @@ -154,6 +162,8 @@ public static class PreferencesFragment extends PreferenceFragmentCompat impleme
// this makes fragment display preferences. key is the key of the preference screen
// that this fragment is supposed to display. the key is set in activity's onCreate
@Override public void onCreatePreferences(Bundle bundle, String key) {
super.onCreatePreferences(bundle, key);

setPreferencesFromResource(R.xml.preferences, this.key = key);

fixMultiLineTitles(getPreferenceScreen());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ import com.ubergeek42.WeechatAndroid.utils.Toaster
import com.ubergeek42.WeechatAndroid.utils.findCause
import com.ubergeek42.WeechatAndroid.utils.isAnyOf
import com.ubergeek42.WeechatAndroid.utils.let
import com.ubergeek42.WeechatAndroid.utils.multiSharedPreferences
import com.ubergeek42.WeechatAndroid.utils.u
import com.ubergeek42.WeechatAndroid.utils.ulet
import com.ubergeek42.WeechatAndroid.utils.wasCausedBy
Expand Down Expand Up @@ -527,15 +528,15 @@ class WeechatActivity : AppCompatActivity(), CutePageChangeListener,
}
R.id.menu_filter_lines -> {
item.isChecked = !P.filterLines
PreferenceManager.getDefaultSharedPreferences(this)
multiSharedPreferences
.edit()
.putBoolean(Constants.PREF_FILTER_LINES, item.isChecked)
.apply()
}
R.id.menu_dark_theme -> {
item.isChecked = !P.darkThemeActive
val value = if (item.isChecked) Constants.PREF_THEME_DARK else Constants.PREF_THEME_LIGHT
PreferenceManager.getDefaultSharedPreferences(this)
multiSharedPreferences
.edit()
.putString(Constants.PREF_THEME, value)
.apply()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import com.ubergeek42.WeechatAndroid.dialogs.FancyAlertDialogBuilder
import com.ubergeek42.WeechatAndroid.relay.BufferList
import com.ubergeek42.WeechatAndroid.relay.Line
import com.ubergeek42.WeechatAndroid.service.P
import com.ubergeek42.WeechatAndroid.upload.applicationContext
import com.ubergeek42.WeechatAndroid.utils.applicationContext
import com.ubergeek42.WeechatAndroid.utils.ThemeFix
import com.ubergeek42.WeechatAndroid.views.LineView
import com.ubergeek42.weechat.relay.connection.find
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.preference.PreferenceManager;

import com.ubergeek42.WeechatAndroid.Weechat;
import com.ubergeek42.WeechatAndroid.relay.BufferList;
import com.ubergeek42.WeechatAndroid.service.P;
import com.ubergeek42.WeechatAndroid.utils.Linkify;
Expand Down Expand Up @@ -52,6 +50,7 @@
import static com.ubergeek42.WeechatAndroid.utils.Constants.PREF_MEDIA_PREVIEW_THUMBNAIL_WIDTH;
import static com.ubergeek42.WeechatAndroid.utils.Constants.PREF_MEDIA_PREVIEW_THUMBNAIL_WIDTH_D;

import static com.ubergeek42.WeechatAndroid.utils.MultiSharedPreferencesKt.multiSharedPreferences;
import static com.ubergeek42.WeechatAndroid.utils.Toaster.ErrorToast;

public class Config {
Expand Down Expand Up @@ -130,7 +129,6 @@ public static class Info {
}

public static void initPreferences() {
SharedPreferences p = PreferenceManager.getDefaultSharedPreferences(Weechat.applicationContext);
for (String key : new String[] {
PREF_MEDIA_PREVIEW_ENABLED_FOR_NETWORK,
PREF_MEDIA_PREVIEW_ENABLED_FOR_LOCATION,
Expand All @@ -142,7 +140,7 @@ public static void initPreferences() {
PREF_MEDIA_PREVIEW_THUMBNAIL_MIN_HEIGHT,
PREF_MEDIA_PREVIEW_THUMBNAIL_MAX_HEIGHT
}) {
onSharedPreferenceChanged(p, key);
onSharedPreferenceChanged(multiSharedPreferences, key);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,9 @@

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.preference.PreferenceManager;

import com.bumptech.glide.Glide;
import com.bumptech.glide.GlideBuilder;
Expand All @@ -21,6 +19,7 @@

import static com.ubergeek42.WeechatAndroid.utils.Constants.PREF_IMAGE_DISK_CACHE_SIZE;
import static com.ubergeek42.WeechatAndroid.utils.Constants.PREF_IMAGE_DISK_CACHE_SIZE_D;
import static com.ubergeek42.WeechatAndroid.utils.MultiSharedPreferencesKt.multiSharedPreferences;

@GlideModule public class WAGlideModule extends AppGlideModule {
final private static @Root Kitty kitty = Kitty.make();
Expand All @@ -30,8 +29,7 @@
}

@Override public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder) {
SharedPreferences p = PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext());
String cacheSizeMb = p.getString(PREF_IMAGE_DISK_CACHE_SIZE, PREF_IMAGE_DISK_CACHE_SIZE_D);
String cacheSizeMb = multiSharedPreferences.getString(PREF_IMAGE_DISK_CACHE_SIZE, PREF_IMAGE_DISK_CACHE_SIZE_D);
long cacheSize = (long) (Float.parseFloat(cacheSizeMb) * 1000 * 1000);
builder.setDiskCache(new InternalCacheDiskCacheFactory(context, cacheSize));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import android.os.Build
import androidx.core.content.FileProvider
import androidx.core.graphics.drawable.IconCompat
import com.ubergeek42.WeechatAndroid.media.ContentUriFetcher
import com.ubergeek42.WeechatAndroid.upload.applicationContext
import com.ubergeek42.WeechatAndroid.utils.applicationContext
import com.ubergeek42.WeechatAndroid.upload.dp_to_px
import com.ubergeek42.WeechatAndroid.upload.suppress
import com.ubergeek42.WeechatAndroid.utils.Toaster
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,10 @@ import com.ubergeek42.WeechatAndroid.relay.from0xOrNull
import com.ubergeek42.WeechatAndroid.service.Events
import com.ubergeek42.WeechatAndroid.service.P
import com.ubergeek42.WeechatAndroid.service.RelayService
import com.ubergeek42.WeechatAndroid.upload.applicationContext
import com.ubergeek42.WeechatAndroid.utils.applicationContext
import com.ubergeek42.WeechatAndroid.utils.Constants
import com.ubergeek42.WeechatAndroid.utils.Toaster
import com.ubergeek42.WeechatAndroid.utils.multiSharedPreferences
import com.ubergeek42.cats.Cat
import com.ubergeek42.cats.Kitty
import com.ubergeek42.cats.Root
Expand Down Expand Up @@ -879,11 +880,9 @@ class NotificationPermissionChecker(private val activity: WeechatActivity) {
}
}

private val preferences by lazy { PreferenceManager.getDefaultSharedPreferences(Weechat.applicationContext) }

private var permissionWasDeniedOnce: Boolean
get() = preferences.getBoolean("notificationPermissionWasDeniedOnce", false)
set(value) { preferences.edit { putBoolean("notificationPermissionWasDeniedOnce", value) } }
get() = multiSharedPreferences.getBoolean("notificationPermissionWasDeniedOnce", false)
set(value) { multiSharedPreferences.edit { putBoolean("notificationPermissionWasDeniedOnce", value) } }

@RequiresApi(Build.VERSION_CODES.TIRAMISU)
class NotificationPermissionRationaleDialogFragment : DialogFragment() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import android.net.Uri
import androidx.core.app.Person
import androidx.core.graphics.drawable.IconCompat
import com.ubergeek42.WeechatAndroid.relay.Buffer
import com.ubergeek42.WeechatAndroid.upload.applicationContext
import com.ubergeek42.WeechatAndroid.utils.applicationContext


data class CachedPerson(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import com.ubergeek42.WeechatAndroid.relay.Buffer
import com.ubergeek42.WeechatAndroid.relay.BufferList
import com.ubergeek42.WeechatAndroid.relay.BufferSpec
import com.ubergeek42.WeechatAndroid.upload.Config
import com.ubergeek42.WeechatAndroid.upload.applicationContext
import com.ubergeek42.WeechatAndroid.utils.applicationContext
import com.ubergeek42.WeechatAndroid.utils.Constants
import com.ubergeek42.WeechatAndroid.utils.Constants.PREF_UPLOAD_ACCEPT_TEXT_AND_MEDIA
import com.ubergeek42.WeechatAndroid.utils.Constants.PREF_UPLOAD_ACCEPT_TEXT_ONLY
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import androidx.room.PrimaryKey
import androidx.room.Query
import androidx.room.Room
import androidx.room.RoomDatabase
import com.ubergeek42.WeechatAndroid.upload.applicationContext
import com.ubergeek42.WeechatAndroid.utils.applicationContext
import com.ubergeek42.cats.Kitty
import com.ubergeek42.cats.Root

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package com.ubergeek42.WeechatAndroid.search
import com.ubergeek42.WeechatAndroid.relay.Line
import com.ubergeek42.WeechatAndroid.relay.HeaderLine
import com.ubergeek42.WeechatAndroid.search.Search.Matcher
import com.ubergeek42.WeechatAndroid.upload.applicationContext
import com.ubergeek42.WeechatAndroid.utils.applicationContext
import java.util.regex.PatternSyntaxException


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,17 @@
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Build;
import android.preference.PreferenceManager;

import static com.ubergeek42.WeechatAndroid.utils.Constants.*;
import static com.ubergeek42.WeechatAndroid.utils.MultiSharedPreferencesKt.multiSharedPreferences;


public class BootUpReceiver extends BroadcastReceiver {

@Override public void onReceive(Context context, Intent intent) {
if (!"android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) return;

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
if (prefs.getBoolean(PREF_BOOT_CONNECT, PREF_BOOT_CONNECT_D)) {
if (multiSharedPreferences.getBoolean(PREF_BOOT_CONNECT, PREF_BOOT_CONNECT_D)) {
RelayService.startWithAction(context, RelayService.ACTION_START);
}
}
Expand Down
Loading