diff options
8 files changed, 133 insertions, 66 deletions
diff --git a/app/build.gradle b/app/build.gradle index 6e554190e..dbfbe5932 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.application' android { compileSdkVersion 29 - buildToolsVersion "29.0.2" + buildToolsVersion "29.0.3" defaultConfig { minSdkVersion 19 targetSdkVersion 29 diff --git a/app/src/main/java/app/fedilab/android/activities/BaseMainActivity.java b/app/src/main/java/app/fedilab/android/activities/BaseMainActivity.java index 1fd81f6fb..072c50441 100644 --- a/app/src/main/java/app/fedilab/android/activities/BaseMainActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/BaseMainActivity.java @@ -179,6 +179,7 @@ public abstract class BaseMainActivity extends BaseActivity public static String regex_home, regex_local, regex_public; public static boolean show_boosts, show_replies, show_art_nsfw; public static iconLauncher mLauncher = iconLauncher.BUBBLES; + public static boolean isAttached = false; private static boolean notificationChecked = false; private final int PICK_IMPORT = 5556; private FloatingActionButton toot, delete_all, add_new; @@ -2374,6 +2375,18 @@ public abstract class BaseMainActivity extends BaseActivity } } + @Override + public void onAttachedToWindow() { + super.onAttachedToWindow(); + isAttached = true; + } + + @Override + public void onDetachedFromWindow() { + super.onDetachedFromWindow(); + isAttached = false; + } + public enum iconLauncher { BUBBLES, FEDIVERSE, @@ -2521,6 +2534,7 @@ public abstract class BaseMainActivity extends BaseActivity } } + @Override public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { if (mPageReferenceMap != null) { diff --git a/app/src/main/java/app/fedilab/android/client/Entities/Account.java b/app/src/main/java/app/fedilab/android/client/Entities/Account.java index 06b8eb6e0..8e750ac12 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/Account.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/Account.java @@ -225,13 +225,16 @@ public class Account implements Parcelable { //emojis can be used several times so we have to loop for (int startPosition = -1; (startPosition = displayNameSpan.toString().indexOf(targetedEmoji, startPosition + 1)) != -1; startPosition++) { final int endPosition = startPosition + targetedEmoji.length(); - if (endPosition <= displayNameSpan.toString().length() && endPosition >= startPosition) { - resource.setBounds(0, 0, (int) Helper.convertDpToPixel(20, context), (int) Helper.convertDpToPixel(20, context)); - resource.setVisible(true, true); - ImageSpan imageSpan = new ImageSpan(resource); - displayNameSpan.setSpan( - imageSpan, startPosition, - endPosition, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); + if (resource != null && endPosition <= displayNameSpan.toString().length() && endPosition >= startPosition) { + try { + resource.setBounds(0, 0, (int) Helper.convertDpToPixel(20, context), (int) Helper.convertDpToPixel(20, context)); + resource.setVisible(true, true); + ImageSpan imageSpan = new ImageSpan(resource); + displayNameSpan.setSpan( + imageSpan, startPosition, + endPosition, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); + } catch (Exception ignored) { + } return; } } diff --git a/app/src/main/java/app/fedilab/android/client/Entities/Status.java b/app/src/main/java/app/fedilab/android/client/Entities/Status.java index cee832d47..b307c300d 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/Status.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/Status.java @@ -890,14 +890,17 @@ public class Status implements Parcelable { //emojis can be used several times so we have to loop for (int startPosition = -1; (startPosition = contentSpan.toString().indexOf(targetedEmoji, startPosition + 1)) != -1; startPosition++) { final int endPosition = startPosition + targetedEmoji.length(); - if (endPosition <= contentSpan.toString().length() && endPosition >= startPosition) { + if (resource != null && endPosition <= contentSpan.toString().length() && endPosition >= startPosition) { ImageSpan imageSpan; - resource.setBounds(0, 0, (int) Helper.convertDpToPixel(20, context), (int) Helper.convertDpToPixel(20, context)); - resource.setVisible(true, true); - imageSpan = new ImageSpan(resource); - contentSpan.setSpan( - imageSpan, startPosition, - endPosition, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); + try { + resource.setBounds(0, 0, (int) Helper.convertDpToPixel(20, context), (int) Helper.convertDpToPixel(20, context)); + resource.setVisible(true, true); + imageSpan = new ImageSpan(resource); + contentSpan.setSpan( + imageSpan, startPosition, + endPosition, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); + } catch (Exception ignored) { + } } } } diff --git a/app/src/main/java/app/fedilab/android/client/PeertubeAPI.java b/app/src/main/java/app/fedilab/android/client/PeertubeAPI.java index c82216d2f..e08e36090 100644 --- a/app/src/main/java/app/fedilab/android/client/PeertubeAPI.java +++ b/app/src/main/java/app/fedilab/android/client/PeertubeAPI.java @@ -463,8 +463,10 @@ public class PeertubeAPI { if (accountObject.has("avatar") && !accountObject.isNull("avatar")) { account.setAvatar(accountObject.getJSONObject("avatar").get("path").toString()); account.setAvatar_static(accountObject.getJSONObject("avatar").get("path").toString()); - } else + } else { account.setAvatar("null"); + account.setAvatar_static("null"); + } account.setHeader("null"); account.setHeader_static("null"); diff --git a/app/src/main/java/app/fedilab/android/drawers/ReactionAdapter.java b/app/src/main/java/app/fedilab/android/drawers/ReactionAdapter.java index 5aa0e6d2c..e2037f8b0 100644 --- a/app/src/main/java/app/fedilab/android/drawers/ReactionAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/ReactionAdapter.java @@ -15,6 +15,8 @@ package app.fedilab.android.drawers; * see <http://www.gnu.org/licenses>. */ +import android.content.Context; +import android.os.AsyncTask; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -31,23 +33,32 @@ import java.util.ArrayList; import java.util.List; import app.fedilab.android.R; +import app.fedilab.android.asynctasks.PostActionAsyncTask; +import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask; +import app.fedilab.android.client.API; +import app.fedilab.android.client.Entities.Error; import app.fedilab.android.client.Entities.Reaction; import app.fedilab.android.helper.Helper; +import app.fedilab.android.interfaces.OnPostActionInterface; /** * Created by Thomas on 10/03/2020. * Adapter for reactions on messages */ -public class ReactionAdapter extends RecyclerView.Adapter { +public class ReactionAdapter extends RecyclerView.Adapter implements OnPostActionInterface { private List<Reaction> reactions; + private RetrieveFeedsAsyncTask.Type type; + private String statusId; - ReactionAdapter(List<Reaction> reactions) { + ReactionAdapter(List<Reaction> reactions, RetrieveFeedsAsyncTask.Type type, String statusId) { this.reactions = reactions; if (reactions == null) { this.reactions = new ArrayList<>(); } + this.type = type; + this.statusId = statusId; } @NonNull @@ -61,7 +72,7 @@ public class ReactionAdapter extends RecyclerView.Adapter { public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) { final Reaction reaction = reactions.get(viewHolder.getAdapterPosition()); ViewHolder holder = (ViewHolder) viewHolder; - + Context context = viewHolder.itemView.getContext(); holder.reaction_count.setText(String.valueOf(reaction.getCount())); if (reaction.isMe()) { holder.reaction_container.setBackgroundResource(R.drawable.reaction_voted); @@ -92,6 +103,23 @@ public class ReactionAdapter extends RecyclerView.Adapter { holder.reaction_name.setVisibility(View.VISIBLE); holder.reaction_emoji.setVisibility(View.GONE); } + + holder.reaction_container.setOnClickListener(v -> { + String emojiStr = reaction.getName(); + API.StatusAction statusAction; + if (type == RetrieveFeedsAsyncTask.Type.ANNOUNCEMENTS) { + statusAction = reaction.isMe() ? API.StatusAction.REMOVE_REACTION : API.StatusAction.ADD_REACTION; + } else { + statusAction = reaction.isMe() ? API.StatusAction.REMOVE_PLEROMA_REACTION : API.StatusAction.ADD_PLEROMA_REACTION; + } + reaction.setMe(!reaction.isMe()); + if( reaction.isMe()) { + reaction.setCount(reaction.getCount()+1); + }else{ + reaction.setCount(reaction.getCount()-1); + } + new PostActionAsyncTask(context, statusAction, this.statusId, null, emojiStr, ReactionAdapter.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + }); } @Override @@ -104,6 +132,11 @@ public class ReactionAdapter extends RecyclerView.Adapter { return reactions.size(); } + @Override + public void onPostAction(int statusCode, API.StatusAction statusAction, String userId, Error error) { + notifyDataSetChanged(); + } + static class ViewHolder extends RecyclerView.ViewHolder { TextView reaction_name, reaction_count; diff --git a/app/src/main/java/app/fedilab/android/drawers/StatusListAdapter.java b/app/src/main/java/app/fedilab/android/drawers/StatusListAdapter.java index 940633362..d284b91ef 100644 --- a/app/src/main/java/app/fedilab/android/drawers/StatusListAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/StatusListAdapter.java @@ -1014,7 +1014,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct holder.status_action_container.setVisibility(View.GONE); } holder.status_reactions.setVisibility(View.VISIBLE); - ReactionAdapter reactionAdapter = new ReactionAdapter(status.getReactions()); + ReactionAdapter reactionAdapter = new ReactionAdapter(status.getReactions(), type, status.getId()); holder.reactions_view.setAdapter(reactionAdapter); LinearLayoutManager layoutManager = new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false); 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 1816699de..ed3db59b2 100644 --- a/app/src/main/java/app/fedilab/android/helper/Helper.java +++ b/app/src/main/java/app/fedilab/android/helper/Helper.java @@ -232,6 +232,7 @@ import okhttp3.TlsVersion; import static android.content.Context.DOWNLOAD_SERVICE; import static app.fedilab.android.activities.BaseMainActivity.filters; +import static app.fedilab.android.activities.BaseMainActivity.isAttached; import static app.fedilab.android.activities.BaseMainActivity.mutedAccount; import static app.fedilab.android.activities.BaseMainActivity.regex_home; import static app.fedilab.android.activities.BaseMainActivity.regex_local; @@ -647,6 +648,9 @@ public class Helper { editor.putString(Helper.PREF_INSTANCE, null); editor.putString(Helper.ID, null); editor.apply(); + Intent loginActivity = new Intent(activity, LoginActivity.class); + activity.startActivity(loginActivity); + activity.finish(); } else { editor.putString(Helper.PREF_KEY_OAUTH_TOKEN, newAccount.getToken()); editor.putString(Helper.PREF_KEY_ID, newAccount.getId()); @@ -1788,38 +1792,41 @@ public class Helper { if (!accountChoice.getAvatar().startsWith("http")) accountChoice.setAvatar("https://" + accountChoice.getInstance() + accountChoice.getAvatar()); ImageView itemIconAcc = new ImageView(activity); - if( !activity.isFinishing()) { - Glide.with(activity) - .asDrawable() - .apply(new RequestOptions().transform(new CenterCrop(), new RoundedCorners(270))) - .load(!disableGif ? accountChoice.getAvatar() : accountChoice.getAvatar_static()) - .listener(new RequestListener<Drawable>() { + if (!activity.isFinishing() && isAttached) { + try { + Glide.with(activity) + .asDrawable() + .apply(new RequestOptions().transform(new CenterCrop(), new RoundedCorners(270))) + .load(!disableGif ? accountChoice.getAvatar() : accountChoice.getAvatar_static()) + .listener(new RequestListener<Drawable>() { - @Override - public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) { - return false; - } + @Override + public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) { + return false; + } - @Override - public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { - if (MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.MASTODON || MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.PLEROMA) - itemIconAcc.setImageResource(R.drawable.missing); - else if (MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.PEERTUBE) - itemIconAcc.setImageResource(R.drawable.missing_peertube); - return false; - } - }) - .into(new CustomTarget<Drawable>() { - @Override - public void onResourceReady(@NonNull Drawable resource, Transition<? super Drawable> transition) { - itemIconAcc.setImageDrawable(resource); - } + @Override + public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { + if (MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.MASTODON || MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.PLEROMA) + itemIconAcc.setImageResource(R.drawable.missing); + else if (MainActivity.social == UpdateAccountInfoAsyncTask.SOCIAL.PEERTUBE) + itemIconAcc.setImageResource(R.drawable.missing_peertube); + return false; + } + }) + .into(new CustomTarget<Drawable>() { + @Override + public void onResourceReady(@NonNull Drawable resource, Transition<? super Drawable> transition) { + itemIconAcc.setImageDrawable(resource); + } - @Override - public void onLoadCleared(@Nullable Drawable placeholder) { + @Override + public void onLoadCleared(@Nullable Drawable placeholder) { - } - }); + } + }); + } catch (Exception ignored) { + } } if (accounts.size() > 2) { @@ -1927,27 +1934,32 @@ public class Helper { } if (!urlHeader.contains("missing.png")) { ImageView backgroundImage = headerLayout.findViewById(R.id.back_ground_image); - Glide.with(activity) - .asDrawable() - .load(urlHeader) - .into(new CustomTarget<Drawable>() { - @Override - public void onResourceReady(@NonNull Drawable resource, Transition<? super Drawable> transition) { - - backgroundImage.setImageDrawable(resource); - if (theme == THEME_LIGHT) { - backgroundImage.setImageAlpha(80); - } else { - backgroundImage.setImageAlpha(60); - } + if (!activity.isFinishing() && isAttached) { + try { + Glide.with(activity) + .asDrawable() + .load(urlHeader) + .into(new CustomTarget<Drawable>() { + @Override + public void onResourceReady(@NonNull Drawable resource, Transition<? super Drawable> transition) { - } + backgroundImage.setImageDrawable(resource); + if (theme == THEME_LIGHT) { + backgroundImage.setImageAlpha(80); + } else { + backgroundImage.setImageAlpha(60); + } - @Override - public void onLoadCleared(@Nullable Drawable placeholder) { + } - } - }); + @Override + public void onLoadCleared(@Nullable Drawable placeholder) { + + } + }); + } catch (Exception ignored) { + } + } } } profilePicture.setOnClickListener(null); |