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