Compare commits
64 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f451f1f65d | ||
|
|
4d12e71fba | ||
|
|
66fde7a212 | ||
|
|
86eccf219d | ||
|
|
677865f347 | ||
|
|
eb4b3810e9 | ||
|
|
5f26501ddf | ||
|
|
b33a72f864 | ||
|
|
675f43b968 | ||
|
|
9f117a2e59 | ||
|
|
a0844229a3 | ||
|
|
114fcc144c | ||
|
|
43372ff648 | ||
|
|
b8ebbc5404 | ||
|
|
28309f82f3 | ||
|
|
c70fa391b6 | ||
|
|
caab589dce | ||
|
|
20370054e7 | ||
| f1882cb1e1 | |||
|
|
2ed149852d | ||
|
|
ac7226a0df | ||
|
|
5705650ca8 | ||
|
|
60855ca7c5 | ||
|
|
b8d8d181f3 | ||
|
|
6309160fc6 | ||
|
|
fc0e6ed273 | ||
|
|
ada0cee656 | ||
|
|
6dde524d2c | ||
|
|
6a631e1915 | ||
|
|
bb6fa343cf | ||
|
|
7557acde6c | ||
|
|
25ed8952f9 | ||
|
|
b93d94b0bd | ||
|
|
33d75fd2fb | ||
|
|
28a9855fd2 | ||
|
|
9aad07621c | ||
|
|
384cde6eaa | ||
|
|
5ae98661ad | ||
|
|
8f4d9ceca9 | ||
|
|
83d9a1233e | ||
|
|
522a287d79 | ||
|
|
e052d4660d | ||
|
|
39b0b2f032 | ||
|
|
0223d6d200 | ||
|
|
808ce72078 | ||
|
|
3a84c47176 | ||
|
|
20c2426128 | ||
|
|
bf11d4c9fa | ||
|
|
783c0f79d7 | ||
|
|
98b94bd9c4 | ||
|
|
ff0178f965 | ||
|
|
7f88c3d0a9 | ||
|
|
11e8e38f2c | ||
|
|
50c5314eaf | ||
|
|
a7a76d4f58 | ||
|
|
f5f8371865 | ||
|
|
1191455d37 | ||
|
|
011e151c91 | ||
|
|
54aa40eac1 | ||
|
|
621a1909ec | ||
|
|
25db3c2940 | ||
|
|
442290d7f0 | ||
|
|
a6eb871f5e | ||
|
|
b500c3f526 |
1
.gitignore
vendored
@@ -10,3 +10,4 @@
|
||||
gradle.properties
|
||||
*~
|
||||
.weblate
|
||||
*.class
|
||||
|
||||
170
CheckTranslations.java
Normal file
@@ -0,0 +1,170 @@
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
import java.util.regex.*;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.ArrayList;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.charset.Charset;
|
||||
|
||||
public final class CheckTranslations {
|
||||
|
||||
private static boolean debug = false;
|
||||
private static boolean plurals = false;
|
||||
private static boolean empty = false;
|
||||
private static boolean remove = false;
|
||||
private static int checks = 0;
|
||||
private static int matches = 0;
|
||||
private static int changes = 0;
|
||||
private static Pattern p, pb, pe, e, o;
|
||||
|
||||
/**
|
||||
* Search translated strings.xml files for empty item / plural tags
|
||||
* and remove them.
|
||||
* @param args directories which contain string.xml files (in any subdirectory)
|
||||
* -e option to find all empty string tags
|
||||
* -p option to find all empty plurals and item tags
|
||||
* -r option to remove all occurrences from the files
|
||||
* -d option to see more details
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
if (args.length < 1 || (args[0].equals("-d") && args.length < 2)) {
|
||||
System.out.println("Not enough arguments");
|
||||
return;
|
||||
}
|
||||
for (int i = 0; i < args.length; i++) {
|
||||
switch (args[i]) {
|
||||
case "-d":
|
||||
debug = true;
|
||||
break;
|
||||
case "-p":
|
||||
plurals = true;
|
||||
break;
|
||||
case "-e":
|
||||
empty = true;
|
||||
break;
|
||||
case "-r":
|
||||
remove = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!plurals && !empty) {
|
||||
plurals = true;
|
||||
empty = true;
|
||||
}
|
||||
|
||||
p = Pattern.compile("(<item quantity=\")(zero|one|two|three|few|many|other)(\"></item>|\"/>)");
|
||||
pb = Pattern.compile("(<plurals[\\sa-zA-Z=\"]*>)");
|
||||
pe = Pattern.compile("(</plurals>)");
|
||||
e = Pattern.compile("(<string[\\sa-z_\\\"=]*)((><\\/string>|\\/>){1})");
|
||||
o = Pattern.compile("(<item quantity=\"other\">)[^</>]*(<\\/item>)");
|
||||
|
||||
for (int i = 0; i < args.length; i++) {
|
||||
if (!args[i].equals("-d") && !args[i].equals("-p") && !args[i].equals("-e") && !args[i].equals("-r")) {
|
||||
File f = new File(args[i]);
|
||||
if (f.exists() && !f.isDirectory()) {
|
||||
checkFile(f);
|
||||
} else if (f.isDirectory()) {
|
||||
checkFiles(f.listFiles());
|
||||
} else {
|
||||
System.out.println("'" + args[i] + "' does not exist!");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
System.out.println(checks + " files were checked.");
|
||||
System.out.println(matches + " corrupt lines detected.");
|
||||
if (remove) {
|
||||
System.out.println(matches + " corrupt lines removed and " + changes + " lines fixed.");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static void checkFiles(File[] f) {
|
||||
for (int i = 0; i < f.length; i++) {
|
||||
if (f[i].exists() && !f[i].isDirectory()) {
|
||||
if (f[i].toString().contains("strings.xml")) {
|
||||
checkFile(f[i]);
|
||||
}
|
||||
} else if (f[i].isDirectory()) {
|
||||
checkFiles(f[i].listFiles());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void checkFile(File f) {
|
||||
// Do not check our original English strings to cause no unwanted changes
|
||||
// Btw. there should not be empty plural/item tags
|
||||
if (f.toString().contains("values/strings.xml")) {
|
||||
return;
|
||||
}
|
||||
if (debug) System.out.println("Checking " + f.toString());
|
||||
checks++;
|
||||
|
||||
|
||||
List<String> lines = new ArrayList<String>();
|
||||
boolean checkFailed = false;
|
||||
boolean otherDetected = false;
|
||||
boolean inPlurals = false;
|
||||
try (BufferedReader br = new BufferedReader(new FileReader(f))) {
|
||||
String line;
|
||||
int ln = 0;
|
||||
while ((line = br.readLine()) != null) {
|
||||
ln++;
|
||||
if (plurals && p.matcher(line).find()) {
|
||||
matches++;
|
||||
if (debug) System.out.println(" Line " + ln + " was " + ((remove) ? "removed" : "detected") + ": '" + line + "'");
|
||||
checkFailed = true;
|
||||
} else if (empty && e.matcher(line).find()) {
|
||||
matches++;
|
||||
checkFailed = true;
|
||||
if (debug) System.out.println(" Line " + ln + " was " + ((remove) ? "removed" : "detected") + ": '" + line + "'");
|
||||
} else {
|
||||
if (remove) lines.add(line);
|
||||
}
|
||||
}
|
||||
br.close();
|
||||
int pluralsLine = 0;
|
||||
for (int i = 0; i < lines.size(); i++) {
|
||||
if (o.matcher(lines.get(i)).find()) {
|
||||
otherDetected = true;
|
||||
}
|
||||
if (plurals && pb.matcher(lines.get(i)).find()) {
|
||||
inPlurals = true;
|
||||
pluralsLine = i;
|
||||
} else if (plurals && pe.matcher(lines.get(i)).find()) {
|
||||
inPlurals = false;
|
||||
if (!otherDetected) {
|
||||
boolean b = false;
|
||||
check: for(int j = pluralsLine; j < i; j++) {
|
||||
if (lines.get(j).contains("many")) {
|
||||
b = true;
|
||||
pluralsLine = j;
|
||||
break check;
|
||||
}
|
||||
}
|
||||
if (remove && b) {
|
||||
if (debug) System.out.println(" Line " + (pluralsLine + 1) + " was " + ((remove) ? "changed" : "detected") + ": '" + lines.get(pluralsLine) + "'");
|
||||
lines.set(pluralsLine, lines.get(pluralsLine).replace("many", "other"));
|
||||
changes++;
|
||||
checkFailed = true;
|
||||
} else if (debug) {
|
||||
if (debug) System.out.println(" WARNING: Line " + (i + 1) + " - No <item quantity=\"other\"> found!");
|
||||
}
|
||||
}
|
||||
otherDetected = false;
|
||||
}
|
||||
|
||||
}
|
||||
if (remove && checkFailed) {
|
||||
Files.write(f.toPath(), lines, Charset.forName("UTF-8"));
|
||||
}
|
||||
} catch (IOException e) {
|
||||
System.out.println(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,8 +8,8 @@ android {
|
||||
applicationId "org.schabi.newpipe"
|
||||
minSdkVersion 15
|
||||
targetSdkVersion 27
|
||||
versionCode 43
|
||||
versionName "0.11.2"
|
||||
versionCode 46
|
||||
versionName "0.11.5"
|
||||
|
||||
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
||||
vectorDrawables.useSupportLibrary = true
|
||||
@@ -42,8 +42,8 @@ android {
|
||||
abortOnError false
|
||||
}
|
||||
compileOptions {
|
||||
sourceCompatibility JavaVersion.VERSION_1_7
|
||||
targetCompatibility JavaVersion.VERSION_1_7
|
||||
sourceCompatibility JavaVersion.VERSION_1_8
|
||||
targetCompatibility JavaVersion.VERSION_1_8
|
||||
}
|
||||
}
|
||||
|
||||
@@ -55,7 +55,7 @@ dependencies {
|
||||
exclude module: 'support-annotations'
|
||||
}
|
||||
|
||||
implementation 'com.github.TeamNewPipe:NewPipeExtractor:2d191c4ca'
|
||||
implementation 'com.github.TeamNewPipe:NewPipeExtractor:1c97da8b51b3610'
|
||||
|
||||
testImplementation 'junit:junit:4.12'
|
||||
testImplementation 'org.mockito:mockito-core:1.10.19'
|
||||
|
||||
@@ -28,8 +28,13 @@ import android.os.Looper;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.design.widget.NavigationView;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v4.app.FragmentManager;
|
||||
import android.support.v4.view.GravityCompat;
|
||||
import android.support.v4.widget.DrawerLayout;
|
||||
import android.support.v7.app.ActionBar;
|
||||
import android.support.v7.app.ActionBarDrawerToggle;
|
||||
import android.support.v7.app.AppCompatActivity;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
import android.util.Log;
|
||||
@@ -45,6 +50,7 @@ import org.schabi.newpipe.database.history.dao.WatchHistoryDAO;
|
||||
import org.schabi.newpipe.database.history.model.HistoryEntry;
|
||||
import org.schabi.newpipe.database.history.model.SearchHistoryEntry;
|
||||
import org.schabi.newpipe.database.history.model.WatchHistoryEntry;
|
||||
import org.schabi.newpipe.extractor.NewPipe;
|
||||
import org.schabi.newpipe.extractor.StreamingService;
|
||||
import org.schabi.newpipe.extractor.stream.AudioStream;
|
||||
import org.schabi.newpipe.extractor.stream.StreamInfo;
|
||||
@@ -69,6 +75,7 @@ public class MainActivity extends AppCompatActivity implements HistoryListener {
|
||||
private static final String TAG = "MainActivity";
|
||||
public static final boolean DEBUG = false;
|
||||
private SharedPreferences sharedPreferences;
|
||||
private ActionBarDrawerToggle toggle = null;
|
||||
|
||||
/*//////////////////////////////////////////////////////////////////////////
|
||||
// Activity's LifeCycle
|
||||
@@ -76,7 +83,8 @@ public class MainActivity extends AppCompatActivity implements HistoryListener {
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
if (DEBUG) Log.d(TAG, "onCreate() called with: savedInstanceState = [" + savedInstanceState + "]");
|
||||
if (DEBUG)
|
||||
Log.d(TAG, "onCreate() called with: savedInstanceState = [" + savedInstanceState + "]");
|
||||
ThemeHelper.setTheme(this);
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_main);
|
||||
@@ -85,8 +93,59 @@ public class MainActivity extends AppCompatActivity implements HistoryListener {
|
||||
initFragments();
|
||||
}
|
||||
|
||||
Toolbar toolbar = findViewById(R.id.toolbar);
|
||||
final Toolbar toolbar = findViewById(R.id.toolbar);
|
||||
final DrawerLayout drawer = findViewById(R.id.drawer_layout);
|
||||
final NavigationView drawerItems = findViewById(R.id.navigation);
|
||||
setSupportActionBar(toolbar);
|
||||
|
||||
drawerItems.getMenu().getItem(NewPipe.getIdOfService(PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getString("service", "YouTube"))).setChecked(true);
|
||||
|
||||
if (!BuildConfig.BUILD_TYPE.equals("release")) {
|
||||
toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.drawer_open, R.string.drawer_close);
|
||||
toggle.syncState();
|
||||
drawer.addDrawerListener(toggle);
|
||||
|
||||
drawerItems.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
|
||||
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
|
||||
drawerItems.getMenu().getItem(NewPipe.getIdOfService(PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getString("service", "YouTube"))).setChecked(false);
|
||||
SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).edit();
|
||||
editor.putString("service", item.getTitle().toString());
|
||||
editor.apply();
|
||||
drawer.closeDrawers();
|
||||
drawerItems.getMenu().getItem(NewPipe.getIdOfService(PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getString("service", "YouTube"))).setChecked(true);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
} else {
|
||||
drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
|
||||
}
|
||||
|
||||
getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
|
||||
@Override
|
||||
public void onBackStackChanged() {
|
||||
if (getSupportFragmentManager().getBackStackEntryCount() > 1) {
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
onBackPressed();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
|
||||
if (toggle != null) {
|
||||
toggle.syncState();
|
||||
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
drawer.openDrawer(GravityCompat.START);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
|
||||
initHistory();
|
||||
|
||||
@@ -18,9 +18,8 @@ public class RouterPopupActivity extends RouterActivity {
|
||||
|
||||
@Override
|
||||
protected void handleUrl(String url) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
|
||||
&& !PermissionHelper.checkSystemAlertWindowPermission(this)) {
|
||||
Toast.makeText(this, R.string.msg_popup_permission, Toast.LENGTH_LONG).show();
|
||||
if (!PermissionHelper.isPopupEnabled(this)) {
|
||||
PermissionHelper.showPopupEnablementToast(this);
|
||||
finish();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package org.schabi.newpipe.fragments;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.annotation.StringRes;
|
||||
@@ -18,6 +19,7 @@ import org.schabi.newpipe.MainActivity;
|
||||
import org.schabi.newpipe.R;
|
||||
import org.schabi.newpipe.ReCaptchaActivity;
|
||||
import org.schabi.newpipe.extractor.exceptions.ReCaptchaException;
|
||||
import org.schabi.newpipe.extractor.stream.StreamInfo;
|
||||
import org.schabi.newpipe.report.ErrorActivity;
|
||||
import org.schabi.newpipe.report.UserAction;
|
||||
import org.schabi.newpipe.util.ExtractorHelper;
|
||||
@@ -240,4 +242,22 @@ public abstract class BaseStateFragment<I> extends BaseFragment implements ViewC
|
||||
|
||||
ErrorActivity.reportError(getContext(), exception, MainActivity.class, rootView, ErrorActivity.ErrorInfo.make(userAction, serviceName, request, errorId));
|
||||
}
|
||||
|
||||
/*//////////////////////////////////////////////////////////////////////////
|
||||
// Utils
|
||||
//////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
|
||||
protected void openUrlInBrowser(String url) {
|
||||
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
|
||||
startActivity(Intent.createChooser(intent, activity.getString(R.string.share_dialog_title)));
|
||||
}
|
||||
|
||||
protected void shareUrl(String subject, String url) {
|
||||
Intent intent = new Intent(Intent.ACTION_SEND);
|
||||
intent.setType("text/plain");
|
||||
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
|
||||
intent.putExtra(Intent.EXTRA_TEXT, url);
|
||||
startActivity(Intent.createChooser(intent, getString(R.string.share_dialog_title)));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -138,7 +138,7 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
switch (item.getItemId()) {
|
||||
case R.id.action_search:
|
||||
NavigationHelper.openSearchFragment(getFragmentManager(), 0, "");
|
||||
NavigationHelper.openSearchFragment(getFragmentManager(), NewPipe.getIdOfService(PreferenceManager.getDefaultSharedPreferences(getActivity()).getString("service", "YouTube")), "");
|
||||
return true;
|
||||
}
|
||||
return super.onOptionsItemSelected(item);
|
||||
|
||||
@@ -342,7 +342,11 @@ public class VideoDetailFragment extends BaseStateFragment<StreamInfo> implement
|
||||
}
|
||||
break;
|
||||
case R.id.detail_thumbnail_root_layout:
|
||||
openVideoPlayer();
|
||||
if (currentInfo.video_streams.isEmpty() && currentInfo.video_only_streams.isEmpty()) {
|
||||
openBackgroundPlayer(false);
|
||||
} else {
|
||||
openVideoPlayer();
|
||||
}
|
||||
break;
|
||||
case R.id.detail_title_root_layout:
|
||||
toggleTitleAndDescription();
|
||||
@@ -505,7 +509,7 @@ public class VideoDetailFragment extends BaseStateFragment<StreamInfo> implement
|
||||
NavigationHelper.enqueueOnBackgroundPlayer(context, new SinglePlayQueue(item));
|
||||
break;
|
||||
case 1:
|
||||
NavigationHelper.enqueueOnPopupPlayer(context, new SinglePlayQueue(item));
|
||||
NavigationHelper.enqueueOnPopupPlayer(getActivity(), new SinglePlayQueue(item));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -623,24 +627,12 @@ public class VideoDetailFragment extends BaseStateFragment<StreamInfo> implement
|
||||
if (DEBUG) Log.d(TAG, "setupActionBarHandler() called with: info = [" + info + "]");
|
||||
sortedStreamVideosList = new ArrayList<>(ListHelper.getSortedStreamVideosList(activity, info.getVideoStreams(), info.getVideoOnlyStreams(), false));
|
||||
actionBarHandler.setupStreamList(sortedStreamVideosList, spinnerToolbar);
|
||||
actionBarHandler.setOnShareListener(new ActionBarHandler.OnActionListener() {
|
||||
@Override
|
||||
public void onActionSelected(int selectedStreamId) {
|
||||
Intent intent = new Intent();
|
||||
intent.setAction(Intent.ACTION_SEND);
|
||||
intent.putExtra(Intent.EXTRA_TEXT, info.getUrl());
|
||||
intent.setType("text/plain");
|
||||
startActivity(Intent.createChooser(intent, activity.getString(R.string.share_dialog_title)));
|
||||
}
|
||||
});
|
||||
actionBarHandler.setOnShareListener(selectedStreamId -> shareUrl(info.name, info.url));
|
||||
|
||||
actionBarHandler.setOnOpenInBrowserListener(new ActionBarHandler.OnActionListener() {
|
||||
@Override
|
||||
public void onActionSelected(int selectedStreamId) {
|
||||
Intent intent = new Intent();
|
||||
intent.setAction(Intent.ACTION_VIEW);
|
||||
intent.setData(Uri.parse(info.getUrl()));
|
||||
startActivity(Intent.createChooser(intent, activity.getString(R.string.choose_browser)));
|
||||
openUrlInBrowser(info.getUrl());
|
||||
}
|
||||
});
|
||||
|
||||
@@ -820,11 +812,8 @@ public class VideoDetailFragment extends BaseStateFragment<StreamInfo> implement
|
||||
}
|
||||
|
||||
private void openPopupPlayer(final boolean append) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !PermissionHelper.checkSystemAlertWindowPermission(activity)) {
|
||||
Toast toast = Toast.makeText(activity, R.string.msg_popup_permission, Toast.LENGTH_LONG);
|
||||
TextView messageView = toast.getView().findViewById(android.R.id.message);
|
||||
if (messageView != null) messageView.setGravity(Gravity.CENTER);
|
||||
toast.show();
|
||||
if (!PermissionHelper.isPopupEnabled(activity)) {
|
||||
PermissionHelper.showPopupEnablementToast(activity);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1173,6 +1162,13 @@ public class VideoDetailFragment extends BaseStateFragment<StreamInfo> implement
|
||||
showSnackBarError(info.getErrors(), UserAction.REQUESTED_STREAM, NewPipe.getNameOfService(info.getServiceId()), info.getUrl(), 0);
|
||||
}
|
||||
|
||||
if (info.video_streams.isEmpty() && info.video_only_streams.isEmpty()) {
|
||||
detailControlsBackground.setVisibility(View.GONE);
|
||||
detailControlsPopup.setVisibility(View.GONE);
|
||||
spinnerToolbar.setVisibility(View.GONE);
|
||||
thumbnailPlayButton.setImageResource(R.drawable.ic_headset_white_24dp);
|
||||
}
|
||||
|
||||
if (autoPlayEnabled) {
|
||||
openVideoPlayer();
|
||||
// Only auto play in the first open
|
||||
@@ -1216,4 +1212,4 @@ public class VideoDetailFragment extends BaseStateFragment<StreamInfo> implement
|
||||
|
||||
showError(getString(R.string.blocked_by_gema), false, R.drawable.gruese_die_gema);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,16 +1,21 @@
|
||||
package org.schabi.newpipe.fragments.list;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.v7.app.ActionBar;
|
||||
import android.support.v7.widget.LinearLayoutManager;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.util.Log;
|
||||
import android.view.Gravity;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.View;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import org.schabi.newpipe.R;
|
||||
import org.schabi.newpipe.extractor.InfoItem;
|
||||
@@ -24,6 +29,7 @@ import org.schabi.newpipe.info_list.InfoItemDialog;
|
||||
import org.schabi.newpipe.info_list.InfoListAdapter;
|
||||
import org.schabi.newpipe.playlist.SinglePlayQueue;
|
||||
import org.schabi.newpipe.util.NavigationHelper;
|
||||
import org.schabi.newpipe.util.PermissionHelper;
|
||||
import org.schabi.newpipe.util.StateSaver;
|
||||
|
||||
import java.util.List;
|
||||
@@ -192,6 +198,7 @@ public abstract class BaseListFragment<I, N> extends BaseStateFragment<I> implem
|
||||
|
||||
protected void showStreamDialog(final StreamInfoItem item) {
|
||||
final Context context = getContext();
|
||||
final Activity activity = getActivity();
|
||||
if (context == null || context.getResources() == null || getActivity() == null) return;
|
||||
|
||||
final String[] commands = new String[]{
|
||||
@@ -207,7 +214,7 @@ public abstract class BaseListFragment<I, N> extends BaseStateFragment<I> implem
|
||||
NavigationHelper.enqueueOnBackgroundPlayer(context, new SinglePlayQueue(item));
|
||||
break;
|
||||
case 1:
|
||||
NavigationHelper.enqueueOnPopupPlayer(context, new SinglePlayQueue(item));
|
||||
NavigationHelper.enqueueOnPopupPlayer(activity, new SinglePlayQueue(item));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
@@ -124,20 +124,12 @@ public abstract class BaseListInfoFragment<I extends ListInfo> extends BaseListF
|
||||
currentWorker = loadResult(forceLoad)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(new Consumer<I>() {
|
||||
@Override
|
||||
public void accept(@NonNull I result) throws Exception {
|
||||
isLoading.set(false);
|
||||
currentInfo = result;
|
||||
currentNextItemsUrl = result.next_streams_url;
|
||||
handleResult(result);
|
||||
}
|
||||
}, new Consumer<Throwable>() {
|
||||
@Override
|
||||
public void accept(@NonNull Throwable throwable) throws Exception {
|
||||
onError(throwable);
|
||||
}
|
||||
});
|
||||
.subscribe((@NonNull I result) -> {
|
||||
isLoading.set(false);
|
||||
currentInfo = result;
|
||||
currentNextItemsUrl = result.next_streams_url;
|
||||
handleResult(result);
|
||||
}, (@NonNull Throwable throwable) -> onError(throwable));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -153,18 +145,12 @@ public abstract class BaseListInfoFragment<I extends ListInfo> extends BaseListF
|
||||
currentWorker = loadMoreItemsLogic()
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(new Consumer<ListExtractor.NextItemsResult>() {
|
||||
@Override
|
||||
public void accept(@io.reactivex.annotations.NonNull ListExtractor.NextItemsResult nextItemsResult) throws Exception {
|
||||
isLoading.set(false);
|
||||
handleNextItems(nextItemsResult);
|
||||
}
|
||||
}, new Consumer<Throwable>() {
|
||||
@Override
|
||||
public void accept(@io.reactivex.annotations.NonNull Throwable throwable) throws Exception {
|
||||
isLoading.set(false);
|
||||
onError(throwable);
|
||||
}
|
||||
.subscribe((@io.reactivex.annotations.NonNull ListExtractor.NextItemsResult nextItemsResult) -> {
|
||||
isLoading.set(false);
|
||||
handleNextItems(nextItemsResult);
|
||||
}, (@io.reactivex.annotations.NonNull Throwable throwable) -> {
|
||||
isLoading.set(false);
|
||||
onError(throwable);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
package org.schabi.newpipe.fragments.list.channel;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
@@ -12,7 +12,6 @@ import android.support.v4.content.ContextCompat;
|
||||
import android.support.v7.app.ActionBar;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.Gravity;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
@@ -23,7 +22,6 @@ import android.widget.Button;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.jakewharton.rxbinding2.view.RxView;
|
||||
|
||||
@@ -153,6 +151,7 @@ public class ChannelFragment extends BaseListInfoFragment<ChannelInfo> {
|
||||
|
||||
@Override
|
||||
protected void showStreamDialog(final StreamInfoItem item) {
|
||||
final Activity activity = getActivity();
|
||||
final Context context = getContext();
|
||||
if (context == null || context.getResources() == null || getActivity() == null) return;
|
||||
|
||||
@@ -173,7 +172,7 @@ public class ChannelFragment extends BaseListInfoFragment<ChannelInfo> {
|
||||
NavigationHelper.enqueueOnBackgroundPlayer(context, new SinglePlayQueue(item));
|
||||
break;
|
||||
case 1:
|
||||
NavigationHelper.enqueueOnPopupPlayer(context, new SinglePlayQueue(item));
|
||||
NavigationHelper.enqueueOnPopupPlayer(activity, new SinglePlayQueue(item));
|
||||
break;
|
||||
case 2:
|
||||
NavigationHelper.playOnMainPlayer(context, getPlayQueue(index));
|
||||
@@ -182,7 +181,7 @@ public class ChannelFragment extends BaseListInfoFragment<ChannelInfo> {
|
||||
NavigationHelper.playOnBackgroundPlayer(context, getPlayQueue(index));
|
||||
break;
|
||||
case 4:
|
||||
NavigationHelper.playOnPopupPlayer(context, getPlayQueue(index));
|
||||
NavigationHelper.playOnPopupPlayer(activity, getPlayQueue(index));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -222,18 +221,6 @@ public class ChannelFragment extends BaseListInfoFragment<ChannelInfo> {
|
||||
}
|
||||
}
|
||||
|
||||
private void openChannelUriInBrowser() {
|
||||
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
|
||||
startActivity(intent);
|
||||
}
|
||||
|
||||
private void shareChannelUri() {
|
||||
Intent intent = new Intent(Intent.ACTION_SEND);
|
||||
intent.setType("text/plain");
|
||||
intent.putExtra(Intent.EXTRA_TEXT, url);
|
||||
startActivity(Intent.createChooser(intent, getString(R.string.share_dialog_title)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
switch (item.getItemId()) {
|
||||
@@ -241,10 +228,10 @@ public class ChannelFragment extends BaseListInfoFragment<ChannelInfo> {
|
||||
openRssFeed();
|
||||
break;
|
||||
case R.id.menu_item_openInBrowser:
|
||||
openChannelUriInBrowser();
|
||||
openUrlInBrowser(url);
|
||||
break;
|
||||
case R.id.menu_item_share: {
|
||||
shareChannelUri();
|
||||
shareUrl(name, url);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
@@ -466,13 +453,6 @@ public class ChannelFragment extends BaseListInfoFragment<ChannelInfo> {
|
||||
headerPopupButton.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !PermissionHelper.checkSystemAlertWindowPermission(activity)) {
|
||||
Toast toast = Toast.makeText(activity, R.string.msg_popup_permission, Toast.LENGTH_LONG);
|
||||
TextView messageView = toast.getView().findViewById(android.R.id.message);
|
||||
if (messageView != null) messageView.setGravity(Gravity.CENTER);
|
||||
toast.show();
|
||||
return;
|
||||
}
|
||||
NavigationHelper.playOnPopupPlayer(activity, getPlayQueue());
|
||||
}
|
||||
});
|
||||
|
||||
@@ -5,6 +5,7 @@ import android.preference.PreferenceManager;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.v7.app.ActionBar;
|
||||
import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
@@ -57,14 +58,10 @@ public class KioskFragment extends BaseListInfoFragment<KioskInfo> {
|
||||
@State
|
||||
protected String kioskId = "";
|
||||
|
||||
|
||||
/*//////////////////////////////////////////////////////////////////////////
|
||||
// Views
|
||||
//////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
private View headerRootLayout;
|
||||
private TextView headerTitleView;
|
||||
|
||||
public static KioskFragment getInstance(int serviceId)
|
||||
throws ExtractionException {
|
||||
return getInstance(serviceId, NewPipe.getService(serviceId)
|
||||
@@ -146,14 +143,18 @@ public class KioskFragment extends BaseListInfoFragment<KioskInfo> {
|
||||
public Single<KioskInfo> loadResult(boolean forceReload) {
|
||||
String contentCountry = PreferenceManager
|
||||
.getDefaultSharedPreferences(activity)
|
||||
.getString(getString(R.string.search_language_key),
|
||||
getString(R.string.default_language_value));
|
||||
.getString(getString(R.string.content_country_key),
|
||||
getString(R.string.default_country_value));
|
||||
return ExtractorHelper.getKioskInfo(serviceId, url, contentCountry, forceReload);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Single<ListExtractor.NextItemsResult> loadMoreItemsLogic() {
|
||||
return ExtractorHelper.getMoreKioskItems(serviceId, url, currentNextItemsUrl);
|
||||
String contentCountry = PreferenceManager
|
||||
.getDefaultSharedPreferences(activity)
|
||||
.getString(getString(R.string.content_country_key),
|
||||
getString(R.string.default_country_value));
|
||||
return ExtractorHelper.getMoreKioskItems(serviceId, url, currentNextItemsUrl, contentCountry);
|
||||
}
|
||||
|
||||
/*//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -1,22 +1,21 @@
|
||||
package org.schabi.newpipe.fragments.list.playlist;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.Gravity;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import org.schabi.newpipe.R;
|
||||
import org.schabi.newpipe.extractor.ListExtractor;
|
||||
@@ -32,7 +31,6 @@ import org.schabi.newpipe.playlist.SinglePlayQueue;
|
||||
import org.schabi.newpipe.report.UserAction;
|
||||
import org.schabi.newpipe.util.ExtractorHelper;
|
||||
import org.schabi.newpipe.util.NavigationHelper;
|
||||
import org.schabi.newpipe.util.PermissionHelper;
|
||||
|
||||
import io.reactivex.Single;
|
||||
|
||||
@@ -98,16 +96,10 @@ public class PlaylistFragment extends BaseListInfoFragment<PlaylistInfo> {
|
||||
infoListAdapter.useMiniItemVariants(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
||||
if (DEBUG) Log.d(TAG, "onCreateOptionsMenu() called with: menu = [" + menu + "], inflater = [" + inflater + "]");
|
||||
super.onCreateOptionsMenu(menu, inflater);
|
||||
inflater.inflate(R.menu.menu_playlist, menu);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void showStreamDialog(final StreamInfoItem item) {
|
||||
final Context context = getContext();
|
||||
final Activity activity = getActivity();
|
||||
if (context == null || context.getResources() == null || getActivity() == null) return;
|
||||
|
||||
final String[] commands = new String[]{
|
||||
@@ -127,7 +119,7 @@ public class PlaylistFragment extends BaseListInfoFragment<PlaylistInfo> {
|
||||
NavigationHelper.enqueueOnBackgroundPlayer(context, new SinglePlayQueue(item));
|
||||
break;
|
||||
case 1:
|
||||
NavigationHelper.enqueueOnPopupPlayer(context, new SinglePlayQueue(item));
|
||||
NavigationHelper.enqueueOnPopupPlayer(activity, new SinglePlayQueue(item));
|
||||
break;
|
||||
case 2:
|
||||
NavigationHelper.playOnMainPlayer(context, getPlayQueue(index));
|
||||
@@ -136,7 +128,7 @@ public class PlaylistFragment extends BaseListInfoFragment<PlaylistInfo> {
|
||||
NavigationHelper.playOnBackgroundPlayer(context, getPlayQueue(index));
|
||||
break;
|
||||
case 4:
|
||||
NavigationHelper.playOnPopupPlayer(context, getPlayQueue(index));
|
||||
NavigationHelper.playOnPopupPlayer(activity, getPlayQueue(index));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -146,6 +138,14 @@ public class PlaylistFragment extends BaseListInfoFragment<PlaylistInfo> {
|
||||
|
||||
new InfoItemDialog(getActivity(), item, commands, actions).show();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
||||
if (DEBUG) Log.d(TAG, "onCreateOptionsMenu() called with: menu = [" + menu + "], inflater = [" + inflater + "]");
|
||||
super.onCreateOptionsMenu(menu, inflater);
|
||||
inflater.inflate(R.menu.menu_playlist, menu);
|
||||
}
|
||||
|
||||
/*//////////////////////////////////////////////////////////////////////////
|
||||
// Load and handle
|
||||
//////////////////////////////////////////////////////////////////////////*/
|
||||
@@ -160,6 +160,23 @@ public class PlaylistFragment extends BaseListInfoFragment<PlaylistInfo> {
|
||||
return ExtractorHelper.getPlaylistInfo(serviceId, url, forceLoad);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
switch (item.getItemId()) {
|
||||
case R.id.menu_item_openInBrowser:
|
||||
openUrlInBrowser(url);
|
||||
break;
|
||||
case R.id.menu_item_share: {
|
||||
shareUrl(name, url);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/*//////////////////////////////////////////////////////////////////////////
|
||||
// Contract
|
||||
//////////////////////////////////////////////////////////////////////////*/
|
||||
@@ -211,13 +228,6 @@ public class PlaylistFragment extends BaseListInfoFragment<PlaylistInfo> {
|
||||
headerPopupButton.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !PermissionHelper.checkSystemAlertWindowPermission(activity)) {
|
||||
Toast toast = Toast.makeText(activity, R.string.msg_popup_permission, Toast.LENGTH_LONG);
|
||||
TextView messageView = toast.getView().findViewById(android.R.id.message);
|
||||
if (messageView != null) messageView.setGravity(Gravity.CENTER);
|
||||
toast.show();
|
||||
return;
|
||||
}
|
||||
NavigationHelper.playOnPopupPlayer(activity, getPlayQueue());
|
||||
}
|
||||
});
|
||||
|
||||
@@ -111,7 +111,7 @@ public class SearchFragment extends BaseListFragment<SearchResult, ListExtractor
|
||||
|
||||
private int currentPage = 0;
|
||||
private int currentNextPage = 0;
|
||||
private String searchLanguage;
|
||||
private String contentCountry;
|
||||
private boolean isSuggestionsEnabled = true;
|
||||
private boolean isSearchHistoryEnabled = true;
|
||||
|
||||
@@ -176,7 +176,7 @@ public class SearchFragment extends BaseListFragment<SearchResult, ListExtractor
|
||||
|
||||
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(activity);
|
||||
isSuggestionsEnabled = preferences.getBoolean(getString(R.string.show_search_suggestions_key), true);
|
||||
searchLanguage = preferences.getString(getString(R.string.search_language_key), getString(R.string.default_language_value));
|
||||
contentCountry = preferences.getString(getString(R.string.content_country_key), getString(R.string.default_country_value));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -619,7 +619,7 @@ public class SearchFragment extends BaseListFragment<SearchResult, ListExtractor
|
||||
return local.materialize();
|
||||
}
|
||||
|
||||
final Observable<List<SuggestionItem>> network = ExtractorHelper.suggestionsFor(serviceId, query, searchLanguage).toObservable()
|
||||
final Observable<List<SuggestionItem>> network = ExtractorHelper.suggestionsFor(serviceId, query, contentCountry).toObservable()
|
||||
.map(new Function<List<String>, List<SuggestionItem>>() {
|
||||
@Override
|
||||
public List<SuggestionItem> apply(@io.reactivex.annotations.NonNull List<String> strings) throws Exception {
|
||||
@@ -731,7 +731,7 @@ public class SearchFragment extends BaseListFragment<SearchResult, ListExtractor
|
||||
super.startLoading(forceLoad);
|
||||
if (disposables != null) disposables.clear();
|
||||
if (searchDisposable != null) searchDisposable.dispose();
|
||||
searchDisposable = ExtractorHelper.searchFor(serviceId, searchQuery, currentPage, searchLanguage, filter)
|
||||
searchDisposable = ExtractorHelper.searchFor(serviceId, searchQuery, currentPage, contentCountry, filter)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(new Consumer<SearchResult>() {
|
||||
@@ -755,7 +755,7 @@ public class SearchFragment extends BaseListFragment<SearchResult, ListExtractor
|
||||
showListFooter(true);
|
||||
if (searchDisposable != null) searchDisposable.dispose();
|
||||
currentNextPage = currentPage + 1;
|
||||
searchDisposable = ExtractorHelper.getMoreSearchItems(serviceId, searchQuery, currentNextPage, searchLanguage, filter)
|
||||
searchDisposable = ExtractorHelper.getMoreSearchItems(serviceId, searchQuery, currentNextPage, contentCountry, filter)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(new Consumer<ListExtractor.NextItemsResult>() {
|
||||
|
||||
@@ -65,7 +65,6 @@ public final class BackgroundPlayer extends Service {
|
||||
|
||||
public static final String ACTION_CLOSE = "org.schabi.newpipe.player.BackgroundPlayer.CLOSE";
|
||||
public static final String ACTION_PLAY_PAUSE = "org.schabi.newpipe.player.BackgroundPlayer.PLAY_PAUSE";
|
||||
public static final String ACTION_OPEN_CONTROLS = "org.schabi.newpipe.player.BackgroundPlayer.OPEN_CONTROLS";
|
||||
public static final String ACTION_REPEAT = "org.schabi.newpipe.player.BackgroundPlayer.REPEAT";
|
||||
public static final String ACTION_PLAY_NEXT = "org.schabi.newpipe.player.BackgroundPlayer.ACTION_PLAY_NEXT";
|
||||
public static final String ACTION_PLAY_PREVIOUS = "org.schabi.newpipe.player.BackgroundPlayer.ACTION_PLAY_PREVIOUS";
|
||||
@@ -195,11 +194,14 @@ public final class BackgroundPlayer extends Service {
|
||||
PendingIntent.getBroadcast(this, NOTIFICATION_ID, new Intent(ACTION_PLAY_PAUSE), PendingIntent.FLAG_UPDATE_CURRENT));
|
||||
remoteViews.setOnClickPendingIntent(R.id.notificationStop,
|
||||
PendingIntent.getBroadcast(this, NOTIFICATION_ID, new Intent(ACTION_CLOSE), PendingIntent.FLAG_UPDATE_CURRENT));
|
||||
remoteViews.setOnClickPendingIntent(R.id.notificationContent,
|
||||
PendingIntent.getBroadcast(this, NOTIFICATION_ID, new Intent(ACTION_OPEN_CONTROLS), PendingIntent.FLAG_UPDATE_CURRENT));
|
||||
remoteViews.setOnClickPendingIntent(R.id.notificationRepeat,
|
||||
PendingIntent.getBroadcast(this, NOTIFICATION_ID, new Intent(ACTION_REPEAT), PendingIntent.FLAG_UPDATE_CURRENT));
|
||||
|
||||
// Starts background player activity -- attempts to unlock lockscreen
|
||||
final Intent intent = NavigationHelper.getBackgroundPlayerActivityIntent(this);
|
||||
remoteViews.setOnClickPendingIntent(R.id.notificationContent,
|
||||
PendingIntent.getActivity(this, NOTIFICATION_ID, intent, PendingIntent.FLAG_UPDATE_CURRENT));
|
||||
|
||||
if (basePlayerImpl.playQueue != null && basePlayerImpl.playQueue.size() > 1) {
|
||||
remoteViews.setInt(R.id.notificationFRewind, SET_IMAGE_RESOURCE_METHOD, R.drawable.exo_controls_previous);
|
||||
remoteViews.setInt(R.id.notificationFForward, SET_IMAGE_RESOURCE_METHOD, R.drawable.exo_controls_next);
|
||||
@@ -393,7 +395,7 @@ public final class BackgroundPlayer extends Service {
|
||||
if (index < 0 || index >= info.audio_streams.size()) return null;
|
||||
|
||||
final AudioStream audio = info.audio_streams.get(index);
|
||||
return buildMediaSource(audio.getUrl(), MediaFormat.getSuffixById(audio.format));
|
||||
return buildMediaSource(audio.getUrl(), MediaFormat.getSuffixById(audio.getFormatId()));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -453,7 +455,6 @@ public final class BackgroundPlayer extends Service {
|
||||
super.setupBroadcastReceiver(intentFilter);
|
||||
intentFilter.addAction(ACTION_CLOSE);
|
||||
intentFilter.addAction(ACTION_PLAY_PAUSE);
|
||||
intentFilter.addAction(ACTION_OPEN_CONTROLS);
|
||||
intentFilter.addAction(ACTION_REPEAT);
|
||||
intentFilter.addAction(ACTION_PLAY_PREVIOUS);
|
||||
intentFilter.addAction(ACTION_PLAY_NEXT);
|
||||
@@ -478,9 +479,6 @@ public final class BackgroundPlayer extends Service {
|
||||
case ACTION_PLAY_PAUSE:
|
||||
onVideoPlayPause();
|
||||
break;
|
||||
case ACTION_OPEN_CONTROLS:
|
||||
NavigationHelper.openBackgroundPlayerControl(getApplicationContext());
|
||||
break;
|
||||
case ACTION_REPEAT:
|
||||
onRepeatClicked();
|
||||
break;
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
package org.schabi.newpipe.player;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.view.MenuItem;
|
||||
|
||||
import org.schabi.newpipe.R;
|
||||
|
||||
import static org.schabi.newpipe.player.BackgroundPlayer.ACTION_CLOSE;
|
||||
|
||||
public final class BackgroundPlayerActivity extends ServicePlayerActivity {
|
||||
|
||||
private static final String TAG = "BackgroundPlayerActivity";
|
||||
@@ -36,4 +39,25 @@ public final class BackgroundPlayerActivity extends ServicePlayerActivity {
|
||||
((BackgroundPlayer.BasePlayerImpl) player).removeActivityListener(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPlayerOptionMenuResource() {
|
||||
return R.menu.menu_play_queue_bg;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onPlayerOptionSelected(MenuItem item) {
|
||||
if (item.getItemId() == R.id.action_switch_popup) {
|
||||
this.player.setRecovery();
|
||||
getApplicationContext().sendBroadcast(getPlayerShutdownIntent());
|
||||
getApplicationContext().startService(getSwitchIntent(PopupVideoPlayer.class));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Intent getPlayerShutdownIntent() {
|
||||
return new Intent(ACTION_CLOSE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,6 +25,7 @@ import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.pm.ActivityInfo;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.Color;
|
||||
import android.media.AudioManager;
|
||||
import android.os.Build;
|
||||
@@ -37,7 +38,6 @@ import android.support.v7.widget.RecyclerView;
|
||||
import android.support.v7.widget.helper.ItemTouchHelper;
|
||||
import android.util.Log;
|
||||
import android.view.GestureDetector;
|
||||
import android.view.MenuItem;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.WindowManager;
|
||||
@@ -62,6 +62,7 @@ import org.schabi.newpipe.util.AnimationUtils;
|
||||
import org.schabi.newpipe.util.ListHelper;
|
||||
import org.schabi.newpipe.util.NavigationHelper;
|
||||
import org.schabi.newpipe.util.PermissionHelper;
|
||||
import org.schabi.newpipe.util.PopupMenuIconHacker;
|
||||
import org.schabi.newpipe.util.ThemeHelper;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
@@ -78,6 +79,7 @@ import static org.schabi.newpipe.util.AnimationUtils.animateView;
|
||||
public final class MainVideoPlayer extends Activity {
|
||||
private static final String TAG = ".MainVideoPlayer";
|
||||
private static final boolean DEBUG = BasePlayer.DEBUG;
|
||||
private static final String PLAYER_STATE_INTENT = "player_state_intent";
|
||||
|
||||
private GestureDetector gestureDetector;
|
||||
|
||||
@@ -99,19 +101,41 @@ public final class MainVideoPlayer extends Activity {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) getWindow().setStatusBarColor(Color.BLACK);
|
||||
setVolumeControlStream(AudioManager.STREAM_MUSIC);
|
||||
|
||||
if (getIntent() == null) {
|
||||
final Intent intent;
|
||||
if (savedInstanceState != null && savedInstanceState.getParcelable(PLAYER_STATE_INTENT) != null) {
|
||||
intent = savedInstanceState.getParcelable(PLAYER_STATE_INTENT);
|
||||
} else {
|
||||
intent = getIntent();
|
||||
}
|
||||
|
||||
if (intent == null) {
|
||||
Toast.makeText(this, R.string.general_error, Toast.LENGTH_SHORT).show();
|
||||
finish();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
showSystemUi();
|
||||
setContentView(R.layout.activity_main_player);
|
||||
playerImpl = new VideoPlayerImpl(this);
|
||||
playerImpl.setup(findViewById(android.R.id.content));
|
||||
playerImpl.handleIntent(getIntent());
|
||||
playerImpl.handleIntent(intent);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onSaveInstanceState(Bundle outState) {
|
||||
super.onSaveInstanceState(outState);
|
||||
if (this.playerImpl == null) return;
|
||||
|
||||
final Intent intent = NavigationHelper.getPlayerIntent(
|
||||
getApplicationContext(),
|
||||
this.getClass(),
|
||||
this.playerImpl.getPlayQueue(),
|
||||
this.playerImpl.getRepeatMode(),
|
||||
this.playerImpl.getPlaybackSpeed(),
|
||||
this.playerImpl.getPlaybackPitch(),
|
||||
this.playerImpl.getPlaybackQuality()
|
||||
);
|
||||
outState.putParcelable(PLAYER_STATE_INTENT, intent);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -303,7 +327,7 @@ public final class MainVideoPlayer extends Activity {
|
||||
this.playNextButton = rootView.findViewById(R.id.playNextButton);
|
||||
this.moreOptionsButton = rootView.findViewById(R.id.moreOptionsButton);
|
||||
this.moreOptionsPopupMenu = new PopupMenu(context, moreOptionsButton);
|
||||
this.moreOptionsPopupMenu.getMenuInflater().inflate(R.menu.menu_videooptions, moreOptionsPopupMenu.getMenu());
|
||||
buildMoreOptionsMenu();
|
||||
|
||||
titleTextView.setSelected(true);
|
||||
channelTextView.setSelected(true);
|
||||
@@ -356,7 +380,7 @@ public final class MainVideoPlayer extends Activity {
|
||||
titleTextView.setText(getVideoTitle());
|
||||
channelTextView.setText(getUploaderName());
|
||||
|
||||
playPauseButton.setImageResource(R.drawable.ic_pause_white);
|
||||
//playPauseButton.setImageResource(R.drawable.ic_pause_white);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -448,12 +472,9 @@ public final class MainVideoPlayer extends Activity {
|
||||
|
||||
if (getCurrentState() != STATE_COMPLETED) {
|
||||
getControlsVisibilityHandler().removeCallbacksAndMessages(null);
|
||||
animateView(getControlsRoot(), true, 300, 0, new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (getCurrentState() == STATE_PLAYING && !isSomePopupMenuVisible()) {
|
||||
hideControls(300, DEFAULT_CONTROLS_HIDE_TIME);
|
||||
}
|
||||
animateView(getControlsRoot(), true, 300, 0, () -> {
|
||||
if (getCurrentState() == STATE_PLAYING && !isSomePopupMenuVisible()) {
|
||||
hideControls(300, DEFAULT_CONTROLS_HIDE_TIME);
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -479,25 +500,7 @@ public final class MainVideoPlayer extends Activity {
|
||||
|
||||
private void onMoreOptionsClicked() {
|
||||
if (DEBUG) Log.d(TAG, "onMoreOptionsClicked() called");
|
||||
buildMoreOptionsMenu();
|
||||
|
||||
try {
|
||||
Field[] fields = moreOptionsPopupMenu.getClass().getDeclaredFields();
|
||||
for (Field field : fields) {
|
||||
if ("mPopup".equals(field.getName())) {
|
||||
field.setAccessible(true);
|
||||
Object menuPopupHelper = field.get(moreOptionsPopupMenu);
|
||||
Class<?> classPopupHelper = Class.forName(menuPopupHelper
|
||||
.getClass().getName());
|
||||
Method setForceIcons = classPopupHelper.getMethod(
|
||||
"setForceShowIcon", boolean.class);
|
||||
setForceIcons.invoke(menuPopupHelper, true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
moreOptionsPopupMenu.show();
|
||||
isSomePopupMenuVisible = true;
|
||||
showControls(300);
|
||||
@@ -506,6 +509,7 @@ public final class MainVideoPlayer extends Activity {
|
||||
private void onScreenRotationClicked() {
|
||||
if (DEBUG) Log.d(TAG, "onScreenRotationClicked() called");
|
||||
toggleOrientation();
|
||||
showControlsThenHide();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -561,12 +565,9 @@ public final class MainVideoPlayer extends Activity {
|
||||
@Override
|
||||
public void onPlaying() {
|
||||
super.onPlaying();
|
||||
animateView(playPauseButton, AnimationUtils.Type.SCALE_AND_ALPHA, false, 80, 0, new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
playPauseButton.setImageResource(R.drawable.ic_pause_white);
|
||||
animatePlayButtons(true, 200);
|
||||
}
|
||||
animateView(playPauseButton, AnimationUtils.Type.SCALE_AND_ALPHA, false, 80, 0, () -> {
|
||||
playPauseButton.setImageResource(R.drawable.ic_pause_white);
|
||||
animatePlayButtons(true, 200);
|
||||
});
|
||||
showSystemUi();
|
||||
getRootView().setKeepScreenOn(true);
|
||||
@@ -575,12 +576,9 @@ public final class MainVideoPlayer extends Activity {
|
||||
@Override
|
||||
public void onPaused() {
|
||||
super.onPaused();
|
||||
animateView(playPauseButton, AnimationUtils.Type.SCALE_AND_ALPHA, false, 80, 0, new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
playPauseButton.setImageResource(R.drawable.ic_play_arrow_white);
|
||||
animatePlayButtons(true, 200);
|
||||
}
|
||||
animateView(playPauseButton, AnimationUtils.Type.SCALE_AND_ALPHA, false, 80, 0, () -> {
|
||||
playPauseButton.setImageResource(R.drawable.ic_play_arrow_white);
|
||||
animatePlayButtons(true, 200);
|
||||
});
|
||||
|
||||
showSystemUi();
|
||||
@@ -598,12 +596,9 @@ public final class MainVideoPlayer extends Activity {
|
||||
@Override
|
||||
public void onCompleted() {
|
||||
showSystemUi();
|
||||
animateView(playPauseButton, AnimationUtils.Type.SCALE_AND_ALPHA, false, 0, 0, new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
playPauseButton.setImageResource(R.drawable.ic_replay_white);
|
||||
animatePlayButtons(true, 300);
|
||||
}
|
||||
animateView(playPauseButton, AnimationUtils.Type.SCALE_AND_ALPHA, false, 0, 0, () -> {
|
||||
playPauseButton.setImageResource(R.drawable.ic_replay_white);
|
||||
animatePlayButtons(true, 300);
|
||||
});
|
||||
|
||||
getRootView().setKeepScreenOn(false);
|
||||
@@ -632,17 +627,10 @@ public final class MainVideoPlayer extends Activity {
|
||||
public void hideControls(final long duration, long delay) {
|
||||
if (DEBUG) Log.d(TAG, "hideControls() called with: delay = [" + delay + "]");
|
||||
getControlsVisibilityHandler().removeCallbacksAndMessages(null);
|
||||
getControlsVisibilityHandler().postDelayed(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
animateView(getControlsRoot(), false, duration, 0, new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
hideSystemUi();
|
||||
}
|
||||
});
|
||||
}
|
||||
}, delay);
|
||||
getControlsVisibilityHandler().postDelayed(() ->
|
||||
animateView(getControlsRoot(), false, duration, 0, MainVideoPlayer.this::hideSystemUi),
|
||||
delay
|
||||
);
|
||||
}
|
||||
|
||||
private void updatePlaybackButtons() {
|
||||
@@ -654,24 +642,39 @@ public final class MainVideoPlayer extends Activity {
|
||||
}
|
||||
|
||||
private void buildMoreOptionsMenu() {
|
||||
if (moreOptionsPopupMenu == null) return;
|
||||
moreOptionsPopupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
|
||||
@Override
|
||||
public boolean onMenuItemClick(MenuItem menuItem) {
|
||||
switch (menuItem.getItemId()) {
|
||||
case R.id.toggleOrientation:
|
||||
onScreenRotationClicked();
|
||||
break;
|
||||
case R.id.switchPopup:
|
||||
onFullScreenButtonClicked();
|
||||
break;
|
||||
case R.id.switchBackground:
|
||||
onPlayBackgroundButtonClicked();
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
this.moreOptionsPopupMenu.getMenuInflater().inflate(R.menu.menu_videooptions,
|
||||
moreOptionsPopupMenu.getMenu());
|
||||
|
||||
moreOptionsPopupMenu.setOnMenuItemClickListener(menuItem -> {
|
||||
switch (menuItem.getItemId()) {
|
||||
case R.id.toggleOrientation:
|
||||
onScreenRotationClicked();
|
||||
break;
|
||||
case R.id.switchPopup:
|
||||
onFullScreenButtonClicked();
|
||||
break;
|
||||
case R.id.switchBackground:
|
||||
onPlayBackgroundButtonClicked();
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
try {
|
||||
PopupMenuIconHacker.setShowPopupIcon(moreOptionsPopupMenu);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
// fix icon theme
|
||||
if(ThemeHelper.isLightThemeSelected(MainVideoPlayer.this)) {
|
||||
moreOptionsPopupMenu.getMenu()
|
||||
.findItem(R.id.toggleOrientation)
|
||||
.setIcon(R.drawable.ic_screen_rotation_black_24dp);
|
||||
moreOptionsPopupMenu.getMenu()
|
||||
.findItem(R.id.switchPopup)
|
||||
.setIcon(R.drawable.ic_fullscreen_exit_black_24dp);
|
||||
}
|
||||
}
|
||||
|
||||
private void buildQueue() {
|
||||
@@ -692,12 +695,7 @@ public final class MainVideoPlayer extends Activity {
|
||||
|
||||
playQueueAdapter.setSelectedListener(getOnSelectedListener());
|
||||
|
||||
itemsListCloseButton.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
onQueueClosed();
|
||||
}
|
||||
});
|
||||
itemsListCloseButton.setOnClickListener(view -> onQueueClosed());
|
||||
}
|
||||
|
||||
private OnScrollBelowItemsListener getQueueScrollListener() {
|
||||
|
||||
@@ -66,9 +66,9 @@ import org.schabi.newpipe.extractor.services.youtube.YoutubeStreamExtractor;
|
||||
import org.schabi.newpipe.extractor.stream.StreamInfo;
|
||||
import org.schabi.newpipe.extractor.stream.VideoStream;
|
||||
import org.schabi.newpipe.player.event.PlayerEventListener;
|
||||
import org.schabi.newpipe.player.helper.LockManager;
|
||||
import org.schabi.newpipe.player.helper.PlayerHelper;
|
||||
import org.schabi.newpipe.player.old.PlayVideoActivity;
|
||||
import org.schabi.newpipe.player.helper.LockManager;
|
||||
import org.schabi.newpipe.playlist.PlayQueueItem;
|
||||
import org.schabi.newpipe.playlist.SinglePlayQueue;
|
||||
import org.schabi.newpipe.report.ErrorActivity;
|
||||
@@ -84,7 +84,6 @@ import java.util.List;
|
||||
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||
import io.reactivex.disposables.Disposable;
|
||||
import io.reactivex.functions.Consumer;
|
||||
import io.reactivex.schedulers.Schedulers;
|
||||
|
||||
import static org.schabi.newpipe.player.helper.PlayerHelper.isUsingOldPlayer;
|
||||
@@ -102,7 +101,6 @@ public final class PopupVideoPlayer extends Service {
|
||||
private static final int NOTIFICATION_ID = 40028922;
|
||||
public static final String ACTION_CLOSE = "org.schabi.newpipe.player.PopupVideoPlayer.CLOSE";
|
||||
public static final String ACTION_PLAY_PAUSE = "org.schabi.newpipe.player.PopupVideoPlayer.PLAY_PAUSE";
|
||||
public static final String ACTION_OPEN_CONTROLS = "org.schabi.newpipe.player.PopupVideoPlayer.OPEN_CONTROLS";
|
||||
public static final String ACTION_REPEAT = "org.schabi.newpipe.player.PopupVideoPlayer.REPEAT";
|
||||
|
||||
private static final String POPUP_SAVED_WIDTH = "popup_saved_width";
|
||||
@@ -169,17 +167,7 @@ public final class PopupVideoPlayer extends Service {
|
||||
currentWorker = ExtractorHelper.getStreamInfo(serviceId,url,false)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(new Consumer<StreamInfo>() {
|
||||
@Override
|
||||
public void accept(@NonNull StreamInfo info) throws Exception {
|
||||
fetcherRunnable.onReceive(info);
|
||||
}
|
||||
}, new Consumer<Throwable>() {
|
||||
@Override
|
||||
public void accept(@NonNull Throwable throwable) throws Exception {
|
||||
fetcherRunnable.onError(throwable);
|
||||
}
|
||||
});
|
||||
.subscribe(fetcherRunnable::onReceive, fetcherRunnable::onError);
|
||||
} else {
|
||||
playerImpl.setStartedFromNewPipe(true);
|
||||
playerImpl.handleIntent(intent);
|
||||
@@ -267,11 +255,14 @@ public final class PopupVideoPlayer extends Service {
|
||||
PendingIntent.getBroadcast(this, NOTIFICATION_ID, new Intent(ACTION_PLAY_PAUSE), PendingIntent.FLAG_UPDATE_CURRENT));
|
||||
notRemoteView.setOnClickPendingIntent(R.id.notificationStop,
|
||||
PendingIntent.getBroadcast(this, NOTIFICATION_ID, new Intent(ACTION_CLOSE), PendingIntent.FLAG_UPDATE_CURRENT));
|
||||
notRemoteView.setOnClickPendingIntent(R.id.notificationContent,
|
||||
PendingIntent.getBroadcast(this, NOTIFICATION_ID, new Intent(ACTION_OPEN_CONTROLS), PendingIntent.FLAG_UPDATE_CURRENT));
|
||||
notRemoteView.setOnClickPendingIntent(R.id.notificationRepeat,
|
||||
PendingIntent.getBroadcast(this, NOTIFICATION_ID, new Intent(ACTION_REPEAT), PendingIntent.FLAG_UPDATE_CURRENT));
|
||||
|
||||
// Starts popup player activity -- attempts to unlock lockscreen
|
||||
final Intent intent = NavigationHelper.getPopupPlayerActivityIntent(this);
|
||||
notRemoteView.setOnClickPendingIntent(R.id.notificationContent,
|
||||
PendingIntent.getActivity(this, NOTIFICATION_ID, intent, PendingIntent.FLAG_UPDATE_CURRENT));
|
||||
|
||||
setRepeatModeRemote(notRemoteView, playerImpl.getRepeatMode());
|
||||
|
||||
return new NotificationCompat.Builder(this, getString(R.string.notification_channel_id))
|
||||
@@ -421,12 +412,7 @@ public final class PopupVideoPlayer extends Service {
|
||||
super.initViews(rootView);
|
||||
resizingIndicator = rootView.findViewById(R.id.resizing_indicator);
|
||||
fullScreenButton = rootView.findViewById(R.id.fullScreenButton);
|
||||
fullScreenButton.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
onFullScreenButtonClicked();
|
||||
}
|
||||
});
|
||||
fullScreenButton.setOnClickListener(v -> onFullScreenButtonClicked());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -604,7 +590,6 @@ public final class PopupVideoPlayer extends Service {
|
||||
if (DEBUG) Log.d(TAG, "setupBroadcastReceiver() called with: intentFilter = [" + intentFilter + "]");
|
||||
intentFilter.addAction(ACTION_CLOSE);
|
||||
intentFilter.addAction(ACTION_PLAY_PAUSE);
|
||||
intentFilter.addAction(ACTION_OPEN_CONTROLS);
|
||||
intentFilter.addAction(ACTION_REPEAT);
|
||||
|
||||
intentFilter.addAction(Intent.ACTION_SCREEN_ON);
|
||||
@@ -623,9 +608,6 @@ public final class PopupVideoPlayer extends Service {
|
||||
case ACTION_PLAY_PAUSE:
|
||||
onVideoPlayPause();
|
||||
break;
|
||||
case ACTION_OPEN_CONTROLS:
|
||||
NavigationHelper.openPopupPlayerControl(getApplicationContext());
|
||||
break;
|
||||
case ACTION_REPEAT:
|
||||
onRepeatClicked();
|
||||
break;
|
||||
@@ -899,37 +881,31 @@ public final class PopupVideoPlayer extends Service {
|
||||
}
|
||||
|
||||
private void onReceive(final StreamInfo info) {
|
||||
mainHandler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
final Intent intent = NavigationHelper.getPlayerIntent(getApplicationContext(),
|
||||
PopupVideoPlayer.class, new SinglePlayQueue(info));
|
||||
playerImpl.handleIntent(intent);
|
||||
}
|
||||
mainHandler.post(() -> {
|
||||
final Intent intent = NavigationHelper.getPlayerIntent(getApplicationContext(),
|
||||
PopupVideoPlayer.class, new SinglePlayQueue(info));
|
||||
playerImpl.handleIntent(intent);
|
||||
});
|
||||
}
|
||||
|
||||
private void onError(final Throwable exception) {
|
||||
if (DEBUG) Log.d(TAG, "onError() called with: exception = [" + exception + "]");
|
||||
exception.printStackTrace();
|
||||
mainHandler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (exception instanceof ReCaptchaException) {
|
||||
onReCaptchaException();
|
||||
} else if (exception instanceof IOException) {
|
||||
Toast.makeText(context, R.string.network_error, Toast.LENGTH_LONG).show();
|
||||
} else if (exception instanceof YoutubeStreamExtractor.GemaException) {
|
||||
Toast.makeText(context, R.string.blocked_by_gema, Toast.LENGTH_LONG).show();
|
||||
} else if (exception instanceof YoutubeStreamExtractor.LiveStreamException) {
|
||||
Toast.makeText(context, R.string.live_streams_not_supported, Toast.LENGTH_LONG).show();
|
||||
} else if (exception instanceof ContentNotAvailableException) {
|
||||
Toast.makeText(context, R.string.content_not_available, Toast.LENGTH_LONG).show();
|
||||
} else {
|
||||
int errorId = exception instanceof YoutubeStreamExtractor.DecryptException ? R.string.youtube_signature_decryption_error :
|
||||
exception instanceof ParsingException ? R.string.parsing_error : R.string.general_error;
|
||||
ErrorActivity.reportError(mainHandler, context, exception, MainActivity.class, null, ErrorActivity.ErrorInfo.make(UserAction.REQUESTED_STREAM, NewPipe.getNameOfService(serviceId), url, errorId));
|
||||
}
|
||||
mainHandler.post(() -> {
|
||||
if (exception instanceof ReCaptchaException) {
|
||||
onReCaptchaException();
|
||||
} else if (exception instanceof IOException) {
|
||||
Toast.makeText(context, R.string.network_error, Toast.LENGTH_LONG).show();
|
||||
} else if (exception instanceof YoutubeStreamExtractor.GemaException) {
|
||||
Toast.makeText(context, R.string.blocked_by_gema, Toast.LENGTH_LONG).show();
|
||||
} else if (exception instanceof YoutubeStreamExtractor.LiveStreamException) {
|
||||
Toast.makeText(context, R.string.live_streams_not_supported, Toast.LENGTH_LONG).show();
|
||||
} else if (exception instanceof ContentNotAvailableException) {
|
||||
Toast.makeText(context, R.string.content_not_available, Toast.LENGTH_LONG).show();
|
||||
} else {
|
||||
int errorId = exception instanceof YoutubeStreamExtractor.DecryptException ? R.string.youtube_signature_decryption_error :
|
||||
exception instanceof ParsingException ? R.string.parsing_error : R.string.general_error;
|
||||
ErrorActivity.reportError(mainHandler, context, exception, MainActivity.class, null, ErrorActivity.ErrorInfo.make(UserAction.REQUESTED_STREAM, NewPipe.getNameOfService(serviceId), url, errorId));
|
||||
}
|
||||
});
|
||||
stopSelf();
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
package org.schabi.newpipe.player;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.view.MenuItem;
|
||||
|
||||
import org.schabi.newpipe.R;
|
||||
|
||||
import static org.schabi.newpipe.player.PopupVideoPlayer.ACTION_CLOSE;
|
||||
|
||||
public final class PopupVideoPlayerActivity extends ServicePlayerActivity {
|
||||
|
||||
private static final String TAG = "PopupVideoPlayerActivity";
|
||||
@@ -36,4 +39,25 @@ public final class PopupVideoPlayerActivity extends ServicePlayerActivity {
|
||||
((PopupVideoPlayer.VideoPlayerImpl) player).removeActivityListener(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPlayerOptionMenuResource() {
|
||||
return R.menu.menu_play_queue_popup;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onPlayerOptionSelected(MenuItem item) {
|
||||
if (item.getItemId() == R.id.action_switch_background) {
|
||||
this.player.setRecovery();
|
||||
getApplicationContext().sendBroadcast(getPlayerShutdownIntent());
|
||||
getApplicationContext().startService(getSwitchIntent(BackgroundPlayer.class));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Intent getPlayerShutdownIntent() {
|
||||
return new Intent(ACTION_CLOSE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -100,6 +100,11 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
|
||||
|
||||
public abstract void stopPlayerListener();
|
||||
|
||||
public abstract int getPlayerOptionMenuResource();
|
||||
|
||||
public abstract boolean onPlayerOptionSelected(MenuItem item);
|
||||
|
||||
public abstract Intent getPlayerShutdownIntent();
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// Activity Lifecycle
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
@@ -134,6 +139,7 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
getMenuInflater().inflate(R.menu.menu_play_queue, menu);
|
||||
getMenuInflater().inflate(getPlayerOptionMenuResource(), menu);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -153,8 +159,13 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
|
||||
case R.id.action_system_audio:
|
||||
startActivity(new Intent(Settings.ACTION_SOUND_SETTINGS));
|
||||
return true;
|
||||
case R.id.action_switch_main:
|
||||
this.player.setRecovery();
|
||||
getApplicationContext().sendBroadcast(getPlayerShutdownIntent());
|
||||
getApplicationContext().startActivity(getSwitchIntent(MainVideoPlayer.class));
|
||||
return true;
|
||||
}
|
||||
return super.onOptionsItemSelected(item);
|
||||
return onPlayerOptionSelected(item) || super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -163,6 +174,17 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
|
||||
unbind();
|
||||
}
|
||||
|
||||
protected Intent getSwitchIntent(final Class clazz) {
|
||||
return NavigationHelper.getPlayerIntent(
|
||||
getApplicationContext(),
|
||||
clazz,
|
||||
this.player.getPlayQueue(),
|
||||
this.player.getRepeatMode(),
|
||||
this.player.getPlaybackSpeed(),
|
||||
this.player.getPlaybackPitch(),
|
||||
null
|
||||
);
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// Service Connection
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
@@ -288,14 +310,11 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
|
||||
final float playbackSpeed = BasePlayer.PLAYBACK_SPEEDS[i];
|
||||
final String formattedSpeed = formatSpeed(playbackSpeed);
|
||||
final MenuItem item = playbackSpeedPopupMenu.getMenu().add(PLAYBACK_SPEED_POPUP_MENU_GROUP_ID, i, Menu.NONE, formattedSpeed);
|
||||
item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
|
||||
@Override
|
||||
public boolean onMenuItemClick(MenuItem menuItem) {
|
||||
if (player == null) return false;
|
||||
item.setOnMenuItemClickListener(menuItem -> {
|
||||
if (player == null) return false;
|
||||
|
||||
player.setPlaybackSpeed(playbackSpeed);
|
||||
return true;
|
||||
}
|
||||
player.setPlaybackSpeed(playbackSpeed);
|
||||
return true;
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -308,14 +327,11 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
|
||||
final float playbackPitch = BasePlayer.PLAYBACK_PITCHES[i];
|
||||
final String formattedPitch = formatPitch(playbackPitch);
|
||||
final MenuItem item = playbackPitchPopupMenu.getMenu().add(PLAYBACK_PITCH_POPUP_MENU_GROUP_ID, i, Menu.NONE, formattedPitch);
|
||||
item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
|
||||
@Override
|
||||
public boolean onMenuItemClick(MenuItem menuItem) {
|
||||
if (player == null) return false;
|
||||
item.setOnMenuItemClickListener(menuItem -> {
|
||||
if (player == null) return false;
|
||||
|
||||
player.setPlaybackPitch(playbackPitch);
|
||||
return true;
|
||||
}
|
||||
player.setPlaybackPitch(playbackPitch);
|
||||
return true;
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -323,24 +339,18 @@ public abstract class ServicePlayerActivity extends AppCompatActivity
|
||||
private void buildItemPopupMenu(final PlayQueueItem item, final View view) {
|
||||
final PopupMenu menu = new PopupMenu(this, view);
|
||||
final MenuItem remove = menu.getMenu().add(RECYCLER_ITEM_POPUP_MENU_GROUP_ID, 0, Menu.NONE, R.string.play_queue_remove);
|
||||
remove.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
|
||||
@Override
|
||||
public boolean onMenuItemClick(MenuItem menuItem) {
|
||||
if (player == null) return false;
|
||||
remove.setOnMenuItemClickListener(menuItem -> {
|
||||
if (player == null) return false;
|
||||
|
||||
final int index = player.getPlayQueue().indexOf(item);
|
||||
if (index != -1) player.getPlayQueue().remove(index);
|
||||
return true;
|
||||
}
|
||||
final int index = player.getPlayQueue().indexOf(item);
|
||||
if (index != -1) player.getPlayQueue().remove(index);
|
||||
return true;
|
||||
});
|
||||
|
||||
final MenuItem detail = menu.getMenu().add(RECYCLER_ITEM_POPUP_MENU_GROUP_ID, 1, Menu.NONE, R.string.play_queue_stream_detail);
|
||||
detail.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
|
||||
@Override
|
||||
public boolean onMenuItemClick(MenuItem menuItem) {
|
||||
onOpenDetail(item.getServiceId(), item.getUrl(), item.getTitle());
|
||||
return true;
|
||||
}
|
||||
detail.setOnMenuItemClickListener(menuItem -> {
|
||||
onOpenDetail(item.getServiceId(), item.getUrl(), item.getTitle());
|
||||
return true;
|
||||
});
|
||||
|
||||
menu.show();
|
||||
|
||||
@@ -382,7 +382,7 @@ public class ErrorActivity extends AppCompatActivity {
|
||||
|
||||
private String getContentLangString() {
|
||||
return PreferenceManager.getDefaultSharedPreferences(this)
|
||||
.getString(this.getString(R.string.search_language_key), "none");
|
||||
.getString(this.getString(R.string.content_country_key), "none");
|
||||
}
|
||||
|
||||
private String getOsString() {
|
||||
|
||||
@@ -57,104 +57,96 @@ public final class ExtractorHelper {
|
||||
}
|
||||
}
|
||||
|
||||
public static Single<SearchResult> searchFor(final int serviceId, final String query, final int pageNumber, final String searchLanguage, final SearchEngine.Filter filter) {
|
||||
public static Single<SearchResult> searchFor(final int serviceId,
|
||||
final String query,
|
||||
final int pageNumber,
|
||||
final String contentCountry,
|
||||
final SearchEngine.Filter filter) {
|
||||
checkServiceId(serviceId);
|
||||
return Single.fromCallable(new Callable<SearchResult>() {
|
||||
@Override
|
||||
public SearchResult call() throws Exception {
|
||||
return SearchResult.getSearchResult(NewPipe.getService(serviceId).getSearchEngine(),
|
||||
query, pageNumber, searchLanguage, filter);
|
||||
}
|
||||
});
|
||||
return Single.fromCallable(() ->
|
||||
SearchResult.getSearchResult(NewPipe.getService(serviceId).getSearchEngine(),
|
||||
query, pageNumber, contentCountry, filter)
|
||||
);
|
||||
}
|
||||
|
||||
public static Single<NextItemsResult> getMoreSearchItems(final int serviceId, final String query, final int nextPageNumber, final String searchLanguage, final SearchEngine.Filter filter) {
|
||||
public static Single<NextItemsResult> getMoreSearchItems(final int serviceId,
|
||||
final String query,
|
||||
final int nextPageNumber,
|
||||
final String searchLanguage,
|
||||
final SearchEngine.Filter filter) {
|
||||
checkServiceId(serviceId);
|
||||
return searchFor(serviceId, query, nextPageNumber, searchLanguage, filter)
|
||||
.map(new Function<SearchResult, NextItemsResult>() {
|
||||
@Override
|
||||
public NextItemsResult apply(@NonNull SearchResult searchResult) throws Exception {
|
||||
return new NextItemsResult(searchResult.resultList, nextPageNumber + "", searchResult.errors);
|
||||
}
|
||||
});
|
||||
.map((@NonNull SearchResult searchResult) ->
|
||||
new NextItemsResult(searchResult.resultList,
|
||||
nextPageNumber + "",
|
||||
searchResult.errors));
|
||||
}
|
||||
|
||||
public static Single<List<String>> suggestionsFor(final int serviceId, final String query, final String searchLanguage) {
|
||||
public static Single<List<String>> suggestionsFor(final int serviceId,
|
||||
final String query,
|
||||
final String contentCountry) {
|
||||
checkServiceId(serviceId);
|
||||
return Single.fromCallable(new Callable<List<String>>() {
|
||||
@Override
|
||||
public List<String> call() throws Exception {
|
||||
return NewPipe.getService(serviceId).getSuggestionExtractor().suggestionList(query, searchLanguage);
|
||||
}
|
||||
});
|
||||
return Single.fromCallable(() ->
|
||||
NewPipe.getService(serviceId)
|
||||
.getSuggestionExtractor()
|
||||
.suggestionList(query, contentCountry));
|
||||
}
|
||||
|
||||
public static Single<StreamInfo> getStreamInfo(final int serviceId, final String url, boolean forceLoad) {
|
||||
public static Single<StreamInfo> getStreamInfo(final int serviceId,
|
||||
final String url,
|
||||
boolean forceLoad) {
|
||||
checkServiceId(serviceId);
|
||||
return checkCache(forceLoad, serviceId, url, Single.fromCallable(new Callable<StreamInfo>() {
|
||||
@Override
|
||||
public StreamInfo call() throws Exception {
|
||||
return StreamInfo.getInfo(NewPipe.getService(serviceId), url);
|
||||
}
|
||||
}));
|
||||
return checkCache(forceLoad, serviceId, url, Single.fromCallable(() ->
|
||||
StreamInfo.getInfo(NewPipe.getService(serviceId), url)));
|
||||
}
|
||||
|
||||
public static Single<ChannelInfo> getChannelInfo(final int serviceId, final String url, boolean forceLoad) {
|
||||
public static Single<ChannelInfo> getChannelInfo(final int serviceId,
|
||||
final String url,
|
||||
boolean forceLoad) {
|
||||
checkServiceId(serviceId);
|
||||
return checkCache(forceLoad, serviceId, url, Single.fromCallable(new Callable<ChannelInfo>() {
|
||||
@Override
|
||||
public ChannelInfo call() throws Exception {
|
||||
return ChannelInfo.getInfo(NewPipe.getService(serviceId), url);
|
||||
}
|
||||
}));
|
||||
return checkCache(forceLoad, serviceId, url, Single.fromCallable(() ->
|
||||
ChannelInfo.getInfo(NewPipe.getService(serviceId), url)));
|
||||
}
|
||||
|
||||
public static Single<NextItemsResult> getMoreChannelItems(final int serviceId, final String url, final String nextStreamsUrl) {
|
||||
public static Single<NextItemsResult> getMoreChannelItems(final int serviceId,
|
||||
final String url,
|
||||
final String nextStreamsUrl) {
|
||||
checkServiceId(serviceId);
|
||||
return Single.fromCallable(new Callable<NextItemsResult>() {
|
||||
@Override
|
||||
public NextItemsResult call() throws Exception {
|
||||
return ChannelInfo.getMoreItems(NewPipe.getService(serviceId), url, nextStreamsUrl);
|
||||
}
|
||||
});
|
||||
return Single.fromCallable(() ->
|
||||
ChannelInfo.getMoreItems(NewPipe.getService(serviceId), url, nextStreamsUrl));
|
||||
}
|
||||
|
||||
public static Single<PlaylistInfo> getPlaylistInfo(final int serviceId, final String url, boolean forceLoad) {
|
||||
public static Single<PlaylistInfo> getPlaylistInfo(final int serviceId,
|
||||
final String url,
|
||||
boolean forceLoad) {
|
||||
checkServiceId(serviceId);
|
||||
return checkCache(forceLoad, serviceId, url, Single.fromCallable(new Callable<PlaylistInfo>() {
|
||||
@Override
|
||||
public PlaylistInfo call() throws Exception {
|
||||
return PlaylistInfo.getInfo(NewPipe.getService(serviceId), url);
|
||||
}
|
||||
}));
|
||||
return checkCache(forceLoad, serviceId, url, Single.fromCallable(() ->
|
||||
PlaylistInfo.getInfo(NewPipe.getService(serviceId), url)));
|
||||
}
|
||||
|
||||
public static Single<NextItemsResult> getMorePlaylistItems(final int serviceId, final String url, final String nextStreamsUrl) {
|
||||
public static Single<NextItemsResult> getMorePlaylistItems(final int serviceId,
|
||||
final String url,
|
||||
final String nextStreamsUrl) {
|
||||
checkServiceId(serviceId);
|
||||
return Single.fromCallable(new Callable<NextItemsResult>() {
|
||||
@Override
|
||||
public NextItemsResult call() throws Exception {
|
||||
return PlaylistInfo.getMoreItems(NewPipe.getService(serviceId), url, nextStreamsUrl);
|
||||
}
|
||||
});
|
||||
return Single.fromCallable(() ->
|
||||
PlaylistInfo.getMoreItems(NewPipe.getService(serviceId), url, nextStreamsUrl));
|
||||
}
|
||||
|
||||
public static Single<KioskInfo> getKioskInfo(final int serviceId, final String url, final String contentCountry, boolean forceLoad) {
|
||||
return checkCache(forceLoad, serviceId, url, Single.fromCallable(new Callable<KioskInfo>() {
|
||||
@Override
|
||||
public KioskInfo call() throws Exception {
|
||||
return KioskInfo.getInfo(NewPipe.getService(serviceId), url, contentCountry);
|
||||
}
|
||||
}));
|
||||
public static Single<KioskInfo> getKioskInfo(final int serviceId,
|
||||
final String url,
|
||||
final String contentCountry,
|
||||
boolean forceLoad) {
|
||||
return checkCache(forceLoad, serviceId, url, Single.fromCallable(() ->
|
||||
KioskInfo.getInfo(NewPipe.getService(serviceId), url, contentCountry)));
|
||||
}
|
||||
|
||||
public static Single<NextItemsResult> getMoreKioskItems(final int serviceId, final String url, final String nextStreamsUrl) {
|
||||
return Single.fromCallable(new Callable<NextItemsResult>() {
|
||||
@Override
|
||||
public NextItemsResult call() throws Exception {
|
||||
return KioskInfo.getMoreItems(NewPipe.getService(serviceId), url, nextStreamsUrl);
|
||||
}
|
||||
});
|
||||
public static Single<NextItemsResult> getMoreKioskItems(final int serviceId,
|
||||
final String url,
|
||||
final String nextStreamsUrl,
|
||||
final String contentCountry) {
|
||||
return Single.fromCallable(() ->
|
||||
KioskInfo.getMoreItems(NewPipe.getService(serviceId),
|
||||
url, nextStreamsUrl, contentCountry));
|
||||
}
|
||||
|
||||
/*//////////////////////////////////////////////////////////////////////////
|
||||
@@ -162,24 +154,24 @@ public final class ExtractorHelper {
|
||||
//////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
/**
|
||||
* Check if we can load it from the cache (forceLoad parameter), if we can't, load from the network (Single loadFromNetwork)
|
||||
* Check if we can load it from the cache (forceLoad parameter), if we can't,
|
||||
* load from the network (Single loadFromNetwork)
|
||||
* and put the results in the cache.
|
||||
*/
|
||||
private static <I extends Info> Single<I> checkCache(boolean forceLoad, int serviceId, String url, Single<I> loadFromNetwork) {
|
||||
private static <I extends Info> Single<I> checkCache(boolean forceLoad,
|
||||
int serviceId,
|
||||
String url,
|
||||
Single<I> loadFromNetwork) {
|
||||
checkServiceId(serviceId);
|
||||
loadFromNetwork = loadFromNetwork.doOnSuccess(new Consumer<I>() {
|
||||
@Override
|
||||
public void accept(@NonNull I i) throws Exception {
|
||||
cache.putInfo(i);
|
||||
}
|
||||
});
|
||||
loadFromNetwork = loadFromNetwork.doOnSuccess((@NonNull I i) -> cache.putInfo(i));
|
||||
|
||||
Single<I> load;
|
||||
if (forceLoad) {
|
||||
cache.removeInfo(serviceId, url);
|
||||
load = loadFromNetwork;
|
||||
} else {
|
||||
load = Maybe.concat(ExtractorHelper.<I>loadFromCache(serviceId, url), loadFromNetwork.toMaybe())
|
||||
load = Maybe.concat(ExtractorHelper.<I>loadFromCache(serviceId, url),
|
||||
loadFromNetwork.toMaybe())
|
||||
.firstElement() //Take the first valid
|
||||
.toSingle();
|
||||
}
|
||||
@@ -192,9 +184,7 @@ public final class ExtractorHelper {
|
||||
*/
|
||||
public static <I extends Info> Maybe<I> loadFromCache(final int serviceId, final String url) {
|
||||
checkServiceId(serviceId);
|
||||
return Maybe.defer(new Callable<MaybeSource<? extends I>>() {
|
||||
@Override
|
||||
public MaybeSource<? extends I> call() throws Exception {
|
||||
return Maybe.defer(() -> {
|
||||
//noinspection unchecked
|
||||
I info = (I) cache.getFromKey(serviceId, url);
|
||||
if (MainActivity.DEBUG) Log.d(TAG, "loadFromCache() called, info > " + info);
|
||||
@@ -205,8 +195,7 @@ public final class ExtractorHelper {
|
||||
}
|
||||
|
||||
return Maybe.empty();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -214,21 +203,26 @@ public final class ExtractorHelper {
|
||||
*
|
||||
* @see Class#isAssignableFrom(Class)
|
||||
*/
|
||||
public static boolean hasAssignableCauseThrowable(Throwable throwable, Class<?>... causesToCheck) {
|
||||
public static boolean hasAssignableCauseThrowable(Throwable throwable,
|
||||
Class<?>... causesToCheck) {
|
||||
// Check if getCause is not the same as cause (the getCause is already the root),
|
||||
// as it will cause a infinite loop if it is
|
||||
Throwable cause, getCause = throwable;
|
||||
|
||||
// Check if throwable is a subclass of any of the filtered classes
|
||||
final Class throwableClass = throwable.getClass();
|
||||
for (Class<?> causesEl : causesToCheck) {
|
||||
if (throwable.getClass().isAssignableFrom(causesEl)) {
|
||||
if (causesEl.isAssignableFrom(throwableClass)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// Iteratively checks if the root cause of the throwable is a subclass of the filtered class
|
||||
while ((cause = throwable.getCause()) != null && getCause != cause) {
|
||||
getCause = cause;
|
||||
final Class causeClass = cause.getClass();
|
||||
for (Class<?> causesEl : causesToCheck) {
|
||||
if (cause.getClass().isAssignableFrom(causesEl)) {
|
||||
if (causesEl.isAssignableFrom(causeClass)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -265,6 +259,21 @@ public final class ExtractorHelper {
|
||||
* Check if throwable have Interrupted* exception as one of its causes.
|
||||
*/
|
||||
public static boolean isInterruptedCaused(Throwable throwable) {
|
||||
return ExtractorHelper.hasExactCauseThrowable(throwable, InterruptedIOException.class, InterruptedException.class);
|
||||
return ExtractorHelper.hasExactCauseThrowable(throwable,
|
||||
InterruptedIOException.class,
|
||||
InterruptedException.class);
|
||||
}
|
||||
|
||||
public static String toUpperCase(String value) {
|
||||
StringBuilder sb = new StringBuilder(value);
|
||||
for (int index = 0; index < sb.length(); index++) {
|
||||
char c = sb.charAt(index);
|
||||
if (Character.isLowerCase(c)) {
|
||||
sb.setCharAt(index, Character.toUpperCase(c));
|
||||
} else {
|
||||
sb.setCharAt(index, Character.toLowerCase(c));
|
||||
}
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/*
|
||||
/**
|
||||
* Copyright 2017 Mauricio Colli <mauriciocolli@outlook.com>
|
||||
* InfoCache.java is part of NewPipe
|
||||
*
|
||||
|
||||
@@ -20,9 +20,7 @@ import org.schabi.newpipe.download.DownloadActivity;
|
||||
import org.schabi.newpipe.extractor.NewPipe;
|
||||
import org.schabi.newpipe.extractor.ServiceList;
|
||||
import org.schabi.newpipe.extractor.StreamingService;
|
||||
import org.schabi.newpipe.extractor.channel.ChannelInfoItem;
|
||||
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
|
||||
import org.schabi.newpipe.extractor.stream.StreamInfo;
|
||||
import org.schabi.newpipe.fragments.MainFragment;
|
||||
import org.schabi.newpipe.fragments.detail.VideoDetailFragment;
|
||||
import org.schabi.newpipe.fragments.list.channel.ChannelFragment;
|
||||
@@ -89,9 +87,13 @@ public class NavigationHelper {
|
||||
context.startActivity(getPlayerIntent(context, MainVideoPlayer.class, queue));
|
||||
}
|
||||
|
||||
public static void playOnPopupPlayer(final Context context, final PlayQueue queue) {
|
||||
Toast.makeText(context, R.string.popup_playing_toast, Toast.LENGTH_SHORT).show();
|
||||
context.startService(getPlayerIntent(context, PopupVideoPlayer.class, queue));
|
||||
public static void playOnPopupPlayer(final Activity activity, final PlayQueue queue) {
|
||||
if (!PermissionHelper.isPopupEnabled(activity)) {
|
||||
PermissionHelper.showPopupEnablementToast(activity);
|
||||
return;
|
||||
}
|
||||
Toast.makeText(activity, R.string.popup_playing_toast, Toast.LENGTH_SHORT).show();
|
||||
activity.startService(getPlayerIntent(activity, PopupVideoPlayer.class, queue));
|
||||
}
|
||||
|
||||
public static void playOnBackgroundPlayer(final Context context, final PlayQueue queue) {
|
||||
@@ -99,9 +101,13 @@ public class NavigationHelper {
|
||||
context.startService(getPlayerIntent(context, BackgroundPlayer.class, queue));
|
||||
}
|
||||
|
||||
public static void enqueueOnPopupPlayer(final Context context, final PlayQueue queue) {
|
||||
Toast.makeText(context, R.string.popup_playing_append, Toast.LENGTH_SHORT).show();
|
||||
context.startService(getPlayerEnqueueIntent(context, PopupVideoPlayer.class, queue));
|
||||
public static void enqueueOnPopupPlayer(final Activity activity, final PlayQueue queue) {
|
||||
if (!PermissionHelper.isPopupEnabled(activity)) {
|
||||
PermissionHelper.showPopupEnablementToast(activity);
|
||||
return;
|
||||
}
|
||||
Toast.makeText(activity, R.string.popup_playing_append, Toast.LENGTH_SHORT).show();
|
||||
activity.startService(getPlayerEnqueueIntent(activity, PopupVideoPlayer.class, queue));
|
||||
}
|
||||
|
||||
public static void enqueueOnBackgroundPlayer(final Context context, final PlayQueue queue) {
|
||||
@@ -261,23 +267,22 @@ public class NavigationHelper {
|
||||
return true;
|
||||
}
|
||||
|
||||
public static void openBackgroundPlayerControl(final Context context) {
|
||||
openServicePlayerControl(context, BackgroundPlayerActivity.class);
|
||||
public static Intent getBackgroundPlayerActivityIntent(final Context context) {
|
||||
return getServicePlayerActivityIntent(context, BackgroundPlayerActivity.class);
|
||||
}
|
||||
|
||||
public static void openPopupPlayerControl(final Context context) {
|
||||
openServicePlayerControl(context, PopupVideoPlayerActivity.class);
|
||||
public static Intent getPopupPlayerActivityIntent(final Context context) {
|
||||
return getServicePlayerActivityIntent(context, PopupVideoPlayerActivity.class);
|
||||
}
|
||||
|
||||
private static void openServicePlayerControl(final Context context, final Class clazz) {
|
||||
final Intent intent = new Intent(context, clazz);
|
||||
private static Intent getServicePlayerActivityIntent(final Context context,
|
||||
final Class activityClass) {
|
||||
Intent intent = new Intent(context, activityClass);
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
|
||||
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
}
|
||||
context.startActivity(intent);
|
||||
context.sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
|
||||
return intent;
|
||||
}
|
||||
|
||||
/*//////////////////////////////////////////////////////////////////////////
|
||||
// Link handling
|
||||
//////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
@@ -11,6 +11,11 @@ import android.provider.Settings;
|
||||
import android.support.annotation.RequiresApi;
|
||||
import android.support.v4.app.ActivityCompat;
|
||||
import android.support.v4.content.ContextCompat;
|
||||
import android.view.Gravity;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import org.schabi.newpipe.R;
|
||||
|
||||
public class PermissionHelper {
|
||||
public static final int PERMISSION_WRITE_STORAGE = 778;
|
||||
@@ -92,4 +97,16 @@ public class PermissionHelper {
|
||||
return false;
|
||||
}else return true;
|
||||
}
|
||||
|
||||
public static boolean isPopupEnabled(Activity activity) {
|
||||
return Build.VERSION.SDK_INT < Build.VERSION_CODES.M ||
|
||||
PermissionHelper.checkSystemAlertWindowPermission(activity);
|
||||
}
|
||||
|
||||
public static void showPopupEnablementToast(Context context) {
|
||||
Toast toast = Toast.makeText(context, R.string.msg_popup_permission, Toast.LENGTH_LONG);
|
||||
TextView messageView = toast.getView().findViewById(android.R.id.message);
|
||||
if (messageView != null) messageView.setGravity(Gravity.CENTER);
|
||||
toast.show();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
package org.schabi.newpipe.util;
|
||||
|
||||
import android.widget.PopupMenu;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
/**
|
||||
* Created by Christian Schabesberger on 20.01.18.
|
||||
* Copyright 2018 Christian Schabesberger <chris.schabesberger@mailbox.org>
|
||||
* PopupMenuIconHacker.java is part of NewPipe
|
||||
*
|
||||
* License: GPL-3.0+
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
public class PopupMenuIconHacker {
|
||||
public static void setShowPopupIcon(PopupMenu menu) throws Exception {
|
||||
try {
|
||||
Field[] fields = menu.getClass().getDeclaredFields();
|
||||
for (Field field : fields) {
|
||||
if ("mPopup".equals(field.getName())) {
|
||||
field.setAccessible(true);
|
||||
Object menuPopupHelper = field.get(menu);
|
||||
Class<?> classPopupHelper = Class.forName(menuPopupHelper
|
||||
.getClass().getName());
|
||||
Method setForceIcons = classPopupHelper.getMethod(
|
||||
"setForceShowIcon", boolean.class);
|
||||
setForceIcons.invoke(menuPopupHelper, true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new Exception("Could not make Popup menu show Icons", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
BIN
app/src/main/res/drawable-hdpi/ic_fullscreen_exit_black_24dp.png
Normal file
|
After Width: | Height: | Size: 103 B |
BIN
app/src/main/res/drawable-hdpi/ic_screen_rotation_black_24dp.png
Normal file
|
After Width: | Height: | Size: 478 B |
BIN
app/src/main/res/drawable-mdpi/ic_fullscreen_exit_black_24dp.png
Normal file
|
After Width: | Height: | Size: 93 B |
BIN
app/src/main/res/drawable-mdpi/ic_screen_rotation_black_24dp.png
Normal file
|
After Width: | Height: | Size: 321 B |
|
After Width: | Height: | Size: 111 B |
|
After Width: | Height: | Size: 645 B |
|
After Width: | Height: | Size: 122 B |
|
After Width: | Height: | Size: 916 B |
|
After Width: | Height: | Size: 123 B |
|
After Width: | Height: | Size: 1.2 KiB |
@@ -1,18 +1,30 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<merge
|
||||
<android.support.v4.widget.DrawerLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/drawer_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical"
|
||||
tools:context="org.schabi.newpipe.MainActivity">
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/fragment_holder"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginTop="?attr/actionBarSize"/>
|
||||
android:orientation="vertical"
|
||||
tools:context="org.schabi.newpipe.MainActivity">
|
||||
<FrameLayout
|
||||
android:id="@+id/fragment_holder"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginTop="?attr/actionBarSize" />
|
||||
|
||||
<include layout="@layout/toolbar_layout"/>
|
||||
<include layout="@layout/toolbar_layout" />
|
||||
</FrameLayout>
|
||||
|
||||
</merge>
|
||||
<android.support.design.widget.NavigationView
|
||||
android:id="@+id/navigation"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="start"
|
||||
app:menu="@menu/drawer_items" />
|
||||
</android.support.v4.widget.DrawerLayout>
|
||||
@@ -244,7 +244,7 @@
|
||||
android:clickable="true"
|
||||
android:focusable="true"
|
||||
android:scaleType="fitXY"
|
||||
android:src="?attr/options"
|
||||
android:src="@drawable/ic_more_vert_white_24dp"
|
||||
tools:ignore="ContentDescription,RtlHardcoded"/>
|
||||
|
||||
</RelativeLayout>
|
||||
|
||||
@@ -31,10 +31,14 @@
|
||||
android:layout_below="@+id/itemTitleView"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_alignParentStart="true"
|
||||
android:ellipsize="marquee"
|
||||
android:fadingEdge="horizontal"
|
||||
android:marqueeRepeatLimit="marquee_forever"
|
||||
android:scrollHorizontally="true"
|
||||
android:singleLine="true"
|
||||
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||
android:textSize="@dimen/video_item_search_uploader_text_size"
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible"
|
||||
tools:text="TYPE" />
|
||||
tools:text="UPLOADER" />
|
||||
</RelativeLayout>
|
||||
@@ -273,7 +273,7 @@
|
||||
android:paddingBottom="6dp"
|
||||
android:paddingTop="6dp"
|
||||
android:text="@string/controls_background_title"
|
||||
android:textSize="12sp"/>
|
||||
android:textSize="12sp" />
|
||||
</RelativeLayout>
|
||||
|
||||
<!--UPLOADER-->
|
||||
|
||||
@@ -11,8 +11,6 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="64dp"
|
||||
android:background="@color/background_notification_color"
|
||||
android:clickable="true"
|
||||
android:focusable="true"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal">
|
||||
|
||||
|
||||
@@ -6,8 +6,6 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="128dp"
|
||||
android:background="@color/background_notification_color"
|
||||
android:clickable="true"
|
||||
android:focusable="true"
|
||||
android:gravity="center_vertical"
|
||||
android:orientation="horizontal">
|
||||
|
||||
|
||||
5
app/src/main/res/menu/drawer_items.xml
Normal file
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:title="@string/youtube" />
|
||||
<item android:title="@string/soundcloud" />
|
||||
</menu>
|
||||
@@ -17,4 +17,9 @@
|
||||
android:orderInCategory="996"
|
||||
android:title="@string/play_queue_audio_settings"
|
||||
app:showAsAction="never"/>
|
||||
|
||||
<item android:id="@+id/action_switch_main"
|
||||
android:orderInCategory="999"
|
||||
android:title="@string/switch_to_main"
|
||||
app:showAsAction="never"/>
|
||||
</menu>
|
||||
|
||||
10
app/src/main/res/menu/menu_play_queue_bg.xml
Normal file
@@ -0,0 +1,10 @@
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
tools:context="org.schabi.newpipe.history.HistoryActivity">
|
||||
|
||||
<item android:id="@+id/action_switch_popup"
|
||||
android:orderInCategory="1999"
|
||||
android:title="@string/switch_to_popup"
|
||||
app:showAsAction="never"/>
|
||||
</menu>
|
||||
10
app/src/main/res/menu/menu_play_queue_popup.xml
Normal file
@@ -0,0 +1,10 @@
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
tools:context="org.schabi.newpipe.history.HistoryActivity">
|
||||
|
||||
<item android:id="@+id/action_switch_background"
|
||||
android:orderInCategory="1999"
|
||||
android:title="@string/switch_to_background"
|
||||
app:showAsAction="never"/>
|
||||
</menu>
|
||||
@@ -4,18 +4,19 @@
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
<item
|
||||
android:icon="@drawable/ic_screen_rotation_white"
|
||||
android:id="@+id/toggleOrientation"
|
||||
android:title="Toggle orientation"
|
||||
android:icon="@drawable/ic_screen_rotation_white"
|
||||
android:title="@string/toggle_orientation"
|
||||
app:showAsAction="always|withText" />
|
||||
<item
|
||||
android:icon="@drawable/ic_fullscreen_exit_white"
|
||||
android:id="@+id/switchPopup"
|
||||
android:title="Switch to popup"
|
||||
android:icon="@drawable/ic_fullscreen_exit_white"
|
||||
android:title="@string/switch_to_popup"
|
||||
app:showAsAction="always|withText" />
|
||||
<item android:icon="?audio"
|
||||
<item
|
||||
android:id="@+id/switchBackground"
|
||||
android:title="Switch to background"
|
||||
android:icon="?audio"
|
||||
android:title="@string/switch_to_background"
|
||||
app:showAsAction="always|withText" />
|
||||
</menu>
|
||||
|
||||
|
||||
@@ -22,20 +22,20 @@
|
||||
<string name="err_dir_create">"لا يمكن إنشاء مجلد للتنزيلات في '%1$s'"</string>
|
||||
<string name="info_dir_created">"تم إنشاء مجلد تنزيلات في '%1$s'"</string>
|
||||
<string name="install">تثبيت</string>
|
||||
<string name="kore_not_found">تطبيق Kore غير موجود. هل تريد تثبيته؟</string>
|
||||
<string name="kore_not_found">تطبيق Kore غير موجود. هل تريد تثبيته ؟</string>
|
||||
<string name="light_theme_title">مضيء</string>
|
||||
<string name="list_thumbnail_view_description">صور معاينة الفيديو</string>
|
||||
<string name="m4a_description">m4a — جودة أفضل</string>
|
||||
<string name="m4a_description">M4A — جودة أفضل</string>
|
||||
<string name="network_error">خطأ في الشبكة</string>
|
||||
<string name="next_video_title">الفيديو التالي</string>
|
||||
<string name="no_player_found">لا يوجد مشغل فيديو. هل تريد تثبيت VLC ؟</string>
|
||||
<string name="open_in_browser">فتح في المتصفح</string>
|
||||
<string name="play_audio">صوت</string>
|
||||
<string name="open_in_browser">إفتح في متصفح</string>
|
||||
<string name="play_audio">الصوت</string>
|
||||
<string name="play_btn_text">تشغيل</string>
|
||||
<string name="play_with_kodi_title">تشغيل بواسطة Kodi</string>
|
||||
<string name="screen_rotation">التدوير</string>
|
||||
<string name="search">بحث</string>
|
||||
<string name="search_language_title">لغة المحتوى المفضل</string>
|
||||
<string name="search_language_title">اللغة الإفتراضية للمحتوى</string>
|
||||
<string name="settings">الإعدادات</string>
|
||||
<string name="settings_category_appearance_title">المظهر</string>
|
||||
<string name="settings_category_other_title">أخرئ</string>
|
||||
@@ -43,25 +43,25 @@
|
||||
<string name="share">مشاركة</string>
|
||||
<string name="share_dialog_title">مشاركة بواسطة</string>
|
||||
<string name="show_next_and_similar_title">عرض التالي والفيديوهات المشابهة</string>
|
||||
<string name="show_play_with_kodi_summary">عرض خيار لتشغيل الفيديو بواسطة Kodi Media Center.</string>
|
||||
<string name="show_play_with_kodi_title">عرض خيار التشغيل بواسطة Kodi.</string>
|
||||
<string name="show_play_with_kodi_summary">عرض خيار لتشغيل الفيديو بواسطة Kodi Media Center</string>
|
||||
<string name="show_play_with_kodi_title">عرض خيار التشغيل بواسطة Kodi</string>
|
||||
<string name="theme_title">السمة</string>
|
||||
<string name="upload_date_text">تم نشرها في %1$s</string>
|
||||
<string name="upload_date_text">نُشِرت في %1$s</string>
|
||||
<string name="url_not_supported_toast">الرابط غير مدعوم</string>
|
||||
<string name="use_external_audio_player_title">استخدام مشغل صوت خارجي</string>
|
||||
<string name="use_external_video_player_title">استخدام مشغل فيديو خارجي</string>
|
||||
<string name="use_tor_summary">(إختبارية) إجراء التنزيلات من خلال استخدام بروكسي Tor لزيادة الخصوصية ( تشغيل الفيديو المباشر غير مدعوم حتى الأن ).</string>
|
||||
<string name="use_tor_title">استخدام Tor</string>
|
||||
<string name="view_count_text">%1$s المشاهدات</string>
|
||||
<string name="webm_description">صيغة حرة—WebM</string>
|
||||
<string name="view_count_text">%1$s مشاهدات</string>
|
||||
<string name="webm_description">WebM—صيغة حرة</string>
|
||||
<string name="blocked_by_gema">تم حجبه بواسطة GEMA</string>
|
||||
<string name="content_not_available">المحتوى غير متاح.</string>
|
||||
<string name="content_not_available">المحتوى غير متاح</string>
|
||||
<string name="could_not_load_thumbnails">لم يتمكن من تحميل كل صور المعاينة</string>
|
||||
<string name="general_error">خطأ</string>
|
||||
<string name="parsing_error">لا يمكن تحليل الموقع.</string>
|
||||
<string name="youtube_signature_decryption_error">لا يمكن فك تشفير توقيع رابط الفيديو.</string>
|
||||
<string name="parsing_error">تعذرت عملية تحليل الموقع</string>
|
||||
<string name="youtube_signature_decryption_error">تعذر فك تشفير توقيع رابط الفيديو</string>
|
||||
<string name="main_bg_subtitle">انقر على البحث للبدء</string>
|
||||
<string name="subscribe_button_title">إشترك</string>
|
||||
<string name="subscribe_button_title">إشتراك</string>
|
||||
<string name="subscribed_button_title">مشترك</string>
|
||||
<string name="tab_main">الرئيسية</string>
|
||||
<string name="tab_subscriptions">الإشتراكات</string>
|
||||
@@ -84,8 +84,8 @@
|
||||
<string name="tab_about">عن التطبيق</string>
|
||||
<string name="title_activity_history">التأريخ</string>
|
||||
<string name="action_history">التأريخ</string>
|
||||
<string name="open_in_popup_mode">فتح في النافذة المنبثقه</string>
|
||||
<string name="use_external_video_player_summary">بعض خيارات الجودة لن يكون هنالك صوت عند تمكين هذا الخيار</string>
|
||||
<string name="open_in_popup_mode">إفتح في نافذة منبثقه</string>
|
||||
<string name="use_external_video_player_summary">عند تمكين هذا الخيار لن يكون هنالك صوت في بعض خيارات الجودة</string>
|
||||
<string name="popup_mode_share_menu_title">وضع النافذة NewPipe المنبثقة</string>
|
||||
<string name="channel_unsubscribed">تم إلغاء اشتراك القناة</string>
|
||||
<string name="subscription_change_failed">تعذر تغيير في الاشتراك</string>
|
||||
@@ -154,7 +154,7 @@
|
||||
<string name="error_snackbar_action">تقرير</string>
|
||||
<string name="what_device_headline">معلومات:</string>
|
||||
<string name="what_happened_headline">ماذا حدث:</string>
|
||||
<string name="info_labels"></string>
|
||||
<string name="info_labels">What:\\nRequest:\\nContent Lang:\\nService:\\nGMT Time:\\nPackage:\\nVersion:\\nOS version:\\nGlob. IP range:</string>
|
||||
<string name="your_comment">تعليقك (باللغة الإنجليزية):</string>
|
||||
<string name="error_details_headline">تفاصيل:</string>
|
||||
|
||||
@@ -176,13 +176,13 @@
|
||||
|
||||
<string name="no_subscribers">صفر لا تقم با الإختيار (في بعض اللغات) لأنها ليست \"حالة خاصة\" للأندرويد</string>
|
||||
<plurals name="subscribers">
|
||||
<item quantity="zero">%s مشترك</item>
|
||||
<item quantity="one">%s مشتركين</item>
|
||||
<item quantity="two">%s مشتركين</item>
|
||||
<item quantity="few">%s مشتركون</item>
|
||||
<item quantity="many"></item>
|
||||
<item quantity="other"></item>
|
||||
</plurals>
|
||||
<item quantity="zero">صفر</item>
|
||||
<item quantity="one">واحد</item>
|
||||
<item quantity="two">اثنان</item>
|
||||
<item quantity="few">قليل</item>
|
||||
<item quantity="many">كثير</item>
|
||||
<item quantity="other">أخرى</item>
|
||||
</plurals>
|
||||
|
||||
<string name="no_views">لاتوجد مشاهدات</string>
|
||||
<string name="no_videos">لاتوجد فديوهات</string>
|
||||
@@ -262,4 +262,34 @@
|
||||
<string name="play_queue_audio_settings">إعدادات الصوت</string>
|
||||
<string name="start_here_on_main">بدء التشغيل هنا</string>
|
||||
<string name="start_here_on_popup">تشغيل هنا في وضع النافذة المنبثقة</string>
|
||||
<string name="reCaptcha_title">تحدي ريكابتشا</string>
|
||||
<string name="hold_to_append">اضغط للإدراج بقائمة الانتظار</string>
|
||||
<plurals name="views">
|
||||
<item quantity="zero">صفر</item>
|
||||
<item quantity="one">واحد</item>
|
||||
<item quantity="two">اثنان</item>
|
||||
<item quantity="few">قليل</item>
|
||||
<item quantity="many">كثير</item>
|
||||
<item quantity="other">أخرى</item>
|
||||
</plurals>
|
||||
|
||||
<plurals name="videos">
|
||||
<item quantity="zero">صفر</item>
|
||||
<item quantity="one">واحد</item>
|
||||
<item quantity="two">اثنان</item>
|
||||
<item quantity="few">قليل</item>
|
||||
<item quantity="many">كثير</item>
|
||||
<item quantity="other">أخرى</item>
|
||||
</plurals>
|
||||
|
||||
<string name="recaptcha_request_toast">إعادة طلب كلمة التحقق</string>
|
||||
|
||||
<string name="copyright" formatted="true">© %1$sبواسطة%2$sتحت%3$s</string>
|
||||
<string name="kiosk_page_summary">صفحة الكشك</string>
|
||||
<string name="select_a_kiosk">حدد كشك</string>
|
||||
|
||||
<string name="kiosk">كشك</string>
|
||||
<string name="enqueue_on_background">إدراج بقائمة الانتظار على خلفية</string>
|
||||
<string name="enqueue_on_popup">إدراج بقائمة الانتظار على المنبثقة</string>
|
||||
<string name="start_here_on_background">ابدأ هنا على خلفية المصدر</string>
|
||||
</resources>
|
||||
|
||||
@@ -204,8 +204,7 @@ otevření ve vyskakovacím okně</string>
|
||||
<plurals name="subscribers">
|
||||
<item quantity="one">%s odběratel</item>
|
||||
<item quantity="few">%s odběratelé</item>
|
||||
<item quantity="many">%s odběratelů</item>
|
||||
<item quantity="other"/>
|
||||
<item quantity="other">%s odběratelů</item>
|
||||
</plurals>
|
||||
|
||||
<string name="no_views">Žádná zhlédnutí</string>
|
||||
@@ -219,8 +218,7 @@ otevření ve vyskakovacím okně</string>
|
||||
<plurals name="videos">
|
||||
<item quantity="one">%s video</item>
|
||||
<item quantity="few">%s videa</item>
|
||||
<item quantity="many">%s videí</item>
|
||||
<item quantity="other"/>
|
||||
<item quantity="other">%s videí</item>
|
||||
</plurals>
|
||||
|
||||
<string name="settings_category_downloads_title">Stahování</string>
|
||||
|
||||
@@ -145,31 +145,30 @@
|
||||
<string name="disabled">Deaktiviert</string>
|
||||
|
||||
<string name="use_old_player_title">Benutze den alten Player</string>
|
||||
<string name="open_in_popup_mode">Im Popup-Modus öffnen</string>
|
||||
<string name="open_in_popup_mode">Im Pop-up Modus öffnen</string>
|
||||
<string name="default_video_format_title">Bevorzugtes Videoformat</string>
|
||||
<string name="popup_playing_toast">Spiele im Popup-Modus ab</string>
|
||||
<string name="popup_mode_share_menu_title">NewPipe Popup-Modus</string>
|
||||
<string name="popup_playing_toast">Spiele im Pop-up Modus ab</string>
|
||||
<string name="popup_mode_share_menu_title">NewPipe Pop-up Modus</string>
|
||||
|
||||
|
||||
<string name="msg_popup_permission">Diese Berechtigung ist für das
|
||||
Öffnen im Popup-Modus erforderlich</string>
|
||||
<string name="msg_popup_permission">Diese Berechtigung ist für das Öffnen im Pop-up Modus erforderlich</string>
|
||||
|
||||
<string name="use_old_player_summary">Alter eingebauter Mediaframework-Player</string>
|
||||
<string name="default_popup_resolution_title">Standardauflösung des Popups</string>
|
||||
<string name="default_popup_resolution_title">Standardauflösung des Pop-ups</string>
|
||||
<string name="show_higher_resolutions_title">Zeige höhere Auflösungen an</string>
|
||||
<string name="show_higher_resolutions_summary">Nur einige Geräte unterstützen das Abspielen von 2K-/4K-Videos</string>
|
||||
<string name="show_higher_resolutions_summary">Nur manche Geräte unterstützen das Abspielen von 2K-/4K-Videos</string>
|
||||
<string name="controls_background_title">Hintergrund</string>
|
||||
<string name="controls_popup_title">Popup</string>
|
||||
<string name="controls_popup_title">Pop-up</string>
|
||||
|
||||
<string name="popup_remember_size_pos_title">Größe und Position des Popups merken</string>
|
||||
<string name="popup_remember_size_pos_title">Größe und Position des Pop-ups merken</string>
|
||||
<string name="use_external_video_player_summary">Manche Auflösungen werden KEINE Tonspur haben, wenn diese Option eingeschaltet ist</string>
|
||||
<string name="popup_remember_size_pos_summary">Letzte Größe und Position des Popups merken</string>
|
||||
<string name="popup_remember_size_pos_summary">Letzte Größe und Position des Pop-ups merken</string>
|
||||
<string name="player_gesture_controls_title">Gestensteuerung</string>
|
||||
<string name="player_gesture_controls_summary">Helligkeit und Lautstärke des Players mit Gesten steuern</string>
|
||||
<string name="player_gesture_controls_summary">Benutze Gesten um Helligkeit und Lautstärke zu justieren</string>
|
||||
<string name="show_search_suggestions_title">Durchsuche Vorschläge</string>
|
||||
<string name="show_search_suggestions_summary">Zeige Vorschläge beim Suchen</string>
|
||||
|
||||
<string name="settings_category_popup_title">Popup</string>
|
||||
<string name="settings_category_popup_title">Pop-up</string>
|
||||
<string name="filter">Filter</string>
|
||||
<string name="refresh">Aktualisieren</string>
|
||||
<string name="clear">Leeren</string>
|
||||
@@ -224,9 +223,9 @@
|
||||
|
||||
|
||||
<string name="notification_channel_name">NewPipe Benachrichtigung</string>
|
||||
<string name="notification_channel_description">Benachrichtigungen für NewPipe Hintergrund- und Popup-Player</string>
|
||||
<string name="notification_channel_description">Benachrichtigungen für NewPipe Hintergrund- und Pop-up Player</string>
|
||||
|
||||
<string name="tab_main">Übersicht</string>
|
||||
<string name="tab_main">Main</string>
|
||||
<string name="settings_category_player_behavior_title">Verhalten</string>
|
||||
<string name="settings_category_history_title">Verlauf</string>
|
||||
<string name="playlist">Playlist</string>
|
||||
@@ -263,7 +262,7 @@
|
||||
<string name="select_a_channel">Wähle einen Kanal aus</string>
|
||||
<string name="no_channel_subscribed_yet">Noch kein Kanal abonniert</string>
|
||||
<string name="trending">Trends</string>
|
||||
<string name="popup_playing_append">In der Warteschlange des Popup-Players</string>
|
||||
<string name="popup_playing_append">In der Warteschlange des Pop-up Players</string>
|
||||
<string name="play_all">Alles abspielen</string>
|
||||
|
||||
<string name="play_queue_remove">Entfernen</string>
|
||||
@@ -274,7 +273,7 @@
|
||||
<string name="feed_page_summary">Feed-Seite</string>
|
||||
<string name="channel_page_summary">Kanal-Seite</string>
|
||||
<string name="title_activity_background_player">Hintergrund-Player</string>
|
||||
<string name="title_activity_popup_player">Popup-Player</string>
|
||||
<string name="title_activity_popup_player">Pop-up Player</string>
|
||||
<string name="play_queue_stream_detail">Details</string>
|
||||
<string name="top_50">Top 50</string>
|
||||
<string name="player_unrecoverable_failure">Nicht behebbarer Wiedergabefehler aufgetreten</string>
|
||||
@@ -284,7 +283,7 @@
|
||||
<string name="select_a_kiosk">Kiosk auswählen</string>
|
||||
|
||||
<string name="kiosk">Kiosk</string>
|
||||
<string name="show_hold_to_append_summary">Tipp anzeigen, wenn der Hintergrundwiedergabe- oder Pop-up-Button auf der Videodetailseite gedrücktgehalten wird</string>
|
||||
<string name="show_hold_to_append_summary">Tipp anzeigen, wenn der Hintergrundwiedergabe- oder Pop-up-Button auf der Videodetailseite gedrückt gehalten wird</string>
|
||||
<string name="background_player_append">In der Warteschlange der Hintergrundwiedergabe</string>
|
||||
<string name="new_and_hot">Neu und brandheiß</string>
|
||||
<string name="hold_to_append">Halten zum Hinzufügen zur Warteschleife</string>
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
|
||||
<string name="theme_title">Tema</string>
|
||||
<string name="dark_theme_title">Oscuro</string>
|
||||
<string name="light_theme_title">Ligero</string>
|
||||
<string name="light_theme_title">Claro</string>
|
||||
|
||||
<string name="settings_category_appearance_title">Apariencia</string>
|
||||
<string name="settings_category_other_title">Otros</string>
|
||||
@@ -127,7 +127,7 @@
|
||||
<string name="app_ui_crash">La interfaz de la app dejó de funcionar</string>
|
||||
<string name="info_labels">Lo sucedido:\\nSolicitud:\\nIdioma del contenido:\\nServicio:\\nHora GMT:\\nPaquete:\\nVersión:\\nVersión del S.O:\\nRango global de la IP:</string>
|
||||
|
||||
<string name="black_theme_title">Oscuro</string>
|
||||
<string name="black_theme_title">Negro</string>
|
||||
|
||||
<string name="all">Todo</string>
|
||||
<string name="channel">Canal</string>
|
||||
@@ -302,4 +302,10 @@ abrir en modo popup</string>
|
||||
<string name="give_back">Donar</string>
|
||||
<string name="website_title">Página web</string>
|
||||
<string name="website_encouragement">Para obtener más información y las últimas noticias sobre NewPipe, visita nuestra web.</string>
|
||||
<string name="default_content_country_title">País del contenido por defecto</string>
|
||||
<string name="toggle_orientation">Alternar orientación</string>
|
||||
<string name="switch_to_background">Cambiar a segundo plano</string>
|
||||
<string name="switch_to_popup">Cambiar a popup</string>
|
||||
<string name="switch_to_main">Cambiar a principal</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
<string name="settings_category_appearance_title">Apparence</string>
|
||||
<string name="network_error">Erreur réseau</string>
|
||||
|
||||
<string name="download_path_audio_title">Chemin de téléchargement de l\'audio</string>
|
||||
<string name="download_path_audio_title">Chemin de téléchargement</string>
|
||||
<string name="download_path_audio_summary">Chemin de stockage des fichiers audio téléchargés</string>
|
||||
<string name="download_path_audio_dialog_title">Entrez le chemin de téléchargement des fichiers audio</string>
|
||||
|
||||
@@ -66,12 +66,12 @@
|
||||
|
||||
<string name="error_snackbar_message">Désolé, des erreurs se sont produites.</string>
|
||||
<string name="content">Contenu</string>
|
||||
<string name="show_age_restricted_content_title">Afficher le contenu soumis à une restriction d\'âge</string>
|
||||
<string name="duration_live">En direct</string>
|
||||
<string name="show_age_restricted_content_title">Afficher le contenu avec restriction d\'âge</string>
|
||||
<string name="duration_live">Direct</string>
|
||||
|
||||
<string name="could_not_load_thumbnails">Impossible de charger toutes les miniatures</string>
|
||||
<string name="youtube_signature_decryption_error">Erreur lors du décryptage du lien</string>
|
||||
<string name="light_parsing_error">Impossible d\'analyser le site complètement</string>
|
||||
<string name="light_parsing_error">Impossible d\'analyser complètement le site web</string>
|
||||
<string name="live_streams_not_supported">Il s\'agit d\'un direct, non supporté pour le moment.</string>
|
||||
<string name="sorry_string">Désolé, une erreur inattendue s\'est produite.</string>
|
||||
<string name="autoplay_by_calling_app_summary">Lire automatiquement la vidéo lorsque NewPipe est appelée par une autre application</string>
|
||||
@@ -93,7 +93,7 @@
|
||||
<string name="user_report">Rapport utilisateur</string>
|
||||
|
||||
<string name="error_snackbar_action">SIGNALER</string>
|
||||
<string name="could_not_setup_download_menu">Impossible de mettre en place le menu de téléchargement</string>
|
||||
<string name="could_not_setup_download_menu">Impossible de configurer le menu de téléchargement</string>
|
||||
<string name="could_not_get_stream">Impossible d\'obtenir un flux</string>
|
||||
<string name="downloads">Téléchargements</string>
|
||||
<string name="downloads_title">Téléchargements</string>
|
||||
@@ -109,19 +109,19 @@
|
||||
<string name="finish">OK</string>
|
||||
|
||||
<string name="msg_name">Nom du fichier</string>
|
||||
<string name="msg_threads">Threads</string>
|
||||
<string name="msg_threads">Discussions</string>
|
||||
<string name="msg_error">Erreur</string>
|
||||
<string name="msg_server_unsupported">Serveur non supporté</string>
|
||||
<string name="msg_exists">Fichier déjà existant</string>
|
||||
<string name="msg_url_malform">URL malformée ou internet indisponible</string>
|
||||
<string name="msg_running">Téléchargement NewPipe</string>
|
||||
<string name="msg_running_detail">Toucher pour plus de détails</string>
|
||||
<string name="msg_running_detail">Appuyer pour plus de détails</string>
|
||||
<string name="msg_wait">Veuillez patienter…</string>
|
||||
<string name="msg_copied">Copié dans le presse-papier</string>
|
||||
<string name="no_available_dir">Sélectionner un dossier de téléchargement disponible</string>
|
||||
|
||||
<string name="could_not_load_image">L’image ne peut pas être chargée</string>
|
||||
<string name="app_ui_crash">L’appli/l’interface utilisateur a crashé</string>
|
||||
<string name="could_not_load_image">Impossible de charger l\'image</string>
|
||||
<string name="app_ui_crash">L’appli/l’interface a crashé</string>
|
||||
|
||||
<string name="reCaptchaActivity">reCAPTCHA</string>
|
||||
<string name="black_theme_title">Noir</string>
|
||||
@@ -130,13 +130,13 @@
|
||||
<string name="channel">Chaîne</string>
|
||||
|
||||
|
||||
<string name="reCaptcha_title">Test reCAPTCHA</string>
|
||||
<string name="recaptcha_request_toast">Test reCAPTCHA demandé</string>
|
||||
<string name="reCaptcha_title">Défi reCAPTCHA</string>
|
||||
<string name="recaptcha_request_toast">Défi reCAPTCHA demandé</string>
|
||||
|
||||
<string name="open_in_popup_mode">Ouvrir dans le lecteur pop-up</string>
|
||||
<string name="popup_mode_share_menu_title">Lecteur pop-up de NewPipe</string>
|
||||
<string name="open_in_popup_mode">Ouvrir en mode fenêtré</string>
|
||||
<string name="popup_mode_share_menu_title">Mode fenêtré NewPipe</string>
|
||||
|
||||
<string name="popup_playing_toast">Lire dans le lecteur pop-up</string>
|
||||
<string name="popup_playing_toast">Lire en mode fenêtré</string>
|
||||
<string name="yes">Oui</string>
|
||||
<string name="later">Plus tard</string>
|
||||
<string name="disabled">Désactivé</string>
|
||||
@@ -147,38 +147,38 @@
|
||||
<string name="short_thousand">K</string>
|
||||
<string name="short_million">M</string>
|
||||
|
||||
<string name="msg_popup_permission">Cette permission est nécessaire pour
|
||||
\nutiliser le mode pop-up</string>
|
||||
<string name="msg_popup_permission">Cette autorisation est nécessaire pour
|
||||
\nutiliser le mode fenêtré</string>
|
||||
|
||||
<string name="controls_background_title">Arrière-plan</string>
|
||||
<string name="controls_popup_title">Pop-up</string>
|
||||
<string name="controls_popup_title">Fenêtre</string>
|
||||
|
||||
<string name="default_popup_resolution_title">Taille du lecteur pop-up</string>
|
||||
<string name="default_popup_resolution_title">Résolution par défaut de la fenêtre</string>
|
||||
<string name="show_higher_resolutions_title">Afficher des résolutions plus élevées</string>
|
||||
<string name="show_higher_resolutions_summary">Seulement certains périphériques supportent la lecture 2K/4K</string>
|
||||
<string name="show_higher_resolutions_summary">Certains appareils uniquement supportent la lecture 2K/4K</string>
|
||||
<string name="default_video_format_title">Format vidéo par défaut</string>
|
||||
<string name="popup_remember_size_pos_title">Mémoriser la taille et la position du lecteur pop-up</string>
|
||||
<string name="popup_remember_size_pos_summary">Mémoriser le dernier emplacement et la taille du lecteur pop-up</string>
|
||||
<string name="popup_remember_size_pos_title">Mémoriser la taille et la position de la fenêtre</string>
|
||||
<string name="popup_remember_size_pos_summary">Mémoriser la dernière taille et position de la fenêtre</string>
|
||||
|
||||
<string name="settings_category_popup_title">Pop-up</string>
|
||||
<string name="settings_category_popup_title">Fenêtre</string>
|
||||
<string name="filter">Filtre</string>
|
||||
<string name="refresh">Actualiser</string>
|
||||
<string name="clear">Effacer</string>
|
||||
<string name="popup_resizing_indicator_title">Redimensionner</string>
|
||||
|
||||
<string name="short_billion">Md</string>
|
||||
<string name="short_billion">B</string>
|
||||
|
||||
<string name="use_external_video_player_summary">Certaines résolutions n\'auront PAS de son si cette option est activée</string>
|
||||
<string name="player_gesture_controls_summary">Utilisez les gestes pour contrôler la luminosité et le volume du lecteur</string>
|
||||
<string name="show_search_suggestions_title">Chercher des suggestions</string>
|
||||
<string name="show_search_suggestions_summary">Montrer les suggestions pendant la recherche</string>
|
||||
<string name="player_gesture_controls_summary">Utiliser les gestes pour contrôler la luminosité et le volume du lecteur</string>
|
||||
<string name="show_search_suggestions_title">Suggestions de recherche</string>
|
||||
<string name="show_search_suggestions_summary">Afficher les suggestions lors d\'une recherche</string>
|
||||
|
||||
<string name="player_gesture_controls_title">Gestes pour contrôler la lecture</string>
|
||||
<string name="best_resolution">Meilleure résolution</string>
|
||||
|
||||
<string name="subscribe_button_title">S\'abonner</string>
|
||||
<string name="subscribed_button_title">Abonné</string>
|
||||
<string name="channel_unsubscribed">Désabonner de la chaîne</string>
|
||||
<string name="channel_unsubscribed">Désabonné de la chaîne</string>
|
||||
<string name="tab_main">Principal</string>
|
||||
<string name="tab_subscriptions">Abonnements</string>
|
||||
|
||||
@@ -202,8 +202,8 @@
|
||||
<string name="title_activity_about">À propos de NewPipe</string>
|
||||
<string name="copyright" formatted="true">© %1$s par %2$s sous %3$s</string>
|
||||
<string name="contribution_encouragement">Que ce soit pour des idées, traductions, changements de design, nettoyage ou gros changements de code, l\'aide est toujours la bienvenue. Plus on contribue, meilleur il devient !</string>
|
||||
<string name="subscription_change_failed">Incapable de changer l\'abonnement</string>
|
||||
<string name="subscription_update_failed">Incapable de mettre à jour l\'abonnement</string>
|
||||
<string name="subscription_change_failed">Impossible de modifier l\'abonnement</string>
|
||||
<string name="subscription_update_failed">Impossible d\'actualiser l\'abonnement</string>
|
||||
|
||||
<string name="resume_on_audio_focus_gain_summary">Continuer la lecture après les interruptions (ex : appels)</string>
|
||||
|
||||
@@ -216,7 +216,7 @@
|
||||
<string name="enable_watch_history_title">Historique</string>
|
||||
<string name="title_activity_history">Historique</string>
|
||||
<string name="title_history_search">Recherché</string>
|
||||
<string name="title_history_view">Vue</string>
|
||||
<string name="title_history_view">Regardé</string>
|
||||
<string name="history_disabled">L\'historique est désactivé</string>
|
||||
<string name="action_history">Historique</string>
|
||||
<string name="history_empty">L\'historique est vide</string>
|
||||
@@ -231,10 +231,10 @@
|
||||
<string name="settings_category_player_behavior_title">Comportement</string>
|
||||
<string name="settings_category_history_title">Historique</string>
|
||||
<string name="playlist">Liste de lecture</string>
|
||||
<string name="notification_channel_description">Notifications pour les lecteurs \"Arrière-plan\" et \"Pop-up\" de NewPipe</string>
|
||||
<string name="notification_channel_description">Notifications pour les lecteurs \"Arrière-plan\" et \"Fenêtre\" de NewPipe</string>
|
||||
|
||||
<string name="search_no_results">Aucun résultat</string>
|
||||
<string name="empty_subscription_feed_subtitle">Rien à voir ici</string>
|
||||
<string name="empty_subscription_feed_subtitle">Aucun contenu</string>
|
||||
|
||||
<string name="no_subscribers">Aucun abonné</string>
|
||||
<plurals name="subscribers">
|
||||
@@ -242,10 +242,10 @@
|
||||
<item quantity="other">%s abonnés</item>
|
||||
</plurals>
|
||||
|
||||
<string name="no_views">Aucun visionnage</string>
|
||||
<string name="no_views">Aucune vue</string>
|
||||
<plurals name="views">
|
||||
<item quantity="one">%s visionnage</item>
|
||||
<item quantity="other">%s visionnages</item>
|
||||
<item quantity="one">%s vue</item>
|
||||
<item quantity="other">%s vues</item>
|
||||
</plurals>
|
||||
|
||||
<string name="no_videos">Aucune vidéo</string>
|
||||
@@ -256,31 +256,31 @@
|
||||
|
||||
<string name="charset_most_special_characters">Caractères spéciaux</string>
|
||||
|
||||
<string name="item_deleted">Objet effacé</string>
|
||||
<string name="item_deleted">Élément effacé</string>
|
||||
<string name="delete_item_search_history">Voulez-vous supprimer cet élément de l\'historique de recherche ?</string>
|
||||
<string name="main_page_content">Contenu de la page principale</string>
|
||||
<string name="blank_page_summary">Page vide</string>
|
||||
<string name="subscription_page_summary">Abonnements</string>
|
||||
<string name="feed_page_summary">Page de Flux</string>
|
||||
<string name="channel_page_summary">Page de la chaîne</string>
|
||||
<string name="select_a_channel">Sélectionnez une chaîne</string>
|
||||
<string name="select_a_channel">Sélectionner une chaîne</string>
|
||||
<string name="trending">Populaires</string>
|
||||
<string name="top_50">Top 50</string>
|
||||
<string name="new_and_hot">Nouveau & populaire</string>
|
||||
<string name="background_player_append">Mettre en file d\'attente du lecteur en arrière plan</string>
|
||||
<string name="popup_playing_append">Mettre en file d\'attente du lecteur pop-up</string>
|
||||
<string name="play_all">Lire tout</string>
|
||||
<string name="background_player_append">Mis en file d\'attente du lecteur en arrière-plan</string>
|
||||
<string name="popup_playing_append">Mis en file d\'attente du lecteur fenêtré</string>
|
||||
<string name="play_all">Tout lire</string>
|
||||
|
||||
<string name="player_stream_failure">Échec de la lecture de cette vidéo</string>
|
||||
<string name="player_stream_failure">Échec de la lecture de ce flux</string>
|
||||
<string name="player_unrecoverable_failure">Une erreur irrécupérable du lecteur s\'est produite</string>
|
||||
<string name="no_channel_subscribed_yet">Encore aucune chaîne souscrite</string>
|
||||
<string name="title_activity_background_player">Lecteur en arrière plan</string>
|
||||
<string name="title_activity_popup_player">Lecteur pop-up</string>
|
||||
<string name="title_activity_background_player">Lecteur en arrière-plan</string>
|
||||
<string name="title_activity_popup_player">Lecteur fenêtré</string>
|
||||
<string name="play_queue_remove">Retirer</string>
|
||||
<string name="play_queue_stream_detail">Détails</string>
|
||||
<string name="play_queue_audio_settings">Réglages audio</string>
|
||||
<string name="show_hold_to_append_title">Afficher l\'aide \"Appui long pour mettre en file d\'attente\"</string>
|
||||
<string name="show_hold_to_append_summary">Afficher l\'aide en restant appuyé sur les boutons \"Arrière-plan\" et \"Pop-up\" sur la page de détails d\'une vidéo</string>
|
||||
<string name="show_hold_to_append_summary">Afficher l\'aide en appuyant sur les boutons \"Arrière-plan\" et \"Fenêtre\" sur la page de détails d\'une vidéo</string>
|
||||
<string name="unknown_content">[Inconnu]</string>
|
||||
|
||||
<string name="player_recoverable_failure">Récupération de l\'erreur du lecteur</string>
|
||||
@@ -290,14 +290,20 @@
|
||||
|
||||
<string name="kiosk">Kiosque</string>
|
||||
<string name="hold_to_append">Appui long pour mettre en file d\'attente</string>
|
||||
<string name="enqueue_on_background">Mettre en file d\'attente en fond</string>
|
||||
<string name="enqueue_on_popup">Mettre en file d\'attente du lecteur pop-up</string>
|
||||
<string name="enqueue_on_background">Mettre en file d\'attente en arrière-plan</string>
|
||||
<string name="enqueue_on_popup">Mettre en file d\'attente du lecteur fenêtré</string>
|
||||
<string name="start_here_on_main">Démarrer ici</string>
|
||||
<string name="start_here_on_background">Démarrer ici en fond</string>
|
||||
<string name="start_here_on_popup">Démarrer dans le lecteur pop-up</string>
|
||||
<string name="start_here_on_background">Démarrer ici en arrière-plan</string>
|
||||
<string name="start_here_on_popup">Démarrer ici en fenêtré</string>
|
||||
<string name="donation_title">Donner</string>
|
||||
<string name="donation_encouragement">NewPipe est développé par des volontaires sur leur temps libre afin de vous proposer la meilleur expérience. Maintenant il est temps de leurs offrir un café pour les soutenir dans leurs efforts et rendre NewPipe encore meilleur !</string>
|
||||
<string name="website_title">Site</string>
|
||||
<string name="website_encouragement">Pour obtenir plus d\'informations et les dernières nouvelles à propos de NewPipe, visitez notre site Internet.</string>
|
||||
<string name="give_back">Donner en retour</string>
|
||||
<string name="default_content_country_title">Pays du contenu par défaut</string>
|
||||
<string name="toggle_orientation">Orientation</string>
|
||||
<string name="switch_to_background">Basculer en arrière-plan</string>
|
||||
<string name="switch_to_popup">Basculer en fenêtré</string>
|
||||
<string name="switch_to_main">Basculer en normal</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -178,24 +178,18 @@
|
||||
<plurals name="subscribers">
|
||||
<item quantity="one">%s עוקב</item>
|
||||
<item quantity="two">%s עוקבים</item>
|
||||
<item quantity="many"></item>
|
||||
<item quantity="other"></item>
|
||||
</plurals>
|
||||
|
||||
<string name="no_views">אין תצוגות</string>
|
||||
<plurals name="views">
|
||||
<item quantity="one">תצוגה %s</item>
|
||||
<item quantity="two">%s תצוגות</item>
|
||||
<item quantity="many"></item>
|
||||
<item quantity="other"></item>
|
||||
</plurals>
|
||||
|
||||
<string name="no_videos">אין סרטונים</string>
|
||||
<plurals name="videos">
|
||||
<item quantity="one">סרטון %s</item>
|
||||
<item quantity="two">%s סרטונים</item>
|
||||
<item quantity="many"></item>
|
||||
<item quantity="other"></item>
|
||||
</plurals>
|
||||
|
||||
<string name="start">התחל</string>
|
||||
|
||||
@@ -280,4 +280,10 @@
|
||||
<string name="play_queue_stream_detail">Detalji</string>
|
||||
<string name="play_queue_audio_settings">Postavke zvuka</string>
|
||||
<string name="hold_to_append">Zadržite za dodavanje u red čekanja</string>
|
||||
</resources>
|
||||
<string name="unknown_content">[Nepoznato]</string>
|
||||
|
||||
<string name="donation_title">Doniraj</string>
|
||||
<string name="website_title">Web stranica</string>
|
||||
<string name="start_here_on_main">Ovdje započni reprodukciju</string>
|
||||
<string name="start_here_on_background">Ovdje započni repr. u pozadini</string>
|
||||
</resources>
|
||||
|
||||
@@ -307,4 +307,10 @@
|
||||
<string name="website_encouragement">Per ricevere maggiori informazioni e le ultime novità su NewPipe visita il nostro sito web.</string>
|
||||
<string name="donation_encouragement">NewPipe è sviluppato da volontari che spendono il loro tempo libero per regalarti la migliore esperienza. È tempo di restituire il favore permettendo ai nostri sviluppatori di migliorare ulteriormente NewPipe mentre gustano una tazza di Giava!</string>
|
||||
<string name="give_back">Restituisci</string>
|
||||
<string name="default_content_country_title">Paese predefinito per i contenuti</string>
|
||||
<string name="toggle_orientation">Cambia orientamento</string>
|
||||
<string name="switch_to_background">Cambia in background</string>
|
||||
<string name="switch_to_popup">Cambia in visualizzazione a comparsa</string>
|
||||
<string name="switch_to_main">Cambia al menù principale</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -14,12 +14,12 @@
|
||||
<string name="choose_browser">ブラウザーを選択</string>
|
||||
<string name="screen_rotation">回転</string>
|
||||
<string name="download_path_title">動画を保存する場所</string>
|
||||
<string name="download_path_summary">動画を保存する位置</string>
|
||||
<string name="download_path_summary">動画を保存する場所</string>
|
||||
<string name="download_path_dialog_title">動画を保存する場所を入力して下さい</string>
|
||||
<string name="default_resolution_title">基本解像度</string>
|
||||
<string name="default_resolution_title">デフォルトの解像度</string>
|
||||
<string name="play_with_kodi_title">Kodi で再生</string>
|
||||
<string name="kore_not_found">Koreが見つかりません。Kore を入手しますか。</string>
|
||||
<string name="show_play_with_kodi_title">\"Kodi で再生\" 設定を表示</string>
|
||||
<string name="kore_not_found">Koreが見つかりません。Kore を入手しますか?</string>
|
||||
<string name="show_play_with_kodi_title">\"Kodi で再生\" オプションを表示</string>
|
||||
<string name="show_play_with_kodi_summary">Kodi メディアセンター経由で動画を再生するための設定を表示します</string>
|
||||
<string name="play_audio">音楽</string>
|
||||
<string name="default_audio_format_title">基本の音楽形式</string>
|
||||
@@ -31,7 +31,7 @@
|
||||
<string name="url_not_supported_toast">URLは使用できません</string>
|
||||
<string name="search_language_title">優先言語</string>
|
||||
<string name="settings_category_video_audio_title">動画と音楽</string>
|
||||
<string name="view_count_text">%1$s ビュー</string>
|
||||
<string name="view_count_text">%1$s ビュー</string>
|
||||
<string name="list_thumbnail_view_description">動画 プレビュー サムネイル</string>
|
||||
<string name="detail_thumbnail_view_description">動画 プレビュー サムネイル</string>
|
||||
<string name="detail_uploader_thumbnail_view_description">アップローダー サムネイル</string>
|
||||
@@ -39,7 +39,7 @@
|
||||
<string name="detail_likes_img_view_description">好ましい</string>
|
||||
<string name="use_external_video_player_title">外部プレイヤーを使用する</string>
|
||||
<string name="use_external_audio_player_title">外部プレイヤーを使用する</string>
|
||||
<string name="background_player_playing_toast">背後で再生しています</string>
|
||||
<string name="background_player_playing_toast">バックグラウンドで再生中</string>
|
||||
|
||||
<string name="play_btn_text">再生</string>
|
||||
|
||||
@@ -51,11 +51,11 @@
|
||||
|
||||
<string name="settings_category_appearance_title">外観</string>
|
||||
<string name="settings_category_other_title">その他</string>
|
||||
<string name="network_error">通信に異常</string>
|
||||
<string name="network_error">ネットワークエラー</string>
|
||||
|
||||
<string name="download_path_audio_title">音楽を保存する場所</string>
|
||||
<string name="download_path_audio_summary">音楽を保存する位置</string>
|
||||
<string name="download_path_audio_dialog_title">音楽ファイルをダウンロードする位置を入力して下さい。</string>
|
||||
<string name="download_path_audio_summary">音楽を保存する場所</string>
|
||||
<string name="download_path_audio_dialog_title">音楽ファイルをダウンロードする場所を入力して下さい。</string>
|
||||
|
||||
<string name="err_dir_create">保存場所 \'%1$s\' を作成できません</string>
|
||||
<string name="info_dir_created">保存場所 \'%1$s\' を作成しました</string>
|
||||
@@ -73,7 +73,7 @@
|
||||
|
||||
|
||||
<string name="content">内容</string>
|
||||
<string name="show_age_restricted_content_title">年齢制限解除</string>
|
||||
<string name="show_age_restricted_content_title">年齢制限のあるコンテンツを表示する</string>
|
||||
<string name="video_is_age_restricted">この動画には、年齢制限があります。設定から制限を解除して下さい。</string>
|
||||
|
||||
<string name="light_parsing_error">Webサイトを完全には解析できませんでした</string>
|
||||
@@ -91,34 +91,34 @@
|
||||
<string name="video">動画</string>
|
||||
<string name="audio">音楽</string>
|
||||
<string name="retry">再試行</string>
|
||||
<string name="storage_permission_denied">記録領域への接続要求が拒否されました</string>
|
||||
<string name="autoplay_by_calling_app_title">呼び出し</string>
|
||||
<string name="storage_permission_denied">ストレージへのアクセスが拒否されました</string>
|
||||
<string name="autoplay_by_calling_app_title">自動再生</string>
|
||||
<string name="autoplay_by_calling_app_summary">NewPipeが他のアプリケーションから呼び出された際に、自動的に動画を再生します。</string>
|
||||
<string name="report_error">不具合を報告</string>
|
||||
<string name="user_report">利用者報告</string>
|
||||
|
||||
<string name="duration_live">生放送</string>
|
||||
|
||||
<string name="main_bg_subtitle">検索を選択して開始</string>
|
||||
<string name="main_bg_subtitle">開始するには検索をタップ</string>
|
||||
<string name="start">開始</string>
|
||||
<string name="pause">一時停止</string>
|
||||
<string name="view">表示</string>
|
||||
<string name="delete">削除</string>
|
||||
<string name="checksum">整合性検査</string>
|
||||
<string name="checksum">チェックサム</string>
|
||||
|
||||
<string name="add">新しいミッション</string>
|
||||
<string name="finish">OK</string>
|
||||
|
||||
<string name="msg_name">ファイル名</string>
|
||||
<string name="msg_threads">同時接続数</string>
|
||||
<string name="msg_error">異常</string>
|
||||
<string name="msg_error">エラー</string>
|
||||
<string name="msg_server_unsupported">サーバーが対応していません</string>
|
||||
<string name="msg_exists">ファイルが既に存在します</string>
|
||||
<string name="msg_url_malform">URL の形式が正しくないか、通信が利用できません</string>
|
||||
<string name="msg_running">NewPipeの保存中</string>
|
||||
<string name="msg_running_detail">詳細はタップ</string>
|
||||
<string name="msg_wait">暫くお待ち下さい</string>
|
||||
<string name="msg_copied">クリップボードに複製しました</string>
|
||||
<string name="msg_wait">お待ちください…</string>
|
||||
<string name="msg_copied">クリップボードにコピーしました</string>
|
||||
<string name="no_available_dir">利用可能な保存場所を選択して下さい</string>
|
||||
|
||||
<string name="downloads">保存</string>
|
||||
@@ -136,13 +136,13 @@
|
||||
|
||||
<string name="black_theme_title">黒</string>
|
||||
|
||||
<string name="all">全て</string>
|
||||
<string name="channel">チャンネル</string>
|
||||
<string name="all">すべて</string>
|
||||
<string name="channel">チャンネル</string>
|
||||
|
||||
|
||||
<string name="short_thousand">K</string>
|
||||
<string name="short_million">000000</string>
|
||||
<string name="short_billion">000000000</string>
|
||||
<string name="short_million">M</string>
|
||||
<string name="short_billion">B</string>
|
||||
|
||||
<string name="yes">はい</string>
|
||||
<string name="later">後で</string>
|
||||
@@ -156,10 +156,10 @@
|
||||
|
||||
<string name="popup_playing_toast">ポップアップモードで再生中</string>
|
||||
<string name="use_old_player_title">古いプレーヤーを使用する</string>
|
||||
<string name="use_old_player_summary">Mediaframework プレーヤーの古いビルド。</string>
|
||||
<string name="use_old_player_summary">古い内蔵のMediaframeworkプレーヤー</string>
|
||||
<string name="disabled">無効</string>
|
||||
|
||||
<string name="default_video_format_title">お好みのビデオ フォーマット</string>
|
||||
<string name="default_video_format_title">デフォルトの動画形式</string>
|
||||
|
||||
<string name="default_popup_resolution_title">デフォルトのポップアップ解像度</string>
|
||||
<string name="show_higher_resolutions_title">高い解像度で表示</string>
|
||||
@@ -172,14 +172,14 @@
|
||||
<string name="clear">クリア</string>
|
||||
|
||||
<string name="popup_remember_size_pos_title">ポップアップのサイズと位置を記憶する</string>
|
||||
<string name="popup_remember_size_pos_summary">最後のサイズと位置を記憶してポップアップを設定します</string>
|
||||
<string name="popup_remember_size_pos_summary">前回のポップアップしたサイズと位置を記憶する</string>
|
||||
|
||||
<string name="settings_category_popup_title">ポップアップ</string>
|
||||
<string name="popup_resizing_indicator_title">サイズを変更</string>
|
||||
|
||||
<string name="use_external_video_player_summary">このオプションが有効になっているとき、一部の解像度ではオーディオがありません</string>
|
||||
<string name="player_gesture_controls_title">プレーヤーのジェスチャー コントロール</string>
|
||||
<string name="player_gesture_controls_summary">プレーヤーの明るさと音量をコントロールするのにジェスチャーを使用します</string>
|
||||
<string name="player_gesture_controls_summary">ジェスチャーを使用してプレーヤーの明るさと音量をコントロールする</string>
|
||||
<string name="show_search_suggestions_title">検索候補</string>
|
||||
<string name="show_search_suggestions_summary">検索時に候補を表示します</string>
|
||||
|
||||
@@ -187,18 +187,90 @@
|
||||
|
||||
<string name="title_activity_about">NewPipe について</string>
|
||||
<string name="action_settings">設定</string>
|
||||
<string name="action_about">アプリについて</string>
|
||||
<string name="action_about">このアプリについて</string>
|
||||
<string name="title_licenses">サードパーティー ライセンス</string>
|
||||
<string name="copyright" formatted="true">© %1$s 作者 %2$s ライセンス %3$s</string>
|
||||
<string name="error_unable_to_load_license">ライセンスをロードできません</string>
|
||||
<string name="error_unable_to_load_license">ライセンスを読み込めません</string>
|
||||
<string name="action_open_website">Web サイトを開く</string>
|
||||
<string name="tab_about">アプリについて</string>
|
||||
<string name="tab_about">このアプリについて</string>
|
||||
<string name="tab_contributors">貢献者</string>
|
||||
<string name="tab_licenses">ライセンス</string>
|
||||
<string name="app_description">Android 用の無料で軽量な Youtube フロントエンド。</string>
|
||||
<string name="app_description">Android向けの無料で軽量なYouTubeフロントエンド。</string>
|
||||
<string name="view_on_github">Github で表示</string>
|
||||
<string name="app_license_title">NewPipe のライセンス</string>
|
||||
<string name="contribution_encouragement">アイデア、翻訳、デザインの変更、コードのクリーニング、または本当に重いコードの変更がありますか。ヘルプは常に歓迎します。さらに良いものになりますように!</string>
|
||||
<string name="contribution_encouragement">翻訳、デザインの変更、コードの整理、動作の重いコードの変更など、アイデアをお持ちではありませんか?ヘルプはいつでも歓迎します。より良いものを一緒に作り上げましょう!</string>
|
||||
<string name="read_full_license">ライセンスを読む</string>
|
||||
<string name="contribution_title">貢献</string>
|
||||
</resources>
|
||||
<string name="subscribe_button_title">チャンネル登録</string>
|
||||
<string name="subscribed_button_title">チャンネル登録しました</string>
|
||||
<string name="channel_unsubscribed">チャンネル登録を解除しました</string>
|
||||
<string name="subscription_change_failed">チャンネル登録を変更できません</string>
|
||||
<string name="subscription_update_failed">チャンネル登録を更新できません</string>
|
||||
|
||||
<string name="tab_main">メイン</string>
|
||||
<string name="tab_subscriptions">登録リスト</string>
|
||||
|
||||
<string name="fragment_whats_new">新着</string>
|
||||
|
||||
<string name="enable_search_history_title">検索履歴</string>
|
||||
<string name="enable_search_history_summary">検索履歴をローカルに保存します</string>
|
||||
<string name="enable_watch_history_title">再生履歴</string>
|
||||
<string name="enable_watch_history_summary">再生した動画を記録します</string>
|
||||
<string name="resume_on_audio_focus_gain_title">フォーカスで再開</string>
|
||||
<string name="resume_on_audio_focus_gain_summary">電話などによる中断の後、再生を再開します</string>
|
||||
<string name="settings_category_player_title">プレーヤー</string>
|
||||
<string name="show_hold_to_append_summary">動画の詳細ページで背景、またはポップアップボタンが押されたときにヒントを表示する</string>
|
||||
<string name="settings_category_player_behavior_title">動作</string>
|
||||
<string name="settings_category_history_title">履歴</string>
|
||||
<string name="playlist">再生リスト</string>
|
||||
<string name="undo">元に戻す</string>
|
||||
<string name="play_all">すべて再生</string>
|
||||
|
||||
<string name="notification_channel_name">NewPipeの通知</string>
|
||||
<string name="unknown_content">[不明]</string>
|
||||
|
||||
<string name="player_stream_failure">ストリームの再生に失敗しました</string>
|
||||
<string name="player_unrecoverable_failure">回復不能な再生エラーが発生しました</string>
|
||||
<string name="search_no_results">何も見つかりませんでした</string>
|
||||
<string name="no_subscribers">チャンネル登録なし</string>
|
||||
<string name="no_videos">動画がありません</string>
|
||||
<string name="settings_category_downloads_title">保存</string>
|
||||
<string name="settings_file_charset_title">ファイル名に使用可能な文字</string>
|
||||
<string name="settings_file_replacement_character_summary">無効な文字は次の値で置き換えられます</string>
|
||||
<string name="settings_file_replacement_character_title">置換文字</string>
|
||||
|
||||
<string name="charset_letters_and_digits">文字と数字</string>
|
||||
<string name="charset_most_special_characters">ほとんどの特殊文字</string>
|
||||
|
||||
<string name="donation_title">寄付</string>
|
||||
<string name="donation_encouragement">NewPipeはあなたに最高の経験をもたらすため、自由時間を費やしたボランティアによって開発されています。カップのコーヒー(Java)を楽しんでいる間に、開発者がNewPipeをより良いものにすることが出来るよう、今度はお返しをする時間です!</string>
|
||||
<string name="website_title">Webサイト</string>
|
||||
<string name="website_encouragement">NewPipeに関する詳しい情報や最新のニュースについては、我々のWebサイトをご覧ください。</string>
|
||||
<string name="title_activity_history">履歴</string>
|
||||
<string name="title_history_search">検索履歴</string>
|
||||
<string name="title_history_view">再生履歴</string>
|
||||
<string name="history_disabled">履歴は無効です</string>
|
||||
<string name="action_history">履歴</string>
|
||||
<string name="history_empty">履歴に何もありません</string>
|
||||
<string name="history_cleared">履歴を消去しました</string>
|
||||
<string name="item_deleted">アイテムを削除しました</string>
|
||||
<string name="delete_item_search_history">このアイテムを検索履歴から削除しますか?</string>
|
||||
|
||||
<string name="main_page_content">メインページのコンテンツ</string>
|
||||
<string name="blank_page_summary">空白ページ</string>
|
||||
<string name="kiosk_page_summary">キオスクページ</string>
|
||||
<string name="subscription_page_summary">チャンネル登録ページ</string>
|
||||
<string name="feed_page_summary">フィードページ</string>
|
||||
<string name="channel_page_summary">チャンネルページ</string>
|
||||
<string name="select_a_channel">選択したチャンネル</string>
|
||||
<string name="no_channel_subscribed_yet">購読しているチャンネルはありません</string>
|
||||
<string name="select_a_kiosk">選択したキオスク</string>
|
||||
|
||||
<string name="kiosk">キオスク</string>
|
||||
<string name="trending">人気</string>
|
||||
<string name="top_50">トップ50</string>
|
||||
<string name="title_activity_popup_player">ポップアップ再生</string>
|
||||
<string name="play_queue_remove">削除</string>
|
||||
<string name="play_queue_stream_detail">詳細</string>
|
||||
<string name="play_queue_audio_settings">音声の設定</string>
|
||||
</resources>
|
||||
|
||||
@@ -128,15 +128,10 @@
|
||||
<plurals name="subscribers">
|
||||
<item quantity="one">%s prenumeratorius</item>
|
||||
<item quantity="few">%s prenumeratoriai</item>
|
||||
<item quantity="many"/>
|
||||
<item quantity="other"/>
|
||||
</plurals>
|
||||
|
||||
<plurals name="videos">
|
||||
<item quantity="one">Vaizdo įrašai</item>
|
||||
<item quantity="few"/>
|
||||
<item quantity="many"/>
|
||||
<item quantity="other"/>
|
||||
</plurals>
|
||||
|
||||
<string name="start">Pradėti</string>
|
||||
@@ -214,9 +209,6 @@
|
||||
<string name="no_views">Nėra peržiūrų</string>
|
||||
<plurals name="views">
|
||||
<item quantity="one">%a peržiūra</item>
|
||||
<item quantity="few"></item>
|
||||
<item quantity="many"></item>
|
||||
<item quantity="other"></item>
|
||||
</plurals>
|
||||
|
||||
<string name="no_videos">Nėra vaizdo įrašų</string>
|
||||
|
||||
@@ -247,23 +247,18 @@
|
||||
<plurals name="subscribers">
|
||||
<item quantity="one">%s subskrybent</item>
|
||||
<item quantity="few">%s subskrybentów</item>
|
||||
<item quantity="many">%s subskrybentów</item>
|
||||
<item quantity="other"/>
|
||||
<item quantity="other">%s subskrybentów</item>
|
||||
</plurals>
|
||||
|
||||
<plurals name="views">
|
||||
<item quantity="one">%s odtworzenie</item>
|
||||
<item quantity="few"/>
|
||||
<item quantity="many">%s odtworzeń</item>
|
||||
<item quantity="other"/>
|
||||
<item quantity="other">%s odtworzeń</item>
|
||||
</plurals>
|
||||
|
||||
<string name="no_videos">Brak filmów</string>
|
||||
<plurals name="videos">
|
||||
<item quantity="one">%s film</item>
|
||||
<item quantity="few">%s filmów</item>
|
||||
<item quantity="many"/>
|
||||
<item quantity="other"/>
|
||||
</plurals>
|
||||
|
||||
<string name="charset_most_special_characters">Większość znaków specjalnych</string>
|
||||
|
||||
@@ -236,24 +236,21 @@
|
||||
<plurals name="subscribers">
|
||||
<item quantity="one">%s подписчик</item>
|
||||
<item quantity="few">%s подписчика</item>
|
||||
<item quantity="many">%s подписчиков</item>
|
||||
<item quantity="other"/>
|
||||
<item quantity="other">%s подписчиков</item>
|
||||
</plurals>
|
||||
|
||||
<string name="no_views">Нет просмотров</string>
|
||||
<plurals name="views">
|
||||
<item quantity="one">%s просмотр</item>
|
||||
<item quantity="few">%s просмотра</item>
|
||||
<item quantity="many">%s просмотров</item>
|
||||
<item quantity="other"/>
|
||||
<item quantity="other">%s просмотров</item>
|
||||
</plurals>
|
||||
|
||||
<string name="no_videos">Нет видео</string>
|
||||
<plurals name="videos">
|
||||
<item quantity="one">%s видео</item>
|
||||
<item quantity="few">%s видео</item>
|
||||
<item quantity="many">%s видео</item>
|
||||
<item quantity="other"/>
|
||||
<item quantity="other">%s видео</item>
|
||||
</plurals>
|
||||
|
||||
<string name="item_deleted">Элемент удалён</string>
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
<string name="play_audio">Zvuk</string>
|
||||
<string name="default_audio_format_title">Predvolený zvukový formát</string>
|
||||
<string name="webm_description">WebM — voľný formát</string>
|
||||
<string name="m4a_description">m4a — lepšia kvalita</string>
|
||||
<string name="m4a_description">M4A — lepšia kvalita</string>
|
||||
<string name="theme_title">Téma</string>
|
||||
<string name="dark_theme_title">Tmavá</string>
|
||||
<string name="light_theme_title">Svetlá</string>
|
||||
@@ -128,7 +128,7 @@
|
||||
<string name="reCaptchaActivity">reCAPTCHA</string>
|
||||
<string name="reCaptcha_title">Výzva reCAPTCHA</string>
|
||||
|
||||
<string name="black_theme_title">Tmavá</string>
|
||||
<string name="black_theme_title">Čierna</string>
|
||||
|
||||
<string name="all">Všetko</string>
|
||||
<string name="channel">Kanály</string>
|
||||
@@ -247,24 +247,21 @@ otvorenie okna na popredí</string>
|
||||
<plurals name="subscribers">
|
||||
<item quantity="one">%s odberateľ</item>
|
||||
<item quantity="few">%s odberatelia</item>
|
||||
<item quantity="many">%s odberateľov</item>
|
||||
<item quantity="other"></item>
|
||||
<item quantity="other">%s odberateľov</item>
|
||||
</plurals>
|
||||
|
||||
<string name="no_views">Žiadne zobrazenia</string>
|
||||
<plurals name="views">
|
||||
<item quantity="one">%s zobrazenie</item>
|
||||
<item quantity="few">%s zobrazenia</item>
|
||||
<item quantity="many">%s zobrazení</item>
|
||||
<item quantity="other"></item>
|
||||
<item quantity="other">%s zobrazení</item>
|
||||
</plurals>
|
||||
|
||||
<string name="no_videos">Žiadne videá</string>
|
||||
<plurals name="videos">
|
||||
<item quantity="one">%s video</item>
|
||||
<item quantity="few">%s videá</item>
|
||||
<item quantity="many">%s videí</item>
|
||||
<item quantity="other"></item>
|
||||
<item quantity="other">%s videí</item>
|
||||
</plurals>
|
||||
|
||||
<string name="item_deleted">Položka bola odstránená</string>
|
||||
|
||||
@@ -227,7 +227,7 @@ odpiranje v pojavnem načinu</string>
|
||||
<string name="notification_channel_name">Obvestila NewPipe</string>
|
||||
<string name="notification_channel_description">Obvestila predvajalnika NewPipe</string>
|
||||
|
||||
<string name="contribution_title">Sodelovanje pri projektu</string>
|
||||
<string name="contribution_title">Doprinos k projektu</string>
|
||||
|
||||
<string name="title_activity_history">Zgodovina</string>
|
||||
<string name="title_history_search">Preiskano</string>
|
||||
@@ -291,4 +291,6 @@ odpiranje v pojavnem načinu</string>
|
||||
<string name="play_queue_remove">Odstrani</string>
|
||||
<string name="play_queue_stream_detail">Podrobnosti</string>
|
||||
<string name="play_queue_audio_settings">Nastavitve zvoka</string>
|
||||
<string name="donation_title">Donacija</string>
|
||||
<string name="website_title">Spletišče</string>
|
||||
</resources>
|
||||
|
||||
@@ -242,7 +242,7 @@
|
||||
<string name="app_license_title">NewPipes licens</string>
|
||||
<string name="contribution_encouragement">Vad du än har för idéer gällande översättning, designändringar, kod rengöring eller riktigt tunga så är hjälp alltid välkommet. Ju mer som görs desto bättre blir det!</string>
|
||||
<string name="read_full_license">Läs hela licensen</string>
|
||||
<string name="contribution_title">Bidrag</string>
|
||||
<string name="contribution_title">Bidra</string>
|
||||
|
||||
<string name="title_activity_history">Historik</string>
|
||||
<string name="title_history_search">Sökt</string>
|
||||
@@ -266,7 +266,7 @@
|
||||
|
||||
<string name="kiosk">Kiosk</string>
|
||||
<string name="trending">Trend</string>
|
||||
<string name="top_50">Top 50</string>
|
||||
<string name="top_50">Topp 50</string>
|
||||
<string name="new_and_hot">Aktuellt</string>
|
||||
<string name="title_activity_background_player">Bakgrunds-spelare</string>
|
||||
<string name="title_activity_popup_player">Popup-spelare</string>
|
||||
@@ -279,4 +279,9 @@
|
||||
<string name="start_here_on_main">Börja spela här</string>
|
||||
<string name="start_here_on_background">Börja här i bakgrunden</string>
|
||||
<string name="start_here_on_popup">Börja här i popup</string>
|
||||
</resources>
|
||||
<string name="donation_title">Donera</string>
|
||||
<string name="donation_encouragement">NewPipe utvecklas av frivilliga som spenderar sin fritid på att ge dig den bästa användarupplevelsen. Nu är det tid att ge tillbaka för att säkerställa att utvecklarna kan göra NewPipe ännu bättre medan de njuter av en kopp kaffe!</string>
|
||||
<string name="give_back">Ge tillbaka</string>
|
||||
<string name="website_title">Webbplats</string>
|
||||
<string name="website_encouragement">För att få mer information och de senaste nyheterna om NewPipe, besök vår webbplats.</string>
|
||||
</resources>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<resources>
|
||||
<string name="main_bg_subtitle">தொடங்குவதற்கு தேடல் பொத்தானை அழுத்தவும்</string>
|
||||
<string name="view_count_text">"%1$ பார்வைகள்"</string>
|
||||
<string name="view_count_text">"%1$s பார்வைகள்"</string>
|
||||
<string name="upload_date_text">"%1$s அன்று வெளியிடப்பட்டது"</string>
|
||||
<string name="no_player_found">ஸ்டீரீம் பிளேயர் கண்டறியப்படவில்லை. வில்சி நிருவ வேண்டுமா?</string>
|
||||
<string name="install">நிறுவ</string>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<resources>
|
||||
<string name="main_bg_subtitle">ప్రారంభించడానికి శోధనను క్లిక్</string>
|
||||
<string name="view_count_text">%1$s వీక్షణలు</string>
|
||||
<string name="upload_date_text">%1$\ts ప్రచురించబడింది</string>
|
||||
<string name="upload_date_text">%1$s ప్రచురించబడింది</string>
|
||||
<string name="install">ఇన్స్టాల్</string>
|
||||
<string name="cancel">రద్దు చేయి</string>
|
||||
<string name="open_in_browser">బ్రౌజర్ తెరవండి</string>
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
<string name="use_external_video_player_title">Sử dụng trình phát video bên ngoài</string>
|
||||
<string name="use_external_video_player_summary">Một số độ phân giải sẽ KHÔNG có âm thanh khi chế độ này</string>
|
||||
<string name="use_external_audio_player_title">Sử dụng trình phát âm thanh bên ngoài</string>
|
||||
<string name="popup_mode_share_menu_title">Chế độ Popup của NewPipe</string>
|
||||
<string name="popup_mode_share_menu_title">Chế độ popup của NewPipe</string>
|
||||
<string name="controls_popup_title">Chế độ Popup</string>
|
||||
|
||||
<string name="download_path_title">Đường dẫn tải xuống video</string>
|
||||
@@ -183,4 +183,10 @@
|
||||
<string name="settings_category_history_title">Lịch sử</string>
|
||||
<string name="playlist">Danh sách</string>
|
||||
<string name="search_no_results">Không tìm thấy</string>
|
||||
<string name="subscribe_button_title">Theo dõi</string>
|
||||
<string name="subscribed_button_title">Đang theo dõi</string>
|
||||
<string name="channel_unsubscribed">Đã dừng theo dõi kênh</string>
|
||||
<string name="subscription_change_failed">Không thể thay đổi tình trạng theo dõi</string>
|
||||
<string name="subscription_update_failed">Không thể cập nhật tình trạng theo dõi</string>
|
||||
|
||||
</resources>
|
||||
|
||||
@@ -46,6 +46,13 @@
|
||||
<item>144p</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="service_list" translatable="false">
|
||||
<item>@string/youtube</item>
|
||||
<item>@string/soundcloud</item>
|
||||
</string-array>
|
||||
<string name="service_key" translatable="false">service</string>
|
||||
<string name="default_service_value" translatable="false">@string/youtube</string>
|
||||
|
||||
<string name="video_mp4_key" translatable="false">video_mp4</string>
|
||||
<string name="video_webm_key" translatable="false">video_webm</string>
|
||||
<string name="video_3gp_key" translatable="false">video_3gp</string>
|
||||
@@ -100,7 +107,9 @@
|
||||
<string name="show_next_video_key" translatable="false">show_next_video</string>
|
||||
<string name="show_hold_to_append_key" translatable="false">show_hold_to_append</string>
|
||||
<string name="default_language_value">en</string>
|
||||
<string name="default_country_value">GB</string>
|
||||
<string name="search_language_key" translatable="false">search_language</string>
|
||||
<string name="content_country_key" translatable="false">content_country</string>
|
||||
<string name="show_age_restricted_content" translatable="false">show_age_restricted_content</string>
|
||||
<string name="use_tor_key" translatable="false">use_tor</string>
|
||||
<string name="enable_search_history_key" translatable="false">enable_search_history</string>
|
||||
@@ -140,7 +149,6 @@
|
||||
|
||||
<string name="default_file_charset_value" translatable="false">@string/charset_most_special_characters_value</string>
|
||||
|
||||
<!-- TODO: scrape these programmatically, then store in a local cache -->
|
||||
<!-- alternatively, load these from some local android data store -->
|
||||
<string-array name="language_codes" translatable="false">
|
||||
<item>af</item>
|
||||
@@ -300,4 +308,505 @@
|
||||
<item>日本語</item>
|
||||
<item>한국어</item>
|
||||
</string-array>
|
||||
|
||||
|
||||
<string-array name="country_names" translatable="false">
|
||||
<item>Afghanistan</item>
|
||||
<item>Aland Islands</item>
|
||||
<item>Albania</item>
|
||||
<item>Algeria</item>
|
||||
<item>American Samoa</item>
|
||||
<item>Andorra</item>
|
||||
<item>Angola</item>
|
||||
<item>Anguilla</item>
|
||||
<item>Antarctica</item>
|
||||
<item>Antiguaand Barbuda</item>
|
||||
<item>Argentina</item>
|
||||
<item>Armenia</item>
|
||||
<item>Aruba</item>
|
||||
<item>Australia</item>
|
||||
<item>Austria</item>
|
||||
<item>Azerbaijan</item>
|
||||
<item>Bahamas</item>
|
||||
<item>Bahrain</item>
|
||||
<item>Bangladesh</item>
|
||||
<item>Barbados</item>
|
||||
<item>Belarus</item>
|
||||
<item>Belgium</item>
|
||||
<item>Belize</item>
|
||||
<item>Benin</item>
|
||||
<item>Bermuda</item>
|
||||
<item>Bhutan</item>
|
||||
<item>Bolivia</item>
|
||||
<item>Bosniaand Herzegovina</item>
|
||||
<item>Botswana</item>
|
||||
<item>BouvetIsland</item>
|
||||
<item>Brazil</item>
|
||||
<item>British Virgin Islands</item>
|
||||
<item>British Indian Ocean Territory</item>
|
||||
<item>Brunei Darussalam</item>
|
||||
<item>Bulgaria</item>
|
||||
<item>Burkina Faso</item>
|
||||
<item>Burundi</item>
|
||||
<item>Cambodia</item>
|
||||
<item>Cameroon</item>
|
||||
<item>Canada</item>
|
||||
<item>CapeVerde</item>
|
||||
<item>Cayman Islands</item>
|
||||
<item>Central African Republic</item>
|
||||
<item>Chad</item>
|
||||
<item>Chile</item>
|
||||
<item>China</item>
|
||||
<item>HongKong, China</item>
|
||||
<item>Macao,China</item>
|
||||
<item>Christmas Island</item>
|
||||
<item>Cocos(Keeling) Islands</item>
|
||||
<item>Colombia</item>
|
||||
<item>Comoros</item>
|
||||
<item>Congo(Brazzaville)</item>
|
||||
<item>Congo, (Kinshasa)</item>
|
||||
<item>Cook Islands</item>
|
||||
<item>CostaRica</item>
|
||||
<item>Côted'Ivoire</item>
|
||||
<item>Croatia</item>
|
||||
<item>Cuba</item>
|
||||
<item>Cyprus</item>
|
||||
<item>Czech Republic</item>
|
||||
<item>Denmark</item>
|
||||
<item>Djibouti</item>
|
||||
<item>Dominica</item>
|
||||
<item>Dominican Republic</item>
|
||||
<item>Ecuador</item>
|
||||
<item>Egypt</item>
|
||||
<item>ElSalvador</item>
|
||||
<item>EquatorialGuinea</item>
|
||||
<item>Eritrea</item>
|
||||
<item>Estonia</item>
|
||||
<item>Ethiopia</item>
|
||||
<item>Falkland Islands (Malvinas)</item>
|
||||
<item>Faroe Islands</item>
|
||||
<item>Fiji</item>
|
||||
<item>Finland</item>
|
||||
<item>France</item>
|
||||
<item>French Guiana</item>
|
||||
<item>French Polynesia</item>
|
||||
<item>French Southern Territories</item>
|
||||
<item>Gabon</item>
|
||||
<item>Gambia</item>
|
||||
<item>Georgia</item>
|
||||
<item>Germany</item>
|
||||
<item>Ghana</item>
|
||||
<item>Gibraltar</item>
|
||||
<item>Greece</item>
|
||||
<item>Greenland</item>
|
||||
<item>Grenada</item>
|
||||
<item>Guadeloupe</item>
|
||||
<item>Guam</item>
|
||||
<item>Guatemala</item>
|
||||
<item>Guernsey</item>
|
||||
<item>Guinea</item>
|
||||
<item>Guinea-Bissau</item>
|
||||
<item>Guyana</item>
|
||||
<item>Haiti</item>
|
||||
<item>Heardand Mcdonald Islands</item>
|
||||
<item>HolySee (Vatican City State)</item>
|
||||
<item>Honduras</item>
|
||||
<item>Hungary</item>
|
||||
<item>Iceland</item>
|
||||
<item>India</item>
|
||||
<item>Indonesia</item>
|
||||
<item>Iran</item>
|
||||
<item>Iraq</item>
|
||||
<item>Ireland</item>
|
||||
<item>Isleof Man</item>
|
||||
<item>Israel</item>
|
||||
<item>Italy</item>
|
||||
<item>Jamaica</item>
|
||||
<item>Japan</item>
|
||||
<item>Jersey</item>
|
||||
<item>Jordan</item>
|
||||
<item>Kazakhstan</item>
|
||||
<item>Kenya</item>
|
||||
<item>Kiribati</item>
|
||||
<item>Korea(North)</item>
|
||||
<item>Korea(South)</item>
|
||||
<item>Kuwait</item>
|
||||
<item>Kyrgyzstan</item>
|
||||
<item>Lao</item>
|
||||
<item>Latvia</item>
|
||||
<item>Lebanon</item>
|
||||
<item>Lesotho</item>
|
||||
<item>Liberia</item>
|
||||
<item>Libya</item>
|
||||
<item>Liechtenstein</item>
|
||||
<item>Lithuania</item>
|
||||
<item>Luxembourg</item>
|
||||
<item>Macedonia</item>
|
||||
<item>Madagascar</item>
|
||||
<item>Malawi</item>
|
||||
<item>Malaysia</item>
|
||||
<item>Maldives</item>
|
||||
<item>Mali</item>
|
||||
<item>Malta</item>
|
||||
<item>MarshallIslands</item>
|
||||
<item>Martinique</item>
|
||||
<item>Mauritania</item>
|
||||
<item>Mauritius</item>
|
||||
<item>Mayotte</item>
|
||||
<item>Mexico</item>
|
||||
<item>Micronesia</item>
|
||||
<item>Moldova</item>
|
||||
<item>Monaco</item>
|
||||
<item>Mongolia</item>
|
||||
<item>Montenegro</item>
|
||||
<item>Montserrat</item>
|
||||
<item>Morocco</item>
|
||||
<item>Mozambique</item>
|
||||
<item>Myanmar</item>
|
||||
<item>Namibia</item>
|
||||
<item>Nauru</item>
|
||||
<item>Nepal</item>
|
||||
<item>Netherlands</item>
|
||||
<item>Netherlands Antilles</item>
|
||||
<item>New Caledonia</item>
|
||||
<item>New Zealand</item>
|
||||
<item>Nicaragua</item>
|
||||
<item>Niger</item>
|
||||
<item>Nigeria</item>
|
||||
<item>Niue</item>
|
||||
<item>Norfolk Island</item>
|
||||
<item>Northern Mariana Islands</item>
|
||||
<item>Norway</item>
|
||||
<item>Oman</item>
|
||||
<item>Pakistan</item>
|
||||
<item>Palau</item>
|
||||
<item>Palestinian Territory</item>
|
||||
<item>Panama</item>
|
||||
<item>Papua New Guinea</item>
|
||||
<item>Paraguay</item>
|
||||
<item>Peru</item>
|
||||
<item>Philippines</item>
|
||||
<item>Pitcairn</item>
|
||||
<item>Poland</item>
|
||||
<item>Portugal</item>
|
||||
<item>PuertoRico</item>
|
||||
<item>Qatar</item>
|
||||
<item>Réunion</item>
|
||||
<item>Romania</item>
|
||||
<item>Russian Federation</item>
|
||||
<item>Rwanda</item>
|
||||
<item>Saint-Barthélemy</item>
|
||||
<item>Saint Helena</item>
|
||||
<item>Saint KittsandNevis</item>
|
||||
<item>SaintLucia</item>
|
||||
<item>Saint-Martin(Frenchpart)</item>
|
||||
<item>SaintPierreandMiquelon</item>
|
||||
<item>Saint Vincentand Grenadines</item>
|
||||
<item>Samoa</item>
|
||||
<item>San Marino</item>
|
||||
<item>Sao Tomeand Principe</item>
|
||||
<item>SaudiArabia</item>
|
||||
<item>Senegal</item>
|
||||
<item>Serbia</item>
|
||||
<item>Seychelles</item>
|
||||
<item>SierraLeone</item>
|
||||
<item>Singapore</item>
|
||||
<item>Slovakia</item>
|
||||
<item>Slovenia</item>
|
||||
<item>SolomonIslands</item>
|
||||
<item>Somalia</item>
|
||||
<item>SouthAfrica</item>
|
||||
<item>South Georgiaandthe South Sandwich Islands</item>
|
||||
<item>South Sudan</item>
|
||||
<item>Spain</item>
|
||||
<item>Sri Lanka</item>
|
||||
<item>Sudan</item>
|
||||
<item>Suriname</item>
|
||||
<item>Svalbardand Jan Mayen Islands</item>
|
||||
<item>Swaziland</item>
|
||||
<item>Sweden</item>
|
||||
<item>Switzerland</item>
|
||||
<item>Syrian ArabRepublic(Syria)</item>
|
||||
<item>Taiwan, Republicof China</item>
|
||||
<item>Tajikistan</item>
|
||||
<item>Tanzania</item>
|
||||
<item>Thailand</item>
|
||||
<item>Timor-Leste</item>
|
||||
<item>Togo</item>
|
||||
<item>Tokelau</item>
|
||||
<item>Tonga</item>
|
||||
<item>Trinidadand Tobago</item>
|
||||
<item>Tunisia</item>
|
||||
<item>Turkey</item>
|
||||
<item>Turkmenistan</item>
|
||||
<item>Turksand Caicos Islands</item>
|
||||
<item>Tuvalu</item>
|
||||
<item>Uganda</item>
|
||||
<item>Ukraine</item>
|
||||
<item>United Arab Emirates</item>
|
||||
<item>United Kingdom</item>
|
||||
<item>USA</item>
|
||||
<item>Minor Outlying Islands</item>
|
||||
<item>Uruguay</item>
|
||||
<item>Uzbekistan</item>
|
||||
<item>Vanuatu</item>
|
||||
<item>Venezuela (BolivarianRepublic)</item>
|
||||
<item>VietNam</item>
|
||||
<item>Virgin Islands,</item>
|
||||
<item>Wallisand Futuna Islands</item>
|
||||
<item>Western Sahara</item>
|
||||
<item>Yemen</item>
|
||||
<item>Zambia</item>
|
||||
<item>Zimbabwe</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="country_codes" translatable="false">
|
||||
<item>AF</item>
|
||||
<item>AX</item>
|
||||
<item>AL</item>
|
||||
<item>DZ</item>
|
||||
<item>AS</item>
|
||||
<item>AD</item>
|
||||
<item>AO</item>
|
||||
<item>AI</item>
|
||||
<item>AQ</item>
|
||||
<item>AG</item>
|
||||
<item>AR</item>
|
||||
<item>AM</item>
|
||||
<item>AW</item>
|
||||
<item>AU</item>
|
||||
<item>AT</item>
|
||||
<item>AZ</item>
|
||||
<item>BS</item>
|
||||
<item>BH</item>
|
||||
<item>BD</item>
|
||||
<item>BB</item>
|
||||
<item>BY</item>
|
||||
<item>BE</item>
|
||||
<item>BZ</item>
|
||||
<item>BJ</item>
|
||||
<item>BM</item>
|
||||
<item>BT</item>
|
||||
<item>BO</item>
|
||||
<item>BA</item>
|
||||
<item>BW</item>
|
||||
<item>BV</item>
|
||||
<item>BR</item>
|
||||
<item>VG</item>
|
||||
<item>IO</item>
|
||||
<item>BN</item>
|
||||
<item>BG</item>
|
||||
<item>BF</item>
|
||||
<item>BI</item>
|
||||
<item>KH</item>
|
||||
<item>CM</item>
|
||||
<item>CA</item>
|
||||
<item>CV</item>
|
||||
<item>KY</item>
|
||||
<item>CF</item>
|
||||
<item>TD</item>
|
||||
<item>CL</item>
|
||||
<item>CN</item>
|
||||
<item>HK</item>
|
||||
<item>MO</item>
|
||||
<item>CX</item>
|
||||
<item>CC</item>
|
||||
<item>CO</item>
|
||||
<item>KM</item>
|
||||
<item>CG</item>
|
||||
<item>CD</item>
|
||||
<item>CK</item>
|
||||
<item>CR</item>
|
||||
<item>CI</item>
|
||||
<item>HR</item>
|
||||
<item>CU</item>
|
||||
<item>CY</item>
|
||||
<item>CZ</item>
|
||||
<item>DK</item>
|
||||
<item>DJ</item>
|
||||
<item>DM</item>
|
||||
<item>DO</item>
|
||||
<item>EC</item>
|
||||
<item>EG</item>
|
||||
<item>SV</item>
|
||||
<item>GQ</item>
|
||||
<item>ER</item>
|
||||
<item>EE</item>
|
||||
<item>ET</item>
|
||||
<item>FK</item>
|
||||
<item>FO</item>
|
||||
<item>FJ</item>
|
||||
<item>FI</item>
|
||||
<item>FR</item>
|
||||
<item>GF</item>
|
||||
<item>PF</item>
|
||||
<item>TF</item>
|
||||
<item>GA</item>
|
||||
<item>GM</item>
|
||||
<item>GE</item>
|
||||
<item>DE</item>
|
||||
<item>GH</item>
|
||||
<item>GI</item>
|
||||
<item>GR</item>
|
||||
<item>GL</item>
|
||||
<item>GD</item>
|
||||
<item>GP</item>
|
||||
<item>GU</item>
|
||||
<item>GT</item>
|
||||
<item>GG</item>
|
||||
<item>GN</item>
|
||||
<item>GW</item>
|
||||
<item>GY</item>
|
||||
<item>HT</item>
|
||||
<item>HM</item>
|
||||
<item>VA</item>
|
||||
<item>HN</item>
|
||||
<item>HU</item>
|
||||
<item>IS</item>
|
||||
<item>IN</item>
|
||||
<item>ID</item>
|
||||
<item>IR</item>
|
||||
<item>IQ</item>
|
||||
<item>IE</item>
|
||||
<item>IM</item>
|
||||
<item>IL</item>
|
||||
<item>IT</item>
|
||||
<item>JM</item>
|
||||
<item>JP</item>
|
||||
<item>JE</item>
|
||||
<item>JO</item>
|
||||
<item>KZ</item>
|
||||
<item>KE</item>
|
||||
<item>KI</item>
|
||||
<item>KP</item>
|
||||
<item>KR</item>
|
||||
<item>KW</item>
|
||||
<item>KG</item>
|
||||
<item>LA</item>
|
||||
<item>LV</item>
|
||||
<item>LB</item>
|
||||
<item>LS</item>
|
||||
<item>LR</item>
|
||||
<item>LY</item>
|
||||
<item>LI</item>
|
||||
<item>LT</item>
|
||||
<item>LU</item>
|
||||
<item>MK</item>
|
||||
<item>MG</item>
|
||||
<item>MW</item>
|
||||
<item>MY</item>
|
||||
<item>MV</item>
|
||||
<item>ML</item>
|
||||
<item>MT</item>
|
||||
<item>MH</item>
|
||||
<item>MQ</item>
|
||||
<item>MR</item>
|
||||
<item>MU</item>
|
||||
<item>YT</item>
|
||||
<item>MX</item>
|
||||
<item>FM</item>
|
||||
<item>MD</item>
|
||||
<item>MC</item>
|
||||
<item>MN</item>
|
||||
<item>ME</item>
|
||||
<item>MS</item>
|
||||
<item>MA</item>
|
||||
<item>MZ</item>
|
||||
<item>MM</item>
|
||||
<item>NA</item>
|
||||
<item>NR</item>
|
||||
<item>NP</item>
|
||||
<item>NL</item>
|
||||
<item>AN</item>
|
||||
<item>NC</item>
|
||||
<item>NZ</item>
|
||||
<item>NI</item>
|
||||
<item>NE</item>
|
||||
<item>NG</item>
|
||||
<item>NU</item>
|
||||
<item>NF</item>
|
||||
<item>MP</item>
|
||||
<item>NO</item>
|
||||
<item>OM</item>
|
||||
<item>PK</item>
|
||||
<item>PW</item>
|
||||
<item>PS</item>
|
||||
<item>PA</item>
|
||||
<item>PG</item>
|
||||
<item>PY</item>
|
||||
<item>PE</item>
|
||||
<item>PH</item>
|
||||
<item>PN</item>
|
||||
<item>PL</item>
|
||||
<item>PT</item>
|
||||
<item>PR</item>
|
||||
<item>QA</item>
|
||||
<item>RE</item>
|
||||
<item>RO</item>
|
||||
<item>RU</item>
|
||||
<item>RW</item>
|
||||
<item>BL</item>
|
||||
<item>SH</item>
|
||||
<item>KN</item>
|
||||
<item>LC</item>
|
||||
<item>MF</item>
|
||||
<item>PM</item>
|
||||
<item>VC</item>
|
||||
<item>WS</item>
|
||||
<item>SM</item>
|
||||
<item>ST</item>
|
||||
<item>SA</item>
|
||||
<item>SN</item>
|
||||
<item>RS</item>
|
||||
<item>SC</item>
|
||||
<item>SL</item>
|
||||
<item>SG</item>
|
||||
<item>SK</item>
|
||||
<item>SI</item>
|
||||
<item>SB</item>
|
||||
<item>SO</item>
|
||||
<item>ZA</item>
|
||||
<item>GS</item>
|
||||
<item>SS</item>
|
||||
<item>ES</item>
|
||||
<item>LK</item>
|
||||
<item>SD</item>
|
||||
<item>SR</item>
|
||||
<item>SJ</item>
|
||||
<item>SZ</item>
|
||||
<item>SE</item>
|
||||
<item>CH</item>
|
||||
<item>SY</item>
|
||||
<item>TW</item>
|
||||
<item>TJ</item>
|
||||
<item>TZ</item>
|
||||
<item>TH</item>
|
||||
<item>TL</item>
|
||||
<item>TG</item>
|
||||
<item>TK</item>
|
||||
<item>TO</item>
|
||||
<item>TT</item>
|
||||
<item>TN</item>
|
||||
<item>TR</item>
|
||||
<item>TM</item>
|
||||
<item>TC</item>
|
||||
<item>TV</item>
|
||||
<item>UG</item>
|
||||
<item>UA</item>
|
||||
<item>AE</item>
|
||||
<item>GB</item>
|
||||
<item>US</item>
|
||||
<item>UM</item>
|
||||
<item>UY</item>
|
||||
<item>UZ</item>
|
||||
<item>VU</item>
|
||||
<item>VE</item>
|
||||
<item>VN</item>
|
||||
<item>VI</item>
|
||||
<item>WF</item>
|
||||
<item>EH</item>
|
||||
<item>YE</item>
|
||||
<item>ZM</item>
|
||||
<item>ZW</item>
|
||||
</string-array>
|
||||
</resources>
|
||||
@@ -83,6 +83,8 @@
|
||||
<string name="show_hold_to_append_title">Show Hold to Append Tip</string>
|
||||
<string name="show_hold_to_append_summary">Show tip when background or popup button is pressed on video details page</string>
|
||||
<string name="url_not_supported_toast">URL not supported</string>
|
||||
<string name="default_content_country_title">Default content country</string>
|
||||
<string name="service_title">Service</string>
|
||||
<string name="search_language_title">Default content language</string>
|
||||
<string name="settings_category_player_title">Player</string>
|
||||
<string name="settings_category_player_behavior_title">Behavior</string>
|
||||
@@ -124,6 +126,11 @@
|
||||
|
||||
<string name="unknown_content">[Unknown]</string>
|
||||
|
||||
<string name="toggle_orientation">Toggle Orientation</string>
|
||||
<string name="switch_to_background">Switch to Background</string>
|
||||
<string name="switch_to_popup">Switch to Popup</string>
|
||||
<string name="switch_to_main">Switch to Main</string>
|
||||
|
||||
<!-- error strings -->
|
||||
<string name="general_error">Error</string>
|
||||
<string name="network_error">Network error</string>
|
||||
@@ -323,4 +330,10 @@
|
||||
<string name="start_here_on_main">Start Playing Here</string>
|
||||
<string name="start_here_on_background">Start Here on Background</string>
|
||||
<string name="start_here_on_popup">Start Here on Popup</string>
|
||||
|
||||
<!-- Drawer -->
|
||||
<string name="drawer_open">Open Drawer</string>
|
||||
<string name="drawer_close">Close Drawer</string>
|
||||
<string name="youtube" translatable="false">YouTube</string>
|
||||
<string name="soundcloud" translatable="false">SoundCloud</string>
|
||||
</resources>
|
||||
|
||||
@@ -2,7 +2,15 @@
|
||||
<PreferenceScreen
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:title="@string/content">
|
||||
<ListPreference
|
||||
android:defaultValue="@string/default_country_value"
|
||||
android:entries="@array/country_names"
|
||||
android:entryValues="@array/country_codes"
|
||||
android:key="@string/content_country_key"
|
||||
android:summary="%s"
|
||||
android:title="@string/default_content_country_title"/>
|
||||
|
||||
<!-- TODO: add support for this within code
|
||||
<ListPreference
|
||||
android:defaultValue="@string/default_language_value"
|
||||
android:entries="@array/language_names"
|
||||
@@ -10,6 +18,7 @@
|
||||
android:key="@string/search_language_key"
|
||||
android:summary="%s"
|
||||
android:title="@string/search_language_title"/>
|
||||
-->
|
||||
|
||||
<SwitchPreference
|
||||
android:defaultValue="false"
|
||||
@@ -28,5 +37,4 @@
|
||||
android:key="@string/main_page_content_key"
|
||||
android:title="@string/main_page_content"
|
||||
android:summary="%s"/>
|
||||
|
||||
</PreferenceScreen>
|
||||
|
||||
565
assets/new_pipe_icon_5_beta2.svg
Normal file
@@ -0,0 +1,565 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.1"
|
||||
id="svg2"
|
||||
viewBox="0 0 192 192"
|
||||
height="204.8"
|
||||
width="204.8"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="new_pipe_icon_5_beta2.svg"
|
||||
inkscape:export-filename="/home/the-scrabi/Projects/NewPipe/assets/new_pipe_icon_5.png"
|
||||
inkscape:export-xdpi="120"
|
||||
inkscape:export-ydpi="120">
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1021"
|
||||
id="namedview4149"
|
||||
showgrid="false"
|
||||
inkscape:zoom="3.6307263"
|
||||
inkscape:cx="129.93323"
|
||||
inkscape:cy="102.41566"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg2" />
|
||||
<defs
|
||||
id="defs4">
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient4447">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0.1"
|
||||
offset="0"
|
||||
id="stop4449" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0"
|
||||
offset="1"
|
||||
id="stop4451" />
|
||||
</linearGradient>
|
||||
<filter
|
||||
style="color-interpolation-filters:sRGB"
|
||||
inkscape:label="Drop Shadow"
|
||||
id="filter4454"
|
||||
width="1.4"
|
||||
height="1.4"
|
||||
x="-0.2"
|
||||
y="-0.2">
|
||||
<feFlood
|
||||
flood-opacity="0.427451"
|
||||
flood-color="rgb(0,0,0)"
|
||||
result="flood"
|
||||
id="feFlood4456" />
|
||||
<feComposite
|
||||
in="flood"
|
||||
in2="SourceGraphic"
|
||||
operator="in"
|
||||
result="composite1"
|
||||
id="feComposite4458" />
|
||||
<feGaussianBlur
|
||||
in="composite1"
|
||||
stdDeviation="10.9"
|
||||
result="blur"
|
||||
id="feGaussianBlur4460" />
|
||||
<feOffset
|
||||
dx="0"
|
||||
dy="7"
|
||||
result="offset"
|
||||
id="feOffset4462" />
|
||||
<feComposite
|
||||
in="SourceGraphic"
|
||||
in2="offset"
|
||||
operator="over"
|
||||
result="composite2"
|
||||
id="feComposite4464" />
|
||||
</filter>
|
||||
<filter
|
||||
style="color-interpolation-filters:sRGB"
|
||||
inkscape:label="Drop Shadow"
|
||||
id="filter4777">
|
||||
<feFlood
|
||||
flood-opacity="0.498039"
|
||||
flood-color="rgb(0,0,0)"
|
||||
result="flood"
|
||||
id="feFlood4779" />
|
||||
<feComposite
|
||||
in="flood"
|
||||
in2="SourceGraphic"
|
||||
operator="in"
|
||||
result="composite1"
|
||||
id="feComposite4781" />
|
||||
<feGaussianBlur
|
||||
in="composite1"
|
||||
stdDeviation="5.82011"
|
||||
result="blur"
|
||||
id="feGaussianBlur4783" />
|
||||
<feOffset
|
||||
dx="0"
|
||||
dy="5.6"
|
||||
result="offset"
|
||||
id="feOffset4785" />
|
||||
<feComposite
|
||||
in="SourceGraphic"
|
||||
in2="offset"
|
||||
operator="over"
|
||||
result="fbSourceGraphic"
|
||||
id="feComposite4787" />
|
||||
<feColorMatrix
|
||||
result="fbSourceGraphicAlpha"
|
||||
in="fbSourceGraphic"
|
||||
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
|
||||
id="feColorMatrix4789" />
|
||||
<feFlood
|
||||
id="feFlood4791"
|
||||
flood-opacity="0.498039"
|
||||
flood-color="rgb(0,0,0)"
|
||||
result="flood"
|
||||
in="fbSourceGraphic" />
|
||||
<feComposite
|
||||
id="feComposite4793"
|
||||
in2="fbSourceGraphic"
|
||||
in="flood"
|
||||
operator="in"
|
||||
result="composite1" />
|
||||
<feGaussianBlur
|
||||
id="feGaussianBlur4795"
|
||||
in="composite1"
|
||||
stdDeviation="5.8"
|
||||
result="blur" />
|
||||
<feOffset
|
||||
id="feOffset4797"
|
||||
dx="0"
|
||||
dy="5.6"
|
||||
result="offset" />
|
||||
<feComposite
|
||||
id="feComposite4799"
|
||||
in2="offset"
|
||||
in="fbSourceGraphic"
|
||||
operator="over"
|
||||
result="composite2" />
|
||||
</filter>
|
||||
<filter
|
||||
style="color-interpolation-filters:sRGB"
|
||||
inkscape:label="Drop Shadow"
|
||||
id="filter4885">
|
||||
<feFlood
|
||||
flood-opacity="0.498039"
|
||||
flood-color="rgb(0,0,0)"
|
||||
result="flood"
|
||||
id="feFlood4887" />
|
||||
<feComposite
|
||||
in="flood"
|
||||
in2="SourceGraphic"
|
||||
operator="in"
|
||||
result="composite1"
|
||||
id="feComposite4889" />
|
||||
<feGaussianBlur
|
||||
in="composite1"
|
||||
stdDeviation="7.9"
|
||||
result="blur"
|
||||
id="feGaussianBlur4891" />
|
||||
<feOffset
|
||||
dx="0"
|
||||
dy="2.54709"
|
||||
result="offset"
|
||||
id="feOffset4893" />
|
||||
<feComposite
|
||||
in="SourceGraphic"
|
||||
in2="offset"
|
||||
operator="over"
|
||||
result="fbSourceGraphic"
|
||||
id="feComposite4895" />
|
||||
<feColorMatrix
|
||||
result="fbSourceGraphicAlpha"
|
||||
in="fbSourceGraphic"
|
||||
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
|
||||
id="feColorMatrix4897" />
|
||||
<feFlood
|
||||
id="feFlood4899"
|
||||
flood-opacity="0.498039"
|
||||
flood-color="rgb(0,0,0)"
|
||||
result="flood"
|
||||
in="fbSourceGraphic" />
|
||||
<feComposite
|
||||
id="feComposite4901"
|
||||
in2="fbSourceGraphic"
|
||||
in="flood"
|
||||
operator="in"
|
||||
result="composite1" />
|
||||
<feGaussianBlur
|
||||
id="feGaussianBlur4903"
|
||||
in="composite1"
|
||||
stdDeviation="7.9"
|
||||
result="blur" />
|
||||
<feOffset
|
||||
id="feOffset4905"
|
||||
dx="0"
|
||||
dy="2.5"
|
||||
result="offset" />
|
||||
<feComposite
|
||||
id="feComposite4907"
|
||||
in2="offset"
|
||||
in="fbSourceGraphic"
|
||||
operator="over"
|
||||
result="composite2" />
|
||||
</filter>
|
||||
<filter
|
||||
style="color-interpolation-filters:sRGB"
|
||||
inkscape:label="Drop Shadow"
|
||||
id="filter4257">
|
||||
<feFlood
|
||||
flood-opacity="0.498039"
|
||||
flood-color="rgb(0,0,0)"
|
||||
result="flood"
|
||||
id="feFlood4259" />
|
||||
<feComposite
|
||||
in="flood"
|
||||
in2="SourceGraphic"
|
||||
operator="in"
|
||||
result="composite1"
|
||||
id="feComposite4261" />
|
||||
<feGaussianBlur
|
||||
in="composite1"
|
||||
stdDeviation="7.9"
|
||||
result="blur"
|
||||
id="feGaussianBlur4263" />
|
||||
<feOffset
|
||||
dx="0"
|
||||
dy="5.02645"
|
||||
result="offset"
|
||||
id="feOffset4265" />
|
||||
<feComposite
|
||||
in="SourceGraphic"
|
||||
in2="offset"
|
||||
operator="over"
|
||||
result="fbSourceGraphic"
|
||||
id="feComposite4267" />
|
||||
<feColorMatrix
|
||||
result="fbSourceGraphicAlpha"
|
||||
in="fbSourceGraphic"
|
||||
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0"
|
||||
id="feColorMatrix4269" />
|
||||
<feFlood
|
||||
id="feFlood4271"
|
||||
flood-opacity="0.498039"
|
||||
flood-color="rgb(0,0,0)"
|
||||
result="flood"
|
||||
in="fbSourceGraphic" />
|
||||
<feComposite
|
||||
id="feComposite4273"
|
||||
in2="fbSourceGraphic"
|
||||
in="flood"
|
||||
operator="in"
|
||||
result="composite1" />
|
||||
<feGaussianBlur
|
||||
id="feGaussianBlur4275"
|
||||
in="composite1"
|
||||
stdDeviation="7.9"
|
||||
result="blur" />
|
||||
<feOffset
|
||||
id="feOffset4277"
|
||||
dx="0"
|
||||
dy="5"
|
||||
result="offset" />
|
||||
<feComposite
|
||||
id="feComposite4279"
|
||||
in2="offset"
|
||||
in="fbSourceGraphic"
|
||||
operator="over"
|
||||
result="composite2" />
|
||||
</filter>
|
||||
<filter
|
||||
style="color-interpolation-filters:sRGB"
|
||||
inkscape:label="Drop Shadow"
|
||||
id="filter4192">
|
||||
<feFlood
|
||||
flood-opacity="0.498039"
|
||||
flood-color="rgb(0,0,0)"
|
||||
result="flood"
|
||||
id="feFlood4194" />
|
||||
<feComposite
|
||||
in="flood"
|
||||
in2="SourceGraphic"
|
||||
operator="in"
|
||||
result="composite1"
|
||||
id="feComposite4196" />
|
||||
<feGaussianBlur
|
||||
in="composite1"
|
||||
stdDeviation="7.7"
|
||||
result="blur"
|
||||
id="feGaussianBlur4198" />
|
||||
<feOffset
|
||||
dx="0"
|
||||
dy="5"
|
||||
result="offset"
|
||||
id="feOffset4200" />
|
||||
<feComposite
|
||||
in="SourceGraphic"
|
||||
in2="offset"
|
||||
operator="over"
|
||||
result="composite2"
|
||||
id="feComposite4202" />
|
||||
</filter>
|
||||
<filter
|
||||
style="color-interpolation-filters:sRGB"
|
||||
inkscape:label="Drop Shadow"
|
||||
id="filter4349">
|
||||
<feFlood
|
||||
flood-opacity="0.498039"
|
||||
flood-color="rgb(0,0,0)"
|
||||
result="flood"
|
||||
id="feFlood4351" />
|
||||
<feComposite
|
||||
in="flood"
|
||||
in2="SourceGraphic"
|
||||
operator="in"
|
||||
result="composite1"
|
||||
id="feComposite4353" />
|
||||
<feGaussianBlur
|
||||
in="composite1"
|
||||
stdDeviation="7.2"
|
||||
result="blur"
|
||||
id="feGaussianBlur4355" />
|
||||
<feOffset
|
||||
dx="0"
|
||||
dy="5"
|
||||
result="offset"
|
||||
id="feOffset4357" />
|
||||
<feComposite
|
||||
in="SourceGraphic"
|
||||
in2="offset"
|
||||
operator="over"
|
||||
result="composite2"
|
||||
id="feComposite4359" />
|
||||
</filter>
|
||||
<filter
|
||||
style="color-interpolation-filters:sRGB"
|
||||
inkscape:label="Drop Shadow"
|
||||
id="filter4361">
|
||||
<feFlood
|
||||
flood-opacity="0.498039"
|
||||
flood-color="rgb(0,0,0)"
|
||||
result="flood"
|
||||
id="feFlood4363" />
|
||||
<feComposite
|
||||
in="flood"
|
||||
in2="SourceGraphic"
|
||||
operator="in"
|
||||
result="composite1"
|
||||
id="feComposite4365" />
|
||||
<feGaussianBlur
|
||||
in="composite1"
|
||||
stdDeviation="5.3"
|
||||
result="blur"
|
||||
id="feGaussianBlur4367" />
|
||||
<feOffset
|
||||
dx="0"
|
||||
dy="5"
|
||||
result="offset"
|
||||
id="feOffset4369" />
|
||||
<feComposite
|
||||
in="SourceGraphic"
|
||||
in2="offset"
|
||||
operator="over"
|
||||
result="composite2"
|
||||
id="feComposite4371" />
|
||||
</filter>
|
||||
<filter
|
||||
style="color-interpolation-filters:sRGB"
|
||||
inkscape:label="Drop Shadow"
|
||||
id="filter4481">
|
||||
<feFlood
|
||||
flood-opacity="0.498039"
|
||||
flood-color="rgb(0,0,0)"
|
||||
result="flood"
|
||||
id="feFlood4483" />
|
||||
<feComposite
|
||||
in="flood"
|
||||
in2="SourceGraphic"
|
||||
operator="in"
|
||||
result="composite1"
|
||||
id="feComposite4485" />
|
||||
<feGaussianBlur
|
||||
in="composite1"
|
||||
stdDeviation="5"
|
||||
result="blur"
|
||||
id="feGaussianBlur4487" />
|
||||
<feOffset
|
||||
dx="0"
|
||||
dy="5"
|
||||
result="offset"
|
||||
id="feOffset4489" />
|
||||
<feComposite
|
||||
in="SourceGraphic"
|
||||
in2="offset"
|
||||
operator="over"
|
||||
result="composite2"
|
||||
id="feComposite4491" />
|
||||
</filter>
|
||||
<filter
|
||||
style="color-interpolation-filters:sRGB"
|
||||
inkscape:label="Drop Shadow"
|
||||
id="filter4433">
|
||||
<feFlood
|
||||
flood-opacity="0.2"
|
||||
flood-color="rgb(0,0,0)"
|
||||
result="flood"
|
||||
id="feFlood4435" />
|
||||
<feComposite
|
||||
in="flood"
|
||||
in2="SourceGraphic"
|
||||
operator="in"
|
||||
result="composite1"
|
||||
id="feComposite4437" />
|
||||
<feGaussianBlur
|
||||
in="composite1"
|
||||
stdDeviation="4"
|
||||
result="blur"
|
||||
id="feGaussianBlur4439" />
|
||||
<feOffset
|
||||
dx="0"
|
||||
dy="4"
|
||||
result="offset"
|
||||
id="feOffset4441" />
|
||||
<feComposite
|
||||
in="SourceGraphic"
|
||||
in2="offset"
|
||||
operator="over"
|
||||
result="composite2"
|
||||
id="feComposite4443" />
|
||||
</filter>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4447"
|
||||
id="radialGradient4453"
|
||||
cx="0.56012386"
|
||||
cy="0.35701406"
|
||||
fx="0.56012386"
|
||||
fy="0.35701406"
|
||||
r="88"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.00132321,2.1587518,-2.1815784,0.00133718,1.1369825,-1.4250071)" />
|
||||
<filter
|
||||
style="color-interpolation-filters:sRGB;"
|
||||
inkscape:label="Drop Shadow"
|
||||
id="filter4447">
|
||||
<feFlood
|
||||
flood-opacity="0.498039"
|
||||
flood-color="rgb(0,0,0)"
|
||||
result="flood"
|
||||
id="feFlood4449" />
|
||||
<feComposite
|
||||
in="flood"
|
||||
in2="SourceGraphic"
|
||||
operator="in"
|
||||
result="composite1"
|
||||
id="feComposite4451" />
|
||||
<feGaussianBlur
|
||||
in="composite1"
|
||||
stdDeviation="1"
|
||||
result="blur"
|
||||
id="feGaussianBlur4453" />
|
||||
<feOffset
|
||||
dx="0"
|
||||
dy="0"
|
||||
result="offset"
|
||||
id="feOffset4455" />
|
||||
<feComposite
|
||||
in="SourceGraphic"
|
||||
in2="offset"
|
||||
operator="over"
|
||||
result="composite2"
|
||||
id="feComposite4457" />
|
||||
</filter>
|
||||
</defs>
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<path
|
||||
style="opacity:1;fill:#ff7575;fill-opacity:1;stroke:none;stroke-width:17.10300064;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="path4144-9"
|
||||
r="88"
|
||||
cy="104"
|
||||
cx="88"
|
||||
d=""
|
||||
inkscape:connector-curvature="0" />
|
||||
<circle
|
||||
style="fill:#ff5252;fill-opacity:1;stroke:none;stroke-width:17.10300064;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="path4144-6"
|
||||
cx="88"
|
||||
cy="104"
|
||||
r="0" />
|
||||
<circle
|
||||
style="opacity:1;fill:#ff7575;fill-opacity:1;stroke:none;stroke-width:17.10300064;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter4433)"
|
||||
id="path4144-67"
|
||||
cx="96"
|
||||
cy="96"
|
||||
r="88" />
|
||||
<path
|
||||
style="opacity:1;fill:#cc4242;fill-opacity:1;stroke:none;stroke-width:17.10300064;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter4433)"
|
||||
id="path4144-5"
|
||||
sodipodi:type="arc"
|
||||
sodipodi:cx="96"
|
||||
sodipodi:cy="96"
|
||||
sodipodi:rx="88"
|
||||
sodipodi:ry="88"
|
||||
sodipodi:start="0"
|
||||
sodipodi:end="3.1387981"
|
||||
sodipodi:open="true"
|
||||
d="M 184,96 A 88,88 0 0 1 96.12296,183.99991 88,88 0 0 1 8.0003436,96.24592" />
|
||||
<ellipse
|
||||
style="fill:#cd201f;fill-opacity:1;stroke:none;stroke-width:17.10300064;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter4433)"
|
||||
id="path4144"
|
||||
cx="96"
|
||||
cy="96"
|
||||
rx="88"
|
||||
ry="87" />
|
||||
<circle
|
||||
style="opacity:1;fill:url(#radialGradient4453);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="path4445"
|
||||
cx="96.001984"
|
||||
cy="94.989021"
|
||||
r="88" />
|
||||
<path
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter4433)"
|
||||
d="m 68.234817,154.58953 17.847497,-11.37613 0.373296,-75.405673 45.92471,27.26706 -33.232668,19.162923 0,21.92836 L 168.18191,95.074787 68.141493,36.280281 Z"
|
||||
id="path4234"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccccccc" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-weight:normal;font-size:37.49999619px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter4447)"
|
||||
x="-141.68971"
|
||||
y="60.340179"
|
||||
id="text4215"
|
||||
sodipodi:linespacing="125%"
|
||||
transform="matrix(0.003067,-0.9999953,0.9999953,0.003067,0,0)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4217"
|
||||
x="-141.68971"
|
||||
y="60.340179">BETA</tspan></text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 16 KiB |
4
fixplurals.sh
Executable file
@@ -0,0 +1,4 @@
|
||||
#!/bin/bash
|
||||
|
||||
javac CheckTranslations.java
|
||||
find app/src -name "*.xml" | grep values | xargs java CheckTranslations -d -r
|
||||