Search in sources :

Example 1 with LbryUriException

use of com.odysee.app.exceptions.LbryUriException in project odysee-android by OdyseeTeam.

the class MainActivity method checkUrlIntent.

private void checkUrlIntent(Intent intent) {
    if (intent != null) {
        Uri data = intent.getData();
        if (data != null) {
            String url = data.toString();
            // check special urls
            if (url.startsWith(SPECIAL_URL_PREFIX)) {
                String specialPath = url.substring(8).toLowerCase();
                if (specialRouteFragmentClassMap.containsKey(specialPath)) {
                    Class fragmentClass = specialRouteFragmentClassMap.get(specialPath);
                    if (fragmentClassNavIdMap.containsKey(fragmentClass)) {
                        Map<String, Object> params = new HashMap<>();
                        String tag = intent.getStringExtra("tag");
                        params.put("singleTag", tag);
                    // openFragment(specialRouteFragmentClassMap.get(specialPath), true, fragmentClassNavIdMap.get(fragmentClass), !Helper.isNullOrEmpty(tag) ? params : null);
                    }
                }
            // unrecognised path will open the following by default
            } else {
                try {
                    LbryUri uri = LbryUri.parse(url);
                    String checkedURL = url.startsWith(LbryUri.PROTO_DEFAULT) ? url : uri.toString();
                    if (uri.isChannel()) {
                        openChannelUrl(checkedURL);
                    } else {
                        openFileUrl(checkedURL);
                    }
                } catch (LbryUriException ex) {
                // pass
                }
            }
            inPictureInPictureMode = false;
            renderFullMode();
        }
    }
}
Also used : LbryUriException(com.odysee.app.exceptions.LbryUriException) HashMap(java.util.HashMap) JSONObject(org.json.JSONObject) SpannableString(android.text.SpannableString) LbryUri(com.odysee.app.utils.LbryUri) LbryUri(com.odysee.app.utils.LbryUri) Uri(android.net.Uri)

Example 2 with LbryUriException

use of com.odysee.app.exceptions.LbryUriException 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 3 with LbryUriException

use of com.odysee.app.exceptions.LbryUriException 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 4 with LbryUriException

use of com.odysee.app.exceptions.LbryUriException 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 5 with LbryUriException

use of com.odysee.app.exceptions.LbryUriException 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

LbryUriException (com.odysee.app.exceptions.LbryUriException)10 LbryUri (com.odysee.app.utils.LbryUri)8 Subscription (com.odysee.app.model.lbryinc.Subscription)6 ArrayList (java.util.ArrayList)5 JSONException (org.json.JSONException)5 JSONObject (org.json.JSONObject)5 SQLiteException (android.database.sqlite.SQLiteException)3 Uri (android.net.Uri)3 MainActivity (com.odysee.app.MainActivity)3 ApiCallException (com.odysee.app.exceptions.ApiCallException)3 UrlSuggestion (com.odysee.app.model.UrlSuggestion)3 HashMap (java.util.HashMap)3 Map (java.util.Map)3 Context (android.content.Context)2 DialogInterface (android.content.DialogInterface)2 Intent (android.content.Intent)2 Color (android.graphics.Color)2 AsyncTask (android.os.AsyncTask)2 Bundle (android.os.Bundle)2 Handler (android.os.Handler)2