diff --git a/.idea/icon.svg b/.idea/icon.svg new file mode 100644 index 000000000..51fdf95de --- /dev/null +++ b/.idea/icon.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + diff --git a/app/build.gradle b/app/build.gradle index 49aa93345..d54dedec8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -289,7 +289,7 @@ dependencies { implementation "com.jakewharton.rxbinding4:rxbinding:4.0.0" // Date and time formatting - implementation "org.ocpsoft.prettytime:prettytime:5.0.7.Final" + implementation "org.ocpsoft.prettytime:prettytime:5.0.8.Final" /** Debugging **/ // Memory leak detection diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4726499f4..3035b3a19 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -367,6 +367,7 @@ + diff --git a/app/src/main/java/org/schabi/newpipe/error/ErrorUtil.kt b/app/src/main/java/org/schabi/newpipe/error/ErrorUtil.kt index daa598509..dcbc11413 100644 --- a/app/src/main/java/org/schabi/newpipe/error/ErrorUtil.kt +++ b/app/src/main/java/org/schabi/newpipe/error/ErrorUtil.kt @@ -54,7 +54,7 @@ class ErrorUtil { */ @JvmStatic fun showSnackbar(context: Context, errorInfo: ErrorInfo) { - val rootView = if (context is Activity) context.findViewById(R.id.content) else null + val rootView = (context as? Activity)?.findViewById(android.R.id.content) showSnackbar(context, rootView, errorInfo) } @@ -71,7 +71,7 @@ class ErrorUtil { fun showSnackbar(fragment: Fragment, errorInfo: ErrorInfo) { var rootView = fragment.view if (rootView == null && fragment.activity != null) { - rootView = fragment.requireActivity().findViewById(R.id.content) + rootView = fragment.requireActivity().findViewById(android.R.id.content) } showSnackbar(fragment.requireContext(), rootView, errorInfo) } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java index 52a41d38f..381de5003 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java @@ -245,10 +245,10 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte // change the background and icon color of the tab layout: // service-colored at the top, app-background-colored at the bottom tabLayout.setBackgroundColor(ThemeHelper.resolveColorFromAttr(requireContext(), - bottom ? R.attr.colorSecondary : R.attr.colorPrimary)); + bottom ? android.R.attr.windowBackground : R.attr.colorPrimary)); @ColorInt final int iconColor = bottom - ? ThemeHelper.resolveColorFromAttr(requireContext(), R.attr.colorAccent) + ? ThemeHelper.resolveColorFromAttr(requireContext(), android.R.attr.colorAccent) : Color.WHITE; tabLayout.setTabRippleColor(ColorStateList.valueOf(iconColor).withAlpha(32)); tabLayout.setTabIconTint(ColorStateList.valueOf(iconColor)); diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java index 7e83d9958..fd382adbf 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java @@ -22,6 +22,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; import androidx.core.graphics.ColorUtils; +import androidx.core.view.MenuProvider; import androidx.preference.PreferenceManager; import com.google.android.material.snackbar.Snackbar; @@ -99,6 +100,7 @@ public class ChannelFragment extends BaseStateFragment private MenuItem menuRssButton; private MenuItem menuNotifyButton; private SubscriptionEntity channelSubscription; + private MenuProvider menuProvider; public static ChannelFragment getInstance(final int serviceId, final String url, final String name) { @@ -121,7 +123,62 @@ public class ChannelFragment extends BaseStateFragment @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setHasOptionsMenu(true); + menuProvider = new MenuProvider() { + @Override + public void onCreateMenu(@NonNull final Menu menu, + @NonNull final MenuInflater inflater) { + inflater.inflate(R.menu.menu_channel, menu); + + if (DEBUG) { + Log.d(TAG, "onCreateOptionsMenu() called with: " + + "menu = [" + menu + "], inflater = [" + inflater + "]"); + } + + } + + @Override + public void onPrepareMenu(@NonNull final Menu menu) { + menuRssButton = menu.findItem(R.id.menu_item_rss); + menuNotifyButton = menu.findItem(R.id.menu_item_notify); + updateRssButton(); + updateNotifyButton(channelSubscription); + } + + @Override + public boolean onMenuItemSelected(@NonNull final MenuItem item) { + switch (item.getItemId()) { + case R.id.menu_item_notify: + final boolean value = !item.isChecked(); + item.setEnabled(false); + setNotify(value); + break; + case R.id.action_settings: + NavigationHelper.openSettings(requireContext()); + break; + case R.id.menu_item_rss: + if (currentInfo != null) { + ShareUtils.openUrlInApp(requireContext(), currentInfo.getFeedUrl()); + } + break; + case R.id.menu_item_openInBrowser: + if (currentInfo != null) { + ShareUtils.openUrlInBrowser(requireContext(), + currentInfo.getOriginalUrl()); + } + break; + case R.id.menu_item_share: + if (currentInfo != null) { + ShareUtils.shareText(requireContext(), name, + currentInfo.getOriginalUrl(), currentInfo.getAvatars()); + } + break; + default: + return false; + } + return true; + } + }; + activity.addMenuProvider(menuProvider); } @Override @@ -183,67 +240,10 @@ public class ChannelFragment extends BaseStateFragment } disposables.clear(); binding = null; + activity.removeMenuProvider(menuProvider); + menuProvider = null; } - - /*////////////////////////////////////////////////////////////////////////// - // Menu - //////////////////////////////////////////////////////////////////////////*/ - - @Override - public void onCreateOptionsMenu(@NonNull final Menu menu, - @NonNull final MenuInflater inflater) { - super.onCreateOptionsMenu(menu, inflater); - inflater.inflate(R.menu.menu_channel, menu); - - if (DEBUG) { - Log.d(TAG, "onCreateOptionsMenu() called with: " - + "menu = [" + menu + "], inflater = [" + inflater + "]"); - } - } - - @Override - public void onPrepareOptionsMenu(@NonNull final Menu menu) { - super.onPrepareOptionsMenu(menu); - menuRssButton = menu.findItem(R.id.menu_item_rss); - menuNotifyButton = menu.findItem(R.id.menu_item_notify); - updateNotifyButton(channelSubscription); - } - - @Override - public boolean onOptionsItemSelected(@NonNull final MenuItem item) { - switch (item.getItemId()) { - case R.id.menu_item_notify: - final boolean value = !item.isChecked(); - item.setEnabled(false); - setNotify(value); - break; - case R.id.action_settings: - NavigationHelper.openSettings(requireContext()); - break; - case R.id.menu_item_rss: - if (currentInfo != null) { - ShareUtils.openUrlInApp(requireContext(), currentInfo.getFeedUrl()); - } - break; - case R.id.menu_item_openInBrowser: - if (currentInfo != null) { - ShareUtils.openUrlInBrowser(requireContext(), currentInfo.getOriginalUrl()); - } - break; - case R.id.menu_item_share: - if (currentInfo != null) { - ShareUtils.shareText(requireContext(), name, currentInfo.getOriginalUrl(), - currentInfo.getAvatars()); - } - break; - default: - return super.onOptionsItemSelected(item); - } - return true; - } - - /*////////////////////////////////////////////////////////////////////////// // Channel Subscription //////////////////////////////////////////////////////////////////////////*/ @@ -408,6 +408,13 @@ public class ChannelFragment extends BaseStateFragment animate(binding.channelSubscribeButton, true, 100, AnimationType.LIGHT_SCALE_AND_ALPHA); } + private void updateRssButton() { + if (menuRssButton == null || currentInfo == null) { + return; + } + menuRssButton.setVisible(!TextUtils.isEmpty(currentInfo.getFeedUrl())); + } + private void updateNotifyButton(@Nullable final SubscriptionEntity subscription) { if (menuNotifyButton == null) { return; @@ -610,9 +617,7 @@ public class ChannelFragment extends BaseStateFragment binding.subChannelAvatarView.setVisibility(View.VISIBLE); } - if (menuRssButton != null) { - menuRssButton.setVisible(!TextUtils.isEmpty(result.getFeedUrl())); - } + updateRssButton(); channelContentNotSupported = false; for (final Throwable throwable : result.getErrors()) { diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java index 61a1527f0..6fa339110 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java @@ -356,6 +356,7 @@ public class PlaylistFragment extends BaseListInfoFragment ellipsizer.toggle()); + headerBinding.playlistDescription.setOnClickListener(v -> ellipsizer.toggle()); } else { headerBinding.playlistDescription.setVisibility(View.GONE); headerBinding.playlistDescriptionReadMore.setVisibility(View.GONE); diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentInfoItemHolder.java index a3f0384ad..839aa1813 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/CommentInfoItemHolder.java @@ -1,9 +1,13 @@ package org.schabi.newpipe.info_list.holder; import static org.schabi.newpipe.util.ServiceHelper.getServiceById; +import static org.schabi.newpipe.util.text.TouchUtils.getOffsetForHorizontalLine; +import android.text.Spanned; import android.text.method.LinkMovementMethod; +import android.text.style.ClickableSpan; import android.text.style.URLSpan; +import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.Button; @@ -25,7 +29,6 @@ import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.external_communication.ShareUtils; import org.schabi.newpipe.util.image.ImageStrategy; import org.schabi.newpipe.util.image.PicassoHelper; -import org.schabi.newpipe.util.text.CommentTextOnTouchListener; import org.schabi.newpipe.util.text.TextEllipsizer; public class CommentInfoItemHolder extends InfoItemHolder { @@ -128,7 +131,26 @@ public class CommentInfoItemHolder extends InfoItemHolder { textEllipsizer.ellipsize(); //noinspection ClickableViewAccessibility - itemContentView.setOnTouchListener(CommentTextOnTouchListener.INSTANCE); + itemContentView.setOnTouchListener((v, event) -> { + final CharSequence text = itemContentView.getText(); + if (text instanceof Spanned buffer) { + final int action = event.getAction(); + + if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) { + final int offset = getOffsetForHorizontalLine(itemContentView, event); + final var links = buffer.getSpans(offset, offset, ClickableSpan.class); + + if (links.length != 0) { + if (action == MotionEvent.ACTION_UP) { + links[0].onClick(itemContentView); + } + // we handle events that intersect links, so return true + return true; + } + } + } + return false; + }); itemView.setOnClickListener(view -> { textEllipsizer.toggle(); diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt index 0b61f45fb..e8c5b1e34 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt @@ -549,7 +549,7 @@ class FeedFragment : BaseStateFragment() { var typeface = Typeface.DEFAULT var backgroundSupplier = { ctx: Context -> - resolveDrawable(ctx, R.attr.selectableItemBackground) + resolveDrawable(ctx, android.R.attr.selectableItemBackground) } if (doCheck) { // If the uploadDate is null or true we should highlight the item @@ -562,7 +562,7 @@ class FeedFragment : BaseStateFragment() { LayerDrawable( arrayOf( resolveDrawable(ctx, R.attr.dashed_border), - resolveDrawable(ctx, R.attr.selectableItemBackground) + resolveDrawable(ctx, android.R.attr.selectableItemBackground) ) ) } diff --git a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java index f4faa1c10..d5627dd3b 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java +++ b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java @@ -573,16 +573,16 @@ public final class PlayQueueActivity extends AppCompatActivity private void onPlayModeChanged(final int repeatMode, final boolean shuffled) { switch (repeatMode) { case com.google.android.exoplayer2.Player.REPEAT_MODE_OFF: - queueControlBinding.controlRepeat - .setImageResource(R.drawable.exo_controls_repeat_off); + queueControlBinding.controlRepeat.setImageResource( + com.google.android.exoplayer2.ui.R.drawable.exo_controls_repeat_off); break; case com.google.android.exoplayer2.Player.REPEAT_MODE_ONE: - queueControlBinding.controlRepeat - .setImageResource(R.drawable.exo_controls_repeat_one); + queueControlBinding.controlRepeat.setImageResource( + com.google.android.exoplayer2.ui.R.drawable.exo_controls_repeat_one); break; case com.google.android.exoplayer2.Player.REPEAT_MODE_ALL: - queueControlBinding.controlRepeat - .setImageResource(R.drawable.exo_controls_repeat_all); + queueControlBinding.controlRepeat.setImageResource( + com.google.android.exoplayer2.ui.R.drawable.exo_controls_repeat_all); break; } diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java index 796208a04..dfb49a25b 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlaybackParameterDialog.java @@ -342,14 +342,14 @@ public class PlaybackParameterDialog extends DialogFragment { final Map pitchCtrlModeComponentMapping = getPitchControlModeComponentMappings(); pitchCtrlModeComponentMapping.forEach((v, textView) -> textView.setBackground( - resolveDrawable(requireContext(), R.attr.selectableItemBackground))); + resolveDrawable(requireContext(), android.R.attr.selectableItemBackground))); // Mark the selected textview final TextView textView = pitchCtrlModeComponentMapping.get(semitones); if (textView != null) { textView.setBackground(new LayerDrawable(new Drawable[]{ resolveDrawable(requireContext(), R.attr.dashed_border), - resolveDrawable(requireContext(), R.attr.selectableItemBackground) + resolveDrawable(requireContext(), android.R.attr.selectableItemBackground) })); } @@ -415,14 +415,14 @@ public class PlaybackParameterDialog extends DialogFragment { // Bring all textviews into a normal state final Map stepSiteComponentMapping = getStepSizeComponentMappings(); stepSiteComponentMapping.forEach((v, textView) -> textView.setBackground( - resolveDrawable(requireContext(), R.attr.selectableItemBackground))); + resolveDrawable(requireContext(), android.R.attr.selectableItemBackground))); // Mark the selected textview final TextView textView = stepSiteComponentMapping.get(newStepSize); if (textView != null) { textView.setBackground(new LayerDrawable(new Drawable[]{ resolveDrawable(requireContext(), R.attr.dashed_border), - resolveDrawable(requireContext(), R.attr.selectableItemBackground) + resolveDrawable(requireContext(), android.R.attr.selectableItemBackground) })); } diff --git a/app/src/main/java/org/schabi/newpipe/player/notification/NotificationActionData.java b/app/src/main/java/org/schabi/newpipe/player/notification/NotificationActionData.java index b3abcd0b5..17ae732c6 100644 --- a/app/src/main/java/org/schabi/newpipe/player/notification/NotificationActionData.java +++ b/app/src/main/java/org/schabi/newpipe/player/notification/NotificationActionData.java @@ -69,41 +69,48 @@ public final class NotificationActionData { switch (selectedAction) { case NotificationConstants.PREVIOUS: return new NotificationActionData(ACTION_PLAY_PREVIOUS, - ctx.getString(R.string.exo_controls_previous_description), baseActionIcon); + ctx.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_previous_description), baseActionIcon); case NotificationConstants.NEXT: return new NotificationActionData(ACTION_PLAY_NEXT, - ctx.getString(R.string.exo_controls_next_description), baseActionIcon); + ctx.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_next_description), baseActionIcon); case NotificationConstants.REWIND: return new NotificationActionData(ACTION_FAST_REWIND, - ctx.getString(R.string.exo_controls_rewind_description), baseActionIcon); + ctx.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_rewind_description), baseActionIcon); case NotificationConstants.FORWARD: return new NotificationActionData(ACTION_FAST_FORWARD, - ctx.getString(R.string.exo_controls_fastforward_description), - baseActionIcon); + ctx.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_fastforward_description), baseActionIcon); case NotificationConstants.SMART_REWIND_PREVIOUS: if (player.getPlayQueue() != null && player.getPlayQueue().size() > 1) { return new NotificationActionData(ACTION_PLAY_PREVIOUS, - ctx.getString(R.string.exo_controls_previous_description), - R.drawable.exo_notification_previous); + ctx.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_previous_description), + com.google.android.exoplayer2.ui.R.drawable.exo_notification_previous); } else { return new NotificationActionData(ACTION_FAST_REWIND, - ctx.getString(R.string.exo_controls_rewind_description), - R.drawable.exo_controls_rewind); + ctx.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_rewind_description), + com.google.android.exoplayer2.ui.R.drawable.exo_controls_rewind); } case NotificationConstants.SMART_FORWARD_NEXT: if (player.getPlayQueue() != null && player.getPlayQueue().size() > 1) { return new NotificationActionData(ACTION_PLAY_NEXT, - ctx.getString(R.string.exo_controls_next_description), - R.drawable.exo_notification_next); + ctx.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_next_description), + com.google.android.exoplayer2.ui.R.drawable.exo_notification_next); } else { return new NotificationActionData(ACTION_FAST_FORWARD, - ctx.getString(R.string.exo_controls_fastforward_description), - R.drawable.exo_controls_fastforward); + ctx.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_fastforward_description), + com.google.android.exoplayer2.ui.R.drawable.exo_controls_fastforward); } case NotificationConstants.PLAY_PAUSE_BUFFERING: @@ -119,45 +126,56 @@ public final class NotificationActionData { case NotificationConstants.PLAY_PAUSE: if (player.getCurrentState() == Player.STATE_COMPLETED) { return new NotificationActionData(ACTION_PLAY_PAUSE, - ctx.getString(R.string.exo_controls_pause_description), + ctx.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_pause_description), R.drawable.ic_replay); } else if (player.isPlaying() || player.getCurrentState() == Player.STATE_PREFLIGHT || player.getCurrentState() == Player.STATE_BLOCKED || player.getCurrentState() == Player.STATE_BUFFERING) { return new NotificationActionData(ACTION_PLAY_PAUSE, - ctx.getString(R.string.exo_controls_pause_description), - R.drawable.exo_notification_pause); + ctx.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_pause_description), + com.google.android.exoplayer2.ui.R.drawable.exo_notification_pause); } else { return new NotificationActionData(ACTION_PLAY_PAUSE, - ctx.getString(R.string.exo_controls_play_description), - R.drawable.exo_notification_play); + ctx.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_play_description), + com.google.android.exoplayer2.ui.R.drawable.exo_notification_play); } case NotificationConstants.REPEAT: if (player.getRepeatMode() == REPEAT_MODE_ALL) { return new NotificationActionData(ACTION_REPEAT, - ctx.getString(R.string.exo_controls_repeat_all_description), - R.drawable.exo_media_action_repeat_all); + ctx.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_repeat_all_description), + com.google.android.exoplayer2.ext.mediasession.R.drawable + .exo_media_action_repeat_all); } else if (player.getRepeatMode() == REPEAT_MODE_ONE) { return new NotificationActionData(ACTION_REPEAT, - ctx.getString(R.string.exo_controls_repeat_one_description), - R.drawable.exo_media_action_repeat_one); + ctx.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_repeat_one_description), + com.google.android.exoplayer2.ext.mediasession.R.drawable + .exo_media_action_repeat_one); } else /* player.getRepeatMode() == REPEAT_MODE_OFF */ { return new NotificationActionData(ACTION_REPEAT, - ctx.getString(R.string.exo_controls_repeat_off_description), - R.drawable.exo_media_action_repeat_off); + ctx.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_repeat_off_description), + com.google.android.exoplayer2.ext.mediasession.R.drawable + .exo_media_action_repeat_off); } case NotificationConstants.SHUFFLE: if (player.getPlayQueue() != null && player.getPlayQueue().isShuffled()) { return new NotificationActionData(ACTION_SHUFFLE, - ctx.getString(R.string.exo_controls_shuffle_on_description), - R.drawable.exo_controls_shuffle_on); + ctx.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_shuffle_on_description), + com.google.android.exoplayer2.ui.R.drawable.exo_controls_shuffle_on); } else { return new NotificationActionData(ACTION_SHUFFLE, - ctx.getString(R.string.exo_controls_shuffle_off_description), - R.drawable.exo_controls_shuffle_off); + ctx.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_shuffle_off_description), + com.google.android.exoplayer2.ui.R.drawable.exo_controls_shuffle_off); } case NotificationConstants.CLOSE: diff --git a/app/src/main/java/org/schabi/newpipe/player/notification/NotificationConstants.java b/app/src/main/java/org/schabi/newpipe/player/notification/NotificationConstants.java index b9607f7ea..4f304b405 100644 --- a/app/src/main/java/org/schabi/newpipe/player/notification/NotificationConstants.java +++ b/app/src/main/java/org/schabi/newpipe/player/notification/NotificationConstants.java @@ -78,16 +78,16 @@ public final class NotificationConstants { @DrawableRes public static final int[] ACTION_ICONS = { 0, - R.drawable.exo_icon_previous, - R.drawable.exo_icon_next, - R.drawable.exo_icon_rewind, - R.drawable.exo_icon_fastforward, - R.drawable.exo_icon_previous, - R.drawable.exo_icon_next, + com.google.android.exoplayer2.ui.R.drawable.exo_icon_previous, + com.google.android.exoplayer2.ui.R.drawable.exo_icon_next, + com.google.android.exoplayer2.ui.R.drawable.exo_icon_rewind, + com.google.android.exoplayer2.ui.R.drawable.exo_icon_fastforward, + com.google.android.exoplayer2.ui.R.drawable.exo_icon_previous, + com.google.android.exoplayer2.ui.R.drawable.exo_icon_next, R.drawable.ic_pause, R.drawable.ic_hourglass_top, - R.drawable.exo_icon_repeat_all, - R.drawable.exo_icon_shuffle_on, + com.google.android.exoplayer2.ui.R.drawable.exo_icon_repeat_all, + com.google.android.exoplayer2.ui.R.drawable.exo_icon_shuffle_on, R.drawable.ic_close, }; @@ -122,29 +122,41 @@ public final class NotificationConstants { public static String getActionName(@NonNull final Context context, @Action final int action) { switch (action) { case PREVIOUS: - return context.getString(R.string.exo_controls_previous_description); + return context.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_previous_description); case NEXT: - return context.getString(R.string.exo_controls_next_description); + return context.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_next_description); case REWIND: - return context.getString(R.string.exo_controls_rewind_description); + return context.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_rewind_description); case FORWARD: - return context.getString(R.string.exo_controls_fastforward_description); + return context.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_fastforward_description); case SMART_REWIND_PREVIOUS: return Localization.concatenateStrings( - context.getString(R.string.exo_controls_rewind_description), - context.getString(R.string.exo_controls_previous_description)); + context.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_rewind_description), + context.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_previous_description)); case SMART_FORWARD_NEXT: return Localization.concatenateStrings( - context.getString(R.string.exo_controls_fastforward_description), - context.getString(R.string.exo_controls_next_description)); + context.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_fastforward_description), + context.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_next_description)); case PLAY_PAUSE: return Localization.concatenateStrings( - context.getString(R.string.exo_controls_play_description), - context.getString(R.string.exo_controls_pause_description)); + context.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_play_description), + context.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_pause_description)); case PLAY_PAUSE_BUFFERING: return Localization.concatenateStrings( - context.getString(R.string.exo_controls_play_description), - context.getString(R.string.exo_controls_pause_description), + context.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_play_description), + context.getString(com.google.android.exoplayer2.ui.R.string + .exo_controls_pause_description), context.getString(R.string.notification_action_buffering)); case REPEAT: return context.getString(R.string.notification_action_repeat); diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java index 9e8bd977e..73c4ef35d 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java @@ -991,11 +991,14 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa super.onRepeatModeChanged(repeatMode); if (repeatMode == REPEAT_MODE_ALL) { - binding.repeatButton.setImageResource(R.drawable.exo_controls_repeat_all); + binding.repeatButton.setImageResource( + com.google.android.exoplayer2.ui.R.drawable.exo_controls_repeat_all); } else if (repeatMode == REPEAT_MODE_ONE) { - binding.repeatButton.setImageResource(R.drawable.exo_controls_repeat_one); + binding.repeatButton.setImageResource( + com.google.android.exoplayer2.ui.R.drawable.exo_controls_repeat_one); } else /* repeatMode == REPEAT_MODE_OFF */ { - binding.repeatButton.setImageResource(R.drawable.exo_controls_repeat_off); + binding.repeatButton.setImageResource( + com.google.android.exoplayer2.ui.R.drawable.exo_controls_repeat_off); } } diff --git a/app/src/main/java/org/schabi/newpipe/util/text/CommentTextOnTouchListener.java b/app/src/main/java/org/schabi/newpipe/util/text/CommentTextOnTouchListener.java deleted file mode 100644 index 5018a6120..000000000 --- a/app/src/main/java/org/schabi/newpipe/util/text/CommentTextOnTouchListener.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.schabi.newpipe.util.text; - -import static org.schabi.newpipe.util.text.TouchUtils.getOffsetForHorizontalLine; - -import android.annotation.SuppressLint; -import android.text.Spanned; -import android.text.style.ClickableSpan; -import android.view.MotionEvent; -import android.view.View; -import android.widget.TextView; - -public class CommentTextOnTouchListener implements View.OnTouchListener { - public static final CommentTextOnTouchListener INSTANCE = new CommentTextOnTouchListener(); - - @SuppressLint("ClickableViewAccessibility") - @Override - public boolean onTouch(final View v, final MotionEvent event) { - if (!(v instanceof TextView)) { - return false; - } - final TextView widget = (TextView) v; - final CharSequence text = widget.getText(); - if (text instanceof Spanned) { - final Spanned buffer = (Spanned) text; - final int action = event.getAction(); - - if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) { - final int offset = getOffsetForHorizontalLine(widget, event); - final ClickableSpan[] links = buffer.getSpans(offset, offset, ClickableSpan.class); - - if (links.length != 0) { - if (action == MotionEvent.ACTION_UP) { - links[0].onClick(widget); - } - // we handle events that intersect links, so return true - return true; - } - } - } - return false; - } -} diff --git a/gradle.properties b/gradle.properties index 7b138b24e..0ca913222 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ android.defaults.buildfeatures.buildconfig=true android.enableJetifier=false android.nonFinalResIds=false -android.nonTransitiveRClass=false +android.nonTransitiveRClass=true android.useAndroidX=true org.gradle.jvmargs=-Xmx2048M --add-opens jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED systemProp.file.encoding=utf-8