Search in sources :

Example 6 with LbryUri

use of com.odysee.app.utils.LbryUri in project odysee-android by OdyseeTeam.

the class SignInActivity method loadSharedUserStateAndFinish.

private void loadSharedUserStateAndFinish() {
    // load the shared user state after wallet sync is done
    LoadSharedUserStateTask loadTask = new LoadSharedUserStateTask(SignInActivity.this, new LoadSharedUserStateTask.LoadSharedUserStateHandler() {

        @Override
        public void onSuccess(List<Subscription> subscriptions, List<Tag> followedTags, List<LbryUri> blockedChannels) {
            Lbryio.subscriptions = new ArrayList<>(subscriptions);
            Lbryio.blockedChannels = new ArrayList<>(blockedChannels);
            finishSignInActivity();
        }

        @Override
        public void onError(Exception error) {
            // shouldn't happen, but if it does, finish anyway
            finishSignInActivity();
        }
    }, Lbryio.AUTH_TOKEN);
    loadTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
Also used : LoadSharedUserStateTask(com.odysee.app.tasks.wallet.LoadSharedUserStateTask) ArrayList(java.util.ArrayList) Tag(com.odysee.app.model.Tag) Subscription(com.odysee.app.model.lbryinc.Subscription) LbryUri(com.odysee.app.utils.LbryUri) LbryioRequestException(com.odysee.app.exceptions.LbryioRequestException) LbryioResponseException(com.odysee.app.exceptions.LbryioResponseException) ExecutionException(java.util.concurrent.ExecutionException)

Example 7 with LbryUri

use of com.odysee.app.utils.LbryUri in project odysee-android by OdyseeTeam.

the class LoadSharedUserStateTask method loadSubscriptionsFromSharedUserState.

public static List<Subscription> loadSubscriptionsFromSharedUserState(JSONObject shared) {
    List<Subscription> subscriptions = new ArrayList<>();
    try {
        JSONObject value = shared.getJSONObject("value");
        JSONArray subscriptionUrls = value.has("subscriptions") && !value.isNull("subscriptions") ? value.getJSONArray("subscriptions") : null;
        JSONArray following = value.has("following") && !value.isNull("following") ? value.getJSONArray("following") : null;
        if (subscriptionUrls != null) {
            subscriptions = new ArrayList<>();
            for (int i = 0; i < subscriptionUrls.length(); i++) {
                String url = subscriptionUrls.getString(i);
                try {
                    LbryUri uri = LbryUri.parse(LbryUri.normalize(url));
                    Subscription subscription = new Subscription();
                    subscription.setChannelName(uri.getChannelName());
                    subscription.setUrl(uri.toString());
                    subscription.setNotificationsDisabled(isNotificationsDisabledForSubUrl(uri.toString(), following));
                    subscriptions.add(subscription);
                } catch (LbryUriException | SQLiteException ex) {
                // pass
                }
            }
        }
    } catch (JSONException ex) {
    // pass
    }
    return subscriptions;
}
Also used : ArrayList(java.util.ArrayList) JSONArray(org.json.JSONArray) JSONException(org.json.JSONException) SQLiteException(android.database.sqlite.SQLiteException) LbryUriException(com.odysee.app.exceptions.LbryUriException) JSONObject(org.json.JSONObject) Subscription(com.odysee.app.model.lbryinc.Subscription) LbryUri(com.odysee.app.utils.LbryUri)

Example 8 with LbryUri

use of com.odysee.app.utils.LbryUri in project odysee-android by OdyseeTeam.

the class SaveSharedUserStateTask method buildUpdatedNotificationsDisabledStates.

private static JSONArray buildUpdatedNotificationsDisabledStates(List<Subscription> subscriptions) {
    JSONArray states = new JSONArray();
    for (Subscription subscription : subscriptions) {
        if (!Helper.isNullOrEmpty(subscription.getUrl())) {
            try {
                JSONObject item = new JSONObject();
                LbryUri uri = LbryUri.parse(LbryUri.normalize(subscription.getUrl()));
                item.put("uri", uri.toString());
                item.put("notificationsDisabled", subscription.isNotificationsDisabled());
                states.put(item);
            } catch (JSONException | LbryUriException ex) {
            // pass
            }
        }
    }
    return states;
}
Also used : LbryUriException(com.odysee.app.exceptions.LbryUriException) JSONObject(org.json.JSONObject) JSONArray(org.json.JSONArray) JSONException(org.json.JSONException) Subscription(com.odysee.app.model.lbryinc.Subscription) LbryUri(com.odysee.app.utils.LbryUri)

Example 9 with LbryUri

use of com.odysee.app.utils.LbryUri in project odysee-android by OdyseeTeam.

the class SaveSharedUserStateTask method doInBackground.

protected Boolean doInBackground(Void... params) {
    boolean loadedSubs = false;
    boolean loadedBlocked = false;
    SQLiteDatabase db = null;
    if (context instanceof MainActivity) {
        db = ((MainActivity) context).getDbHelper().getReadableDatabase();
    }
    // data to save
    // current subscriptions
    List<Subscription> subs = new ArrayList<>();
    try {
        if (db != null) {
            subs = new ArrayList<>(DatabaseHelper.getSubscriptions(db));
            loadedSubs = true;
        }
    } catch (SQLiteException ex) {
    // pass
    }
    List<String> subscriptionUrls = new ArrayList<>();
    try {
        for (Subscription subscription : subs) {
            LbryUri uri = LbryUri.parse(LbryUri.normalize(subscription.getUrl()));
            subscriptionUrls.add(uri.toString());
        }
    } catch (LbryUriException ex) {
        error = ex;
        return false;
    }
    // followed tags
    List<String> followedTags = Helper.getTagsForTagObjects(Lbry.followedTags);
    // blocked channels
    List<LbryUri> blockedChannels = new ArrayList<>();
    try {
        if (db != null) {
            blockedChannels = new ArrayList<>(DatabaseHelper.getBlockedChannels(db));
            loadedBlocked = true;
        }
    } catch (SQLiteException ex) {
    // pass
    }
    List<String> blockedChannelUrls = new ArrayList<>();
    for (LbryUri uri : blockedChannels) {
        blockedChannelUrls.add(uri.toString());
    }
    Map<String, OdyseeCollection> allCollections = null;
    OdyseeCollection favoritesPlaylist = null;
    OdyseeCollection watchlaterPlaylist = null;
    if (db != null) {
        allCollections = DatabaseHelper.loadAllCollections(db);
        // get the built in collections
        favoritesPlaylist = allCollections.get(OdyseeCollection.BUILT_IN_ID_FAVORITES);
        watchlaterPlaylist = allCollections.get(OdyseeCollection.BUILT_IN_ID_WATCHLATER);
    }
    // Get the previous saved state
    try {
        boolean isExistingValid = false;
        JSONObject sharedObject = null;
        JSONObject result = (JSONObject) Lbry.authenticatedGenericApiCall(Lbry.METHOD_PREFERENCE_GET, Lbry.buildSingleParam("key", KEY), authToken);
        if (result != null) {
            JSONObject shared = result.getJSONObject("shared");
            if (shared.has("type") && "object".equalsIgnoreCase(shared.getString("type")) && shared.has("value")) {
                isExistingValid = true;
                JSONObject value = shared.getJSONObject("value");
                if (loadedSubs) {
                    // make sure the subs were actually loaded from the local store before overwriting the data
                    value.put("subscriptions", Helper.jsonArrayFromList(subscriptionUrls));
                    value.put("following", buildUpdatedNotificationsDisabledStates(subs));
                }
                value.put("tags", Helper.jsonArrayFromList(followedTags));
                if (loadedBlocked) {
                    // make sure blocked list was actually loaded from the local store before overwriting
                    value.put("blocked", Helper.jsonArrayFromList(blockedChannelUrls));
                }
                // handle builtInCollections
                // check favorites last updated at, and compare
                JSONObject builtinCollections = Helper.getJSONObject("builtinCollections", value);
                if (builtinCollections != null) {
                    if (favoritesPlaylist != null) {
                        JSONObject priorFavorites = Helper.getJSONObject(favoritesPlaylist.getId(), builtinCollections);
                        long priorFavUpdatedAt = Helper.getJSONLong("updatedAt", 0, priorFavorites);
                        if (priorFavUpdatedAt < favoritesPlaylist.getUpdatedAtTimestamp()) {
                            // the current playlist is newer, so we replace
                            builtinCollections.put(favoritesPlaylist.getId(), favoritesPlaylist.toJSONObject());
                        }
                    }
                    if (watchlaterPlaylist != null) {
                        JSONObject priorWatchLater = Helper.getJSONObject(watchlaterPlaylist.getId(), builtinCollections);
                        long priorWatchLaterUpdatedAt = Helper.getJSONLong("updatedAt", 0, priorWatchLater);
                        if (priorWatchLaterUpdatedAt < watchlaterPlaylist.getUpdatedAtTimestamp()) {
                            // the current playlist is newer, so we replace
                            builtinCollections.put(watchlaterPlaylist.getId(), watchlaterPlaylist.toJSONObject());
                        }
                    }
                }
                // handle unpublishedCollections
                JSONObject unpublishedCollections = Helper.getJSONObject("unpublishedCollections", value);
                if (unpublishedCollections != null && allCollections != null) {
                    for (Map.Entry<String, OdyseeCollection> entry : allCollections.entrySet()) {
                        String collectionId = entry.getKey();
                        if (Arrays.asList(OdyseeCollection.BUILT_IN_ID_FAVORITES, OdyseeCollection.BUILT_IN_ID_WATCHLATER).contains(collectionId)) {
                            continue;
                        }
                        OdyseeCollection localCollection = entry.getValue();
                        if (localCollection.getVisibility() != OdyseeCollection.VISIBILITY_PRIVATE) {
                            continue;
                        }
                        JSONObject priorCollection = Helper.getJSONObject(collectionId, unpublishedCollections);
                        if (priorCollection != null) {
                            long priorCollectionUpdatedAt = Helper.getJSONLong("updatedAt", 0, priorCollection);
                            if (priorCollectionUpdatedAt < localCollection.getUpdatedAtTimestamp()) {
                                unpublishedCollections.put(collectionId, localCollection.toJSONObject());
                            }
                        } else {
                            unpublishedCollections.put(collectionId, localCollection.toJSONObject());
                        }
                    }
                }
                sharedObject = shared;
            }
        }
        if (!isExistingValid) {
            // build a  new object
            JSONObject value = new JSONObject();
            value.put("subscriptions", Helper.jsonArrayFromList(subscriptionUrls));
            value.put("tags", Helper.jsonArrayFromList(followedTags));
            value.put("following", buildUpdatedNotificationsDisabledStates(subs));
            value.put("blocked", Helper.jsonArrayFromList(blockedChannelUrls));
            JSONObject builtinCollections = new JSONObject();
            if (favoritesPlaylist != null) {
                builtinCollections.put(favoritesPlaylist.getId(), favoritesPlaylist.toJSONObject());
            }
            if (watchlaterPlaylist != null) {
                builtinCollections.put(watchlaterPlaylist.getId(), watchlaterPlaylist.toJSONObject());
            }
            value.put("builtinCollections", builtinCollections);
            JSONObject unpublishedCollections = new JSONObject();
            if (allCollections != null) {
                for (Map.Entry<String, OdyseeCollection> entry : allCollections.entrySet()) {
                    String collectionId = entry.getKey();
                    if (Arrays.asList(OdyseeCollection.BUILT_IN_ID_FAVORITES, OdyseeCollection.BUILT_IN_ID_WATCHLATER).contains(collectionId)) {
                        continue;
                    }
                    OdyseeCollection localCollection = entry.getValue();
                    if (localCollection.getVisibility() != OdyseeCollection.VISIBILITY_PRIVATE) {
                        continue;
                    }
                    unpublishedCollections.put(collectionId, localCollection.toJSONObject());
                }
            }
            value.put("unpublishedCollections", unpublishedCollections);
            sharedObject = new JSONObject();
            sharedObject.put("type", "object");
            sharedObject.put("value", value);
            sharedObject.put("version", VERSION);
        }
        Map<String, Object> options = new HashMap<>();
        options.put("key", KEY);
        options.put("value", sharedObject.toString());
        Lbry.authenticatedGenericApiCall(Lbry.METHOD_PREFERENCE_SET, options, authToken);
        return true;
    } catch (ApiCallException | JSONException ex) {
        // failed
        error = ex;
    }
    return false;
}
Also used : HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) MainActivity(com.odysee.app.MainActivity) Subscription(com.odysee.app.model.lbryinc.Subscription) LbryUri(com.odysee.app.utils.LbryUri) ApiCallException(com.odysee.app.exceptions.ApiCallException) JSONException(org.json.JSONException) SQLiteException(android.database.sqlite.SQLiteException) OdyseeCollection(com.odysee.app.model.OdyseeCollection) LbryUriException(com.odysee.app.exceptions.LbryUriException) JSONObject(org.json.JSONObject) SQLiteDatabase(android.database.sqlite.SQLiteDatabase) JSONObject(org.json.JSONObject) HashMap(java.util.HashMap) Map(java.util.Map)

Example 10 with LbryUri

use of com.odysee.app.utils.LbryUri in project odysee-android by OdyseeTeam.

the class FileViewFragment method initUi.

@SuppressWarnings("ClickableViewAccessibility")
private void initUi(View root) {
    buttonPublishSomething.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            Context context = getContext();
            if (!Helper.isNullOrEmpty(currentUrl) && context instanceof MainActivity) {
                LbryUri uri = LbryUri.tryParse(currentUrl);
                if (uri != null) {
                    Map<String, Object> params = new HashMap<>();
                    params.put("suggestedUrl", uri.getStreamName());
                // ((MainActivity) context).openFragment(PublishFragment.class, true, NavMenuItem.ID_ITEM_NEW_PUBLISH, params);
                }
            }
        }
    });
    root.findViewById(R.id.file_view_title_area).setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            ImageView descIndicator = root.findViewById(R.id.file_view_desc_toggle_arrow);
            View descriptionArea = root.findViewById(R.id.file_view_description_area);
            Claim actualClaim = collectionClaimItem != null ? collectionClaimItem : fileClaim;
            boolean hasDescription = actualClaim != null && !Helper.isNullOrEmpty(actualClaim.getDescription());
            boolean hasTags = actualClaim != null && actualClaim.getTags() != null && actualClaim.getTags().size() > 0;
            if (descriptionArea.getVisibility() != View.VISIBLE) {
                if (hasDescription || hasTags) {
                    descriptionArea.setVisibility(View.VISIBLE);
                }
                descIndicator.setImageResource(R.drawable.ic_arrow_dropup);
            } else {
                descriptionArea.setVisibility(View.GONE);
                descIndicator.setImageResource(R.drawable.ic_arrow_dropdown);
            }
        }
    });
    root.findViewById(R.id.file_view_action_like).setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            AccountManager am = AccountManager.get(root.getContext());
            Account odyseeAccount = Helper.getOdyseeAccount(am.getAccounts());
            Claim actualClaim = collectionClaimItem != null ? collectionClaimItem : fileClaim;
            if (actualClaim != null && odyseeAccount != null) {
                react(actualClaim, true);
            }
        }
    });
    root.findViewById(R.id.file_view_action_dislike).setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            AccountManager am = AccountManager.get(root.getContext());
            Account odyseeAccount = Helper.getOdyseeAccount(am.getAccounts());
            Claim actualClaim = collectionClaimItem != null ? collectionClaimItem : fileClaim;
            if (actualClaim != null && odyseeAccount != null) {
                react(actualClaim, false);
            }
        }
    });
    root.findViewById(R.id.file_view_action_share).setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            Claim actualClaim = collectionClaimItem != null ? collectionClaimItem : fileClaim;
            if (actualClaim != null) {
                try {
                    String shareUrl = LbryUri.parse(!Helper.isNullOrEmpty(actualClaim.getCanonicalUrl()) ? actualClaim.getCanonicalUrl() : (!Helper.isNullOrEmpty(actualClaim.getShortUrl()) ? actualClaim.getShortUrl() : actualClaim.getPermanentUrl())).toOdyseeString();
                    Intent shareIntent = new Intent();
                    shareIntent.setAction(Intent.ACTION_SEND);
                    shareIntent.setType("text/plain");
                    shareIntent.putExtra(Intent.EXTRA_TEXT, shareUrl);
                    MainActivity.startingShareActivity = true;
                    Intent shareUrlIntent = Intent.createChooser(shareIntent, getString(R.string.share_lbry_content));
                    shareUrlIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(shareUrlIntent);
                } catch (LbryUriException ex) {
                // pass
                }
            }
        }
    });
    root.findViewById(R.id.file_view_action_tip).setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            MainActivity activity = (MainActivity) getActivity();
            if (activity != null && activity.isSignedIn()) {
                Claim actualClaim = collectionClaimItem != null ? collectionClaimItem : fileClaim;
                if (actualClaim != null) {
                    CreateSupportDialogFragment dialog = CreateSupportDialogFragment.newInstance(actualClaim, (amount, isTip) -> {
                        double sentAmount = amount.doubleValue();
                        String message = getResources().getQuantityString(isTip ? R.plurals.you_sent_a_tip : R.plurals.you_sent_a_support, sentAmount == 1.0 ? 1 : 2, new DecimalFormat("#,###.##").format(sentAmount));
                        Snackbar.make(root.findViewById(R.id.file_view_claim_display_area), message, Snackbar.LENGTH_LONG).show();
                    });
                    Context context = getContext();
                    if (context instanceof MainActivity) {
                        dialog.show(((MainActivity) context).getSupportFragmentManager(), CreateSupportDialogFragment.TAG);
                    }
                }
            } else {
                if (activity != null) {
                    activity.simpleSignIn(0);
                }
            }
        }
    });
    root.findViewById(R.id.file_view_action_repost).setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            Claim actualClaim = collectionClaimItem != null ? collectionClaimItem : fileClaim;
            if (actualClaim != null) {
                RepostClaimDialogFragment dialog = RepostClaimDialogFragment.newInstance(actualClaim, claim -> {
                    Context context = getContext();
                    if (context instanceof MainActivity) {
                        ((MainActivity) context).showMessage(R.string.content_successfully_reposted);
                    }
                });
                Context context = getContext();
                if (context instanceof MainActivity) {
                    dialog.show(((MainActivity) context).getSupportFragmentManager(), RepostClaimDialogFragment.TAG);
                }
            }
        }
    });
    root.findViewById(R.id.file_view_action_edit).setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            Context context = getContext();
            Claim actualClaim = collectionClaimItem != null ? collectionClaimItem : fileClaim;
            if (actualClaim != null && context instanceof MainActivity) {
                ((MainActivity) context).openPublishForm(actualClaim);
            }
        }
    });
    root.findViewById(R.id.file_view_action_delete).setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            Claim actualClaim = collectionClaimItem != null ? collectionClaimItem : fileClaim;
            if (actualClaim != null) {
                AlertDialog.Builder builder = new AlertDialog.Builder(getContext()).setTitle(R.string.delete_file).setMessage(R.string.confirm_delete_file_message).setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        deleteClaimFile();
                    }
                }).setNegativeButton(R.string.no, null);
                builder.show();
            }
        }
    });
    root.findViewById(R.id.file_view_action_unpublish).setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            Claim actualClaim = collectionClaimItem != null ? collectionClaimItem : fileClaim;
            if (actualClaim != null) {
                AlertDialog.Builder builder = new AlertDialog.Builder(getContext()).setTitle(R.string.delete_content).setMessage(R.string.confirm_delete_content_message).setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        deleteCurrentClaim();
                    }
                }).setNegativeButton(R.string.no, null);
                builder.show();
            }
        }
    });
    root.findViewById(R.id.file_view_action_download).setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            Claim actualClaim = collectionClaimItem != null ? collectionClaimItem : fileClaim;
            if (actualClaim != null) {
                if (downloadInProgress) {
                    onDownloadAborted();
                } else {
                    checkStoragePermissionAndStartDownload();
                }
            }
        }
    });
    root.findViewById(R.id.file_view_action_report).setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            Claim actualClaim = collectionClaimItem != null ? collectionClaimItem : fileClaim;
            if (actualClaim != null) {
                Context context = getContext();
                CustomTabColorSchemeParams.Builder ctcspb = new CustomTabColorSchemeParams.Builder();
                ctcspb.setToolbarColor(ContextCompat.getColor(context, R.color.colorPrimary));
                CustomTabColorSchemeParams ctcsp = ctcspb.build();
                CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder().setDefaultColorSchemeParams(ctcsp);
                CustomTabsIntent intent = builder.build();
                intent.launchUrl(context, Uri.parse(String.format("https://odysee.com/$/report_content?claimId=%s", actualClaim.getClaimId())));
            }
        }
    });
    root.findViewById(R.id.player_toggle_cast).setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            toggleCast();
        }
    });
    PlayerView playerView = root.findViewById(R.id.file_view_exoplayer_view);
    View playbackSpeedContainer = playerView.findViewById(R.id.player_playback_speed);
    TextView textPlaybackSpeed = playerView.findViewById(R.id.player_playback_speed_label);
    View qualityContainer = playerView.findViewById(R.id.player_quality);
    TextView textQuality = playerView.findViewById(R.id.player_quality_label);
    textPlaybackSpeed.setText(DEFAULT_PLAYBACK_SPEED);
    textQuality.setText(AUTO_QUALITY_STRING);
    playbackSpeedContainer.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() {

        @Override
        public void onCreateContextMenu(ContextMenu contextMenu, View view, ContextMenu.ContextMenuInfo contextMenuInfo) {
            Helper.buildPlaybackSpeedMenu(contextMenu);
        }
    });
    playbackSpeedContainer.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            Context context = getContext();
            if (context instanceof MainActivity) {
                ((MainActivity) context).openContextMenu(playbackSpeedContainer);
            }
        }
    });
    qualityContainer.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() {

        @Override
        public void onCreateContextMenu(ContextMenu contextMenu, View view, ContextMenu.ContextMenuInfo contextMenuInfo) {
            if (MainActivity.appPlayer != null) {
                Helper.buildQualityMenu(contextMenu, MainActivity.appPlayer, MainActivity.videoIsTranscoded);
            }
        }
    });
    qualityContainer.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Context context = getContext();
            if (context instanceof MainActivity) {
                ((MainActivity) context).openContextMenu(qualityContainer);
            }
        }
    });
    playerView.findViewById(R.id.player_toggle_fullscreen).setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            // check full screen mode
            if (isInFullscreenMode()) {
                disableFullScreenMode();
            } else {
                enableFullScreenMode();
            }
        }
    });
    playerView.findViewById(R.id.player_skip_back_10).setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            if (MainActivity.appPlayer != null) {
                MainActivity.appPlayer.seekTo(Math.max(0, MainActivity.appPlayer.getCurrentPosition() - 10000));
            }
        }
    });
    playerView.findViewById(R.id.player_skip_forward_10).setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            if (MainActivity.appPlayer != null) {
                MainActivity.appPlayer.seekTo(MainActivity.appPlayer.getCurrentPosition() + 10000);
            }
        }
    });
    root.findViewById(R.id.file_view_publisher_info_area).setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            Claim actualClaim = collectionClaimItem != null ? collectionClaimItem : fileClaim;
            if (actualClaim != null && actualClaim.getSigningChannel() != null) {
                removeNotificationAsSource();
                Claim publisher = actualClaim.getSigningChannel();
                Context context = getContext();
                if (context instanceof MainActivity) {
                    ((MainActivity) context).openChannelClaim(publisher);
                }
            }
        }
    });
    View buttonFollow = root.findViewById(R.id.file_view_icon_follow);
    View buttonUnfollow = root.findViewById(R.id.file_view_icon_unfollow);
    View buttonBell = root.findViewById(R.id.file_view_icon_bell);
    buttonFollow.setOnClickListener(followUnfollowListener);
    buttonUnfollow.setOnClickListener(followUnfollowListener);
    buttonBell.setOnClickListener(bellIconListener);
    commentChannelSpinnerAdapter = new InlineChannelSpinnerAdapter(getContext(), R.layout.spinner_item_channel, new ArrayList<>());
    commentChannelSpinnerAdapter.addPlaceholder(false);
    initCommentForm(root);
    expandButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            // Prevents crash for when comment list isn't loaded yet but user tries to expand.
            if (commentListAdapter != null) {
                switchCommentListVisibility(commentListAdapter.isCollapsed());
                commentListAdapter.switchExpandedState();
            }
        }
    });
    singleCommentRoot.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            expandButton.performClick();
        }
    });
    RecyclerView relatedContentList = root.findViewById(R.id.file_view_related_content_list);
    RecyclerView commentsList = root.findViewById(R.id.file_view_comments_list);
    relatedContentList.setNestedScrollingEnabled(false);
    commentsList.setNestedScrollingEnabled(false);
    LinearLayoutManager relatedContentListLLM = new LinearLayoutManager(getContext());
    LinearLayoutManager commentsListLLM = new LinearLayoutManager(getContext());
    relatedContentList.setLayoutManager(relatedContentListLLM);
    commentsList.setLayoutManager(commentsListLLM);
    GestureDetector.SimpleOnGestureListener gestureListener = new GestureDetector.SimpleOnGestureListener() {

        @Override
        public boolean onDoubleTap(MotionEvent e) {
            ImageView seekOverlay = root.findViewById(R.id.seek_overlay);
            int width = playerView.getWidth();
            float eventX = e.getX();
            if (eventX < width / 3.0) {
                if (MainActivity.appPlayer != null) {
                    MainActivity.appPlayer.seekTo(Math.max(0, MainActivity.appPlayer.getCurrentPosition() - 10000));
                    seekOverlay.setVisibility(View.VISIBLE);
                    seekOverlay.setImageResource(R.drawable.ic_rewind);
                }
            } else if (eventX > width * 2.0 / 3.0) {
                if (MainActivity.appPlayer != null) {
                    MainActivity.appPlayer.seekTo(MainActivity.appPlayer.getCurrentPosition() + 10000);
                    seekOverlay.setVisibility(View.VISIBLE);
                    seekOverlay.setImageResource(R.drawable.ic_forward);
                }
            } else {
                return true;
            }
            if (seekOverlayHandler == null) {
                seekOverlayHandler = new Handler();
            } else {
                // Clear pending messages
                seekOverlayHandler.removeCallbacksAndMessages(null);
            }
            seekOverlayHandler.postDelayed(() -> {
                seekOverlay.setVisibility(View.GONE);
            }, 500);
            return true;
        }

        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            if (playerView.isControllerVisible()) {
                playerView.hideController();
            } else {
                playerView.showController();
            }
            return true;
        }
    };
    GestureDetector detector = new GestureDetector(getContext(), gestureListener);
    playerView.setOnTouchListener((view, motionEvent) -> {
        detector.onTouchEvent(motionEvent);
        return true;
    });
}
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) RepostClaimDialogFragment(com.odysee.app.dialog.RepostClaimDialogFragment) AlertDialog(androidx.appcompat.app.AlertDialog) Account(android.accounts.Account) DialogInterface(android.content.DialogInterface) CustomTabColorSchemeParams(androidx.browser.customtabs.CustomTabColorSchemeParams) DecimalFormat(java.text.DecimalFormat) ArrayList(java.util.ArrayList) ContextMenu(android.view.ContextMenu) GestureDetector(android.view.GestureDetector) MainActivity(com.odysee.app.MainActivity) LinearLayoutManager(androidx.recyclerview.widget.LinearLayoutManager) CreateSupportDialogFragment(com.odysee.app.dialog.CreateSupportDialogFragment) TextView(android.widget.TextView) ImageView(android.widget.ImageView) LbryUri(com.odysee.app.utils.LbryUri) TrackSelectionOverride(com.google.android.exoplayer2.trackselection.TrackSelectionOverrides.TrackSelectionOverride) AttributeProviderContext(org.commonmark.renderer.html.AttributeProviderContext) Context(android.content.Context) Handler(android.os.Handler) AbandonHandler(com.odysee.app.tasks.claim.AbandonHandler) CommentListHandler(com.odysee.app.tasks.CommentListHandler) ClaimSearchResultHandler(com.odysee.app.tasks.claim.ClaimSearchResultHandler) GenericTaskHandler(com.odysee.app.tasks.GenericTaskHandler) ClaimListResultHandler(com.odysee.app.tasks.claim.ClaimListResultHandler) CustomTabsIntent(androidx.browser.customtabs.CustomTabsIntent) Intent(android.content.Intent) InlineChannelSpinnerAdapter(com.odysee.app.adapter.InlineChannelSpinnerAdapter) 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) SuppressLint(android.annotation.SuppressLint) MotionEvent(android.view.MotionEvent) CustomTabsIntent(androidx.browser.customtabs.CustomTabsIntent) LbryUriException(com.odysee.app.exceptions.LbryUriException) PlayerView(com.google.android.exoplayer2.ui.PlayerView) AccountManager(android.accounts.AccountManager) RecyclerView(androidx.recyclerview.widget.RecyclerView) Map(java.util.Map) LinkedHashMap(java.util.LinkedHashMap) HashMap(java.util.HashMap) Claim(com.odysee.app.model.Claim)

Aggregations

LbryUri (com.odysee.app.utils.LbryUri)30 LbryUriException (com.odysee.app.exceptions.LbryUriException)10 ArrayList (java.util.ArrayList)10 JSONException (org.json.JSONException)9 Subscription (com.odysee.app.model.lbryinc.Subscription)8 ApiCallException (com.odysee.app.exceptions.ApiCallException)7 Claim (com.odysee.app.model.Claim)7 JSONObject (org.json.JSONObject)7 SQLiteException (android.database.sqlite.SQLiteException)6 MainActivity (com.odysee.app.MainActivity)6 LbryioRequestException (com.odysee.app.exceptions.LbryioRequestException)6 LbryioResponseException (com.odysee.app.exceptions.LbryioResponseException)6 ExecutionException (java.util.concurrent.ExecutionException)6 SuppressLint (android.annotation.SuppressLint)4 Context (android.content.Context)4 RecyclerView (androidx.recyclerview.widget.RecyclerView)4 Tag (com.odysee.app.model.Tag)4 HashMap (java.util.HashMap)4 AccountManager (android.accounts.AccountManager)3 View (android.view.View)3