From f716688a8dabb376508ccfab767f8b9032e2f1a2 Mon Sep 17 00:00:00 2001 From: tom79 Date: Tue, 10 Mar 2020 19:00:32 +0100 Subject: [PATCH] Fix issue #411 --- .../android/activities/BaseMainActivity.java | 32 ++++- .../asynctasks/PostActionAsyncTask.java | 4 +- .../java/app/fedilab/android/client/API.java | 22 +++- .../android/client/Entities/Reaction.java | 19 ++- .../android/drawers/ReactionAdapter.java | 25 +++- .../android/drawers/StatusListAdapter.java | 118 +++++++++++++++++- .../fragments/DisplayStatusFragment.java | 28 ++++- .../main/res/drawable-v19/reaction_border.xml | 2 +- .../main/res/drawable-v19/reaction_voted.xml | 1 + app/src/main/res/drawable/reaction_border.xml | 2 +- app/src/main/res/drawable/reaction_voted.xml | 1 + app/src/main/res/layout/drawer_reaction.xml | 18 +++ .../main/res/layout/drawer_status_compact.xml | 27 ++++ app/src/main/res/layout/item_menu_news.xml | 25 ++-- 14 files changed, 292 insertions(+), 32 deletions(-) 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 7148fc873..78ced9520 100644 --- a/app/src/main/java/app/fedilab/android/activities/BaseMainActivity.java +++ b/app/src/main/java/app/fedilab/android/activities/BaseMainActivity.java @@ -107,6 +107,7 @@ import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; import app.fedilab.android.asynctasks.UpdateAccountInfoByIDAsyncTask; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Account; +import app.fedilab.android.client.Entities.Announcement; import app.fedilab.android.client.Entities.Error; import app.fedilab.android.client.Entities.Filters; import app.fedilab.android.client.Entities.Instance; @@ -117,7 +118,6 @@ import app.fedilab.android.client.Entities.Status; import app.fedilab.android.client.Entities.TagTimeline; import app.fedilab.android.drawers.AccountSearchDevAdapter; import app.fedilab.android.fragments.DisplayAccountsFragment; -import app.fedilab.android.fragments.DisplayAnnouncementsFragment; import app.fedilab.android.fragments.DisplayBookmarksPixelfedFragment; import app.fedilab.android.fragments.DisplayDraftsFragment; import app.fedilab.android.fragments.DisplayFavoritesPeertubeFragment; @@ -140,6 +140,7 @@ import app.fedilab.android.helper.Helper; import app.fedilab.android.helper.MenuFloating; import app.fedilab.android.interfaces.OnFilterActionInterface; import app.fedilab.android.interfaces.OnRetrieveEmojiAccountInterface; +import app.fedilab.android.interfaces.OnRetrieveFeedsInterface; import app.fedilab.android.interfaces.OnRetrieveInstanceInterface; import app.fedilab.android.interfaces.OnRetrieveMetaDataInterface; import app.fedilab.android.interfaces.OnRetrieveRelationshipInterface; @@ -161,7 +162,7 @@ import static app.fedilab.android.helper.Helper.changeDrawableColor; public abstract class BaseMainActivity extends BaseActivity - implements NavigationView.OnNavigationItemSelectedListener, OnUpdateAccountInfoInterface, OnRetrieveMetaDataInterface, OnRetrieveInstanceInterface, OnRetrieveRemoteAccountInterface, OnRetrieveEmojiAccountInterface, OnFilterActionInterface, OnSyncTimelineInterface, OnRetrieveRelationshipInterface { + implements NavigationView.OnNavigationItemSelectedListener, OnRetrieveFeedsInterface, OnUpdateAccountInfoInterface, OnRetrieveMetaDataInterface, OnRetrieveInstanceInterface, OnRetrieveRemoteAccountInterface, OnRetrieveEmojiAccountInterface, OnFilterActionInterface, OnSyncTimelineInterface, OnRetrieveRelationshipInterface { public static String currentLocale; @@ -1331,7 +1332,9 @@ public abstract class BaseMainActivity extends BaseActivity new UpdateAccountInfoByIDAsyncTask(getApplicationContext(), social, BaseMainActivity.this).execute(); } mutedAccount = new TempMuteDAO(getApplicationContext(), db).getAllTimeMuted(account); - + if (social == UpdateAccountInfoAsyncTask.SOCIAL.MASTODON || social == UpdateAccountInfoAsyncTask.SOCIAL.PLEROMA){ + new RetrieveFeedsAsyncTask(getApplicationContext(), RetrieveFeedsAsyncTask.Type.ANNOUNCEMENTS, null, BaseMainActivity.this).execute(); + } } private void manageTimelineList(boolean displayed) { @@ -2528,5 +2531,26 @@ public abstract class BaseMainActivity extends BaseActivity } } - + @Override + public void onRetrieveFeeds(APIResponse apiResponse) { + if( apiResponse != null && apiResponse.getAnnouncements() != null && apiResponse.getAnnouncements().size() > 0 ){ + int unread = 0; + for(Announcement announcement: apiResponse.getAnnouncements()){ + if( !announcement.isRead()){ + unread++; + } + } + final NavigationView navigationView = findViewById(R.id.nav_view); + MenuItem item = navigationView.getMenu().findItem(R.id.nav_announcements); + TextView actionView = item.getActionView().findViewById(R.id.counter); + if(actionView != null) { + if (unread > 0) { + actionView.setText(unread); + actionView.setVisibility(View.VISIBLE); + }else{ + actionView.setVisibility(View.GONE); + } + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/app/fedilab/android/asynctasks/PostActionAsyncTask.java b/app/src/main/java/app/fedilab/android/asynctasks/PostActionAsyncTask.java index 80394c2ba..698d92535 100644 --- a/app/src/main/java/app/fedilab/android/asynctasks/PostActionAsyncTask.java +++ b/app/src/main/java/app/fedilab/android/asynctasks/PostActionAsyncTask.java @@ -179,7 +179,9 @@ public class PostActionAsyncTask extends AsyncTask { } else { statusCode = api.reportAction(targetedId, comment); } - } else if (apiAction == API.StatusAction.CREATESTATUS) + }else if (apiAction == API.StatusAction.ADD_REACTION || apiAction == API.StatusAction.REMOVE_REACTION) { + statusCode = api.postAction(apiAction, targetedId, comment); + }else if (apiAction == API.StatusAction.CREATESTATUS) statusCode = api.statusAction(status); else if (apiAction == API.StatusAction.UPDATESERVERSCHEDULE) { api.scheduledAction("PUT", storedStatus.getStatus(), null, storedStatus.getScheduledServerdId()); diff --git a/app/src/main/java/app/fedilab/android/client/API.java b/app/src/main/java/app/fedilab/android/client/API.java index f35805757..f9585cd74 100644 --- a/app/src/main/java/app/fedilab/android/client/API.java +++ b/app/src/main/java/app/fedilab/android/client/API.java @@ -556,6 +556,9 @@ public class API { reaction.setName(resobj.getString("name")); reaction.setCount(resobj.getInt("count")); reaction.setMe(resobj.getBoolean("me")); + if( resobj.has("url")){ + reaction.setUrl(resobj.getString("url")); + } } catch (JSONException e) { e.printStackTrace(); } @@ -4094,6 +4097,17 @@ public class API { return postAction(statusAction, targetedId, null, null); } + /** + * Makes the post action for a status + * + * @param statusAction Enum + * @param targetedId String id of the targeted Id *can be this of a status or an account* + * @return in status code - Should be equal to 200 when action is done + */ + public int postAction(StatusAction statusAction, String targetedId, String comment) { + return postAction(statusAction, targetedId, null, comment); + } + //Pleroma admin calls /** @@ -4245,7 +4259,10 @@ public class API { break; case REMOVE_REACTION: case ADD_REACTION: - action = String.format("announcements/%s/reactions/%s", targetedId, comment); + action = String.format("/announcements/%s/reactions/%s", targetedId, comment); + break; + case DISMISS_ANNOUNCEMENT: + action = String.format("/announcements/%s/dismiss", targetedId); break; case AUTHORIZE: action = String.format("/follow_requests/%s/authorize", targetedId); @@ -6183,7 +6200,8 @@ public class API { DELETESCHEDULED, REFRESHPOLL, ADD_REACTION, - REMOVE_REACTION + REMOVE_REACTION, + DISMISS_ANNOUNCEMENT } public enum accountPrivacy { diff --git a/app/src/main/java/app/fedilab/android/client/Entities/Reaction.java b/app/src/main/java/app/fedilab/android/client/Entities/Reaction.java index 5560f6ec1..9c1717ede 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/Reaction.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/Reaction.java @@ -21,6 +21,7 @@ public class Reaction implements Parcelable { private String name; private int count; private boolean me; + private String url; public String getName() { return name; @@ -46,6 +47,17 @@ public class Reaction implements Parcelable { this.me = me; } + public Reaction() { + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + @Override public int describeContents() { return 0; @@ -56,18 +68,17 @@ public class Reaction implements Parcelable { dest.writeString(this.name); dest.writeInt(this.count); dest.writeByte(this.me ? (byte) 1 : (byte) 0); - } - - public Reaction() { + dest.writeString(this.url); } protected Reaction(Parcel in) { this.name = in.readString(); this.count = in.readInt(); this.me = in.readByte() != 0; + this.url = in.readString(); } - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + public static final Creator CREATOR = new Creator() { @Override public Reaction createFromParcel(Parcel source) { return new Reaction(source); 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 8d11b4c9d..a6d086fc2 100644 --- a/app/src/main/java/app/fedilab/android/drawers/ReactionAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/ReactionAdapter.java @@ -15,17 +15,19 @@ package app.fedilab.android.drawers; * see . */ -import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; + import java.util.List; import app.fedilab.android.R; import app.fedilab.android.client.Entities.Reaction; +import app.fedilab.android.helper.Helper; /** @@ -36,7 +38,7 @@ public class ReactionAdapter extends RecyclerView.Adapter { private List reactions; - public ReactionAdapter(List reactions) { + ReactionAdapter(List reactions) { this.reactions = reactions; } @@ -51,8 +53,23 @@ 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; - holder.reaction_name.setText(reaction.getName()); + holder.reaction_count.setText(String.valueOf(reaction.getCount())); + if(reaction.isMe()) { + holder.reaction_container.setBackgroundResource(R.drawable.reaction_voted); + }else{ + holder.reaction_container.setBackgroundResource(R.drawable.reaction_border); + } + if(reaction.getUrl() != null){ + holder.reaction_name.setVisibility(View.GONE); + holder.reaction_emoji.setVisibility(View.VISIBLE); + holder.reaction_emoji.setContentDescription(reaction.getName()); + Helper.loadGiF(holder.itemView.getContext(), reaction.getUrl(), holder.reaction_emoji); + }else{ + holder.reaction_name.setText(reaction.getName()); + holder.reaction_name.setVisibility(View.VISIBLE); + holder.reaction_emoji.setVisibility(View.GONE); + } } @Override @@ -69,12 +86,14 @@ public class ReactionAdapter extends RecyclerView.Adapter { static class ViewHolder extends RecyclerView.ViewHolder { TextView reaction_name, reaction_count; LinearLayout reaction_container; + ImageView reaction_emoji; public ViewHolder(@NonNull View itemView) { super(itemView); reaction_name = itemView.findViewById(R.id.reaction_name); reaction_count = itemView.findViewById(R.id.reaction_count); reaction_container = itemView.findViewById(R.id.reaction_container); + reaction_emoji = itemView.findViewById(R.id.reaction_emoji); } } 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 e5bb8328e..7146ecae5 100644 --- a/app/src/main/java/app/fedilab/android/drawers/StatusListAdapter.java +++ b/app/src/main/java/app/fedilab/android/drawers/StatusListAdapter.java @@ -93,6 +93,13 @@ import com.github.stom79.mytransl.client.HttpsConnectionException; import com.github.stom79.mytransl.client.Results; import com.github.stom79.mytransl.translate.Translate; import com.google.android.material.floatingactionbutton.FloatingActionButton; +import com.vanniktech.emoji.EmojiImageView; +import com.vanniktech.emoji.EmojiManager; +import com.vanniktech.emoji.EmojiPopup; +import com.vanniktech.emoji.emoji.Emoji; +import com.vanniktech.emoji.listeners.OnEmojiClickListener; +import com.vanniktech.emoji.listeners.OnEmojiPopupDismissListener; +import com.vanniktech.emoji.one.EmojiOneProvider; import com.varunest.sparkbutton.SparkButton; import org.apache.poi.sl.usermodel.Line; @@ -181,6 +188,7 @@ import br.com.felix.horizontalbargraph.model.BarItem; import es.dmoral.toasty.Toasty; import jp.wasabeef.glide.transformations.BlurTransformation; +import static android.content.Context.INPUT_METHOD_SERVICE; import static android.content.Context.MODE_PRIVATE; import static app.fedilab.android.activities.BaseMainActivity.mPageReferenceMap; import static app.fedilab.android.activities.BaseMainActivity.mutedAccount; @@ -246,6 +254,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct } }; private Handler mHandler = new Handler(); + private int style; public StatusListAdapter(StatusDrawerParams statusDrawerParams) { statuses = statusDrawerParams.getStatuses(); @@ -1017,6 +1026,100 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct LinearLayoutManager layoutManager = new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false); holder.reactions_view.setLayoutManager(layoutManager); + + + holder.status_add_reaction.setOnClickListener(v -> { + EmojiManager.install(new EmojiOneProvider()); + final EmojiPopup emojiPopup = EmojiPopup.Builder.fromRootView(holder.status_add_reaction).setOnEmojiPopupDismissListener(() -> { + InputMethodManager imm = (InputMethodManager) context.getSystemService(INPUT_METHOD_SERVICE); + assert imm != null; + imm.hideSoftInputFromWindow(holder.status_add_reaction.getWindowToken(), 0); + }).setOnEmojiClickListener((emoji, imageView) -> { + String emojiStr = imageView.getUnicode(); + boolean alreadyAdded = false; + for(Reaction reaction: status.getReactions()){ + if( reaction.getName().compareTo(emojiStr) == 0){ + alreadyAdded = true; + reaction.setCount(reaction.getCount()-1); + if( reaction.getCount() == 0) { + status.getReactions().remove(reaction); + } + notifyStatusChanged(status); + break; + } + } + if( !alreadyAdded){ + Reaction reaction = new Reaction(); + reaction.setMe(true); + reaction.setCount(1); + reaction.setName(emojiStr); + status.getReactions().add(0, reaction); + notifyStatusChanged(status); + } + API.StatusAction statusAction = alreadyAdded?API.StatusAction.REMOVE_REACTION:API.StatusAction.ADD_REACTION; + new PostActionAsyncTask(context, statusAction, status.getId(), null,emojiStr, StatusListAdapter.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + }) + .build(holder.fake_edittext); + emojiPopup.toggle(); + }); + holder.status_add_custom_emoji.setOnClickListener(v -> { + SQLiteDatabase db = Sqlite.getInstance(context, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); + String instance = sharedpreferences.getString(Helper.PREF_INSTANCE, null); + Account account = new AccountDAO(context, db).getUniqAccount(userId, instance); + List emojis = new CustomEmojiDAO(context, db).getAllEmojis(account.getInstance()); + if (theme == Helper.THEME_DARK) { + style = R.style.DialogDark; + } else if (theme == Helper.THEME_BLACK) { + style = R.style.DialogBlack; + } else { + style = R.style.Dialog; + } + final AlertDialog.Builder builder = new AlertDialog.Builder(context, style); + int paddingPixel = 15; + float density = context.getResources().getDisplayMetrics().density; + int paddingDp = (int) (paddingPixel * density); + builder.setNegativeButton(R.string.cancel, (dialog, which) -> dialog.dismiss()); + builder.setTitle(R.string.insert_emoji); + if (emojis != null && emojis.size() > 0) { + GridView gridView = new GridView(context); + gridView.setAdapter(new CustomEmojiAdapter(emojis)); + gridView.setNumColumns(5); + gridView.setOnItemClickListener((parent, view, position, id) -> { + boolean alreadyAdded = false; + for(Reaction reaction: status.getReactions()){ + if( reaction.getName().compareTo(emojis.get(position).getShortcode()) == 0){ + alreadyAdded = true; + reaction.setCount(reaction.getCount()-1); + if( reaction.getCount() == 0) { + status.getReactions().remove(reaction); + } + notifyStatusChanged(status); + break; + } + } + if( !alreadyAdded){ + Reaction reaction = new Reaction(); + reaction.setMe(true); + reaction.setCount(1); + reaction.setName(emojis.get(position).getShortcode()); + reaction.setUrl(emojis.get(position).getUrl()); + status.getReactions().add(0, reaction); + notifyStatusChanged(status); + } + API.StatusAction statusAction = alreadyAdded?API.StatusAction.REMOVE_REACTION:API.StatusAction.ADD_REACTION; + new PostActionAsyncTask(context, statusAction, status.getId(), null, emojis.get(position).getShortcode(), StatusListAdapter.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + alertDialogEmoji.dismiss(); + }); + gridView.setPadding(paddingDp, paddingDp, paddingDp, paddingDp); + builder.setView(gridView); + } else { + TextView textView = new TextView(context); + textView.setText(context.getString(R.string.no_emoji)); + textView.setPadding(paddingDp, paddingDp, paddingDp, paddingDp); + builder.setView(textView); + } + alertDialogEmoji = builder.show(); + }); } holder.status_cardview_title.setTextColor(ContextCompat.getColor(context, R.color.dark_text_toot_header)); @@ -2073,7 +2176,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct sendToot(status, null); status.setShortReply(false); holder.quick_reply_container.setVisibility(View.GONE); - InputMethodManager imm = (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE); + InputMethodManager imm = (InputMethodManager) context.getSystemService(INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(holder.quick_reply_button.getWindowToken(), 0); }); @@ -2102,7 +2205,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct sendToot(status, contentType); status.setShortReply(false); holder.quick_reply_container.setVisibility(View.GONE); - InputMethodManager imm = (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE); + InputMethodManager imm = (InputMethodManager) context.getSystemService(INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(holder.quick_reply_button.getWindowToken(), 0); return false; }); @@ -2289,7 +2392,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct statusForQuickReply = status; holder.quick_reply_container.setVisibility(View.VISIBLE); InputMethodManager inputMethodManager = - (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); + (InputMethodManager) context.getSystemService(INPUT_METHOD_SERVICE); inputMethodManager.toggleSoftInputFromWindow( holder.quick_reply_text.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0); @@ -2401,7 +2504,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct } else { status.setShortReply(false); holder.quick_reply_container.setVisibility(View.GONE); - InputMethodManager imm = (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE); + InputMethodManager imm = (InputMethodManager) context.getSystemService(INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(holder.quick_reply_text.getWindowToken(), 0); } holder.quick_reply_switch_to_full.setOnClickListener(v12 -> { @@ -2433,7 +2536,7 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct if (status.isShortReply()) { status.setShortReply(false); holder.quick_reply_container.setVisibility(View.GONE); - InputMethodManager imm = (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE); + InputMethodManager imm = (InputMethodManager) context.getSystemService(INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(holder.quick_reply_text.getWindowToken(), 0); } } @@ -3986,8 +4089,9 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct TextView translation_label; LinearLayout status_reactions; - ImageView status_add_reaction; + ImageView status_add_reaction, status_add_custom_emoji; RecyclerView reactions_view; + MastalabAutoCompleteTextView fake_edittext; @SuppressLint("SetJavaScriptEnabled") ViewHolder(View itemView) { @@ -4119,7 +4223,9 @@ public class StatusListAdapter extends RecyclerView.Adapter implements OnPostAct status_reactions = itemView.findViewById(R.id.status_reactions); status_add_reaction = itemView.findViewById(R.id.status_add_reaction); + status_add_custom_emoji = itemView.findViewById(R.id.status_add_custom_emoji); reactions_view = itemView.findViewById(R.id.reactions_view); + fake_edittext = itemView.findViewById(R.id.fake_edittext); } public View getView() { diff --git a/app/src/main/java/app/fedilab/android/fragments/DisplayStatusFragment.java b/app/src/main/java/app/fedilab/android/fragments/DisplayStatusFragment.java index 48b1e13a5..07689333d 100644 --- a/app/src/main/java/app/fedilab/android/fragments/DisplayStatusFragment.java +++ b/app/src/main/java/app/fedilab/android/fragments/DisplayStatusFragment.java @@ -26,6 +26,7 @@ import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.view.LayoutInflater; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.InputMethodManager; @@ -46,6 +47,7 @@ import com.bumptech.glide.ListPreloader; import com.bumptech.glide.RequestBuilder; import com.bumptech.glide.integration.recyclerview.RecyclerViewPreloader; import com.bumptech.glide.util.FixedPreloadSizeProvider; +import com.google.android.material.navigation.NavigationView; import org.jetbrains.annotations.NotNull; @@ -59,15 +61,19 @@ import app.fedilab.android.R; import app.fedilab.android.activities.BaseMainActivity; import app.fedilab.android.activities.MainActivity; import app.fedilab.android.asynctasks.ManageListsAsyncTask; +import app.fedilab.android.asynctasks.PostActionAsyncTask; import app.fedilab.android.asynctasks.RetrieveFeedsAfterBookmarkAsyncTask; import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask; import app.fedilab.android.asynctasks.RetrieveMissingFeedsAsyncTask; import app.fedilab.android.asynctasks.RetrievePeertubeSearchAsyncTask; import app.fedilab.android.asynctasks.UpdateAccountInfoAsyncTask; +import app.fedilab.android.client.API; import app.fedilab.android.client.APIResponse; import app.fedilab.android.client.Entities.Account; +import app.fedilab.android.client.Entities.Announcement; import app.fedilab.android.client.Entities.Attachment; import app.fedilab.android.client.Entities.Conversation; +import app.fedilab.android.client.Entities.Error; import app.fedilab.android.client.Entities.Peertube; import app.fedilab.android.client.Entities.RemoteInstance; import app.fedilab.android.client.Entities.RetrieveFeedsParam; @@ -80,6 +86,7 @@ import app.fedilab.android.drawers.PixelfedListAdapter; import app.fedilab.android.drawers.StatusListAdapter; import app.fedilab.android.helper.Helper; import app.fedilab.android.interfaces.OnListActionInterface; +import app.fedilab.android.interfaces.OnPostActionInterface; import app.fedilab.android.interfaces.OnRetrieveFeedsAfterBookmarkInterface; import app.fedilab.android.interfaces.OnRetrieveFeedsInterface; import app.fedilab.android.interfaces.OnRetrieveMissingFeedsInterface; @@ -95,7 +102,7 @@ import es.dmoral.toasty.Toasty; * Created by Thomas on 24/04/2017. * Fragment to display content related to status */ -public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsInterface, OnRetrieveMissingFeedsInterface, OnRetrieveFeedsAfterBookmarkInterface, OnListActionInterface { +public class DisplayStatusFragment extends Fragment implements OnPostActionInterface, OnRetrieveFeedsInterface, OnRetrieveMissingFeedsInterface, OnRetrieveFeedsAfterBookmarkInterface, OnListActionInterface { private LinearLayoutManager mLayoutManager; @@ -602,8 +609,20 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn apiResponse.setStatuses(statusesConversations); }else if( type == RetrieveFeedsAsyncTask.Type.ANNOUNCEMENTS){ if( apiResponse.getAnnouncements() != null && apiResponse.getAnnouncements().size() > 0 ){ - List statusesAnnouncements = new ArrayList<>(apiResponse.getAnnouncements()); + List statusesAnnouncements = new ArrayList<>(); apiResponse.setStatuses(statusesAnnouncements); + for(Announcement announcement: apiResponse.getAnnouncements()){ + statusesAnnouncements.add(0,announcement); + if( !announcement.isRead()){ + new PostActionAsyncTask(context, API.StatusAction.DISMISS_ANNOUNCEMENT, announcement.getId(), DisplayStatusFragment.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } + } + } + final NavigationView navigationView = ((MainActivity)context).findViewById(R.id.nav_view); + MenuItem item = navigationView.getMenu().findItem(R.id.nav_announcements); + TextView actionView = item.getActionView().findViewById(R.id.counter); + if(actionView != null) { + actionView.setVisibility(View.GONE); } } int previousPosition = this.statuses.size(); @@ -1266,6 +1285,11 @@ public class DisplayStatusFragment extends Fragment implements OnRetrieveFeedsIn } } + @Override + public void onPostAction(int statusCode, API.StatusAction statusAction, String userId, Error error) { + + } + private class MyPreloadModelProvider implements ListPreloader.PreloadModelProvider { @Override diff --git a/app/src/main/res/drawable-v19/reaction_border.xml b/app/src/main/res/drawable-v19/reaction_border.xml index 4451631a8..5a220e417 100644 --- a/app/src/main/res/drawable-v19/reaction_border.xml +++ b/app/src/main/res/drawable-v19/reaction_border.xml @@ -3,5 +3,5 @@ - + diff --git a/app/src/main/res/drawable-v19/reaction_voted.xml b/app/src/main/res/drawable-v19/reaction_voted.xml index 5a220e417..19aed46b9 100644 --- a/app/src/main/res/drawable-v19/reaction_voted.xml +++ b/app/src/main/res/drawable-v19/reaction_voted.xml @@ -1,5 +1,6 @@ + diff --git a/app/src/main/res/drawable/reaction_border.xml b/app/src/main/res/drawable/reaction_border.xml index 5a220e417..03e7ccaec 100644 --- a/app/src/main/res/drawable/reaction_border.xml +++ b/app/src/main/res/drawable/reaction_border.xml @@ -2,6 +2,6 @@ + android:color="?colorAccent" /> diff --git a/app/src/main/res/drawable/reaction_voted.xml b/app/src/main/res/drawable/reaction_voted.xml index 03e7ccaec..267b58157 100644 --- a/app/src/main/res/drawable/reaction_voted.xml +++ b/app/src/main/res/drawable/reaction_voted.xml @@ -1,5 +1,6 @@ + diff --git a/app/src/main/res/layout/drawer_reaction.xml b/app/src/main/res/layout/drawer_reaction.xml index 387db94b8..7acab407c 100644 --- a/app/src/main/res/layout/drawer_reaction.xml +++ b/app/src/main/res/layout/drawer_reaction.xml @@ -15,17 +15,35 @@ see . --> + diff --git a/app/src/main/res/layout/drawer_status_compact.xml b/app/src/main/res/layout/drawer_status_compact.xml index 6d3ee69a4..762cf015e 100644 --- a/app/src/main/res/layout/drawer_status_compact.xml +++ b/app/src/main/res/layout/drawer_status_compact.xml @@ -865,24 +865,51 @@ android:id="@+id/status_reactions" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginTop="10dp" android:layout_marginBottom="10dp" android:orientation="horizontal" + android:layout_gravity="center" app:layout_constraintBottom_toBottomOf="parent"> + + + + + + . --> - \ No newline at end of file + android:layout_gravity="center" + android:gravity="center" + android:layout_height="match_parent"> + + +