mirror of
https://github.com/TeamNewPipe/NewPipe
synced 2025-09-25 08:00:55 +02:00
Compare commits
28 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
748f70ba87 | ||
![]() |
ec4757d6de | ||
![]() |
6447af8541 | ||
![]() |
209c1f8bc2 | ||
![]() |
6a37dfc35f | ||
![]() |
5e101a4d32 | ||
![]() |
c29ea4693d | ||
![]() |
7d0df7aa80 | ||
![]() |
1275d9a185 | ||
![]() |
75f2ced937 | ||
![]() |
cd2ac25ff6 | ||
![]() |
cbf9ec0901 | ||
![]() |
ede18ded40 | ||
![]() |
a446313119 | ||
![]() |
1a643126de | ||
![]() |
6fa72e4a52 | ||
![]() |
7f127ba52a | ||
![]() |
85d1888ba7 | ||
![]() |
2a15f5fb51 | ||
![]() |
7cd5af5e72 | ||
![]() |
cbdfb15117 | ||
![]() |
942e042933 | ||
![]() |
89f2cd6ec0 | ||
![]() |
f947856a61 | ||
![]() |
c4967532e4 | ||
![]() |
7dc560e1f2 | ||
![]() |
ab03198ba6 | ||
![]() |
6a8e38476f |
@@ -8,8 +8,8 @@ android {
|
||||
applicationId "org.schabi.newpipe"
|
||||
minSdkVersion 19
|
||||
targetSdkVersion 28
|
||||
versionCode 760
|
||||
versionName "0.17.1"
|
||||
versionCode 780
|
||||
versionName "0.17.3"
|
||||
|
||||
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
||||
vectorDrawables.useSupportLibrary = true
|
||||
@@ -57,8 +57,7 @@ dependencies {
|
||||
exclude module: 'support-annotations'
|
||||
})
|
||||
|
||||
implementation 'com.github.teamnewpipe:NewPipeExtractor:cfc72d8dc9d'
|
||||
|
||||
implementation 'com.github.teamnewpipe:NewPipeExtractor:6d504e08836b0b'
|
||||
testImplementation 'junit:junit:4.12'
|
||||
testImplementation 'org.mockito:mockito-core:2.23.0'
|
||||
|
||||
|
@@ -228,7 +228,20 @@
|
||||
<data android:scheme="http"/>
|
||||
<data android:scheme="https"/>
|
||||
<data android:host="invidio.us"/>
|
||||
<data android:host="dev.invidio.us"/>
|
||||
<data android:host="www.invidio.us"/>
|
||||
<data android:host="invidious.snopyta.org"/>
|
||||
<data android:host="de.invidious.snopyta.org"/>
|
||||
<data android:host="fi.invidious.snopyta.org"/>
|
||||
<data android:host="vid.wxzm.sx"/>
|
||||
<data android:host="invidious.kabi.tk"/>
|
||||
<data android:host="invidiou.sh"/>
|
||||
<data android:host="www.invidiou.sh"/>
|
||||
<data android:host="no.invidiou.sh"/>
|
||||
<data android:host="invidious.enkirton.net"/>
|
||||
<data android:host="tube.poal.co"/>
|
||||
<data android:host="invidious.13ad.de"/>
|
||||
<data android:host="yt.elukerio.org"/>
|
||||
<!-- video prefix -->
|
||||
<data android:pathPrefix="/embed/"/>
|
||||
<data android:pathPrefix="/watch"/>
|
||||
|
@@ -484,7 +484,6 @@ public class VideoDetailFragment
|
||||
videoDescriptionView.setMovementMethod(LinkMovementMethod.getInstance());
|
||||
videoDescriptionView.setAutoLinkMask(Linkify.WEB_URLS);
|
||||
|
||||
//thumbsRootLayout = rootView.findViewById(R.id.detail_thumbs_root_layout);
|
||||
thumbsUpTextView = rootView.findViewById(R.id.detail_thumbs_up_count_view);
|
||||
thumbsUpImageView = rootView.findViewById(R.id.detail_thumbs_up_img_view);
|
||||
thumbsDownTextView = rootView.findViewById(R.id.detail_thumbs_down_count_view);
|
||||
|
@@ -12,6 +12,7 @@ import android.support.annotation.Nullable;
|
||||
import android.support.annotation.StringRes;
|
||||
import android.support.v7.preference.Preference;
|
||||
import android.util.Log;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.nononsenseapps.filepicker.Utils;
|
||||
|
||||
@@ -34,6 +35,7 @@ public class DownloadSettingsFragment extends BasePreferenceFragment {
|
||||
|
||||
private String DOWNLOAD_PATH_VIDEO_PREFERENCE;
|
||||
private String DOWNLOAD_PATH_AUDIO_PREFERENCE;
|
||||
private String STORAGE_USE_SAF_PREFERENCE;
|
||||
|
||||
private Preference prefPathVideo;
|
||||
private Preference prefPathAudio;
|
||||
@@ -47,6 +49,7 @@ public class DownloadSettingsFragment extends BasePreferenceFragment {
|
||||
|
||||
DOWNLOAD_PATH_VIDEO_PREFERENCE = getString(R.string.download_path_video_key);
|
||||
DOWNLOAD_PATH_AUDIO_PREFERENCE = getString(R.string.download_path_audio_key);
|
||||
STORAGE_USE_SAF_PREFERENCE = getString(R.string.storage_use_saf);
|
||||
final String downloadStorageAsk = getString(R.string.downloads_storage_ask);
|
||||
|
||||
prefPathVideo = findPreference(DOWNLOAD_PATH_VIDEO_PREFERENCE);
|
||||
@@ -169,7 +172,10 @@ public class DownloadSettingsFragment extends BasePreferenceFragment {
|
||||
String key = preference.getKey();
|
||||
int request;
|
||||
|
||||
if (key.equals(DOWNLOAD_PATH_VIDEO_PREFERENCE)) {
|
||||
if (key.equals(STORAGE_USE_SAF_PREFERENCE)) {
|
||||
Toast.makeText(getContext(), R.string.download_choose_new_path, Toast.LENGTH_LONG).show();
|
||||
return true;
|
||||
} else if (key.equals(DOWNLOAD_PATH_VIDEO_PREFERENCE)) {
|
||||
request = REQUEST_DOWNLOAD_VIDEO_PATH;
|
||||
} else if (key.equals(DOWNLOAD_PATH_AUDIO_PREFERENCE)) {
|
||||
request = REQUEST_DOWNLOAD_AUDIO_PATH;
|
||||
|
@@ -19,6 +19,7 @@ import io.reactivex.disposables.Disposable;
|
||||
public class HistorySettingsFragment extends BasePreferenceFragment {
|
||||
private String cacheWipeKey;
|
||||
private String viewsHistoryClearKey;
|
||||
private String playbackStatesClearKey;
|
||||
private String searchHistoryClearKey;
|
||||
private HistoryRecordManager recordManager;
|
||||
private CompositeDisposable disposables;
|
||||
@@ -28,6 +29,7 @@ public class HistorySettingsFragment extends BasePreferenceFragment {
|
||||
super.onCreate(savedInstanceState);
|
||||
cacheWipeKey = getString(R.string.metadata_cache_wipe_key);
|
||||
viewsHistoryClearKey = getString(R.string.clear_views_history_key);
|
||||
playbackStatesClearKey = getString(R.string.clear_playback_states_key);
|
||||
searchHistoryClearKey = getString(R.string.clear_search_history_key);
|
||||
recordManager = new HistoryRecordManager(getActivity());
|
||||
disposables = new CompositeDisposable();
|
||||
@@ -63,7 +65,7 @@ public class HistorySettingsFragment extends BasePreferenceFragment {
|
||||
ErrorActivity.ErrorInfo.make(
|
||||
UserAction.DELETE_FROM_HISTORY,
|
||||
"none",
|
||||
"Delete view history",
|
||||
"Delete playback states",
|
||||
R.string.general_error)));
|
||||
|
||||
final Disposable onDelete = recordManager.deleteWholeStreamHistory()
|
||||
@@ -101,6 +103,33 @@ public class HistorySettingsFragment extends BasePreferenceFragment {
|
||||
.show();
|
||||
}
|
||||
|
||||
if (preference.getKey().equals(playbackStatesClearKey)) {
|
||||
new AlertDialog.Builder(getActivity())
|
||||
.setTitle(R.string.delete_playback_states_alert)
|
||||
.setNegativeButton(R.string.cancel, ((dialog, which) -> dialog.dismiss()))
|
||||
.setPositiveButton(R.string.delete, ((dialog, which) -> {
|
||||
|
||||
final Disposable onDeletePlaybackStates = recordManager.deleteCompelteStreamStateHistory()
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(
|
||||
howManyDeleted -> Toast.makeText(getActivity(),
|
||||
R.string.watch_history_states_deleted,
|
||||
Toast.LENGTH_SHORT).show(),
|
||||
throwable -> ErrorActivity.reportError(getContext(),
|
||||
throwable,
|
||||
SettingsActivity.class, null,
|
||||
ErrorActivity.ErrorInfo.make(
|
||||
UserAction.DELETE_FROM_HISTORY,
|
||||
"none",
|
||||
"Delete playback states",
|
||||
R.string.general_error)));
|
||||
|
||||
disposables.add(onDeletePlaybackStates);
|
||||
}))
|
||||
.create()
|
||||
.show();
|
||||
}
|
||||
|
||||
if (preference.getKey().equals(searchHistoryClearKey)) {
|
||||
new AlertDialog.Builder(getActivity())
|
||||
.setTitle(R.string.delete_search_history_alert)
|
||||
|
@@ -115,6 +115,12 @@ public class FilePickerActivityHelper extends com.nononsenseapps.filepicker.File
|
||||
super.onClickOk(view);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isItemVisible(@NonNull File file) {
|
||||
if (file.isDirectory() && file.isHidden()) return true;
|
||||
return super.isItemVisible(file);
|
||||
}
|
||||
|
||||
public File getBackTop() {
|
||||
if (getArguments() == null) return Environment.getExternalStorageDirectory();
|
||||
|
||||
|
@@ -1,7 +1,6 @@
|
||||
package us.shandian.giga.get;
|
||||
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
import android.util.Log;
|
||||
|
||||
import org.schabi.newpipe.Downloader;
|
||||
@@ -264,11 +263,7 @@ public class DownloadMission extends Mission {
|
||||
|
||||
|
||||
private void notify(int what) {
|
||||
Message m = new Message();
|
||||
m.what = what;
|
||||
m.obj = this;
|
||||
|
||||
mHandler.sendMessage(m);
|
||||
mHandler.obtainMessage(what, this).sendToTarget();
|
||||
}
|
||||
|
||||
synchronized void notifyProgress(long deltaLen) {
|
||||
@@ -408,6 +403,7 @@ public class DownloadMission extends Mission {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Start downloading with multiple threads.
|
||||
*/
|
||||
@@ -416,14 +412,20 @@ public class DownloadMission extends Mission {
|
||||
|
||||
// ensure that the previous state is completely paused.
|
||||
joinForThread(init);
|
||||
if (threads != null)
|
||||
if (threads != null) {
|
||||
for (Thread thread : threads) joinForThread(thread);
|
||||
threads = null;
|
||||
}
|
||||
|
||||
running = true;
|
||||
errCode = ERROR_NOTHING;
|
||||
|
||||
if (hasInvalidStorage()) {
|
||||
notifyError(ERROR_FILE_CREATION, null);
|
||||
return;
|
||||
}
|
||||
|
||||
if (current >= urls.length) {
|
||||
threads = null;
|
||||
runAsync(1, this::notifyFinished);
|
||||
return;
|
||||
}
|
||||
@@ -664,7 +666,7 @@ public class DownloadMission extends Mission {
|
||||
* @return {@code true} is this mission its "healthy", otherwise, {@code false}
|
||||
*/
|
||||
public boolean isCorrupt() {
|
||||
return (isPsFailed() || errCode == ERROR_POSTPROCESSING_HOLD) || isFinished() || hasInvalidStorage();
|
||||
return (isPsFailed() || errCode == ERROR_POSTPROCESSING_HOLD) || isFinished();
|
||||
}
|
||||
|
||||
private boolean doPostprocessing() {
|
||||
|
@@ -251,6 +251,7 @@ public class StoredFileHelper implements Serializable {
|
||||
public boolean existsAsFile() {
|
||||
if (source == null) return false;
|
||||
|
||||
// WARNING: DocumentFile.exists() and DocumentFile.isFile() methods are slow
|
||||
boolean exists = docFile == null ? ioFile.exists() : docFile.exists();
|
||||
boolean isFile = docFile == null ? ioFile.isFile() : docFile.isFile();// ¿docFile.isVirtual() means is no-physical?
|
||||
|
||||
|
@@ -424,10 +424,12 @@ public class DownloadManager {
|
||||
|
||||
boolean flag = false;
|
||||
for (DownloadMission mission : mMissionsPending) {
|
||||
if (mission.running || !mission.enqueued || mission.isFinished() || mission.hasInvalidStorage())
|
||||
if (mission.running || !mission.enqueued || mission.isFinished())
|
||||
continue;
|
||||
|
||||
resumeMission(mission);
|
||||
if (mission.errCode != DownloadMission.ERROR_NOTHING) continue;
|
||||
|
||||
if (mPrefQueueLimit) return true;
|
||||
flag = true;
|
||||
}
|
||||
|
@@ -9,6 +9,7 @@ import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.BitmapFactory;
|
||||
import android.net.ConnectivityManager;
|
||||
@@ -19,6 +20,7 @@ import android.net.Uri;
|
||||
import android.os.Binder;
|
||||
import android.os.Build;
|
||||
import android.os.Handler;
|
||||
import android.os.Handler.Callback;
|
||||
import android.os.IBinder;
|
||||
import android.os.Looper;
|
||||
import android.os.Message;
|
||||
@@ -88,14 +90,14 @@ public class DownloadManagerService extends Service {
|
||||
private Builder downloadDoneNotification = null;
|
||||
private StringBuilder downloadDoneList = null;
|
||||
|
||||
private final ArrayList<Handler> mEchoObservers = new ArrayList<>(1);
|
||||
private final ArrayList<Callback> mEchoObservers = new ArrayList<>(1);
|
||||
|
||||
private ConnectivityManager mConnectivityManager;
|
||||
private BroadcastReceiver mNetworkStateListener = null;
|
||||
private ConnectivityManager.NetworkCallback mNetworkStateListenerL = null;
|
||||
|
||||
private SharedPreferences mPrefs = null;
|
||||
private final SharedPreferences.OnSharedPreferenceChangeListener mPrefChangeListener = this::handlePreferenceChange;
|
||||
private final OnSharedPreferenceChangeListener mPrefChangeListener = this::handlePreferenceChange;
|
||||
|
||||
private boolean mLockAcquired = false;
|
||||
private LockManager mLock = null;
|
||||
@@ -128,12 +130,7 @@ public class DownloadManagerService extends Service {
|
||||
}
|
||||
|
||||
mBinder = new DownloadManagerBinder();
|
||||
mHandler = new Handler(Looper.myLooper()) {
|
||||
@Override
|
||||
public void handleMessage(Message msg) {
|
||||
DownloadManagerService.this.handleMessage(msg);
|
||||
}
|
||||
};
|
||||
mHandler = new Handler(this::handleMessage);
|
||||
|
||||
mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
|
||||
@@ -272,7 +269,7 @@ public class DownloadManagerService extends Service {
|
||||
return mBinder;
|
||||
}
|
||||
|
||||
public void handleMessage(Message msg) {
|
||||
private boolean handleMessage(@NonNull Message msg) {
|
||||
DownloadMission mission = (DownloadMission) msg.obj;
|
||||
|
||||
switch (msg.what) {
|
||||
@@ -300,14 +297,12 @@ public class DownloadManagerService extends Service {
|
||||
mFailedDownloads.delete(mFailedDownloads.indexOfValue(mission));
|
||||
|
||||
synchronized (mEchoObservers) {
|
||||
for (Handler handler : mEchoObservers) {
|
||||
Message echo = new Message();
|
||||
echo.what = msg.what;
|
||||
echo.obj = msg.obj;
|
||||
|
||||
handler.sendMessage(echo);
|
||||
for (Callback observer : mEchoObservers) {
|
||||
observer.handleMessage(msg);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private void handleConnectivityState(boolean updateOnly) {
|
||||
@@ -515,7 +510,7 @@ public class DownloadManagerService extends Service {
|
||||
return PendingIntent.getService(this, intent.hashCode(), intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
}
|
||||
|
||||
private void manageObservers(Handler handler, boolean add) {
|
||||
private void manageObservers(Callback handler, boolean add) {
|
||||
synchronized (mEchoObservers) {
|
||||
if (add) {
|
||||
mEchoObservers.add(handler);
|
||||
@@ -596,11 +591,11 @@ public class DownloadManagerService extends Service {
|
||||
);
|
||||
}
|
||||
|
||||
public void addMissionEventListener(Handler handler) {
|
||||
public void addMissionEventListener(Callback handler) {
|
||||
manageObservers(handler, true);
|
||||
}
|
||||
|
||||
public void removeMissionEventListener(Handler handler) {
|
||||
public void removeMissionEventListener(Callback handler) {
|
||||
manageObservers(handler, false);
|
||||
}
|
||||
|
||||
|
@@ -9,7 +9,6 @@ import android.net.Uri;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Build;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.os.Message;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
@@ -77,7 +76,7 @@ import static us.shandian.giga.get.DownloadMission.ERROR_TIMEOUT;
|
||||
import static us.shandian.giga.get.DownloadMission.ERROR_UNKNOWN_EXCEPTION;
|
||||
import static us.shandian.giga.get.DownloadMission.ERROR_UNKNOWN_HOST;
|
||||
|
||||
public class MissionAdapter extends Adapter<ViewHolder> {
|
||||
public class MissionAdapter extends Adapter<ViewHolder> implements Handler.Callback {
|
||||
private static final SparseArray<String> ALGORITHMS = new SparseArray<>();
|
||||
private static final String TAG = "MissionAdapter";
|
||||
private static final String UNDEFINED_PROGRESS = "--.-%";
|
||||
@@ -111,21 +110,7 @@ public class MissionAdapter extends Adapter<ViewHolder> {
|
||||
mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
|
||||
mLayout = R.layout.mission_item;
|
||||
|
||||
mHandler = new Handler(Looper.myLooper()) {
|
||||
@Override
|
||||
public void handleMessage(Message msg) {
|
||||
switch (msg.what) {
|
||||
case DownloadManagerService.MESSAGE_PROGRESS:
|
||||
case DownloadManagerService.MESSAGE_ERROR:
|
||||
case DownloadManagerService.MESSAGE_FINISHED:
|
||||
onServiceMessage(msg);
|
||||
break;
|
||||
}
|
||||
|
||||
if (mStartButton != null && mPauseButton != null)
|
||||
checkMasterButtonsVisibility();
|
||||
}
|
||||
};
|
||||
mHandler = new Handler(context.getMainLooper());
|
||||
|
||||
mEmptyMessage = emptyMessage;
|
||||
|
||||
@@ -403,29 +388,40 @@ public class MissionAdapter extends Adapter<ViewHolder> {
|
||||
return true;
|
||||
}
|
||||
|
||||
public Handler getMessenger() {
|
||||
return mHandler;
|
||||
}
|
||||
|
||||
private void onServiceMessage(@NonNull Message msg) {
|
||||
if (msg.what == DownloadManagerService.MESSAGE_PROGRESS) {
|
||||
setAutoRefresh(true);
|
||||
return;
|
||||
@Override
|
||||
public boolean handleMessage(@NonNull Message msg) {
|
||||
if (mStartButton != null && mPauseButton != null) {
|
||||
checkMasterButtonsVisibility();
|
||||
}
|
||||
|
||||
for (int i = 0; i < mPendingDownloadsItems.size(); i++) {
|
||||
ViewHolderItem h = mPendingDownloadsItems.get(i);
|
||||
switch (msg.what) {
|
||||
case DownloadManagerService.MESSAGE_PROGRESS:
|
||||
case DownloadManagerService.MESSAGE_ERROR:
|
||||
case DownloadManagerService.MESSAGE_FINISHED:
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
if (msg.what == DownloadManagerService.MESSAGE_PROGRESS) {
|
||||
setAutoRefresh(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
for (ViewHolderItem h : mPendingDownloadsItems) {
|
||||
if (h.item.mission != msg.obj) continue;
|
||||
|
||||
if (msg.what == DownloadManagerService.MESSAGE_FINISHED) {
|
||||
// DownloadManager should mark the download as finished
|
||||
applyChanges();
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
|
||||
updateProgress(h);
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private void showError(@NonNull DownloadMission mission) {
|
||||
@@ -563,16 +559,15 @@ public class MissionAdapter extends Adapter<ViewHolder> {
|
||||
updateProgress(h);
|
||||
return true;
|
||||
case R.id.retry:
|
||||
if (mission.hasInvalidStorage()) {
|
||||
if (mission.isPsRunning()) {
|
||||
mission.psContinue(true);
|
||||
} else {
|
||||
mDownloadManager.tryRecover(mission);
|
||||
if (mission.storage.isInvalid())
|
||||
mRecover.tryRecover(mission);
|
||||
else
|
||||
recoverMission(mission);
|
||||
|
||||
return true;
|
||||
}
|
||||
mission.psContinue(true);
|
||||
return true;
|
||||
case R.id.cancel:
|
||||
mission.psContinue(false);
|
||||
@@ -659,9 +654,13 @@ public class MissionAdapter extends Adapter<ViewHolder> {
|
||||
|
||||
public void checkMasterButtonsVisibility() {
|
||||
boolean[] state = mIterator.hasValidPendingMissions();
|
||||
setButtonVisible(mPauseButton, state[0]);
|
||||
setButtonVisible(mStartButton, state[1]);
|
||||
}
|
||||
|
||||
mPauseButton.setVisible(state[0]);
|
||||
mStartButton.setVisible(state[1]);
|
||||
private static void setButtonVisible(MenuItem button, boolean visible) {
|
||||
if (button.isVisible() != visible)
|
||||
button.setVisible(visible);
|
||||
}
|
||||
|
||||
public void ensurePausedMissions() {
|
||||
|
@@ -79,7 +79,7 @@ public class MissionsFragment extends Fragment {
|
||||
|
||||
setAdapterButtons();
|
||||
|
||||
mBinder.addMissionEventListener(mAdapter.getMessenger());
|
||||
mBinder.addMissionEventListener(mAdapter);
|
||||
mBinder.enableNotifications(false);
|
||||
|
||||
updateList();
|
||||
@@ -159,7 +159,7 @@ public class MissionsFragment extends Fragment {
|
||||
super.onDestroy();
|
||||
if (mBinder == null || mAdapter == null) return;
|
||||
|
||||
mBinder.removeMissionEventListener(mAdapter.getMessenger());
|
||||
mBinder.removeMissionEventListener(mAdapter);
|
||||
mBinder.enableNotifications(true);
|
||||
mContext.unbindService(mConnection);
|
||||
mAdapter.deleterDispose(true);
|
||||
@@ -197,12 +197,10 @@ public class MissionsFragment extends Fragment {
|
||||
return true;
|
||||
case R.id.start_downloads:
|
||||
item.setVisible(false);
|
||||
mPause.setVisible(true);
|
||||
mBinder.getDownloadManager().startAllMissions();
|
||||
return true;
|
||||
case R.id.pause_downloads:
|
||||
item.setVisible(false);
|
||||
mStart.setVisible(true);
|
||||
mBinder.getDownloadManager().pauseAllMissions(false);
|
||||
mAdapter.ensurePausedMissions();// update items view
|
||||
default:
|
||||
@@ -280,7 +278,7 @@ public class MissionsFragment extends Fragment {
|
||||
if (mAdapter != null) {
|
||||
mAdapter.deleterDispose(false);
|
||||
mForceUpdate = true;
|
||||
mBinder.removeMissionEventListener(mAdapter.getMessenger());
|
||||
mBinder.removeMissionEventListener(mAdapter);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -296,7 +294,7 @@ public class MissionsFragment extends Fragment {
|
||||
mAdapter.forceUpdate();
|
||||
}
|
||||
|
||||
mBinder.addMissionEventListener(mAdapter.getMessenger());
|
||||
mBinder.addMissionEventListener(mAdapter);
|
||||
mAdapter.checkMasterButtonsVisibility();
|
||||
}
|
||||
if (mBinder != null) mBinder.enableNotifications(false);
|
||||
|
@@ -17,6 +17,7 @@
|
||||
<string name="download_path_title">Carpeta de descarga de vídeo</string>
|
||||
<string name="download_path_summary">Ruta para almacenar los vídeos descargados</string>
|
||||
<string name="download_path_dialog_title">Introducir directorio de descargas para vídeos</string>
|
||||
<string name="download_choose_new_path">Cambie las carpetas de descarga para que tenga efecto</string>
|
||||
<string name="default_resolution_title">Resolución por defecto de vídeo</string>
|
||||
<string name="play_with_kodi_title">Reproducir con Kodi</string>
|
||||
<string name="kore_not_found">Aplicación Kore no encontrada. ¿Instalarla?</string>
|
||||
|
@@ -153,13 +153,14 @@
|
||||
<string name="enable_playback_resume_key" translatable="false">enable_playback_resume</string>
|
||||
<string name="enable_playback_state_lists_key" translatable="false">enable_playback_state_lists</string>
|
||||
|
||||
<string name="import_data">import_data</string>
|
||||
<string name="export_data">export_data</string>
|
||||
<string name="import_data" translatable="false">import_data</string>
|
||||
<string name="export_data" translatable="false">export_data</string>
|
||||
|
||||
<string name="download_thumbnail_key" translatable="false">download_thumbnail_key</string>
|
||||
|
||||
<string name="metadata_cache_wipe_key" translatable="false">cache_wipe_key</string>
|
||||
<string name="clear_views_history_key" translatable="false">clear_play_history</string>
|
||||
<string name="clear_playback_states_key" translatable="false">clear_playback_states</string>
|
||||
<string name="clear_search_history_key" translatable="false">clear_search_history</string>
|
||||
|
||||
<string name="downloads_storage_ask" translatable="false">downloads_storage_ask</string>
|
||||
|
@@ -47,6 +47,7 @@
|
||||
<string name="download_path_audio_title">Audio download folder</string>
|
||||
<string name="download_path_audio_summary">Downloaded audio is stored here</string>
|
||||
<string name="download_path_audio_dialog_title">Enter download path for audio files</string>
|
||||
<string name="download_choose_new_path">Change the download folders to take effect</string>
|
||||
<string name="autoplay_by_calling_app_title">Autoplay</string>
|
||||
<string name="autoplay_by_calling_app_summary">Plays a video when NewPipe is called from another app</string>
|
||||
<string name="default_resolution_title">Default resolution</string>
|
||||
@@ -171,9 +172,12 @@
|
||||
<string name="import_data_summary">Overrides your current history and subscriptions</string>
|
||||
<string name="export_data_summary">Export history, subscriptions and playlists</string>
|
||||
<string name="clear_views_history_title">Clear watch history</string>
|
||||
<string name="clear_views_history_summary">Deletes the history of played streams</string>
|
||||
<string name="clear_views_history_summary">Deletes the history of played streams and the playback positions</string>
|
||||
<string name="delete_view_history_alert">Delete entire watch history?</string>
|
||||
<string name="watch_history_deleted">Watch history deleted.</string>
|
||||
<string name="clear_playback_states_title">Delete playback positions</string>
|
||||
<string name="clear_playback_states_summary">Deletes all playback positions</string>
|
||||
<string name="delete_playback_states_alert">Delete all playback positions?</string>
|
||||
<string name="watch_history_states_deleted">Playback positions deleted.</string>
|
||||
<string name="clear_search_history_title">Clear search history</string>
|
||||
<string name="clear_search_history_summary">Deletes history of search keywords</string>
|
||||
|
@@ -51,6 +51,12 @@
|
||||
android:title="@string/clear_views_history_title"
|
||||
app:iconSpaceReserved="false" />
|
||||
|
||||
<Preference
|
||||
android:key="@string/clear_playback_states_key"
|
||||
android:summary="@string/clear_playback_states_summary"
|
||||
android:title="@string/clear_playback_states_title"
|
||||
app:iconSpaceReserved="false" />
|
||||
|
||||
<Preference
|
||||
android:key="@string/clear_search_history_key"
|
||||
android:summary="@string/clear_search_history_summary"
|
||||
|
4
fastlane/metadata/android/en-US/changelogs/770.txt
Normal file
4
fastlane/metadata/android/en-US/changelogs/770.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
Changes in 0.17.2
|
||||
|
||||
Fix
|
||||
• Fix no video was available
|
12
fastlane/metadata/android/en-US/changelogs/780.txt
Normal file
12
fastlane/metadata/android/en-US/changelogs/780.txt
Normal file
@@ -0,0 +1,12 @@
|
||||
Changes in 0.17.3
|
||||
|
||||
Improved
|
||||
• Added option to clear playback states #2550
|
||||
• Show hidden directories in the file picker #2591
|
||||
• Support URLs from `invidio.us` instances to be opened with NewPipe #2488
|
||||
• Add support for `music.youtube.com` URLs TeamNewPipe/NewPipeExtractor#194
|
||||
|
||||
Fixed
|
||||
• [YouTube] Fixed 'java.lang.IllegalArgumentException #192
|
||||
• [YouTube] Fixed live streams not working TeamNewPipe/NewPipeExtractor#195
|
||||
• Fixed performance problem in android pie when downloading a stream #2592
|
Reference in New Issue
Block a user