diff options
Diffstat (limited to 'app/src/main/java')
16 files changed, 498 insertions, 67 deletions
diff --git a/app/src/main/java/app/fedilab/android/BaseMainActivity.java b/app/src/main/java/app/fedilab/android/BaseMainActivity.java index 6a490eb22..779f5c3fc 100644 --- a/app/src/main/java/app/fedilab/android/BaseMainActivity.java +++ b/app/src/main/java/app/fedilab/android/BaseMainActivity.java @@ -18,6 +18,7 @@ import static app.fedilab.android.BaseMainActivity.status.DISCONNECTED; import static app.fedilab.android.BaseMainActivity.status.UNKNOWN; import static app.fedilab.android.helper.CacheHelper.deleteDir; import static app.fedilab.android.helper.Helper.PREF_USER_TOKEN; +import static app.fedilab.android.helper.Helper.displayReleaseNotesIfNeeded; import android.annotation.SuppressLint; import android.content.BroadcastReceiver; @@ -504,6 +505,8 @@ public abstract class BaseMainActivity extends BaseActivity implements NetworkSt } else if (id == R.id.nav_about) { Intent intent = new Intent(this, AboutActivity.class); startActivity(intent); + } else if (id == R.id.nav_release_notes) { + displayReleaseNotesIfNeeded(BaseMainActivity.this, true); } else if (id == R.id.nav_partnership) { Intent intent = new Intent(this, PartnerShipActivity.class); startActivity(intent); @@ -516,10 +519,15 @@ public abstract class BaseMainActivity extends BaseActivity implements NetworkSt } else if (id == R.id.nav_cache) { Intent intent = new Intent(BaseMainActivity.this, CacheActivity.class); startActivity(intent); + } else if (id == R.id.nav_about_instance) { + Intent intent = new Intent(BaseMainActivity.this, InstanceActivity.class); + startActivity(intent); } binding.drawerLayout.close(); return false; }); + + headerMainBinding.instanceInfo.setOnClickListener(v -> startActivity(new Intent(BaseMainActivity.this, InstanceHealthActivity.class))); headerMainBinding.accountProfilePicture.setOnClickListener(v -> { Intent intent = new Intent(BaseMainActivity.this, ProfileActivity.class); @@ -677,10 +685,6 @@ public abstract class BaseMainActivity extends BaseActivity implements NetworkSt AlertDialog alert = alt_bld.create(); alert.show(); return true; - } else if (itemId == R.id.action_about_instance) { - Intent intent = new Intent(BaseMainActivity.this, InstanceActivity.class); - startActivity(intent); - return true; } else if (itemId == R.id.action_proxy) { Intent intent = new Intent(BaseMainActivity.this, ProxyActivity.class); startActivity(intent); @@ -759,6 +763,7 @@ public abstract class BaseMainActivity extends BaseActivity implements NetworkSt currentInstance = currentAccount.instance; currentUserID = currentAccount.user_id; + show_boosts = sharedpreferences.getBoolean(getString(R.string.SET_SHOW_BOOSTS) + currentUserID + currentInstance, true); show_replies = sharedpreferences.getBoolean(getString(R.string.SET_SHOW_REPLIES) + currentUserID + currentInstance, true); regex_home = sharedpreferences.getString(getString(R.string.SET_FILTER_REGEX_HOME) + currentUserID + currentInstance, null); @@ -799,6 +804,7 @@ public abstract class BaseMainActivity extends BaseActivity implements NetworkSt .observe(BaseMainActivity.this, mastodonAccount -> { //Initialize static var currentAccount.mastodon_account = mastodonAccount; + displayReleaseNotesIfNeeded(BaseMainActivity.this, false); new Thread(() -> { try { //Update account in db diff --git a/app/src/main/java/app/fedilab/android/activities/ContextActivity.java b/app/src/main/java/app/fedilab/android/activities/ContextActivity.java index 0287e4d90..c9eb7ecc7 100644 --- a/app/src/main/java/app/fedilab/android/activities/ContextActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/ContextActivity.java @@ -53,14 +53,12 @@ public class ContextActivity extends BaseActivity { public static boolean displayCW; public static Resources.Theme theme; Fragment currentFragment; - private Status focusedStatus; - private ActivityConversationBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ThemeHelper.applyTheme(this); - binding = ActivityConversationBinding.inflate(getLayoutInflater()); + app.fedilab.android.databinding.ActivityConversationBinding binding = ActivityConversationBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); setSupportActionBar(binding.toolbar); ActionBar actionBar = getSupportActionBar(); @@ -78,7 +76,7 @@ public class ContextActivity extends BaseActivity { Bundle b = getIntent().getExtras(); final SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(ContextActivity.this); displayCW = sharedpreferences.getBoolean(getString(R.string.SET_EXPAND_CW), false); - focusedStatus = null; // or other values + Status focusedStatus = null; // or other values if (b != null) focusedStatus = (Status) b.getSerializable(Helper.ARG_STATUS); if (focusedStatus == null || currentAccount == null || currentAccount.mastodon_account == null) { diff --git a/app/src/main/java/app/fedilab/android/activities/InstanceActivity.java b/app/src/main/java/app/fedilab/android/activities/InstanceActivity.java index eeea8b6a0..9f5156086 100644 --- a/app/src/main/java/app/fedilab/android/activities/InstanceActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/InstanceActivity.java @@ -16,6 +16,8 @@ package app.fedilab.android.activities; import android.content.Intent; +import android.content.SharedPreferences; +import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -23,11 +25,15 @@ import android.text.Html; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.lifecycle.ViewModelProvider; +import androidx.preference.PreferenceManager; import com.bumptech.glide.Glide; +import com.bumptech.glide.request.target.CustomTarget; +import com.bumptech.glide.request.transition.Transition; import app.fedilab.android.BaseMainActivity; import app.fedilab.android.R; @@ -35,13 +41,13 @@ import app.fedilab.android.client.entities.api.Instance; import app.fedilab.android.databinding.ActivityInstanceBinding; import app.fedilab.android.helper.ThemeHelper; import app.fedilab.android.viewmodel.mastodon.InstancesVM; -import es.dmoral.toasty.Toasty; public class InstanceActivity extends BaseActivity { ActivityInstanceBinding binding; + private boolean applyMaxChar = false; @Override protected void onCreate(Bundle savedInstanceState) { @@ -54,8 +60,26 @@ public class InstanceActivity extends BaseActivity { getWindow().setLayout(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); if (getSupportActionBar() != null) getSupportActionBar().hide(); - - binding.close.setOnClickListener(view -> finish()); + SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(InstanceActivity.this); + binding.close.setOnClickListener( + + view -> { + if (applyMaxChar) { + String max_char = binding.maxChar.getText().toString(); + + SharedPreferences.Editor editor = sharedpreferences.edit(); + if (!max_char.isEmpty()) { + try { + editor.putInt(getString(R.string.SET_MAX_INSTANCE_CHAR) + MainActivity.currentInstance, Integer.parseInt(max_char)); + editor.apply(); + } catch (Exception ignored) { + } + } + } + finish(); + } + + ); if (getSupportActionBar() != null) { getSupportActionBar().setDisplayHomeAsUpEnabled(true); @@ -66,33 +90,53 @@ public class InstanceActivity extends BaseActivity { instancesVM.getInstance(BaseMainActivity.currentInstance).observe(InstanceActivity.this, instanceInfo -> { binding.instanceContainer.setVisibility(View.VISIBLE); binding.loader.setVisibility(View.GONE); - if (instanceInfo == null || instanceInfo.info == null) { - Toasty.error(InstanceActivity.this, getString(R.string.toast_error), Toast.LENGTH_LONG).show(); - return; - } - Instance instance = instanceInfo.info; - binding.instanceTitle.setText(instance.title); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) - binding.instanceDescription.setText(Html.fromHtml(instance.description, Html.FROM_HTML_MODE_LEGACY)); - else - binding.instanceDescription.setText(Html.fromHtml(instance.description)); - if (instance.description == null || instance.description.trim().length() == 0) - binding.instanceDescription.setText(getString(R.string.instance_no_description)); - binding.instanceVersion.setText(instance.version); - binding.instanceUri.setText(instance.uri); - if (instance.email == null) { - binding.instanceContact.hide(); + + if (instanceInfo == null || instanceInfo.info == null || instanceInfo.info.description == null) { + binding.maxCharContainer.setVisibility(View.VISIBLE); + binding.instanceContainer.setVisibility(View.GONE); + binding.instanceContact.setVisibility(View.GONE); + int val = sharedpreferences.getInt(getString(R.string.SET_MAX_INSTANCE_CHAR) + MainActivity.currentInstance, -1); + if (val != -1) { + binding.maxChar.setText(String.valueOf(val)); + } + applyMaxChar = true; + + } else { + Instance instance = instanceInfo.info; + binding.instanceTitle.setText(instance.title); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) + binding.instanceDescription.setText(Html.fromHtml(instance.description, Html.FROM_HTML_MODE_LEGACY)); + else + binding.instanceDescription.setText(Html.fromHtml(instance.description)); + if (instance.description == null || instance.description.trim().length() == 0) + binding.instanceDescription.setText(getString(R.string.instance_no_description)); + binding.instanceVersion.setText(instance.version); + binding.instanceUri.setText(instance.uri); + if (instance.email == null) { + binding.instanceContact.hide(); + } + Glide.with(InstanceActivity.this) + .asDrawable() + .load(instance.thumbnail) + .into(new CustomTarget<Drawable>() { + @Override + public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) { + binding.background.setAlpha(0.2f); + binding.background.setBackground(resource); + } + + @Override + public void onLoadCleared(@Nullable Drawable placeholder) { + + } + }); + + binding.instanceContact.setOnClickListener(v -> { + Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto", instance.email, null)); + emailIntent.putExtra(Intent.EXTRA_SUBJECT, "[Mastodon] - " + instance.uri); + startActivity(Intent.createChooser(emailIntent, getString(R.string.send_email))); + }); } - Glide.with(InstanceActivity.this) - .asBitmap() - .load(instance.thumbnail) - .into(binding.backGroundImage); - - binding.instanceContact.setOnClickListener(v -> { - Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto", instance.email, null)); - emailIntent.putExtra(Intent.EXTRA_SUBJECT, "[Mastodon] - " + instance.uri); - startActivity(Intent.createChooser(emailIntent, getString(R.string.send_email))); - }); }); } diff --git a/app/src/main/java/app/fedilab/android/client/entities/api/Account.java b/app/src/main/java/app/fedilab/android/client/entities/api/Account.java index 4b2392d89..fd444d4d4 100644 --- a/app/src/main/java/app/fedilab/android/client/entities/api/Account.java +++ b/app/src/main/java/app/fedilab/android/client/entities/api/Account.java @@ -83,7 +83,11 @@ public class Account implements Serializable { if (display_name == null || display_name.isEmpty()) { display_name = username; } - return SpannableHelper.convert(context, display_name, null, this, null, true, viewWeakReference); + return SpannableHelper.convert(context, display_name, null, this, null, false, viewWeakReference); + } + + public synchronized Spannable getSpanDisplayNameTitle(Context context, WeakReference<View> viewWeakReference, String title) { + return SpannableHelper.convert(context, title, null, this, null, false, viewWeakReference); } diff --git a/app/src/main/java/app/fedilab/android/client/entities/api/Poll.java b/app/src/main/java/app/fedilab/android/client/entities/api/Poll.java index a91a9361e..3bf9c4791 100644 --- a/app/src/main/java/app/fedilab/android/client/entities/api/Poll.java +++ b/app/src/main/java/app/fedilab/android/client/entities/api/Poll.java @@ -61,7 +61,7 @@ public class Poll implements Serializable { public transient Spannable span_title; public Spannable getSpanTitle(Context context, Status status, WeakReference<View> viewWeakReference) { - span_title = SpannableHelper.convert(context, title, status, null, null, true, viewWeakReference); + span_title = SpannableHelper.convert(context, title, status, null, null, false, viewWeakReference); return span_title; } } diff --git a/app/src/main/java/app/fedilab/android/client/entities/app/ReleaseNote.java b/app/src/main/java/app/fedilab/android/client/entities/app/ReleaseNote.java new file mode 100644 index 000000000..224d54fe2 --- /dev/null +++ b/app/src/main/java/app/fedilab/android/client/entities/app/ReleaseNote.java @@ -0,0 +1,39 @@ +package app.fedilab.android.client.entities.app; +/* 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 com.google.gson.annotations.SerializedName; + +import java.io.Serializable; +import java.util.List; + + +public class ReleaseNote implements Serializable { + + @SerializedName("languages") + public List<Note> ReleaseNotes; + + + public static class Note implements Serializable { + @SerializedName("code") + public String code; + @SerializedName("version") + public String version; + @SerializedName("note") + public String note; + @SerializedName("noteTranslated") + public String noteTranslated; + } +} diff --git a/app/src/main/java/app/fedilab/android/helper/Helper.java b/app/src/main/java/app/fedilab/android/helper/Helper.java index 99be394d8..65e481960 100644 --- a/app/src/main/java/app/fedilab/android/helper/Helper.java +++ b/app/src/main/java/app/fedilab/android/helper/Helper.java @@ -74,6 +74,7 @@ import androidx.annotation.IdRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; +import androidx.core.app.ActivityOptionsCompat; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; import androidx.core.content.ContextCompat; @@ -81,10 +82,12 @@ import androidx.core.graphics.drawable.DrawableCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; +import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.ViewModelStoreOwner; import androidx.localbroadcastmanager.content.LocalBroadcastManager; import androidx.preference.PreferenceManager; +import androidx.recyclerview.widget.LinearLayoutManager; import com.bumptech.glide.Glide; import com.bumptech.glide.RequestBuilder; @@ -95,6 +98,7 @@ import com.bumptech.glide.request.RequestOptions; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.TypeAdapter; +import com.google.gson.reflect.TypeToken; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonToken; import com.google.gson.stream.JsonWriter; @@ -115,10 +119,12 @@ import java.net.InetSocketAddress; import java.net.PasswordAuthentication; import java.net.Proxy; import java.net.URL; +import java.nio.charset.StandardCharsets; import java.security.Security; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.LinkedHashMap; @@ -133,19 +139,26 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import app.fedilab.android.BaseMainActivity; +import app.fedilab.android.BuildConfig; import app.fedilab.android.MainApplication; import app.fedilab.android.R; import app.fedilab.android.activities.ComposeActivity; import app.fedilab.android.activities.LoginActivity; import app.fedilab.android.activities.MainActivity; +import app.fedilab.android.activities.ProfileActivity; import app.fedilab.android.activities.WebviewActivity; import app.fedilab.android.broadcastreceiver.ToastMessage; import app.fedilab.android.client.entities.api.Attachment; +import app.fedilab.android.client.entities.api.Status; import app.fedilab.android.client.entities.app.Account; import app.fedilab.android.client.entities.app.BaseAccount; +import app.fedilab.android.client.entities.app.ReleaseNote; +import app.fedilab.android.databinding.PopupReleaseNotesBinding; import app.fedilab.android.exception.DBException; import app.fedilab.android.interfaces.OnDownloadInterface; import app.fedilab.android.sqlite.Sqlite; +import app.fedilab.android.ui.drawer.ReleaseNoteAdapter; +import app.fedilab.android.viewmodel.mastodon.AccountsVM; import app.fedilab.android.viewmodel.mastodon.OauthVM; import app.fedilab.android.watermark.androidwm.WatermarkBuilder; import app.fedilab.android.watermark.androidwm.bean.WatermarkText; @@ -1461,11 +1474,11 @@ public class Helper { } NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context, channelId) .setSmallIcon(R.drawable.ic_notification).setTicker(message); - if (notifType == NotifType.MENTION) { + /* if (notifType == NotifType.MENTION) { if (message.length() > 500) { message = message.substring(0, 499) + "…"; } - } + }*/ notificationBuilder.setGroup(account.mastodon_account.acct + "@" + account.instance) .setContentIntent(pIntent) .setContentText(message); @@ -1748,4 +1761,112 @@ public class Helper { } return null; } + + + public static void displayReleaseNotesIfNeeded(Activity activity, boolean forced) { + SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(activity); + int lastReleaseNoteRead = sharedpreferences.getInt(activity.getString(R.string.SET_POPUP_RELEASE_NOTES), 0); + int versionCode = BuildConfig.VERSION_CODE; + if (lastReleaseNoteRead != versionCode || forced) { + try { + InputStream is = activity.getAssets().open("release_notes/notes.json"); + int size; + size = is.available(); + byte[] buffer = new byte[size]; + is.read(buffer); + is.close(); + String json = new String(buffer, StandardCharsets.UTF_8); + Gson gson = new Gson(); + AlertDialog.Builder dialogBuilderOptin = new AlertDialog.Builder(activity, Helper.dialogStyle()); + PopupReleaseNotesBinding binding = PopupReleaseNotesBinding.inflate(activity.getLayoutInflater()); + dialogBuilderOptin.setView(binding.getRoot()); + try { + List<ReleaseNote.Note> releaseNotes = gson.fromJson(json, new TypeToken<List<ReleaseNote.Note>>() { + }.getType()); + if (releaseNotes != null && releaseNotes.size() > 0) { + ReleaseNoteAdapter adapter = new ReleaseNoteAdapter(releaseNotes); + binding.releasenotes.setAdapter(adapter); + binding.releasenotes.setLayoutManager(new LinearLayoutManager(activity)); + } + } catch (Exception ignored) { + } + if (BuildConfig.DONATIONS) { + binding.aboutSupport.setVisibility(View.VISIBLE); + binding.aboutSupportPaypal.setVisibility(View.VISIBLE); + } else { + binding.aboutSupport.setVisibility(View.GONE); + binding.aboutSupportPaypal.setVisibility(View.GONE); + } + binding.accountFollow.setBackgroundTintList(ThemeHelper.getButtonActionColorStateList(activity)); + binding.accountFollow.setImageResource(R.drawable.ic_baseline_person_add_24); + binding.aboutSupport.setOnClickListener(v -> { + Intent intentLiberapay = new Intent(Intent.ACTION_VIEW); + intentLiberapay.setData(Uri.parse("https://liberapay.com/tom79")); + try { + activity.startActivity(intentLiberapay); + } catch (Exception e) { + Helper.openBrowser(activity, "https://liberapay.com/tom79"); + } + }); + binding.aboutSupportPaypal.setOnClickListener(v -> Helper.openBrowser(activity, "https://www.paypal.me/Mastalab")); + CrossActionHelper.fetchRemoteAccount(activity, "@apps@toot.fedilab.app", new CrossActionHelper.Callback() { + @Override + public void federatedStatus(Status status) { + + } + + @Override + public void federatedAccount(app.fedilab.android.client.entities.api.Account account) { + if (account != null && account.username.equalsIgnoreCase("apps")) { + + MastodonHelper.loadPPMastodon(binding.accountPp, account); + binding.accountDn.setText(account.display_name); + binding.accountUn.setText(account.acct); + binding.accountPp.setOnClickListener(v -> { + Intent intent = new Intent(activity, ProfileActivity.class); + Bundle b = new Bundle(); + b.putSerializable(Helper.ARG_ACCOUNT, account); + intent.putExtras(b); + ActivityOptionsCompat options = ActivityOptionsCompat + .makeSceneTransitionAnimation(activity, binding.accountPp, activity.getString(R.string.activity_porfile_pp)); + activity.startActivity(intent, options.toBundle()); + }); + + AccountsVM accountsVM = new ViewModelProvider((ViewModelStoreOwner) activity).get(AccountsVM.class); + List<String> ids = new ArrayList<>(); + ids.add(account.id); + accountsVM.getRelationships(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, ids) + .observe((LifecycleOwner) activity, relationShips -> { + if (relationShips != null && relationShips.size() > 0) { + if (!relationShips.get(0).following) { + binding.acccountContainer.setVisibility(View.VISIBLE); + binding.accountFollow.setVisibility(View.VISIBLE); + binding.accountFollow.setOnClickListener(v -> accountsVM.follow(BaseMainActivity.currentInstance, BaseMainActivity.currentToken, account.id, true, false) + .observe((LifecycleOwner) activity, relationShip -> binding.accountFollow.setVisibility(View.GONE))); + } + } + }); + } + } + }); + dialogBuilderOptin.setPositiveButton(R.string.close, (dialog, id) -> dialog.dismiss()); + try { + Handler handler = new Handler(); + handler.postDelayed(() -> { + if (!activity.isFinishing()) { + dialogBuilderOptin.show(); + } + }, 1000); + } catch (Exception e) { + e.printStackTrace(); + } + } catch (IOException e) { + e.printStackTrace(); + } + + SharedPreferences.Editor editor = sharedpreferences.edit(); + editor.putInt(activity.getString(R.string.SET_POPUP_RELEASE_NOTES), versionCode); + editor.apply(); + } + } } diff --git a/app/src/main/java/app/fedilab/android/helper/MastodonHelper.java b/app/src/main/java/app/fedilab/android/helper/MastodonHelper.java index 65ba98022..cc0e78e77 100644 --- a/app/src/main/java/app/fedilab/android/helper/MastodonHelper.java +++ b/app/src/main/java/app/fedilab/android/helper/MastodonHelper.java @@ -15,6 +15,8 @@ package app.fedilab.android.helper; * see <http://www.gnu.org/licenses>. */ +import static app.fedilab.android.BaseMainActivity.instanceInfo; + import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; @@ -51,6 +53,7 @@ import java.util.regex.Pattern; import app.fedilab.android.BaseMainActivity; import app.fedilab.android.R; +import app.fedilab.android.activities.MainActivity; import app.fedilab.android.client.entities.api.Account; import app.fedilab.android.client.entities.api.Pagination; import app.fedilab.android.client.entities.api.RelationShip; @@ -499,4 +502,19 @@ public class MastodonHelper { void onTimedMute(RelationShip relationShip); } + public static int getInstanceMaxChars(Context context) { + int max_car; + if (instanceInfo != null) { + max_car = instanceInfo.max_toot_chars != null ? Integer.parseInt(instanceInfo.max_toot_chars) : instanceInfo.configuration.statusesConf.max_characters; + } else { + SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context); + int val = sharedpreferences.getInt(context.getString(R.string.SET_MAX_INSTANCE_CHAR) + MainActivity.currentInstance, -1); + if (val != -1) { + return val; + } else { + max_car = 500; + } + } + return max_car; + } } diff --git a/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java b/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java index c9c45c7b0..c23c7f032 100644 --- a/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java +++ b/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java @@ -54,6 +54,7 @@ import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; @@ -89,6 +90,17 @@ public class SpannableHelper { if (text == null) { return null; } + Pattern imgPattern = Pattern.compile("<img [^>]*src=\"([^\"]+)\"[^>]*>"); + Matcher matcherImg = imgPattern.matcher(text); + HashMap<String, String> imagesToReplace = new LinkedHashMap<>(); + int inc = 0; + while (matcherImg.find()) { + String replacement = "[FEDI_IMG_" + inc + "]"; + imagesToReplace.put(replacement, matcherImg.group(1)); + inc++; + text = text.replaceAll(Pattern.quote(matcherImg.group()), replacement); + } + SpannableStringBuilder content; View view = viewWeakReference.get(); List<Mention> mentionList = null; @@ -132,9 +144,9 @@ public class SpannableHelper { } else { content = new SpannableStringBuilder(text); } + SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context); + boolean animate = !sharedpreferences.getBoolean(context.getString(R.string.SET_DISABLE_ANIMATED_EMOJI), false); if (emojiList != null && emojiList.size() > 0) { - SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context); - boolean animate = !sharedpreferences.getBoolean(context.getString(R.string.SET_DISABLE_ANIMATED_EMOJI), false); for (Emoji emoji : emojiList) { Matcher matcher = Pattern.compile(":" + emoji.shortcode + ":", Pattern.LITERAL) .matcher(content); @@ -148,6 +160,24 @@ public class SpannableHelper { } } } + + if (imagesToReplace.size() > 0) { + for (Map.Entry<String, String> entry : imagesToReplace.entrySet()) { + String key = entry.getKey(); + String url = entry.getValue(); + Matcher matcher = Pattern.compile(key, 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(url) + .into(customEmoji.getTarget(animate)); + } + } + + } return trimSpannable(new SpannableStringBuilder(content)); } diff --git a/app/src/main/java/app/fedilab/android/ui/drawer/ComposeAdapter.java b/app/src/main/java/app/fedilab/android/ui/drawer/ComposeAdapter.java index db2aba5e7..d922cda27 100644 --- a/app/src/main/java/app/fedilab/android/ui/drawer/ComposeAdapter.java +++ b/app/src/main/java/app/fedilab/android/ui/drawer/ComposeAdapter.java @@ -15,6 +15,7 @@ package app.fedilab.android.ui.drawer; * see <http://www.gnu.org/licenses>. */ +import static android.content.Context.INPUT_METHOD_SERVICE; import static app.fedilab.android.BaseMainActivity.currentAccount; import static app.fedilab.android.BaseMainActivity.emojis; import static app.fedilab.android.BaseMainActivity.instanceInfo; @@ -45,6 +46,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; +import android.view.inputmethod.InputMethodManager; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.GridView; @@ -71,6 +73,9 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.request.RequestOptions; import com.bumptech.glide.request.target.CustomTarget; import com.bumptech.glide.request.transition.Transition; +import com.vanniktech.emoji.EmojiManager; +import com.vanniktech.emoji.EmojiPopup; +import com.vanniktech.emoji.one.EmojiOneProvider; import java.io.File; import java.lang.ref.WeakReference; @@ -712,12 +717,7 @@ public class ComposeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder public void afterTextChanged(Editable s) { int currentLength = MastodonHelper.countLength(holder); |