Merge remote-tracking branch 'origin/dev' into notifications-1

This commit is contained in:
TobiGr 2021-11-02 07:56:09 +01:00
commit 1130aba7ca
106 changed files with 706 additions and 441 deletions

16
.gitignore vendored
View File

@ -1,15 +1,15 @@
.gitignore
.gradle
/local.properties
.gradle/
local.properties
.DS_Store
/build
/captures
/app/app.iml
/.idea
/*.iml
build/
captures/
.idea/
*.iml
*~
.weblate
*.class
**/debug/
**/release/
# vscode / eclipse files
*.classpath

3
app/.gitignore vendored
View File

@ -1,3 +0,0 @@
.gitignore
/build
*.iml

View File

@ -17,8 +17,8 @@ android {
resValue "string", "app_name", "NewPipe"
minSdkVersion 19
targetSdkVersion 29
versionCode 978
versionName "0.21.12"
versionCode 979
versionName "0.21.13"
multiDexEnabled true
@ -107,7 +107,7 @@ ext {
icepickVersion = '3.2.0'
exoPlayerVersion = '2.12.3'
googleAutoServiceVersion = '1.0'
groupieVersion = '2.9.0'
groupieVersion = '2.10.0'
markwonVersion = '4.6.2'
leakCanaryVersion = '2.5'
@ -190,7 +190,7 @@ dependencies {
// name and the commit hash with the commit hash of the (pushed) commit you want to test
// This works thanks to JitPack: https://jitpack.io/
implementation 'com.github.TeamNewPipe:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751'
implementation 'com.github.TeamNewPipe:NewPipeExtractor:v0.21.11'
implementation 'com.github.TeamNewPipe:NewPipeExtractor:4f60225ddc'
/** Checkstyle **/
checkstyle "com.puppycrawl.tools:checkstyle:${checkstyleVersion}"
@ -209,14 +209,17 @@ dependencies {
implementation "androidx.lifecycle:lifecycle-livedata:${androidxLifecycleVersion}"
implementation "androidx.lifecycle:lifecycle-viewmodel:${androidxLifecycleVersion}"
implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0'
implementation 'androidx.media:media:1.4.2'
implementation 'androidx.media:media:1.4.3'
implementation 'androidx.multidex:multidex:2.0.1'
implementation 'androidx.preference:preference:1.1.1'
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'androidx.recyclerview:recyclerview:1.2.1'
implementation "androidx.room:room-runtime:${androidxRoomVersion}"
implementation "androidx.room:room-rxjava3:${androidxRoomVersion}"
kapt "androidx.room:room-compiler:${androidxRoomVersion}"
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
// Newer version specified to prevent accessibility regressions with RecyclerView, see:
// https://developer.android.com/jetpack/androidx/releases/viewpager2#1.1.0-alpha01
implementation 'androidx.viewpager2:viewpager2:1.1.0-beta01'
implementation 'androidx.webkit:webkit:1.4.0'
implementation 'com.google.android.material:material:1.2.1'
implementation "androidx.work:work-runtime-ktx:${workVersion}"

View File

@ -256,6 +256,21 @@
<data android:pathPrefix="/" />
</intent-filter>
<!-- y2u.be filter -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" />
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" />
<data android:scheme="https" />
<data android:host="y2u.be" />
<data android:pathPrefix="/" />
</intent-filter>
<!-- Soundcloud filter -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />

View File

@ -51,8 +51,12 @@ import java.util.ArrayList;
* <li>{@link #saveState()}</li>
* <li>{@link #restoreState(Parcelable, ClassLoader)}</li>
* </ul>
*
* @deprecated Switch to {@link androidx.viewpager2.widget.ViewPager2} and use
* {@link androidx.viewpager2.adapter.FragmentStateAdapter} instead.
*/
@SuppressWarnings("deprecation")
@Deprecated
public abstract class FragmentStatePagerAdapterMenuWorkaround extends PagerAdapter {
private static final String TAG = "FragmentStatePagerAdapt";
private static final boolean DEBUG = false;
@ -86,9 +90,10 @@ public abstract class FragmentStatePagerAdapterMenuWorkaround extends PagerAdapt
private final int mBehavior;
private FragmentTransaction mCurTransaction = null;
private final ArrayList<Fragment.SavedState> mSavedState = new ArrayList<Fragment.SavedState>();
private final ArrayList<Fragment> mFragments = new ArrayList<Fragment>();
private final ArrayList<Fragment.SavedState> mSavedState = new ArrayList<>();
private final ArrayList<Fragment> mFragments = new ArrayList<>();
private Fragment mCurrentPrimaryItem = null;
private boolean mExecutingFinishUpdate;
/**
* Constructor for {@link FragmentStatePagerAdapterMenuWorkaround}
@ -208,7 +213,7 @@ public abstract class FragmentStatePagerAdapterMenuWorkaround extends PagerAdapt
mFragments.set(position, null);
mCurTransaction.remove(fragment);
if (fragment == mCurrentPrimaryItem) {
if (fragment.equals(mCurrentPrimaryItem)) {
mCurrentPrimaryItem = null;
}
}
@ -247,7 +252,19 @@ public abstract class FragmentStatePagerAdapterMenuWorkaround extends PagerAdapt
@Override
public void finishUpdate(@NonNull final ViewGroup container) {
if (mCurTransaction != null) {
mCurTransaction.commitNowAllowingStateLoss();
// We drop any transactions that attempt to be committed
// from a re-entrant call to finishUpdate(). We need to
// do this as a workaround for Robolectric running measure/layout
// calls inline rather than allowing them to be posted
// as they would on a real device.
if (!mExecutingFinishUpdate) {
try {
mExecutingFinishUpdate = true;
mCurTransaction.commitNowAllowingStateLoss();
} finally {
mExecutingFinishUpdate = false;
}
}
mCurTransaction = null;
}
}

View File

@ -262,4 +262,5 @@ public class App extends MultiDexApplication {
protected boolean isDisposedRxExceptionsReported() {
return false;
}
}

View File

@ -21,7 +21,6 @@ public abstract class BaseFragment extends Fragment {
//These values are used for controlling fragments when they are part of the frontpage
@State
protected boolean useAsFrontPage = false;
private boolean mIsVisibleToUser = false;
public void useAsFrontPage(final boolean value) {
useAsFrontPage = value;
@ -85,12 +84,6 @@ public abstract class BaseFragment extends Fragment {
AppWatcher.INSTANCE.getObjectWatcher().watch(this);
}
@Override
public void setUserVisibleHint(final boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
mIsVisibleToUser = isVisibleToUser;
}
/*//////////////////////////////////////////////////////////////////////////
// Init
//////////////////////////////////////////////////////////////////////////*/
@ -109,8 +102,7 @@ public abstract class BaseFragment extends Fragment {
if (DEBUG) {
Log.d(TAG, "setTitle() called with: title = [" + title + "]");
}
if ((!useAsFrontPage || mIsVisibleToUser)
&& (activity != null && activity.getSupportActionBar() != null)) {
if (!useAsFrontPage && activity != null && activity.getSupportActionBar() != null) {
activity.getSupportActionBar().setDisplayShowTitleEnabled(true);
activity.getSupportActionBar().setTitle(title);
}

View File

@ -7,7 +7,6 @@ import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.net.ConnectivityManager;
import android.net.Uri;
import android.util.Log;
@ -15,7 +14,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;
import androidx.core.content.ContextCompat;
import androidx.core.content.pm.PackageInfoCompat;
import androidx.preference.PreferenceManager;
@ -48,7 +46,8 @@ public final class CheckForNewAppVersion extends IntentService {
private static final boolean DEBUG = MainActivity.DEBUG;
private static final String TAG = CheckForNewAppVersion.class.getSimpleName();
private static final String GITHUB_APK_SHA1
// Public key of the certificate that is used in NewPipe release versions
private static final String RELEASE_CERT_PUBLIC_KEY_SHA1
= "B0:2E:90:7C:1C:D6:FC:57:C3:35:F0:88:D0:8F:50:5F:94:E4:D2:15";
private static final String NEWPIPE_API_URL = "https://newpipe.net/api/data.json";
@ -129,44 +128,37 @@ public final class CheckForNewAppVersion extends IntentService {
final String versionName,
final String apkLocationUrl,
final int versionCode) {
final int notificationId = 2000;
if (BuildConfig.VERSION_CODE < versionCode) {
// A pending intent to open the apk location url in the browser.
final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(apkLocationUrl));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
final PendingIntent pendingIntent
= PendingIntent.getActivity(application, 0, intent, 0);
final String channelId = application
.getString(R.string.app_update_notification_channel_id);
final NotificationCompat.Builder notificationBuilder
= new NotificationCompat.Builder(application, channelId)
.setSmallIcon(R.drawable.ic_newpipe_update)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setContentIntent(pendingIntent)
.setAutoCancel(true)
.setContentTitle(application
.getString(R.string.app_update_notification_content_title))
.setContentText(application
.getString(R.string.app_update_notification_content_text)
+ " " + versionName);
final NotificationManagerCompat notificationManager
= NotificationManagerCompat.from(application);
notificationManager.notify(notificationId, notificationBuilder.build());
if (BuildConfig.VERSION_CODE >= versionCode) {
return;
}
// A pending intent to open the apk location url in the browser.
final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(apkLocationUrl));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
final PendingIntent pendingIntent
= PendingIntent.getActivity(application, 0, intent, 0);
final String channelId = application
.getString(R.string.app_update_notification_channel_id);
final NotificationCompat.Builder notificationBuilder
= new NotificationCompat.Builder(application, channelId)
.setSmallIcon(R.drawable.ic_newpipe_update)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setContentIntent(pendingIntent)
.setAutoCancel(true)
.setContentTitle(application
.getString(R.string.app_update_notification_content_title))
.setContentText(application
.getString(R.string.app_update_notification_content_text)
+ " " + versionName);
final NotificationManagerCompat notificationManager
= NotificationManagerCompat.from(application);
notificationManager.notify(2000, notificationBuilder.build());
}
private static boolean isConnected(@NonNull final App app) {
final ConnectivityManager connectivityManager =
ContextCompat.getSystemService(app, ConnectivityManager.class);
return connectivityManager != null && connectivityManager.getActiveNetworkInfo() != null
&& connectivityManager.getActiveNetworkInfo().isConnected();
}
public static boolean isGithubApk(@NonNull final App app) {
return getCertificateSHA1Fingerprint(app).equals(GITHUB_APK_SHA1);
public static boolean isReleaseApk(@NonNull final App app) {
return getCertificateSHA1Fingerprint(app).equals(RELEASE_CERT_PUBLIC_KEY_SHA1);
}
private void checkNewVersion() throws IOException, ReCaptchaException {
@ -175,9 +167,8 @@ public final class CheckForNewAppVersion extends IntentService {
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(app);
final NewVersionManager manager = new NewVersionManager();
// Check if user has enabled/disabled update checking
// and if the current apk is a github one or not.
if (!prefs.getBoolean(app.getString(R.string.update_app_key), true) || !isGithubApk(app)) {
// Check if the current apk is a github one or not.
if (!isReleaseApk(app)) {
return;
}
@ -213,6 +204,7 @@ public final class CheckForNewAppVersion extends IntentService {
// Parse the json from the response.
try {
final JsonObject githubStableObject = JsonParser.object()
.from(response.responseBody()).getObject("flavors")
.getObject("github").getObject("stable");
@ -235,6 +227,23 @@ public final class CheckForNewAppVersion extends IntentService {
}
}
/**
* Start a new service which
* checks if all conditions for performing a version check are met,
* fetches the API endpoint {@link #NEWPIPE_API_URL} containing info
* about the latest NewPipe version
* and displays a notification about ana available update.
* <br>
* Following conditions need to be met, before data is request from the server:
* <ul>
* <li> The app is signed with the correct signing key (by TeamNewPipe / schabi).
* If the signing key differs from the one used upstream, the update cannot be installed.</li>
* <li>The user enabled searching for and notifying about updates in the settings.</li>
* <li>The app did not recently check for updates.
* We do not want to make unnecessary connections and DOS our servers.</li>
* </ul>
* <b>Must not be executed</b> when the app is in background.
*/
public static void startNewVersionCheckService() {
final Intent intent = new Intent(App.getApp().getApplicationContext(),
CheckForNewAppVersion.class);

View File

@ -165,13 +165,25 @@ public class MainActivity extends AppCompatActivity {
}
openMiniPlayerUponPlayerStarted();
// Check for new version
startNewVersionCheckService();
// shedule worker for checking for new streans and creating corresponding notifications
NotificationWorker.schedule(this);
}
@Override
protected void onPostCreate(final Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
final App app = App.getApp();
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(app);
if (prefs.getBoolean(app.getString(R.string.update_app_key), true)) {
// Start the service which is checking all conditions
// and eventually searching for a new version.
// The service searching for a new NewPipe version must not be started in background.
startNewVersionCheckService();
}
}
private void setupDrawer() throws ExtractionException {
addDrawerMenuForCurrentService();

View File

@ -18,6 +18,9 @@ import org.schabi.newpipe.util.NavigationHelper;
import java.util.Collections;
public final class QueueItemMenuUtil {
private QueueItemMenuUtil() {
}
public static void openPopupMenu(final PlayQueue playQueue,
final PlayQueueItem item,
final View view,
@ -57,6 +60,13 @@ public final class QueueItemMenuUtil {
);
return true;
case R.id.menu_item_channel_details:
// An intent must be used here.
// Opening with FragmentManager transactions is not working,
// as PlayQueueActivity doesn't use fragments.
NavigationHelper.openChannelFragmentUsingIntent(context, item.getServiceId(),
item.getUploaderUrl(), item.getUploader());
return true;
case R.id.menu_item_share:
shareText(context, item.getTitle(), item.getUrl(),
item.getThumbnailUrl());
@ -67,6 +77,4 @@ public final class QueueItemMenuUtil {
popupMenu.show();
}
private QueueItemMenuUtil() { }
}

View File

@ -20,8 +20,8 @@ public class BlankFragment extends BaseFragment {
}
@Override
public void setUserVisibleHint(final boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
public void onResume() {
super.onResume();
setTitle("NewPipe");
// leave this inline. Will make it harder for copy cats.
// If you are a Copy cat FUCK YOU.

View File

@ -1181,7 +1181,7 @@ public final class VideoDetailFragment
addVideoPlayerView();
final Intent playerIntent = NavigationHelper.getPlayerIntent(requireContext(),
MainPlayer.class, queue, autoPlayEnabled);
MainPlayer.class, queue, true, autoPlayEnabled);
ContextCompat.startForegroundService(activity, playerIntent);
}

View File

@ -143,7 +143,7 @@ public abstract class BaseListFragment<I, N> extends BaseStateFragment<I>
final View focusedItem = itemsList.getFocusedChild();
final RecyclerView.ViewHolder itemHolder =
itemsList.findContainingViewHolder(focusedItem);
return itemHolder.getAdapterPosition();
return itemHolder.getBindingAdapterPosition();
} catch (final NullPointerException e) {
return -1;
}

View File

@ -103,11 +103,9 @@ public class ChannelFragment extends BaseListInfoFragment<ChannelInfo>
}
@Override
public void setUserVisibleHint(final boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (activity != null
&& useAsFrontPage
&& isVisibleToUser) {
public void onResume() {
super.onResume();
if (activity != null && useAsFrontPage) {
setTitle(currentInfo != null ? currentInfo.getName() : name);
}
}

View File

@ -99,9 +99,12 @@ public class KioskFragment extends BaseListInfoFragment<KioskInfo> {
}
@Override
public void setUserVisibleHint(final boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (useAsFrontPage && isVisibleToUser && activity != null) {
public void onResume() {
super.onResume();
if (!Localization.getPreferredContentCountry(requireContext()).equals(contentCountry)) {
reloadContent();
}
if (useAsFrontPage && activity != null) {
try {
setTitle(kioskTranslatedName);
} catch (final Exception e) {
@ -117,15 +120,6 @@ public class KioskFragment extends BaseListInfoFragment<KioskInfo> {
return inflater.inflate(R.layout.fragment_kiosk, container, false);
}
@Override
public void onResume() {
super.onResume();
if (!Localization.getPreferredContentCountry(requireContext()).equals(contentCountry)) {
reloadContent();
}
}
/*//////////////////////////////////////////////////////////////////////////
// Menu
//////////////////////////////////////////////////////////////////////////*/

View File

@ -1088,7 +1088,7 @@ public class SearchFragment extends BaseListFragment<SearchInfo, ListExtractor.I
//////////////////////////////////////////////////////////////////////////*/
public int getSuggestionMovementFlags(@NonNull final RecyclerView.ViewHolder viewHolder) {
final int position = viewHolder.getAdapterPosition();
final int position = viewHolder.getBindingAdapterPosition();
if (position == RecyclerView.NO_POSITION) {
return 0;
}
@ -1099,7 +1099,7 @@ public class SearchFragment extends BaseListFragment<SearchInfo, ListExtractor.I
}
public void onSuggestionItemSwiped(@NonNull final RecyclerView.ViewHolder viewHolder) {
final int position = viewHolder.getAdapterPosition();
final int position = viewHolder.getBindingAdapterPosition();
final String query = suggestionListAdapter.getItem(position).query;
final Disposable onDelete = historyRecordManager.deleteSearchHistory(query)
.observeOn(AndroidSchedulers.mainThread())

View File

@ -78,9 +78,9 @@ public final class BookmarkFragment extends BaseLocalListFragment<List<PlaylistL
}
@Override
public void setUserVisibleHint(final boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (activity != null && isVisibleToUser) {
public void onResume() {
super.onResume();
if (activity != null) {
setTitle(activity.getString(R.string.tab_bookmarks));
}
}

View File

@ -101,9 +101,9 @@ public class StatisticsPlaylistFragment
}
@Override
public void setUserVisibleHint(final boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (activity != null && isVisibleToUser) {
public void onResume() {
super.onResume();
if (activity != null) {
setTitle(activity.getString(R.string.title_activity_history));
}
}

View File

@ -709,8 +709,8 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
return false;
}
final int sourceIndex = source.getAdapterPosition();
final int targetIndex = target.getAdapterPosition();
final int sourceIndex = source.getBindingAdapterPosition();
final int targetIndex = target.getBindingAdapterPosition();
final boolean isSwapped = itemListAdapter.swapItems(sourceIndex, targetIndex);
if (isSwapped) {
saveChanges();

View File

@ -97,11 +97,9 @@ public class SubscriptionsImportFragment extends BaseFragment {
}
@Override
public void setUserVisibleHint(final boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
setTitle(getString(R.string.import_title));
}
public void onResume() {
super.onResume();
setTitle(getString(R.string.import_title));
}
@Nullable

View File

@ -112,8 +112,8 @@ class FeedGroupReorderDialog : DialogFragment() {
source: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
val sourceIndex = source.adapterPosition
val targetIndex = target.adapterPosition
val sourceIndex = source.bindingAdapterPosition
val targetIndex = target.bindingAdapterPosition
groupAdapter.notifyItemMoved(sourceIndex, targetIndex)
Collections.swap(groupOrderedIdList, sourceIndex, targetIndex)

View File

@ -51,6 +51,6 @@ public abstract class PlayQueueItemTouchCallback extends ItemTouchHelper.SimpleC
@Override
public void onSwiped(final RecyclerView.ViewHolder viewHolder, final int swipeDir) {
onSwiped(viewHolder.getAdapterPosition());
onSwiped(viewHolder.getBindingAdapterPosition());
}
}

View File

@ -16,8 +16,9 @@ public class MainSettingsFragment extends BasePreferenceFragment {
public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {
addPreferencesFromResource(R.xml.main_settings);
if (!CheckForNewAppVersion.isGithubApk(App.getApp())) {
final Preference update = findPreference(getString(R.string.update_pref_screen_key));
if (!CheckForNewAppVersion.isReleaseApk(App.getApp())) {
final Preference update
= findPreference(getString(R.string.update_pref_screen_key));
getPreferenceScreen().removePreference(update);
defaultPreferences.edit().putBoolean(getString(R.string.update_app_key), false).apply();

View File

@ -303,8 +303,8 @@ public class PeertubeInstanceListFragment extends Fragment {
return false;
}
final int sourceIndex = source.getAdapterPosition();
final int targetIndex = target.getAdapterPosition();
final int sourceIndex = source.getBindingAdapterPosition();
final int targetIndex = target.getBindingAdapterPosition();
instanceListAdapter.swapItems(sourceIndex, targetIndex);
return true;
}
@ -322,7 +322,7 @@ public class PeertubeInstanceListFragment extends Fragment {
@Override
public void onSwiped(@NonNull final RecyclerView.ViewHolder viewHolder,
final int swipeDir) {
final int position = viewHolder.getAdapterPosition();
final int position = viewHolder.getBindingAdapterPosition();
// do not allow swiping the selected instance
if (instanceList.get(position).getUrl().equals(selectedInstance.getUrl())) {
instanceListAdapter.notifyItemChanged(position);

View File

@ -1,34 +1,48 @@
package org.schabi.newpipe.settings;
import static org.schabi.newpipe.CheckForNewAppVersion.startNewVersionCheckService;
import android.os.Bundle;
import android.widget.Toast;
import androidx.preference.Preference;
import org.schabi.newpipe.R;
import static org.schabi.newpipe.CheckForNewAppVersion.startNewVersionCheckService;
public class UpdateSettingsFragment extends BasePreferenceFragment {
private final Preference.OnPreferenceChangeListener updatePreferenceChange
= (preference, checkForUpdates) -> {
defaultPreferences.edit()
.putBoolean(getString(R.string.update_app_key), (boolean) checkForUpdates).apply();
if ((boolean) checkForUpdates) {
// Search for updates immediately when update checks are enabled.
// Reset the expire time. This is necessary to check for an update immediately.
defaultPreferences.edit()
.putLong(getString(R.string.update_expiry_key), 0).apply();
startNewVersionCheckService();
}
if ((boolean) checkForUpdates) {
checkNewVersionNow();
}
return true;
};
private final Preference.OnPreferenceClickListener manualUpdateClick
= preference -> {
Toast.makeText(getContext(), R.string.checking_updates_toast, Toast.LENGTH_SHORT).show();
checkNewVersionNow();
return true;
};
private void checkNewVersionNow() {
// Search for updates immediately when update checks are enabled.
// Reset the expire time. This is necessary to check for an update immediately.
defaultPreferences.edit()
.putLong(getString(R.string.update_expiry_key), 0).apply();
startNewVersionCheckService();
}
@Override
public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {
addPreferencesFromResource(R.xml.update_settings);
final String updateToggleKey = getString(R.string.update_app_key);
findPreference(updateToggleKey).setOnPreferenceChangeListener(updatePreferenceChange);
findPreference(getString(R.string.update_app_key))
.setOnPreferenceChangeListener(updatePreferenceChange);
findPreference(getString(R.string.manual_update_key))
.setOnPreferenceClickListener(manualUpdateClick);
}
}

View File

@ -299,8 +299,8 @@ public class ChooseTabsFragment extends Fragment {
return false;
}
final int sourceIndex = source.getAdapterPosition();
final int targetIndex = target.getAdapterPosition();
final int sourceIndex = source.getBindingAdapterPosition();
final int targetIndex = target.getBindingAdapterPosition();
selectedTabsAdapter.swapItems(sourceIndex, targetIndex);
return true;
}
@ -318,7 +318,7 @@ public class ChooseTabsFragment extends Fragment {
@Override
public void onSwiped(@NonNull final RecyclerView.ViewHolder viewHolder,
final int swipeDir) {
final int position = viewHolder.getAdapterPosition();
final int position = viewHolder.getBindingAdapterPosition();
tabList.remove(position);
selectedTabsAdapter.notifyItemRemoved(position);

View File

@ -77,7 +77,8 @@ public final class NavigationHelper {
@NonNull
public static <T> Intent getPlayerIntent(@NonNull final Context context,
@NonNull final Class<T> targetClazz,
@Nullable final PlayQueue playQueue) {
@Nullable final PlayQueue playQueue,
final boolean resumePlayback) {
final Intent intent = new Intent(context, targetClazz);
if (playQueue != null) {
@ -87,6 +88,7 @@ public final class NavigationHelper {
}
}
intent.putExtra(Player.PLAYER_TYPE, MainPlayer.PlayerType.VIDEO.ordinal());
intent.putExtra(Player.RESUME_PLAYBACK, resumePlayback);
return intent;
}
@ -95,8 +97,9 @@ public final class NavigationHelper {
public static <T> Intent getPlayerIntent(@NonNull final Context context,
@NonNull final Class<T> targetClazz,
@Nullable final PlayQueue playQueue,
final boolean resumePlayback,
final boolean playWhenReady) {
return getPlayerIntent(context, targetClazz, playQueue)
return getPlayerIntent(context, targetClazz, playQueue, resumePlayback)
.putExtra(Player.PLAY_WHEN_READY, playWhenReady);
}
@ -104,7 +107,14 @@ public final class NavigationHelper {
public static <T> Intent getPlayerEnqueueIntent(@NonNull final Context context,
@NonNull final Class<T> targetClazz,
@Nullable final PlayQueue playQueue) {
return getPlayerIntent(context, targetClazz, playQueue)
// when enqueueing `resumePlayback` is always `false` since:
// - if there is a video already playing, the value of `resumePlayback` just doesn't make
// any difference.
// - if there is nothing already playing, it is useful for the enqueue action to have a
// slightly different behaviour than the normal play action: the latter resumes playback,
// the former doesn't. (note that enqueue can be triggered when nothing is playing only
// by long pressing the video detail fragment, playlist or channel controls
return getPlayerIntent(context, targetClazz, playQueue, false)
.putExtra(Player.ENQUEUE, true);
}
@ -112,7 +122,8 @@ public final class NavigationHelper {
public static <T> Intent getPlayerEnqueueNextIntent(@NonNull final Context context,
@NonNull final Class<T> targetClazz,
@Nullable final PlayQueue playQueue) {
return getPlayerIntent(context, targetClazz, playQueue)
// see comment in `getPlayerEnqueueIntent` as to why `resumePlayback` is false
return getPlayerIntent(context, targetClazz, playQueue, false)
.putExtra(Player.ENQUEUE_NEXT, true);
}
@ -495,6 +506,27 @@ public final class NavigationHelper {
context.startActivity(intent);
}
/**
* Opens {@link ChannelFragment}.
* Use this instead of {@link #openChannelFragment(FragmentManager, int, String, String)}
* when no fragments are used / no FragmentManager is available.
* @param context
* @param serviceId
* @param url
* @param title
*/
public static void openChannelFragmentUsingIntent(final Context context,
final int serviceId,
final String url,
@NonNull final String title) {
final Intent intent = getOpenIntent(context, url, serviceId,
StreamingService.LinkType.CHANNEL);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(Constants.KEY_TITLE, title);
context.startActivity(intent);
}
public static void openMainActivity(final Context context) {
final Intent mIntent = new Intent(context, MainActivity.class);
mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

View File

@ -0,0 +1,61 @@
package org.schabi.newpipe.util;
import android.content.Context;
import android.text.Selection;
import android.text.Spannable;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.schabi.newpipe.util.external_communication.ShareUtils;
import org.schabi.newpipe.views.NewPipeEditText;
import org.schabi.newpipe.views.NewPipeTextView;
public final class NewPipeTextViewHelper {
private NewPipeTextViewHelper() {
}
/**
* Share the selected text of {@link NewPipeTextView NewPipeTextViews} and
* {@link NewPipeEditText NewPipeEditTexts} with
* {@link ShareUtils#shareText(Context, String, String)}.
*
* <p>
* This allows EMUI users to get the Android share sheet instead of the EMUI share sheet when
* using the {@code Share} command of the popup menu which appears when selecting text.
* </p>
*
* @param textView the {@link TextView} on which sharing the selected text. It should be a
* {@link NewPipeTextView} or a {@link NewPipeEditText} (even if
* {@link TextView standard TextViews} are supported).
*/
public static void shareSelectedTextWithShareUtils(@NonNull final TextView textView) {
final CharSequence textViewText = textView.getText();
shareSelectedTextIfNotNullAndNotEmpty(textView, getSelectedText(textView, textViewText));
if (textViewText instanceof Spannable) {
Selection.setSelection((Spannable) textViewText, textView.getSelectionEnd());
}
}
@Nullable
private static CharSequence getSelectedText(@NonNull final TextView textView,
@Nullable final CharSequence text) {
if (!textView.hasSelection() || text == null) {
return null;
}
final int start = textView.getSelectionStart();
final int end = textView.getSelectionEnd();
return String.valueOf(start > end ? text.subSequence(end, start)
: text.subSequence(start, end));
}
private static void shareSelectedTextIfNotNullAndNotEmpty(
@NonNull final TextView textView,
@Nullable final CharSequence selectedText) {
if (selectedText != null && selectedText.length() != 0) {
ShareUtils.shareText(textView.getContext(), "", selectedText.toString());
}
}
}

View File

@ -0,0 +1,45 @@
package org.schabi.newpipe.views;
import android.content.Context;
import android.util.AttributeSet;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatEditText;
import org.schabi.newpipe.util.NewPipeTextViewHelper;
import org.schabi.newpipe.util.external_communication.ShareUtils;
/**
* An {@link AppCompatEditText} which uses {@link ShareUtils#shareText(Context, String, String)}
* when sharing selected text by using the {@code Share} command of the floating actions.
* <p>
* This allows NewPipe to show Android share sheet instead of EMUI share sheet when sharing text
* from {@link AppCompatEditText} on EMUI devices.
* </p>
*/
public class NewPipeEditText extends AppCompatEditText {
public NewPipeEditText(@NonNull final Context context) {
super(context);
}
public NewPipeEditText(@NonNull final Context context, @Nullable final AttributeSet attrs) {
super(context, attrs);
}
public NewPipeEditText(@NonNull final Context context,
@Nullable final AttributeSet attrs,
final int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean onTextContextMenuItem(final int id) {
if (id == android.R.id.shareText) {
NewPipeTextViewHelper.shareSelectedTextWithShareUtils(this);
return true;
}
return super.onTextContextMenuItem(id);
}
}

View File

@ -0,0 +1,45 @@
package org.schabi.newpipe.views;
import android.content.Context;
import android.util.AttributeSet;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatTextView;
import org.schabi.newpipe.util.NewPipeTextViewHelper;
import org.schabi.newpipe.util.external_communication.ShareUtils;
/**
* An {@link AppCompatTextView} which uses {@link ShareUtils#shareText(Context, String, String)}
* when sharing selected text by using the {@code Share} command of the floating actions.
* <p>
* This allows NewPipe to show Android share sheet instead of EMUI share sheet when sharing text
* from {@link AppCompatTextView} on EMUI devices.
* </p>
*/
public class NewPipeTextView extends AppCompatTextView {
public NewPipeTextView(@NonNull final Context context) {
super(context);
}
public NewPipeTextView(@NonNull final Context context, @Nullable final AttributeSet attrs) {
super(context, attrs);
}
public NewPipeTextView(@NonNull final Context context,
@Nullable final AttributeSet attrs,
final int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean onTextContextMenuItem(final int id) {
if (id == android.R.id.shareText) {
NewPipeTextViewHelper.shareSelectedTextWithShareUtils(this);
return true;
}
return super.onTextContextMenuItem(id);
}
}

View File

@ -60,7 +60,7 @@
android:padding="8dp"
tools:ignore="RtlHardcoded,RtlSymmetry">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/song_name"
style="@android:style/TextAppearance.StatusBar.EventContent.Title"
android:layout_width="match_parent"
@ -71,7 +71,7 @@
android:textSize="14sp"
tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis nec aliquam augue, eget cursus est. Ut id tristique enim, ut scelerisque tellus. Sed ultricies ipsum non mauris ultricies, commodo malesuada velit porta." />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/artist_name"
style="@android:style/TextAppearance.StatusBar.EventContent"
android:layout_width="match_parent"
@ -82,7 +82,7 @@
tools:text="Duis posuere arcu condimentum lobortis mattis." />
</LinearLayout>
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/seek_display"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -269,7 +269,7 @@
android:paddingLeft="16dp"
android:paddingRight="16dp">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/current_time"
android:layout_width="wrap_content"
android:layout_height="match_parent"
@ -291,7 +291,7 @@
tools:progress="25"
tools:secondaryProgress="50" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/end_time"
android:layout_width="wrap_content"
android:layout_height="match_parent"
@ -301,7 +301,7 @@
tools:ignore="HardcodedText"
tools:text="1:23:49" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/live_sync"
android:layout_width="wrap_content"
android:layout_height="match_parent"

View File

@ -70,7 +70,7 @@
tools:ignore="ContentDescription"
tools:visibility="visible" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/touch_append_detail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -88,7 +88,7 @@
tools:ignore="RtlHardcoded"
tools:visibility="visible" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_duration_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -113,7 +113,7 @@
tools:text="12:38"
tools:visibility="visible" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_position_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -179,7 +179,7 @@
android:paddingStart="12dp"
tools:ignore="RtlSymmetry">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_video_title_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
@ -291,7 +291,7 @@
android:gravity="center_vertical"
android:orientation="vertical">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_sub_channel_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -307,7 +307,7 @@
tools:ignore="RtlHardcoded"
tools:text="Channel" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_uploader_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -348,7 +348,7 @@
android:paddingLeft="6dp"
android:paddingRight="6dp">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_view_count_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -369,7 +369,7 @@
android:contentDescription="@string/detail_likes_img_view_description"
app:srcCompat="@drawable/ic_thumb_up" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_thumbs_up_count_view"
android:layout_width="wrap_content"
android:layout_height="@dimen/video_item_detail_like_image_height"
@ -394,7 +394,7 @@
app:srcCompat="@drawable/ic_thumb_down"
tools:ignore="RtlHardcoded" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_thumbs_down_count_view"
android:layout_width="wrap_content"
android:layout_height="@dimen/video_item_detail_like_image_height"
@ -408,7 +408,7 @@
tools:ignore="RtlHardcoded"
tools:text="10K" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_thumbs_disabled_view"
android:layout_width="wrap_content"
android:layout_height="@dimen/video_item_detail_like_image_height"
@ -436,7 +436,7 @@
android:orientation="horizontal"
android:padding="@dimen/detail_control_padding">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_controls_playlist_append"
android:layout_width="@dimen/detail_control_width"
android:layout_height="@dimen/detail_control_height"
@ -452,7 +452,7 @@
android:textSize="@dimen/detail_control_text_size"
app:drawableTopCompat="@drawable/ic_playlist_add" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_controls_background"
android:layout_width="@dimen/detail_control_width"
android:layout_height="@dimen/detail_control_height"
@ -468,7 +468,7 @@
android:textSize="@dimen/detail_control_text_size"
app:drawableTopCompat="@drawable/ic_headset" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_controls_popup"
android:layout_width="@dimen/detail_control_width"
android:layout_height="@dimen/detail_control_height"
@ -484,7 +484,7 @@
android:textSize="@dimen/detail_control_text_size"
app:drawableTopCompat="@drawable/ic_picture_in_picture" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_controls_download"
android:layout_width="@dimen/detail_control_width"
android:layout_height="@dimen/detail_control_height"
@ -515,7 +515,7 @@
android:visibility="gone"
tools:visibility="visible">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_controls_share"
android:layout_width="@dimen/detail_control_width"
android:layout_height="@dimen/detail_control_height"
@ -531,7 +531,7 @@
android:textSize="@dimen/detail_control_text_size"
app:drawableTopCompat="@drawable/ic_share" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_controls_open_in_browser"
android:layout_width="@dimen/detail_control_width"
android:layout_height="@dimen/detail_control_height"
@ -547,7 +547,7 @@
android:textSize="@dimen/detail_control_text_size"
app:drawableTopCompat="@drawable/ic_language" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_controls_play_with_kodi"
android:layout_width="@dimen/detail_control_width"
android:layout_height="@dimen/detail_control_height"
@ -573,7 +573,7 @@
android:layout_marginRight="8dp"
android:background="?attr/separator_color" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_meta_info_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -654,7 +654,7 @@
android:orientation="vertical"
tools:ignore="RtlHardcoded">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/overlay_title_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -668,7 +668,7 @@
tools:ignore="RtlHardcoded"
tools:text="The Video Title LONG very LONVideo Title LONG very LONG" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/overlay_channel_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@ -118,7 +118,7 @@
android:orientation="vertical"
tools:ignore="RtlHardcoded">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/titleTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -133,7 +133,7 @@
tools:ignore="RtlHardcoded"
tools:text="The Video Title LONG very LONG" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/channelTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -147,7 +147,7 @@
tools:text="The Video Artist LONG very LONG very Long" />
</LinearLayout>
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/qualityTextView"
android:layout_width="wrap_content"
android:layout_height="35dp"
@ -161,7 +161,7 @@
tools:ignore="HardcodedText,RtlHardcoded"
tools:text="720p" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/playbackSpeed"
android:layout_width="wrap_content"
android:layout_height="35dp"
@ -237,7 +237,7 @@
tools:ignore="RtlHardcoded"
tools:visibility="visible">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/resizeTextView"
android:layout_width="wrap_content"
android:layout_height="35dp"
@ -257,7 +257,7 @@
android:layout_height="wrap_content"
android:layout_weight="3">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/captionTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -369,7 +369,7 @@
android:orientation="vertical"
android:paddingBottom="12dp">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/currentDisplaySeek"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -409,7 +409,7 @@
android:paddingLeft="@dimen/player_main_controls_padding"
android:paddingRight="@dimen/player_main_controls_padding">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/playbackCurrentTime"
android:layout_width="wrap_content"
android:layout_height="match_parent"
@ -433,7 +433,7 @@
tools:progress="25"
tools:secondaryProgress="50" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/playbackEndTime"
android:layout_width="wrap_content"
android:layout_height="match_parent"
@ -443,7 +443,7 @@
tools:ignore="HardcodedText"
tools:text="1:23:49" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/playbackLiveSync"
android:layout_width="wrap_content"
android:layout_height="match_parent"

View File

@ -26,7 +26,7 @@
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingBottom="@dimen/activity_vertical_margin">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/errorSorryView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -35,21 +35,21 @@
android:textAppearance="?android:attr/textAppearanceLarge"
android:textStyle="bold" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="@dimen/activity_vertical_margin"
android:text="@string/what_happened_headline"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/errorMessageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/info_labels"
android:textColor="?attr/colorAccent" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="@dimen/activity_vertical_margin"
@ -61,7 +61,7 @@
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/errorInfoLabelsView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -73,7 +73,7 @@
android:layout_height="wrap_content"
android:paddingLeft="16dp">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/errorInfosView"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
@ -82,7 +82,7 @@
</LinearLayout>
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="@dimen/activity_vertical_margin"
@ -94,7 +94,7 @@
android:layout_height="wrap_content"
android:layout_gravity="center">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/errorView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -102,14 +102,14 @@
android:typeface="monospace" />
</HorizontalScrollView>
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="@dimen/activity_vertical_margin"
android:text="@string/your_comment"
android:textAppearance="?android:attr/textAppearanceMedium" />
<EditText
<org.schabi.newpipe.views.NewPipeEditText
android:id="@+id/errorCommentBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -121,7 +121,7 @@
android:layout_height="wrap_content"
android:text="@string/error_report_button_text" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"

View File

@ -31,80 +31,86 @@
android:id="@+id/play_queue"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/metadata"
android:layout_above="@id/center"
android:layout_below="@id/appbar"
android:scrollbars="vertical"
app:layoutManager="LinearLayoutManager"
tools:listitem="@layout/play_queue_item" />
<TextView
android:id="@+id/seek_display"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_above="@id/metadata"
android:background="#c0000000"
android:paddingLeft="30dp"
android:paddingTop="5dp"
android:paddingRight="30dp"
android:paddingBottom="5dp"
android:textColor="@android:color/white"
android:textSize="22sp"
android:textStyle="bold"
android:visibility="gone"
tools:ignore="RtlHardcoded"
tools:text="1:06:29"
tools:visibility="visible" />
<LinearLayout
android:id="@+id/metadata"
<RelativeLayout
android:id="@+id/center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@id/progress_bar"
android:background="?attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
android:orientation="vertical"
android:padding="8dp"
tools:ignore="RtlHardcoded,RtlSymmetry">
android:layout_above="@+id/playback_controls">
<TextView
android:id="@+id/song_name"
<LinearLayout
android:id="@+id/metadata"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:fadingEdge="horizontal"
android:marqueeRepeatLimit="marquee_forever"
android:scrollHorizontally="true"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textSize="14sp"
tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis nec aliquam augue, eget cursus est. Ut id tristique enim, ut scelerisque tellus. Sed ultricies ipsum non mauris ultricies, commodo malesuada velit porta." />
android:background="?attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
android:orientation="vertical"
android:padding="8dp"
tools:ignore="RtlHardcoded,RtlSymmetry">
<TextView
android:id="@+id/artist_name"
android:layout_width="match_parent"
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/song_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:fadingEdge="horizontal"
android:marqueeRepeatLimit="marquee_forever"
android:scrollHorizontally="true"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textSize="14sp"
tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis nec aliquam augue, eget cursus est. Ut id tristique enim, ut scelerisque tellus. Sed ultricies ipsum non mauris ultricies, commodo malesuada velit porta." />
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/artist_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:fadingEdge="horizontal"
android:marqueeRepeatLimit="marquee_forever"
android:scrollHorizontally="true"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textSize="12sp"
tools:text="Duis posuere arcu condimentum lobortis mattis." />
</LinearLayout>
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/seek_display"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:fadingEdge="horizontal"
android:marqueeRepeatLimit="marquee_forever"
android:scrollHorizontally="true"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textSize="12sp"
tools:text="Duis posuere arcu condimentum lobortis mattis." />
</LinearLayout>
android:layout_centerInParent="true"
android:background="#c0000000"
android:paddingLeft="30dp"
android:paddingTop="5dp"
android:paddingRight="30dp"
android:paddingBottom="5dp"
android:textColor="@android:color/white"
android:textSize="22sp"
android:textStyle="bold"
android:visibility="gone"
tools:ignore="RtlHardcoded"
tools:text="1:06:29"
tools:visibility="visible" />
</RelativeLayout>
<LinearLayout
android:id="@+id/progress_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:gravity="center"
android:orientation="horizontal"
android:paddingLeft="12dp"
android:paddingRight="12dp"
android:layout_above="@+id/playback_controls">
android:paddingRight="12dp">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/current_time"
android:layout_width="wrap_content"
android:layout_height="match_parent"
@ -129,7 +135,7 @@
tools:progress="25"
tools:secondaryProgress="50" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/end_time"
android:layout_width="wrap_content"
android:layout_height="match_parent"
@ -139,7 +145,7 @@
tools:ignore="HardcodedText"
tools:text="1:23:49" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/live_sync"
android:layout_width="wrap_content"
android:layout_height="match_parent"
@ -157,9 +163,8 @@
android:id="@+id/playback_controls"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/progress_bar"
android:orientation="horizontal"
android:layout_alignParentBottom="true"
android:layout_marginBottom="12dp"
tools:ignore="RtlHardcoded">
<ImageButton
@ -289,4 +294,5 @@
tools:ignore="ContentDescription" />
</RelativeLayout>
</RelativeLayout>

View File

@ -49,7 +49,7 @@
tools:visibility="visible" />
</FrameLayout>
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/channel_title_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -66,7 +66,7 @@
tools:ignore="RtlHardcoded"
tools:text="Lorem ipsum dolor" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/sub_channel_title_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -82,7 +82,7 @@
tools:layout_below="@id/channel_title_view"
tools:text="Lorem ipsum dolor" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/channel_subscriber_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@ -7,7 +7,7 @@
android:paddingTop="@dimen/video_item_search_padding"
android:paddingRight="@dimen/video_item_search_padding">
<EditText
<org.schabi.newpipe.views.NewPipeEditText
android:id="@+id/dialogEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@ -45,7 +45,7 @@
app:layout_constraintStart_toEndOf="@+id/icon_preview"
app:layout_constraintTop_toTopOf="parent">
<EditText
<org.schabi.newpipe.views.NewPipeEditText
android:id="@+id/group_name_input"
android:layout_width="match_parent"
android:layout_height="match_parent"
@ -57,7 +57,7 @@
</com.google.android.material.textfield.TextInputLayout>
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/selected_subscription_count_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -117,7 +117,7 @@
android:gravity="center_vertical"
android:orientation="vertical">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="start|center_vertical"
@ -126,7 +126,7 @@
android:textSize="16sp"
android:textStyle="bold" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/subscriptions_header_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -155,7 +155,7 @@
tools:spanCount="4" />
</LinearLayout>
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/delete_screen_message"
style="@style/TextAppearance.AppCompat.Subhead"
android:layout_width="wrap_content"

View File

@ -15,7 +15,7 @@
android:scrollbars="vertical">
<!-- START HERE -->
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/tempoControlText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -34,7 +34,7 @@
android:layout_marginTop="4dp"
android:orientation="horizontal">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/tempoStepDown"
android:layout_width="wrap_content"
android:layout_height="match_parent"
@ -62,7 +62,7 @@
android:layout_toRightOf="@id/tempoStepDown"
android:orientation="horizontal">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/tempoMinimumText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -76,7 +76,7 @@
tools:ignore="HardcodedText"
tools:text="1.00x" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/tempoCurrentText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -88,7 +88,7 @@
tools:ignore="HardcodedText"
tools:text="100%" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/tempoMaximumText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -112,7 +112,7 @@
tools:progress="50" />
</RelativeLayout>
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/tempoStepUp"
android:layout_width="wrap_content"
android:layout_height="match_parent"
@ -140,7 +140,7 @@
android:layout_margin="@dimen/video_item_search_padding"
android:background="?attr/separator_color" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/pitchControlText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -159,7 +159,7 @@
android:layout_marginTop="4dp"
android:orientation="horizontal">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/pitchStepDown"
android:layout_width="wrap_content"
android:layout_height="match_parent"
@ -177,6 +177,7 @@
tools:text="-5%" />
<RelativeLayout
android:id="@+id/pitchDisplay"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="4dp"
@ -187,7 +188,7 @@
android:layout_toRightOf="@+id/pitchStepDown"
android:orientation="horizontal">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/pitchMinimumText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -201,7 +202,7 @@
tools:ignore="HardcodedText"
tools:text="25%" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/pitchCurrentText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -213,7 +214,7 @@
tools:ignore="HardcodedText"
tools:text="100%" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/pitchMaximumText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -237,7 +238,7 @@
tools:progress="50" />
</RelativeLayout>
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/pitchStepUp"
android:layout_width="wrap_content"
android:layout_height="match_parent"
@ -272,7 +273,7 @@
android:layout_below="@id/separatorStepSizeSelector"
android:orientation="horizontal">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
@ -282,7 +283,7 @@
android:textColor="?attr/colorAccent"
android:textStyle="bold" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/stepSizeOnePercent"
android:layout_width="0dp"
android:layout_height="match_parent"
@ -293,7 +294,7 @@
android:gravity="center"
android:textColor="?attr/colorAccent" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/stepSizeFivePercent"
android:layout_width="0dp"
android:layout_height="match_parent"
@ -304,7 +305,7 @@
android:gravity="center"
android:textColor="?attr/colorAccent" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/stepSizeTenPercent"
android:layout_width="0dp"
android:layout_height="match_parent"
@ -315,7 +316,7 @@
android:gravity="center"
android:textColor="?attr/colorAccent" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/stepSizeTwentyFivePercent"
android:layout_width="0dp"
android:layout_height="match_parent"

View File

@ -23,7 +23,7 @@
app:srcCompat="@drawable/ic_playlist_add"
tools:ignore="ContentDescription,RtlHardcoded" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_toRightOf="@+id/newPlaylistIcon"

View File

@ -9,7 +9,7 @@
android:paddingTop="@dimen/video_item_search_padding"
android:paddingRight="@dimen/video_item_search_padding">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemTitleView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -23,7 +23,7 @@
android:textSize="@dimen/channel_item_detail_title_text_size"
tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. " />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemAdditionalDetails"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View File

@ -7,7 +7,7 @@
android:id="@+id/toolbar_layout"
layout="@layout/toolbar_layout" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/file_name_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -18,7 +18,7 @@
android:layout_marginBottom="6dp"
android:text="@string/msg_name" />
<EditText
<org.schabi.newpipe.views.NewPipeEditText
android:id="@+id/file_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -71,7 +71,7 @@
android:minWidth="150dp"
tools:listitem="@layout/stream_quality_item" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/threads_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -90,7 +90,7 @@
android:orientation="horizontal"
android:paddingBottom="12dp">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/threads_count"
android:layout_width="25dp"
android:layout_height="match_parent"

View File

@ -42,7 +42,7 @@
app:srcCompat="@drawable/splash_foreground"
tools:ignore="ContentDescription" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/drawer_header_newpipe_title"
android:layout_width="@dimen/drawer_header_newpipe_title_default_width"
android:layout_height="match_parent"
@ -88,7 +88,7 @@
tools:ignore="ContentDescription"
tools:srcCompat="@drawable/place_holder_youtube" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/drawer_header_service_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View File

@ -7,7 +7,7 @@
android:orientation="vertical"
android:padding="16dp">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/error_message_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -17,7 +17,7 @@
android:textStyle="bold"
tools:text="Account terminated" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/error_message_service_info_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -29,7 +29,7 @@
tools:text="YouTube provides this reason:"
tools:visibility="visible" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/error_message_service_explanation_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View File

@ -27,7 +27,7 @@
app:srcCompat="@drawable/ic_add"
tools:ignore="ContentDescription" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@ -28,7 +28,7 @@
tools:ignore="ContentDescription"
tools:src="@drawable/ic_fastfood" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@ -29,7 +29,7 @@
tools:ignore="ContentDescription,RtlHardcoded"
tools:src="@drawable/ic_kiosk_hot" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/group_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@ -33,7 +33,7 @@
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
@ -64,7 +64,7 @@
android:paddingBottom="6dp"
tools:ignore="RtlSymmetry">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="match_parent"
android:layout_height="@dimen/subscription_import_export_title_height"
android:gravity="left|center"
@ -83,7 +83,7 @@
android:layout_marginLeft="36dp"
android:orientation="vertical" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="match_parent"
android:layout_height="@dimen/subscription_import_export_title_height"
android:background="?attr/selectableItemBackground"

View File

@ -22,7 +22,7 @@
android:contentDescription="@string/app_name"
app:srcCompat="@mipmap/ic_launcher" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
@ -30,7 +30,7 @@
android:textAppearance="@android:style/TextAppearance.Large" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/about_app_version"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -39,13 +39,13 @@
android:textAppearance="@android:style/TextAppearance.Medium"
tools:text="0.9.9" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingBottom="5dp"
android:text="@string/app_description" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="10dp"
@ -65,14 +65,14 @@
android:layout_gravity="end"
android:text="@string/view_on_github" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="10dp"
android:text="@string/donation_title"
android:textAppearance="@android:style/TextAppearance.Medium" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/donation_encouragement" />
@ -85,14 +85,14 @@
android:layout_gravity="end"
android:text="@string/give_back" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="10dp"
android:text="@string/website_title"
android:textAppearance="@android:style/TextAppearance.Medium" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/website_encouragement" />
@ -105,14 +105,14 @@
android:layout_gravity="end"
android:text="@string/open_in_browser" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="10dp"
android:text="@string/privacy_policy_title"
android:textAppearance="@android:style/TextAppearance.Medium" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/privacy_policy_encouragement" />

View File

@ -30,7 +30,7 @@
android:visibility="gone"
tools:visibility="visible">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/channel_kaomoji"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -41,7 +41,7 @@
android:textSize="35sp"
tools:ignore="HardcodedText,UnusedAttribute" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/channel_no_videos"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -49,7 +49,7 @@
android:text="@string/empty_view_no_videos"
android:textSize="24sp" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/error_content_not_supported"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View File

@ -6,7 +6,7 @@
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/helpTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View File

@ -30,7 +30,7 @@
android:visibility="gone"
tools:visibility="visible">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
@ -40,7 +40,7 @@
android:textSize="35sp"
tools:ignore="HardcodedText,UnusedAttribute" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/empty_state_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View File

@ -12,7 +12,7 @@
android:layout_height="wrap_content"
android:animateLayoutChanges="true">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_upload_date_view"
android:layout_width="0dp"
android:layout_height="wrap_content"
@ -52,7 +52,7 @@
app:barrierDirection="top"
app:constraint_referenced_ids="detail_description_note_view,detail_description_view" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_description_note_view"
android:layout_width="0dp"
android:layout_height="wrap_content"
@ -69,7 +69,7 @@
app:layout_constraintTop_toBottomOf="@+id/detail_upload_date_view"
tools:visibility="visible" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_description_view"
android:layout_width="0dp"
android:layout_height="wrap_content"

View File

@ -25,7 +25,7 @@
android:gravity="center_vertical"
android:orientation="vertical">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/refresh_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -36,7 +36,7 @@
android:textSize="14sp"
tools:text="@tools:sample/lorem/random" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/refresh_subtitle_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -105,7 +105,7 @@
android:visibility="gone"
tools:visibility="visible" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/loading_progress_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View File

@ -4,7 +4,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/info_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -26,7 +26,7 @@
android:orientation="vertical"
android:padding="16dp">
<EditText
<org.schabi.newpipe.views.NewPipeEditText
android:id="@+id/input_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@ -6,7 +6,7 @@
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/instanceHelpTV"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@ -31,7 +31,7 @@
android:visibility="gone"
tools:visibility="visible">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
@ -41,7 +41,7 @@
android:textSize="35sp"
tools:ignore="HardcodedText,UnusedAttribute" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"

View File

@ -11,7 +11,7 @@
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/activity_horizontal_margin"
@ -21,7 +21,7 @@
android:text="@string/app_license_title"
android:textAppearance="@android:style/TextAppearance.Large" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/activity_horizontal_margin"
@ -37,7 +37,7 @@
android:layout_marginRight="@dimen/activity_vertical_margin"
android:text="@string/read_full_license" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/activity_horizontal_margin"

View File

@ -30,7 +30,7 @@
android:visibility="gone"
tools:visibility="visible">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
@ -40,7 +40,7 @@
android:textSize="35sp"
tools:ignore="HardcodedText,UnusedAttribute" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"

View File

@ -30,7 +30,7 @@
android:visibility="gone"
tools:visibility="visible">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
@ -40,7 +40,7 @@
android:textSize="35sp"
tools:ignore="HardcodedText,UnusedAttribute" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"

View File

@ -5,7 +5,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/correct_suggestion"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -15,7 +15,7 @@
android:textSize="@dimen/search_suggestion_text_size"
tools:text="Showing results for lorem ipsum dolor sit amet consectetur adipisci elit" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/search_meta_info_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -61,7 +61,7 @@
android:visibility="gone"
tools:visibility="visible">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
@ -71,7 +71,7 @@
android:textSize="35sp"
tools:ignore="HardcodedText,UnusedAttribute" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"

View File

@ -60,7 +60,7 @@
tools:ignore="ContentDescription"
tools:visibility="visible" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/touch_append_detail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -78,7 +78,7 @@
tools:ignore="RtlHardcoded"
tools:visibility="visible" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_duration_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -103,7 +103,7 @@
tools:text="12:38"
tools:visibility="visible" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_position_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -167,7 +167,7 @@
android:paddingStart="12dp"
tools:ignore="RtlSymmetry">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_video_title_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
@ -280,7 +280,7 @@
android:gravity="center_vertical"
android:orientation="vertical">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_sub_channel_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -295,7 +295,7 @@
tools:ignore="RtlHardcoded"
tools:text="Channel" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_uploader_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -336,7 +336,7 @@
android:paddingLeft="6dp"
android:paddingRight="6dp">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_view_count_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -357,7 +357,7 @@
android:contentDescription="@string/detail_likes_img_view_description"
app:srcCompat="@drawable/ic_thumb_up" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_thumbs_up_count_view"
android:layout_width="wrap_content"
android:layout_height="@dimen/video_item_detail_like_image_height"
@ -382,7 +382,7 @@
app:srcCompat="@drawable/ic_thumb_down"
tools:ignore="RtlHardcoded" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_thumbs_down_count_view"
android:layout_width="wrap_content"
android:layout_height="@dimen/video_item_detail_like_image_height"
@ -396,7 +396,7 @@
tools:ignore="RtlHardcoded"
tools:text="10K" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_thumbs_disabled_view"
android:layout_width="wrap_content"
android:layout_height="@dimen/video_item_detail_like_image_height"
@ -422,7 +422,7 @@
android:orientation="horizontal"
android:padding="@dimen/detail_control_padding">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_controls_playlist_append"
android:layout_width="@dimen/detail_control_width"
android:layout_height="@dimen/detail_control_height"
@ -438,7 +438,7 @@
android:textSize="@dimen/detail_control_text_size"
app:drawableTopCompat="@drawable/ic_playlist_add" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_controls_background"
android:layout_width="@dimen/detail_control_width"
android:layout_height="@dimen/detail_control_height"
@ -454,7 +454,7 @@
android:textSize="@dimen/detail_control_text_size"
app:drawableTopCompat="@drawable/ic_headset" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_controls_popup"
android:layout_width="@dimen/detail_control_width"
android:layout_height="@dimen/detail_control_height"
@ -470,7 +470,7 @@
android:textSize="@dimen/detail_control_text_size"
app:drawableTopCompat="@drawable/ic_picture_in_picture" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_controls_download"
android:layout_width="@dimen/detail_control_width"
android:layout_height="@dimen/detail_control_height"
@ -499,7 +499,7 @@
android:visibility="gone"
tools:visibility="visible">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_controls_share"
android:layout_width="@dimen/detail_control_width"
android:layout_height="@dimen/detail_control_height"
@ -515,7 +515,7 @@
android:textSize="@dimen/detail_control_text_size"
app:drawableTopCompat="@drawable/ic_share" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_controls_open_in_browser"
android:layout_width="@dimen/detail_control_width"
android:layout_height="@dimen/detail_control_height"
@ -531,7 +531,7 @@
android:textSize="@dimen/detail_control_text_size"
app:drawableTopCompat="@drawable/ic_language" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_controls_play_with_kodi"
android:layout_width="@dimen/detail_control_width"
android:layout_height="@dimen/detail_control_height"
@ -557,7 +557,7 @@
android:layout_marginRight="8dp"
android:background="?attr/separator_color" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_meta_info_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -630,7 +630,7 @@
android:theme="@style/ContrastTintTheme"
tools:ignore="RtlHardcoded">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/overlay_title_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -644,7 +644,7 @@
tools:ignore="RtlHardcoded"
tools:text="The Video Title LONG very LONVideo Title LONG very LONG" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/overlay_channel_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@ -8,7 +8,7 @@
android:paddingRight="16dp"
android:paddingBottom="12dp">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/header_title"
android:layout_width="0dp"
android:layout_height="wrap_content"

View File

@ -35,7 +35,7 @@
app:layout_constraintStart_toEndOf="@id/previewImage"
app:layout_constraintTop_toTopOf="parent">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/textViewTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -45,7 +45,7 @@
android:textSize="@dimen/video_item_search_title_text_size"
tools:text="Lorem ipusum is widely used to create long sample text which is used here too" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/textViewChannel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -56,7 +56,7 @@
tools:text="Lorem ipsum creator" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/textViewStartSeconds"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@ -16,7 +16,7 @@
tools:ignore="ContentDescription,RtlHardcoded"
tools:src="@drawable/ic_kiosk_hot" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/tabName"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@ -23,7 +23,7 @@
android:src="@drawable/buddy"
tools:ignore="RtlHardcoded" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemTitleView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -36,7 +36,7 @@
android:textSize="@dimen/comment_item_title_text_size"
tools:text="Author Name, Lorem ipsum" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemCommentContentView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -58,7 +58,7 @@
android:contentDescription="@string/detail_likes_img_view_description"
app:srcCompat="@drawable/ic_thumb_up" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_thumbs_up_count_view"
android:layout_width="wrap_content"
android:layout_height="@dimen/video_item_detail_like_image_height"
@ -97,7 +97,7 @@
app:srcCompat="?attr/thumbs_down"
tools:ignore="RtlHardcoded" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_thumbs_down_count_view"
android:layout_width="wrap_content"
android:layout_height="@dimen/video_item_detail_like_image_height"
@ -111,7 +111,7 @@
tools:ignore="RtlHardcoded"
tools:text="10K" />-->
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemPublishedTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View File

@ -21,7 +21,7 @@
tools:ignore="RtlHardcoded" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemCommentContentView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -40,7 +40,7 @@
android:contentDescription="@string/detail_likes_img_view_description"
app:srcCompat="@drawable/ic_thumb_up" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_thumbs_up_count_view"
android:layout_width="wrap_content"
android:layout_height="@dimen/video_item_detail_like_image_height"
@ -66,7 +66,7 @@
app:srcCompat="?attr/thumbs_down"
tools:ignore="RtlHardcoded" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/detail_thumbs_down_count_view"
android:layout_width="wrap_content"
android:layout_height="@dimen/video_item_detail_like_image_height"
@ -80,7 +80,7 @@
tools:ignore="RtlHardcoded"
tools:text="10K" />-->
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemPublishedTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View File

@ -7,14 +7,14 @@
android:minHeight="128dp"
android:orientation="vertical">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="¯\\_(ツ)_/¯"
android:textAppearance="?android:attr/textAppearanceLarge"
tools:ignore="HardcodedText" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"

View File

@ -22,7 +22,7 @@
android:src="@drawable/dummy_thumbnail_playlist"
tools:ignore="RtlHardcoded" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemStreamCountView"
android:layout_width="@dimen/playlist_item_thumbnail_stream_count_width"
android:layout_height="match_parent"
@ -41,7 +41,7 @@
tools:ignore="RtlHardcoded"
tools:text="314159" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemTitleView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -56,7 +56,7 @@
tools:ignore="RtlHardcoded"
tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blanditLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsum" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemUploaderView"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@ -23,7 +23,7 @@
android:src="@drawable/dummy_thumbnail_playlist"
tools:ignore="RtlHardcoded" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemStreamCountView"
android:layout_width="@dimen/playlist_item_thumbnail_stream_count_width"
android:layout_height="match_parent"
@ -42,7 +42,7 @@
tools:ignore="RtlHardcoded"
tools:text="314159" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemTitleView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -55,7 +55,7 @@
tools:ignore="RtlHardcoded"
tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blanditLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsum" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemUploaderView"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@ -23,7 +23,7 @@
android:src="@drawable/dummy_thumbnail_playlist"
tools:ignore="RtlHardcoded" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemStreamCountView"
android:layout_width="45dp"
android:layout_height="match_parent"
@ -42,7 +42,7 @@
tools:ignore="RtlHardcoded"
tools:text="3141" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemTitleView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -55,7 +55,7 @@
tools:ignore="RtlHardcoded"
tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blanditLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsum" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemUploaderView"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@ -21,7 +21,7 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemDurationView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -40,7 +40,7 @@
app:layout_constraintEnd_toEndOf="@+id/itemThumbnailView"
tools:text="1:09:10" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemVideoTitleView"
android:layout_width="0dp"
android:layout_height="wrap_content"
@ -54,7 +54,7 @@
app:layout_constraintTop_toBottomOf="@+id/itemProgressView"
tools:text="@tools:sample/lorem[10]" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemUploaderView"
android:layout_width="0dp"
android:layout_height="wrap_content"
@ -68,7 +68,7 @@
app:layout_constraintTop_toBottomOf="@+id/itemVideoTitleView"
tools:text="Uploader name long very very long long" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemAdditionalDetails"
android:layout_width="0dp"
android:layout_height="wrap_content"

View File

@ -21,7 +21,7 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemDurationView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -38,7 +38,7 @@
app:layout_constraintRight_toRightOf="@id/itemThumbnailView"
tools:text="1:09:10" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemVideoTitleView"
android:layout_width="0dp"
android:layout_height="wrap_content"
@ -53,7 +53,7 @@
app:layout_constraintTop_toTopOf="parent"
tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blanditLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsum" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemUploaderView"
android:layout_width="0dp"
android:layout_height="wrap_content"
@ -67,7 +67,7 @@
app:layout_constraintTop_toBottomOf="@+id/itemVideoTitleView"
tools:text="Uploader" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemAdditionalDetails"
android:layout_width="0dp"
android:layout_height="wrap_content"

View File

@ -22,7 +22,7 @@
android:src="@drawable/dummy_thumbnail"
tools:ignore="RtlHardcoded" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemDurationView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -43,7 +43,7 @@
tools:text="1:09:10" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemVideoTitleView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -56,7 +56,7 @@
android:textSize="@dimen/video_item_search_title_text_size"
tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blanditLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsum" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemUploaderView"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@ -22,7 +22,7 @@
android:src="@drawable/dummy_thumbnail"
tools:ignore="RtlHardcoded" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemDurationView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -53,7 +53,7 @@
app:srcCompat="@drawable/ic_drag_handle"
tools:ignore="RtlHardcoded,RtlSymmetry" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemVideoTitleView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -68,7 +68,7 @@
android:textSize="@dimen/video_item_search_title_text_size"
tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique..." />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemAdditionalDetails"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@ -23,7 +23,7 @@
android:src="@drawable/dummy_thumbnail"
tools:ignore="RtlHardcoded" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemDurationView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -54,7 +54,7 @@
app:srcCompat="@drawable/ic_drag_handle"
tools:ignore="RtlHardcoded,RtlSymmetry" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemVideoTitleView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -69,7 +69,7 @@
android:textSize="@dimen/video_item_search_title_text_size"
tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique..." />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemAdditionalDetails"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@ -5,7 +5,7 @@
android:layout_height="wrap_content"
android:background="?attr/contrast_background_color">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/playlist_title_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -21,7 +21,7 @@
android:textSize="@dimen/playlist_detail_title_text_size"
tools:text="Mix musics #23 title Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tristique vitae sem vitae blanditLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsumLorem ipsum" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/playlist_stream_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View File

@ -8,7 +8,7 @@
android:paddingEnd="@dimen/activity_horizontal_margin"
tools:context=".fragments.detail.VideoDetailFragment">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
@ -19,7 +19,7 @@
android:textAppearance="?android:attr/textAppearanceLarge"
android:textSize="40sp" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"

View File

@ -17,7 +17,7 @@
android:layout_alignParentTop="true"
android:layout_marginTop="2dp">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/item_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -56,7 +56,7 @@
android:scaleType="fitXY"
app:tint="?attr/actionColor" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/item_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -71,7 +71,7 @@
android:textSize="16sp"
android:textStyle="bold" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/item_size"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@ -21,7 +21,7 @@
android:scaleType="fitXY"
app:tint="?attr/actionColor" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/item_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -34,7 +34,7 @@
android:textSize="16sp"
android:textStyle="bold" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/item_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -46,7 +46,7 @@
android:textColor="@color/white"
android:textSize="12sp" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/item_status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View File

@ -10,7 +10,7 @@
android:layout_marginRight="8dp"
android:orientation="vertical">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/item_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View File

@ -24,7 +24,7 @@
android:contentDescription="@string/list_thumbnail_view_description"
tools:src="@drawable/buddy_channel_item" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/title_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@ -24,7 +24,7 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemDurationView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -45,7 +45,7 @@
tools:text="1:09:10" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemVideoTitleView"
android:layout_width="0dp"
android:layout_height="wrap_content"
@ -64,7 +64,7 @@
app:layout_constraintVertical_chainStyle="packed"
tools:text="Lorem ipsum dolor sit amet, consectetur adipisci elit. " />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemAdditionalDetails"
android:layout_width="0dp"
android:layout_height="wrap_content"

View File

@ -116,7 +116,7 @@
android:orientation="vertical"
tools:ignore="RtlHardcoded">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/titleTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -133,7 +133,7 @@
tools:ignore="RtlHardcoded"
tools:text="The Video Title LONG very LONG" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/channelTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -149,7 +149,7 @@
tools:text="The Video Artist LONG very LONG very Long" />
</LinearLayout>
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/qualityTextView"
android:layout_width="wrap_content"
android:layout_height="35dp"
@ -163,7 +163,7 @@
tools:ignore="HardcodedText,RtlHardcoded"
tools:text="720p" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/playbackSpeed"
android:layout_width="wrap_content"
android:layout_height="35dp"
@ -237,7 +237,7 @@
tools:ignore="RtlHardcoded"
tools:visibility="visible">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/resizeTextView"
android:layout_width="wrap_content"
android:layout_height="35dp"
@ -256,7 +256,7 @@
android:layout_height="wrap_content"
android:layout_weight="3">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/captionTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -368,7 +368,7 @@
android:orientation="vertical"
android:paddingBottom="12dp">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/currentDisplaySeek"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@ -408,7 +408,7 @@
android:paddingLeft="@dimen/player_main_controls_padding"
android:paddingRight="@dimen/player_main_controls_padding">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/playbackCurrentTime"
android:layout_width="wrap_content"
android:layout_height="match_parent"
@ -431,7 +431,7 @@
tools:progress="25"
tools:secondaryProgress="50" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/playbackEndTime"
android:layout_width="wrap_content"
android:layout_height="match_parent"
@ -441,7 +441,7 @@
tools:ignore="HardcodedText"
tools:text="1:23:49" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/playbackLiveSync"
android:layout_width="wrap_content"
android:layout_height="match_parent"

View File

@ -17,7 +17,7 @@
android:focusable="true"
android:gravity="center">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawablePadding="4dp"
@ -47,7 +47,7 @@
android:focusable="true"
android:gravity="center">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
@ -74,7 +74,7 @@
android:focusable="true"
android:gravity="center">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawablePadding="4dp"

View File

@ -6,7 +6,7 @@
android:layout_height="wrap_content"
android:background="?attr/contrast_background_color">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/playlist_title_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -48,7 +48,7 @@
app:civ_border_color="#ffffff"
app:civ_border_width="1dp" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/uploader_name"
android:layout_width="match_parent"
android:layout_height="match_parent"
@ -62,7 +62,7 @@
tools:text="Typical uploader name" />
</RelativeLayout>
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/playlist_stream_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View File

@ -5,7 +5,7 @@
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"

View File

@ -6,7 +6,7 @@
android:orientation="vertical"
android:padding="13dp">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
@ -22,10 +22,10 @@
android:id="@+id/items_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:listitem="@layout/select_channel_item"></androidx.recyclerview.widget.RecyclerView>
tools:listitem="@layout/select_channel_item" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/empty_state_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@ -21,7 +21,7 @@
android:src="@drawable/buddy"
tools:ignore="RtlHardcoded" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemTitleView"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@ -6,7 +6,7 @@
android:orientation="vertical"
android:padding="13dp">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
@ -21,5 +21,5 @@
android:id="@+id/items_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:listitem="@layout/select_kiosk_item"></androidx.recyclerview.widget.RecyclerView>
tools:listitem="@layout/select_kiosk_item" />
</LinearLayout>

View File

@ -22,7 +22,7 @@
app:tint="@color/contrastColor"
tools:ignore="RtlHardcoded" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/itemTitleView"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@ -6,7 +6,7 @@
android:orientation="vertical"
android:padding="13dp">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
@ -27,7 +27,7 @@
</androidx.recyclerview.widget.RecyclerView>
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/empty_state_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@ -15,7 +15,7 @@
android:background="?attr/toolbar_shadow" />
</FrameLayout>
<View
<org.schabi.newpipe.views.NewPipeTextView
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?attr/separator_color" />

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
<org.schabi.newpipe.views.NewPipeTextView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@android:id/title"
android:layout_width="match_parent"

View File

@ -7,7 +7,7 @@
android:layout_height="wrap_content"
android:paddingTop="16dp">
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/textView"
android:layout_width="0dp"
android:layout_height="wrap_content"

View File

@ -21,7 +21,7 @@
tools:ignore="ContentDescription"
tools:src="@drawable/ic_previous" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/notificationActionTitle"
android:layout_width="0dp"
android:layout_height="wrap_content"
@ -38,7 +38,7 @@
app:layout_constraintVertical_chainStyle="packed"
tools:text="Second action button | Lorem ipsum dolor sit amet, consectetur adipisci elit" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/notificationActionSummary"
android:layout_width="0dp"
android:layout_height="wrap_content"

View File

@ -25,7 +25,7 @@
app:srcCompat="@drawable/ic_filter_list"
tools:ignore="ContentDescription,RtlHardcoded" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/sortButtonText"
android:layout_width="match_parent"
android:layout_height="50dp"

View File

@ -16,7 +16,7 @@
app:srcCompat="@drawable/ic_volume_off"
tools:ignore="ContentDescription,RtlHardcoded" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/stream_format_name"
android:layout_width="wrap_content"
android:layout_height="22dp"
@ -32,7 +32,7 @@
tools:ignore="RtlHardcoded"
tools:text="MPEG-4" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/stream_quality"
android:layout_width="wrap_content"
android:layout_height="26dp"
@ -48,7 +48,7 @@
tools:ignore="RtlHardcoded"
tools:text="1080p60" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@+id/stream_size"
android:layout_width="wrap_content"
android:layout_height="48dp"

View File

@ -18,7 +18,7 @@
tools:ignore="ContentDescription,RtlHardcoded"
tools:src="@drawable/place_holder_youtube" />
<TextView
<org.schabi.newpipe.views.NewPipeTextView
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="@dimen/subscription_import_export_item_height"

View File

@ -6,7 +6,7 @@
android:layout_height="?attr/actionBarSize"
tools:background="?attr/colorPrimary">
<EditText
<org.schabi.newpipe.views.NewPipeEditText
android:id="@+id/toolbar_search_edit_text"
android:layout_width="match_parent"
android:layout_height="match_parent"

Some files were not shown because too many files have changed in this diff Show More