summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app/build.gradle2
-rw-r--r--app/src/main/java/app/fedilab/android/activities/BaseMainActivity.java14
-rw-r--r--app/src/main/java/app/fedilab/android/client/Entities/Account.java17
-rw-r--r--app/src/main/java/app/fedilab/android/client/Entities/Status.java17
-rw-r--r--app/src/main/java/app/fedilab/android/client/PeertubeAPI.java4
-rw-r--r--app/src/main/java/app/fedilab/android/drawers/ReactionAdapter.java39
-rw-r--r--app/src/main/java/app/fedilab/android/drawers/StatusListAdapter.java2
-rw-r--r--app/src/main/java/app/fedilab/android/helper/Helper.java104
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);