mirror of
https://codeberg.org/tom79/Fedilab.git
synced 2024-12-26 18:50:05 +02:00
Merge branch 'develop'
This commit is contained in:
commit
002bc4886b
110 changed files with 1792 additions and 587 deletions
|
@ -13,8 +13,8 @@ android {
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
minSdk 21
|
minSdk 21
|
||||||
targetSdk 32
|
targetSdk 32
|
||||||
versionCode 439
|
versionCode 443
|
||||||
versionName "3.9.4"
|
versionName "3.10.0"
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
}
|
}
|
||||||
flavorDimensions "default"
|
flavorDimensions "default"
|
||||||
|
@ -79,7 +79,11 @@ allprojects {
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation project(':autoimageslider')
|
implementation project(':autoimageslider')
|
||||||
implementation 'androidx.appcompat:appcompat:1.5.1'
|
implementation 'androidx.appcompat:appcompat:1.5.1'
|
||||||
|
|
||||||
implementation 'com.google.android.material:material:1.7.0'
|
implementation 'com.google.android.material:material:1.7.0'
|
||||||
|
|
||||||
|
implementation 'com.jaredrummler:colorpicker:1.1.0'
|
||||||
|
|
||||||
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
|
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
|
||||||
implementation "com.google.code.gson:gson:2.9.1"
|
implementation "com.google.code.gson:gson:2.9.1"
|
||||||
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
|
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
|
||||||
|
|
|
@ -1,4 +1,24 @@
|
||||||
[
|
[
|
||||||
|
{
|
||||||
|
"version": "3.10.0",
|
||||||
|
"code": "443",
|
||||||
|
"note": "Added:\n- Dracula theme\n- Customize message colors\n- Enable/Disable Card presentation\n\nChanged:\n- Colors for some themes\n- Space between buttons\n\nFixed:\n- Animated profile pictures not displayed\n- Mentions broken in profile bio and fields\n- Jumps with fit preview images when scrolling up\n- Fetch more button broken with cache\n- Tag patterns in URL break the link\n- Typo in followed tags"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "3.9.7",
|
||||||
|
"code": "442",
|
||||||
|
"note": "Added:\n- Dracula theme\n\nChanged:\n- Colors for Light/Dark/Black themes\n\nFixed:\n- Animated profile pictures not displayed\n- Mentions broken in profile bio and fields\n- Tag patterns in URL break the link\n- Typo in followed tags"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "3.9.6",
|
||||||
|
"code": "441",
|
||||||
|
"note": "Fixed:\n- Jumps with fit preview images when scrolling up\n- Fetch more button broken with cache"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "3.9.5",
|
||||||
|
"code": "440",
|
||||||
|
"note": "Fixed:\n- Custom emoji are not always displayed\n- Jumps in timeline when using \"fit preview images\"\n- Dark theme: timeline buttons without toggle"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"version": "3.9.4",
|
"version": "3.9.4",
|
||||||
"code": "439",
|
"code": "439",
|
||||||
|
|
|
@ -83,6 +83,10 @@ public class BaseActivity extends AppCompatActivity {
|
||||||
setTheme(R.style.BlackAppTheme);
|
setTheme(R.style.BlackAppTheme);
|
||||||
currentThemeId = R.style.BlackAppTheme;
|
currentThemeId = R.style.BlackAppTheme;
|
||||||
break;
|
break;
|
||||||
|
case "DRACULA":
|
||||||
|
setTheme(R.style.DraculaAppTheme);
|
||||||
|
currentThemeId = R.style.DraculaAppTheme;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -113,6 +117,11 @@ public class BaseActivity extends AppCompatActivity {
|
||||||
setTheme(R.style.BlackAppTheme);
|
setTheme(R.style.BlackAppTheme);
|
||||||
currentThemeId = R.style.BlackAppTheme;
|
currentThemeId = R.style.BlackAppTheme;
|
||||||
break;
|
break;
|
||||||
|
case "DRACULA":
|
||||||
|
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
|
||||||
|
setTheme(R.style.DraculaAppTheme);
|
||||||
|
currentThemeId = R.style.DraculaAppTheme;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
|
|
@ -76,6 +76,9 @@ public class BaseAlertDialogActivity extends AppCompatActivity {
|
||||||
case "BLACK":
|
case "BLACK":
|
||||||
setTheme(R.style.BlackAlertDialog);
|
setTheme(R.style.BlackAlertDialog);
|
||||||
break;
|
break;
|
||||||
|
case "DRACULA":
|
||||||
|
setTheme(R.style.DraculaAlertDialog);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -101,6 +104,10 @@ public class BaseAlertDialogActivity extends AppCompatActivity {
|
||||||
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
|
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
|
||||||
setTheme(R.style.BlackAlertDialog);
|
setTheme(R.style.BlackAlertDialog);
|
||||||
break;
|
break;
|
||||||
|
case "DRACULA":
|
||||||
|
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
|
||||||
|
setTheme(R.style.DraculaAlertDialog);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
|
|
@ -75,6 +75,9 @@ public class BaseBarActivity extends AppCompatActivity {
|
||||||
case "BLACK":
|
case "BLACK":
|
||||||
setTheme(R.style.BlackAppThemeBar);
|
setTheme(R.style.BlackAppThemeBar);
|
||||||
break;
|
break;
|
||||||
|
case "DRACULA":
|
||||||
|
setTheme(R.style.DraculaAppThemeBar);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -101,6 +104,10 @@ public class BaseBarActivity extends AppCompatActivity {
|
||||||
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
|
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
|
||||||
setTheme(R.style.BlackAppThemeBar);
|
setTheme(R.style.BlackAppThemeBar);
|
||||||
break;
|
break;
|
||||||
|
case "DRACULA":
|
||||||
|
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
|
||||||
|
setTheme(R.style.DraculaAppThemeBar);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
|
|
@ -75,6 +75,9 @@ public class BaseTransparentActivity extends AppCompatActivity {
|
||||||
case "BLACK":
|
case "BLACK":
|
||||||
setTheme(R.style.TransparentBlack);
|
setTheme(R.style.TransparentBlack);
|
||||||
break;
|
break;
|
||||||
|
case "DRACULA":
|
||||||
|
setTheme(R.style.TransparentDracula);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -101,6 +104,10 @@ public class BaseTransparentActivity extends AppCompatActivity {
|
||||||
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
|
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
|
||||||
setTheme(R.style.TransparentBlack);
|
setTheme(R.style.TransparentBlack);
|
||||||
break;
|
break;
|
||||||
|
case "DRACULA":
|
||||||
|
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
|
||||||
|
setTheme(R.style.TransparentDracula);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
|
|
@ -108,7 +108,7 @@ public class FollowedTagActivity extends BaseBarActivity implements FollowedTagA
|
||||||
fragmentMastodonTimeline.onDestroyView();
|
fragmentMastodonTimeline.onDestroyView();
|
||||||
}
|
}
|
||||||
invalidateOptionsMenu();
|
invalidateOptionsMenu();
|
||||||
setTitle(R.string.action_lists);
|
setTitle(R.string.followed_tags);
|
||||||
});
|
});
|
||||||
if (tagList.size() == 0) {
|
if (tagList.size() == 0) {
|
||||||
binding.notContent.setVisibility(View.VISIBLE);
|
binding.notContent.setVisibility(View.VISIBLE);
|
||||||
|
@ -177,7 +177,7 @@ public class FollowedTagActivity extends BaseBarActivity implements FollowedTagA
|
||||||
fragmentMastodonTimeline.onDestroyView();
|
fragmentMastodonTimeline.onDestroyView();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
setTitle(R.string.action_lists);
|
setTitle(R.string.followed_tags);
|
||||||
invalidateOptionsMenu();
|
invalidateOptionsMenu();
|
||||||
} else {
|
} else {
|
||||||
super.onBackPressed();
|
super.onBackPressed();
|
||||||
|
|
|
@ -25,6 +25,7 @@ import android.content.Intent;
|
||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.content.res.ColorStateList;
|
import android.content.res.ColorStateList;
|
||||||
|
import android.graphics.drawable.Animatable;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.text.SpannableString;
|
import android.text.SpannableString;
|
||||||
|
@ -262,6 +263,7 @@ public class ProfileActivity extends BaseActivity {
|
||||||
});
|
});
|
||||||
boolean disableGif = sharedpreferences.getBoolean(getString(R.string.SET_DISABLE_GIF), false);
|
boolean disableGif = sharedpreferences.getBoolean(getString(R.string.SET_DISABLE_GIF), false);
|
||||||
String targetedUrl = disableGif ? account.avatar_static : account.avatar;
|
String targetedUrl = disableGif ? account.avatar_static : account.avatar;
|
||||||
|
// MastodonHelper.loadPPMastodon(binding.accountPp, account);
|
||||||
Glide.with(ProfileActivity.this)
|
Glide.with(ProfileActivity.this)
|
||||||
.asDrawable()
|
.asDrawable()
|
||||||
.dontTransform()
|
.dontTransform()
|
||||||
|
@ -271,6 +273,11 @@ public class ProfileActivity extends BaseActivity {
|
||||||
public void onResourceReady(@NonNull final Drawable resource, Transition<? super Drawable> transition) {
|
public void onResourceReady(@NonNull final Drawable resource, Transition<? super Drawable> transition) {
|
||||||
binding.profilePicture.setImageDrawable(resource);
|
binding.profilePicture.setImageDrawable(resource);
|
||||||
binding.accountPp.setImageDrawable(resource);
|
binding.accountPp.setImageDrawable(resource);
|
||||||
|
if (resource instanceof Animatable) {
|
||||||
|
binding.profilePicture.animate();
|
||||||
|
binding.accountPp.animate();
|
||||||
|
((Animatable) resource).start();
|
||||||
|
}
|
||||||
ActivityCompat.startPostponedEnterTransition(ProfileActivity.this);
|
ActivityCompat.startPostponedEnterTransition(ProfileActivity.this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -390,7 +397,7 @@ public class ProfileActivity extends BaseActivity {
|
||||||
TextView.BufferType.SPANNABLE);
|
TextView.BufferType.SPANNABLE);
|
||||||
binding.accountNote.setMovementMethod(LinkMovementMethod.getInstance());
|
binding.accountNote.setMovementMethod(LinkMovementMethod.getInstance());
|
||||||
|
|
||||||
//MastodonHelper.loadPPMastodon(binding.accountPp, account);
|
|
||||||
binding.accountPp.setOnClickListener(v -> {
|
binding.accountPp.setOnClickListener(v -> {
|
||||||
Intent intent = new Intent(ProfileActivity.this, MediaActivity.class);
|
Intent intent = new Intent(ProfileActivity.this, MediaActivity.class);
|
||||||
Bundle b = new Bundle();
|
Bundle b = new Bundle();
|
||||||
|
@ -935,13 +942,11 @@ public class ProfileActivity extends BaseActivity {
|
||||||
builderInner.setTitle(stringArrayConf[0]);
|
builderInner.setTitle(stringArrayConf[0]);
|
||||||
|
|
||||||
builderInner.setNeutralButton(R.string.cancel, (dialog, which) -> dialog.dismiss());
|
builderInner.setNeutralButton(R.string.cancel, (dialog, which) -> dialog.dismiss());
|
||||||
builderInner.setNegativeButton(R.string.keep_notifications, (dialog, which) -> {
|
builderInner.setNegativeButton(R.string.keep_notifications, (dialog, which) -> accountsVM.mute(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, target, false, 0)
|
||||||
accountsVM.mute(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, target, false, 0)
|
.observe(ProfileActivity.this, relationShip -> {
|
||||||
.observe(ProfileActivity.this, relationShip -> {
|
this.relationship = relationShip;
|
||||||
this.relationship = relationShip;
|
updateAccount();
|
||||||
updateAccount();
|
}));
|
||||||
});
|
|
||||||
});
|
|
||||||
builderInner.setPositiveButton(R.string.action_mute, (dialog, which) -> {
|
builderInner.setPositiveButton(R.string.action_mute, (dialog, which) -> {
|
||||||
accountsVM.mute(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, target, true, 0)
|
accountsVM.mute(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, target, true, 0)
|
||||||
.observe(ProfileActivity.this, relationShip -> {
|
.observe(ProfileActivity.this, relationShip -> {
|
||||||
|
|
|
@ -130,9 +130,10 @@ public class SearchResultTabActivity extends BaseBarActivity {
|
||||||
search = query.trim();
|
search = query.trim();
|
||||||
ScreenSlidePagerAdapter mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
|
ScreenSlidePagerAdapter mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
|
||||||
binding.searchViewpager.setAdapter(mPagerAdapter);
|
binding.searchViewpager.setAdapter(mPagerAdapter);
|
||||||
searchView.clearFocus();
|
|
||||||
setTitle(search);
|
setTitle(search);
|
||||||
searchView.setIconified(true);
|
searchView.setIconified(true);
|
||||||
|
searchView.setQuery(search, false);
|
||||||
|
searchView.clearFocus();
|
||||||
binding.searchTabLayout.selectTab(initial);
|
binding.searchTabLayout.selectTab(initial);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,6 +36,7 @@ class SettingsActivity : BaseBarActivity() {
|
||||||
val navController = findNavController(R.id.fragment_container)
|
val navController = findNavController(R.id.fragment_container)
|
||||||
appBarConfiguration = AppBarConfiguration.Builder().build()
|
appBarConfiguration = AppBarConfiguration.Builder().build()
|
||||||
setupActionBarWithNavController(navController, appBarConfiguration)
|
setupActionBarWithNavController(navController, appBarConfiguration)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -85,7 +85,7 @@ public class Account implements Serializable {
|
||||||
if (display_name == null || display_name.isEmpty()) {
|
if (display_name == null || display_name.isEmpty()) {
|
||||||
display_name = username;
|
display_name = username;
|
||||||
}
|
}
|
||||||
return SpannableHelper.convert(context, display_name, null, this, null, false, viewWeakReference);
|
return SpannableHelper.convert(context, display_name, null, this, null, false, false, viewWeakReference);
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized Spannable getSpanDisplayName(Activity activity, WeakReference<View> viewWeakReference) {
|
public synchronized Spannable getSpanDisplayName(Activity activity, WeakReference<View> viewWeakReference) {
|
||||||
|
@ -96,11 +96,11 @@ public class Account implements Serializable {
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized Spannable getSpanDisplayNameTitle(Context context, WeakReference<View> viewWeakReference, String title) {
|
public synchronized Spannable getSpanDisplayNameTitle(Context context, WeakReference<View> viewWeakReference, String title) {
|
||||||
return SpannableHelper.convert(context, title, null, this, null, false, viewWeakReference);
|
return SpannableHelper.convert(context, title, null, this, null, false, false, viewWeakReference);
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized Spannable getSpanNote(Context context, WeakReference<View> viewWeakReference) {
|
public synchronized Spannable getSpanNote(Context context, WeakReference<View> viewWeakReference) {
|
||||||
return SpannableHelper.convert(context, note, null, this, null, true, viewWeakReference);
|
return SpannableHelper.convert(context, note, null, this, null, true, true, viewWeakReference);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class AccountParams implements Serializable {
|
public static class AccountParams implements Serializable {
|
||||||
|
|
|
@ -56,7 +56,7 @@ public class Announcement {
|
||||||
|
|
||||||
|
|
||||||
public synchronized Spannable getSpanContent(Context context, WeakReference<View> viewWeakReference) {
|
public synchronized Spannable getSpanContent(Context context, WeakReference<View> viewWeakReference) {
|
||||||
return SpannableHelper.convert(context, content, null, null, this, true, viewWeakReference);
|
return SpannableHelper.convert(context, content, null, null, this, true, false, viewWeakReference);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,6 +51,8 @@ public class Attachment implements Serializable {
|
||||||
public String focus = null;
|
public String focus = null;
|
||||||
public String translation = null;
|
public String translation = null;
|
||||||
|
|
||||||
|
public float measuredWidth = -1.f;
|
||||||
|
|
||||||
public static class Meta implements Serializable {
|
public static class Meta implements Serializable {
|
||||||
@SerializedName("focus")
|
@SerializedName("focus")
|
||||||
public Focus focus;
|
public Focus focus;
|
||||||
|
|
|
@ -47,7 +47,7 @@ public class Field implements Serializable {
|
||||||
if (verified_at != null && value != null) {
|
if (verified_at != null && value != null) {
|
||||||
value_span = new ForegroundColorSpan(ContextCompat.getColor(context, R.color.verified_text));
|
value_span = new ForegroundColorSpan(ContextCompat.getColor(context, R.color.verified_text));
|
||||||
}
|
}
|
||||||
Spannable spannable = SpannableHelper.convert(context, value, null, account, null, true, viewWeakReference);
|
Spannable spannable = SpannableHelper.convert(context, value, null, account, null, true, true, viewWeakReference);
|
||||||
if (value_span != null && spannable != null) {
|
if (value_span != null && spannable != null) {
|
||||||
spannable.setSpan(value_span, 0, spannable.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
spannable.setSpan(value_span, 0, spannable.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||||
}
|
}
|
||||||
|
@ -57,7 +57,7 @@ public class Field implements Serializable {
|
||||||
|
|
||||||
public synchronized Spannable getLabelSpan(Context context, Account account, WeakReference<View> viewWeakReference) {
|
public synchronized Spannable getLabelSpan(Context context, Account account, WeakReference<View> viewWeakReference) {
|
||||||
|
|
||||||
Spannable spannable = SpannableHelper.convert(context, name, null, account, null, true, viewWeakReference);
|
Spannable spannable = SpannableHelper.convert(context, name, null, account, null, true, true, viewWeakReference);
|
||||||
if (name_span != null && spannable != null) {
|
if (name_span != null && spannable != null) {
|
||||||
spannable.setSpan(name_span, 0, spannable.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
spannable.setSpan(name_span, 0, spannable.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,7 +61,7 @@ public class Poll implements Serializable {
|
||||||
public transient Spannable span_title;
|
public transient Spannable span_title;
|
||||||
|
|
||||||
public Spannable getSpanTitle(Context context, Status status, WeakReference<View> viewWeakReference) {
|
public Spannable getSpanTitle(Context context, Status status, WeakReference<View> viewWeakReference) {
|
||||||
span_title = SpannableHelper.convert(context, title, status, null, null, false, viewWeakReference);
|
span_title = SpannableHelper.convert(context, title, status, null, null, false, false, viewWeakReference);
|
||||||
return span_title;
|
return span_title;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -115,6 +115,10 @@ public class Status implements Serializable, Cloneable {
|
||||||
public transient boolean submitted = false;
|
public transient boolean submitted = false;
|
||||||
public transient boolean spoilerChecked = false;
|
public transient boolean spoilerChecked = false;
|
||||||
public Filter filteredByApp;
|
public Filter filteredByApp;
|
||||||
|
public transient Spannable contentSpan;
|
||||||
|
public transient Spannable contentSpoilerSpan;
|
||||||
|
public transient Spannable contentTranslateSpan;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(@Nullable Object obj) {
|
public boolean equals(@Nullable Object obj) {
|
||||||
boolean same = false;
|
boolean same = false;
|
||||||
|
@ -124,17 +128,29 @@ public class Status implements Serializable, Cloneable {
|
||||||
return same;
|
return same;
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized Spannable getSpanContent(Context context, WeakReference<View> viewWeakReference) {
|
public synchronized Spannable getSpanContent(Context context, WeakReference<View> viewWeakReference, Callback callback) {
|
||||||
return SpannableHelper.convert(context, content, this, null, null, true, viewWeakReference);
|
if (contentSpan == null) {
|
||||||
|
contentSpan = SpannableHelper.convert(context, content, this, null, null, true, false, viewWeakReference, callback);
|
||||||
|
}
|
||||||
|
return contentSpan;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public synchronized Spannable getSpanSpoiler(Context context, WeakReference<View> viewWeakReference, Callback callback) {
|
||||||
public synchronized Spannable getSpanSpoiler(Context context, WeakReference<View> viewWeakReference) {
|
if (contentSpoilerSpan == null) {
|
||||||
return SpannableHelper.convert(context, spoiler_text, this, null, null, true, viewWeakReference);
|
contentSpoilerSpan = SpannableHelper.convert(context, spoiler_text, this, null, null, true, false, viewWeakReference, callback);
|
||||||
|
}
|
||||||
|
return contentSpoilerSpan;
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized Spannable getSpanTranslate(Context context, WeakReference<View> viewWeakReference) {
|
public synchronized Spannable getSpanTranslate(Context context, WeakReference<View> viewWeakReference, Callback callback) {
|
||||||
return SpannableHelper.convert(context, translationContent, this, null, null, true, viewWeakReference);
|
if (contentTranslateSpan == null) {
|
||||||
|
contentTranslateSpan = SpannableHelper.convert(context, translationContent, this, null, null, true, false, viewWeakReference, callback);
|
||||||
|
}
|
||||||
|
return contentTranslateSpan;
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface Callback {
|
||||||
|
void emojiFetched();
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
|
|
|
@ -6,6 +6,7 @@ import android.graphics.Canvas;
|
||||||
import android.graphics.Paint;
|
import android.graphics.Paint;
|
||||||
import android.graphics.drawable.Animatable;
|
import android.graphics.drawable.Animatable;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
|
import android.text.SpannableStringBuilder;
|
||||||
import android.text.style.ReplacementSpan;
|
import android.text.style.ReplacementSpan;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
|
||||||
|
@ -13,26 +14,53 @@ import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.preference.PreferenceManager;
|
import androidx.preference.PreferenceManager;
|
||||||
|
|
||||||
|
import com.bumptech.glide.Glide;
|
||||||
import com.bumptech.glide.request.target.CustomTarget;
|
import com.bumptech.glide.request.target.CustomTarget;
|
||||||
import com.bumptech.glide.request.target.Target;
|
import com.bumptech.glide.request.target.Target;
|
||||||
import com.bumptech.glide.request.transition.Transition;
|
import com.bumptech.glide.request.transition.Transition;
|
||||||
|
|
||||||
import java.lang.ref.WeakReference;
|
import java.lang.ref.WeakReference;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import app.fedilab.android.R;
|
import app.fedilab.android.R;
|
||||||
|
import app.fedilab.android.client.entities.api.Emoji;
|
||||||
|
import app.fedilab.android.client.entities.api.Status;
|
||||||
|
|
||||||
|
|
||||||
public class CustomEmoji extends ReplacementSpan {
|
public class CustomEmoji extends ReplacementSpan {
|
||||||
private final float scale;
|
private final float scale;
|
||||||
private final WeakReference<View> viewWeakReference;
|
private final WeakReference<View> viewWeakReference;
|
||||||
private Drawable imageDrawable;
|
private Drawable imageDrawable;
|
||||||
|
private boolean callbackCalled;
|
||||||
|
|
||||||
CustomEmoji(WeakReference<View> viewWeakReference) {
|
CustomEmoji(WeakReference<View> viewWeakReference) {
|
||||||
Context mContext = viewWeakReference.get().getContext();
|
Context mContext = viewWeakReference.get().getContext();
|
||||||
this.viewWeakReference = viewWeakReference;
|
this.viewWeakReference = viewWeakReference;
|
||||||
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
|
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
|
||||||
scale = sharedpreferences.getFloat(mContext.getString(R.string.SET_FONT_SCALE), 1.1f);
|
scale = sharedpreferences.getFloat(mContext.getString(R.string.SET_FONT_SCALE), 1.1f);
|
||||||
|
callbackCalled = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SpannableStringBuilder makeEmoji(SpannableStringBuilder content, List<Emoji> emojiList, boolean animate, Status.Callback callback) {
|
||||||
|
if (emojiList != null && emojiList.size() > 0) {
|
||||||
|
int count = 1;
|
||||||
|
for (Emoji emoji : emojiList) {
|
||||||
|
Matcher matcher = Pattern.compile(":" + emoji.shortcode + ":", Pattern.LITERAL)
|
||||||
|
.matcher(content);
|
||||||
|
while (matcher.find()) {
|
||||||
|
CustomEmoji customEmoji = new CustomEmoji(new WeakReference<>(viewWeakReference.get()));
|
||||||
|
content.setSpan(customEmoji, matcher.start(), matcher.end(), 0);
|
||||||
|
Glide.with(viewWeakReference.get())
|
||||||
|
.asDrawable()
|
||||||
|
.load(animate ? emoji.url : emoji.static_url)
|
||||||
|
.into(customEmoji.getTarget(animate, count == emojiList.size() && !callbackCalled ? callback : null));
|
||||||
|
}
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return content;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -61,7 +89,7 @@ public class CustomEmoji extends ReplacementSpan {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Target<Drawable> getTarget(boolean animate) {
|
public Target<Drawable> getTarget(boolean animate, Status.Callback callback) {
|
||||||
return new CustomTarget<Drawable>() {
|
return new CustomTarget<Drawable>() {
|
||||||
@Override
|
@Override
|
||||||
public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
|
public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
|
||||||
|
@ -97,6 +125,10 @@ public class CustomEmoji extends ReplacementSpan {
|
||||||
if (view != null) {
|
if (view != null) {
|
||||||
view.invalidate();
|
view.invalidate();
|
||||||
}
|
}
|
||||||
|
if (callback != null && !callbackCalled) {
|
||||||
|
callbackCalled = true;
|
||||||
|
callback.emojiFetched();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -323,7 +323,7 @@ public class Helper {
|
||||||
|
|
||||||
Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);*/
|
Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);*/
|
||||||
|
|
||||||
public static final Pattern hashtagPattern = Pattern.compile("(#[\\w_A-zÀ-ÿ]+)");
|
public static final Pattern hashtagPattern = Pattern.compile("(^|\\s+|[.,;?!-]+)(#[\\w_A-zÀ-ÿ]+)");
|
||||||
public static final Pattern groupPattern = Pattern.compile("(![\\w_]+)");
|
public static final Pattern groupPattern = Pattern.compile("(![\\w_]+)");
|
||||||
public static final Pattern mentionPattern = Pattern.compile("(@[\\w_.-]+[\\w])");
|
public static final Pattern mentionPattern = Pattern.compile("(@[\\w_.-]+[\\w])");
|
||||||
public static final Pattern mentionLongPattern = Pattern.compile("(@[\\w_.-]+@[a-zA-Z0-9][a-zA-Z0-9.-]{1,61}[a-zA-Z0-9](?:\\.[a-zA-Z]{2,})+)");
|
public static final Pattern mentionLongPattern = Pattern.compile("(@[\\w_.-]+@[a-zA-Z0-9][a-zA-Z0-9.-]{1,61}[a-zA-Z0-9](?:\\.[a-zA-Z]{2,})+)");
|
||||||
|
@ -1918,6 +1918,8 @@ public class Helper {
|
||||||
return R.style.SolarizedAlertDialog;
|
return R.style.SolarizedAlertDialog;
|
||||||
} else if (R.style.BlackAppThemeBar == currentThemeId || R.style.BlackAppTheme == currentThemeId) {
|
} else if (R.style.BlackAppThemeBar == currentThemeId || R.style.BlackAppTheme == currentThemeId) {
|
||||||
return R.style.BlackAlertDialog;
|
return R.style.BlackAlertDialog;
|
||||||
|
} else if (R.style.DraculaAppThemeBar == currentThemeId || R.style.DraculaAppTheme == currentThemeId) {
|
||||||
|
return R.style.DraculaAlertDialog;
|
||||||
}
|
}
|
||||||
return R.style.AppTheme;
|
return R.style.AppTheme;
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,6 +24,7 @@ import android.content.ClipboardManager;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
|
import android.content.res.Configuration;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
@ -40,7 +41,6 @@ import android.text.style.URLSpan;
|
||||||
import android.util.Patterns;
|
import android.util.Patterns;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.webkit.URLUtil;
|
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
@ -91,10 +91,38 @@ public class SpannableHelper {
|
||||||
|
|
||||||
public static Spannable convert(Context context, String text,
|
public static Spannable convert(Context context, String text,
|
||||||
Status status, Account account, Announcement announcement,
|
Status status, Account account, Announcement announcement,
|
||||||
boolean convertHtml,
|
boolean convertHtml, boolean forceMentions, WeakReference<View> viewWeakReference) {
|
||||||
WeakReference<View> viewWeakReference) {
|
return convert(context, text, status, account, announcement, convertHtml, forceMentions, viewWeakReference, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static int linkColor;
|
||||||
|
|
||||||
|
public static Spannable convert(Context context, String text,
|
||||||
|
Status status, Account account, Announcement announcement,
|
||||||
|
boolean convertHtml,
|
||||||
|
boolean forceMentions,
|
||||||
|
WeakReference<View> viewWeakReference, Status.Callback callback) {
|
||||||
|
|
||||||
|
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||||
|
int currentNightMode = context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
|
||||||
|
boolean customLight = sharedpreferences.getBoolean(context.getString(R.string.SET_CUSTOMIZE_LIGHT_COLORS), false);
|
||||||
|
boolean customDark = sharedpreferences.getBoolean(context.getString(R.string.SET_CUSTOMIZE_DARK_COLORS), false);
|
||||||
|
int link_color;
|
||||||
|
if (currentNightMode == Configuration.UI_MODE_NIGHT_NO && customLight) {
|
||||||
|
link_color = sharedpreferences.getInt(context.getString(R.string.SET_LIGHT_LINK), -1);
|
||||||
|
if (link_color != -1) {
|
||||||
|
linkColor = link_color;
|
||||||
|
}
|
||||||
|
} else if (currentNightMode == Configuration.UI_MODE_NIGHT_YES && customDark) {
|
||||||
|
link_color = sharedpreferences.getInt(context.getString(R.string.SET_DARK_LINK), -1);
|
||||||
|
if (link_color != -1) {
|
||||||
|
linkColor = link_color;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
linkColor = ThemeHelper.getAttColor(context, R.attr.linkColor);
|
||||||
|
}
|
||||||
|
|
||||||
SpannableString initialContent;
|
SpannableString initialContent;
|
||||||
if (text == null) {
|
if (text == null) {
|
||||||
return null;
|
return null;
|
||||||
|
@ -123,6 +151,7 @@ public class SpannableHelper {
|
||||||
} else if (announcement != null) {
|
} else if (announcement != null) {
|
||||||
emojiList = announcement.emojis;
|
emojiList = announcement.emojis;
|
||||||
}
|
}
|
||||||
|
//UrlDetails will contain links having a text different from the url
|
||||||
HashMap<String, String> urlDetails = new HashMap<>();
|
HashMap<String, String> urlDetails = new HashMap<>();
|
||||||
if (convertHtml) {
|
if (convertHtml) {
|
||||||
Matcher matcherALink = Helper.aLink.matcher(text);
|
Matcher matcherALink = Helper.aLink.matcher(text);
|
||||||
|
@ -134,7 +163,7 @@ public class SpannableHelper {
|
||||||
if (urlText != null && urlText.startsWith(">")) {
|
if (urlText != null && urlText.startsWith(">")) {
|
||||||
urlText = urlText.substring(1);
|
urlText = urlText.substring(1);
|
||||||
}
|
}
|
||||||
if (url != null && urlText != null && !url.equals(urlText) && !urlText.contains("<span")) {
|
if (url != null && urlText != null && !url.equalsIgnoreCase(urlText) && !urlText.contains("<span")) {
|
||||||
urlDetails.put(url, urlText);
|
urlDetails.put(url, urlText);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -149,7 +178,7 @@ public class SpannableHelper {
|
||||||
content.removeSpan(span);
|
content.removeSpan(span);
|
||||||
}
|
}
|
||||||
//Make tags, mentions, groups
|
//Make tags, mentions, groups
|
||||||
interaction(context, content, status, mentionList);
|
interaction(context, content, status, mentionList, forceMentions);
|
||||||
//Make all links
|
//Make all links
|
||||||
linkify(context, content, urlDetails);
|
linkify(context, content, urlDetails);
|
||||||
linkifyURL(context, content, urlDetails);
|
linkifyURL(context, content, urlDetails);
|
||||||
|
@ -159,22 +188,9 @@ public class SpannableHelper {
|
||||||
} else {
|
} else {
|
||||||
content = new SpannableStringBuilder(text);
|
content = new SpannableStringBuilder(text);
|
||||||
}
|
}
|
||||||
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context);
|
|
||||||
boolean animate = !sharedpreferences.getBoolean(context.getString(R.string.SET_DISABLE_ANIMATED_EMOJI), false);
|
boolean animate = !sharedpreferences.getBoolean(context.getString(R.string.SET_DISABLE_ANIMATED_EMOJI), false);
|
||||||
if (emojiList != null && emojiList.size() > 0) {
|
CustomEmoji customEmoji = new CustomEmoji(new WeakReference<>(view));
|
||||||
for (Emoji emoji : emojiList) {
|
content = customEmoji.makeEmoji(content, emojiList, animate, callback);
|
||||||
Matcher matcher = Pattern.compile(":" + emoji.shortcode + ":", Pattern.LITERAL)
|
|
||||||
.matcher(content);
|
|
||||||
while (matcher.find()) {
|
|
||||||
CustomEmoji customEmoji = new CustomEmoji(new WeakReference<>(view));
|
|
||||||
content.setSpan(customEmoji, matcher.start(), matcher.end(), 0);
|
|
||||||
Glide.with(view)
|
|
||||||
.asDrawable()
|
|
||||||
.load(animate ? emoji.url : emoji.static_url)
|
|
||||||
.into(customEmoji.getTarget(animate));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (imagesToReplace.size() > 0) {
|
if (imagesToReplace.size() > 0) {
|
||||||
for (Map.Entry<String, String> entry : imagesToReplace.entrySet()) {
|
for (Map.Entry<String, String> entry : imagesToReplace.entrySet()) {
|
||||||
|
@ -183,12 +199,11 @@ public class SpannableHelper {
|
||||||
Matcher matcher = Pattern.compile(key, Pattern.LITERAL)
|
Matcher matcher = Pattern.compile(key, Pattern.LITERAL)
|
||||||
.matcher(content);
|
.matcher(content);
|
||||||
while (matcher.find()) {
|
while (matcher.find()) {
|
||||||
CustomEmoji customEmoji = new CustomEmoji(new WeakReference<>(view));
|
|
||||||
content.setSpan(customEmoji, matcher.start(), matcher.end(), 0);
|
content.setSpan(customEmoji, matcher.start(), matcher.end(), 0);
|
||||||
Glide.with(view)
|
Glide.with(view)
|
||||||
.asDrawable()
|
.asDrawable()
|
||||||
.load(url)
|
.load(url)
|
||||||
.into(customEmoji.getTarget(animate));
|
.into(customEmoji.getTarget(animate, null));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -216,16 +231,15 @@ public class SpannableHelper {
|
||||||
|
|
||||||
|
|
||||||
final String url = content.toString().substring(matchStart, matchEnd);
|
final String url = content.toString().substring(matchStart, matchEnd);
|
||||||
|
if (urlDetails.containsKey(url)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
String newURL = Helper.transformURL(context, url);
|
String newURL = Helper.transformURL(context, url);
|
||||||
//If URL has been transformed
|
//If URL has been transformed
|
||||||
if (newURL.compareTo(url) != 0) {
|
if (newURL.compareTo(url) != 0) {
|
||||||
content.replace(matchStart, matchEnd, newURL);
|
content.replace(matchStart, matchEnd, newURL);
|
||||||
offSetTruncate -= (newURL.length() - url.length());
|
offSetTruncate -= (newURL.length() - url.length());
|
||||||
matchEnd = matchStart + newURL.length();
|
matchEnd = matchStart + newURL.length();
|
||||||
//The transformed URL was in the list of URLs having a different names
|
|
||||||
if (urlDetails.containsKey(url)) {
|
|
||||||
urlDetails.put(newURL, urlDetails.get(url));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Truncate URL if needed
|
//Truncate URL if needed
|
||||||
|
@ -237,14 +251,7 @@ public class SpannableHelper {
|
||||||
content.replace(matchStart, matchEnd, urlText);
|
content.replace(matchStart, matchEnd, urlText);
|
||||||
matchEnd = matchStart + 31;
|
matchEnd = matchStart + 31;
|
||||||
offSetTruncate += (newURL.length() - urlText.length());
|
offSetTruncate += (newURL.length() - urlText.length());
|
||||||
} /*else if (urlDetails.containsKey(urlText) && urlDetails.get(urlText) != null) {
|
}
|
||||||
urlText = urlDetails.get(urlText);
|
|
||||||
if (urlText != null) {
|
|
||||||
content.replace(matchStart, matchEnd, urlText);
|
|
||||||
matchEnd = matchStart + urlText.length();
|
|
||||||
offSetTruncate += (newURL.length() - urlText.length());
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
|
|
||||||
|
|
||||||
if (matchEnd <= content.length() && matchEnd >= matchStart) {
|
if (matchEnd <= content.length() && matchEnd >= matchStart) {
|
||||||
|
@ -336,7 +343,7 @@ public class SpannableHelper {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
httpsURLConnection.getInputStream().close();
|
httpsURLConnection.getInputStream().close();
|
||||||
if (redirect != null && finalURl1 != null && redirect.compareTo(finalURl1) != 0) {
|
if (redirect != null && redirect.compareTo(finalURl1) != 0) {
|
||||||
URL redirectURL = new URL(redirect);
|
URL redirectURL = new URL(redirect);
|
||||||
String host = redirectURL.getHost();
|
String host = redirectURL.getHost();
|
||||||
String protocol = redirectURL.getProtocol();
|
String protocol = redirectURL.getProtocol();
|
||||||
|
@ -446,6 +453,12 @@ public class SpannableHelper {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateDrawState(@NonNull TextPaint ds) {
|
||||||
|
super.updateDrawState(ds);
|
||||||
|
ds.setColor(linkColor);
|
||||||
|
}
|
||||||
|
|
||||||
}, matchStart, matchEnd, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
|
}, matchStart, matchEnd, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -455,7 +468,7 @@ public class SpannableHelper {
|
||||||
|
|
||||||
for (Map.Entry<String, String> entry : urlDetails.entrySet()) {
|
for (Map.Entry<String, String> entry : urlDetails.entrySet()) {
|
||||||
String value = entry.getValue();
|
String value = entry.getValue();
|
||||||
if (value.startsWith("@") || value.startsWith("#") || !URLUtil.isValidUrl(value)) {
|
if (value.startsWith("@") || value.startsWith("#")) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
SpannableString contentUrl;
|
SpannableString contentUrl;
|
||||||
|
@ -464,7 +477,7 @@ public class SpannableHelper {
|
||||||
else
|
else
|
||||||
contentUrl = new SpannableString(Html.fromHtml(value));
|
contentUrl = new SpannableString(Html.fromHtml(value));
|
||||||
|
|
||||||
Pattern word = Pattern.compile(contentUrl.toString());
|
Pattern word = Pattern.compile(Pattern.quote(contentUrl.toString()));
|
||||||
Matcher matcherLink = word.matcher(content);
|
Matcher matcherLink = word.matcher(content);
|
||||||
while (matcherLink.find()) {
|
while (matcherLink.find()) {
|
||||||
String url = entry.getKey();
|
String url = entry.getKey();
|
||||||
|
@ -668,6 +681,7 @@ public class SpannableHelper {
|
||||||
public void updateDrawState(@NonNull TextPaint ds) {
|
public void updateDrawState(@NonNull TextPaint ds) {
|
||||||
super.updateDrawState(ds);
|
super.updateDrawState(ds);
|
||||||
ds.setUnderlineText(false);
|
ds.setUnderlineText(false);
|
||||||
|
ds.setColor(linkColor);
|
||||||
}
|
}
|
||||||
}, matchStart, matchEnd, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
|
}, matchStart, matchEnd, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
|
||||||
}
|
}
|
||||||
|
@ -701,6 +715,7 @@ public class SpannableHelper {
|
||||||
public void updateDrawState(@NonNull TextPaint ds) {
|
public void updateDrawState(@NonNull TextPaint ds) {
|
||||||
super.updateDrawState(ds);
|
super.updateDrawState(ds);
|
||||||
ds.setUnderlineText(false);
|
ds.setUnderlineText(false);
|
||||||
|
ds.setColor(linkColor);
|
||||||
}
|
}
|
||||||
}, matchStart, matchEnd, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
|
}, matchStart, matchEnd, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
|
||||||
}
|
}
|
||||||
|
@ -737,21 +752,22 @@ public class SpannableHelper {
|
||||||
public void updateDrawState(@NonNull TextPaint ds) {
|
public void updateDrawState(@NonNull TextPaint ds) {
|
||||||
super.updateDrawState(ds);
|
super.updateDrawState(ds);
|
||||||
ds.setUnderlineText(false);
|
ds.setUnderlineText(false);
|
||||||
|
ds.setColor(linkColor);
|
||||||
}
|
}
|
||||||
}, matchStart, matchEnd, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
|
}, matchStart, matchEnd, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void interaction(Context context, Spannable content, Status status, List<Mention> mentions) {
|
private static void interaction(Context context, Spannable content, Status status, List<Mention> mentions, boolean forceMentions) {
|
||||||
// --- For all patterns defined in Helper class ---
|
// --- For all patterns defined in Helper class ---
|
||||||
for (Map.Entry<Helper.PatternType, Pattern> entry : Helper.patternHashMap.entrySet()) {
|
for (Map.Entry<Helper.PatternType, Pattern> entry : Helper.patternHashMap.entrySet()) {
|
||||||
Helper.PatternType patternType = entry.getKey();
|
Helper.PatternType patternType = entry.getKey();
|
||||||
Pattern pattern = entry.getValue();
|
Pattern pattern = entry.getValue();
|
||||||
Matcher matcher = pattern.matcher(content);
|
Matcher matcher = pattern.matcher(content);
|
||||||
if (pattern == Helper.mentionPattern && mentions == null) {
|
if (pattern == Helper.mentionPattern && mentions == null && !forceMentions) {
|
||||||
continue;
|
continue;
|
||||||
} else if (pattern == Helper.mentionLongPattern && mentions == null) {
|
} else if (pattern == Helper.mentionLongPattern && mentions == null && !forceMentions) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -884,6 +900,7 @@ public class SpannableHelper {
|
||||||
public void updateDrawState(@NonNull TextPaint ds) {
|
public void updateDrawState(@NonNull TextPaint ds) {
|
||||||
super.updateDrawState(ds);
|
super.updateDrawState(ds);
|
||||||
ds.setUnderlineText(false);
|
ds.setUnderlineText(false);
|
||||||
|
ds.setColor(linkColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
}, matchStart, matchEnd, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
|
}, matchStart, matchEnd, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
|
||||||
|
@ -1031,6 +1048,8 @@ public class SpannableHelper {
|
||||||
@Override
|
@Override
|
||||||
public void updateDrawState(@NonNull TextPaint ds) {
|
public void updateDrawState(@NonNull TextPaint ds) {
|
||||||
super.updateDrawState(ds);
|
super.updateDrawState(ds);
|
||||||
|
ds.setUnderlineText(false);
|
||||||
|
ds.setColor(linkColor);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
startPosition, endPosition,
|
startPosition, endPosition,
|
||||||
|
@ -1066,7 +1085,7 @@ public class SpannableHelper {
|
||||||
Glide.with(viewWeakReference.get())
|
Glide.with(viewWeakReference.get())
|
||||||
.asDrawable()
|
.asDrawable()
|
||||||
.load(animate ? emoji.url : emoji.static_url)
|
.load(animate ? emoji.url : emoji.static_url)
|
||||||
.into(customEmoji.getTarget(animate));
|
.into(customEmoji.getTarget(animate, null));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,6 +68,11 @@ public class AccountAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
|
||||||
|
|
||||||
AccountsVM accountsVM = new ViewModelProvider((ViewModelStoreOwner) context).get(AccountsVM.class);
|
AccountsVM accountsVM = new ViewModelProvider((ViewModelStoreOwner) context).get(AccountsVM.class);
|
||||||
|
|
||||||
|
if (sharedpreferences.getBoolean(context.getString(R.string.SET_CARDVIEW), false)) {
|
||||||
|
accountViewHolder.binding.cardviewContainer.setCardElevation(Helper.convertDpToPixel(5, context));
|
||||||
|
accountViewHolder.binding.dividerCard.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
accountViewHolder.binding.avatar.setOnClickListener(v -> {
|
accountViewHolder.binding.avatar.setOnClickListener(v -> {
|
||||||
Intent intent = new Intent(context, ProfileActivity.class);
|
Intent intent = new Intent(context, ProfileActivity.class);
|
||||||
Bundle b = new Bundle();
|
Bundle b = new Bundle();
|
||||||
|
@ -78,6 +83,8 @@ public class AccountAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
|
||||||
// start the new activity
|
// start the new activity
|
||||||
context.startActivity(intent, options.toBundle());
|
context.startActivity(intent, options.toBundle());
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
accountViewHolder.binding.followAction.setIconResource(R.drawable.ic_baseline_person_add_24);
|
accountViewHolder.binding.followAction.setIconResource(R.drawable.ic_baseline_person_add_24);
|
||||||
if (account.relationShip != null) {
|
if (account.relationShip != null) {
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,7 @@ package app.fedilab.android.ui.drawer;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
@ -27,6 +28,7 @@ import androidx.core.app.ActivityOptionsCompat;
|
||||||
import androidx.lifecycle.LifecycleOwner;
|
import androidx.lifecycle.LifecycleOwner;
|
||||||
import androidx.lifecycle.ViewModelProvider;
|
import androidx.lifecycle.ViewModelProvider;
|
||||||
import androidx.lifecycle.ViewModelStoreOwner;
|
import androidx.lifecycle.ViewModelStoreOwner;
|
||||||
|
import androidx.preference.PreferenceManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -69,6 +71,14 @@ public class AccountFollowRequestAdapter extends RecyclerView.Adapter<RecyclerVi
|
||||||
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
|
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
|
||||||
Account account = accountList.get(position);
|
Account account = accountList.get(position);
|
||||||
ViewHolderFollow holderFollow = (ViewHolderFollow) viewHolder;
|
ViewHolderFollow holderFollow = (ViewHolderFollow) viewHolder;
|
||||||
|
|
||||||
|
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||||
|
if (sharedpreferences.getBoolean(context.getString(R.string.SET_CARDVIEW), false)) {
|
||||||
|
holderFollow.binding.cardviewContainer.setCardElevation(Helper.convertDpToPixel(5, context));
|
||||||
|
holderFollow.binding.dividerCard.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
MastodonHelper.loadPPMastodon(holderFollow.binding.avatar, account);
|
MastodonHelper.loadPPMastodon(holderFollow.binding.avatar, account);
|
||||||
holderFollow.binding.displayName.setText(account.display_name);
|
holderFollow.binding.displayName.setText(account.display_name);
|
||||||
holderFollow.binding.username.setText(String.format("@%s", account.acct));
|
holderFollow.binding.username.setText(String.format("@%s", account.acct));
|
||||||
|
|
|
@ -16,14 +16,17 @@ package app.fedilab.android.ui.drawer;
|
||||||
|
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
import android.content.res.ColorStateList;
|
import android.content.res.ColorStateList;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.lifecycle.ViewModelProvider;
|
import androidx.lifecycle.ViewModelProvider;
|
||||||
import androidx.lifecycle.ViewModelStoreOwner;
|
import androidx.lifecycle.ViewModelStoreOwner;
|
||||||
|
import androidx.preference.PreferenceManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
import java.lang.ref.WeakReference;
|
import java.lang.ref.WeakReference;
|
||||||
|
@ -35,6 +38,7 @@ import app.fedilab.android.R;
|
||||||
import app.fedilab.android.client.entities.api.Account;
|
import app.fedilab.android.client.entities.api.Account;
|
||||||
import app.fedilab.android.client.entities.api.MastodonList;
|
import app.fedilab.android.client.entities.api.MastodonList;
|
||||||
import app.fedilab.android.databinding.DrawerAccountListBinding;
|
import app.fedilab.android.databinding.DrawerAccountListBinding;
|
||||||
|
import app.fedilab.android.helper.Helper;
|
||||||
import app.fedilab.android.helper.MastodonHelper;
|
import app.fedilab.android.helper.MastodonHelper;
|
||||||
import app.fedilab.android.helper.ThemeHelper;
|
import app.fedilab.android.helper.ThemeHelper;
|
||||||
import app.fedilab.android.viewmodel.mastodon.TimelinesVM;
|
import app.fedilab.android.viewmodel.mastodon.TimelinesVM;
|
||||||
|
@ -78,6 +82,12 @@ public class AccountListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo
|
||||||
|
|
||||||
account = getItem(position);
|
account = getItem(position);
|
||||||
AccountListViewHolder holder = (AccountListViewHolder) viewHolder;
|
AccountListViewHolder holder = (AccountListViewHolder) viewHolder;
|
||||||
|
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||||
|
if (sharedpreferences.getBoolean(context.getString(R.string.SET_CARDVIEW), false)) {
|
||||||
|
holder.binding.cardviewContainer.setCardElevation(Helper.convertDpToPixel(5, context));
|
||||||
|
holder.binding.dividerCard.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
MastodonHelper.loadPPMastodon(holder.binding.avatar, account);
|
MastodonHelper.loadPPMastodon(holder.binding.avatar, account);
|
||||||
holder.binding.displayName.setText(
|
holder.binding.displayName.setText(
|
||||||
account.getSpanDisplayName(context,
|
account.getSpanDisplayName(context,
|
||||||
|
|
|
@ -19,6 +19,7 @@ import static android.content.Context.INPUT_METHOD_SERVICE;
|
||||||
import static app.fedilab.android.BaseMainActivity.emojis;
|
import static app.fedilab.android.BaseMainActivity.emojis;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
@ -30,6 +31,7 @@ import androidx.annotation.NonNull;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
import androidx.lifecycle.ViewModelProvider;
|
import androidx.lifecycle.ViewModelProvider;
|
||||||
import androidx.lifecycle.ViewModelStoreOwner;
|
import androidx.lifecycle.ViewModelStoreOwner;
|
||||||
|
import androidx.preference.PreferenceManager;
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
|
@ -80,6 +82,14 @@ public class AnnouncementAdapter extends RecyclerView.Adapter<AnnouncementAdapte
|
||||||
@Override
|
@Override
|
||||||
public void onBindViewHolder(@NonNull AnnouncementHolder holder, int position) {
|
public void onBindViewHolder(@NonNull AnnouncementHolder holder, int position) {
|
||||||
Announcement announcement = announcements.get(position);
|
Announcement announcement = announcements.get(position);
|
||||||
|
|
||||||
|
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||||
|
if (sharedpreferences.getBoolean(context.getString(R.string.SET_CARDVIEW), false)) {
|
||||||
|
holder.binding.cardviewContainer.setCardElevation(Helper.convertDpToPixel(5, context));
|
||||||
|
holder.binding.dividerCard.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (announcement.reactions != null && announcement.reactions.size() > 0) {
|
if (announcement.reactions != null && announcement.reactions.size() > 0) {
|
||||||
ReactionAdapter reactionAdapter = new ReactionAdapter(announcement.id, announcement.reactions);
|
ReactionAdapter reactionAdapter = new ReactionAdapter(announcement.id, announcement.reactions);
|
||||||
holder.binding.layoutReactions.reactionsView.setAdapter(reactionAdapter);
|
holder.binding.layoutReactions.reactionsView.setAdapter(reactionAdapter);
|
||||||
|
|
|
@ -725,6 +725,13 @@ public class ComposeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
|
||||||
}
|
}
|
||||||
if (emojis == null) {
|
if (emojis == null) {
|
||||||
return;
|
return;
|
||||||
|
} else if (emojisList == null) {
|
||||||
|
if (emojis.containsKey(BaseMainActivity.currentInstance)) {
|
||||||
|
emojisList = emojis.get(BaseMainActivity.currentInstance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (emojisList == null) {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
for (Emoji emoji : emojisList) {
|
for (Emoji emoji : emojisList) {
|
||||||
if (shortcode != null && emoji.shortcode.contains(shortcode)) {
|
if (shortcode != null && emoji.shortcode.contains(shortcode)) {
|
||||||
|
@ -1107,7 +1114,7 @@ public class ComposeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
|
||||||
StatusSimpleViewHolder holder = (StatusSimpleViewHolder) viewHolder;
|
StatusSimpleViewHolder holder = (StatusSimpleViewHolder) viewHolder;
|
||||||
holder.binding.statusContent.setText(
|
holder.binding.statusContent.setText(
|
||||||
status.getSpanContent(context,
|
status.getSpanContent(context,
|
||||||
new WeakReference<>(holder.binding.statusContent)),
|
new WeakReference<>(holder.binding.statusContent), null),
|
||||||
TextView.BufferType.SPANNABLE);
|
TextView.BufferType.SPANNABLE);
|
||||||
MastodonHelper.loadPPMastodon(holder.binding.avatar, status.account);
|
MastodonHelper.loadPPMastodon(holder.binding.avatar, status.account);
|
||||||
if (status.account != null) {
|
if (status.account != null) {
|
||||||
|
@ -1122,7 +1129,7 @@ public class ComposeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder
|
||||||
holder.binding.spoiler.setVisibility(View.VISIBLE);
|
holder.binding.spoiler.setVisibility(View.VISIBLE);
|
||||||
holder.binding.spoiler.setText(
|
holder.binding.spoiler.setText(
|
||||||
status.getSpanSpoiler(context,
|
status.getSpanSpoiler(context,
|
||||||
new WeakReference<>(holder.binding.spoiler)),
|
new WeakReference<>(holder.binding.spoiler), null),
|
||||||
TextView.BufferType.SPANNABLE);
|
TextView.BufferType.SPANNABLE);
|
||||||
} else {
|
} else {
|
||||||
holder.binding.spoiler.setVisibility(View.GONE);
|
holder.binding.spoiler.setVisibility(View.GONE);
|
||||||
|
|
|
@ -19,6 +19,7 @@ import android.annotation.SuppressLint;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
|
import android.content.res.Configuration;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
|
@ -83,14 +84,56 @@ public class ConversationAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
||||||
return new ConversationHolder(itemBinding);
|
return new ConversationHolder(itemBinding);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void applyColorConversation(Context context, ConversationHolder holder) {
|
||||||
|
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||||
|
int currentNightMode = context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
|
||||||
|
boolean customLight = sharedpreferences.getBoolean(context.getString(R.string.SET_CUSTOMIZE_LIGHT_COLORS), false);
|
||||||
|
boolean customDark = sharedpreferences.getBoolean(context.getString(R.string.SET_CUSTOMIZE_DARK_COLORS), false);
|
||||||
|
int theme_icons_color = -1;
|
||||||
|
int theme_statuses_color = -1;
|
||||||
|
int theme_text_color = -1;
|
||||||
|
if (currentNightMode == Configuration.UI_MODE_NIGHT_NO) { //LIGHT THEME
|
||||||
|
if (customLight) {
|
||||||
|
theme_icons_color = sharedpreferences.getInt(context.getString(R.string.SET_LIGHT_ICON), -1);
|
||||||
|
theme_statuses_color = sharedpreferences.getInt(context.getString(R.string.SET_LIGHT_BACKGROUND), -1);
|
||||||
|
theme_text_color = sharedpreferences.getInt(context.getString(R.string.SET_LIGHT_TEXT), -1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (customDark) {
|
||||||
|
theme_icons_color = sharedpreferences.getInt(context.getString(R.string.SET_DARK_ICON), -1);
|
||||||
|
theme_statuses_color = sharedpreferences.getInt(context.getString(R.string.SET_DARK_BACKGROUND), -1);
|
||||||
|
theme_text_color = sharedpreferences.getInt(context.getString(R.string.SET_DARK_TEXT), -1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (theme_icons_color != -1) {
|
||||||
|
Helper.changeDrawableColor(context, R.drawable.ic_star_outline, theme_icons_color);
|
||||||
|
Helper.changeDrawableColor(context, R.drawable.ic_person, theme_icons_color);
|
||||||
|
Helper.changeDrawableColor(context, R.drawable.ic_bot, theme_icons_color);
|
||||||
|
Helper.changeDrawableColor(context, R.drawable.ic_baseline_reply_16, theme_icons_color);
|
||||||
|
}
|
||||||
|
if (theme_statuses_color != -1) {
|
||||||
|
holder.binding.cardviewContainer.setBackgroundColor(theme_statuses_color);
|
||||||
|
}
|
||||||
|
if (theme_text_color != -1) {
|
||||||
|
holder.binding.statusContent.setTextColor(theme_text_color);
|
||||||
|
holder.binding.spoiler.setTextColor(theme_text_color);
|
||||||
|
Helper.changeDrawableColor(context, R.drawable.ic_baseline_lock_24, theme_text_color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressLint("ClickableViewAccessibility")
|
@SuppressLint("ClickableViewAccessibility")
|
||||||
@Override
|
@Override
|
||||||
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
|
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
|
||||||
Conversation conversation = conversationList.get(position);
|
Conversation conversation = conversationList.get(position);
|
||||||
ConversationHolder holder = (ConversationHolder) viewHolder;
|
ConversationHolder holder = (ConversationHolder) viewHolder;
|
||||||
|
|
||||||
final SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context);
|
|
||||||
|
|
||||||
|
final SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||||
|
if (sharedpreferences.getBoolean(context.getString(R.string.SET_CARDVIEW), false)) {
|
||||||
|
holder.binding.cardviewContainer.setCardElevation(Helper.convertDpToPixel(5, context));
|
||||||
|
holder.binding.dividerCard.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
//--- Profile Pictures for participants ---
|
//--- Profile Pictures for participants ---
|
||||||
holder.binding.participantsList.removeAllViews();
|
holder.binding.participantsList.removeAllViews();
|
||||||
|
@ -151,7 +194,7 @@ public class ConversationAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
||||||
holder.binding.spoiler.setVisibility(View.VISIBLE);
|
holder.binding.spoiler.setVisibility(View.VISIBLE);
|
||||||
holder.binding.spoiler.setText(
|
holder.binding.spoiler.setText(
|
||||||
conversation.last_status.getSpanSpoiler(context,
|
conversation.last_status.getSpanSpoiler(context,
|
||||||
new WeakReference<>(holder.binding.spoiler)),
|
new WeakReference<>(holder.binding.spoiler), () -> notifyItemChanged(holder.getBindingAdapterPosition())),
|
||||||
TextView.BufferType.SPANNABLE);
|
TextView.BufferType.SPANNABLE);
|
||||||
} else {
|
} else {
|
||||||
holder.binding.spoiler.setVisibility(View.GONE);
|
holder.binding.spoiler.setVisibility(View.GONE);
|
||||||
|
@ -161,7 +204,7 @@ public class ConversationAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
||||||
//--- MAIN CONTENT ---
|
//--- MAIN CONTENT ---
|
||||||
holder.binding.statusContent.setText(
|
holder.binding.statusContent.setText(
|
||||||
conversation.last_status.getSpanContent(context,
|
conversation.last_status.getSpanContent(context,
|
||||||
new WeakReference<>(holder.binding.statusContent)),
|
new WeakReference<>(holder.binding.statusContent), () -> notifyItemChanged(holder.getBindingAdapterPosition())),
|
||||||
TextView.BufferType.SPANNABLE);
|
TextView.BufferType.SPANNABLE);
|
||||||
//--- DATE ---
|
//--- DATE ---
|
||||||
holder.binding.lastMessageDate.setText(Helper.dateDiff(context, conversation.last_status.created_at));
|
holder.binding.lastMessageDate.setText(Helper.dateDiff(context, conversation.last_status.created_at));
|
||||||
|
@ -198,6 +241,8 @@ public class ConversationAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
||||||
}
|
}
|
||||||
}, 100, 100);
|
}, 100, 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
applyColorConversation(context, holder);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void displayAttachments(ConversationAdapter.ConversationHolder holder, int position) {
|
private void displayAttachments(ConversationAdapter.ConversationHolder holder, int position) {
|
||||||
|
|
|
@ -15,13 +15,16 @@ package app.fedilab.android.ui.drawer;
|
||||||
* see <http://www.gnu.org/licenses>. */
|
* see <http://www.gnu.org/licenses>. */
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
import androidx.lifecycle.ViewModelProvider;
|
import androidx.lifecycle.ViewModelProvider;
|
||||||
import androidx.lifecycle.ViewModelStoreOwner;
|
import androidx.lifecycle.ViewModelStoreOwner;
|
||||||
|
import androidx.preference.PreferenceManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -61,6 +64,13 @@ public class DomainBlockAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo
|
||||||
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
|
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
|
||||||
String domain = domainList.get(position);
|
String domain = domainList.get(position);
|
||||||
DomainBlockViewHolder holder = (DomainBlockViewHolder) viewHolder;
|
DomainBlockViewHolder holder = (DomainBlockViewHolder) viewHolder;
|
||||||
|
|
||||||
|
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||||
|
if (sharedpreferences.getBoolean(context.getString(R.string.SET_CARDVIEW), false)) {
|
||||||
|
holder.binding.cardviewContainer.setCardElevation(Helper.convertDpToPixel(5, context));
|
||||||
|
holder.binding.dividerCard.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
holder.binding.domainName.setText(domain);
|
holder.binding.domainName.setText(domain);
|
||||||
AccountsVM accountsVM = new ViewModelProvider((ViewModelStoreOwner) context).get(AccountsVM.class);
|
AccountsVM accountsVM = new ViewModelProvider((ViewModelStoreOwner) context).get(AccountsVM.class);
|
||||||
holder.binding.unblockDomain.setOnClickListener(v -> {
|
holder.binding.unblockDomain.setOnClickListener(v -> {
|
||||||
|
|
|
@ -16,11 +16,13 @@ package app.fedilab.android.ui.drawer;
|
||||||
|
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.preference.PreferenceManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
import com.bumptech.glide.Glide;
|
import com.bumptech.glide.Glide;
|
||||||
|
@ -46,6 +48,11 @@ public class InstanceRegAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo
|
||||||
JoinMastodonInstance joinMastodonInstance = joinMastodonInstanceList.get(position);
|
JoinMastodonInstance joinMastodonInstance = joinMastodonInstanceList.get(position);
|
||||||
|
|
||||||
ViewHolder holder = (ViewHolder) viewHolder;
|
ViewHolder holder = (ViewHolder) viewHolder;
|
||||||
|
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||||
|
if (sharedpreferences.getBoolean(context.getString(R.string.SET_CARDVIEW), false)) {
|
||||||
|
holder.binding.cardviewContainer.setCardElevation(Helper.convertDpToPixel(5, context));
|
||||||
|
holder.binding.dividerCard.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
holder.binding.instanceCountUser.setText(context.getString(R.string.users, Helper.withSuffix(joinMastodonInstance.total_users)));
|
holder.binding.instanceCountUser.setText(context.getString(R.string.users, Helper.withSuffix(joinMastodonInstance.total_users)));
|
||||||
holder.binding.instanceDescription.setText(joinMastodonInstance.description);
|
holder.binding.instanceDescription.setText(joinMastodonInstance.description);
|
||||||
holder.binding.instanceHost.setText(joinMastodonInstance.domain);
|
holder.binding.instanceHost.setText(joinMastodonInstance.domain);
|
||||||
|
|
|
@ -21,6 +21,7 @@ import android.app.Activity;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
|
import android.content.res.Configuration;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
@ -71,6 +72,7 @@ public class NotificationAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
||||||
private final int TYPE_ADMIN_REPORT = 12;
|
private final int TYPE_ADMIN_REPORT = 12;
|
||||||
public FetchMoreCallBack fetchMoreCallBack;
|
public FetchMoreCallBack fetchMoreCallBack;
|
||||||
private Context context;
|
private Context context;
|
||||||
|
private RecyclerView mRecyclerView;
|
||||||
|
|
||||||
public NotificationAdapter(List<Notification> notificationList) {
|
public NotificationAdapter(List<Notification> notificationList) {
|
||||||
this.notificationList = notificationList;
|
this.notificationList = notificationList;
|
||||||
|
@ -120,6 +122,13 @@ public class NotificationAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
||||||
return super.getItemViewType(position);
|
return super.getItemViewType(position);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
|
||||||
|
super.onAttachedToRecyclerView(recyclerView);
|
||||||
|
|
||||||
|
mRecyclerView = recyclerView;
|
||||||
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||||
|
@ -136,11 +145,60 @@ public class NotificationAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void applyColorAccount(Context context, ViewHolderFollow holder) {
|
||||||
|
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||||
|
int currentNightMode = context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
|
||||||
|
boolean customLight = sharedpreferences.getBoolean(context.getString(R.string.SET_CUSTOMIZE_LIGHT_COLORS), false);
|
||||||
|
boolean customDark = sharedpreferences.getBoolean(context.getString(R.string.SET_CUSTOMIZE_DARK_COLORS), false);
|
||||||
|
int theme_icons_color = -1;
|
||||||
|
int theme_statuses_color = -1;
|
||||||
|
int theme_text_color = -1;
|
||||||
|
int theme_text_header_1_line = -1;
|
||||||
|
int theme_text_header_2_line = -1;
|
||||||
|
if (currentNightMode == Configuration.UI_MODE_NIGHT_NO) { //LIGHT THEME
|
||||||
|
if (customLight) {
|
||||||
|
theme_icons_color = sharedpreferences.getInt(context.getString(R.string.SET_LIGHT_ICON), -1);
|
||||||
|
theme_statuses_color = sharedpreferences.getInt(context.getString(R.string.SET_LIGHT_BACKGROUND), -1);
|
||||||
|
theme_text_color = sharedpreferences.getInt(context.getString(R.string.SET_LIGHT_TEXT), -1);
|
||||||
|
theme_text_header_1_line = sharedpreferences.getInt(context.getString(R.string.SET_LIGHT_DISPLAY_NAME), -1);
|
||||||
|
theme_text_header_2_line = sharedpreferences.getInt(context.getString(R.string.SET_LIGHT_USERNAME), -1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (customDark) {
|
||||||
|
theme_icons_color = sharedpreferences.getInt(context.getString(R.string.SET_DARK_ICON), -1);
|
||||||
|
theme_statuses_color = sharedpreferences.getInt(context.getString(R.string.SET_DARK_BACKGROUND), -1);
|
||||||
|
theme_text_color = sharedpreferences.getInt(context.getString(R.string.SET_DARK_TEXT), -1);
|
||||||
|
theme_text_header_1_line = sharedpreferences.getInt(context.getString(R.string.SET_DARK_DISPLAY_NAME), -1);
|
||||||
|
theme_text_header_2_line = sharedpreferences.getInt(context.getString(R.string.SET_DARK_USERNAME), -1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (theme_text_color != -1) {
|
||||||
|
holder.binding.title.setTextColor(theme_text_color);
|
||||||
|
}
|
||||||
|
if (theme_icons_color != -1) {
|
||||||
|
Helper.changeDrawableColor(context, holder.binding.icon, theme_icons_color);
|
||||||
|
}
|
||||||
|
if (theme_statuses_color != -1) {
|
||||||
|
holder.binding.cardviewContainer.setBackgroundColor(theme_statuses_color);
|
||||||
|
}
|
||||||
|
if (theme_text_header_1_line != -1) {
|
||||||
|
holder.binding.displayName.setTextColor(theme_text_header_1_line);
|
||||||
|
}
|
||||||
|
if (theme_text_header_2_line != -1) {
|
||||||
|
holder.binding.username.setTextColor(theme_text_header_2_line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
|
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
|
||||||
Notification notification = notificationList.get(position);
|
Notification notification = notificationList.get(position);
|
||||||
if (getItemViewType(position) == TYPE_FOLLOW || getItemViewType(position) == TYPE_FOLLOW_REQUEST || getItemViewType(position) == TYPE_ADMIN_REPORT || getItemViewType(position) == TYPE_ADMIN_SIGNUP) {
|
if (getItemViewType(position) == TYPE_FOLLOW || getItemViewType(position) == TYPE_FOLLOW_REQUEST || getItemViewType(position) == TYPE_ADMIN_REPORT || getItemViewType(position) == TYPE_ADMIN_SIGNUP) {
|
||||||
ViewHolderFollow holderFollow = (ViewHolderFollow) viewHolder;
|
ViewHolderFollow holderFollow = (ViewHolderFollow) viewHolder;
|
||||||
|
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||||
|
if (sharedpreferences.getBoolean(context.getString(R.string.SET_CARDVIEW), false)) {
|
||||||
|
holderFollow.binding.cardviewContainer.setCardElevation(Helper.convertDpToPixel(5, context));
|
||||||
|
holderFollow.binding.dividerCard.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
MastodonHelper.loadPPMastodon(holderFollow.binding.avatar, notification.account);
|
MastodonHelper.loadPPMastodon(holderFollow.binding.avatar, notification.account);
|
||||||
holderFollow.binding.displayName.setText(
|
holderFollow.binding.displayName.setText(
|
||||||
notification.account.getSpanDisplayName(context,
|
notification.account.getSpanDisplayName(context,
|
||||||
|
@ -217,8 +275,10 @@ public class NotificationAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
||||||
} else {
|
} else {
|
||||||
holderFollow.binding.layoutFetchMore.fetchMoreContainer.setVisibility(View.GONE);
|
holderFollow.binding.layoutFetchMore.fetchMoreContainer.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
|
applyColorAccount(context, holderFollow);
|
||||||
} else if (getItemViewType(position) == TYPE_FILERED) {
|
} else if (getItemViewType(position) == TYPE_FILERED) {
|
||||||
StatusAdapter.StatusViewHolder holder = (StatusAdapter.StatusViewHolder) viewHolder;
|
StatusAdapter.StatusViewHolder holder = (StatusAdapter.StatusViewHolder) viewHolder;
|
||||||
|
|
||||||
holder.bindingFiltered.filteredText.setText(context.getString(R.string.filtered_by, notification.filteredByApp.title));
|
holder.bindingFiltered.filteredText.setText(context.getString(R.string.filtered_by, notification.filteredByApp.title));
|
||||||
holder.bindingFiltered.displayButton.setOnClickListener(v -> {
|
holder.bindingFiltered.displayButton.setOnClickListener(v -> {
|
||||||
notification.filteredByApp = null;
|
notification.filteredByApp = null;
|
||||||
|
@ -226,6 +286,11 @@ public class NotificationAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
StatusAdapter.StatusViewHolder holderStatus = (StatusAdapter.StatusViewHolder) viewHolder;
|
StatusAdapter.StatusViewHolder holderStatus = (StatusAdapter.StatusViewHolder) viewHolder;
|
||||||
|
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||||
|
if (sharedpreferences.getBoolean(context.getString(R.string.SET_CARDVIEW), false)) {
|
||||||
|
holderStatus.binding.cardviewContainer.setCardElevation(Helper.convertDpToPixel(5, context));
|
||||||
|
holderStatus.binding.dividerCard.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
holderStatus.bindingNotification.status.typeOfNotification.setVisibility(View.VISIBLE);
|
holderStatus.bindingNotification.status.typeOfNotification.setVisibility(View.VISIBLE);
|
||||||
|
|
||||||
if (getItemViewType(position) == TYPE_MENTION) {
|
if (getItemViewType(position) == TYPE_MENTION) {
|
||||||
|
@ -243,13 +308,30 @@ public class NotificationAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
||||||
} else if (getItemViewType(position) == TYPE_POLL) {
|
} else if (getItemViewType(position) == TYPE_POLL) {
|
||||||
holderStatus.bindingNotification.status.typeOfNotification.setImageResource(R.drawable.ic_baseline_poll_24);
|
holderStatus.bindingNotification.status.typeOfNotification.setImageResource(R.drawable.ic_baseline_poll_24);
|
||||||
}
|
}
|
||||||
|
int theme_icons_color = -1;
|
||||||
|
int currentNightMode = context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
|
||||||
|
boolean customLight = sharedpreferences.getBoolean(context.getString(R.string.SET_CUSTOMIZE_LIGHT_COLORS), false);
|
||||||
|
boolean customDark = sharedpreferences.getBoolean(context.getString(R.string.SET_CUSTOMIZE_DARK_COLORS), false);
|
||||||
|
if (currentNightMode == Configuration.UI_MODE_NIGHT_NO) { //LIGHT THEME
|
||||||
|
if (customLight) {
|
||||||
|
theme_icons_color = sharedpreferences.getInt(context.getString(R.string.SET_LIGHT_ICON), -1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (customDark) {
|
||||||
|
theme_icons_color = sharedpreferences.getInt(context.getString(R.string.SET_DARK_ICON), -1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (theme_icons_color != -1) {
|
||||||
|
Helper.changeDrawableColor(context, holderStatus.bindingNotification.status.typeOfNotification, theme_icons_color);
|
||||||
|
}
|
||||||
|
|
||||||
holderStatus.bindingNotification.status.mainContainer.setAlpha(1.0f);
|
holderStatus.bindingNotification.status.mainContainer.setAlpha(1.0f);
|
||||||
StatusesVM statusesVM = new ViewModelProvider((ViewModelStoreOwner) context).get(StatusesVM.class);
|
StatusesVM statusesVM = new ViewModelProvider((ViewModelStoreOwner) context).get(StatusesVM.class);
|
||||||
SearchVM searchVM = new ViewModelProvider((ViewModelStoreOwner) context).get(SearchVM.class);
|
SearchVM searchVM = new ViewModelProvider((ViewModelStoreOwner) context).get(SearchVM.class);
|
||||||
if (notification.status != null) {
|
if (notification.status != null) {
|
||||||
notification.status.cached = notification.cached;
|
notification.status.cached = notification.cached;
|
||||||
}
|
}
|
||||||
statusManagement(context, statusesVM, searchVM, holderStatus, this, null, notification.status, Timeline.TimeLineEnum.NOTIFICATION, false, true, false, null);
|
statusManagement(context, statusesVM, searchVM, holderStatus, mRecyclerView, this, null, notification.status, Timeline.TimeLineEnum.NOTIFICATION, false, true, false, null);
|
||||||
holderStatus.bindingNotification.status.dateShort.setText(Helper.dateDiff(context, notification.created_at));
|
holderStatus.bindingNotification.status.dateShort.setText(Helper.dateDiff(context, notification.created_at));
|
||||||
|
|
||||||
if (getItemViewType(position) == TYPE_MENTION || getItemViewType(position) == TYPE_STATUS || getItemViewType(position) == TYPE_REACTION) {
|
if (getItemViewType(position) == TYPE_MENTION || getItemViewType(position) == TYPE_STATUS || getItemViewType(position) == TYPE_REACTION) {
|
||||||
|
@ -286,7 +368,6 @@ public class NotificationAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
||||||
} else {
|
} else {
|
||||||
holderStatus.bindingNotification.status.mainContainer.setAlpha(.7f);
|
holderStatus.bindingNotification.status.mainContainer.setAlpha(.7f);
|
||||||
holderStatus.bindingNotification.status.mainContainer.setVisibility(View.VISIBLE);
|
holderStatus.bindingNotification.status.mainContainer.setVisibility(View.VISIBLE);
|
||||||
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context);
|
|
||||||
boolean displayMedia = sharedpreferences.getBoolean(context.getString(R.string.SET_DISPLAY_MEDIA_NOTIFICATION), true);
|
boolean displayMedia = sharedpreferences.getBoolean(context.getString(R.string.SET_DISPLAY_MEDIA_NOTIFICATION), true);
|
||||||
if (displayMedia && notification.status != null && notification.status.media_attachments != null && notification.status.media_attachments.size() > 0) {
|
if (displayMedia && notification.status != null && notification.status.media_attachments != null && notification.status.media_attachments.size() > 0) {
|
||||||
holderStatus.bindingNotification.status.mediaContainer.setVisibility(View.VISIBLE);
|
holderStatus.bindingNotification.status.mediaContainer.setVisibility(View.VISIBLE);
|
||||||
|
@ -362,6 +443,7 @@ public class NotificationAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
||||||
holderStatus.bindingNotification.status.username.setText(String.format("@%s", notification.account.acct));
|
holderStatus.bindingNotification.status.username.setText(String.format("@%s", notification.account.acct));
|
||||||
holderStatus.bindingNotification.status.actionButtons.setVisibility(View.GONE);
|
holderStatus.bindingNotification.status.actionButtons.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
|
StatusAdapter.applyColor(context, holderStatus);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,7 @@ import android.content.ClipboardManager;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
|
import android.content.res.Configuration;
|
||||||
import android.graphics.PorterDuff;
|
import android.graphics.PorterDuff;
|
||||||
import android.graphics.Typeface;
|
import android.graphics.Typeface;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
|
@ -123,6 +124,7 @@ import app.fedilab.android.client.entities.app.BaseAccount;
|
||||||
import app.fedilab.android.client.entities.app.StatusCache;
|
import app.fedilab.android.client.entities.app.StatusCache;
|
||||||
import app.fedilab.android.client.entities.app.StatusDraft;
|
import app.fedilab.android.client.entities.app.StatusDraft;
|
||||||
import app.fedilab.android.client.entities.app.Timeline;
|
import app.fedilab.android.client.entities.app.Timeline;
|
||||||
|
import app.fedilab.android.databinding.DrawerFetchMoreBinding;
|
||||||
import app.fedilab.android.databinding.DrawerStatusArtBinding;
|
import app.fedilab.android.databinding.DrawerStatusArtBinding;
|
||||||
import app.fedilab.android.databinding.DrawerStatusBinding;
|
import app.fedilab.android.databinding.DrawerStatusBinding;
|
||||||
import app.fedilab.android.databinding.DrawerStatusFilteredBinding;
|
import app.fedilab.android.databinding.DrawerStatusFilteredBinding;
|
||||||
|
@ -165,6 +167,8 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
||||||
public FetchMoreCallBack fetchMoreCallBack;
|
public FetchMoreCallBack fetchMoreCallBack;
|
||||||
private Context context;
|
private Context context;
|
||||||
|
|
||||||
|
private RecyclerView mRecyclerView;
|
||||||
|
|
||||||
public StatusAdapter(List<Status> statuses, Timeline.TimeLineEnum timelineType, boolean minified, boolean canBeFederated, boolean checkRemotely) {
|
public StatusAdapter(List<Status> statuses, Timeline.TimeLineEnum timelineType, boolean minified, boolean canBeFederated, boolean checkRemotely) {
|
||||||
this.statusList = statuses;
|
this.statusList = statuses;
|
||||||
this.timelineType = timelineType;
|
this.timelineType = timelineType;
|
||||||
|
@ -173,6 +177,18 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
||||||
this.checkRemotely = checkRemotely;
|
this.checkRemotely = checkRemotely;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int getStatusPosition(List<Status> timelineStatuses, Status status) {
|
||||||
|
int position = 0;
|
||||||
|
if (timelineStatuses != null && status != null) {
|
||||||
|
for (Status _s : timelineStatuses) {
|
||||||
|
if (_s.id.compareTo(status.id) == 0) {
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
position++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
private static boolean isVisible(Timeline.TimeLineEnum timelineType, Status status) {
|
private static boolean isVisible(Timeline.TimeLineEnum timelineType, Status status) {
|
||||||
if (timelineType == Timeline.TimeLineEnum.HOME && !show_boosts && status.reblog != null) {
|
if (timelineType == Timeline.TimeLineEnum.HOME && !show_boosts && status.reblog != null) {
|
||||||
|
@ -355,6 +371,7 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
||||||
StatusesVM statusesVM,
|
StatusesVM statusesVM,
|
||||||
SearchVM searchVM,
|
SearchVM searchVM,
|
||||||
StatusViewHolder holder,
|
StatusViewHolder holder,
|
||||||
|
RecyclerView recyclerView,
|
||||||
RecyclerView.Adapter<RecyclerView.ViewHolder> adapter,
|
RecyclerView.Adapter<RecyclerView.ViewHolder> adapter,
|
||||||
List<Status> statusList,
|
List<Status> statusList,
|
||||||
Status status,
|
Status status,
|
||||||
|
@ -372,14 +389,12 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
||||||
|
|
||||||
|
|
||||||
boolean expand_cw = sharedpreferences.getBoolean(context.getString(R.string.SET_EXPAND_CW), false);
|
boolean expand_cw = sharedpreferences.getBoolean(context.getString(R.string.SET_EXPAND_CW), false);
|
||||||
boolean expand_media = sharedpreferences.getBoolean(context.getString(R.string.SET_EXPAND_MEDIA), false);
|
|
||||||
boolean display_card = sharedpreferences.getBoolean(context.getString(R.string.SET_DISPLAY_CARD), false);
|
boolean display_card = sharedpreferences.getBoolean(context.getString(R.string.SET_DISPLAY_CARD), false);
|
||||||
boolean share_details = sharedpreferences.getBoolean(context.getString(R.string.SET_SHARE_DETAILS), true);
|
boolean share_details = sharedpreferences.getBoolean(context.getString(R.string.SET_SHARE_DETAILS), true);
|
||||||
boolean confirmFav = sharedpreferences.getBoolean(context.getString(R.string.SET_NOTIF_VALIDATION_FAV), false);
|
boolean confirmFav = sharedpreferences.getBoolean(context.getString(R.string.SET_NOTIF_VALIDATION_FAV), false);
|
||||||
boolean confirmBoost = sharedpreferences.getBoolean(context.getString(R.string.SET_NOTIF_VALIDATION), true);
|
boolean confirmBoost = sharedpreferences.getBoolean(context.getString(R.string.SET_NOTIF_VALIDATION), true);
|
||||||
boolean fullAttachement = sharedpreferences.getBoolean(context.getString(R.string.SET_FULL_PREVIEW), false);
|
boolean fullAttachement = sharedpreferences.getBoolean(context.getString(R.string.SET_FULL_PREVIEW), false);
|
||||||
boolean displayBookmark = sharedpreferences.getBoolean(context.getString(R.string.SET_DISPLAY_BOOKMARK), true);
|
boolean displayBookmark = sharedpreferences.getBoolean(context.getString(R.string.SET_DISPLAY_BOOKMARK), true);
|
||||||
boolean long_press_media = sharedpreferences.getBoolean(context.getString(R.string.SET_LONG_PRESS_STORE_MEDIA), false);
|
|
||||||
boolean displayCounters = sharedpreferences.getBoolean(context.getString(R.string.SET_DISPLAY_COUNTER_FAV_BOOST), false);
|
boolean displayCounters = sharedpreferences.getBoolean(context.getString(R.string.SET_DISPLAY_COUNTER_FAV_BOOST), false);
|
||||||
String loadMediaType = sharedpreferences.getString(context.getString(R.string.SET_LOAD_MEDIA_TYPE), "ALWAYS");
|
String loadMediaType = sharedpreferences.getString(context.getString(R.string.SET_LOAD_MEDIA_TYPE), "ALWAYS");
|
||||||
|
|
||||||
|
@ -506,16 +521,19 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
||||||
holder.binding.actionButtonFavorite.pressOnTouch(false);
|
holder.binding.actionButtonFavorite.pressOnTouch(false);
|
||||||
holder.binding.actionButtonBoost.pressOnTouch(false);
|
holder.binding.actionButtonBoost.pressOnTouch(false);
|
||||||
holder.binding.actionButtonBookmark.pressOnTouch(false);
|
holder.binding.actionButtonBookmark.pressOnTouch(false);
|
||||||
holder.binding.actionButtonFavorite.setActiveImage(R.drawable.ic_baseline_star_24);
|
holder.binding.actionButtonFavorite.setActiveImage(R.drawable.ic_round_star_24);
|
||||||
holder.binding.actionButtonFavorite.setInactiveImage(R.drawable.ic_star_outline);
|
holder.binding.actionButtonFavorite.setInactiveImage(R.drawable.ic_round_star_border_24);
|
||||||
holder.binding.actionButtonBookmark.setInactiveImage(R.drawable.ic_baseline_bookmark_border_24);
|
holder.binding.actionButtonBookmark.setActiveImage(R.drawable.ic_round_bookmark_24);
|
||||||
|
holder.binding.actionButtonBookmark.setInactiveImage(R.drawable.ic_round_bookmark_border_24);
|
||||||
|
holder.binding.actionButtonBoost.setActiveImage(R.drawable.ic_round_repeat_24);
|
||||||
|
holder.binding.actionButtonBoost.setInactiveImage(R.drawable.ic_round_repeat_24);
|
||||||
holder.binding.actionButtonFavorite.setDisableCircle(true);
|
holder.binding.actionButtonFavorite.setDisableCircle(true);
|
||||||
holder.binding.actionButtonBoost.setDisableCircle(true);
|
holder.binding.actionButtonBoost.setDisableCircle(true);
|
||||||
holder.binding.actionButtonBookmark.setDisableCircle(true);
|
holder.binding.actionButtonBookmark.setDisableCircle(true);
|
||||||
holder.binding.actionButtonFavorite.setActiveImageTint(R.color.marked_icon);
|
holder.binding.actionButtonFavorite.setActiveImageTint(R.color.marked_icon);
|
||||||
holder.binding.actionButtonBoost.setActiveImageTint(R.color.boost_icon);
|
holder.binding.actionButtonBoost.setActiveImageTint(R.color.boost_icon);
|
||||||
holder.binding.actionButtonBookmark.setActiveImageTint(R.color.marked_icon);
|
holder.binding.actionButtonBookmark.setActiveImageTint(R.color.marked_icon);
|
||||||
|
applyColor(context, holder);
|
||||||
|
|
||||||
if (status.pinned) {
|
if (status.pinned) {
|
||||||
holder.binding.statusPinned.setVisibility(View.VISIBLE);
|
holder.binding.statusPinned.setVisibility(View.VISIBLE);
|
||||||
|
@ -865,13 +883,13 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
||||||
}
|
}
|
||||||
//Button sizes depending of the defined scale
|
//Button sizes depending of the defined scale
|
||||||
float normalSize = Helper.convertDpToPixel(28, context);
|
float normalSize = Helper.convertDpToPixel(28, context);
|
||||||
float normalSize2 = Helper.convertDpToPixel(24, context);
|
|
||||||
holder.binding.actionButtonReply.getLayoutParams().width = (int) (normalSize * scaleIcon);
|
holder.binding.actionButtonReply.getLayoutParams().width = (int) (normalSize * scaleIcon);
|
||||||
holder.binding.actionButtonReply.getLayoutParams().height = (int) (normalSize * scaleIcon);
|
holder.binding.actionButtonReply.getLayoutParams().height = (int) (normalSize * scaleIcon);
|
||||||
holder.binding.actionButtonReply.requestLayout();
|
holder.binding.actionButtonReply.requestLayout();
|
||||||
holder.binding.actionButtonBoost.setImageSize((int) (normalSize * scaleIcon));
|
holder.binding.actionButtonBoost.setImageSize((int) (normalSize * scaleIcon));
|
||||||
holder.binding.actionButtonFavorite.setImageSize((int) (normalSize * scaleIcon));
|
holder.binding.actionButtonFavorite.setImageSize((int) (normalSize * scaleIcon));
|
||||||
holder.binding.actionButtonBookmark.setImageSize((int) (normalSize2 * scaleIcon));
|
holder.binding.actionButtonBookmark.setImageSize((int) (normalSize * scaleIcon));
|
||||||
|
|
||||||
holder.binding.statusAddCustomEmoji.getLayoutParams().width = (int) (normalSize * scaleIcon);
|
holder.binding.statusAddCustomEmoji.getLayoutParams().width = (int) (normalSize * scaleIcon);
|
||||||
holder.binding.statusAddCustomEmoji.getLayoutParams().height = (int) (normalSize * scaleIcon);
|
holder.binding.statusAddCustomEmoji.getLayoutParams().height = (int) (normalSize * scaleIcon);
|
||||||
|
@ -986,7 +1004,7 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
||||||
holder.binding.spoiler.setVisibility(View.VISIBLE);
|
holder.binding.spoiler.setVisibility(View.VISIBLE);
|
||||||
holder.binding.spoiler.setText(
|
holder.binding.spoiler.setText(
|
||||||
statusToDeal.getSpanSpoiler(context,
|
statusToDeal.getSpanSpoiler(context,
|
||||||
new WeakReference<>(holder.binding.spoiler)),
|
new WeakReference<>(holder.binding.spoiler), () -> recyclerView.post(() -> adapter.notifyItemChanged(holder.getBindingAdapterPosition()))),
|
||||||
TextView.BufferType.SPANNABLE);
|
TextView.BufferType.SPANNABLE);
|
||||||
statusToDeal.isExpended = true;
|
statusToDeal.isExpended = true;
|
||||||
statusToDeal.isMediaDisplayed = true;
|
statusToDeal.isMediaDisplayed = true;
|
||||||
|
@ -1001,7 +1019,7 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
||||||
|
|
||||||
holder.binding.spoiler.setText(
|
holder.binding.spoiler.setText(
|
||||||
statusToDeal.getSpanSpoiler(context,
|
statusToDeal.getSpanSpoiler(context,
|
||||||
new WeakReference<>(holder.binding.spoiler)),
|
new WeakReference<>(holder.binding.spoiler), () -> recyclerView.post(() -> adapter.notifyItemChanged(holder.getBindingAdapterPosition()))),
|
||||||
TextView.BufferType.SPANNABLE);
|
TextView.BufferType.SPANNABLE);
|
||||||
}
|
}
|
||||||
if (statusToDeal.isExpended) {
|
if (statusToDeal.isExpended) {
|
||||||
|
@ -1049,7 +1067,9 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
||||||
//--- MAIN CONTENT ---
|
//--- MAIN CONTENT ---
|
||||||
holder.binding.statusContent.setText(
|
holder.binding.statusContent.setText(
|
||||||
statusToDeal.getSpanContent(context,
|
statusToDeal.getSpanContent(context,
|
||||||
new WeakReference<>(holder.binding.statusContent)),
|
new WeakReference<>(holder.binding.statusContent), () -> {
|
||||||
|
recyclerView.post(() -> adapter.notifyItemChanged(holder.getBindingAdapterPosition()));
|
||||||
|
}),
|
||||||
TextView.BufferType.SPANNABLE);
|
TextView.BufferType.SPANNABLE);
|
||||||
if (truncate_toots_size > 0) {
|
if (truncate_toots_size > 0) {
|
||||||
holder.binding.statusContent.setMaxLines(truncate_toots_size);
|
holder.binding.statusContent.setMaxLines(truncate_toots_size);
|
||||||
|
@ -1085,7 +1105,9 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
||||||
holder.binding.containerTrans.setVisibility(View.VISIBLE);
|
holder.binding.containerTrans.setVisibility(View.VISIBLE);
|
||||||
holder.binding.statusContentTranslated.setText(
|
holder.binding.statusContentTranslated.setText(
|
||||||
statusToDeal.getSpanTranslate(context,
|
statusToDeal.getSpanTranslate(context,
|
||||||
new WeakReference<>(holder.binding.statusContentTranslated)),
|
new WeakReference<>(holder.binding.statusContentTranslated), () -> {
|
||||||
|
recyclerView.post(() -> adapter.notifyItemChanged(holder.getBindingAdapterPosition()));
|
||||||
|
}),
|
||||||
TextView.BufferType.SPANNABLE);
|
TextView.BufferType.SPANNABLE);
|
||||||
} else {
|
} else {
|
||||||
holder.binding.containerTrans.setVisibility(View.GONE);
|
holder.binding.containerTrans.setVisibility(View.GONE);
|
||||||
|
@ -1106,234 +1128,70 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
||||||
if (statusToDeal.media_attachments != null && statusToDeal.media_attachments.size() > 0) {
|
if (statusToDeal.media_attachments != null && statusToDeal.media_attachments.size() > 0) {
|
||||||
holder.binding.attachmentsList.removeAllViews();
|
holder.binding.attachmentsList.removeAllViews();
|
||||||
holder.binding.mediaContainer.removeAllViews();
|
holder.binding.mediaContainer.removeAllViews();
|
||||||
//If only one attachment
|
if ((loadMediaType.equals("ASK") || (loadMediaType.equals("WIFI") && !TimelineHelper.isOnWIFI(context))) && !statusToDeal.canLoadMedia) {
|
||||||
if (statusToDeal.media_attachments.size() == 1) {
|
holder.binding.mediaContainer.setVisibility(View.GONE);
|
||||||
if ((loadMediaType.equals("ASK") || (loadMediaType.equals("WIFI") && !TimelineHelper.isOnWIFI(context))) && !statusToDeal.canLoadMedia) {
|
holder.binding.displayMedia.setVisibility(View.VISIBLE);
|
||||||
holder.binding.mediaContainer.setVisibility(View.GONE);
|
holder.binding.displayMedia.setOnClickListener(v -> {
|
||||||
holder.binding.displayMedia.setVisibility(View.VISIBLE);
|
statusToDeal.canLoadMedia = true;
|
||||||
holder.binding.displayMedia.setOnClickListener(v -> {
|
adapter.notifyItemChanged(holder.getBindingAdapterPosition());
|
||||||
statusToDeal.canLoadMedia = true;
|
});
|
||||||
adapter.notifyItemChanged(holder.getBindingAdapterPosition());
|
} else {
|
||||||
});
|
int mediaPosition = 1;
|
||||||
} else {
|
boolean singleMedia = statusToDeal.media_attachments.size() == 1;
|
||||||
holder.binding.mediaContainer.setVisibility(View.VISIBLE);
|
for (Attachment attachment : statusToDeal.media_attachments) {
|
||||||
holder.binding.displayMedia.setVisibility(View.GONE);
|
LayoutMediaBinding layoutMediaBinding = LayoutMediaBinding.inflate(LayoutInflater.from(context));
|
||||||
LayoutMediaBinding layoutMediaBinding = LayoutMediaBinding.inflate(LayoutInflater.from(context), holder.binding.attachmentsList, false);
|
|
||||||
LinearLayout.LayoutParams lp;
|
|
||||||
if (fullAttachement) {
|
if (fullAttachement) {
|
||||||
lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
|
float ratio = 1.0f;
|
||||||
layoutMediaBinding.media.setScaleType(ImageView.ScaleType.FIT_CENTER);
|
float mediaH = -1.0f;
|
||||||
} else {
|
|
||||||
lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, (int) Helper.convertDpToPixel(200, context));
|
|
||||||
layoutMediaBinding.media.setScaleType(ImageView.ScaleType.CENTER_CROP);
|
|
||||||
}
|
|
||||||
if (statusToDeal.sensitive) {
|
|
||||||
Helper.changeDrawableColor(context, layoutMediaBinding.viewHide, ThemeHelper.getAttColor(context, R.attr.colorError));
|
|
||||||
} else {
|
|
||||||
Helper.changeDrawableColor(context, layoutMediaBinding.viewHide, R.color.white);
|
|
||||||
}
|
|
||||||
layoutMediaBinding.media.setLayoutParams(lp);
|
|
||||||
layoutMediaBinding.media.setOnClickListener(v -> {
|
|
||||||
if (statusToDeal.isMediaObfuscated && mediaObfuscated(statusToDeal) && !expand_media) {
|
|
||||||
statusToDeal.isMediaObfuscated = false;
|
|
||||||
int position = holder.getBindingAdapterPosition();
|
|
||||||
adapter.notifyItemChanged(position);
|
|
||||||
final int timeout = sharedpreferences.getInt(context.getString(R.string.SET_NSFW_TIMEOUT), 5);
|
|
||||||
|
|
||||||
if (timeout > 0) {
|
if (attachment.measuredWidth > 0) {
|
||||||
new CountDownTimer((timeout * 1000L), 1000) {
|
if (attachment.meta != null && attachment.meta.small != null) {
|
||||||
public void onTick(long millisUntilFinished) {
|
float viewWidth = attachment.measuredWidth;
|
||||||
}
|
mediaH = attachment.meta.small.height;
|
||||||
|
float mediaW = attachment.meta.small.width;
|
||||||
public void onFinish() {
|
if (mediaW != 0) {
|
||||||
status.isMediaObfuscated = true;
|
ratio = viewWidth / mediaW;
|
||||||
adapter.notifyItemChanged(position);
|
}
|
||||||
}
|
|
||||||
}.start();
|
|
||||||
}
|
}
|
||||||
return;
|
loadAndAddAttachment(context, layoutMediaBinding, holder, adapter, mediaPosition, mediaH, ratio, statusToDeal, attachment, singleMedia);
|
||||||
|
} else {
|
||||||
|
int finalMediaPosition = mediaPosition;
|
||||||
|
layoutMediaBinding.media.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
|
||||||
|
@Override
|
||||||
|
public void onGlobalLayout() {
|
||||||
|
layoutMediaBinding.media.getViewTreeObserver().removeOnGlobalLayoutListener(this);
|
||||||
|
attachment.measuredWidth = layoutMediaBinding.media.getWidth();
|
||||||
|
float ratio = 1.0f;
|
||||||
|
float mediaH = -1.0f;
|
||||||
|
if (attachment.meta != null && attachment.meta.small != null) {
|
||||||
|
float viewWidth = attachment.measuredWidth;
|
||||||
|
mediaH = attachment.meta.small.height;
|
||||||
|
float mediaW = attachment.meta.small.width;
|
||||||
|
if (mediaW != 0) {
|
||||||
|
ratio = viewWidth / mediaW;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
loadAndAddAttachment(context, layoutMediaBinding, holder, adapter, finalMediaPosition, mediaH, ratio, statusToDeal, attachment, singleMedia);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
Intent mediaIntent = new Intent(context, MediaActivity.class);
|
|
||||||
Bundle b = new Bundle();
|
|
||||||
b.putInt(Helper.ARG_MEDIA_POSITION, 1);
|
|
||||||
b.putSerializable(Helper.ARG_MEDIA_ARRAY, new ArrayList<>(statusToDeal.media_attachments));
|
|
||||||
mediaIntent.putExtras(b);
|
|
||||||
ActivityOptionsCompat options = ActivityOptionsCompat
|
|
||||||
.makeSceneTransitionAnimation((Activity) context, layoutMediaBinding.media, statusToDeal.media_attachments.get(0).url);
|
|
||||||
// start the new activity
|
|
||||||
context.startActivity(mediaIntent, options.toBundle());
|
|
||||||
});
|
|
||||||
if (statusToDeal.media_attachments.get(0).type != null && (statusToDeal.media_attachments.get(0).type.equalsIgnoreCase("video") || statusToDeal.media_attachments.get(0).type.equalsIgnoreCase("gifv"))) {
|
|
||||||
layoutMediaBinding.playVideo.setVisibility(View.VISIBLE);
|
|
||||||
} else {
|
} else {
|
||||||
layoutMediaBinding.playVideo.setVisibility(View.GONE);
|
loadAndAddAttachment(context, layoutMediaBinding, holder, adapter, mediaPosition, -1.f, -1.f, statusToDeal, attachment, singleMedia);
|
||||||
}
|
}
|
||||||
if (statusToDeal.media_attachments.get(0).type != null && statusToDeal.media_attachments.get(0).type.equalsIgnoreCase("audio")) {
|
mediaPosition++;
|
||||||
layoutMediaBinding.playMusic.setVisibility(View.VISIBLE);
|
if (fullAttachement || singleMedia) {
|
||||||
|
holder.binding.mediaContainer.addView(layoutMediaBinding.getRoot());
|
||||||
} else {
|
} else {
|
||||||
layoutMediaBinding.playMusic.setVisibility(View.GONE);
|
holder.binding.attachmentsList.addView(layoutMediaBinding.getRoot());
|
||||||
}
|
}
|
||||||
String finalUrl;
|
}
|
||||||
if (statusToDeal.media_attachments.get(0).url == null) {
|
if (!fullAttachement && !singleMedia) {
|
||||||
finalUrl = statusToDeal.media_attachments.get(0).remote_url;
|
holder.binding.mediaContainer.setVisibility(View.GONE);
|
||||||
} else {
|
holder.binding.attachmentsListContainer.setVisibility(View.VISIBLE);
|
||||||
finalUrl = statusToDeal.media_attachments.get(0).url;
|
} else {
|
||||||
}
|
|
||||||
layoutMediaBinding.media.setOnLongClickListener(v -> {
|
|
||||||
if (long_press_media) {
|
|
||||||
MediaHelper.manageMove(context, finalUrl, false);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
|
|
||||||
float focusX = 0.f;
|
|
||||||
float focusY = 0.f;
|
|
||||||
if (statusToDeal.media_attachments.get(0).meta != null && statusToDeal.media_attachments.get(0).meta.focus != null) {
|
|
||||||
focusX = statusToDeal.media_attachments.get(0).meta.focus.x;
|
|
||||||
focusY = statusToDeal.media_attachments.get(0).meta.focus.y;
|
|
||||||
}
|
|
||||||
if (statusToDeal.media_attachments.get(0).description != null && !statusToDeal.media_attachments.get(0).description.isEmpty()) {
|
|
||||||
layoutMediaBinding.viewDescription.setVisibility(View.VISIBLE);
|
|
||||||
} else {
|
|
||||||
layoutMediaBinding.viewDescription.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
if (!mediaObfuscated(statusToDeal) || expand_media) {
|
|
||||||
layoutMediaBinding.viewHide.setImageResource(R.drawable.ic_baseline_visibility_24);
|
|
||||||
RequestBuilder<Drawable> requestBuilder = Glide.with(layoutMediaBinding.media.getContext())
|
|
||||||
.load(statusToDeal.media_attachments.get(0).preview_url);
|
|
||||||
if (!fullAttachement) {
|
|
||||||
requestBuilder = requestBuilder.apply(new RequestOptions().transform(new GlideFocus(focusX, focusY)));
|
|
||||||
}
|
|
||||||
requestBuilder.into(layoutMediaBinding.media);
|
|
||||||
} else {
|
|
||||||
layoutMediaBinding.viewHide.setImageResource(R.drawable.ic_baseline_visibility_off_24);
|
|
||||||
Glide.with(layoutMediaBinding.media.getContext())
|
|
||||||
.load(statusToDeal.media_attachments.get(0).preview_url)
|
|
||||||
.apply(new RequestOptions().transform(new BlurTransformation(50, 3)))
|
|
||||||
// .apply(new RequestOptions().transform(new CenterCrop(), new RoundedCorners((int) Helper.convertDpToPixel(3, context))))
|
|
||||||
.into(layoutMediaBinding.media);
|
|
||||||
}
|
|
||||||
layoutMediaBinding.viewHide.setOnClickListener(v -> {
|
|
||||||
statusToDeal.sensitive = !statusToDeal.sensitive;
|
|
||||||
adapter.notifyItemChanged(holder.getBindingAdapterPosition());
|
|
||||||
});
|
|
||||||
holder.binding.mediaContainer.addView(layoutMediaBinding.getRoot());
|
|
||||||
holder.binding.mediaContainer.setVisibility(View.VISIBLE);
|
holder.binding.mediaContainer.setVisibility(View.VISIBLE);
|
||||||
holder.binding.attachmentsListContainer.setVisibility(View.GONE);
|
holder.binding.attachmentsListContainer.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
} else { //Several media
|
|
||||||
if ((loadMediaType.equals("ASK") || (loadMediaType.equals("WIFI") && !TimelineHelper.isOnWIFI(context))) && !statusToDeal.canLoadMedia) {
|
|
||||||
holder.binding.mediaContainer.setVisibility(View.GONE);
|
|
||||||
holder.binding.displayMedia.setVisibility(View.VISIBLE);
|
|
||||||
holder.binding.displayMedia.setOnClickListener(v -> {
|
|
||||||
statusToDeal.canLoadMedia = true;
|
|
||||||
adapter.notifyItemChanged(holder.getBindingAdapterPosition());
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
int mediaPosition = 1;
|
|
||||||
for (Attachment attachment : statusToDeal.media_attachments) {
|
|
||||||
LayoutMediaBinding layoutMediaBinding = LayoutMediaBinding.inflate(LayoutInflater.from(context), holder.binding.attachmentsList, false);
|
|
||||||
LinearLayout.LayoutParams lp;
|
|
||||||
float focusX = 0.f;
|
|
||||||
float focusY = 0.f;
|
|
||||||
if (statusToDeal.media_attachments.get(0).meta != null && statusToDeal.media_attachments.get(0).meta.focus != null) {
|
|
||||||
focusX = statusToDeal.media_attachments.get(0).meta.focus.x;
|
|
||||||
focusY = statusToDeal.media_attachments.get(0).meta.focus.y;
|
|
||||||
}
|
|
||||||
layoutMediaBinding.count.setVisibility(View.VISIBLE);
|
|
||||||
if (!fullAttachement) {
|
|
||||||
layoutMediaBinding.count.setText(String.format(Locale.getDefault(), "%d/%d", mediaPosition, statusToDeal.media_attachments.size()));
|
|
||||||
}
|
|
||||||
String finalUrl;
|
|
||||||
if (attachment.url == null) {
|
|
||||||
finalUrl = attachment.remote_url;
|
|
||||||
} else {
|
|
||||||
finalUrl = attachment.url;
|
|
||||||
}
|
|
||||||
layoutMediaBinding.media.setOnLongClickListener(v -> {
|
|
||||||
if (long_press_media) {
|
|
||||||
MediaHelper.manageMove(context, finalUrl, false);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
if (fullAttachement) {
|
|
||||||
lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
|
|
||||||
layoutMediaBinding.media.setScaleType(ImageView.ScaleType.FIT_CENTER);
|
|
||||||
} else {
|
|
||||||
lp = new LinearLayout.LayoutParams((int) Helper.convertDpToPixel(200, context), (int) Helper.convertDpToPixel(200, context));
|
|
||||||
layoutMediaBinding.media.setScaleType(ImageView.ScaleType.CENTER_CROP);
|
|
||||||
}
|
|
||||||
if (attachment.type != null && (attachment.type.equalsIgnoreCase("video") || attachment.type.equalsIgnoreCase("gifv"))) {
|
|
||||||
layoutMediaBinding.playVideo.setVisibility(View.VISIBLE);
|
|
||||||
} else {
|
|
||||||
layoutMediaBinding.playVideo.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
if (attachment.type != null && attachment.type.equalsIgnoreCase("audio")) {
|
|
||||||
layoutMediaBinding.playMusic.setVisibility(View.VISIBLE);
|
|
||||||
} else {
|
|
||||||
layoutMediaBinding.playMusic.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
if (attachment.description != null && !attachment.description.isEmpty()) {
|
|
||||||
layoutMediaBinding.viewDescription.setVisibility(View.VISIBLE);
|
|
||||||
} else {
|
|
||||||
layoutMediaBinding.viewDescription.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
if (!mediaObfuscated(statusToDeal) || expand_media) {
|
|
||||||
layoutMediaBinding.viewHide.setImageResource(R.drawable.ic_baseline_visibility_24);
|
|
||||||
RequestBuilder<Drawable> requestBuilder = Glide.with(layoutMediaBinding.media.getContext())
|
|
||||||
.load(attachment.preview_url);
|
|
||||||
if (!fullAttachement) {
|
|
||||||
requestBuilder = requestBuilder.apply(new RequestOptions().transform(new GlideFocus(focusX, focusY)));
|
|
||||||
}
|
|
||||||
requestBuilder.into(layoutMediaBinding.media);
|
|
||||||
} else {
|
|
||||||
layoutMediaBinding.viewHide.setImageResource(R.drawable.ic_baseline_visibility_off_24);
|
|
||||||
Glide.with(layoutMediaBinding.media.getContext())
|
|
||||||
.load(attachment.preview_url)
|
|
||||||
.apply(new RequestOptions().transform(new BlurTransformation(50, 3)))
|
|
||||||
// .apply(new RequestOptions().transform(new CenterCrop(), new RoundedCorners((int) Helper.convertDpToPixel(3, context))))
|
|
||||||
.into(layoutMediaBinding.media);
|
|
||||||
}
|
|
||||||
if (statusToDeal.sensitive) {
|
|
||||||
Helper.changeDrawableColor(context, layoutMediaBinding.viewHide, ThemeHelper.getAttColor(context, R.attr.colorError));
|
|
||||||
} else {
|
|
||||||
Helper.changeDrawableColor(context, layoutMediaBinding.viewHide, R.color.white);
|
|
||||||
}
|
|
||||||
layoutMediaBinding.media.setLayoutParams(lp);
|
|
||||||
int finalMediaPosition = mediaPosition;
|
|
||||||
layoutMediaBinding.media.setOnClickListener(v -> {
|
|
||||||
Intent mediaIntent = new Intent(context, MediaActivity.class);
|
|
||||||
Bundle b = new Bundle();
|
|
||||||
b.putInt(Helper.ARG_MEDIA_POSITION, finalMediaPosition);
|
|
||||||
b.putSerializable(Helper.ARG_MEDIA_ARRAY, new ArrayList<>(statusToDeal.media_attachments));
|
|
||||||
mediaIntent.putExtras(b);
|
|
||||||
ActivityOptionsCompat options = ActivityOptionsCompat
|
|
||||||
.makeSceneTransitionAnimation((Activity) context, layoutMediaBinding.media, statusToDeal.media_attachments.get(finalMediaPosition - 1).url);
|
|
||||||
// start the new activity
|
|
||||||
context.startActivity(mediaIntent, options.toBundle());
|
|
||||||
});
|
|
||||||
layoutMediaBinding.viewHide.setOnClickListener(v -> {
|
|
||||||
statusToDeal.sensitive = !statusToDeal.sensitive;
|
|
||||||
adapter.notifyItemChanged(holder.getBindingAdapterPosition());
|
|
||||||
});
|
|
||||||
if (fullAttachement) {
|
|
||||||
layoutMediaBinding.getRoot().setPadding(0, 0, 0, 10);
|
|
||||||
holder.binding.mediaContainer.addView(layoutMediaBinding.getRoot());
|
|
||||||
} else {
|
|
||||||
layoutMediaBinding.getRoot().setPadding(0, 0, 10, 0);
|
|
||||||
holder.binding.attachmentsList.addView(layoutMediaBinding.getRoot());
|
|
||||||
}
|
|
||||||
|
|
||||||
mediaPosition++;
|
|
||||||
}
|
|
||||||
if (!fullAttachement) {
|
|
||||||
holder.binding.mediaContainer.setVisibility(View.GONE);
|
|
||||||
holder.binding.attachmentsListContainer.setVisibility(View.VISIBLE);
|
|
||||||
} else {
|
|
||||||
holder.binding.mediaContainer.setVisibility(View.VISIBLE);
|
|
||||||
holder.binding.attachmentsListContainer.setVisibility(View.GONE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
holder.binding.displayMedia.setVisibility(View.GONE);
|
holder.binding.displayMedia.setVisibility(View.GONE);
|
||||||
|
@ -2012,21 +1870,34 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
||||||
}
|
}
|
||||||
|
|
||||||
if (status.isFetchMore && fetchMoreCallBack != null) {
|
if (status.isFetchMore && fetchMoreCallBack != null) {
|
||||||
holder.binding.layoutFetchMore.fetchMoreContainer.setVisibility(View.VISIBLE);
|
DrawerFetchMoreBinding drawerFetchMoreBinding = DrawerFetchMoreBinding.inflate(LayoutInflater.from(context));
|
||||||
holder.binding.layoutFetchMore.fetchMoreMin.setOnClickListener(v -> {
|
if (status.positionFetchMore == Status.PositionFetchMore.BOTTOM) {
|
||||||
|
holder.binding.fetchMoreContainerBottom.setVisibility(View.GONE);
|
||||||
|
holder.binding.fetchMoreContainerTop.setVisibility(View.VISIBLE);
|
||||||
|
holder.binding.fetchMoreContainerTop.removeAllViews();
|
||||||
|
holder.binding.fetchMoreContainerTop.addView(drawerFetchMoreBinding.getRoot());
|
||||||
|
} else {
|
||||||
|
holder.binding.fetchMoreContainerBottom.setVisibility(View.VISIBLE);
|
||||||
|
holder.binding.fetchMoreContainerTop.setVisibility(View.GONE);
|
||||||
|
holder.binding.fetchMoreContainerBottom.removeAllViews();
|
||||||
|
holder.binding.fetchMoreContainerBottom.addView(drawerFetchMoreBinding.getRoot());
|
||||||
|
}
|
||||||
|
drawerFetchMoreBinding.fetchMoreMin.setOnClickListener(v -> {
|
||||||
status.isFetchMore = false;
|
status.isFetchMore = false;
|
||||||
adapter.notifyItemChanged(holder.getBindingAdapterPosition());
|
int position = holder.getBindingAdapterPosition();
|
||||||
if (holder.getBindingAdapterPosition() < statusList.size() - 1) {
|
int position2 = getStatusPosition(statusList, status);
|
||||||
|
adapter.notifyItemChanged(position);
|
||||||
|
if (position < statusList.size() - 1) {
|
||||||
String fromId;
|
String fromId;
|
||||||
if (status.positionFetchMore == Status.PositionFetchMore.TOP) {
|
if (status.positionFetchMore == Status.PositionFetchMore.TOP) {
|
||||||
fromId = statusList.get(holder.getBindingAdapterPosition() + 1).id;
|
fromId = statusList.get(position + 1).id;
|
||||||
} else {
|
} else {
|
||||||
fromId = status.id;
|
fromId = status.id;
|
||||||
}
|
}
|
||||||
fetchMoreCallBack.onClickMinId(fromId, status);
|
fetchMoreCallBack.onClickMinId(fromId, status);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
holder.binding.layoutFetchMore.fetchMoreMax.setOnClickListener(v -> {
|
drawerFetchMoreBinding.fetchMoreMax.setOnClickListener(v -> {
|
||||||
//We hide the button
|
//We hide the button
|
||||||
status.isFetchMore = false;
|
status.isFetchMore = false;
|
||||||
String fromId;
|
String fromId;
|
||||||
|
@ -2039,11 +1910,153 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
||||||
adapter.notifyItemChanged(holder.getBindingAdapterPosition());
|
adapter.notifyItemChanged(holder.getBindingAdapterPosition());
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
holder.binding.layoutFetchMore.fetchMoreContainer.setVisibility(View.GONE);
|
holder.binding.fetchMoreContainerBottom.setVisibility(View.GONE);
|
||||||
|
holder.binding.fetchMoreContainerTop.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static void loadAndAddAttachment(Context context, LayoutMediaBinding layoutMediaBinding,
|
||||||
|
StatusViewHolder holder,
|
||||||
|
RecyclerView.Adapter<RecyclerView.ViewHolder> adapter,
|
||||||
|
int mediaPosition, float mediaH, float ratio,
|
||||||
|
Status statusToDeal, Attachment attachment, boolean singleImage) {
|
||||||
|
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||||
|
final int timeout = sharedpreferences.getInt(context.getString(R.string.SET_NSFW_TIMEOUT), 5);
|
||||||
|
boolean fullAttachement = sharedpreferences.getBoolean(context.getString(R.string.SET_FULL_PREVIEW), false);
|
||||||
|
boolean long_press_media = sharedpreferences.getBoolean(context.getString(R.string.SET_LONG_PRESS_STORE_MEDIA), false);
|
||||||
|
boolean expand_media = sharedpreferences.getBoolean(context.getString(R.string.SET_EXPAND_MEDIA), false);
|
||||||
|
|
||||||
|
LinearLayout.LayoutParams lp;
|
||||||
|
if (fullAttachement && mediaH > 0) {
|
||||||
|
lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, (int) (mediaH * ratio));
|
||||||
|
layoutMediaBinding.media.setScaleType(ImageView.ScaleType.FIT_CENTER);
|
||||||
|
} else {
|
||||||
|
if (singleImage) {
|
||||||
|
lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, (int) Helper.convertDpToPixel(200, context));
|
||||||
|
} else {
|
||||||
|
lp = new LinearLayout.LayoutParams((int) Helper.convertDpToPixel(200, context), (int) Helper.convertDpToPixel(200, context));
|
||||||
|
}
|
||||||
|
layoutMediaBinding.media.setScaleType(ImageView.ScaleType.CENTER_CROP);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
layoutMediaBinding.media.setLayoutParams(lp);
|
||||||
|
|
||||||
|
float focusX = 0.f;
|
||||||
|
float focusY = 0.f;
|
||||||
|
if (statusToDeal.media_attachments.get(0).meta != null && statusToDeal.media_attachments.get(0).meta.focus != null) {
|
||||||
|
focusX = statusToDeal.media_attachments.get(0).meta.focus.x;
|
||||||
|
focusY = statusToDeal.media_attachments.get(0).meta.focus.y;
|
||||||
|
}
|
||||||
|
layoutMediaBinding.count.setVisibility(View.VISIBLE);
|
||||||
|
if (!fullAttachement && !singleImage) {
|
||||||
|
layoutMediaBinding.count.setText(String.format(Locale.getDefault(), "%d/%d", mediaPosition, statusToDeal.media_attachments.size()));
|
||||||
|
}
|
||||||
|
String finalUrl;
|
||||||
|
if (attachment.url == null) {
|
||||||
|
finalUrl = attachment.remote_url;
|
||||||
|
} else {
|
||||||
|
finalUrl = attachment.url;
|
||||||
|
}
|
||||||
|
layoutMediaBinding.media.setOnLongClickListener(v -> {
|
||||||
|
if (long_press_media) {
|
||||||
|
MediaHelper.manageMove(context, finalUrl, false);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (attachment.type != null && (attachment.type.equalsIgnoreCase("video") || attachment.type.equalsIgnoreCase("gifv"))) {
|
||||||
|
layoutMediaBinding.playVideo.setVisibility(View.VISIBLE);
|
||||||
|
} else {
|
||||||
|
layoutMediaBinding.playVideo.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
if (attachment.type != null && attachment.type.equalsIgnoreCase("audio")) {
|
||||||
|
layoutMediaBinding.playMusic.setVisibility(View.VISIBLE);
|
||||||
|
} else {
|
||||||
|
layoutMediaBinding.playMusic.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
if (attachment.description != null && !attachment.description.isEmpty()) {
|
||||||
|
layoutMediaBinding.viewDescription.setVisibility(View.VISIBLE);
|
||||||
|
} else {
|
||||||
|
layoutMediaBinding.viewDescription.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!mediaObfuscated(statusToDeal) || expand_media) {
|
||||||
|
layoutMediaBinding.viewHide.setImageResource(R.drawable.ic_baseline_visibility_24);
|
||||||
|
RequestBuilder<Drawable> requestBuilder = Glide.with(layoutMediaBinding.media.getContext())
|
||||||
|
.load(attachment.preview_url);
|
||||||
|
if (!fullAttachement) {
|
||||||
|
requestBuilder = requestBuilder.apply(new RequestOptions().transform(new GlideFocus(focusX, focusY)));
|
||||||
|
} else {
|
||||||
|
requestBuilder = requestBuilder.placeholder(R.color.transparent_grey);
|
||||||
|
requestBuilder = requestBuilder.fitCenter();
|
||||||
|
}
|
||||||
|
requestBuilder.into(layoutMediaBinding.media);
|
||||||
|
} else {
|
||||||
|
layoutMediaBinding.viewHide.setImageResource(R.drawable.ic_baseline_visibility_off_24);
|
||||||
|
Glide.with(layoutMediaBinding.media.getContext())
|
||||||
|
.load(attachment.preview_url)
|
||||||
|
.apply(new RequestOptions().transform(new BlurTransformation(50, 3)))
|
||||||
|
// .apply(new RequestOptions().transform(new CenterCrop(), new RoundedCorners((int) Helper.convertDpToPixel(3, context))))
|
||||||
|
.into(layoutMediaBinding.media);
|
||||||
|
}
|
||||||
|
if (statusToDeal.sensitive) {
|
||||||
|
Helper.changeDrawableColor(context, layoutMediaBinding.viewHide, ThemeHelper.getAttColor(context, R.attr.colorError));
|
||||||
|
} else {
|
||||||
|
Helper.changeDrawableColor(context, layoutMediaBinding.viewHide, R.color.white);
|
||||||
|
}
|
||||||
|
|
||||||
|
layoutMediaBinding.media.setOnClickListener(v -> {
|
||||||
|
if (statusToDeal.isMediaObfuscated && mediaObfuscated(statusToDeal) && !expand_media) {
|
||||||
|
statusToDeal.isMediaObfuscated = false;
|
||||||
|
int position = holder.getBindingAdapterPosition();
|
||||||
|
adapter.notifyItemChanged(position);
|
||||||
|
|
||||||
|
if (timeout > 0) {
|
||||||
|
new CountDownTimer((timeout * 1000L), 1000) {
|
||||||
|
public void onTick(long millisUntilFinished) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onFinish() {
|
||||||
|
statusToDeal.isMediaObfuscated = true;
|
||||||
|
adapter.notifyItemChanged(position);
|
||||||
|
}
|
||||||
|
}.start();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Intent mediaIntent = new Intent(context, MediaActivity.class);
|
||||||
|
Bundle b = new Bundle();
|
||||||
|
b.putInt(Helper.ARG_MEDIA_POSITION, mediaPosition);
|
||||||
|
b.putSerializable(Helper.ARG_MEDIA_ARRAY, new ArrayList<>(statusToDeal.media_attachments));
|
||||||
|
mediaIntent.putExtras(b);
|
||||||
|
ActivityOptionsCompat options = ActivityOptionsCompat
|
||||||
|
.makeSceneTransitionAnimation((Activity) context, layoutMediaBinding.media, statusToDeal.media_attachments.get(0).url);
|
||||||
|
// start the new activity
|
||||||
|
context.startActivity(mediaIntent, options.toBundle());
|
||||||
|
});
|
||||||
|
layoutMediaBinding.viewHide.setOnClickListener(v -> {
|
||||||
|
statusToDeal.sensitive = !statusToDeal.sensitive;
|
||||||
|
adapter.notifyItemChanged(holder.getBindingAdapterPosition());
|
||||||
|
});
|
||||||
|
|
||||||
|
if (fullAttachement || singleImage) {
|
||||||
|
layoutMediaBinding.getRoot().setPadding(0, 0, 0, 10);
|
||||||
|
} else {
|
||||||
|
layoutMediaBinding.getRoot().setPadding(0, 0, 10, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
|
||||||
|
super.onAttachedToRecyclerView(recyclerView);
|
||||||
|
|
||||||
|
mRecyclerView = recyclerView;
|
||||||
|
}
|
||||||
|
|
||||||
private static boolean mediaObfuscated(Status status) {
|
private static boolean mediaObfuscated(Status status) {
|
||||||
//Media is not sensitive and doesn't have a spoiler text
|
//Media is not sensitive and doesn't have a spoiler text
|
||||||
if (!status.isMediaObfuscated) {
|
if (!status.isMediaObfuscated) {
|
||||||
|
@ -2146,6 +2159,90 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
||||||
return position;
|
return position;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void applyColor(Context context, StatusViewHolder holder) {
|
||||||
|
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||||
|
int currentNightMode = context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
|
||||||
|
boolean customLight = sharedpreferences.getBoolean(context.getString(R.string.SET_CUSTOMIZE_LIGHT_COLORS), false);
|
||||||
|
boolean customDark = sharedpreferences.getBoolean(context.getString(R.string.SET_CUSTOMIZE_DARK_COLORS), false);
|
||||||
|
int theme_icons_color = -1;
|
||||||
|
int theme_statuses_color = -1;
|
||||||
|
int theme_boost_header_color = -1;
|
||||||
|
int theme_text_color = -1;
|
||||||
|
int theme_text_header_1_line = -1;
|
||||||
|
int theme_text_header_2_line = -1;
|
||||||
|
int link_color = -1;
|
||||||
|
if (currentNightMode == Configuration.UI_MODE_NIGHT_NO) { //LIGHT THEME
|
||||||
|
if (customLight) {
|
||||||
|
theme_icons_color = sharedpreferences.getInt(context.getString(R.string.SET_LIGHT_ICON), -1);
|
||||||
|
theme_statuses_color = sharedpreferences.getInt(context.getString(R.string.SET_LIGHT_BACKGROUND), -1);
|
||||||
|
theme_boost_header_color = sharedpreferences.getInt(context.getString(R.string.SET_LIGHT_BOOST_HEADER), -1);
|
||||||
|
theme_text_color = sharedpreferences.getInt(context.getString(R.string.SET_LIGHT_TEXT), -1);
|
||||||
|
theme_text_header_1_line = sharedpreferences.getInt(context.getString(R.string.SET_LIGHT_DISPLAY_NAME), -1);
|
||||||
|
theme_text_header_2_line = sharedpreferences.getInt(context.getString(R.string.SET_LIGHT_USERNAME), -1);
|
||||||
|
link_color = sharedpreferences.getInt(context.getString(R.string.SET_LIGHT_LINK), -1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (customDark) {
|
||||||
|
theme_icons_color = sharedpreferences.getInt(context.getString(R.string.SET_DARK_ICON), -1);
|
||||||
|
theme_statuses_color = sharedpreferences.getInt(context.getString(R.string.SET_DARK_BACKGROUND), -1);
|
||||||
|
theme_boost_header_color = sharedpreferences.getInt(context.getString(R.string.SET_DARK_BOOST_HEADER), -1);
|
||||||
|
theme_text_color = sharedpreferences.getInt(context.getString(R.string.SET_DARK_TEXT), -1);
|
||||||
|
theme_text_header_1_line = sharedpreferences.getInt(context.getString(R.string.SET_DARK_DISPLAY_NAME), -1);
|
||||||
|
theme_text_header_2_line = sharedpreferences.getInt(context.getString(R.string.SET_DARK_USERNAME), -1);
|
||||||
|
link_color = sharedpreferences.getInt(context.getString(R.string.SET_DARK_LINK), -1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (theme_icons_color != -1) {
|
||||||
|
Helper.changeDrawableColor(context, holder.binding.actionButtonReply, theme_icons_color);
|
||||||
|
Helper.changeDrawableColor(context, holder.binding.statusAddCustomEmoji, theme_icons_color);
|
||||||
|
Helper.changeDrawableColor(context, holder.binding.statusEmoji, theme_icons_color);
|
||||||
|
Helper.changeDrawableColor(context, holder.binding.actionButtonMore, theme_icons_color);
|
||||||
|
Helper.changeDrawableColor(context, R.drawable.ic_round_star_24, theme_icons_color);
|
||||||
|
Helper.changeDrawableColor(context, R.drawable.ic_round_repeat_24, theme_icons_color);
|
||||||
|
Helper.changeDrawableColor(context, holder.binding.visibility, theme_icons_color);
|
||||||
|
Helper.changeDrawableColor(context, R.drawable.ic_round_star_border_24, theme_icons_color);
|
||||||
|
Helper.changeDrawableColor(context, R.drawable.ic_person, theme_icons_color);
|
||||||
|
Helper.changeDrawableColor(context, R.drawable.ic_bot, theme_icons_color);
|
||||||
|
Helper.changeDrawableColor(context, R.drawable.ic_round_reply_24, theme_icons_color);
|
||||||
|
holder.binding.actionButtonFavorite.setInActiveImageTintColor(theme_icons_color);
|
||||||
|
holder.binding.actionButtonBookmark.setInActiveImageTintColor(theme_icons_color);
|
||||||
|
holder.binding.actionButtonBoost.setInActiveImageTintColor(theme_icons_color);
|
||||||
|
holder.binding.replyCount.setTextColor(theme_icons_color);
|
||||||
|
}
|
||||||
|
if (theme_statuses_color != -1) {
|
||||||
|
holder.binding.cardviewContainer.setBackgroundColor(theme_statuses_color);
|
||||||
|
holder.binding.translationLabel.setBackgroundColor(theme_statuses_color);
|
||||||
|
}
|
||||||
|
if (theme_boost_header_color != -1) {
|
||||||
|
holder.binding.statusBoosterInfo.setBackgroundColor(theme_boost_header_color);
|
||||||
|
}
|
||||||
|
if (theme_text_color != -1) {
|
||||||
|
holder.binding.statusContent.setTextColor(theme_text_color);
|
||||||
|
holder.binding.statusContentTranslated.setTextColor(theme_text_color);
|
||||||
|
holder.binding.spoiler.setTextColor(theme_text_color);
|
||||||
|
holder.binding.dateShort.setTextColor(theme_text_color);
|
||||||
|
holder.binding.poll.pollInfo.setTextColor(theme_text_color);
|
||||||
|
holder.binding.cardDescription.setTextColor(theme_text_color);
|
||||||
|
holder.binding.time.setTextColor(theme_text_color);
|
||||||
|
holder.binding.reblogsCount.setTextColor(theme_text_color);
|
||||||
|
holder.binding.favoritesCount.setTextColor(theme_text_color);
|
||||||
|
holder.binding.favoritesCount.setTextColor(theme_text_color);
|
||||||
|
Helper.changeDrawableColor(context, holder.binding.repeatInfo, theme_text_color);
|
||||||
|
Helper.changeDrawableColor(context, holder.binding.favInfo, theme_text_color);
|
||||||
|
Helper.changeDrawableColor(context, R.drawable.ic_baseline_lock_24, theme_text_color);
|
||||||
|
}
|
||||||
|
if (theme_text_header_1_line != -1) {
|
||||||
|
holder.binding.displayName.setTextColor(theme_text_header_1_line);
|
||||||
|
}
|
||||||
|
if (theme_text_header_2_line != -1) {
|
||||||
|
holder.binding.username.setTextColor(theme_text_header_2_line);
|
||||||
|
}
|
||||||
|
if (link_color != -1) {
|
||||||
|
holder.binding.cardUrl.setTextColor(link_color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
|
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
|
||||||
//Nothing to do with hidden statuses
|
//Nothing to do with hidden statuses
|
||||||
|
@ -2155,12 +2252,22 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
||||||
Status status = statusList.get(position);
|
Status status = statusList.get(position);
|
||||||
if (viewHolder.getItemViewType() == STATUS_VISIBLE) {
|
if (viewHolder.getItemViewType() == STATUS_VISIBLE) {
|
||||||
StatusViewHolder holder = (StatusViewHolder) viewHolder;
|
StatusViewHolder holder = (StatusViewHolder) viewHolder;
|
||||||
|
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||||
|
if (sharedpreferences.getBoolean(context.getString(R.string.SET_CARDVIEW), false)) {
|
||||||
|
holder.binding.cardviewContainer.setCardElevation(Helper.convertDpToPixel(5, context));
|
||||||
|
holder.binding.dividerCard.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
StatusesVM statusesVM = new ViewModelProvider((ViewModelStoreOwner) context).get(StatusesVM.class);
|
StatusesVM statusesVM = new ViewModelProvider((ViewModelStoreOwner) context).get(StatusesVM.class);
|
||||||
SearchVM searchVM = new ViewModelProvider((ViewModelStoreOwner) context).get(SearchVM.class);
|
SearchVM searchVM = new ViewModelProvider((ViewModelStoreOwner) context).get(SearchVM.class);
|
||||||
statusManagement(context, statusesVM, searchVM, holder, this, statusList, status, timelineType, minified, canBeFederated, checkRemotely, fetchMoreCallBack);
|
statusManagement(context, statusesVM, searchVM, holder, mRecyclerView, this, statusList, status, timelineType, minified, canBeFederated, checkRemotely, fetchMoreCallBack);
|
||||||
|
applyColor(context, holder);
|
||||||
} else if (viewHolder.getItemViewType() == STATUS_FILTERED_HIDE) {
|
} else if (viewHolder.getItemViewType() == STATUS_FILTERED_HIDE) {
|
||||||
StatusViewHolder holder = (StatusViewHolder) viewHolder;
|
StatusViewHolder holder = (StatusViewHolder) viewHolder;
|
||||||
|
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||||
|
if (sharedpreferences.getBoolean(context.getString(R.string.SET_CARDVIEW), false)) {
|
||||||
|
holder.binding.cardviewContainer.setCardElevation(Helper.convertDpToPixel(5, context));
|
||||||
|
holder.binding.dividerCard.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
if (status.isFetchMore && fetchMoreCallBack != null) {
|
if (status.isFetchMore && fetchMoreCallBack != null) {
|
||||||
holder.bindingFilteredHide.layoutFetchMore.fetchMoreContainer.setVisibility(View.VISIBLE);
|
holder.bindingFilteredHide.layoutFetchMore.fetchMoreContainer.setVisibility(View.VISIBLE);
|
||||||
holder.bindingFilteredHide.layoutFetchMore.fetchMoreMin.setOnClickListener(v -> {
|
holder.bindingFilteredHide.layoutFetchMore.fetchMoreMin.setOnClickListener(v -> {
|
||||||
|
@ -2191,10 +2298,8 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
||||||
} else {
|
} else {
|
||||||
holder.bindingFilteredHide.layoutFetchMore.fetchMoreContainer.setVisibility(View.GONE);
|
holder.bindingFilteredHide.layoutFetchMore.fetchMoreContainer.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (viewHolder.getItemViewType() == STATUS_FILTERED) {
|
} else if (viewHolder.getItemViewType() == STATUS_FILTERED) {
|
||||||
StatusViewHolder holder = (StatusViewHolder) viewHolder;
|
StatusViewHolder holder = (StatusViewHolder) viewHolder;
|
||||||
|
|
||||||
holder.bindingFiltered.filteredText.setText(context.getString(R.string.filtered_by, status.filteredByApp.title));
|
holder.bindingFiltered.filteredText.setText(context.getString(R.string.filtered_by, status.filteredByApp.title));
|
||||||
holder.bindingFiltered.displayButton.setOnClickListener(v -> {
|
holder.bindingFiltered.displayButton.setOnClickListener(v -> {
|
||||||
status.filteredByApp = null;
|
status.filteredByApp = null;
|
||||||
|
@ -2231,7 +2336,6 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
||||||
} else {
|
} else {
|
||||||
holder.bindingFiltered.layoutFetchMore.fetchMoreContainer.setVisibility(View.GONE);
|
holder.bindingFiltered.layoutFetchMore.fetchMoreContainer.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (viewHolder.getItemViewType() == STATUS_ART) {
|
} else if (viewHolder.getItemViewType() == STATUS_ART) {
|
||||||
StatusViewHolder holder = (StatusViewHolder) viewHolder;
|
StatusViewHolder holder = (StatusViewHolder) viewHolder;
|
||||||
MastodonHelper.loadPPMastodon(holder.bindingArt.artPp, status.account);
|
MastodonHelper.loadPPMastodon(holder.bindingArt.artPp, status.account);
|
||||||
|
|
|
@ -17,12 +17,15 @@ package app.fedilab.android.ui.drawer;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
|
import androidx.preference.PreferenceManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
@ -68,6 +71,12 @@ public class StatusDraftAdapter extends RecyclerView.Adapter<StatusDraftAdapter.
|
||||||
public void onBindViewHolder(@NonNull StatusDraftHolder holder, int position) {
|
public void onBindViewHolder(@NonNull StatusDraftHolder holder, int position) {
|
||||||
StatusDraft statusDraft = statusDrafts.get(position);
|
StatusDraft statusDraft = statusDrafts.get(position);
|
||||||
|
|
||||||
|
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||||
|
if (sharedpreferences.getBoolean(context.getString(R.string.SET_CARDVIEW), false)) {
|
||||||
|
holder.binding.cardviewContainer.setCardElevation(Helper.convertDpToPixel(5, context));
|
||||||
|
holder.binding.dividerCard.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
//--- MAIN CONTENT ---
|
//--- MAIN CONTENT ---
|
||||||
if (statusDraft.statusDraftList != null && statusDraft.statusDraftList.size() > 0) {
|
if (statusDraft.statusDraftList != null && statusDraft.statusDraftList.size() > 0) {
|
||||||
holder.binding.statusContent.setText(statusDraft.statusDraftList.get(0).text, TextView.BufferType.SPANNABLE);
|
holder.binding.statusContent.setText(statusDraft.statusDraftList.get(0).text, TextView.BufferType.SPANNABLE);
|
||||||
|
@ -87,7 +96,7 @@ public class StatusDraftAdapter extends RecyclerView.Adapter<StatusDraftAdapter.
|
||||||
//--- DATE ---
|
//--- DATE ---
|
||||||
holder.binding.date.setText(Helper.dateDiff(context, statusDraft.created_ad));
|
holder.binding.date.setText(Helper.dateDiff(context, statusDraft.created_ad));
|
||||||
|
|
||||||
holder.binding.container.setOnClickListener(v -> {
|
holder.binding.cardviewContainer.setOnClickListener(v -> {
|
||||||
Intent intent = new Intent(context, ComposeActivity.class);
|
Intent intent = new Intent(context, ComposeActivity.class);
|
||||||
intent.putExtra(Helper.ARG_STATUS_DRAFT, statusDraft);
|
intent.putExtra(Helper.ARG_STATUS_DRAFT, statusDraft);
|
||||||
context.startActivity(intent);
|
context.startActivity(intent);
|
||||||
|
|
|
@ -56,13 +56,13 @@ public class StatusHistoryAdapter extends RecyclerView.Adapter<RecyclerView.View
|
||||||
Status status = statuses.get(position);
|
Status status = statuses.get(position);
|
||||||
holder.binding.statusContent.setText(
|
holder.binding.statusContent.setText(
|
||||||
status.getSpanContent(context,
|
status.getSpanContent(context,
|
||||||
new WeakReference<>(holder.binding.statusContent)),
|
new WeakReference<>(holder.binding.statusContent), null),
|
||||||
TextView.BufferType.SPANNABLE);
|
TextView.BufferType.SPANNABLE);
|
||||||
if (status.spoiler_text != null && !status.spoiler_text.trim().isEmpty()) {
|
if (status.spoiler_text != null && !status.spoiler_text.trim().isEmpty()) {
|
||||||
holder.binding.spoiler.setVisibility(View.VISIBLE);
|
holder.binding.spoiler.setVisibility(View.VISIBLE);
|
||||||
holder.binding.spoiler.setText(
|
holder.binding.spoiler.setText(
|
||||||
status.getSpanSpoiler(context,
|
status.getSpanSpoiler(context,
|
||||||
new WeakReference<>(holder.binding.spoiler)),
|
new WeakReference<>(holder.binding.spoiler), null),
|
||||||
TextView.BufferType.SPANNABLE);
|
TextView.BufferType.SPANNABLE);
|
||||||
} else {
|
} else {
|
||||||
holder.binding.spoiler.setVisibility(View.GONE);
|
holder.binding.spoiler.setVisibility(View.GONE);
|
||||||
|
|
|
@ -121,7 +121,7 @@ public class StatusScheduledAdapter extends RecyclerView.Adapter<StatusScheduled
|
||||||
holder.binding.statusContent.setText(statusContent);
|
holder.binding.statusContent.setText(statusContent);
|
||||||
}
|
}
|
||||||
|
|
||||||
holder.binding.container.setOnClickListener(v -> {
|
holder.binding.cardviewContainer.setOnClickListener(v -> {
|
||||||
if (statusDraft != null) {
|
if (statusDraft != null) {
|
||||||
Intent intent = new Intent(context, ComposeActivity.class);
|
Intent intent = new Intent(context, ComposeActivity.class);
|
||||||
intent.putExtra(Helper.ARG_STATUS_DRAFT, statusDraft);
|
intent.putExtra(Helper.ARG_STATUS_DRAFT, statusDraft);
|
||||||
|
|
|
@ -18,6 +18,7 @@ package app.fedilab.android.ui.drawer;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
@ -28,6 +29,7 @@ import androidx.annotation.NonNull;
|
||||||
import androidx.core.app.ActivityOptionsCompat;
|
import androidx.core.app.ActivityOptionsCompat;
|
||||||
import androidx.lifecycle.ViewModelProvider;
|
import androidx.lifecycle.ViewModelProvider;
|
||||||
import androidx.lifecycle.ViewModelStoreOwner;
|
import androidx.lifecycle.ViewModelStoreOwner;
|
||||||
|
import androidx.preference.PreferenceManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
import java.lang.ref.WeakReference;
|
import java.lang.ref.WeakReference;
|
||||||
|
@ -76,7 +78,11 @@ public class SuggestionAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
|
||||||
SuggestionViewHolder holder = (SuggestionViewHolder) viewHolder;
|
SuggestionViewHolder holder = (SuggestionViewHolder) viewHolder;
|
||||||
MastodonHelper.loadPPMastodon(holder.binding.avatar, account);
|
MastodonHelper.loadPPMastodon(holder.binding.avatar, account);
|
||||||
|
|
||||||
|
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||||
|
if (sharedpreferences.getBoolean(context.getString(R.string.SET_CARDVIEW), false)) {
|
||||||
|
holder.binding.cardviewContainer.setCardElevation(Helper.convertDpToPixel(5, context));
|
||||||
|
holder.binding.dividerCard.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
AccountsVM accountsVM = new ViewModelProvider((ViewModelStoreOwner) context).get(AccountsVM.class);
|
AccountsVM accountsVM = new ViewModelProvider((ViewModelStoreOwner) context).get(AccountsVM.class);
|
||||||
|
|
||||||
holder.binding.avatar.setOnClickListener(v -> {
|
holder.binding.avatar.setOnClickListener(v -> {
|
||||||
|
|
|
@ -16,11 +16,14 @@ package app.fedilab.android.ui.drawer;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.preference.PreferenceManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
import com.github.mikephil.charting.components.Description;
|
import com.github.mikephil.charting.components.Description;
|
||||||
|
@ -52,6 +55,13 @@ public class TagAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
|
||||||
public static void tagManagement(Context context, TagViewHolder tagViewHolder, Tag tag) {
|
public static void tagManagement(Context context, TagViewHolder tagViewHolder, Tag tag) {
|
||||||
tagViewHolder.binding.tagName.setText(String.format("#%s", tag.name));
|
tagViewHolder.binding.tagName.setText(String.format("#%s", tag.name));
|
||||||
|
|
||||||
|
|
||||||
|
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||||
|
if (sharedpreferences.getBoolean(context.getString(R.string.SET_CARDVIEW), false)) {
|
||||||
|
tagViewHolder.binding.cardviewContainer.setCardElevation(Helper.convertDpToPixel(5, context));
|
||||||
|
tagViewHolder.binding.dividerCard.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
List<Entry> trendsEntry = new ArrayList<>();
|
List<Entry> trendsEntry = new ArrayList<>();
|
||||||
|
|
||||||
List<History> historyList = tag.history;
|
List<History> historyList = tag.history;
|
||||||
|
|
|
@ -17,16 +17,20 @@ package app.fedilab.android.ui.drawer.admin;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.preference.PreferenceManager;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
||||||
|
import app.fedilab.android.R;
|
||||||
import app.fedilab.android.activities.admin.AdminAccountActivity;
|
import app.fedilab.android.activities.admin.AdminAccountActivity;
|
||||||
import app.fedilab.android.client.entities.api.admin.AdminAccount;
|
import app.fedilab.android.client.entities.api.admin.AdminAccount;
|
||||||
import app.fedilab.android.databinding.DrawerAdminAccountBinding;
|
import app.fedilab.android.databinding.DrawerAdminAccountBinding;
|
||||||
|
@ -63,8 +67,15 @@ public class AdminAccountAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
||||||
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
|
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
|
||||||
AdminAccount adminAccount = adminAccountList.get(position);
|
AdminAccount adminAccount = adminAccountList.get(position);
|
||||||
AccountAdminViewHolder holder = (AccountAdminViewHolder) viewHolder;
|
AccountAdminViewHolder holder = (AccountAdminViewHolder) viewHolder;
|
||||||
|
|
||||||
|
SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context);
|
||||||
|
if (sharedpreferences.getBoolean(context.getString(R.string.SET_CARDVIEW), false)) {
|
||||||
|
holder.binding.cardviewContainer.setCardElevation(Helper.convertDpToPixel(5, context));
|
||||||
|
holder.binding.dividerCard.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
MastodonHelper.loadPPMastodon(holder.binding.pp, adminAccount.account);
|
MastodonHelper.loadPPMastodon(holder.binding.pp, adminAccount.account);
|
||||||
holder.binding.adminAccountContainer.setOnClickListener(v -> {
|
holder.binding.cardviewContainer.setOnClickListener(v -> {
|
||||||
Intent intent = new Intent(context, AdminAccountActivity.class);
|
Intent intent = new Intent(context, AdminAccountActivity.class);
|
||||||
Bundle b = new Bundle();
|
Bundle b = new Bundle();
|
||||||
b.putSerializable(Helper.ARG_ACCOUNT, adminAccount);
|
b.putSerializable(Helper.ARG_ACCOUNT, adminAccount);
|
||||||
|
|
|
@ -0,0 +1,57 @@
|
||||||
|
package app.fedilab.android.ui.fragment.settings;
|
||||||
|
/* 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 android.content.SharedPreferences;
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import androidx.preference.PreferenceFragmentCompat;
|
||||||
|
|
||||||
|
import app.fedilab.android.R;
|
||||||
|
|
||||||
|
public class FragmentCustomDarkSettings extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
|
||||||
|
addPreferencesFromResource(R.xml.pref_custom_dark);
|
||||||
|
createPref();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createPref() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
|
||||||
|
getPreferenceScreen().getSharedPreferences()
|
||||||
|
.registerOnSharedPreferenceChangeListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPause() {
|
||||||
|
super.onPause();
|
||||||
|
getPreferenceScreen().getSharedPreferences()
|
||||||
|
.unregisterOnSharedPreferenceChangeListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,57 @@
|
||||||
|
package app.fedilab.android.ui.fragment.settings;
|
||||||
|
/* 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 android.content.SharedPreferences;
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import androidx.preference.PreferenceFragmentCompat;
|
||||||
|
|
||||||
|
import app.fedilab.android.R;
|
||||||
|
|
||||||
|
public class FragmentCustomLightSettings extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
|
||||||
|
addPreferencesFromResource(R.xml.pref_custom_light);
|
||||||
|
createPref();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createPref() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
|
||||||
|
getPreferenceScreen().getSharedPreferences()
|
||||||
|
.registerOnSharedPreferenceChangeListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPause() {
|
||||||
|
super.onPause();
|
||||||
|
getPreferenceScreen().getSharedPreferences()
|
||||||
|
.unregisterOnSharedPreferenceChangeListener(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -18,7 +18,11 @@ package app.fedilab.android.ui.fragment.settings;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import androidx.appcompat.app.AlertDialog;
|
||||||
|
import androidx.navigation.NavOptions;
|
||||||
|
import androidx.navigation.Navigation;
|
||||||
import androidx.preference.ListPreference;
|
import androidx.preference.ListPreference;
|
||||||
|
import androidx.preference.Preference;
|
||||||
import androidx.preference.PreferenceFragmentCompat;
|
import androidx.preference.PreferenceFragmentCompat;
|
||||||
|
|
||||||
import app.fedilab.android.R;
|
import app.fedilab.android.R;
|
||||||
|
@ -89,6 +93,61 @@ public class FragmentThemingSettings extends PreferenceFragmentCompat implements
|
||||||
if (SET_THEME_DEFAULT_DARK != null) {
|
if (SET_THEME_DEFAULT_DARK != null) {
|
||||||
SET_THEME_DEFAULT_DARK.getContext().setTheme(Helper.dialogStyle());
|
SET_THEME_DEFAULT_DARK.getContext().setTheme(Helper.dialogStyle());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Preference SET_CUSTOMIZE_LIGHT_COLORS_ACTION = findPreference(getString(R.string.SET_CUSTOMIZE_LIGHT_COLORS_ACTION));
|
||||||
|
if (SET_CUSTOMIZE_LIGHT_COLORS_ACTION != null) {
|
||||||
|
SET_CUSTOMIZE_LIGHT_COLORS_ACTION.setOnPreferenceClickListener(preference -> {
|
||||||
|
NavOptions.Builder navBuilder = new NavOptions.Builder();
|
||||||
|
navBuilder.setEnterAnim(R.anim.enter).setExitAnim(R.anim.exit).setPopEnterAnim(R.anim.pop_enter).setPopExitAnim(R.anim.pop_exit);
|
||||||
|
|
||||||
|
Navigation.findNavController(requireActivity(), R.id.fragment_container).navigate(R.id.FragmentCustomLightSettings, null, navBuilder.build());
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
Preference SET_CUSTOMIZE_DARK_COLORS_ACTION = findPreference(getString(R.string.SET_CUSTOMIZE_DARK_COLORS_ACTION));
|
||||||
|
if (SET_CUSTOMIZE_DARK_COLORS_ACTION != null) {
|
||||||
|
SET_CUSTOMIZE_DARK_COLORS_ACTION.setOnPreferenceClickListener(preference -> {
|
||||||
|
NavOptions.Builder navBuilder = new NavOptions.Builder();
|
||||||
|
navBuilder.setEnterAnim(R.anim.enter).setExitAnim(R.anim.exit).setPopEnterAnim(R.anim.pop_enter).setPopExitAnim(R.anim.pop_exit);
|
||||||
|
Navigation.findNavController(requireActivity(), R.id.fragment_container).navigate(R.id.FragmentCustomDarkSettings, null, navBuilder.build());
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
Preference SET_RESET_CUSTOM_COLOR = findPreference(getString(R.string.SET_RESET_CUSTOM_COLOR));
|
||||||
|
if (SET_RESET_CUSTOM_COLOR != null) {
|
||||||
|
SET_RESET_CUSTOM_COLOR.getContext().setTheme(Helper.dialogStyle());
|
||||||
|
SET_RESET_CUSTOM_COLOR.setOnPreferenceClickListener(preference -> {
|
||||||
|
AlertDialog.Builder resetConfirm = new AlertDialog.Builder(requireActivity(), Helper.dialogStyle());
|
||||||
|
resetConfirm.setMessage(getString(R.string.reset_color));
|
||||||
|
resetConfirm.setNegativeButton(R.string.no, (dialog, which) -> dialog.dismiss());
|
||||||
|
resetConfirm.setPositiveButton(R.string.reset, (dialog, which) -> {
|
||||||
|
SharedPreferences sharedPreferences = getPreferenceScreen().getSharedPreferences();
|
||||||
|
if (sharedPreferences != null) {
|
||||||
|
sharedPreferences.edit().remove(getString(R.string.SET_LIGHT_BACKGROUND)).apply();
|
||||||
|
sharedPreferences.edit().remove(getString(R.string.SET_LIGHT_BOOST_HEADER)).apply();
|
||||||
|
sharedPreferences.edit().remove(getString(R.string.SET_LIGHT_DISPLAY_NAME)).apply();
|
||||||
|
sharedPreferences.edit().remove(getString(R.string.SET_LIGHT_USERNAME)).apply();
|
||||||
|
sharedPreferences.edit().remove(getString(R.string.SET_LIGHT_TEXT)).apply();
|
||||||
|
sharedPreferences.edit().remove(getString(R.string.SET_LIGHT_LINK)).apply();
|
||||||
|
sharedPreferences.edit().remove(getString(R.string.SET_LIGHT_ICON)).apply();
|
||||||
|
sharedPreferences.edit().remove(getString(R.string.SET_DARK_BACKGROUND)).apply();
|
||||||
|
sharedPreferences.edit().remove(getString(R.string.SET_DARK_BOOST_HEADER)).apply();
|
||||||
|
sharedPreferences.edit().remove(getString(R.string.SET_DARK_DISPLAY_NAME)).apply();
|
||||||
|
sharedPreferences.edit().remove(getString(R.string.SET_DARK_USERNAME)).apply();
|
||||||
|
sharedPreferences.edit().remove(getString(R.string.SET_DARK_TEXT)).apply();
|
||||||
|
sharedPreferences.edit().remove(getString(R.string.SET_DARK_LINK)).apply();
|
||||||
|
sharedPreferences.edit().remove(getString(R.string.SET_DARK_ICON)).apply();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
dialog.dismiss();
|
||||||
|
});
|
||||||
|
resetConfirm.show();
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -140,7 +140,7 @@ public class FragmentMastodonConversation extends Fragment implements Conversati
|
||||||
|
|
||||||
timelineParams.fetchingMissing = fetchingMissing;
|
timelineParams.fetchingMissing = fetchingMissing;
|
||||||
|
|
||||||
if (useCache) {
|
if (useCache && direction != FragmentMastodonTimeline.DIRECTION.SCROLL_TOP && direction != FragmentMastodonTimeline.DIRECTION.FETCH_NEW) {
|
||||||
getCachedConversations(direction, fetchingMissing, timelineParams);
|
getCachedConversations(direction, fetchingMissing, timelineParams);
|
||||||
} else {
|
} else {
|
||||||
getLiveConversations(direction, fetchingMissing, timelineParams, conversationToUpdate);
|
getLiveConversations(direction, fetchingMissing, timelineParams, conversationToUpdate);
|
||||||
|
@ -150,7 +150,7 @@ public class FragmentMastodonConversation extends Fragment implements Conversati
|
||||||
private void getCachedConversations(FragmentMastodonTimeline.DIRECTION direction, boolean fetchingMissing, TimelinesVM.TimelineParams timelineParams) {
|
private void getCachedConversations(FragmentMastodonTimeline.DIRECTION direction, boolean fetchingMissing, TimelinesVM.TimelineParams timelineParams) {
|
||||||
|
|
||||||
if (direction == null) {
|
if (direction == null) {
|
||||||
timelinesVM.getConversations(conversationList, timelineParams)
|
timelinesVM.getConversationsCache(conversationList, timelineParams)
|
||||||
.observe(getViewLifecycleOwner(), conversationsCached -> {
|
.observe(getViewLifecycleOwner(), conversationsCached -> {
|
||||||
if (conversationsCached == null || conversationsCached.conversations == null || conversationsCached.conversations.size() == 0) {
|
if (conversationsCached == null || conversationsCached.conversations == null || conversationsCached.conversations.size() == 0) {
|
||||||
getLiveConversations(null, fetchingMissing, timelineParams, null);
|
getLiveConversations(null, fetchingMissing, timelineParams, null);
|
||||||
|
@ -179,13 +179,18 @@ public class FragmentMastodonConversation extends Fragment implements Conversati
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else if (direction == FragmentMastodonTimeline.DIRECTION.REFRESH) {
|
} else if (direction == FragmentMastodonTimeline.DIRECTION.REFRESH) {
|
||||||
timelinesVM.getConversations(conversationList, timelineParams)
|
timelinesVM.getConversationsCache(conversationList, timelineParams)
|
||||||
.observe(getViewLifecycleOwner(), notificationsRefresh -> {
|
.observe(getViewLifecycleOwner(), notificationsRefresh -> {
|
||||||
if (conversationAdapter != null) {
|
if (notificationsRefresh == null || notificationsRefresh.conversations == null || notificationsRefresh.conversations.size() == 0) {
|
||||||
dealWithPagination(notificationsRefresh, FragmentMastodonTimeline.DIRECTION.REFRESH, true, null);
|
getLiveConversations(direction, fetchingMissing, timelineParams, null);
|
||||||
} else {
|
} else {
|
||||||
initializeConversationCommonView(notificationsRefresh);
|
if (conversationAdapter != null) {
|
||||||
|
dealWithPagination(notificationsRefresh, FragmentMastodonTimeline.DIRECTION.REFRESH, true, null);
|
||||||
|
} else {
|
||||||
|
initializeConversationCommonView(notificationsRefresh);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -387,7 +387,7 @@ public class FragmentMastodonNotification extends Fragment implements Notificati
|
||||||
}
|
}
|
||||||
timelineParams.excludeType = getExcludeType();
|
timelineParams.excludeType = getExcludeType();
|
||||||
timelineParams.fetchingMissing = fetchingMissing;
|
timelineParams.fetchingMissing = fetchingMissing;
|
||||||
if (useCache) {
|
if (useCache && direction != FragmentMastodonTimeline.DIRECTION.SCROLL_TOP && direction != FragmentMastodonTimeline.DIRECTION.FETCH_NEW) {
|
||||||
getCachedNotifications(direction, fetchingMissing, timelineParams);
|
getCachedNotifications(direction, fetchingMissing, timelineParams);
|
||||||
} else {
|
} else {
|
||||||
getLiveNotifications(direction, fetchingMissing, timelineParams, notificationToUpdate);
|
getLiveNotifications(direction, fetchingMissing, timelineParams, notificationToUpdate);
|
||||||
|
@ -430,10 +430,14 @@ public class FragmentMastodonNotification extends Fragment implements Notificati
|
||||||
} else if (direction == FragmentMastodonTimeline.DIRECTION.REFRESH) {
|
} else if (direction == FragmentMastodonTimeline.DIRECTION.REFRESH) {
|
||||||
notificationsVM.getNotifications(notificationList, timelineParams)
|
notificationsVM.getNotifications(notificationList, timelineParams)
|
||||||
.observe(getViewLifecycleOwner(), notificationsRefresh -> {
|
.observe(getViewLifecycleOwner(), notificationsRefresh -> {
|
||||||
if (notificationAdapter != null) {
|
if (notificationsRefresh == null || notificationsRefresh.notifications == null || notificationsRefresh.notifications.size() == 0) {
|
||||||
dealWithPagination(notificationsRefresh, FragmentMastodonTimeline.DIRECTION.REFRESH, true, null);
|
getLiveNotifications(direction, fetchingMissing, timelineParams, null);
|
||||||
} else {
|
} else {
|
||||||
initializeNotificationView(notificationsRefresh);
|
if (notificationAdapter != null) {
|
||||||
|
dealWithPagination(notificationsRefresh, FragmentMastodonTimeline.DIRECTION.REFRESH, true, null);
|
||||||
|
} else {
|
||||||
|
initializeNotificationView(notificationsRefresh);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,6 +24,7 @@ import androidx.lifecycle.LiveData;
|
||||||
import androidx.lifecycle.MutableLiveData;
|
import androidx.lifecycle.MutableLiveData;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
@ -64,8 +65,13 @@ public class NotificationsVM extends AndroidViewModel {
|
||||||
super(application);
|
super(application);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void sortDesc(List<Notification> notificationList) {
|
||||||
|
Collections.sort(notificationList, (obj1, obj2) -> obj2.id.compareToIgnoreCase(obj1.id));
|
||||||
|
}
|
||||||
|
|
||||||
private static void addFetchMoreNotifications(List<Notification> notificationList, List<Notification> timelineNotifications, TimelinesVM.TimelineParams timelineParams) throws DBException {
|
private static void addFetchMoreNotifications(List<Notification> notificationList, List<Notification> timelineNotifications, TimelinesVM.TimelineParams timelineParams) throws DBException {
|
||||||
if (notificationList != null && notificationList.size() > 0 && timelineNotifications != null && timelineNotifications.size() > 0) {
|
if (notificationList != null && notificationList.size() > 0 && timelineNotifications != null && timelineNotifications.size() > 0) {
|
||||||
|
sortDesc(notificationList);
|
||||||
if (timelineParams.direction == FragmentMastodonTimeline.DIRECTION.REFRESH || timelineParams.direction == FragmentMastodonTimeline.DIRECTION.SCROLL_TOP || timelineParams.direction == FragmentMastodonTimeline.DIRECTION.FETCH_NEW) {
|
if (timelineParams.direction == FragmentMastodonTimeline.DIRECTION.REFRESH || timelineParams.direction == FragmentMastodonTimeline.DIRECTION.SCROLL_TOP || timelineParams.direction == FragmentMastodonTimeline.DIRECTION.FETCH_NEW) {
|
||||||
//When refreshing/scrolling to TOP, if last statuses fetched has a greater id from newest in cache, there is potential hole
|
//When refreshing/scrolling to TOP, if last statuses fetched has a greater id from newest in cache, there is potential hole
|
||||||
if (notificationList.get(notificationList.size() - 1).id.compareToIgnoreCase(timelineNotifications.get(0).id) > 0) {
|
if (notificationList.get(notificationList.size() - 1).id.compareToIgnoreCase(timelineNotifications.get(0).id) > 0) {
|
||||||
|
|
|
@ -29,6 +29,7 @@ import androidx.lifecycle.MutableLiveData;
|
||||||
import androidx.preference.PreferenceManager;
|
import androidx.preference.PreferenceManager;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
@ -90,8 +91,18 @@ public class TimelinesVM extends AndroidViewModel {
|
||||||
super(application);
|
super(application);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static void sortDesc(List<Status> statusList) {
|
||||||
|
Collections.sort(statusList, (obj1, obj2) -> obj2.id.compareToIgnoreCase(obj1.id));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void sortDescConv(List<Conversation> conversationList) {
|
||||||
|
Collections.sort(conversationList, (obj1, obj2) -> obj2.id.compareToIgnoreCase(obj1.id));
|
||||||
|
}
|
||||||
|
|
||||||
private static void addFetchMore(List<Status> statusList, List<Status> timelineStatuses, TimelineParams timelineParams) throws DBException {
|
private static void addFetchMore(List<Status> statusList, List<Status> timelineStatuses, TimelineParams timelineParams) throws DBException {
|
||||||
if (statusList != null && statusList.size() > 0 && timelineStatuses != null && timelineStatuses.size() > 0) {
|
if (statusList != null && statusList.size() > 0 && timelineStatuses != null && timelineStatuses.size() > 0) {
|
||||||
|
sortDesc(statusList);
|
||||||
if (timelineParams.direction == FragmentMastodonTimeline.DIRECTION.REFRESH || timelineParams.direction == FragmentMastodonTimeline.DIRECTION.SCROLL_TOP || timelineParams.direction == FragmentMastodonTimeline.DIRECTION.FETCH_NEW) {
|
if (timelineParams.direction == FragmentMastodonTimeline.DIRECTION.REFRESH || timelineParams.direction == FragmentMastodonTimeline.DIRECTION.SCROLL_TOP || timelineParams.direction == FragmentMastodonTimeline.DIRECTION.FETCH_NEW) {
|
||||||
//When refreshing/scrolling to TOP, if last statuses fetched has a greater id from newest in cache, there is potential hole
|
//When refreshing/scrolling to TOP, if last statuses fetched has a greater id from newest in cache, there is potential hole
|
||||||
if (statusList.get(statusList.size() - 1).id.compareToIgnoreCase(timelineStatuses.get(0).id) > 0) {
|
if (statusList.get(statusList.size() - 1).id.compareToIgnoreCase(timelineStatuses.get(0).id) > 0) {
|
||||||
|
@ -114,6 +125,7 @@ public class TimelinesVM extends AndroidViewModel {
|
||||||
|
|
||||||
private static void addFetchMoreConversation(List<Conversation> conversationList, List<Conversation> timelineConversations, TimelineParams timelineParams) throws DBException {
|
private static void addFetchMoreConversation(List<Conversation> conversationList, List<Conversation> timelineConversations, TimelineParams timelineParams) throws DBException {
|
||||||
if (conversationList != null && conversationList.size() > 0 && timelineConversations != null && timelineConversations.size() > 0) {
|
if (conversationList != null && conversationList.size() > 0 && timelineConversations != null && timelineConversations.size() > 0) {
|
||||||
|
sortDescConv(conversationList);
|
||||||
if (timelineParams.direction == FragmentMastodonTimeline.DIRECTION.REFRESH || timelineParams.direction == FragmentMastodonTimeline.DIRECTION.SCROLL_TOP || timelineParams.direction == FragmentMastodonTimeline.DIRECTION.FETCH_NEW) {
|
if (timelineParams.direction == FragmentMastodonTimeline.DIRECTION.REFRESH || timelineParams.direction == FragmentMastodonTimeline.DIRECTION.SCROLL_TOP || timelineParams.direction == FragmentMastodonTimeline.DIRECTION.FETCH_NEW) {
|
||||||
//When refreshing/scrolling to TOP, if last statuses fetched has a greater id from newest in cache, there is potential hole
|
//When refreshing/scrolling to TOP, if last statuses fetched has a greater id from newest in cache, there is potential hole
|
||||||
if (conversationList.get(conversationList.size() - 1).id.compareToIgnoreCase(timelineConversations.get(0).id) > 0) {
|
if (conversationList.get(conversationList.size() - 1).id.compareToIgnoreCase(timelineConversations.get(0).id) > 0) {
|
||||||
|
|
|
@ -5,6 +5,6 @@
|
||||||
android:viewportWidth="24"
|
android:viewportWidth="24"
|
||||||
android:viewportHeight="24">
|
android:viewportHeight="24">
|
||||||
<path
|
<path
|
||||||
android:fillColor="?attr/colorControlNormal"
|
android:fillColor="@android:color/white"
|
||||||
android:pathData="M17,3H7c-1.1,0 -1.99,0.9 -1.99,2L5,21l7,-3 7,3V5c0,-1.1 -0.9,-2 -2,-2z" />
|
android:pathData="M17,3H7c-1.1,0 -1.99,0.9 -1.99,2L5,21l7,-3 7,3V5c0,-1.1 -0.9,-2 -2,-2z" />
|
||||||
</vector>
|
</vector>
|
||||||
|
|
10
app/src/main/res/drawable/ic_baseline_photo_24.xml
Normal file
10
app/src/main/res/drawable/ic_baseline_photo_24.xml
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:tint="#FFFFFF"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="@android:color/white"
|
||||||
|
android:pathData="M21,19V5c0,-1.1 -0.9,-2 -2,-2H5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2zM8.5,13.5l2.5,3.01L14.5,12l4.5,6H5l3.5,-4.5z" />
|
||||||
|
</vector>
|
|
@ -1,7 +1,7 @@
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:width="24dp"
|
android:width="24dp"
|
||||||
android:height="24dp"
|
android:height="24dp"
|
||||||
android:tint="?attr/colorControlNormal"
|
android:tint="#FFFFFF"
|
||||||
android:viewportWidth="24"
|
android:viewportWidth="24"
|
||||||
android:viewportHeight="24">
|
android:viewportHeight="24">
|
||||||
<path
|
<path
|
||||||
|
|
|
@ -5,6 +5,6 @@
|
||||||
android:viewportWidth="24"
|
android:viewportWidth="24"
|
||||||
android:viewportHeight="24">
|
android:viewportHeight="24">
|
||||||
<path
|
<path
|
||||||
android:fillColor="@android:color/white"
|
android:fillColor="?attr/colorControlNormal"
|
||||||
android:pathData="M12,17.27L18.18,21l-1.64,-7.03L22,9.24l-7.19,-0.61L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21z" />
|
android:pathData="M12,17.27L18.18,21l-1.64,-7.03L22,9.24l-7.19,-0.61L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21z" />
|
||||||
</vector>
|
</vector>
|
||||||
|
|
|
@ -1,11 +1,10 @@
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:width="28dp"
|
|
||||||
android:height="28dp"
|
|
||||||
android:autoMirrored="true"
|
|
||||||
android:tint="?attr/colorControlNormal"
|
android:tint="?attr/colorControlNormal"
|
||||||
android:viewportWidth="28"
|
android:width="24dp"
|
||||||
android:viewportHeight="28">
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
<path
|
<path
|
||||||
android:fillColor="?attr/colorControlNormal"
|
android:fillColor="?attr/colorControlNormal"
|
||||||
android:pathData="M7,7h10v1.79c0,0.45 0.54,0.67 0.85,0.35l2.79,-2.79c0.2,-0.2 0.2,-0.51 0,-0.71l-2.79,-2.79c-0.31,-0.31 -0.85,-0.09 -0.85,0.36L17,5L6,5c-0.55,0 -1,0.45 -1,1v4c0,0.55 0.45,1 1,1s1,-0.45 1,-1L7,7zM17,17L7,17v-1.79c0,-0.45 -0.54,-0.67 -0.85,-0.35l-2.79,2.79c-0.2,0.2 -0.2,0.51 0,0.71l2.79,2.79c0.31,0.31 0.85,0.09 0.85,-0.36L7,19h11c0.55,0 1,-0.45 1,-1v-4c0,-0.55 -0.45,-1 -1,-1s-1,0.45 -1,1v3z" />
|
android:pathData="M7,7h10v3l4,-4 -4,-4v3L5,5v6h2L7,7zM17,17L7,17v-3l-4,4 4,4v-3h12v-6h-2v4z" />
|
||||||
</vector>
|
</vector>
|
||||||
|
|
10
app/src/main/res/drawable/ic_round_bookmark_24.xml
Normal file
10
app/src/main/res/drawable/ic_round_bookmark_24.xml
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:tint="?attr/colorControlNormal"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="?attr/colorControlNormal"
|
||||||
|
android:pathData="M17,3H7c-1.1,0 -2,0.9 -2,2v16l7,-3 7,3V5c0,-1.1 -0.9,-2 -2,-2z" />
|
||||||
|
</vector>
|
10
app/src/main/res/drawable/ic_round_bookmark_border_24.xml
Normal file
10
app/src/main/res/drawable/ic_round_bookmark_border_24.xml
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:tint="?attr/colorControlNormal"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="?attr/colorControlNormal"
|
||||||
|
android:pathData="M17,3L7,3c-1.1,0 -2,0.9 -2,2v16l7,-3 7,3L19,5c0,-1.1 -0.9,-2 -2,-2zM17,18l-5,-2.18L7,18L7,6c0,-0.55 0.45,-1 1,-1h8c0.55,0 1,0.45 1,1v12z" />
|
||||||
|
</vector>
|
10
app/src/main/res/drawable/ic_round_more_horiz_24.xml
Normal file
10
app/src/main/res/drawable/ic_round_more_horiz_24.xml
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:tint="?attr/colorControlNormal"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="?attr/colorControlNormal"
|
||||||
|
android:pathData="M6,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM18,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z" />
|
||||||
|
</vector>
|
10
app/src/main/res/drawable/ic_round_repeat_24.xml
Normal file
10
app/src/main/res/drawable/ic_round_repeat_24.xml
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:tint="?attr/colorControlNormal"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="?attr/colorControlNormal"
|
||||||
|
android:pathData="M7,7h10v1.79c0,0.45 0.54,0.67 0.85,0.35l2.79,-2.79c0.2,-0.2 0.2,-0.51 0,-0.71l-2.79,-2.79c-0.31,-0.31 -0.85,-0.09 -0.85,0.36L17,5L6,5c-0.55,0 -1,0.45 -1,1v4c0,0.55 0.45,1 1,1s1,-0.45 1,-1L7,7zM17,17L7,17v-1.79c0,-0.45 -0.54,-0.67 -0.85,-0.35l-2.79,2.79c-0.2,0.2 -0.2,0.51 0,0.71l2.79,2.79c0.31,0.31 0.85,0.09 0.85,-0.36L7,19h11c0.55,0 1,-0.45 1,-1v-4c0,-0.55 -0.45,-1 -1,-1s-1,0.45 -1,1v3z" />
|
||||||
|
</vector>
|
10
app/src/main/res/drawable/ic_round_reply_24.xml
Normal file
10
app/src/main/res/drawable/ic_round_reply_24.xml
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:tint="?attr/colorControlNormal"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="?attr/colorControlNormal"
|
||||||
|
android:pathData="m9.559,8.159l0,-1.908c0,-1.068 -1.296,-1.608 -2.052,-0.852l-5.508,5.508c-0.468,0.468 -0.468,1.224 0,1.692l5.508,5.508c0.756,0.756 2.052,0.228 2.052,-0.84l0,-2.028c6,0 10.2,1.92 13.2,6.12 -1.2,-6 -4.8,-12 -13.2,-13.2z" />
|
||||||
|
</vector>
|
10
app/src/main/res/drawable/ic_round_star_24.xml
Normal file
10
app/src/main/res/drawable/ic_round_star_24.xml
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:tint="?attr/colorControlNormal"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="?attr/colorControlNormal"
|
||||||
|
android:pathData="M12,17.27l4.15,2.51c0.76,0.46 1.69,-0.22 1.49,-1.08l-1.1,-4.72l3.67,-3.18c0.67,-0.58 0.31,-1.68 -0.57,-1.75l-4.83,-0.41l-1.89,-4.46c-0.34,-0.81 -1.5,-0.81 -1.84,0L9.19,8.63L4.36,9.04c-0.88,0.07 -1.24,1.17 -0.57,1.75l3.67,3.18l-1.1,4.72c-0.2,0.86 0.73,1.54 1.49,1.08L12,17.27z" />
|
||||||
|
</vector>
|
10
app/src/main/res/drawable/ic_round_star_border_24.xml
Normal file
10
app/src/main/res/drawable/ic_round_star_border_24.xml
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:tint="?attr/colorControlNormal"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="?attr/colorControlNormal"
|
||||||
|
android:pathData="M19.65,9.04l-4.84,-0.42 -1.89,-4.45c-0.34,-0.81 -1.5,-0.81 -1.84,0L9.19,8.63l-4.83,0.41c-0.88,0.07 -1.24,1.17 -0.57,1.75l3.67,3.18 -1.1,4.72c-0.2,0.86 0.73,1.54 1.49,1.08l4.15,-2.5 4.15,2.51c0.76,0.46 1.69,-0.22 1.49,-1.08l-1.1,-4.73 3.67,-3.18c0.67,-0.58 0.32,-1.68 -0.56,-1.75zM12,15.4l-3.76,2.27 1,-4.28 -3.32,-2.88 4.38,-0.38L12,6.1l1.71,4.04 4.38,0.38 -3.32,2.88 1,4.28L12,15.4z" />
|
||||||
|
</vector>
|
|
@ -1,9 +1,9 @@
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:width="28dp"
|
android:width="24dp"
|
||||||
android:height="28dp"
|
android:height="24dp"
|
||||||
android:tint="?attr/colorControlNormal"
|
android:tint="?attr/colorControlNormal"
|
||||||
android:viewportWidth="28"
|
android:viewportWidth="24"
|
||||||
android:viewportHeight="28">
|
android:viewportHeight="24">
|
||||||
<path
|
<path
|
||||||
android:fillColor="?attr/colorControlNormal"
|
android:fillColor="?attr/colorControlNormal"
|
||||||
android:pathData="M22,9.24l-7.19,-0.62L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21 12,17.27 18.18,21l-1.63,-7.03L22,9.24zM12,15.4l-3.76,2.27 1,-4.28 -3.32,-2.88 4.38,-0.38L12,6.1l1.71,4.04 4.38,0.38 -3.32,2.88 1,4.28L12,15.4z" />
|
android:pathData="M22,9.24l-7.19,-0.62L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21 12,17.27 18.18,21l-1.63,-7.03L22,9.24zM12,15.4l-3.76,2.27 1,-4.28 -3.32,-2.88 4.38,-0.38L12,6.1l1.71,4.04 4.38,0.38 -3.32,2.88 1,4.28L12,15.4z" />
|
||||||
|
|
|
@ -14,16 +14,21 @@
|
||||||
You should have received a copy of the GNU General Public License along with Fedilab; if not,
|
You should have received a copy of the GNU General Public License along with Fedilab; if not,
|
||||||
see <http://www.gnu.org/licenses>
|
see <http://www.gnu.org/licenses>
|
||||||
-->
|
-->
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/cardview_container"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginHorizontal="6dp"
|
android:layout_marginHorizontal="6dp"
|
||||||
android:layout_marginTop="6dp">
|
android:layout_marginTop="6dp"
|
||||||
|
android:clipChildren="false"
|
||||||
|
android:clipToPadding="false"
|
||||||
|
app:cardElevation="0dp"
|
||||||
|
app:strokeWidth="0dp">
|
||||||
|
|
||||||
<View
|
<View
|
||||||
|
android:id="@+id/divider_card"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="1px"
|
android:layout_height="1px"
|
||||||
android:background="?colorOutline" />
|
android:background="?colorOutline" />
|
||||||
|
@ -154,4 +159,4 @@
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
</RelativeLayout>
|
</com.google.android.material.card.MaterialCardView>
|
||||||
|
|
|
@ -14,15 +14,21 @@
|
||||||
You should have received a copy of the GNU General Public License along with Fedilab; if not,
|
You should have received a copy of the GNU General Public License along with Fedilab; if not,
|
||||||
see <http://www.gnu.org/licenses>
|
see <http://www.gnu.org/licenses>
|
||||||
-->
|
-->
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/cardview_container"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginHorizontal="12dp"
|
android:layout_marginHorizontal="6dp"
|
||||||
android:layout_marginTop="12dp">
|
android:layout_marginTop="6dp"
|
||||||
|
android:clipChildren="false"
|
||||||
|
android:clipToPadding="false"
|
||||||
|
app:cardElevation="0dp"
|
||||||
|
app:strokeWidth="0dp">
|
||||||
|
|
||||||
<View
|
<View
|
||||||
|
android:id="@+id/divider_card"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="1px"
|
android:layout_height="1px"
|
||||||
android:background="?colorOutline" />
|
android:background="?colorOutline" />
|
||||||
|
@ -71,14 +77,14 @@
|
||||||
|
|
||||||
<com.google.android.material.button.MaterialButton
|
<com.google.android.material.button.MaterialButton
|
||||||
android:id="@+id/list_action"
|
android:id="@+id/list_action"
|
||||||
style="@style/Widget.AppCompat.Button.Colored"
|
style="@style/Widget.Material3.Button.Icon"
|
||||||
android:layout_width="36dp"
|
android:layout_width="36dp"
|
||||||
android:layout_height="36dp"
|
android:layout_height="36dp"
|
||||||
android:layout_marginStart="12dp"
|
android:layout_marginStart="12dp"
|
||||||
android:layout_marginTop="6dp"
|
android:layout_marginTop="6dp"
|
||||||
android:insetTop="0dp"
|
android:padding="0dp"
|
||||||
android:insetBottom="0dp"
|
app:iconGravity="textStart"
|
||||||
android:padding="6dp"
|
app:iconPadding="0dp"
|
||||||
app:icon="@drawable/ic_baseline_person_add_alt_1_24"
|
app:icon="@drawable/ic_baseline_person_add_alt_1_24"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
@ -86,4 +92,4 @@
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
</RelativeLayout>
|
</com.google.android.material.card.MaterialCardView>
|
||||||
|
|
|
@ -1,16 +1,23 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:id="@+id/admin_account_container"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:id="@+id/cardview_container"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginHorizontal="6dp"
|
android:layout_marginHorizontal="6dp"
|
||||||
android:layout_marginTop="6dp">
|
android:layout_marginTop="6dp"
|
||||||
|
android:clipChildren="false"
|
||||||
|
android:clipToPadding="false"
|
||||||
|
app:cardElevation="0dp"
|
||||||
|
app:strokeWidth="0dp">
|
||||||
|
|
||||||
<View
|
<View
|
||||||
|
android:id="@+id/divider_card"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="1px"
|
android:layout_height="1px"
|
||||||
android:background="?colorOutline" />
|
android:background="?colorOutline" />
|
||||||
|
|
||||||
|
|
||||||
<androidx.appcompat.widget.LinearLayoutCompat
|
<androidx.appcompat.widget.LinearLayoutCompat
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
@ -140,5 +147,5 @@
|
||||||
</androidx.appcompat.widget.LinearLayoutCompat>
|
</androidx.appcompat.widget.LinearLayoutCompat>
|
||||||
</androidx.appcompat.widget.LinearLayoutCompat>
|
</androidx.appcompat.widget.LinearLayoutCompat>
|
||||||
</androidx.appcompat.widget.LinearLayoutCompat>
|
</androidx.appcompat.widget.LinearLayoutCompat>
|
||||||
</RelativeLayout>
|
</com.google.android.material.card.MaterialCardView>
|
||||||
|
|
||||||
|
|
|
@ -14,19 +14,21 @@
|
||||||
You should have received a copy of the GNU General Public License along with Fedilab; if not,
|
You should have received a copy of the GNU General Public License along with Fedilab; if not,
|
||||||
see <http://www.gnu.org/licenses>
|
see <http://www.gnu.org/licenses>
|
||||||
-->
|
-->
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:id="@+id/cardview_container"
|
android:id="@+id/cardview_container"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:clipChildren="false"
|
||||||
|
android:clipToPadding="false"
|
||||||
android:layout_marginHorizontal="@dimen/card_margin"
|
android:layout_marginHorizontal="@dimen/card_margin"
|
||||||
android:layout_marginTop="@dimen/card_margin"
|
android:layout_marginTop="@dimen/card_margin"
|
||||||
android:clipChildren="false"
|
app:cardElevation="0dp"
|
||||||
android:clipToPadding="false">
|
app:strokeWidth="0dp">
|
||||||
|
|
||||||
<View
|
<View
|
||||||
|
android:id="@+id/divider_card"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="1px"
|
android:layout_height="1px"
|
||||||
android:background="?colorOutline" />
|
android:background="?colorOutline" />
|
||||||
|
@ -96,4 +98,4 @@
|
||||||
</androidx.appcompat.widget.LinearLayoutCompat>
|
</androidx.appcompat.widget.LinearLayoutCompat>
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
</RelativeLayout>
|
</com.google.android.material.card.MaterialCardView>
|
||||||
|
|
|
@ -14,17 +14,21 @@
|
||||||
You should have received a copy of the GNU General Public License along with Fedilab; if not,
|
You should have received a copy of the GNU General Public License along with Fedilab; if not,
|
||||||
see <http://www.gnu.org/licenses>
|
see <http://www.gnu.org/licenses>
|
||||||
-->
|
-->
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:id="@+id/container"
|
android:id="@+id/cardview_container"
|
||||||
android:layout_marginHorizontal="@dimen/card_margin"
|
android:layout_marginHorizontal="@dimen/card_margin"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="6dp"
|
||||||
android:layout_marginTop="6dp">
|
android:clipChildren="false"
|
||||||
|
android:clipToPadding="false"
|
||||||
|
app:cardElevation="0dp"
|
||||||
|
app:strokeWidth="0dp">
|
||||||
|
|
||||||
<View
|
<View
|
||||||
|
android:id="@+id/divider_card"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="1px"
|
android:layout_height="1px"
|
||||||
android:background="?colorOutline" />
|
android:background="?colorOutline" />
|
||||||
|
@ -115,4 +119,4 @@
|
||||||
tools:visibility="visible" />
|
tools:visibility="visible" />
|
||||||
</androidx.appcompat.widget.LinearLayoutCompat>
|
</androidx.appcompat.widget.LinearLayoutCompat>
|
||||||
|
|
||||||
</RelativeLayout>
|
</com.google.android.material.card.MaterialCardView>
|
||||||
|
|
|
@ -14,13 +14,20 @@
|
||||||
You should have received a copy of the GNU General Public License along with Fedilab; if not,
|
You should have received a copy of the GNU General Public License along with Fedilab; if not,
|
||||||
see <http://www.gnu.org/licenses>.
|
see <http://www.gnu.org/licenses>.
|
||||||
-->
|
-->
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:id="@+id/cardview_container"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_margin="12dp">
|
android:layout_marginHorizontal="6dp"
|
||||||
|
android:layout_marginTop="6dp"
|
||||||
|
android:clipChildren="false"
|
||||||
|
android:clipToPadding="false"
|
||||||
|
app:cardElevation="0dp"
|
||||||
|
app:strokeWidth="0dp">
|
||||||
|
|
||||||
<View
|
<View
|
||||||
|
android:id="@+id/divider_card"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="1px"
|
android:layout_height="1px"
|
||||||
android:background="?colorOutline" />
|
android:background="?colorOutline" />
|
||||||
|
@ -51,4 +58,4 @@
|
||||||
android:padding="6dp"
|
android:padding="6dp"
|
||||||
app:icon="@drawable/ic_baseline_delete_24" />
|
app:icon="@drawable/ic_baseline_delete_24" />
|
||||||
</androidx.appcompat.widget.LinearLayoutCompat>
|
</androidx.appcompat.widget.LinearLayoutCompat>
|
||||||
</RelativeLayout>
|
</com.google.android.material.card.MaterialCardView>
|
|
@ -14,15 +14,21 @@
|
||||||
You should have received a copy of the GNU General Public License along with Fedilab; if not,
|
You should have received a copy of the GNU General Public License along with Fedilab; if not,
|
||||||
see <http://www.gnu.org/licenses>
|
see <http://www.gnu.org/licenses>
|
||||||
-->
|
-->
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:id="@+id/cardview_container"
|
||||||
|
android:layout_marginTop="@dimen/card_margin"
|
||||||
|
android:clipChildren="false"
|
||||||
android:layout_marginHorizontal="@dimen/card_margin"
|
android:layout_marginHorizontal="@dimen/card_margin"
|
||||||
android:layout_marginTop="@dimen/card_margin">
|
android:clipToPadding="false"
|
||||||
|
app:cardElevation="0dp"
|
||||||
|
app:strokeWidth="0dp">
|
||||||
|
|
||||||
<View
|
<View
|
||||||
|
android:id="@+id/divider_card"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="1px"
|
android:layout_height="1px"
|
||||||
android:background="?colorOutline" />
|
android:background="?colorOutline" />
|
||||||
|
@ -48,6 +54,7 @@
|
||||||
tools:text="User asked to follow you" />
|
tools:text="User asked to follow you" />
|
||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatImageView
|
<androidx.appcompat.widget.AppCompatImageView
|
||||||
|
android:id="@+id/icon"
|
||||||
android:layout_width="20dp"
|
android:layout_width="20dp"
|
||||||
android:layout_height="20dp"
|
android:layout_height="20dp"
|
||||||
android:layout_gravity="center"
|
android:layout_gravity="center"
|
||||||
|
@ -128,4 +135,4 @@
|
||||||
|
|
||||||
</androidx.appcompat.widget.LinearLayoutCompat>
|
</androidx.appcompat.widget.LinearLayoutCompat>
|
||||||
|
|
||||||
</RelativeLayout>
|
</com.google.android.material.card.MaterialCardView>
|
||||||
|
|
|
@ -14,14 +14,21 @@
|
||||||
You should have received a copy of the GNU General Public License along with Fedilab; if not,
|
You should have received a copy of the GNU General Public License along with Fedilab; if not,
|
||||||
see <http://www.gnu.org/licenses>.
|
see <http://www.gnu.org/licenses>.
|
||||||
-->
|
-->
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_margin="12dp">
|
android:id="@+id/cardview_container"
|
||||||
|
android:layout_marginHorizontal="@dimen/card_margin"
|
||||||
|
android:layout_marginTop="@dimen/card_margin"
|
||||||
|
android:clipChildren="false"
|
||||||
|
android:clipToPadding="false"
|
||||||
|
app:cardElevation="0dp"
|
||||||
|
app:strokeWidth="0dp">
|
||||||
|
|
||||||
<View
|
<View
|
||||||
|
android:id="@+id/divider_card"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="1px"
|
android:layout_height="1px"
|
||||||
android:background="?colorOutline" />
|
android:background="?colorOutline" />
|
||||||
|
@ -49,7 +56,7 @@
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginStart="6dp"
|
android:layout_marginStart="6dp"
|
||||||
android:textAppearance="@style/TextAppearance.Material3.HeadlineMedium"
|
android:textAppearance="@style/TextAppearance.Material3.TitleMedium"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toEndOf="@id/instance_pp"
|
app:layout_constraintStart_toEndOf="@id/instance_pp"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
@ -99,4 +106,4 @@
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
</RelativeLayout>
|
</com.google.android.material.card.MaterialCardView>
|
|
@ -14,7 +14,7 @@
|
||||||
You should have received a copy of the GNU General Public License along with Fedilab; if not,
|
You should have received a copy of the GNU General Public License along with Fedilab; if not,
|
||||||
see <http://www.gnu.org/licenses>
|
see <http://www.gnu.org/licenses>
|
||||||
-->
|
-->
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:id="@+id/cardview_container"
|
android:id="@+id/cardview_container"
|
||||||
|
@ -22,13 +22,10 @@
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginHorizontal="@dimen/card_margin"
|
android:layout_marginHorizontal="@dimen/card_margin"
|
||||||
android:layout_marginTop="@dimen/card_margin"
|
android:layout_marginTop="@dimen/card_margin"
|
||||||
|
android:clipChildren="false"
|
||||||
android:clipToPadding="false"
|
android:clipToPadding="false"
|
||||||
android:clipChildren="false">
|
app:cardElevation="0dp"
|
||||||
|
app:strokeWidth="0dp">
|
||||||
<View
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="1px"
|
|
||||||
android:background="?colorOutline" />
|
|
||||||
|
|
||||||
<androidx.appcompat.widget.LinearLayoutCompat
|
<androidx.appcompat.widget.LinearLayoutCompat
|
||||||
android:id="@+id/main_container"
|
android:id="@+id/main_container"
|
||||||
|
@ -39,6 +36,16 @@
|
||||||
android:clipToPadding="false"
|
android:clipToPadding="false"
|
||||||
android:orientation="vertical">
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.LinearLayoutCompat
|
||||||
|
android:id="@+id/fetch_more_container_top"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content" />
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:id="@+id/divider_card"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="1px"
|
||||||
|
android:background="?colorOutline" />
|
||||||
|
|
||||||
<androidx.appcompat.widget.LinearLayoutCompat
|
<androidx.appcompat.widget.LinearLayoutCompat
|
||||||
android:id="@+id/status_booster_info"
|
android:id="@+id/status_booster_info"
|
||||||
|
@ -576,30 +583,30 @@
|
||||||
android:layout_height="48dp"
|
android:layout_height="48dp"
|
||||||
android:layout_marginStart="48dp"
|
android:layout_marginStart="48dp"
|
||||||
android:layout_marginTop="6dp"
|
android:layout_marginTop="6dp"
|
||||||
android:layout_marginEnd="6dp"
|
|
||||||
android:clipChildren="false"
|
android:clipChildren="false"
|
||||||
android:clipToPadding="false">
|
android:clipToPadding="false">
|
||||||
|
|
||||||
<androidx.appcompat.widget.LinearLayoutCompat
|
<androidx.appcompat.widget.LinearLayoutCompat
|
||||||
android:id="@+id/action_button_reply_container"
|
android:id="@+id/action_button_reply_container"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="48dp"
|
||||||
android:orientation="horizontal"
|
android:orientation="horizontal"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent">
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:layout_constraintVertical_bias="0.0">
|
||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatImageView
|
<androidx.appcompat.widget.AppCompatImageButton
|
||||||
android:id="@+id/action_button_reply"
|
android:id="@+id/action_button_reply"
|
||||||
android:layout_width="28dp"
|
style="@style/Widget.Material3.Button.IconButton"
|
||||||
android:layout_height="28dp"
|
android:layout_width="48dp"
|
||||||
|
android:layout_height="48dp"
|
||||||
android:layout_gravity="center"
|
android:layout_gravity="center"
|
||||||
android:layout_marginStart="6dp"
|
|
||||||
android:adjustViewBounds="true"
|
android:adjustViewBounds="true"
|
||||||
android:clickable="true"
|
android:clickable="true"
|
||||||
android:contentDescription="@string/reply"
|
android:contentDescription="@string/reply"
|
||||||
android:focusable="true"
|
android:focusable="true"
|
||||||
app:srcCompat="@drawable/ic_reply" />
|
app:srcCompat="@drawable/ic_round_reply_24" />
|
||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatTextView
|
<androidx.appcompat.widget.AppCompatTextView
|
||||||
android:id="@+id/reply_count"
|
android:id="@+id/reply_count"
|
||||||
|
@ -607,6 +614,7 @@
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="bottom"
|
android:layout_gravity="bottom"
|
||||||
android:text="+"
|
android:text="+"
|
||||||
|
tools:visibility="visible"
|
||||||
android:textColor="?colorControlNormal"
|
android:textColor="?colorControlNormal"
|
||||||
android:textSize="12sp"
|
android:textSize="12sp"
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
|
@ -619,16 +627,14 @@
|
||||||
app:layout_constraintEnd_toStartOf="@+id/action_button_favorite"
|
app:layout_constraintEnd_toStartOf="@+id/action_button_favorite"
|
||||||
app:layout_constraintStart_toEndOf="@+id/action_button_reply_container"
|
app:layout_constraintStart_toEndOf="@+id/action_button_reply_container"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
android:layout_width="28dp"
|
android:layout_width="48dp"
|
||||||
android:layout_height="28dp"
|
android:layout_height="48dp"
|
||||||
android:layout_marginStart="12dp"
|
|
||||||
android:layout_marginTop="2dp"
|
|
||||||
android:adjustViewBounds="true"
|
android:adjustViewBounds="true"
|
||||||
android:contentDescription="@string/reblog_add"
|
android:contentDescription="@string/reblog_add"
|
||||||
app:sparkbutton_activeImage="@drawable/ic_repeat"
|
app:sparkbutton_activeImage="@drawable/ic_round_repeat_24"
|
||||||
app:sparkbutton_animationSpeed="1.5"
|
app:sparkbutton_animationSpeed="1.5"
|
||||||
app:sparkbutton_iconSize="28dp"
|
app:sparkbutton_iconSize="24dp"
|
||||||
app:sparkbutton_inActiveImage="@drawable/ic_repeat"
|
app:sparkbutton_inActiveImage="@drawable/ic_round_repeat_24"
|
||||||
app:sparkbutton_primaryColor="@color/boost_icon"
|
app:sparkbutton_primaryColor="@color/boost_icon"
|
||||||
app:sparkbutton_secondaryColor="@color/boost_icon" />
|
app:sparkbutton_secondaryColor="@color/boost_icon" />
|
||||||
|
|
||||||
|
@ -638,17 +644,15 @@
|
||||||
app:layout_constraintEnd_toStartOf="@+id/action_button_bookmark"
|
app:layout_constraintEnd_toStartOf="@+id/action_button_bookmark"
|
||||||
app:layout_constraintStart_toEndOf="@+id/action_button_boost"
|
app:layout_constraintStart_toEndOf="@+id/action_button_boost"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
android:layout_width="28dp"
|
android:layout_width="48dp"
|
||||||
android:layout_height="28dp"
|
android:layout_height="48dp"
|
||||||
android:layout_gravity="center"
|
android:layout_gravity="center"
|
||||||
android:layout_marginStart="12dp"
|
|
||||||
android:layout_marginTop="2dp"
|
|
||||||
android:adjustViewBounds="true"
|
android:adjustViewBounds="true"
|
||||||
android:contentDescription="@string/favourite_add"
|
android:contentDescription="@string/favourite_add"
|
||||||
app:sparkbutton_activeImage="@drawable/ic_baseline_star_24"
|
app:sparkbutton_activeImage="@drawable/ic_round_star_24"
|
||||||
app:sparkbutton_animationSpeed="1.5"
|
app:sparkbutton_animationSpeed="1.5"
|
||||||
app:sparkbutton_iconSize="28dp"
|
app:sparkbutton_iconSize="24dp"
|
||||||
app:sparkbutton_inActiveImage="@drawable/ic_star_outline"
|
app:sparkbutton_inActiveImage="@drawable/ic_round_star_border_24"
|
||||||
app:sparkbutton_primaryColor="@color/marked_icon"
|
app:sparkbutton_primaryColor="@color/marked_icon"
|
||||||
app:sparkbutton_secondaryColor="@color/marked_icon" />
|
app:sparkbutton_secondaryColor="@color/marked_icon" />
|
||||||
|
|
||||||
|
@ -658,31 +662,29 @@
|
||||||
app:layout_constraintEnd_toStartOf="@+id/status_add_custom_emoji"
|
app:layout_constraintEnd_toStartOf="@+id/status_add_custom_emoji"
|
||||||
app:layout_constraintStart_toEndOf="@+id/action_button_favorite"
|
app:layout_constraintStart_toEndOf="@+id/action_button_favorite"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
android:layout_width="28dp"
|
android:layout_width="48dp"
|
||||||
android:layout_height="28dp"
|
android:layout_height="48dp"
|
||||||
android:layout_gravity="center"
|
android:layout_gravity="center"
|
||||||
android:layout_marginStart="12dp"
|
|
||||||
|
|
||||||
android:adjustViewBounds="true"
|
android:adjustViewBounds="true"
|
||||||
android:contentDescription="@string/bookmark_add"
|
android:contentDescription="@string/bookmark_add"
|
||||||
app:sparkbutton_activeImage="@drawable/ic_baseline_bookmark_24"
|
app:sparkbutton_activeImage="@drawable/ic_round_bookmark_24"
|
||||||
app:sparkbutton_animationSpeed="1.5"
|
app:sparkbutton_animationSpeed="1.5"
|
||||||
app:sparkbutton_iconSize="24dp"
|
app:sparkbutton_iconSize="24dp"
|
||||||
app:sparkbutton_inActiveImage="@drawable/ic_baseline_bookmark_border_24"
|
app:sparkbutton_inActiveImage="@drawable/ic_round_bookmark_border_24"
|
||||||
app:sparkbutton_primaryColor="@color/marked_icon"
|
app:sparkbutton_primaryColor="@color/marked_icon"
|
||||||
app:sparkbutton_secondaryColor="@color/marked_icon" />
|
app:sparkbutton_secondaryColor="@color/marked_icon" />
|
||||||
|
|
||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatImageView
|
<androidx.appcompat.widget.AppCompatImageButton
|
||||||
android:id="@+id/status_add_custom_emoji"
|
android:id="@+id/status_add_custom_emoji"
|
||||||
|
style="@style/Widget.Material3.Button.IconButton"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toStartOf="@+id/status_emoji"
|
app:layout_constraintEnd_toStartOf="@+id/status_emoji"
|
||||||
app:layout_constraintStart_toEndOf="@+id/action_button_bookmark"
|
app:layout_constraintStart_toEndOf="@+id/action_button_bookmark"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
android:layout_width="28dp"
|
android:layout_width="48dp"
|
||||||
android:layout_height="28dp"
|
android:layout_height="48dp"
|
||||||
android:contentDescription="@string/add_reaction"
|
android:contentDescription="@string/add_reaction"
|
||||||
android:padding="3dp"
|
|
||||||
android:src="@drawable/ic_baseline_emoji_emotions_24"
|
android:src="@drawable/ic_baseline_emoji_emotions_24"
|
||||||
android:layout_gravity="center"
|
android:layout_gravity="center"
|
||||||
android:adjustViewBounds="true"
|
android:adjustViewBounds="true"
|
||||||
|
@ -691,17 +693,16 @@
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
tools:visibility="visible" />
|
tools:visibility="visible" />
|
||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatImageView
|
<androidx.appcompat.widget.AppCompatImageButton
|
||||||
android:id="@+id/status_emoji"
|
android:id="@+id/status_emoji"
|
||||||
|
style="@style/Widget.Material3.Button.IconButton"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toStartOf="@+id/action_button_more"
|
app:layout_constraintEnd_toStartOf="@+id/action_button_more"
|
||||||
app:layout_constraintStart_toEndOf="@+id/status_add_custom_emoji"
|
app:layout_constraintStart_toEndOf="@+id/status_add_custom_emoji"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
android:layout_width="28dp"
|
android:layout_width="48dp"
|
||||||
android:layout_height="28dp"
|
android:layout_height="48dp"
|
||||||
android:layout_marginStart="6dp"
|
|
||||||
android:contentDescription="@string/add_reaction"
|
android:contentDescription="@string/add_reaction"
|
||||||
android:padding="3dp"
|
|
||||||
android:layout_gravity="center"
|
android:layout_gravity="center"
|
||||||
android:adjustViewBounds="true"
|
android:adjustViewBounds="true"
|
||||||
android:clickable="true"
|
android:clickable="true"
|
||||||
|
@ -710,28 +711,28 @@
|
||||||
android:visibility="gone"
|
android:visibility="gone"
|
||||||
tools:visibility="visible" />
|
tools:visibility="visible" />
|
||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatImageView
|
<androidx.appcompat.widget.AppCompatImageButton
|
||||||
android:id="@+id/action_button_more"
|
android:id="@+id/action_button_more"
|
||||||
|
style="@style/Widget.Material3.Button.IconButton"
|
||||||
android:layout_gravity="center|end"
|
android:layout_gravity="center|end"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
android:contentDescription="@string/display_options"
|
android:contentDescription="@string/display_options"
|
||||||
android:layout_width="28dp"
|
android:layout_width="48dp"
|
||||||
android:layout_height="28dp"
|
android:layout_height="48dp"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
android:clickable="true"
|
android:clickable="true"
|
||||||
android:adjustViewBounds="true"
|
android:adjustViewBounds="true"
|
||||||
android:focusable="true"
|
android:focusable="true"
|
||||||
app:srcCompat="@drawable/ic_more_horiz" />
|
app:srcCompat="@drawable/ic_round_more_horiz_24" />
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
<include
|
<androidx.appcompat.widget.LinearLayoutCompat
|
||||||
android:id="@+id/layout_fetch_more"
|
android:id="@+id/fetch_more_container_bottom"
|
||||||
layout="@layout/drawer_fetch_more"
|
android:layout_width="match_parent"
|
||||||
android:visibility="gone"
|
android:layout_height="wrap_content" />
|
||||||
tools:visibility="visible" />
|
|
||||||
|
|
||||||
</androidx.appcompat.widget.LinearLayoutCompat>
|
</androidx.appcompat.widget.LinearLayoutCompat>
|
||||||
|
|
||||||
</RelativeLayout>
|
</com.google.android.material.card.MaterialCardView>
|
||||||
|
|
|
@ -14,15 +14,21 @@
|
||||||
You should have received a copy of the GNU General Public License along with Fedilab; if not,
|
You should have received a copy of the GNU General Public License along with Fedilab; if not,
|
||||||
see <http://www.gnu.org/licenses>
|
see <http://www.gnu.org/licenses>
|
||||||
-->
|
-->
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:id="@+id/container"
|
android:id="@+id/cardview_container"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_margin="12dp">
|
android:layout_marginHorizontal="@dimen/card_margin"
|
||||||
|
android:layout_marginTop="@dimen/card_margin"
|
||||||
|
android:clipChildren="false"
|
||||||
|
android:clipToPadding="false"
|
||||||
|
app:cardElevation="0dp"
|
||||||
|
app:strokeWidth="0dp">
|
||||||
|
|
||||||
<View
|
<View
|
||||||
|
android:id="@+id/divider_card"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="1px"
|
android:layout_height="1px"
|
||||||
android:background="?colorOutline" />
|
android:background="?colorOutline" />
|
||||||
|
@ -106,4 +112,4 @@
|
||||||
</HorizontalScrollView>
|
</HorizontalScrollView>
|
||||||
</androidx.appcompat.widget.LinearLayoutCompat>
|
</androidx.appcompat.widget.LinearLayoutCompat>
|
||||||
|
|
||||||
</RelativeLayout>
|
</com.google.android.material.card.MaterialCardView>
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
You should have received a copy of the GNU General Public License along with Fedilab; if not,
|
You should have received a copy of the GNU General Public License along with Fedilab; if not,
|
||||||
see <http://www.gnu.org/licenses>
|
see <http://www.gnu.org/licenses>
|
||||||
-->
|
-->
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:id="@+id/cardview_container"
|
android:id="@+id/cardview_container"
|
||||||
|
@ -23,9 +23,12 @@
|
||||||
android:layout_marginHorizontal="@dimen/card_margin"
|
android:layout_marginHorizontal="@dimen/card_margin"
|
||||||
android:layout_marginTop="@dimen/card_margin"
|
android:layout_marginTop="@dimen/card_margin"
|
||||||
android:clipChildren="false"
|
android:clipChildren="false"
|
||||||
android:clipToPadding="false">
|
android:clipToPadding="false"
|
||||||
|
app:cardElevation="0dp"
|
||||||
|
app:strokeWidth="0dp">
|
||||||
|
|
||||||
<View
|
<View
|
||||||
|
android:id="@+id/divider_card"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="1px"
|
android:layout_height="1px"
|
||||||
android:background="?colorOutline" />
|
android:background="?colorOutline" />
|
||||||
|
@ -78,4 +81,4 @@
|
||||||
tools:visibility="visible" />
|
tools:visibility="visible" />
|
||||||
</androidx.appcompat.widget.LinearLayoutCompat>
|
</androidx.appcompat.widget.LinearLayoutCompat>
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
</RelativeLayout>
|
</com.google.android.material.card.MaterialCardView>
|
|
@ -14,7 +14,7 @@
|
||||||
You should have received a copy of the GNU General Public License along with Fedilab; if not,
|
You should have received a copy of the GNU General Public License along with Fedilab; if not,
|
||||||
see <http://www.gnu.org/licenses>
|
see <http://www.gnu.org/licenses>
|
||||||
-->
|
-->
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:id="@+id/cardview_container"
|
android:id="@+id/cardview_container"
|
||||||
|
@ -23,9 +23,12 @@
|
||||||
android:layout_marginHorizontal="@dimen/card_margin"
|
android:layout_marginHorizontal="@dimen/card_margin"
|
||||||
android:layout_marginTop="@dimen/card_margin"
|
android:layout_marginTop="@dimen/card_margin"
|
||||||
android:clipChildren="false"
|
android:clipChildren="false"
|
||||||
android:clipToPadding="false">
|
android:clipToPadding="false"
|
||||||
|
app:cardElevation="0dp"
|
||||||
|
app:strokeWidth="0dp">
|
||||||
|
|
||||||
<View
|
<View
|
||||||
|
android:id="@+id/divider_card"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="1px"
|
android:layout_height="1px"
|
||||||
android:background="?colorOutline" />
|
android:background="?colorOutline" />
|
||||||
|
@ -47,4 +50,4 @@
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
tools:visibility="visible" />
|
tools:visibility="visible" />
|
||||||
</androidx.appcompat.widget.LinearLayoutCompat>
|
</androidx.appcompat.widget.LinearLayoutCompat>
|
||||||
</RelativeLayout>
|
</com.google.android.material.card.MaterialCardView>
|
|
@ -14,17 +14,21 @@
|
||||||
You should have received a copy of the GNU General Public License along with Fedilab; if not,
|
You should have received a copy of the GNU General Public License along with Fedilab; if not,
|
||||||
see <http://www.gnu.org/licenses>
|
see <http://www.gnu.org/licenses>
|
||||||
-->
|
-->
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
android:id="@+id/cardview_container"
|
android:id="@+id/cardview_container"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginHorizontal="12dp"
|
android:layout_marginHorizontal="@dimen/card_margin"
|
||||||
android:layout_marginTop="12dp"
|
android:layout_marginTop="@dimen/card_margin"
|
||||||
android:clipChildren="false"
|
android:clipChildren="false"
|
||||||
android:clipToPadding="false">
|
android:clipToPadding="false"
|
||||||
|
app:cardElevation="0dp"
|
||||||
|
app:strokeWidth="0dp">
|
||||||
|
|
||||||
<View
|
<View
|
||||||
|
android:id="@+id/divider_card"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="1px"
|
android:layout_height="1px"
|
||||||
android:background="?colorOutline" />
|
android:background="?colorOutline" />
|
||||||
|
@ -100,4 +104,4 @@
|
||||||
tools:text="@tools:sample/lorem/random" />
|
tools:text="@tools:sample/lorem/random" />
|
||||||
</androidx.appcompat.widget.LinearLayoutCompat>
|
</androidx.appcompat.widget.LinearLayoutCompat>
|
||||||
|
|
||||||
</RelativeLayout>
|
</com.google.android.material.card.MaterialCardView>
|
|
@ -14,15 +14,21 @@
|
||||||
You should have received a copy of the GNU General Public License along with Fedilab; if not,
|
You should have received a copy of the GNU General Public License along with Fedilab; if not,
|
||||||
see <http://www.gnu.org/licenses>
|
see <http://www.gnu.org/licenses>
|
||||||
-->
|
-->
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:id="@+id/container"
|
android:id="@+id/cardview_container"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_margin="12dp">
|
android:layout_marginHorizontal="@dimen/card_margin"
|
||||||
|
android:layout_marginTop="@dimen/card_margin"
|
||||||
|
android:clipChildren="false"
|
||||||
|
android:clipToPadding="false"
|
||||||
|
app:cardElevation="0dp"
|
||||||
|
app:strokeWidth="0dp">
|
||||||
|
|
||||||
<View
|
<View
|
||||||
|
android:id="@+id/divider_card"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="1px"
|
android:layout_height="1px"
|
||||||
android:background="?colorOutline" />
|
android:background="?colorOutline" />
|
||||||
|
@ -96,4 +102,4 @@
|
||||||
</HorizontalScrollView>
|
</HorizontalScrollView>
|
||||||
</androidx.appcompat.widget.LinearLayoutCompat>
|
</androidx.appcompat.widget.LinearLayoutCompat>
|
||||||
|
|
||||||
</RelativeLayout>
|
</com.google.android.material.card.MaterialCardView>
|
||||||
|
|
|
@ -14,17 +14,21 @@
|
||||||
You should have received a copy of the GNU General Public License along with Fedilab; if not,
|
You should have received a copy of the GNU General Public License along with Fedilab; if not,
|
||||||
see <http://www.gnu.org/licenses>
|
see <http://www.gnu.org/licenses>
|
||||||
-->
|
-->
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
android:id="@+id/cardview_container"
|
android:id="@+id/cardview_container"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginHorizontal="12dp"
|
android:layout_marginHorizontal="@dimen/card_margin"
|
||||||
android:layout_marginTop="12dp"
|
android:layout_marginTop="@dimen/card_margin"
|
||||||
android:clipChildren="false"
|
android:clipChildren="false"
|
||||||
android:clipToPadding="false">
|
android:clipToPadding="false"
|
||||||
|
app:cardElevation="0dp"
|
||||||
|
app:strokeWidth="0dp">
|
||||||
|
|
||||||
<View
|
<View
|
||||||
|
android:id="@+id/divider_card"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="1px"
|
android:layout_height="1px"
|
||||||
android:background="?colorOutline" />
|
android:background="?colorOutline" />
|
||||||
|
@ -98,4 +102,4 @@
|
||||||
tools:text="@tools:sample/lorem/random" />
|
tools:text="@tools:sample/lorem/random" />
|
||||||
</androidx.appcompat.widget.LinearLayoutCompat>
|
</androidx.appcompat.widget.LinearLayoutCompat>
|
||||||
|
|
||||||
</RelativeLayout>
|
</com.google.android.material.card.MaterialCardView>
|
|
@ -14,15 +14,21 @@
|
||||||
You should have received a copy of the GNU General Public License along with Fedilab; if not,
|
You should have received a copy of the GNU General Public License along with Fedilab; if not,
|
||||||
see <http://www.gnu.org/licenses>
|
see <http://www.gnu.org/licenses>
|
||||||
-->
|
-->
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/cardview_container"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginHorizontal="6dp"
|
android:layout_marginHorizontal="@dimen/card_margin"
|
||||||
android:layout_marginTop="6dp">
|
android:layout_marginTop="@dimen/card_margin"
|
||||||
|
android:clipChildren="false"
|
||||||
|
android:clipToPadding="false"
|
||||||
|
app:cardElevation="0dp"
|
||||||
|
app:strokeWidth="0dp">
|
||||||
|
|
||||||
<View
|
<View
|
||||||
|
android:id="@+id/divider_card"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="1px"
|
android:layout_height="1px"
|
||||||
android:background="?colorOutline" />
|
android:background="?colorOutline" />
|
||||||
|
@ -107,4 +113,4 @@
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
</RelativeLayout>
|
</com.google.android.material.card.MaterialCardView>
|
||||||
|
|
|
@ -14,12 +14,20 @@
|
||||||
You should have received a copy of the GNU General Public License along with Fedilab; if not,
|
You should have received a copy of the GNU General Public License along with Fedilab; if not,
|
||||||
see <http://www.gnu.org/licenses>.
|
see <http://www.gnu.org/licenses>.
|
||||||
-->
|
-->
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_margin="12dp">
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:id="@+id/cardview_container"
|
||||||
|
android:layout_marginHorizontal="@dimen/card_margin"
|
||||||
|
android:layout_marginTop="@dimen/card_margin"
|
||||||
|
android:clipChildren="false"
|
||||||
|
android:clipToPadding="false"
|
||||||
|
app:cardElevation="0dp"
|
||||||
|
app:strokeWidth="0dp">
|
||||||
|
|
||||||
<View
|
<View
|
||||||
|
android:id="@+id/divider_card"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="1px"
|
android:layout_height="1px"
|
||||||
android:background="?colorOutline" />
|
android:background="?colorOutline" />
|
||||||
|
@ -64,4 +72,4 @@
|
||||||
android:layout_width="100dp"
|
android:layout_width="100dp"
|
||||||
android:layout_height="50dp" />
|
android:layout_height="50dp" />
|
||||||
</androidx.appcompat.widget.LinearLayoutCompat>
|
</androidx.appcompat.widget.LinearLayoutCompat>
|
||||||
</RelativeLayout>
|
</com.google.android.material.card.MaterialCardView>
|
|
@ -12,8 +12,7 @@
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
android:id="@+id/media"
|
android:id="@+id/media"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="200dp"
|
android:layout_height="wrap_content"
|
||||||
android:scaleType="centerCrop"
|
|
||||||
tools:ignore="ContentDescription" />
|
tools:ignore="ContentDescription" />
|
||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatImageView
|
<androidx.appcompat.widget.AppCompatImageView
|
||||||
|
|
|
@ -105,6 +105,17 @@
|
||||||
android:name="app.fedilab.android.ui.fragment.settings.FragmentLanguageSettings"
|
android:name="app.fedilab.android.ui.fragment.settings.FragmentLanguageSettings"
|
||||||
android:label="@string/languages" />
|
android:label="@string/languages" />
|
||||||
|
|
||||||
|
<fragment
|
||||||
|
android:id="@+id/FragmentCustomLightSettings"
|
||||||
|
android:name="app.fedilab.android.ui.fragment.settings.FragmentCustomLightSettings"
|
||||||
|
android:label="@string/light_custom_colors" />
|
||||||
|
|
||||||
|
|
||||||
|
<fragment
|
||||||
|
android:id="@+id/FragmentCustomDarkSettings"
|
||||||
|
android:name="app.fedilab.android.ui.fragment.settings.FragmentCustomDarkSettings"
|
||||||
|
android:label="@string/cark_custom_colors" />
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:id="@+id/EditProfileActivity"
|
android:id="@+id/EditProfileActivity"
|
||||||
android:name="app.fedilab.android.activities.EditProfileActivity" />
|
android:name="app.fedilab.android.activities.EditProfileActivity" />
|
||||||
|
|
|
@ -735,4 +735,19 @@
|
||||||
<string name="set_dynamic_color">لون ديناميكي</string>
|
<string name="set_dynamic_color">لون ديناميكي</string>
|
||||||
<string name="report_val1">لا يعجبني</string>
|
<string name="report_val1">لا يعجبني</string>
|
||||||
<string name="report_val_more1">ليس شيئاً تريد رؤيته</string>
|
<string name="report_val_more1">ليس شيئاً تريد رؤيته</string>
|
||||||
|
<string name="set_notif_user_sign_up">تسجيل جديد (المشرفون)</string>
|
||||||
|
<string name="set_notif_admin_report">تقرير جديد (المشرفون)</string>
|
||||||
|
<string name="open_with_account">فتح باستخدام حساب آخر</string>
|
||||||
|
<string name="admin_reject_media">رفض ملفات الوسائط</string>
|
||||||
|
<string name="admin_reject_reports">رفض التقارير</string>
|
||||||
|
<string name="action_privacy_policy">سياسة الخصوصية</string>
|
||||||
|
<string name="domains">النطاقات</string>
|
||||||
|
<string name="keep_notifications">الاحتفاظ بالإشعارات</string>
|
||||||
|
<string name="reject_reports">رفض التقارير</string>
|
||||||
|
<string name="reject_media">رفض الوسائط</string>
|
||||||
|
<string name="severity">الشدة</string>
|
||||||
|
<string name="private_comment">تعليق خاص</string>
|
||||||
|
<string name="admin_reject_obfuscate">تشويش اسم النطاق</string>
|
||||||
|
<string name="type_default_theme_dark">المظهر الداكن الافتراضي</string>
|
||||||
|
<string name="public_comment">تعليق للعامة</string>
|
||||||
</resources>
|
</resources>
|
|
@ -497,7 +497,7 @@
|
||||||
<string name="make_an_action">Make an action</string>
|
<string name="make_an_action">Make an action</string>
|
||||||
<string name="translation">Translation</string>
|
<string name="translation">Translation</string>
|
||||||
<string name="text_color_title">Text color</string>
|
<string name="text_color_title">Text color</string>
|
||||||
<string name="text_color">Change the text color in pots</string>
|
<string name="text_color">Change the text color in messages</string>
|
||||||
<string name="pref_custom_theme">Use a custom theme</string>
|
<string name="pref_custom_theme">Use a custom theme</string>
|
||||||
<string name="theming">Theming</string>
|
<string name="theming">Theming</string>
|
||||||
<string name="data_export_theme">The theme was exported</string>
|
<string name="data_export_theme">The theme was exported</string>
|
||||||
|
|
|
@ -529,7 +529,7 @@
|
||||||
<string name="make_an_action">Make an action</string>
|
<string name="make_an_action">Make an action</string>
|
||||||
<string name="translation">Translation</string>
|
<string name="translation">Translation</string>
|
||||||
<string name="text_color_title">Text color</string>
|
<string name="text_color_title">Text color</string>
|
||||||
<string name="text_color">Change the text color in pots</string>
|
<string name="text_color">Change the text color in messages</string>
|
||||||
<string name="pref_custom_theme">Use a custom theme</string>
|
<string name="pref_custom_theme">Use a custom theme</string>
|
||||||
<string name="theming">Theming</string>
|
<string name="theming">Theming</string>
|
||||||
<string name="data_export_theme">The theme was exported</string>
|
<string name="data_export_theme">The theme was exported</string>
|
||||||
|
|
|
@ -554,7 +554,7 @@
|
||||||
<string name="make_an_action">Make an action</string>
|
<string name="make_an_action">Make an action</string>
|
||||||
<string name="translation">Translation</string>
|
<string name="translation">Translation</string>
|
||||||
<string name="text_color_title">Text color</string>
|
<string name="text_color_title">Text color</string>
|
||||||
<string name="text_color">Change the text color in pots</string>
|
<string name="text_color">Change the text color in messages</string>
|
||||||
<string name="pref_custom_theme">Use a custom theme</string>
|
<string name="pref_custom_theme">Use a custom theme</string>
|
||||||
<string name="theming">Theming</string>
|
<string name="theming">Theming</string>
|
||||||
<string name="data_export_theme">The theme was exported</string>
|
<string name="data_export_theme">The theme was exported</string>
|
||||||
|
|
|
@ -540,7 +540,7 @@
|
||||||
<string name="make_an_action">Make an action</string>
|
<string name="make_an_action">Make an action</string>
|
||||||
<string name="translation">Translation</string>
|
<string name="translation">Translation</string>
|
||||||
<string name="text_color_title">Text color</string>
|
<string name="text_color_title">Text color</string>
|
||||||
<string name="text_color">Change the text color in pots</string>
|
<string name="text_color">Change the text color in messages</string>
|
||||||
<string name="pref_custom_theme">Use a custom theme</string>
|
<string name="pref_custom_theme">Use a custom theme</string>
|
||||||
<string name="theming">Theming</string>
|
<string name="theming">Theming</string>
|
||||||
<string name="data_export_theme">The theme was exported</string>
|
<string name="data_export_theme">The theme was exported</string>
|
||||||
|
|
|
@ -549,7 +549,7 @@
|
||||||
<string name="make_an_action">Make an action</string>
|
<string name="make_an_action">Make an action</string>
|
||||||
<string name="translation">Translation</string>
|
<string name="translation">Translation</string>
|
||||||
<string name="text_color_title">Text color</string>
|
<string name="text_color_title">Text color</string>
|
||||||
<string name="text_color">Change the text color in pots</string>
|
<string name="text_color">Change the text color in messages</string>
|
||||||
<string name="pref_custom_theme">Use a custom theme</string>
|
<string name="pref_custom_theme">Use a custom theme</string>
|
||||||
<string name="theming">Theming</string>
|
<string name="theming">Theming</string>
|
||||||
<string name="data_export_theme">The theme was exported</string>
|
<string name="data_export_theme">The theme was exported</string>
|
||||||
|
|
|
@ -529,7 +529,7 @@
|
||||||
<string name="make_an_action">Επέλεξε μία κίνηση</string>
|
<string name="make_an_action">Επέλεξε μία κίνηση</string>
|
||||||
<string name="translation">Μετάφραση</string>
|
<string name="translation">Μετάφραση</string>
|
||||||
<string name="text_color_title">Χρώμα κειμένου</string>
|
<string name="text_color_title">Χρώμα κειμένου</string>
|
||||||
<string name="text_color">Change the text color in pots</string>
|
<string name="text_color">Change the text color in messages</string>
|
||||||
<string name="pref_custom_theme">Χρήση ενός προσαρμοσμένου θέματος</string>
|
<string name="pref_custom_theme">Χρήση ενός προσαρμοσμένου θέματος</string>
|
||||||
<string name="theming">Θεματισμός</string>
|
<string name="theming">Θεματισμός</string>
|
||||||
<string name="data_export_theme">Έγινε εξαγωγή του θέματος</string>
|
<string name="data_export_theme">Έγινε εξαγωγή του θέματος</string>
|
||||||
|
|
|
@ -530,7 +530,7 @@
|
||||||
<string name="make_an_action">Make an action</string>
|
<string name="make_an_action">Make an action</string>
|
||||||
<string name="translation">Translation</string>
|
<string name="translation">Translation</string>
|
||||||
<string name="text_color_title">Text color</string>
|
<string name="text_color_title">Text color</string>
|
||||||
<string name="text_color">Change the text color in pots</string>
|
<string name="text_color">Change the text color in messages</string>
|
||||||
<string name="pref_custom_theme">Use a custom theme</string>
|
<string name="pref_custom_theme">Use a custom theme</string>
|
||||||
<string name="theming">Theming</string>
|
<string name="theming">Theming</string>
|
||||||
<string name="data_export_theme">The theme was exported</string>
|
<string name="data_export_theme">The theme was exported</string>
|
||||||
|
|
|
@ -529,7 +529,7 @@
|
||||||
<string name="make_an_action">Make an action</string>
|
<string name="make_an_action">Make an action</string>
|
||||||
<string name="translation">Translation</string>
|
<string name="translation">Translation</string>
|
||||||
<string name="text_color_title">Text color</string>
|
<string name="text_color_title">Text color</string>
|
||||||
<string name="text_color">Change the text color in pots</string>
|
<string name="text_color">Change the text color in messages</string>
|
||||||
<string name="pref_custom_theme">Use a custom theme</string>
|
<string name="pref_custom_theme">Use a custom theme</string>
|
||||||
<string name="theming">Theming</string>
|
<string name="theming">Theming</string>
|
||||||
<string name="data_export_theme">The theme was exported</string>
|
<string name="data_export_theme">The theme was exported</string>
|
||||||
|
|
|
@ -529,7 +529,7 @@
|
||||||
<string name="make_an_action">Make an action</string>
|
<string name="make_an_action">Make an action</string>
|
||||||
<string name="translation">Translation</string>
|
<string name="translation">Translation</string>
|
||||||
<string name="text_color_title">Text color</string>
|
<string name="text_color_title">Text color</string>
|
||||||
<string name="text_color">Change the text color in pots</string>
|
<string name="text_color">Change the text color in messages</string>
|
||||||
<string name="pref_custom_theme">Use a custom theme</string>
|
<string name="pref_custom_theme">Use a custom theme</string>
|
||||||
<string name="theming">Theming</string>
|
<string name="theming">Theming</string>
|
||||||
<string name="data_export_theme">The theme was exported</string>
|
<string name="data_export_theme">The theme was exported</string>
|
||||||
|
|
|
@ -529,7 +529,7 @@
|
||||||
<string name="make_an_action">Make an action</string>
|
<string name="make_an_action">Make an action</string>
|
||||||
<string name="translation">Translation</string>
|
<string name="translation">Translation</string>
|
||||||
<string name="text_color_title">Text color</string>
|
<string name="text_color_title">Text color</string>
|
||||||
<string name="text_color">Change the text color in pots</string>
|
<string name="text_color">Change the text color in messages</string>
|
||||||
<string name="pref_custom_theme">Use a custom theme</string>
|
<string name="pref_custom_theme">Use a custom theme</string>
|
||||||
<string name="theming">Theming</string>
|
<string name="theming">Theming</string>
|
||||||
<string name="data_export_theme">The theme was exported</string>
|
<string name="data_export_theme">The theme was exported</string>
|
||||||
|
|
|
@ -529,7 +529,7 @@
|
||||||
<string name="make_an_action">Make an action</string>
|
<string name="make_an_action">Make an action</string>
|
||||||
<string name="translation">Translation</string>
|
<string name="translation">Translation</string>
|
||||||
<string name="text_color_title">Text color</string>
|
<string name="text_color_title">Text color</string>
|
||||||
<string name="text_color">Change the text color in pots</string>
|
<string name="text_color">Change the text color in messages</string>
|
||||||
<string name="pref_custom_theme">Use a custom theme</string>
|
<string name="pref_custom_theme">Use a custom theme</string>
|
||||||
<string name="theming">Theming</string>
|
<string name="theming">Theming</string>
|
||||||
<string name="data_export_theme">The theme was exported</string>
|
<string name="data_export_theme">The theme was exported</string>
|
||||||
|
|
|
@ -525,7 +525,7 @@
|
||||||
<string name="make_an_action">Make an action</string>
|
<string name="make_an_action">Make an action</string>
|
||||||
<string name="translation">Translation</string>
|
<string name="translation">Translation</string>
|
||||||
<string name="text_color_title">Text color</string>
|
<string name="text_color_title">Text color</string>
|
||||||
<string name="text_color">Change the text color in pots</string>
|
<string name="text_color">Change the text color in messages</string>
|
||||||
<string name="pref_custom_theme">Use a custom theme</string>
|
<string name="pref_custom_theme">Use a custom theme</string>
|
||||||
<string name="theming">Theming</string>
|
<string name="theming">Theming</string>
|
||||||
<string name="data_export_theme">The theme was exported</string>
|
<string name="data_export_theme">The theme was exported</string>
|
||||||
|
|
|
@ -529,7 +529,7 @@
|
||||||
<string name="make_an_action">Make an action</string>
|
<string name="make_an_action">Make an action</string>
|
||||||
<string name="translation">Translation</string>
|
<string name="translation">Translation</string>
|
||||||
<string name="text_color_title">Text color</string>
|
<string name="text_color_title">Text color</string>
|
||||||
<string name="text_color">Change the text color in pots</string>
|
<string name="text_color">Change the text color in messages</string>
|
||||||
<string name="pref_custom_theme">Use a custom theme</string>
|
<string name="pref_custom_theme">Use a custom theme</string>
|
||||||
<string name="theming">Theming</string>
|
<string name="theming">Theming</string>
|
||||||
<string name="data_export_theme">The theme was exported</string>
|
<string name="data_export_theme">The theme was exported</string>
|
||||||
|
|
|
@ -524,7 +524,7 @@
|
||||||
<string name="make_an_action">Make an action</string>
|
<string name="make_an_action">Make an action</string>
|
||||||
<string name="translation">Translation</string>
|
<string name="translation">Translation</string>
|
||||||
<string name="text_color_title">Text color</string>
|
<string name="text_color_title">Text color</string>
|
||||||
<string name="text_color">Change the text color in pots</string>
|
<string name="text_color">Change the text color in messages</string>
|
||||||
<string name="pref_custom_theme">Use a custom theme</string>
|
<string name="pref_custom_theme">Use a custom theme</string>
|
||||||
<string name="theming">Theming</string>
|
<string name="theming">Theming</string>
|
||||||
<string name="data_export_theme">The theme was exported</string>
|
<string name="data_export_theme">The theme was exported</string>
|
||||||
|
|
|
@ -529,7 +529,7 @@
|
||||||
<string name="make_an_action">Make an action</string>
|
<string name="make_an_action">Make an action</string>
|
||||||
<string name="translation">Translation</string>
|
<string name="translation">Translation</string>
|
||||||
<string name="text_color_title">Text color</string>
|
<string name="text_color_title">Text color</string>
|
||||||
<string name="text_color">Change the text color in pots</string>
|
<string name="text_color">Change the text color in messages</string>
|
||||||
<string name="pref_custom_theme">Use a custom theme</string>
|
<string name="pref_custom_theme">Use a custom theme</string>
|
||||||
<string name="theming">Theming</string>
|
<string name="theming">Theming</string>
|
||||||
<string name="data_export_theme">The theme was exported</string>
|
<string name="data_export_theme">The theme was exported</string>
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
|
||||||
|
<attr name="linkColor" type="color" />
|
||||||
|
|
||||||
<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="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>
|
||||||
|
@ -27,12 +31,10 @@
|
||||||
<item name="colorSurfaceInverse">@color/md_theme_dark_inverseSurface</item>
|
<item name="colorSurfaceInverse">@color/md_theme_dark_inverseSurface</item>
|
||||||
<item name="colorOnSurfaceInverse">@color/md_theme_dark_inverseOnSurface</item>
|
<item name="colorOnSurfaceInverse">@color/md_theme_dark_inverseOnSurface</item>
|
||||||
<item name="colorPrimaryInverse">@color/md_theme_dark_inversePrimary</item>
|
<item name="colorPrimaryInverse">@color/md_theme_dark_inversePrimary</item>
|
||||||
|
|
||||||
<item name="android:navigationBarColor">?android:colorBackground</item>
|
<item name="android:navigationBarColor">?android:colorBackground</item>
|
||||||
<item name="android:windowLightStatusBar" tools:targetApi="m">false</item>
|
<item name="android:windowLightStatusBar" tools:targetApi="m">false</item>
|
||||||
<item name="android:windowLightNavigationBar" tools:targetApi="o_mr1">false</item>
|
<item name="android:windowLightNavigationBar" tools:targetApi="o_mr1">false</item>
|
||||||
<item name="android:isLightTheme" tools:targetApi="q">false</item>
|
<item name="android:isLightTheme" tools:targetApi="q">false</item>
|
||||||
|
|
||||||
<item name="windowNoTitle">true</item>
|
<item name="windowNoTitle">true</item>
|
||||||
<!-- specify enter and exit transitions -->
|
<!-- specify enter and exit transitions -->
|
||||||
<item name="android:windowEnterTransition">@android:transition/explode</item>
|
<item name="android:windowEnterTransition">@android:transition/explode</item>
|
||||||
|
@ -45,6 +47,7 @@
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="AppThemeBar" parent="Theme.Material3.Dark">
|
<style name="AppThemeBar" parent="Theme.Material3.Dark">
|
||||||
|
<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>
|
||||||
<item name="colorPrimaryContainer">@color/md_theme_dark_primaryContainer</item>
|
<item name="colorPrimaryContainer">@color/md_theme_dark_primaryContainer</item>
|
||||||
|
@ -79,6 +82,7 @@
|
||||||
|
|
||||||
|
|
||||||
<style name="AppThemeAlertDialog" parent="Theme.Material3.Dark.Dialog.Alert">
|
<style name="AppThemeAlertDialog" parent="Theme.Material3.Dark.Dialog.Alert">
|
||||||
|
<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>
|
||||||
<item name="colorPrimaryContainer">@color/md_theme_dark_primaryContainer</item>
|
<item name="colorPrimaryContainer">@color/md_theme_dark_primaryContainer</item>
|
||||||
|
@ -109,7 +113,10 @@
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- SOLARIZED DARK -->
|
||||||
|
|
||||||
<style name="SolarizedAppTheme" parent="AppTheme">
|
<style name="SolarizedAppTheme" parent="AppTheme">
|
||||||
|
<item name="linkColor">@color/solarized_md_theme_dark_onPrimaryContainer</item>
|
||||||
<item name="colorPrimary">@color/solarized_md_theme_dark_primary</item>
|
<item name="colorPrimary">@color/solarized_md_theme_dark_primary</item>
|
||||||
<item name="colorOnPrimary">@color/solarized_md_theme_dark_onPrimary</item>
|
<item name="colorOnPrimary">@color/solarized_md_theme_dark_onPrimary</item>
|
||||||
<item name="colorPrimaryContainer">@color/solarized_md_theme_dark_primaryContainer</item>
|
<item name="colorPrimaryContainer">@color/solarized_md_theme_dark_primaryContainer</item>
|
||||||
|
@ -143,6 +150,7 @@
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="SolarizedAppThemeBar" parent="AppThemeBar">
|
<style name="SolarizedAppThemeBar" parent="AppThemeBar">
|
||||||
|
<item name="linkColor">@color/solarized_md_theme_dark_onPrimaryContainer</item>
|
||||||
<item name="colorPrimary">@color/solarized_md_theme_dark_primary</item>
|
<item name="colorPrimary">@color/solarized_md_theme_dark_primary</item>
|
||||||
<item name="colorOnPrimary">@color/solarized_md_theme_dark_onPrimary</item>
|
<item name="colorOnPrimary">@color/solarized_md_theme_dark_onPrimary</item>
|
||||||
<item name="colorPrimaryContainer">@color/solarized_md_theme_dark_primaryContainer</item>
|
<item name="colorPrimaryContainer">@color/solarized_md_theme_dark_primaryContainer</item>
|
||||||
|
@ -175,7 +183,6 @@
|
||||||
<item name="colorPrimaryInverse">@color/solarized_md_theme_dark_inversePrimary</item>
|
<item name="colorPrimaryInverse">@color/solarized_md_theme_dark_inversePrimary</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
|
||||||
<style name="TransparentSolarized" parent="SolarizedAppThemeBar">
|
<style name="TransparentSolarized" parent="SolarizedAppThemeBar">
|
||||||
<item name="android:colorBackgroundCacheHint">@null</item>
|
<item name="android:colorBackgroundCacheHint">@null</item>
|
||||||
<item name="android:windowContentOverlay">@null</item>
|
<item name="android:windowContentOverlay">@null</item>
|
||||||
|
@ -185,6 +192,7 @@
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="SolarizedAlertDialog" parent="Theme.Material3.Dark.Dialog.Alert">
|
<style name="SolarizedAlertDialog" parent="Theme.Material3.Dark.Dialog.Alert">
|
||||||
|
<item name="linkColor">@color/solarized_md_theme_dark_onPrimaryContainer</item>
|
||||||
<item name="colorPrimary">@color/solarized_md_theme_dark_primary</item>
|
<item name="colorPrimary">@color/solarized_md_theme_dark_primary</item>
|
||||||
<item name="colorOnPrimary">@color/solarized_md_theme_dark_onPrimary</item>
|
<item name="colorOnPrimary">@color/solarized_md_theme_dark_onPrimary</item>
|
||||||
<item name="colorPrimaryContainer">@color/solarized_md_theme_dark_primaryContainer</item>
|
<item name="colorPrimaryContainer">@color/solarized_md_theme_dark_primaryContainer</item>
|
||||||
|
@ -217,19 +225,22 @@
|
||||||
<item name="colorPrimaryInverse">@color/solarized_md_theme_dark_inversePrimary</item>
|
<item name="colorPrimaryInverse">@color/solarized_md_theme_dark_inversePrimary</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
<!-- BLACK THEME -->
|
||||||
|
|
||||||
<style name="BlackAppTheme" parent="AppTheme">
|
<style name="BlackAppTheme" parent="AppTheme">
|
||||||
<item name="colorPrimary">@color/md_theme_dark_primary</item>
|
<item name="linkColor">@color/black_200</item>
|
||||||
<item name="colorOnPrimary">@color/md_theme_dark_onPrimary</item>
|
<item name="colorPrimary">@color/dracula_comment</item>
|
||||||
<item name="colorPrimaryContainer">@color/md_theme_dark_primaryContainer</item>
|
<item name="colorOnPrimary">@color/white</item>
|
||||||
|
<item name="colorPrimaryContainer">@color/black_400</item>
|
||||||
<item name="colorOnPrimaryContainer">@color/white</item>
|
<item name="colorOnPrimaryContainer">@color/white</item>
|
||||||
<item name="colorSecondary">@color/md_theme_dark_secondary</item>
|
<item name="colorSecondary">@color/black_400</item>
|
||||||
<item name="colorOnSecondary">@color/md_theme_dark_onSecondary</item>
|
<item name="colorOnSecondary">@color/white</item>
|
||||||
<item name="colorSecondaryContainer">@color/black</item>
|
<item name="colorSecondaryContainer">@color/black_400</item>
|
||||||
<item name="colorOnSecondaryContainer">@color/md_theme_dark_onSecondaryContainer</item>
|
<item name="colorOnSecondaryContainer">@color/white</item>
|
||||||
<item name="colorTertiary">@color/md_theme_dark_tertiary</item>
|
<item name="colorTertiary">@color/black_400</item>
|
||||||
<item name="colorOnTertiary">@color/md_theme_dark_onTertiary</item>
|
<item name="colorOnTertiary">@color/white</item>
|
||||||
<item name="colorTertiaryContainer">@color/md_theme_dark_tertiaryContainer</item>
|
<item name="colorTertiaryContainer">@color/black_400</item>
|
||||||
<item name="colorOnTertiaryContainer">@color/md_theme_dark_onTertiaryContainer</item>
|
<item name="colorOnTertiaryContainer">@color/white</item>
|
||||||
<item name="colorError">@color/solarized_md_theme_dark_error</item>
|
<item name="colorError">@color/solarized_md_theme_dark_error</item>
|
||||||
<item name="colorErrorContainer">@color/solarized_md_theme_dark_errorContainer</item>
|
<item name="colorErrorContainer">@color/solarized_md_theme_dark_errorContainer</item>
|
||||||
<item name="colorOnError">@color/solarized_md_theme_dark_onError</item>
|
<item name="colorOnError">@color/solarized_md_theme_dark_onError</item>
|
||||||
|
@ -247,18 +258,19 @@
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="BlackAppThemeBar" parent="AppThemeBar">
|
<style name="BlackAppThemeBar" parent="AppThemeBar">
|
||||||
<item name="colorPrimary">@color/md_theme_dark_primary</item>
|
<item name="linkColor">@color/black_200</item>
|
||||||
<item name="colorOnPrimary">@color/md_theme_dark_onPrimary</item>
|
<item name="colorPrimary">@color/dracula_comment</item>
|
||||||
<item name="colorPrimaryContainer">@color/md_theme_dark_primaryContainer</item>
|
<item name="colorOnPrimary">@color/white</item>
|
||||||
|
<item name="colorPrimaryContainer">@color/black_400</item>
|
||||||
<item name="colorOnPrimaryContainer">@color/white</item>
|
<item name="colorOnPrimaryContainer">@color/white</item>
|
||||||
<item name="colorSecondary">@color/md_theme_dark_secondary</item>
|
<item name="colorSecondary">@color/black_400</item>
|
||||||
<item name="colorOnSecondary">@color/md_theme_dark_onSecondary</item>
|
<item name="colorOnSecondary">@color/white</item>
|
||||||
<item name="colorSecondaryContainer">@color/md_theme_dark_secondaryContainer</item>
|
<item name="colorSecondaryContainer">@color/black_400</item>
|
||||||
<item name="colorOnSecondaryContainer">@color/md_theme_dark_onSecondaryContainer</item>
|
<item name="colorOnSecondaryContainer">@color/white</item>
|
||||||
<item name="colorTertiary">@color/md_theme_dark_tertiary</item>
|
<item name="colorTertiary">@color/black_400</item>
|
||||||
<item name="colorOnTertiary">@color/md_theme_dark_onTertiary</item>
|
<item name="colorOnTertiary">@color/white</item>
|
||||||
<item name="colorTertiaryContainer">@color/md_theme_dark_tertiaryContainer</item>
|
<item name="colorTertiaryContainer">@color/black_400</item>
|
||||||
<item name="colorOnTertiaryContainer">@color/md_theme_dark_onTertiaryContainer</item>
|
<item name="colorOnTertiaryContainer">@color/white</item>
|
||||||
<item name="colorError">@color/solarized_md_theme_dark_error</item>
|
<item name="colorError">@color/solarized_md_theme_dark_error</item>
|
||||||
<item name="colorErrorContainer">@color/solarized_md_theme_dark_errorContainer</item>
|
<item name="colorErrorContainer">@color/solarized_md_theme_dark_errorContainer</item>
|
||||||
<item name="colorOnError">@color/solarized_md_theme_dark_onError</item>
|
<item name="colorOnError">@color/solarized_md_theme_dark_onError</item>
|
||||||
|
@ -275,7 +287,6 @@
|
||||||
<item name="colorPrimaryInverse">@color/black</item>
|
<item name="colorPrimaryInverse">@color/black</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
|
||||||
<style name="TransparentBlack" parent="BlackAppThemeBar">
|
<style name="TransparentBlack" parent="BlackAppThemeBar">
|
||||||
<item name="android:colorBackgroundCacheHint">@null</item>
|
<item name="android:colorBackgroundCacheHint">@null</item>
|
||||||
<item name="android:windowContentOverlay">@null</item>
|
<item name="android:windowContentOverlay">@null</item>
|
||||||
|
@ -285,18 +296,19 @@
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="BlackAlertDialog" parent="Theme.Material3.Dark.Dialog.Alert">
|
<style name="BlackAlertDialog" parent="Theme.Material3.Dark.Dialog.Alert">
|
||||||
<item name="colorPrimary">@color/md_theme_dark_primary</item>
|
<item name="linkColor">@color/black_200</item>
|
||||||
<item name="colorOnPrimary">@color/md_theme_dark_onPrimary</item>
|
<item name="colorPrimary">@color/dracula_comment</item>
|
||||||
<item name="colorPrimaryContainer">@color/md_theme_dark_primaryContainer</item>
|
<item name="colorOnPrimary">@color/white</item>
|
||||||
|
<item name="colorPrimaryContainer">@color/black_400</item>
|
||||||
<item name="colorOnPrimaryContainer">@color/white</item>
|
<item name="colorOnPrimaryContainer">@color/white</item>
|
||||||
<item name="colorSecondary">@color/md_theme_dark_secondary</item>
|
<item name="colorSecondary">@color/black_400</item>
|
||||||
<item name="colorOnSecondary">@color/md_theme_dark_onSecondary</item>
|
<item name="colorOnSecondary">@color/white</item>
|
||||||
<item name="colorSecondaryContainer">@color/md_theme_dark_secondaryContainer</item>
|
<item name="colorSecondaryContainer">@color/black_400</item>
|
||||||
<item name="colorOnSecondaryContainer">@color/md_theme_dark_onSecondaryContainer</item>
|
<item name="colorOnSecondaryContainer">@color/white</item>
|
||||||
<item name="colorTertiary">@color/md_theme_dark_tertiary</item>
|
<item name="colorTertiary">@color/black_400</item>
|
||||||
<item name="colorOnTertiary">@color/md_theme_dark_onTertiary</item>
|
<item name="colorOnTertiary">@color/white</item>
|
||||||
<item name="colorTertiaryContainer">@color/md_theme_dark_tertiaryContainer</item>
|
<item name="colorTertiaryContainer">@color/black_400</item>
|
||||||
<item name="colorOnTertiaryContainer">@color/md_theme_dark_onTertiaryContainer</item>
|
<item name="colorOnTertiaryContainer">@color/white</item>
|
||||||
<item name="colorError">@color/solarized_md_theme_dark_error</item>
|
<item name="colorError">@color/solarized_md_theme_dark_error</item>
|
||||||
<item name="colorErrorContainer">@color/solarized_md_theme_dark_errorContainer</item>
|
<item name="colorErrorContainer">@color/solarized_md_theme_dark_errorContainer</item>
|
||||||
<item name="colorOnError">@color/solarized_md_theme_dark_onError</item>
|
<item name="colorOnError">@color/solarized_md_theme_dark_onError</item>
|
||||||
|
@ -313,4 +325,106 @@
|
||||||
<item name="colorPrimaryInverse">@color/black</item>
|
<item name="colorPrimaryInverse">@color/black</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- DRACULA THEME -->
|
||||||
|
|
||||||
|
<style name="DraculaAppTheme" parent="AppTheme">
|
||||||
|
<item name="linkColor">@color/dracula_pink</item>
|
||||||
|
<item name="colorPrimary">@color/dracula_comment</item>
|
||||||
|
<item name="colorOnPrimary">@color/dracula_foreground</item>
|
||||||
|
<item name="colorPrimaryContainer">@color/dracula_green</item>
|
||||||
|
<item name="colorOnPrimaryContainer">@color/black</item>
|
||||||
|
<item name="colorSecondary">@color/dracula_orange</item>
|
||||||
|
<item name="colorOnSecondary">@color/black</item>
|
||||||
|
<item name="colorSecondaryContainer">@color/dracula_cyan</item>
|
||||||
|
<item name="colorOnSecondaryContainer">@color/black</item>
|
||||||
|
<item name="colorTertiary">@color/dracula_pink</item>
|
||||||
|
<item name="colorOnTertiary">@color/black</item>
|
||||||
|
<item name="colorTertiaryContainer">@color/dracula_orange</item>
|
||||||
|
<item name="colorOnTertiaryContainer">@color/black</item>
|
||||||
|
<item name="colorError">@color/solarized_md_theme_dark_error</item>
|
||||||
|
<item name="colorErrorContainer">@color/solarized_md_theme_dark_errorContainer</item>
|
||||||
|
<item name="colorOnError">@color/solarized_md_theme_dark_onError</item>
|
||||||
|
<item name="colorOnErrorContainer">@color/solarized_md_theme_dark_onErrorContainer</item>
|
||||||
|
<item name="android:colorBackground">@color/dracula_background</item>
|
||||||
|
<item name="colorOnBackground">@color/dracula_foreground</item>
|
||||||
|
<item name="colorSurface">@color/dracula_background</item>
|
||||||
|
<item name="colorOnSurface">@color/dracula_foreground</item>
|
||||||
|
<item name="colorSurfaceVariant">@color/dracula_current_Line</item>
|
||||||
|
<item name="colorOnSurfaceVariant">@color/dracula_foreground</item>
|
||||||
|
<item name="colorOutline">@color/solarized_md_theme_dark_outline</item>
|
||||||
|
<item name="colorOnSurfaceInverse">@color/dracula_comment</item>
|
||||||
|
<item name="colorSurfaceInverse">@color/dracula_foreground</item>
|
||||||
|
<item name="colorPrimaryInverse">@color/dracula_comment</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
||||||
|
<style name="DraculaAppThemeBar" parent="AppThemeBar">
|
||||||
|
<item name="linkColor">@color/dracula_pink</item>
|
||||||
|
<item name="colorPrimary">@color/dracula_comment</item>
|
||||||
|
<item name="colorOnPrimary">@color/dracula_foreground</item>
|
||||||
|
<item name="colorPrimaryContainer">@color/dracula_green</item>
|
||||||
|
<item name="colorOnPrimaryContainer">@color/black</item>
|
||||||
|
<item name="colorSecondary">@color/dracula_orange</item>
|
||||||
|
<item name="colorOnSecondary">@color/black</item>
|
||||||
|
<item name="colorSecondaryContainer">@color/dracula_cyan</item>
|
||||||
|
<item name="colorOnSecondaryContainer">@color/black</item>
|
||||||
|
<item name="colorTertiary">@color/dracula_pink</item>
|
||||||
|
<item name="colorOnTertiary">@color/black</item>
|
||||||
|
<item name="colorTertiaryContainer">@color/dracula_orange</item>
|
||||||
|
<item name="colorOnTertiaryContainer">@color/black</item>
|
||||||
|
<item name="colorError">@color/solarized_md_theme_dark_error</item>
|
||||||
|
<item name="colorErrorContainer">@color/solarized_md_theme_dark_errorContainer</item>
|
||||||
|
<item name="colorOnError">@color/solarized_md_theme_dark_onError</item>
|
||||||
|
<item name="colorOnErrorContainer">@color/solarized_md_theme_dark_onErrorContainer</item>
|
||||||
|
<item name="android:colorBackground">@color/dracula_background</item>
|
||||||
|
<item name="colorOnBackground">@color/dracula_foreground</item>
|
||||||
|
<item name="colorSurface">@color/dracula_background</item>
|
||||||
|
<item name="colorOnSurface">@color/dracula_foreground</item>
|
||||||
|
<item name="colorSurfaceVariant">@color/dracula_current_Line</item>
|
||||||
|
<item name="colorOnSurfaceVariant">@color/dracula_foreground</item>
|
||||||
|
<item name="colorOutline">@color/solarized_md_theme_dark_outline</item>
|
||||||
|
<item name="colorOnSurfaceInverse">@color/dracula_comment</item>
|
||||||
|
<item name="colorSurfaceInverse">@color/dracula_foreground</item>
|
||||||
|
<item name="colorPrimaryInverse">@color/dracula_comment</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="TransparentDracula" parent="DraculaAppThemeBar">
|
||||||
|
<item name="android:colorBackgroundCacheHint">@null</item>
|
||||||
|
<item name="android:windowContentOverlay">@null</item>
|
||||||
|
<item name="android:windowIsFloating">false</item>
|
||||||
|
<item name="android:windowIsTranslucent">true</item>
|
||||||
|
<item name="android:windowNoTitle">true</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="DraculaAlertDialog" parent="Theme.Material3.Dark.Dialog.Alert">
|
||||||
|
<item name="linkColor">@color/dracula_pink</item>
|
||||||
|
<item name="colorPrimary">@color/dracula_comment</item>
|
||||||
|
<item name="colorOnPrimary">@color/dracula_foreground</item>
|
||||||
|
<item name="colorPrimaryContainer">@color/dracula_green</item>
|
||||||
|
<item name="colorOnPrimaryContainer">@color/black</item>
|
||||||
|
<item name="colorSecondary">@color/dracula_orange</item>
|
||||||
|
<item name="colorOnSecondary">@color/black</item>
|
||||||
|
<item name="colorSecondaryContainer">@color/dracula_cyan</item>
|
||||||
|
<item name="colorOnSecondaryContainer">@color/black</item>
|
||||||
|
<item name="colorTertiary">@color/dracula_pink</item>
|
||||||
|
<item name="colorOnTertiary">@color/black</item>
|
||||||
|
<item name="colorTertiaryContainer">@color/dracula_orange</item>
|
||||||
|
<item name="colorOnTertiaryContainer">@color/black</item>
|
||||||
|
<item name="colorError">@color/solarized_md_theme_dark_error</item>
|
||||||
|
<item name="colorErrorContainer">@color/solarized_md_theme_dark_errorContainer</item>
|
||||||
|
<item name="colorOnError">@color/solarized_md_theme_dark_onError</item>
|
||||||
|
<item name="colorOnErrorContainer">@color/solarized_md_theme_dark_onErrorContainer</item>
|
||||||
|
<item name="android:colorBackground">@color/dracula_background</item>
|
||||||
|
<item name="colorOnBackground">@color/dracula_foreground</item>
|
||||||
|
<item name="colorSurface">@color/dracula_background</item>
|
||||||
|
<item name="colorOnSurface">@color/dracula_foreground</item>
|
||||||
|
<item name="colorSurfaceVariant">@color/dracula_current_Line</item>
|
||||||
|
<item name="colorOnSurfaceVariant">@color/dracula_foreground</item>
|
||||||
|
<item name="colorOutline">@color/solarized_md_theme_dark_outline</item>
|
||||||
|
<item name="colorOnSurfaceInverse">@color/dracula_comment</item>
|
||||||
|
<item name="colorSurfaceInverse">@color/dracula_foreground</item>
|
||||||
|
<item name="colorPrimaryInverse">@color/dracula_comment</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|
|
@ -528,7 +528,7 @@
|
||||||
<string name="make_an_action">Make an action</string>
|
<string name="make_an_action">Make an action</string>
|
||||||
<string name="translation">Oversettelse</string>
|
<string name="translation">Oversettelse</string>
|
||||||
<string name="text_color_title">Tekstfarge</string>
|
<string name="text_color_title">Tekstfarge</string>
|
||||||
<string name="text_color">Change the text color in pots</string>
|
<string name="text_color">Change the text color in messages</string>
|
||||||
<string name="pref_custom_theme">Bruk en egendefinert drakt</string>
|
<string name="pref_custom_theme">Bruk en egendefinert drakt</string>
|
||||||
<string name="theming">Theming</string>
|
<string name="theming">Theming</string>
|
||||||
<string name="data_export_theme">The theme was exported</string>
|
<string name="data_export_theme">The theme was exported</string>
|
||||||
|
|
|
@ -529,7 +529,7 @@
|
||||||
<string name="make_an_action">Make an action</string>
|
<string name="make_an_action">Make an action</string>
|
||||||
<string name="translation">Translation</string>
|
<string name="translation">Translation</string>
|
||||||
<string name="text_color_title">Text color</string>
|
<string name="text_color_title">Text color</string>
|
||||||
<string name="text_color">Change the text color in pots</string>
|
<string name="text_color">Change the text color in messages</string>
|
||||||
<string name="pref_custom_theme">Use a custom theme</string>
|
<string name="pref_custom_theme">Use a custom theme</string>
|
||||||
<string name="theming">Theming</string>
|
<string name="theming">Theming</string>
|
||||||
<string name="data_export_theme">The theme was exported</string>
|
<string name="data_export_theme">The theme was exported</string>
|
||||||
|
|
|
@ -546,7 +546,7 @@
|
||||||
<string name="make_an_action">Make an action</string>
|
<string name="make_an_action">Make an action</string>
|
||||||
<string name="translation">Tłumaczenie</string>
|
<string name="translation">Tłumaczenie</string>
|
||||||
<string name="text_color_title">Kolor tekstu</string>
|
<string name="text_color_title">Kolor tekstu</string>
|
||||||
<string name="text_color">Change the text color in pots</string>
|
<string name="text_color">Change the text color in messages</string>
|
||||||
<string name="pref_custom_theme">Użyj niestandardowego motywu</string>
|
<string name="pref_custom_theme">Użyj niestandardowego motywu</string>
|
||||||
<string name="theming">Motyw</string>
|
<string name="theming">Motyw</string>
|
||||||
<string name="data_export_theme">Motyw został wyeksportowany</string>
|
<string name="data_export_theme">Motyw został wyeksportowany</string>
|
||||||
|
|
|
@ -534,7 +534,7 @@
|
||||||
<string name="make_an_action">Make an action</string>
|
<string name="make_an_action">Make an action</string>
|
||||||
<string name="translation">Translation</string>
|
<string name="translation">Translation</string>
|
||||||
<string name="text_color_title">Text color</string>
|
<string name="text_color_title">Text color</string>
|
||||||
<string name="text_color">Change the text color in pots</string>
|
<string name="text_color">Change the text color in messages</string>
|
||||||
<string name="pref_custom_theme">Use a custom theme</string>
|
<string name="pref_custom_theme">Use a custom theme</string>
|
||||||
<string name="theming">Theming</string>
|
<string name="theming">Theming</string>
|
||||||
<string name="data_export_theme">The theme was exported</string>
|
<string name="data_export_theme">The theme was exported</string>
|
||||||
|
|
|
@ -534,7 +534,7 @@
|
||||||
<string name="make_an_action">Make an action</string>
|
<string name="make_an_action">Make an action</string>
|
||||||
<string name="translation">Translation</string>
|
<string name="translation">Translation</string>
|
||||||
<string name="text_color_title">Text color</string>
|
<string name="text_color_title">Text color</string>
|
||||||
<string name="text_color">Change the text color in pots</string>
|
<string name="text_color">Change the text color in messages</string>
|
||||||
<string name="pref_custom_theme">Use a custom theme</string>
|
<string name="pref_custom_theme">Use a custom theme</string>
|
||||||
<string name="theming">Theming</string>
|
<string name="theming">Theming</string>
|
||||||
<string name="data_export_theme">The theme was exported</string>
|
<string name="data_export_theme">The theme was exported</string>
|
||||||
|
|
|
@ -529,7 +529,7 @@
|
||||||
<string name="make_an_action">Make an action</string>
|
<string name="make_an_action">Make an action</string>
|
||||||
<string name="translation">Translation</string>
|
<string name="translation">Translation</string>
|
||||||
<string name="text_color_title">Text color</string>
|
<string name="text_color_title">Text color</string>
|
||||||
<string name="text_color">Change the text color in pots</string>
|
<string name="text_color">Change the text color in messages</string>
|
||||||
<string name="pref_custom_theme">Use a custom theme</string>
|
<string name="pref_custom_theme">Use a custom theme</string>
|
||||||
<string name="theming">Theming</string>
|
<string name="theming">Theming</string>
|
||||||
<string name="data_export_theme">The theme was exported</string>
|
<string name="data_export_theme">The theme was exported</string>
|
||||||
|
|
|
@ -539,7 +539,7 @@
|
||||||
<string name="make_an_action">Make an action</string>
|
<string name="make_an_action">Make an action</string>
|
||||||
<string name="translation">Translation</string>
|
<string name="translation">Translation</string>
|
||||||
<string name="text_color_title">Text color</string>
|
<string name="text_color_title">Text color</string>
|
||||||
<string name="text_color">Change the text color in pots</string>
|
<string name="text_color">Change the text color in messages</string>
|
||||||
<string name="pref_custom_theme">Use a custom theme</string>
|
<string name="pref_custom_theme">Use a custom theme</string>
|
||||||
<string name="theming">Theming</string>
|
<string name="theming">Theming</string>
|
||||||
<string name="data_export_theme">The theme was exported</string>
|
<string name="data_export_theme">The theme was exported</string>
|
||||||
|
|
|
@ -534,7 +534,7 @@
|
||||||
<string name="make_an_action">Make an action</string>
|
<string name="make_an_action">Make an action</string>
|
||||||
<string name="translation">Translation</string>
|
<string name="translation">Translation</string>
|
||||||
<string name="text_color_title">Text color</string>
|
<string name="text_color_title">Text color</string>
|
||||||
<string name="text_color">Change the text color in pots</string>
|
<string name="text_color">Change the text color in messages</string>
|
||||||
<string name="pref_custom_theme">Use a custom theme</string>
|
<string name="pref_custom_theme">Use a custom theme</string>
|
||||||
<string name="theming">Theming</string>
|
<string name="theming">Theming</string>
|
||||||
<string name="data_export_theme">The theme was exported</string>
|
<string name="data_export_theme">The theme was exported</string>
|
||||||
|
|
|
@ -540,7 +540,7 @@
|
||||||
<string name="make_an_action">Make an action</string>
|
<string name="make_an_action">Make an action</string>
|
||||||
<string name="translation">Translation</string>
|
<string name="translation">Translation</string>
|
||||||
<string name="text_color_title">Text color</string>
|
<string name="text_color_title">Text color</string>
|
||||||
<string name="text_color">Change the text color in pots</string>
|
<string name="text_color">Change the text color in messages</string>
|
||||||
<string name="pref_custom_theme">Use a custom theme</string>
|
<string name="pref_custom_theme">Use a custom theme</string>
|
||||||
<string name="theming">Theming</string>
|
<string name="theming">Theming</string>
|
||||||
<string name="data_export_theme">The theme was exported</string>
|
<string name="data_export_theme">The theme was exported</string>
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue