Search in sources :

Example 1 with Reactions

use of com.odysee.app.model.Reactions in project odysee-android by OdyseeTeam.

the class FileViewFragment method loadComments.

private void loadComments() {
    Claim actualClaim = collectionClaimItem != null ? collectionClaimItem : fileClaim;
    View root = getView();
    if (root != null && actualClaim != null) {
        ProgressBar commentsLoading = root.findViewById(R.id.file_view_comments_progress);
        CommentListTask task = new CommentListTask(1, 200, actualClaim.getClaimId(), commentsLoading, new CommentListHandler() {

            @Override
            public void onSuccess(List<Comment> comments, boolean hasReachedEnd) {
                if (!comments.isEmpty()) {
                    // Load and process comments reactions on a different thread so main thread is not blocked
                    Helper.setViewVisibility(commentsLoading, View.VISIBLE);
                    new Thread(new Runnable() {

                        @Override
                        public void run() {
                            Map<String, Reactions> commentReactions = loadReactions(comments);
                            Activity activity = getActivity();
                            if (activity != null) {
                                activity.runOnUiThread(new Runnable() {

                                    @Override
                                    public void run() {
                                        Helper.setViewVisibility(commentsLoading, View.GONE);
                                        processCommentReactions(comments, commentReactions);
                                    }
                                });
                            }
                        }
                    }).start();
                }
            }

            @Override
            public void onError(Exception error) {
                if (error != null) {
                    error.printStackTrace();
                }
                checkNoComments();
            }

            private void processCommentReactions(List<Comment> comments, Map<String, Reactions> commentReactions) {
                for (Comment c : comments) {
                    if (commentReactions != null) {
                        c.setReactions(commentReactions.get(c.getId()));
                    } else {
                        c.setReactions(new Reactions(0, 0, false, false));
                    }
                }
                List<Comment> rootComments = new ArrayList<>();
                for (Comment c : comments) {
                    if (c.getParentId() == null) {
                        rootComments.add(c);
                    }
                }
                if (commentReactions != null) {
                    Collections.sort(rootComments, new Comparator<Comment>() {

                        @Override
                        public int compare(Comment o1, Comment o2) {
                            int o1SelfLiked = (Lbryio.isSignedIn() && o1.getReactions() != null && o1.getReactions().isLiked()) ? 1 : 0;
                            int o2SelfLiked = (Lbryio.isSignedIn() && o2.getReactions() != null && o2.getReactions().isLiked()) ? 1 : 0;
                            int o1OtherLikes = o1.getReactions() != null ? o1.getReactions().getOthersLikes() : 0;
                            int o2OtherLikes = o2.getReactions() != null ? o2.getReactions().getOthersLikes() : 0;
                            return (o2OtherLikes + o2SelfLiked) - (o1OtherLikes + o1SelfLiked);
                        }
                    });
                }
                // Direct comments are now sorted by their amount of likes. We can now pick the
                // one to be displayed as the collapsed single comment.
                Comment singleComment = rootComments.get(0);
                TextView commentText = singleCommentRoot.findViewById(R.id.comment_text);
                ImageView thumbnailView = singleCommentRoot.findViewById(R.id.comment_thumbnail);
                View noThumbnailView = singleCommentRoot.findViewById(R.id.comment_no_thumbnail);
                TextView alphaView = singleCommentRoot.findViewById(R.id.comment_thumbnail_alpha);
                commentText.setText(singleComment.getText());
                commentText.setMaxLines(3);
                commentText.setEllipsize(TextUtils.TruncateAt.END);
                commentText.setClickable(true);
                commentText.setTextIsSelectable(false);
                boolean hasThumbnail = singleComment.getPoster() != null && !Helper.isNullOrEmpty(singleComment.getPoster().getThumbnailUrl());
                thumbnailView.setVisibility(hasThumbnail ? View.VISIBLE : View.INVISIBLE);
                noThumbnailView.setVisibility(!hasThumbnail ? View.VISIBLE : View.INVISIBLE);
                int bgColor = Helper.generateRandomColorForValue(singleComment.getChannelId());
                Helper.setIconViewBackgroundColor(noThumbnailView, bgColor, false, getContext());
                if (hasThumbnail) {
                    Context ctx = getContext();
                    if (ctx != null) {
                        Context appCtx = ctx.getApplicationContext();
                        Glide.with(appCtx).asBitmap().load(singleComment.getPoster().getThumbnailUrl()).apply(RequestOptions.circleCropTransform()).into(thumbnailView);
                    }
                }
                alphaView.setText(singleComment.getChannelName() != null ? singleComment.getChannelName().substring(1, 2).toUpperCase() : null);
                singleCommentRoot.findViewById(R.id.comment_actions_area).setVisibility(View.GONE);
                singleCommentRoot.findViewById(R.id.comment_time).setVisibility(View.GONE);
                singleCommentRoot.findViewById(R.id.comment_channel_name).setVisibility(View.GONE);
                singleCommentRoot.findViewById(R.id.comment_more_options).setVisibility(View.GONE);
                singleCommentRoot.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        expandButton.performClick();
                    }
                });
                List<Comment> parentComments = rootComments;
                // rootComments.clear();
                for (Comment c : comments) {
                    if (!parentComments.contains(c)) {
                        if (c.getParentId() != null) {
                            Comment item = parentComments.stream().filter(v -> c.getParentId().equalsIgnoreCase(v.getId())).findFirst().orElse(null);
                            if (item != null) {
                                parentComments.add(parentComments.indexOf(item) + 1, c);
                            }
                        }
                    }
                }
                comments = parentComments;
                Context ctx = getContext();
                View root = getView();
                if (ctx != null && root != null) {
                    ensureCommentListAdapterCreated(comments);
                }
            }
        });
        task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
    }
}
Also used : Bundle(android.os.Bundle) ProgressBar(android.widget.ProgressBar) NonNull(androidx.annotation.NonNull) LbryRequestException(com.odysee.app.exceptions.LbryRequestException) ChannelCreateDialogFragment(com.odysee.app.ui.channel.ChannelCreateDialogFragment) JSONException(org.json.JSONException) Future(java.util.concurrent.Future) Handler(android.os.Handler) Map(java.util.Map) Search(com.odysee.app.callable.Search) CreateSupportDialogFragment(com.odysee.app.dialog.CreateSupportDialogFragment) SimpleCache(com.google.android.exoplayer2.upstream.cache.SimpleCache) ContextCompat(androidx.core.content.ContextCompat) Log(android.util.Log) C(com.google.android.exoplayer2.C) ConnectivityManager(android.net.ConnectivityManager) Request(okhttp3.Request) Account(android.accounts.Account) AbandonHandler(com.odysee.app.tasks.claim.AbandonHandler) Helper(com.odysee.app.utils.Helper) Lbryio(com.odysee.app.utils.Lbryio) CommentListHandler(com.odysee.app.tasks.CommentListHandler) CommentItemDecoration(com.odysee.app.adapter.CommentItemDecoration) UrlSuggestion(com.odysee.app.model.UrlSuggestion) SolidIconView(com.odysee.app.ui.controls.SolidIconView) ClaimRewardTask(com.odysee.app.tasks.lbryinc.ClaimRewardTask) PlaybackParameters(com.google.android.exoplayer2.PlaybackParameters) ReadTextFileTask(com.odysee.app.tasks.ReadTextFileTask) PlayerView(com.google.android.exoplayer2.ui.PlayerView) LbryUriException(com.odysee.app.exceptions.LbryUriException) Supplier(java.util.function.Supplier) LinkedHashMap(java.util.LinkedHashMap) ExoPlayer(com.google.android.exoplayer2.ExoPlayer) WebSettings(android.webkit.WebSettings) WebResourceRequest(android.webkit.WebResourceRequest) Comment(com.odysee.app.model.Comment) ScheduledExecutorService(java.util.concurrent.ScheduledExecutorService) LbryUri(com.odysee.app.utils.LbryUri) Response(okhttp3.Response) InlineChannelSpinnerAdapter(com.odysee.app.adapter.InlineChannelSpinnerAdapter) ClaimSearchResultHandler(com.odysee.app.tasks.claim.ClaimSearchResultHandler) Predefined(com.odysee.app.utils.Predefined) IOException(java.io.IOException) ExecutionException(java.util.concurrent.ExecutionException) OkHttpClient(okhttp3.OkHttpClient) SharedPreferences(android.content.SharedPreferences) PreferenceManager(androidx.preference.PreferenceManager) TagListAdapter(com.odysee.app.adapter.TagListAdapter) ImageButton(android.widget.ImageButton) LinearLayout(android.widget.LinearLayout) NestedScrollView(androidx.core.widget.NestedScrollView) FileListTask(com.odysee.app.tasks.file.FileListTask) ChannelSubscribeTask(com.odysee.app.tasks.lbryinc.ChannelSubscribeTask) WindowManager(android.view.WindowManager) Player(com.google.android.exoplayer2.Player) CustomTabsIntent(androidx.browser.customtabs.CustomTabsIntent) JSONObject(org.json.JSONObject) ActivityInfo(android.content.pm.ActivityInfo) WebViewClient(android.webkit.WebViewClient) AdapterView(android.widget.AdapterView) RecyclerView(androidx.recyclerview.widget.RecyclerView) Reactions(com.odysee.app.model.Reactions) MediaSource(com.google.android.exoplayer2.source.MediaSource) BufferEventTask(com.odysee.app.tasks.BufferEventTask) MediaItem(com.google.android.exoplayer2.MediaItem) AsyncTask(android.os.AsyncTask) DeleteFileTask(com.odysee.app.tasks.file.DeleteFileTask) TrackGroup(com.google.android.exoplayer2.source.TrackGroup) LbryResponseException(com.odysee.app.exceptions.LbryResponseException) ScheduledThreadPoolExecutor(java.util.concurrent.ScheduledThreadPoolExecutor) GenericTaskHandler(com.odysee.app.tasks.GenericTaskHandler) TrackSelectionOverrides(com.google.android.exoplayer2.trackselection.TrackSelectionOverrides) Claim(com.odysee.app.model.Claim) PorterDuff(android.graphics.PorterDuff) DisplayMetrics(android.util.DisplayMetrics) WebViewFeature(androidx.webkit.WebViewFeature) Objects(java.util.Objects) Nullable(org.jetbrains.annotations.Nullable) CommentListTask(com.odysee.app.tasks.CommentListTask) DefaultHttpDataSource(com.google.android.exoplayer2.upstream.DefaultHttpDataSource) LeastRecentlyUsedCacheEvictor(com.google.android.exoplayer2.upstream.cache.LeastRecentlyUsedCacheEvictor) TextInputEditText(com.google.android.material.textfield.TextInputEditText) AlertDialog(androidx.appcompat.app.AlertDialog) AbandonStreamTask(com.odysee.app.tasks.claim.AbandonStreamTask) ResolveTask(com.odysee.app.tasks.claim.ResolveTask) ProgressiveMediaSource(com.google.android.exoplayer2.source.ProgressiveMediaSource) ClaimListResultHandler(com.odysee.app.tasks.claim.ClaimListResultHandler) Lbry(com.odysee.app.utils.Lbry) CompletableFuture(java.util.concurrent.CompletableFuture) MenuItem(android.view.MenuItem) InputMethodManager(android.view.inputmethod.InputMethodManager) LighthouseSearch(com.odysee.app.callable.LighthouseSearch) MaterialButton(com.google.android.material.button.MaterialButton) LbryioRequestException(com.odysee.app.exceptions.LbryioRequestException) Build(android.os.Build) ExecutorService(java.util.concurrent.ExecutorService) LbryioResponseException(com.odysee.app.exceptions.LbryioResponseException) CustomTabColorSchemeParams(androidx.browser.customtabs.CustomTabColorSchemeParams) ApiCallException(com.odysee.app.exceptions.ApiCallException) LayoutInflater(android.view.LayoutInflater) PhotoView(com.github.chrisbanes.photoview.PhotoView) Tag(com.odysee.app.model.Tag) DecimalFormat(java.text.DecimalFormat) ClaimListAdapter(com.odysee.app.adapter.ClaimListAdapter) Color(android.graphics.Color) Fee(com.odysee.app.model.Fee) Base64(android.util.Base64) LbryAnalytics(com.odysee.app.utils.LbryAnalytics) Comparator(java.util.Comparator) Activity(android.app.Activity) AttributeProviderFactory(org.commonmark.renderer.html.AttributeProviderFactory) R(com.odysee.app.R) ClaimSearchTask(com.odysee.app.tasks.claim.ClaimSearchTask) Arrays(java.util.Arrays) Uri(android.net.Uri) ImageView(android.widget.ImageView) AppCompatSpinner(androidx.appcompat.widget.AppCompatSpinner) Parser(org.commonmark.parser.Parser) Manifest(android.Manifest) Looper(android.os.Looper) WebSettingsCompat(androidx.webkit.WebSettingsCompat) AccountManager(android.accounts.AccountManager) DefaultLoadErrorHandlingPolicy(com.google.android.exoplayer2.upstream.DefaultLoadErrorHandlingPolicy) TrackGroupInfo(com.google.android.exoplayer2.TracksInfo.TrackGroupInfo) Executors(java.util.concurrent.Executors) ReactToComment(com.odysee.app.runnable.ReactToComment) StringRes(androidx.annotation.StringRes) ClaimCacheKey(com.odysee.app.model.ClaimCacheKey) PurchaseListTask(com.odysee.app.tasks.claim.PurchaseListTask) ConstraintLayout(androidx.constraintlayout.widget.ConstraintLayout) Subscription(com.odysee.app.model.lbryinc.Subscription) DefaultExtractorsFactory(com.google.android.exoplayer2.extractor.DefaultExtractorsFactory) StoragePermissionListener(com.odysee.app.listener.StoragePermissionListener) LinearLayoutManager(androidx.recyclerview.widget.LinearLayoutManager) TextWatcher(android.text.TextWatcher) HlsMediaSource(com.google.android.exoplayer2.source.hls.HlsMediaSource) GestureDetector(android.view.GestureDetector) FetchClaimsListener(com.odysee.app.listener.FetchClaimsListener) FlexboxLayoutManager(com.google.android.flexbox.FlexboxLayoutManager) Callable(java.util.concurrent.Callable) GetFileTask(com.odysee.app.tasks.file.GetFileTask) Editable(android.text.Editable) NumberFormat(java.text.NumberFormat) ScreenOrientationListener(com.odysee.app.listener.ScreenOrientationListener) ArrayList(java.util.ArrayList) Node(org.commonmark.node.Node) PIPModeListener(com.odysee.app.listener.PIPModeListener) Code(org.commonmark.node.Code) RequestOptions(com.bumptech.glide.request.RequestOptions) CommentListAdapter(com.odysee.app.adapter.CommentListAdapter) TextUtils(android.text.TextUtils) AnyThread(androidx.annotation.AnyThread) AttributeProviderContext(org.commonmark.renderer.html.AttributeProviderContext) File(java.io.File) TracksInfo(com.google.android.exoplayer2.TracksInfo) DownloadActionListener(com.odysee.app.listener.DownloadActionListener) HtmlRenderer(org.commonmark.renderer.html.HtmlRenderer) Configuration(android.content.res.Configuration) Util(com.google.android.exoplayer2.util.Util) DateUtils(android.text.format.DateUtils) ScheduledFuture(java.util.concurrent.ScheduledFuture) ClaimListTask(com.odysee.app.tasks.claim.ClaimListTask) LinkMovementMethod(android.text.method.LinkMovementMethod) CommentCreateTask(com.odysee.app.tasks.CommentCreateTask) Comments(com.odysee.app.utils.Comments) CommentEnabledCheck(com.odysee.app.checkers.CommentEnabledCheck) View(android.view.View) WebView(android.webkit.WebView) OdyseeCollection(com.odysee.app.model.OdyseeCollection) HtmlCompat(androidx.core.text.HtmlCompat) ViewGroup(android.view.ViewGroup) List(java.util.List) TextView(android.widget.TextView) Reward(com.odysee.app.model.lbryinc.Reward) BaseFragment(com.odysee.app.ui.BaseFragment) RelativeLayout(android.widget.RelativeLayout) NotNull(org.jetbrains.annotations.NotNull) AudioAttributes(com.google.android.exoplayer2.audio.AudioAttributes) Snackbar(com.google.android.material.snackbar.Snackbar) Typeface(android.graphics.Typeface) Context(android.content.Context) ContextMenu(android.view.ContextMenu) ExoDatabaseProvider(com.google.android.exoplayer2.database.ExoDatabaseProvider) Intent(android.content.Intent) HashMap(java.util.HashMap) SuppressLint(android.annotation.SuppressLint) MainActivity(com.odysee.app.MainActivity) MotionEvent(android.view.MotionEvent) LbryFile(com.odysee.app.model.LbryFile) DialogInterface(android.content.DialogInterface) BuildCommentReactOptions(com.odysee.app.callable.BuildCommentReactOptions) CacheDataSource(com.google.android.exoplayer2.upstream.cache.CacheDataSource) AttributeProvider(org.commonmark.renderer.html.AttributeProvider) Iterator(java.util.Iterator) FetchStatCountTask(com.odysee.app.tasks.lbryinc.FetchStatCountTask) TimeUnit(java.util.concurrent.TimeUnit) Glide(com.bumptech.glide.Glide) TrackSelectionOverride(com.google.android.exoplayer2.trackselection.TrackSelectionOverrides.TrackSelectionOverride) Collections(java.util.Collections) RepostClaimDialogFragment(com.odysee.app.dialog.RepostClaimDialogFragment) Reactions(com.odysee.app.model.Reactions) Activity(android.app.Activity) MainActivity(com.odysee.app.MainActivity) Comparator(java.util.Comparator) ArrayList(java.util.ArrayList) List(java.util.List) TextView(android.widget.TextView) ImageView(android.widget.ImageView) ProgressBar(android.widget.ProgressBar) TrackSelectionOverride(com.google.android.exoplayer2.trackselection.TrackSelectionOverrides.TrackSelectionOverride) AttributeProviderContext(org.commonmark.renderer.html.AttributeProviderContext) Context(android.content.Context) Comment(com.odysee.app.model.Comment) ReactToComment(com.odysee.app.runnable.ReactToComment) SolidIconView(com.odysee.app.ui.controls.SolidIconView) PlayerView(com.google.android.exoplayer2.ui.PlayerView) NestedScrollView(androidx.core.widget.NestedScrollView) AdapterView(android.widget.AdapterView) RecyclerView(androidx.recyclerview.widget.RecyclerView) PhotoView(com.github.chrisbanes.photoview.PhotoView) ImageView(android.widget.ImageView) View(android.view.View) WebView(android.webkit.WebView) TextView(android.widget.TextView) LbryRequestException(com.odysee.app.exceptions.LbryRequestException) JSONException(org.json.JSONException) LbryUriException(com.odysee.app.exceptions.LbryUriException) IOException(java.io.IOException) ExecutionException(java.util.concurrent.ExecutionException) LbryResponseException(com.odysee.app.exceptions.LbryResponseException) LbryioRequestException(com.odysee.app.exceptions.LbryioRequestException) LbryioResponseException(com.odysee.app.exceptions.LbryioResponseException) ApiCallException(com.odysee.app.exceptions.ApiCallException) SuppressLint(android.annotation.SuppressLint) AnyThread(androidx.annotation.AnyThread) CommentListHandler(com.odysee.app.tasks.CommentListHandler) CommentListTask(com.odysee.app.tasks.CommentListTask) Map(java.util.Map) LinkedHashMap(java.util.LinkedHashMap) HashMap(java.util.HashMap) Claim(com.odysee.app.model.Claim)

Example 2 with Reactions

use of com.odysee.app.model.Reactions in project odysee-android by OdyseeTeam.

the class FileViewFragment method getMyReactions.

@Nullable
private Reactions getMyReactions(JSONObject jsonResult, JSONObject responseOthersReactions, String key) throws JSONException {
    JSONObject value = (JSONObject) responseOthersReactions.get(key);
    Reactions reactions = getReactionsForValue(value);
    if (jsonResult.has("my_reactions")) {
        JSONObject responseMyReactions = jsonResult.getJSONObject("my_reactions");
        if (responseMyReactions.has(key) && reactions != null) {
            JSONObject myReaction = (JSONObject) responseMyReactions.get(key);
            reactions.setLiked(myReaction.getInt("like") > 0);
            reactions.setDisliked(myReaction.getInt("dislike") > 0);
        }
    }
    return reactions;
}
Also used : JSONObject(org.json.JSONObject) Reactions(com.odysee.app.model.Reactions) Nullable(org.jetbrains.annotations.Nullable)

Example 3 with Reactions

use of com.odysee.app.model.Reactions in project odysee-android by OdyseeTeam.

the class FileViewFragment method loadReactions.

private Map<String, Reactions> loadReactions(List<Comment> comments) {
    List<String> commentIds = new ArrayList<>();
    for (Comment c : comments) {
        commentIds.add(c.getId());
    }
    ExecutorService executor = Executors.newSingleThreadExecutor();
    Future<Map<String, Reactions>> future = executor.submit(() -> {
        Comments.checkCommentsEndpointStatus();
        JSONObject jsonParams = new JSONObject();
        jsonParams.put("comment_ids", TextUtils.join(",", commentIds));
        AccountManager am = AccountManager.get(getContext());
        Account odyseeAccount = Helper.getOdyseeAccount(am.getAccounts());
        if (odyseeAccount != null) {
            jsonParams.put("auth_token", am.peekAuthToken(odyseeAccount, "auth_token_type"));
        }
        if (!Lbry.ownChannels.isEmpty()) {
            jsonParams.put("channel_id", Lbry.ownChannels.get(0).getClaimId());
            jsonParams.put("channel_name", Lbry.ownChannels.get(0).getName());
            try {
                JSONObject jsonChannelSign = Comments.channelSignName(jsonParams, jsonParams.getString("channel_id"), jsonParams.getString("channel_name"));
                if (jsonChannelSign.has("signature") && jsonChannelSign.has("signing_ts")) {
                    jsonParams.put("signature", jsonChannelSign.getString("signature"));
                    jsonParams.put("signing_ts", jsonChannelSign.getString("signing_ts"));
                }
            } catch (ApiCallException | JSONException e) {
                e.printStackTrace();
            }
        }
        Map<String, Reactions> result = new HashMap<>();
        try {
            Response response = Comments.performRequest(jsonParams, "reaction.List");
            String responseString = response.body().string();
            response.close();
            JSONObject jsonResponse = new JSONObject(responseString);
            if (jsonResponse.has("result")) {
                JSONObject jsonResult = jsonResponse.getJSONObject("result");
                if (jsonResult.has("others_reactions")) {
                    JSONObject responseOthersReactions = jsonResult.getJSONObject("others_reactions");
                    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
                        responseOthersReactions.keys().forEachRemaining(key -> {
                            try {
                                result.put(key, getMyReactions(jsonResult, responseOthersReactions, key));
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                        });
                    } else {
                        // Android versions prior to API 24 lack forEachRemaining()
                        Iterator<String> itr = responseOthersReactions.keys();
                        while (itr.hasNext()) {
                            try {
                                String nextKey = itr.next();
                                result.put(nextKey, getMyReactions(jsonResult, responseOthersReactions, nextKey));
                            } catch (JSONException e) {
                                Log.e(TAG, "loadReactions for Comment: ".concat(e.getLocalizedMessage()));
                            }
                        }
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    });
    try {
        return future.get();
    } catch (InterruptedException | ExecutionException e) {
        e.printStackTrace();
        return null;
    }
}
Also used : Comment(com.odysee.app.model.Comment) ReactToComment(com.odysee.app.runnable.ReactToComment) Account(android.accounts.Account) ApiCallException(com.odysee.app.exceptions.ApiCallException) LinkedHashMap(java.util.LinkedHashMap) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) Reactions(com.odysee.app.model.Reactions) JSONException(org.json.JSONException) IOException(java.io.IOException) Response(okhttp3.Response) JSONObject(org.json.JSONObject) ScheduledExecutorService(java.util.concurrent.ScheduledExecutorService) ExecutorService(java.util.concurrent.ExecutorService) AccountManager(android.accounts.AccountManager) ExecutionException(java.util.concurrent.ExecutionException) Map(java.util.Map) LinkedHashMap(java.util.LinkedHashMap) HashMap(java.util.HashMap)

Example 4 with Reactions

use of com.odysee.app.model.Reactions in project odysee-android by OdyseeTeam.

the class CommentListAdapter method onBindViewHolder.

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    Comment comment = items.get(position);
    switchViewReplies(comment, (TextView) holder.viewReplies);
    ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();
    if (collapsed || (comment.getParentId() != null && !childsToBeShown.contains(comment.getParentId()))) {
        holder.itemView.setVisibility(View.GONE);
        lp.height = 0;
        lp.width = 0;
        holder.itemView.setLayoutParams(lp);
    } else {
        if (comment.getParentId() == null || (comment.getParentId() != null && childsToBeShown.contains(comment.getParentId()))) {
            lp.height = ViewGroup.LayoutParams.WRAP_CONTENT;
            lp.width = ViewGroup.LayoutParams.MATCH_PARENT;
            holder.itemView.setLayoutParams(lp);
            holder.itemView.setVisibility(View.VISIBLE);
        }
    }
    holder.comment = comment;
    holder.blockChannelView.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            Claim channel = comment.getPoster();
            if (channel != null) {
                if (context instanceof MainActivity) {
                    ((MainActivity) context).handleBlockChannel(channel);
                }
            }
        }
    });
    if (CommentAction.areAnyActionsAvailable(comment, claim)) {
        holder.moreOptionsView.setVisibility(collapsed ? View.INVISIBLE : View.VISIBLE);
        holder.moreOptionsView.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                view.showContextMenu();
            }
        });
    } else {
        holder.moreOptionsView.setVisibility(View.INVISIBLE);
        holder.moreOptionsView.setOnClickListener(null);
    }
    holder.channelName.setText(comment.getChannelName());
    holder.commentTimeView.setText(DateUtils.getRelativeTimeSpanString((comment.getTimestamp() * 1000), System.currentTimeMillis(), 0, DateUtils.FORMAT_ABBREV_RELATIVE));
    holder.commentText.setText(comment.getText());
    Reactions commentReactions = comment.getReactions();
    if (commentReactions != null) {
        int countTextColor;
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {
            countTextColor = context.getResources().getColor(R.color.foreground, null);
        } else {
            countTextColor = context.getResources().getColor(R.color.foreground);
        }
        String likesAmount = String.valueOf(commentReactions.getOthersLikes());
        String dislikesAmount = String.valueOf(commentReactions.getOthersDislikes());
        if (commentReactions.isLiked()) {
            int fireActive;
            if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {
                fireActive = context.getResources().getColor(R.color.fireActive, null);
            } else {
                fireActive = context.getResources().getColor(R.color.fireActive);
            }
            holder.likesCount.setText(String.valueOf(Integer.parseInt(likesAmount) + 1));
            holder.likesCount.setTextColor(fireActive);
            for (Drawable d : holder.likesCount.getCompoundDrawablesRelative()) {
                if (d != null) {
                    d.setColorFilter(new PorterDuffColorFilter(ContextCompat.getColor(holder.likesCount.getContext(), R.color.fireActive), PorterDuff.Mode.SRC_IN));
                }
            }
        } else {
            holder.likesCount.setText(likesAmount);
            holder.likesCount.setTextColor(countTextColor);
            for (Drawable d : holder.likesCount.getCompoundDrawablesRelative()) {
                if (d != null) {
                    d.setColorFilter(new PorterDuffColorFilter(ContextCompat.getColor(holder.likesCount.getContext(), R.color.foreground), PorterDuff.Mode.SRC_IN));
                }
            }
        }
        if (commentReactions.isDisliked()) {
            int slimeActive;
            if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {
                slimeActive = context.getResources().getColor(R.color.slimeActive, null);
            } else {
                slimeActive = context.getResources().getColor(R.color.slimeActive);
            }
            holder.dislikesCount.setText(String.valueOf(Integer.parseInt(dislikesAmount) + 1));
            holder.dislikesCount.setTextColor(slimeActive);
            for (Drawable d : holder.dislikesCount.getCompoundDrawablesRelative()) {
                if (d != null) {
                    d.setColorFilter(new PorterDuffColorFilter(ContextCompat.getColor(holder.dislikesCount.getContext(), R.color.slimeActive), PorterDuff.Mode.SRC_IN));
                }
            }
        } else {
            holder.dislikesCount.setText(dislikesAmount);
            holder.dislikesCount.setTextColor(countTextColor);
            for (Drawable d : holder.dislikesCount.getCompoundDrawablesRelative()) {
                if (d != null) {
                    d.setColorFilter(new PorterDuffColorFilter(ContextCompat.getColor(holder.dislikesCount.getContext(), R.color.foreground), PorterDuff.Mode.SRC_IN));
                }
            }
        }
    }
    holder.likesCount.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            AccountManager am = AccountManager.get(context);
            Account odyseeAccount = Helper.getOdyseeAccount(am.getAccounts());
            if (odyseeAccount != null && comment.getClaimId() != null && commentListListener != null) {
                commentListListener.onCommentReactClicked(comment, true);
            }
        }
    });
    holder.dislikesCount.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            AccountManager am = AccountManager.get(context);
            Account odyseeAccount = Helper.getOdyseeAccount(am.getAccounts());
            if (odyseeAccount != null && comment.getClaimId() != null && commentListListener != null) {
                commentListListener.onCommentReactClicked(comment, false);
            }
        }
    });
    boolean hasThumbnail = comment.getPoster() != null && !Helper.isNullOrEmpty(comment.getPoster().getThumbnailUrl());
    holder.thumbnailView.setVisibility(hasThumbnail ? View.VISIBLE : View.INVISIBLE);
    holder.noThumbnailView.setVisibility(!hasThumbnail ? View.VISIBLE : View.INVISIBLE);
    int bgColor = Helper.generateRandomColorForValue(comment.getChannelId());
    Helper.setIconViewBackgroundColor(holder.noThumbnailView, bgColor, false, context);
    if (hasThumbnail) {
        Glide.with(context.getApplicationContext()).asBitmap().load(comment.getPoster().getThumbnailUrl(holder.thumbnailView.getLayoutParams().width, holder.thumbnailView.getLayoutParams().height, 85)).apply(RequestOptions.circleCropTransform()).into(holder.thumbnailView);
    }
    holder.alphaView.setText(comment.getChannelName() != null ? comment.getChannelName().substring(1, 2).toUpperCase() : null);
    holder.channelName.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            if (listener != null && comment.getPoster() != null) {
                listener.onClaimClicked(comment.getPoster(), position);
            }
        }
    });
    holder.replyLink.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            if (commentListListener != null) {
                commentListListener.onReplyClicked(comment);
            }
        }
    });
    if (position != (items.size() - 1)) {
        String pId = items.get(position + 1).getParentId();
        if (pId != null && pId.equalsIgnoreCase(comment.getId())) {
            holder.viewReplies.setVisibility(View.VISIBLE);
            holder.viewReplies.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    switchRepliesVisibility(comment.getId());
                    switchViewReplies(comment, (TextView) holder.viewReplies);
                }
            });
        } else {
            holder.viewReplies.setVisibility(View.GONE);
        }
    } else {
        holder.viewReplies.setVisibility(View.GONE);
    }
}
Also used : Comment(com.odysee.app.model.Comment) Account(android.accounts.Account) ViewGroup(android.view.ViewGroup) Reactions(com.odysee.app.model.Reactions) Drawable(android.graphics.drawable.Drawable) PorterDuffColorFilter(android.graphics.PorterDuffColorFilter) MainActivity(com.odysee.app.MainActivity) ImageView(android.widget.ImageView) View(android.view.View) RecyclerView(androidx.recyclerview.widget.RecyclerView) TextView(android.widget.TextView) AccountManager(android.accounts.AccountManager) TextView(android.widget.TextView) Claim(com.odysee.app.model.Claim)

Example 5 with Reactions

use of com.odysee.app.model.Reactions in project odysee-android by OdyseeTeam.

the class FileViewFragment method loadReactions.

private void loadReactions(Claim c) {
    if (scheduledExecutor == null) {
        scheduledExecutor = new ScheduledThreadPoolExecutor(1);
    }
    if (futureReactions != null)
        futureReactions.cancel(true);
    if (reactions == null)
        reactions = new Reactions();
    Runnable runnable = () -> {
        Map<String, String> options = new HashMap<>();
        options.put("claim_ids", c.getClaimId());
        JSONObject data;
        try {
            data = (JSONObject) Lbryio.parseResponse(Lbryio.call("reaction", "list", options, Helper.METHOD_POST, getContext()));
            if (data != null && data.has("others_reactions")) {
                JSONObject othersReactions = (JSONObject) data.get("others_reactions");
                if (othersReactions.has(c.getClaimId())) {
                    int likesFromOthers = ((JSONObject) othersReactions.get(c.getClaimId())).getInt("like");
                    int dislikesFromOthers = ((JSONObject) othersReactions.get(c.getClaimId())).getInt("dislike");
                    reactions.setOthersLikes(likesFromOthers);
                    reactions.setOthersDislikes(dislikesFromOthers);
                }
            }
            if (data != null && data.has("my_reactions")) {
                JSONObject othersReactions = (JSONObject) data.get("my_reactions");
                if (othersReactions.has(c.getClaimId())) {
                    int likes = ((JSONObject) othersReactions.get(c.getClaimId())).getInt("like");
                    reactions.setLiked(likes > 0);
                    c.setLiked(likes > 0);
                    int dislikes = ((JSONObject) othersReactions.get(c.getClaimId())).getInt("dislike");
                    reactions.setDisliked(dislikes > 0);
                    c.setDisliked(dislikes > 0);
                }
            }
            updateContentReactions();
        } catch (LbryioRequestException | LbryioResponseException | JSONException e) {
            e.printStackTrace();
        }
    };
    futureReactions = scheduledExecutor.scheduleAtFixedRate(runnable, 0, 5, TimeUnit.SECONDS);
}
Also used : JSONObject(org.json.JSONObject) ScheduledThreadPoolExecutor(java.util.concurrent.ScheduledThreadPoolExecutor) Reactions(com.odysee.app.model.Reactions) Map(java.util.Map) LinkedHashMap(java.util.LinkedHashMap) HashMap(java.util.HashMap)

Aggregations

Reactions (com.odysee.app.model.Reactions)4 Account (android.accounts.Account)3 AccountManager (android.accounts.AccountManager)3 JSONObject (org.json.JSONObject)3 View (android.view.View)2 ViewGroup (android.view.ViewGroup)2 Comment (com.odysee.app.model.Comment)2 HashMap (java.util.HashMap)2 LinkedHashMap (java.util.LinkedHashMap)2 Map (java.util.Map)2 Manifest (android.Manifest)1 SuppressLint (android.annotation.SuppressLint)1 Activity (android.app.Activity)1 Context (android.content.Context)1 DialogInterface (android.content.DialogInterface)1 Intent (android.content.Intent)1 SharedPreferences (android.content.SharedPreferences)1 ActivityInfo (android.content.pm.ActivityInfo)1 Configuration (android.content.res.Configuration)1 Color (android.graphics.Color)1