mirror of
				https://github.com/TeamNewPipe/NewPipe
				synced 2025-11-04 01:03:00 +00:00 
			
		
		
		
	Merge branch 'dev' into patch-7
This commit is contained in:
		@@ -106,7 +106,7 @@ public class App extends Application {
 | 
			
		||||
        // https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0#error-handling
 | 
			
		||||
        RxJavaPlugins.setErrorHandler(new Consumer<Throwable>() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void accept(@NonNull Throwable throwable) throws Exception {
 | 
			
		||||
            public void accept(@NonNull Throwable throwable) {
 | 
			
		||||
                Log.e(TAG, "RxJavaPlugins.ErrorHandler called with -> : " +
 | 
			
		||||
                        "throwable = [" + throwable.getClass().getName() + "]");
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -12,14 +12,12 @@ import android.view.View;
 | 
			
		||||
import com.nostra13.universalimageloader.core.ImageLoader;
 | 
			
		||||
import com.squareup.leakcanary.RefWatcher;
 | 
			
		||||
 | 
			
		||||
import org.schabi.newpipe.report.UserAction;
 | 
			
		||||
 | 
			
		||||
import icepick.Icepick;
 | 
			
		||||
import icepick.State;
 | 
			
		||||
 | 
			
		||||
public abstract class BaseFragment extends Fragment {
 | 
			
		||||
    protected final String TAG = getClass().getSimpleName() + "@" + Integer.toHexString(hashCode());
 | 
			
		||||
    protected boolean DEBUG = MainActivity.DEBUG;
 | 
			
		||||
    protected final boolean DEBUG = MainActivity.DEBUG;
 | 
			
		||||
 | 
			
		||||
    protected AppCompatActivity activity;
 | 
			
		||||
    public static final ImageLoader imageLoader = ImageLoader.getInstance();
 | 
			
		||||
 
 | 
			
		||||
@@ -43,7 +43,7 @@ public class Downloader implements org.schabi.newpipe.extractor.Downloader {
 | 
			
		||||
 | 
			
		||||
    private static Downloader instance;
 | 
			
		||||
    private String mCookies;
 | 
			
		||||
    private OkHttpClient client;
 | 
			
		||||
    private final OkHttpClient client;
 | 
			
		||||
 | 
			
		||||
    private Downloader(OkHttpClient.Builder builder) {
 | 
			
		||||
        this.client = builder
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,6 @@ package org.schabi.newpipe;
 | 
			
		||||
import android.content.Intent;
 | 
			
		||||
import android.content.SharedPreferences;
 | 
			
		||||
import android.content.pm.PackageManager;
 | 
			
		||||
import android.net.Uri;
 | 
			
		||||
import android.os.Build;
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import android.os.Handler;
 | 
			
		||||
@@ -66,8 +65,6 @@ import org.schabi.newpipe.util.ServiceHelper;
 | 
			
		||||
import org.schabi.newpipe.util.StateSaver;
 | 
			
		||||
import org.schabi.newpipe.util.ThemeHelper;
 | 
			
		||||
 | 
			
		||||
import static org.schabi.newpipe.extractor.InfoItem.InfoType.PLAYLIST;
 | 
			
		||||
 | 
			
		||||
public class MainActivity extends AppCompatActivity {
 | 
			
		||||
    private static final String TAG = "MainActivity";
 | 
			
		||||
    public static final boolean DEBUG = !BuildConfig.BUILD_TYPE.equals("release");
 | 
			
		||||
 
 | 
			
		||||
@@ -85,7 +85,7 @@ public class ReCaptchaActivity extends AppCompatActivity {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private class ReCaptchaWebViewClient extends WebViewClient {
 | 
			
		||||
        private Activity context;
 | 
			
		||||
        private final Activity context;
 | 
			
		||||
        private String mCookies;
 | 
			
		||||
 | 
			
		||||
        ReCaptchaWebViewClient(Activity ctx) {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,6 @@
 | 
			
		||||
package org.schabi.newpipe;
 | 
			
		||||
 | 
			
		||||
import android.annotation.SuppressLint;
 | 
			
		||||
import android.app.FragmentManager;
 | 
			
		||||
import android.app.IntentService;
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.content.DialogInterface;
 | 
			
		||||
@@ -13,7 +12,6 @@ import android.preference.PreferenceManager;
 | 
			
		||||
import android.support.annotation.DrawableRes;
 | 
			
		||||
import android.support.annotation.NonNull;
 | 
			
		||||
import android.support.annotation.Nullable;
 | 
			
		||||
import android.support.v4.app.Fragment;
 | 
			
		||||
import android.support.v4.app.NotificationCompat;
 | 
			
		||||
import android.support.v7.app.AlertDialog;
 | 
			
		||||
import android.support.v7.app.AppCompatActivity;
 | 
			
		||||
@@ -38,7 +36,6 @@ import org.schabi.newpipe.extractor.exceptions.ExtractionException;
 | 
			
		||||
import org.schabi.newpipe.extractor.playlist.PlaylistInfo;
 | 
			
		||||
import org.schabi.newpipe.extractor.stream.StreamInfo;
 | 
			
		||||
import org.schabi.newpipe.extractor.stream.VideoStream;
 | 
			
		||||
import org.schabi.newpipe.fragments.detail.VideoDetailFragment;
 | 
			
		||||
import org.schabi.newpipe.player.helper.PlayerHelper;
 | 
			
		||||
import org.schabi.newpipe.player.playqueue.ChannelPlayQueue;
 | 
			
		||||
import org.schabi.newpipe.player.playqueue.PlayQueue;
 | 
			
		||||
@@ -51,14 +48,12 @@ import org.schabi.newpipe.util.NavigationHelper;
 | 
			
		||||
import org.schabi.newpipe.util.PermissionHelper;
 | 
			
		||||
import org.schabi.newpipe.util.ThemeHelper;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.Collection;
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Observer;
 | 
			
		||||
 | 
			
		||||
import icepick.Icepick;
 | 
			
		||||
import icepick.State;
 | 
			
		||||
@@ -86,7 +81,7 @@ public class RouterActivity extends AppCompatActivity {
 | 
			
		||||
    protected int selectedPreviously = -1;
 | 
			
		||||
 | 
			
		||||
    protected String currentUrl;
 | 
			
		||||
    protected CompositeDisposable disposables = new CompositeDisposable();
 | 
			
		||||
    protected final CompositeDisposable disposables = new CompositeDisposable();
 | 
			
		||||
 | 
			
		||||
    private boolean selectionIsDownload = false;
 | 
			
		||||
 | 
			
		||||
@@ -184,12 +179,16 @@ public class RouterActivity extends AppCompatActivity {
 | 
			
		||||
        if (selectedChoiceKey.equals(alwaysAskKey)) {
 | 
			
		||||
            final List<AdapterChoiceItem> choices = getChoicesForService(currentService, currentLinkType);
 | 
			
		||||
 | 
			
		||||
            if (choices.size() == 1) {
 | 
			
		||||
                handleChoice(choices.get(0).key);
 | 
			
		||||
            } else if (choices.size() == 0) {
 | 
			
		||||
                handleChoice(showInfoKey);
 | 
			
		||||
            } else {
 | 
			
		||||
                showDialog(choices);
 | 
			
		||||
            switch (choices.size()) {
 | 
			
		||||
                case 1:
 | 
			
		||||
                    handleChoice(choices.get(0).key);
 | 
			
		||||
                    break;
 | 
			
		||||
                case 0:
 | 
			
		||||
                    handleChoice(showInfoKey);
 | 
			
		||||
                    break;
 | 
			
		||||
                default:
 | 
			
		||||
                    showDialog(choices);
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
        } else if (selectedChoiceKey.equals(showInfoKey)) {
 | 
			
		||||
            handleChoice(showInfoKey);
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,6 @@ import android.app.Activity;
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.content.DialogInterface;
 | 
			
		||||
import android.os.AsyncTask;
 | 
			
		||||
import android.support.annotation.NonNull;
 | 
			
		||||
import android.support.annotation.Nullable;
 | 
			
		||||
import android.support.v7.app.AlertDialog;
 | 
			
		||||
import android.webkit.WebView;
 | 
			
		||||
@@ -17,7 +16,7 @@ import java.lang.ref.WeakReference;
 | 
			
		||||
 | 
			
		||||
public class LicenseFragmentHelper extends AsyncTask<Object, Void, Integer> {
 | 
			
		||||
 | 
			
		||||
    WeakReference<Activity> weakReference;
 | 
			
		||||
    final WeakReference<Activity> weakReference;
 | 
			
		||||
    private License license;
 | 
			
		||||
 | 
			
		||||
    public LicenseFragmentHelper(@Nullable Activity activity) {
 | 
			
		||||
@@ -78,18 +77,18 @@ public class LicenseFragmentHelper extends AsyncTask<Object, Void, Integer> {
 | 
			
		||||
            throw new NullPointerException("license is null");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        String licenseContent = "";
 | 
			
		||||
        StringBuilder licenseContent = new StringBuilder();
 | 
			
		||||
        String webViewData;
 | 
			
		||||
        try {
 | 
			
		||||
            BufferedReader in = new BufferedReader(new InputStreamReader(context.getAssets().open(license.getFilename()), "UTF-8"));
 | 
			
		||||
            String str;
 | 
			
		||||
            while ((str = in.readLine()) != null) {
 | 
			
		||||
                licenseContent += str;
 | 
			
		||||
                licenseContent.append(str);
 | 
			
		||||
            }
 | 
			
		||||
            in.close();
 | 
			
		||||
 | 
			
		||||
            // split the HTML file and insert the stylesheet into the HEAD of the file
 | 
			
		||||
            String[] insert = licenseContent.split("</head>");
 | 
			
		||||
            String[] insert = licenseContent.toString().split("</head>");
 | 
			
		||||
            webViewData = insert[0] + "<style type=\"text/css\">"
 | 
			
		||||
                    + getLicenseStylesheet(context) + "</style></head>"
 | 
			
		||||
                    + insert[1];
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,7 @@ public interface BasicDAO<Entity> {
 | 
			
		||||
 | 
			
		||||
    /* Deletes */
 | 
			
		||||
    @Delete
 | 
			
		||||
    int delete(final Entity entity);
 | 
			
		||||
    void delete(final Entity entity);
 | 
			
		||||
 | 
			
		||||
    @Delete
 | 
			
		||||
    int delete(final Collection<Entity> entities);
 | 
			
		||||
@@ -42,5 +42,5 @@ public interface BasicDAO<Entity> {
 | 
			
		||||
    int update(final Entity entity);
 | 
			
		||||
 | 
			
		||||
    @Update
 | 
			
		||||
    int update(final Collection<Entity> entities);
 | 
			
		||||
    void update(final Collection<Entity> entities);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,6 @@ import android.arch.persistence.room.Dao;
 | 
			
		||||
import android.arch.persistence.room.Query;
 | 
			
		||||
import android.support.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
import org.schabi.newpipe.database.BasicDAO;
 | 
			
		||||
import org.schabi.newpipe.database.history.model.SearchHistoryEntry;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,6 @@ import android.arch.persistence.room.Dao;
 | 
			
		||||
import android.arch.persistence.room.Query;
 | 
			
		||||
import android.support.annotation.Nullable;
 | 
			
		||||
 | 
			
		||||
import org.schabi.newpipe.database.BasicDAO;
 | 
			
		||||
import org.schabi.newpipe.database.history.model.StreamHistoryEntry;
 | 
			
		||||
import org.schabi.newpipe.database.stream.StreamStatisticsEntry;
 | 
			
		||||
import org.schabi.newpipe.database.history.model.StreamHistoryEntity;
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,6 @@ package org.schabi.newpipe.database.playlist.dao;
 | 
			
		||||
 | 
			
		||||
import android.arch.persistence.room.Dao;
 | 
			
		||||
import android.arch.persistence.room.Query;
 | 
			
		||||
import android.arch.persistence.room.Transaction;
 | 
			
		||||
 | 
			
		||||
import org.schabi.newpipe.database.BasicDAO;
 | 
			
		||||
import org.schabi.newpipe.database.playlist.model.PlaylistEntity;
 | 
			
		||||
@@ -12,7 +11,6 @@ import java.util.List;
 | 
			
		||||
import io.reactivex.Flowable;
 | 
			
		||||
 | 
			
		||||
import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_ID;
 | 
			
		||||
import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_NAME;
 | 
			
		||||
import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_TABLE;
 | 
			
		||||
 | 
			
		||||
@Dao
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,6 @@ import org.schabi.newpipe.database.BasicDAO;
 | 
			
		||||
import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry;
 | 
			
		||||
import org.schabi.newpipe.database.playlist.PlaylistStreamEntry;
 | 
			
		||||
import org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity;
 | 
			
		||||
import org.schabi.newpipe.database.stream.model.StreamEntity;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -5,8 +5,6 @@ import android.arch.persistence.room.Entity;
 | 
			
		||||
import android.arch.persistence.room.Index;
 | 
			
		||||
import android.arch.persistence.room.PrimaryKey;
 | 
			
		||||
 | 
			
		||||
import java.util.Date;
 | 
			
		||||
 | 
			
		||||
import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_NAME;
 | 
			
		||||
import static org.schabi.newpipe.database.playlist.model.PlaylistEntity.PLAYLIST_TABLE;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,6 @@ import android.arch.persistence.room.Ignore;
 | 
			
		||||
import android.arch.persistence.room.Index;
 | 
			
		||||
import android.arch.persistence.room.PrimaryKey;
 | 
			
		||||
 | 
			
		||||
import org.schabi.newpipe.database.LocalItem;
 | 
			
		||||
import org.schabi.newpipe.database.playlist.PlaylistLocalItem;
 | 
			
		||||
import org.schabi.newpipe.extractor.playlist.PlaylistInfo;
 | 
			
		||||
import org.schabi.newpipe.util.Constants;
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,6 @@ import org.schabi.newpipe.database.BasicDAO;
 | 
			
		||||
import org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity;
 | 
			
		||||
import org.schabi.newpipe.database.stream.model.StreamEntity;
 | 
			
		||||
import org.schabi.newpipe.database.history.model.StreamHistoryEntity;
 | 
			
		||||
import org.schabi.newpipe.database.stream.model.StreamStateEntity;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
@@ -23,7 +22,6 @@ import static org.schabi.newpipe.database.stream.model.StreamEntity.STREAM_SERVI
 | 
			
		||||
import static org.schabi.newpipe.database.stream.model.StreamEntity.STREAM_TABLE;
 | 
			
		||||
import static org.schabi.newpipe.database.stream.model.StreamEntity.STREAM_URL;
 | 
			
		||||
import static org.schabi.newpipe.database.history.model.StreamHistoryEntity.STREAM_HISTORY_TABLE;
 | 
			
		||||
import static org.schabi.newpipe.database.stream.model.StreamStateEntity.STREAM_STATE_TABLE;
 | 
			
		||||
 | 
			
		||||
@Dao
 | 
			
		||||
public abstract class StreamDAO implements BasicDAO<StreamEntity> {
 | 
			
		||||
 
 | 
			
		||||
@@ -28,11 +28,11 @@ public class DeleteDownloadManager {
 | 
			
		||||
 | 
			
		||||
    private static final String KEY_STATE = "delete_manager_state";
 | 
			
		||||
 | 
			
		||||
    private View mView;
 | 
			
		||||
    private HashSet<String> mPendingMap;
 | 
			
		||||
    private List<Disposable> mDisposableList;
 | 
			
		||||
    private final View mView;
 | 
			
		||||
    private final HashSet<String> mPendingMap;
 | 
			
		||||
    private final List<Disposable> mDisposableList;
 | 
			
		||||
    private DownloadManager mDownloadManager;
 | 
			
		||||
    private PublishSubject<DownloadMission> publishSubject = PublishSubject.create();
 | 
			
		||||
    private final PublishSubject<DownloadMission> publishSubject = PublishSubject.create();
 | 
			
		||||
 | 
			
		||||
    DeleteDownloadManager(Activity activity) {
 | 
			
		||||
        mPendingMap = new HashSet<>();
 | 
			
		||||
 
 | 
			
		||||
@@ -55,7 +55,7 @@ public class DownloadDialog extends DialogFragment implements RadioGroup.OnCheck
 | 
			
		||||
    private StreamItemAdapter<AudioStream> audioStreamsAdapter;
 | 
			
		||||
    private StreamItemAdapter<VideoStream> videoStreamsAdapter;
 | 
			
		||||
 | 
			
		||||
    private CompositeDisposable disposables = new CompositeDisposable();
 | 
			
		||||
    private final CompositeDisposable disposables = new CompositeDisposable();
 | 
			
		||||
 | 
			
		||||
    private EditText nameEditText;
 | 
			
		||||
    private Spinner streamsSpinner;
 | 
			
		||||
 
 | 
			
		||||
@@ -32,7 +32,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
 | 
			
		||||
 | 
			
		||||
import icepick.State;
 | 
			
		||||
import io.reactivex.android.schedulers.AndroidSchedulers;
 | 
			
		||||
import io.reactivex.functions.Consumer;
 | 
			
		||||
 | 
			
		||||
import static org.schabi.newpipe.util.AnimationUtils.animateView;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,6 @@ package org.schabi.newpipe.fragments;
 | 
			
		||||
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import android.support.annotation.Nullable;
 | 
			
		||||
import android.util.Log;
 | 
			
		||||
import android.view.LayoutInflater;
 | 
			
		||||
import android.view.View;
 | 
			
		||||
import android.view.ViewGroup;
 | 
			
		||||
 
 | 
			
		||||
@@ -3,9 +3,9 @@ package org.schabi.newpipe.fragments.detail;
 | 
			
		||||
import java.io.Serializable;
 | 
			
		||||
 | 
			
		||||
class StackItem implements Serializable {
 | 
			
		||||
    private int serviceId;
 | 
			
		||||
    private final int serviceId;
 | 
			
		||||
    private String title;
 | 
			
		||||
    private String url;
 | 
			
		||||
    private final String url;
 | 
			
		||||
 | 
			
		||||
    StackItem(int serviceId, String url, String title) {
 | 
			
		||||
        this.serviceId = serviceId;
 | 
			
		||||
 
 | 
			
		||||
@@ -760,7 +760,7 @@ public class VideoDetailFragment
 | 
			
		||||
     * Stack that contains the "navigation history".<br>
 | 
			
		||||
     * The peek is the current video.
 | 
			
		||||
     */
 | 
			
		||||
    protected LinkedList<StackItem> stack = new LinkedList<>();
 | 
			
		||||
    protected final LinkedList<StackItem> stack = new LinkedList<>();
 | 
			
		||||
 | 
			
		||||
    public void clearHistory() {
 | 
			
		||||
        stack.clear();
 | 
			
		||||
 
 | 
			
		||||
@@ -8,9 +8,6 @@ import android.view.View;
 | 
			
		||||
 | 
			
		||||
import org.schabi.newpipe.extractor.ListExtractor;
 | 
			
		||||
import org.schabi.newpipe.extractor.ListInfo;
 | 
			
		||||
import org.schabi.newpipe.extractor.NewPipe;
 | 
			
		||||
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;
 | 
			
		||||
import org.schabi.newpipe.extractor.linkhandler.LinkHandler;
 | 
			
		||||
import org.schabi.newpipe.util.Constants;
 | 
			
		||||
 | 
			
		||||
import java.util.Queue;
 | 
			
		||||
@@ -19,7 +16,6 @@ import icepick.State;
 | 
			
		||||
import io.reactivex.Single;
 | 
			
		||||
import io.reactivex.android.schedulers.AndroidSchedulers;
 | 
			
		||||
import io.reactivex.disposables.Disposable;
 | 
			
		||||
import io.reactivex.functions.Consumer;
 | 
			
		||||
import io.reactivex.schedulers.Schedulers;
 | 
			
		||||
 | 
			
		||||
public abstract class BaseListInfoFragment<I extends ListInfo>
 | 
			
		||||
 
 | 
			
		||||
@@ -68,7 +68,7 @@ import static org.schabi.newpipe.util.AnimationUtils.animateView;
 | 
			
		||||
 | 
			
		||||
public class ChannelFragment extends BaseListInfoFragment<ChannelInfo> {
 | 
			
		||||
 | 
			
		||||
    private CompositeDisposable disposables = new CompositeDisposable();
 | 
			
		||||
    private final CompositeDisposable disposables = new CompositeDisposable();
 | 
			
		||||
    private Disposable subscribeButtonMonitor;
 | 
			
		||||
    private SubscriptionService subscriptionService;
 | 
			
		||||
 | 
			
		||||
@@ -90,8 +90,6 @@ public class ChannelFragment extends BaseListInfoFragment<ChannelInfo> {
 | 
			
		||||
 | 
			
		||||
    private MenuItem menuRssButton;
 | 
			
		||||
 | 
			
		||||
    private boolean mIsVisibleToUser = false;
 | 
			
		||||
 | 
			
		||||
    public static ChannelFragment getInstance(int serviceId, String url, String name) {
 | 
			
		||||
        ChannelFragment instance = new ChannelFragment();
 | 
			
		||||
        instance.setInitialData(serviceId, url, name);
 | 
			
		||||
@@ -105,7 +103,6 @@ public class ChannelFragment extends BaseListInfoFragment<ChannelInfo> {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void setUserVisibleHint(boolean isVisibleToUser) {
 | 
			
		||||
        super.setUserVisibleHint(isVisibleToUser);
 | 
			
		||||
        mIsVisibleToUser = isVisibleToUser;
 | 
			
		||||
        if(activity != null
 | 
			
		||||
                && useAsFrontPage
 | 
			
		||||
                && isVisibleToUser) {
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,6 @@ 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;
 | 
			
		||||
@@ -19,8 +18,6 @@ import org.schabi.newpipe.extractor.StreamingService;
 | 
			
		||||
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
 | 
			
		||||
import org.schabi.newpipe.extractor.kiosk.KioskInfo;
 | 
			
		||||
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandlerFactory;
 | 
			
		||||
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;
 | 
			
		||||
import org.schabi.newpipe.extractor.linkhandler.LinkHandlerFactory;
 | 
			
		||||
import org.schabi.newpipe.fragments.list.BaseListInfoFragment;
 | 
			
		||||
import org.schabi.newpipe.report.UserAction;
 | 
			
		||||
import org.schabi.newpipe.util.ExtractorHelper;
 | 
			
		||||
 
 | 
			
		||||
@@ -20,7 +20,6 @@ import android.widget.TextView;
 | 
			
		||||
 | 
			
		||||
import org.reactivestreams.Subscriber;
 | 
			
		||||
import org.reactivestreams.Subscription;
 | 
			
		||||
import org.schabi.newpipe.App;
 | 
			
		||||
import org.schabi.newpipe.NewPipeDatabase;
 | 
			
		||||
import org.schabi.newpipe.R;
 | 
			
		||||
import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity;
 | 
			
		||||
@@ -30,7 +29,6 @@ import org.schabi.newpipe.extractor.NewPipe;
 | 
			
		||||
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
 | 
			
		||||
import org.schabi.newpipe.extractor.playlist.PlaylistInfo;
 | 
			
		||||
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
 | 
			
		||||
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;
 | 
			
		||||
import org.schabi.newpipe.fragments.list.BaseListInfoFragment;
 | 
			
		||||
import org.schabi.newpipe.info_list.InfoItemDialog;
 | 
			
		||||
import org.schabi.newpipe.local.playlist.RemotePlaylistManager;
 | 
			
		||||
 
 | 
			
		||||
@@ -122,12 +122,11 @@ public class SearchFragment
 | 
			
		||||
    private String nextPageUrl;
 | 
			
		||||
    private String contentCountry;
 | 
			
		||||
    private boolean isSuggestionsEnabled = true;
 | 
			
		||||
    private boolean isSearchHistoryEnabled = true;
 | 
			
		||||
 | 
			
		||||
    private PublishSubject<String> suggestionPublisher = PublishSubject.create();
 | 
			
		||||
    private final PublishSubject<String> suggestionPublisher = PublishSubject.create();
 | 
			
		||||
    private Disposable searchDisposable;
 | 
			
		||||
    private Disposable suggestionDisposable;
 | 
			
		||||
    private CompositeDisposable disposables = new CompositeDisposable();
 | 
			
		||||
    private final CompositeDisposable disposables = new CompositeDisposable();
 | 
			
		||||
 | 
			
		||||
    private SuggestionListAdapter suggestionListAdapter;
 | 
			
		||||
    private HistoryRecordManager historyRecordManager;
 | 
			
		||||
@@ -173,7 +172,7 @@ public class SearchFragment
 | 
			
		||||
 | 
			
		||||
        suggestionListAdapter = new SuggestionListAdapter(activity);
 | 
			
		||||
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(activity);
 | 
			
		||||
        isSearchHistoryEnabled = preferences.getBoolean(getString(R.string.enable_search_history_key), true);
 | 
			
		||||
        boolean isSearchHistoryEnabled = preferences.getBoolean(getString(R.string.enable_search_history_key), true);
 | 
			
		||||
        suggestionListAdapter.setShowSuggestionHistory(isSearchHistoryEnabled);
 | 
			
		||||
 | 
			
		||||
        historyRecordManager = new HistoryRecordManager(context);
 | 
			
		||||
 
 | 
			
		||||
@@ -45,7 +45,7 @@ public class InfoItemBuilder {
 | 
			
		||||
    private static final String TAG = InfoItemBuilder.class.toString();
 | 
			
		||||
 | 
			
		||||
    private final Context context;
 | 
			
		||||
    private ImageLoader imageLoader = ImageLoader.getInstance();
 | 
			
		||||
    private final ImageLoader imageLoader = ImageLoader.getInstance();
 | 
			
		||||
 | 
			
		||||
    private OnClickGesture<StreamInfoItem> onStreamSelectedListener;
 | 
			
		||||
    private OnClickGesture<ChannelInfoItem> onChannelSelectedListener;
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,6 @@ import android.app.AlertDialog;
 | 
			
		||||
import android.content.DialogInterface;
 | 
			
		||||
import android.support.annotation.NonNull;
 | 
			
		||||
import android.support.annotation.Nullable;
 | 
			
		||||
import android.view.LayoutInflater;
 | 
			
		||||
import android.view.View;
 | 
			
		||||
import android.widget.TextView;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -33,7 +33,7 @@ public class LocalItemBuilder {
 | 
			
		||||
    private static final String TAG = LocalItemBuilder.class.toString();
 | 
			
		||||
 | 
			
		||||
    private final Context context;
 | 
			
		||||
    private ImageLoader imageLoader = ImageLoader.getInstance();
 | 
			
		||||
    private final ImageLoader imageLoader = ImageLoader.getInstance();
 | 
			
		||||
 | 
			
		||||
    private OnClickGesture<LocalItem> onSelectedListener;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -58,7 +58,7 @@ public abstract class PlaylistDialog extends DialogFragment implements StateSave
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    @SuppressWarnings("unchecked")
 | 
			
		||||
    public void readFrom(@NonNull Queue<Object> savedObjects) throws Exception {
 | 
			
		||||
    public void readFrom(@NonNull Queue<Object> savedObjects) {
 | 
			
		||||
        streamEntities = (List<StreamEntity>) savedObjects.poll();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -36,8 +36,6 @@ import io.reactivex.MaybeObserver;
 | 
			
		||||
import io.reactivex.android.schedulers.AndroidSchedulers;
 | 
			
		||||
import io.reactivex.disposables.CompositeDisposable;
 | 
			
		||||
import io.reactivex.disposables.Disposable;
 | 
			
		||||
import io.reactivex.functions.Consumer;
 | 
			
		||||
import io.reactivex.functions.Predicate;
 | 
			
		||||
 | 
			
		||||
public class FeedFragment extends BaseListFragment<List<SubscriptionEntity>, Void> {
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,6 @@
 | 
			
		||||
package org.schabi.newpipe.local.history;
 | 
			
		||||
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.content.res.Resources;
 | 
			
		||||
import android.support.annotation.NonNull;
 | 
			
		||||
import android.support.annotation.Nullable;
 | 
			
		||||
import android.support.v7.widget.RecyclerView;
 | 
			
		||||
 
 | 
			
		||||
@@ -45,7 +45,6 @@ import java.util.List;
 | 
			
		||||
 | 
			
		||||
import io.reactivex.Flowable;
 | 
			
		||||
import io.reactivex.Maybe;
 | 
			
		||||
import io.reactivex.Scheduler;
 | 
			
		||||
import io.reactivex.Single;
 | 
			
		||||
import io.reactivex.schedulers.Schedulers;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,6 @@ import org.schabi.newpipe.R;
 | 
			
		||||
import org.schabi.newpipe.database.LocalItem;
 | 
			
		||||
import org.schabi.newpipe.database.stream.StreamStatisticsEntry;
 | 
			
		||||
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
 | 
			
		||||
import org.schabi.newpipe.fragments.list.BaseListFragment;
 | 
			
		||||
import org.schabi.newpipe.local.BaseLocalListFragment;
 | 
			
		||||
import org.schabi.newpipe.info_list.InfoItemDialog;
 | 
			
		||||
import org.schabi.newpipe.player.playqueue.PlayQueue;
 | 
			
		||||
@@ -57,7 +56,7 @@ public class StatisticsPlaylistFragment
 | 
			
		||||
    /* Used for independent events */
 | 
			
		||||
    private Subscription databaseSubscription;
 | 
			
		||||
    private HistoryRecordManager recordManager;
 | 
			
		||||
    private CompositeDisposable disposables = new CompositeDisposable();
 | 
			
		||||
    private final CompositeDisposable disposables = new CompositeDisposable();
 | 
			
		||||
 | 
			
		||||
    private enum StatisticSortMode {
 | 
			
		||||
        LAST_PLAYED,
 | 
			
		||||
 
 | 
			
		||||
@@ -16,7 +16,6 @@ import android.support.annotation.Nullable;
 | 
			
		||||
import android.support.v4.app.FragmentManager;
 | 
			
		||||
import android.support.v4.content.LocalBroadcastManager;
 | 
			
		||||
import android.support.v7.app.ActionBar;
 | 
			
		||||
import android.support.v7.app.AppCompatActivity;
 | 
			
		||||
import android.support.v7.widget.LinearLayoutManager;
 | 
			
		||||
import android.support.v7.widget.RecyclerView;
 | 
			
		||||
import android.view.LayoutInflater;
 | 
			
		||||
@@ -40,7 +39,6 @@ import org.schabi.newpipe.extractor.exceptions.ExtractionException;
 | 
			
		||||
import org.schabi.newpipe.extractor.subscription.SubscriptionExtractor;
 | 
			
		||||
import org.schabi.newpipe.fragments.BaseStateFragment;
 | 
			
		||||
import org.schabi.newpipe.info_list.InfoListAdapter;
 | 
			
		||||
import org.schabi.newpipe.report.ErrorActivity;
 | 
			
		||||
import org.schabi.newpipe.report.UserAction;
 | 
			
		||||
import org.schabi.newpipe.local.subscription.services.SubscriptionsExportService;
 | 
			
		||||
import org.schabi.newpipe.local.subscription.services.SubscriptionsImportService;
 | 
			
		||||
@@ -81,7 +79,6 @@ public class SubscriptionFragment extends BaseStateFragment<List<SubscriptionEnt
 | 
			
		||||
    protected Parcelable itemsListState;
 | 
			
		||||
    private InfoListAdapter infoListAdapter;
 | 
			
		||||
 | 
			
		||||
    private View headerRootLayout;
 | 
			
		||||
    private View whatsNewItemListHeader;
 | 
			
		||||
    private View importExportListHeader;
 | 
			
		||||
 | 
			
		||||
@@ -291,6 +288,7 @@ public class SubscriptionFragment extends BaseStateFragment<List<SubscriptionEnt
 | 
			
		||||
        itemsList = rootView.findViewById(R.id.items_list);
 | 
			
		||||
        itemsList.setLayoutManager(new LinearLayoutManager(activity));
 | 
			
		||||
 | 
			
		||||
        View headerRootLayout;
 | 
			
		||||
        infoListAdapter.setHeader(headerRootLayout = activity.getLayoutInflater().inflate(R.layout.subscription_header, itemsList, false));
 | 
			
		||||
        whatsNewItemListHeader = headerRootLayout.findViewById(R.id.whats_new);
 | 
			
		||||
        importExportListHeader = headerRootLayout.findViewById(R.id.import_export);
 | 
			
		||||
 
 | 
			
		||||
@@ -55,10 +55,10 @@ public class SubscriptionService {
 | 
			
		||||
    private static final int SUBSCRIPTION_DEBOUNCE_INTERVAL = 500;
 | 
			
		||||
    private static final int SUBSCRIPTION_THREAD_POOL_SIZE = 4;
 | 
			
		||||
 | 
			
		||||
    private AppDatabase db;
 | 
			
		||||
    private Flowable<List<SubscriptionEntity>> subscription;
 | 
			
		||||
    private final AppDatabase db;
 | 
			
		||||
    private final Flowable<List<SubscriptionEntity>> subscription;
 | 
			
		||||
 | 
			
		||||
    private Scheduler subscriptionScheduler;
 | 
			
		||||
    private final Scheduler subscriptionScheduler;
 | 
			
		||||
 | 
			
		||||
    private SubscriptionService(Context context) {
 | 
			
		||||
        db = NewPipeDatabase.getInstance(context.getApplicationContext());
 | 
			
		||||
@@ -116,7 +116,7 @@ public class SubscriptionService {
 | 
			
		||||
    public Completable updateChannelInfo(final ChannelInfo info) {
 | 
			
		||||
        final Function<List<SubscriptionEntity>, CompletableSource> update = new Function<List<SubscriptionEntity>, CompletableSource>() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public CompletableSource apply(@NonNull List<SubscriptionEntity> subscriptionEntities) throws Exception {
 | 
			
		||||
            public CompletableSource apply(@NonNull List<SubscriptionEntity> subscriptionEntities) {
 | 
			
		||||
                if (DEBUG) Log.d(TAG, "updateChannelInfo() called with: subscriptionEntities = [" + subscriptionEntities + "]");
 | 
			
		||||
                if (subscriptionEntities.size() == 1) {
 | 
			
		||||
                    SubscriptionEntity subscription = subscriptionEntities.get(0);
 | 
			
		||||
 
 | 
			
		||||
@@ -58,8 +58,8 @@ public abstract class BaseImportExportService extends Service {
 | 
			
		||||
    protected NotificationCompat.Builder notificationBuilder;
 | 
			
		||||
 | 
			
		||||
    protected SubscriptionService subscriptionService;
 | 
			
		||||
    protected CompositeDisposable disposables = new CompositeDisposable();
 | 
			
		||||
    protected PublishProcessor<String> notificationUpdater = PublishProcessor.create();
 | 
			
		||||
    protected final CompositeDisposable disposables = new CompositeDisposable();
 | 
			
		||||
    protected final PublishProcessor<String> notificationUpdater = PublishProcessor.create();
 | 
			
		||||
 | 
			
		||||
    @Nullable
 | 
			
		||||
    @Override
 | 
			
		||||
@@ -90,9 +90,9 @@ public abstract class BaseImportExportService extends Service {
 | 
			
		||||
 | 
			
		||||
    private static final int NOTIFICATION_SAMPLING_PERIOD = 2500;
 | 
			
		||||
 | 
			
		||||
    protected AtomicInteger currentProgress = new AtomicInteger(-1);
 | 
			
		||||
    protected AtomicInteger maxProgress = new AtomicInteger(-1);
 | 
			
		||||
    protected ImportExportEventListener eventListener = new ImportExportEventListener() {
 | 
			
		||||
    protected final AtomicInteger currentProgress = new AtomicInteger(-1);
 | 
			
		||||
    protected final AtomicInteger maxProgress = new AtomicInteger(-1);
 | 
			
		||||
    protected final ImportExportEventListener eventListener = new ImportExportEventListener() {
 | 
			
		||||
        @Override
 | 
			
		||||
        public void onSizeReceived(int size) {
 | 
			
		||||
            maxProgress.set(size);
 | 
			
		||||
@@ -187,13 +187,13 @@ public abstract class BaseImportExportService extends Service {
 | 
			
		||||
    protected Toast toast;
 | 
			
		||||
 | 
			
		||||
    protected void showToast(@StringRes int message) {
 | 
			
		||||
        showToast(getString(message), Toast.LENGTH_SHORT);
 | 
			
		||||
        showToast(getString(message));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void showToast(String message, int duration) {
 | 
			
		||||
    protected void showToast(String message) {
 | 
			
		||||
        if (toast != null) toast.cancel();
 | 
			
		||||
 | 
			
		||||
        toast = Toast.makeText(this, message, duration);
 | 
			
		||||
        toast = Toast.makeText(this, message, Toast.LENGTH_SHORT);
 | 
			
		||||
        toast.show();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -144,12 +144,16 @@ public class SubscriptionsImportService extends BaseImportExportService {
 | 
			
		||||
        showToast(R.string.import_ongoing);
 | 
			
		||||
 | 
			
		||||
        Flowable<List<SubscriptionItem>> flowable = null;
 | 
			
		||||
        if (currentMode == CHANNEL_URL_MODE) {
 | 
			
		||||
            flowable = importFromChannelUrl();
 | 
			
		||||
        } else if (currentMode == INPUT_STREAM_MODE) {
 | 
			
		||||
            flowable = importFromInputStream();
 | 
			
		||||
        } else if (currentMode == PREVIOUS_EXPORT_MODE) {
 | 
			
		||||
            flowable = importFromPreviousExport();
 | 
			
		||||
        switch (currentMode) {
 | 
			
		||||
            case CHANNEL_URL_MODE:
 | 
			
		||||
                flowable = importFromChannelUrl();
 | 
			
		||||
                break;
 | 
			
		||||
            case INPUT_STREAM_MODE:
 | 
			
		||||
                flowable = importFromInputStream();
 | 
			
		||||
                break;
 | 
			
		||||
            case PREVIOUS_EXPORT_MODE:
 | 
			
		||||
                flowable = importFromPreviousExport();
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (flowable == null) {
 | 
			
		||||
 
 | 
			
		||||
@@ -230,7 +230,8 @@ public abstract class BasePlayer implements
 | 
			
		||||
            int sizeBeforeAppend = playQueue.size();
 | 
			
		||||
            playQueue.append(queue.getStreams());
 | 
			
		||||
 | 
			
		||||
            if (intent.getBooleanExtra(SELECT_ON_APPEND, false) &&
 | 
			
		||||
            if ((intent.getBooleanExtra(SELECT_ON_APPEND, false) ||
 | 
			
		||||
                    getCurrentState() == STATE_COMPLETED) &&
 | 
			
		||||
                    queue.getStreams().size() > 0) {
 | 
			
		||||
                playQueue.setIndex(sizeBeforeAppend);
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -175,6 +175,10 @@ public final class MainVideoPlayer extends AppCompatActivity
 | 
			
		||||
            setLandscape(lastOrientationWasLandscape);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        final int lastResizeMode = defaultPreferences.getInt(
 | 
			
		||||
                getString(R.string.last_resize_mode), AspectRatioFrameLayout.RESIZE_MODE_FIT);
 | 
			
		||||
        playerImpl.setResizeMode(lastResizeMode);
 | 
			
		||||
 | 
			
		||||
        // Upon going in or out of multiwindow mode, isInMultiWindow will always be false,
 | 
			
		||||
        // since the first onResume needs to restore the player.
 | 
			
		||||
        // Subsequent onResume calls while multiwindow mode remains the same and the player is
 | 
			
		||||
@@ -705,14 +709,27 @@ public final class MainVideoPlayer extends AppCompatActivity
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        protected int nextResizeMode(int currentResizeMode) {
 | 
			
		||||
            final int newResizeMode;
 | 
			
		||||
            switch (currentResizeMode) {
 | 
			
		||||
                case AspectRatioFrameLayout.RESIZE_MODE_FIT:
 | 
			
		||||
                    return AspectRatioFrameLayout.RESIZE_MODE_FILL;
 | 
			
		||||
                    newResizeMode = AspectRatioFrameLayout.RESIZE_MODE_FILL;
 | 
			
		||||
                    break;
 | 
			
		||||
                case AspectRatioFrameLayout.RESIZE_MODE_FILL:
 | 
			
		||||
                    return AspectRatioFrameLayout.RESIZE_MODE_ZOOM;
 | 
			
		||||
                    newResizeMode = AspectRatioFrameLayout.RESIZE_MODE_ZOOM;
 | 
			
		||||
                    break;
 | 
			
		||||
                default:
 | 
			
		||||
                    return AspectRatioFrameLayout.RESIZE_MODE_FIT;
 | 
			
		||||
                    newResizeMode = AspectRatioFrameLayout.RESIZE_MODE_FIT;
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            storeResizeMode(newResizeMode);
 | 
			
		||||
            return newResizeMode;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void storeResizeMode(@AspectRatioFrameLayout.ResizeMode int resizeMode) {
 | 
			
		||||
            defaultPreferences.edit()
 | 
			
		||||
                    .putInt(getString(R.string.last_resize_mode), resizeMode)
 | 
			
		||||
                    .apply();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
 
 | 
			
		||||
@@ -114,7 +114,6 @@ public final class PopupVideoPlayer extends Service {
 | 
			
		||||
 | 
			
		||||
    private View closeOverlayView;
 | 
			
		||||
    private FloatingActionButton closeOverlayButton;
 | 
			
		||||
    private WindowManager.LayoutParams closeOverlayLayoutParams;
 | 
			
		||||
 | 
			
		||||
    private int tossFlingVelocity;
 | 
			
		||||
 | 
			
		||||
@@ -248,7 +247,7 @@ public final class PopupVideoPlayer extends Service {
 | 
			
		||||
        final int flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
 | 
			
		||||
                | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
 | 
			
		||||
 | 
			
		||||
        closeOverlayLayoutParams = new WindowManager.LayoutParams(
 | 
			
		||||
        WindowManager.LayoutParams closeOverlayLayoutParams = new WindowManager.LayoutParams(
 | 
			
		||||
                ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT,
 | 
			
		||||
                layoutParamType,
 | 
			
		||||
                flags,
 | 
			
		||||
 
 | 
			
		||||
@@ -137,16 +137,16 @@ public abstract class VideoPlayer extends BasePlayer
 | 
			
		||||
    private TextView captionTextView;
 | 
			
		||||
 | 
			
		||||
    private ValueAnimator controlViewAnimator;
 | 
			
		||||
    private Handler controlsVisibilityHandler = new Handler();
 | 
			
		||||
    private final Handler controlsVisibilityHandler = new Handler();
 | 
			
		||||
 | 
			
		||||
    boolean isSomePopupMenuVisible = false;
 | 
			
		||||
    private int qualityPopupMenuGroupId = 69;
 | 
			
		||||
    private final int qualityPopupMenuGroupId = 69;
 | 
			
		||||
    private PopupMenu qualityPopupMenu;
 | 
			
		||||
 | 
			
		||||
    private int playbackSpeedPopupMenuGroupId = 79;
 | 
			
		||||
    private final int playbackSpeedPopupMenuGroupId = 79;
 | 
			
		||||
    private PopupMenu playbackSpeedPopupMenu;
 | 
			
		||||
 | 
			
		||||
    private int captionPopupMenuGroupId = 89;
 | 
			
		||||
    private final int captionPopupMenuGroupId = 89;
 | 
			
		||||
    private PopupMenu captionPopupMenu;
 | 
			
		||||
 | 
			
		||||
    ///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
@@ -683,12 +683,17 @@ public abstract class VideoPlayer extends BasePlayer
 | 
			
		||||
        if (getAspectRatioFrameLayout() != null) {
 | 
			
		||||
            final int currentResizeMode = getAspectRatioFrameLayout().getResizeMode();
 | 
			
		||||
            final int newResizeMode = nextResizeMode(currentResizeMode);
 | 
			
		||||
            getAspectRatioFrameLayout().setResizeMode(newResizeMode);
 | 
			
		||||
            getResizeView().setText(PlayerHelper.resizeTypeOf(context, newResizeMode));
 | 
			
		||||
            setResizeMode(newResizeMode);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void setResizeMode(@AspectRatioFrameLayout.ResizeMode final int resizeMode) {
 | 
			
		||||
        getAspectRatioFrameLayout().setResizeMode(resizeMode);
 | 
			
		||||
        getResizeView().setText(PlayerHelper.resizeTypeOf(context, resizeMode));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected abstract int nextResizeMode(@AspectRatioFrameLayout.ResizeMode final int resizeMode);
 | 
			
		||||
 | 
			
		||||
    /*//////////////////////////////////////////////////////////////////////////
 | 
			
		||||
    // SeekBar Listener
 | 
			
		||||
    //////////////////////////////////////////////////////////////////////////*/
 | 
			
		||||
 
 | 
			
		||||
@@ -116,7 +116,7 @@ public class AudioReactor implements AudioManager.OnAudioFocusChangeListener,
 | 
			
		||||
    private void onAudioFocusGain() {
 | 
			
		||||
        Log.d(TAG, "onAudioFocusGain() called");
 | 
			
		||||
        player.setVolume(DUCK_AUDIO_TO);
 | 
			
		||||
        animateAudio(DUCK_AUDIO_TO, 1f, DUCK_DURATION);
 | 
			
		||||
        animateAudio(DUCK_AUDIO_TO, 1f);
 | 
			
		||||
 | 
			
		||||
        if (PlayerHelper.isResumeAfterAudioFocusGain(context)) {
 | 
			
		||||
            player.setPlayWhenReady(true);
 | 
			
		||||
@@ -131,13 +131,13 @@ public class AudioReactor implements AudioManager.OnAudioFocusChangeListener,
 | 
			
		||||
    private void onAudioFocusLossCanDuck() {
 | 
			
		||||
        Log.d(TAG, "onAudioFocusLossCanDuck() called");
 | 
			
		||||
        // Set the volume to 1/10 on ducking
 | 
			
		||||
        animateAudio(player.getVolume(), DUCK_AUDIO_TO, DUCK_DURATION);
 | 
			
		||||
        animateAudio(player.getVolume(), DUCK_AUDIO_TO);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void animateAudio(final float from, final float to, int duration) {
 | 
			
		||||
    private void animateAudio(final float from, final float to) {
 | 
			
		||||
        ValueAnimator valueAnimator = new ValueAnimator();
 | 
			
		||||
        valueAnimator.setFloatValues(from, to);
 | 
			
		||||
        valueAnimator.setDuration(duration);
 | 
			
		||||
        valueAnimator.setDuration(AudioReactor.DUCK_DURATION);
 | 
			
		||||
        valueAnimator.addListener(new AnimatorListenerAdapter() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onAnimationStart(Animator animation) {
 | 
			
		||||
 
 | 
			
		||||
@@ -4,12 +4,9 @@ import android.content.Context;
 | 
			
		||||
import android.support.annotation.NonNull;
 | 
			
		||||
import android.util.Log;
 | 
			
		||||
 | 
			
		||||
import com.google.android.exoplayer2.upstream.BandwidthMeter;
 | 
			
		||||
import com.google.android.exoplayer2.upstream.DataSource;
 | 
			
		||||
import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter;
 | 
			
		||||
import com.google.android.exoplayer2.upstream.DefaultDataSource;
 | 
			
		||||
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory;
 | 
			
		||||
import com.google.android.exoplayer2.upstream.DefaultHttpDataSource;
 | 
			
		||||
import com.google.android.exoplayer2.upstream.FileDataSource;
 | 
			
		||||
import com.google.android.exoplayer2.upstream.TransferListener;
 | 
			
		||||
import com.google.android.exoplayer2.upstream.cache.CacheDataSink;
 | 
			
		||||
@@ -17,8 +14,6 @@ import com.google.android.exoplayer2.upstream.cache.CacheDataSource;
 | 
			
		||||
import com.google.android.exoplayer2.upstream.cache.LeastRecentlyUsedCacheEvictor;
 | 
			
		||||
import com.google.android.exoplayer2.upstream.cache.SimpleCache;
 | 
			
		||||
 | 
			
		||||
import org.schabi.newpipe.Downloader;
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
 | 
			
		||||
/* package-private */ class CacheFactory implements DataSource.Factory {
 | 
			
		||||
 
 | 
			
		||||
@@ -66,25 +66,15 @@ public class PlaybackParameterDialog extends DialogFragment {
 | 
			
		||||
    private double stepSize = DEFAULT_STEP;
 | 
			
		||||
 | 
			
		||||
    @Nullable private SeekBar tempoSlider;
 | 
			
		||||
    @Nullable private TextView tempoMinimumText;
 | 
			
		||||
    @Nullable private TextView tempoMaximumText;
 | 
			
		||||
    @Nullable private TextView tempoCurrentText;
 | 
			
		||||
    @Nullable private TextView tempoStepDownText;
 | 
			
		||||
    @Nullable private TextView tempoStepUpText;
 | 
			
		||||
 | 
			
		||||
    @Nullable private SeekBar pitchSlider;
 | 
			
		||||
    @Nullable private TextView pitchMinimumText;
 | 
			
		||||
    @Nullable private TextView pitchMaximumText;
 | 
			
		||||
    @Nullable private TextView pitchCurrentText;
 | 
			
		||||
    @Nullable private TextView pitchStepDownText;
 | 
			
		||||
    @Nullable private TextView pitchStepUpText;
 | 
			
		||||
 | 
			
		||||
    @Nullable private TextView stepSizeOnePercentText;
 | 
			
		||||
    @Nullable private TextView stepSizeFivePercentText;
 | 
			
		||||
    @Nullable private TextView stepSizeTenPercentText;
 | 
			
		||||
    @Nullable private TextView stepSizeTwentyFivePercentText;
 | 
			
		||||
    @Nullable private TextView stepSizeOneHundredPercentText;
 | 
			
		||||
 | 
			
		||||
    @Nullable private CheckBox unhookingCheckbox;
 | 
			
		||||
    @Nullable private CheckBox skipSilenceCheckbox;
 | 
			
		||||
 | 
			
		||||
@@ -181,8 +171,8 @@ public class PlaybackParameterDialog extends DialogFragment {
 | 
			
		||||
 | 
			
		||||
    private void setupTempoControl(@NonNull View rootView) {
 | 
			
		||||
        tempoSlider = rootView.findViewById(R.id.tempoSeekbar);
 | 
			
		||||
        tempoMinimumText = rootView.findViewById(R.id.tempoMinimumText);
 | 
			
		||||
        tempoMaximumText = rootView.findViewById(R.id.tempoMaximumText);
 | 
			
		||||
        TextView tempoMinimumText = rootView.findViewById(R.id.tempoMinimumText);
 | 
			
		||||
        TextView tempoMaximumText = rootView.findViewById(R.id.tempoMaximumText);
 | 
			
		||||
        tempoCurrentText = rootView.findViewById(R.id.tempoCurrentText);
 | 
			
		||||
        tempoStepUpText = rootView.findViewById(R.id.tempoStepUp);
 | 
			
		||||
        tempoStepDownText = rootView.findViewById(R.id.tempoStepDown);
 | 
			
		||||
@@ -203,8 +193,8 @@ public class PlaybackParameterDialog extends DialogFragment {
 | 
			
		||||
 | 
			
		||||
    private void setupPitchControl(@NonNull View rootView) {
 | 
			
		||||
        pitchSlider = rootView.findViewById(R.id.pitchSeekbar);
 | 
			
		||||
        pitchMinimumText = rootView.findViewById(R.id.pitchMinimumText);
 | 
			
		||||
        pitchMaximumText = rootView.findViewById(R.id.pitchMaximumText);
 | 
			
		||||
        TextView pitchMinimumText = rootView.findViewById(R.id.pitchMinimumText);
 | 
			
		||||
        TextView pitchMaximumText = rootView.findViewById(R.id.pitchMaximumText);
 | 
			
		||||
        pitchCurrentText = rootView.findViewById(R.id.pitchCurrentText);
 | 
			
		||||
        pitchStepDownText = rootView.findViewById(R.id.pitchStepDown);
 | 
			
		||||
        pitchStepUpText = rootView.findViewById(R.id.pitchStepUp);
 | 
			
		||||
@@ -247,11 +237,11 @@ public class PlaybackParameterDialog extends DialogFragment {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void setupStepSizeSelector(@NonNull final View rootView) {
 | 
			
		||||
        stepSizeOnePercentText = rootView.findViewById(R.id.stepSizeOnePercent);
 | 
			
		||||
        stepSizeFivePercentText = rootView.findViewById(R.id.stepSizeFivePercent);
 | 
			
		||||
        stepSizeTenPercentText = rootView.findViewById(R.id.stepSizeTenPercent);
 | 
			
		||||
        stepSizeTwentyFivePercentText = rootView.findViewById(R.id.stepSizeTwentyFivePercent);
 | 
			
		||||
        stepSizeOneHundredPercentText = rootView.findViewById(R.id.stepSizeOneHundredPercent);
 | 
			
		||||
        TextView stepSizeOnePercentText = rootView.findViewById(R.id.stepSizeOnePercent);
 | 
			
		||||
        TextView stepSizeFivePercentText = rootView.findViewById(R.id.stepSizeFivePercent);
 | 
			
		||||
        TextView stepSizeTenPercentText = rootView.findViewById(R.id.stepSizeTenPercent);
 | 
			
		||||
        TextView stepSizeTwentyFivePercentText = rootView.findViewById(R.id.stepSizeTwentyFivePercent);
 | 
			
		||||
        TextView stepSizeOneHundredPercentText = rootView.findViewById(R.id.stepSizeOneHundredPercent);
 | 
			
		||||
 | 
			
		||||
        if (stepSizeOnePercentText != null) {
 | 
			
		||||
            stepSizeOnePercentText.setText(getPercentString(STEP_ONE_PERCENT_VALUE));
 | 
			
		||||
 
 | 
			
		||||
@@ -203,7 +203,7 @@ public class PlayerHelper {
 | 
			
		||||
 | 
			
		||||
    @NonNull
 | 
			
		||||
    public static SeekParameters getSeekParameters(@NonNull final Context context) {
 | 
			
		||||
        return isUsingInexactSeek(context, false) ?
 | 
			
		||||
        return isUsingInexactSeek(context) ?
 | 
			
		||||
                SeekParameters.CLOSEST_SYNC : SeekParameters.EXACT;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -318,8 +318,8 @@ public class PlayerHelper {
 | 
			
		||||
        return getPreferences(context).getBoolean(context.getString(R.string.popup_remember_size_pos_key), b);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static boolean isUsingInexactSeek(@NonNull final Context context, final boolean b) {
 | 
			
		||||
        return getPreferences(context).getBoolean(context.getString(R.string.use_inexact_seek_key), b);
 | 
			
		||||
    private static boolean isUsingInexactSeek(@NonNull final Context context) {
 | 
			
		||||
        return getPreferences(context).getBoolean(context.getString(R.string.use_inexact_seek_key), false);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static boolean isAutoQueueEnabled(@NonNull final Context context, final boolean b) {
 | 
			
		||||
 
 | 
			
		||||
@@ -79,7 +79,7 @@ public class PlayQueueNavigator implements MediaSessionConnector.QueueNavigator
 | 
			
		||||
 | 
			
		||||
    private void publishFloatingQueueWindow() {
 | 
			
		||||
        if (callback.getQueueSize() == 0) {
 | 
			
		||||
            mediaSession.setQueue(Collections.<MediaSessionCompat.QueueItem>emptyList());
 | 
			
		||||
            mediaSession.setQueue(Collections.emptyList());
 | 
			
		||||
            activeQueueItemId = MediaSessionCompat.QueueItem.UNKNOWN_ID;
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@ import org.schabi.newpipe.player.mediasession.MediaSessionCallback;
 | 
			
		||||
import org.schabi.newpipe.player.playqueue.PlayQueueItem;
 | 
			
		||||
 | 
			
		||||
public class BasePlayerMediaSession implements MediaSessionCallback {
 | 
			
		||||
    private BasePlayer player;
 | 
			
		||||
    private final BasePlayer player;
 | 
			
		||||
 | 
			
		||||
    public BasePlayerMediaSession(final BasePlayer player) {
 | 
			
		||||
        this.player = player;
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,6 @@ import android.support.annotation.NonNull;
 | 
			
		||||
import android.text.TextUtils;
 | 
			
		||||
 | 
			
		||||
import com.google.android.exoplayer2.C;
 | 
			
		||||
import com.google.android.exoplayer2.ExoPlaybackException;
 | 
			
		||||
import com.google.android.exoplayer2.Format;
 | 
			
		||||
import com.google.android.exoplayer2.source.TrackGroup;
 | 
			
		||||
import com.google.android.exoplayer2.source.TrackGroupArray;
 | 
			
		||||
@@ -12,7 +11,6 @@ import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
 | 
			
		||||
import com.google.android.exoplayer2.trackselection.FixedTrackSelection;
 | 
			
		||||
import com.google.android.exoplayer2.trackselection.TrackSelection;
 | 
			
		||||
import com.google.android.exoplayer2.util.Assertions;
 | 
			
		||||
import com.google.android.exoplayer2.util.Util;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This class allows irregular text language labels for use when selecting text captions and
 | 
			
		||||
@@ -55,7 +53,7 @@ public class CustomTrackSelector extends DefaultTrackSelector {
 | 
			
		||||
    /** @see DefaultTrackSelector#selectTextTrack(TrackGroupArray, int[][], Parameters) */
 | 
			
		||||
    @Override
 | 
			
		||||
    protected TrackSelection selectTextTrack(TrackGroupArray groups, int[][] formatSupport,
 | 
			
		||||
                                             Parameters params) throws ExoPlaybackException {
 | 
			
		||||
                                             Parameters params) {
 | 
			
		||||
        TrackGroup selectedGroup = null;
 | 
			
		||||
        int selectedTrackIndex = 0;
 | 
			
		||||
        int selectedTrackScore = 0;
 | 
			
		||||
 
 | 
			
		||||
@@ -335,7 +335,7 @@ public class MediaSourceManager {
 | 
			
		||||
 | 
			
		||||
    private void loadImmediate() {
 | 
			
		||||
        if (DEBUG) Log.d(TAG, "MediaSource - loadImmediate() called");
 | 
			
		||||
        final ItemsToLoad itemsToLoad = getItemsToLoad(playQueue, WINDOW_SIZE);
 | 
			
		||||
        final ItemsToLoad itemsToLoad = getItemsToLoad(playQueue);
 | 
			
		||||
        if (itemsToLoad == null) return;
 | 
			
		||||
 | 
			
		||||
        // Evict the previous items being loaded to free up memory, before start loading new ones
 | 
			
		||||
@@ -472,8 +472,7 @@ public class MediaSourceManager {
 | 
			
		||||
    // Manager Helpers
 | 
			
		||||
    //////////////////////////////////////////////////////////////////////////*/
 | 
			
		||||
    @Nullable
 | 
			
		||||
    private static ItemsToLoad getItemsToLoad(@NonNull final PlayQueue playQueue,
 | 
			
		||||
                                              final int windowSize) {
 | 
			
		||||
    private static ItemsToLoad getItemsToLoad(@NonNull final PlayQueue playQueue) {
 | 
			
		||||
        // The current item has higher priority
 | 
			
		||||
        final int currentIndex = playQueue.getIndex();
 | 
			
		||||
        final PlayQueueItem currentItem = playQueue.getItem(currentIndex);
 | 
			
		||||
@@ -482,8 +481,8 @@ public class MediaSourceManager {
 | 
			
		||||
        // The rest are just for seamless playback
 | 
			
		||||
        // Although timeline is not updated prior to the current index, these sources are still
 | 
			
		||||
        // loaded into the cache for faster retrieval at a potentially later time.
 | 
			
		||||
        final int leftBound = Math.max(0, currentIndex - windowSize);
 | 
			
		||||
        final int rightLimit = currentIndex + windowSize + 1;
 | 
			
		||||
        final int leftBound = Math.max(0, currentIndex - MediaSourceManager.WINDOW_SIZE);
 | 
			
		||||
        final int rightLimit = currentIndex + MediaSourceManager.WINDOW_SIZE + 1;
 | 
			
		||||
        final int rightBound = Math.min(playQueue.size(), rightLimit);
 | 
			
		||||
        final Set<PlayQueueItem> neighbors = new ArraySet<>(
 | 
			
		||||
                playQueue.getStreams().subList(leftBound,rightBound));
 | 
			
		||||
 
 | 
			
		||||
@@ -8,8 +8,6 @@ import com.google.android.exoplayer2.source.MediaSource;
 | 
			
		||||
import org.schabi.newpipe.extractor.stream.StreamInfo;
 | 
			
		||||
import org.schabi.newpipe.player.playqueue.PlayQueueItem;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
public interface PlaybackListener {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -19,14 +19,14 @@ abstract class AbstractInfoPlayQueue<T extends ListInfo, U extends InfoItem> ext
 | 
			
		||||
    boolean isInitial;
 | 
			
		||||
    boolean isComplete;
 | 
			
		||||
 | 
			
		||||
    int serviceId;
 | 
			
		||||
    String baseUrl;
 | 
			
		||||
    final int serviceId;
 | 
			
		||||
    final String baseUrl;
 | 
			
		||||
    String nextUrl;
 | 
			
		||||
 | 
			
		||||
    transient Disposable fetchReactor;
 | 
			
		||||
 | 
			
		||||
    AbstractInfoPlayQueue(final U item) {
 | 
			
		||||
        this(item.getServiceId(), item.getUrl(), null, Collections.<StreamInfoItem>emptyList(), 0);
 | 
			
		||||
        this(item.getServiceId(), item.getUrl(), null, Collections.emptyList(), 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    AbstractInfoPlayQueue(final int serviceId,
 | 
			
		||||
 
 | 
			
		||||
@@ -5,10 +5,8 @@ import android.text.TextUtils;
 | 
			
		||||
import android.view.MotionEvent;
 | 
			
		||||
import android.view.View;
 | 
			
		||||
 | 
			
		||||
import com.nostra13.universalimageloader.core.DisplayImageOptions;
 | 
			
		||||
import com.nostra13.universalimageloader.core.ImageLoader;
 | 
			
		||||
 | 
			
		||||
import org.schabi.newpipe.R;
 | 
			
		||||
import org.schabi.newpipe.extractor.NewPipe;
 | 
			
		||||
import org.schabi.newpipe.util.ImageDisplayConstants;
 | 
			
		||||
import org.schabi.newpipe.util.Localization;
 | 
			
		||||
 
 | 
			
		||||
@@ -6,8 +6,6 @@ import android.widget.ImageView;
 | 
			
		||||
import android.widget.TextView;
 | 
			
		||||
 | 
			
		||||
import org.schabi.newpipe.R;
 | 
			
		||||
import org.schabi.newpipe.extractor.InfoItem;
 | 
			
		||||
import org.schabi.newpipe.info_list.holder.InfoItemHolder;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Created by Christian Schabesberger on 01.08.16.
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,6 @@ import android.support.annotation.NonNull;
 | 
			
		||||
 | 
			
		||||
import org.acra.collector.CrashReportData;
 | 
			
		||||
import org.acra.sender.ReportSender;
 | 
			
		||||
import org.acra.sender.ReportSenderException;
 | 
			
		||||
import org.schabi.newpipe.R;
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
@@ -31,7 +30,7 @@ import org.schabi.newpipe.R;
 | 
			
		||||
public class AcraReportSender implements ReportSender {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void send(@NonNull Context context, @NonNull CrashReportData report) throws ReportSenderException {
 | 
			
		||||
    public void send(@NonNull Context context, @NonNull CrashReportData report) {
 | 
			
		||||
        ErrorActivity.reportError(context, report,
 | 
			
		||||
                ErrorActivity.ErrorInfo.make(UserAction.UI_ERROR,"none",
 | 
			
		||||
                        "App crash, UI failure", R.string.app_ui_crash));
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,6 @@ package org.schabi.newpipe.report;
 | 
			
		||||
import android.app.Activity;
 | 
			
		||||
import android.app.AlertDialog;
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.content.DialogInterface;
 | 
			
		||||
import android.content.Intent;
 | 
			
		||||
import android.graphics.Color;
 | 
			
		||||
import android.net.Uri;
 | 
			
		||||
@@ -46,7 +45,6 @@ import java.util.Date;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.TimeZone;
 | 
			
		||||
import java.util.Vector;
 | 
			
		||||
import java.util.concurrent.atomic.AtomicBoolean;
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Created by Christian Schabesberger on 24.10.15.
 | 
			
		||||
@@ -81,12 +79,7 @@ public class ErrorActivity extends AppCompatActivity {
 | 
			
		||||
    private ErrorInfo errorInfo;
 | 
			
		||||
    private Class returnActivity;
 | 
			
		||||
    private String currentTimeStamp;
 | 
			
		||||
    // views
 | 
			
		||||
    private TextView errorView;
 | 
			
		||||
    private EditText userCommentBox;
 | 
			
		||||
    private Button reportButton;
 | 
			
		||||
    private TextView infoView;
 | 
			
		||||
    private TextView errorMessageView;
 | 
			
		||||
 | 
			
		||||
    public static void reportUiError(final AppCompatActivity activity, final Throwable el) {
 | 
			
		||||
        reportError(activity, el, activity.getClass(), null,
 | 
			
		||||
@@ -194,11 +187,11 @@ public class ErrorActivity extends AppCompatActivity {
 | 
			
		||||
            actionBar.setDisplayShowTitleEnabled(true);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        reportButton = findViewById(R.id.errorReportButton);
 | 
			
		||||
        Button reportButton = findViewById(R.id.errorReportButton);
 | 
			
		||||
        userCommentBox = findViewById(R.id.errorCommentBox);
 | 
			
		||||
        errorView = findViewById(R.id.errorView);
 | 
			
		||||
        infoView = findViewById(R.id.errorInfosView);
 | 
			
		||||
        errorMessageView = findViewById(R.id.errorMessageView);
 | 
			
		||||
        TextView errorView = findViewById(R.id.errorView);
 | 
			
		||||
        TextView infoView = findViewById(R.id.errorInfosView);
 | 
			
		||||
        TextView errorMessageView = findViewById(R.id.errorMessageView);
 | 
			
		||||
 | 
			
		||||
        ActivityCommunicator ac = ActivityCommunicator.getCommunicator();
 | 
			
		||||
        returnActivity = ac.returnActivity;
 | 
			
		||||
@@ -281,15 +274,14 @@ public class ErrorActivity extends AppCompatActivity {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private String formErrorText(String[] el) {
 | 
			
		||||
        String text = "";
 | 
			
		||||
        StringBuilder text = new StringBuilder();
 | 
			
		||||
        if (el != null) {
 | 
			
		||||
            for (String e : el) {
 | 
			
		||||
                text += "-------------------------------------\n"
 | 
			
		||||
                        + e;
 | 
			
		||||
                text.append("-------------------------------------\n").append(e);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        text += "-------------------------------------";
 | 
			
		||||
        return text;
 | 
			
		||||
        text.append("-------------------------------------");
 | 
			
		||||
        return text.toString();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,6 @@ import android.os.Bundle;
 | 
			
		||||
import android.provider.Settings;
 | 
			
		||||
import android.support.annotation.Nullable;
 | 
			
		||||
import android.support.v7.preference.Preference;
 | 
			
		||||
import android.util.Log;
 | 
			
		||||
 | 
			
		||||
import org.schabi.newpipe.R;
 | 
			
		||||
import org.schabi.newpipe.util.Constants;
 | 
			
		||||
@@ -49,7 +48,7 @@ public class AppearanceSettingsFragment extends BasePreferenceFragment {
 | 
			
		||||
        return super.onPreferenceTreeClick(preference);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private Preference.OnPreferenceChangeListener themePreferenceChange = new Preference.OnPreferenceChangeListener() {
 | 
			
		||||
    private final Preference.OnPreferenceChangeListener themePreferenceChange = new Preference.OnPreferenceChangeListener() {
 | 
			
		||||
        @Override
 | 
			
		||||
        public boolean onPreferenceChange(Preference preference, Object newValue) {
 | 
			
		||||
            defaultPreferences.edit().putBoolean(Constants.KEY_THEME_CHANGE, true).apply();
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,7 @@ import org.schabi.newpipe.MainActivity;
 | 
			
		||||
 | 
			
		||||
public abstract class BasePreferenceFragment extends PreferenceFragmentCompat {
 | 
			
		||||
    protected final String TAG = getClass().getSimpleName() + "@" + Integer.toHexString(hashCode());
 | 
			
		||||
    protected boolean DEBUG = MainActivity.DEBUG;
 | 
			
		||||
    protected final boolean DEBUG = MainActivity.DEBUG;
 | 
			
		||||
 | 
			
		||||
    protected SharedPreferences defaultPreferences;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -9,8 +9,6 @@ import android.os.Bundle;
 | 
			
		||||
import android.preference.PreferenceManager;
 | 
			
		||||
import android.support.annotation.NonNull;
 | 
			
		||||
import android.support.annotation.Nullable;
 | 
			
		||||
import android.support.v4.app.Fragment;
 | 
			
		||||
import android.support.v7.preference.ListPreference;
 | 
			
		||||
import android.support.v7.preference.Preference;
 | 
			
		||||
import android.util.Log;
 | 
			
		||||
import android.widget.Toast;
 | 
			
		||||
@@ -19,12 +17,9 @@ import com.nononsenseapps.filepicker.Utils;
 | 
			
		||||
import com.nostra13.universalimageloader.core.ImageLoader;
 | 
			
		||||
 | 
			
		||||
import org.schabi.newpipe.R;
 | 
			
		||||
import org.schabi.newpipe.extractor.NewPipe;
 | 
			
		||||
import org.schabi.newpipe.extractor.StreamingService;
 | 
			
		||||
import org.schabi.newpipe.report.ErrorActivity;
 | 
			
		||||
import org.schabi.newpipe.report.UserAction;
 | 
			
		||||
import org.schabi.newpipe.util.FilePickerActivityHelper;
 | 
			
		||||
import org.schabi.newpipe.util.KioskTranslator;
 | 
			
		||||
import org.schabi.newpipe.util.ZipHelper;
 | 
			
		||||
 | 
			
		||||
import java.io.BufferedOutputStream;
 | 
			
		||||
@@ -47,7 +42,6 @@ public class ContentSettingsFragment extends BasePreferenceFragment {
 | 
			
		||||
    private static final int REQUEST_IMPORT_PATH = 8945;
 | 
			
		||||
    private static final int REQUEST_EXPORT_PATH = 30945;
 | 
			
		||||
 | 
			
		||||
    private String homeDir;
 | 
			
		||||
    private File databasesDir;
 | 
			
		||||
    private File newpipe_db;
 | 
			
		||||
    private File newpipe_db_journal;
 | 
			
		||||
@@ -81,7 +75,7 @@ public class ContentSettingsFragment extends BasePreferenceFragment {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
 | 
			
		||||
 | 
			
		||||
        homeDir = getActivity().getApplicationInfo().dataDir;
 | 
			
		||||
        String homeDir = getActivity().getApplicationInfo().dataDir;
 | 
			
		||||
        databasesDir = new File(homeDir + "/databases");
 | 
			
		||||
        newpipe_db = new File(homeDir + "/databases/newpipe.db");
 | 
			
		||||
        newpipe_db_journal = new File(homeDir + "/databases/newpipe.db-journal");
 | 
			
		||||
@@ -193,7 +187,7 @@ public class ContentSettingsFragment extends BasePreferenceFragment {
 | 
			
		||||
        } finally {
 | 
			
		||||
            try {
 | 
			
		||||
                zipFile.close();
 | 
			
		||||
            } catch (Exception e){}
 | 
			
		||||
            } catch (Exception ignored){}
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
@@ -254,17 +248,17 @@ public class ContentSettingsFragment extends BasePreferenceFragment {
 | 
			
		||||
                String key = entry.getKey();
 | 
			
		||||
 | 
			
		||||
                if (v instanceof Boolean)
 | 
			
		||||
                    prefEdit.putBoolean(key, ((Boolean) v).booleanValue());
 | 
			
		||||
                    prefEdit.putBoolean(key, (Boolean) v);
 | 
			
		||||
                else if (v instanceof Float)
 | 
			
		||||
                    prefEdit.putFloat(key, ((Float) v).floatValue());
 | 
			
		||||
                    prefEdit.putFloat(key, (Float) v);
 | 
			
		||||
                else if (v instanceof Integer)
 | 
			
		||||
                    prefEdit.putInt(key, ((Integer) v).intValue());
 | 
			
		||||
                    prefEdit.putInt(key, (Integer) v);
 | 
			
		||||
                else if (v instanceof Long)
 | 
			
		||||
                    prefEdit.putLong(key, ((Long) v).longValue());
 | 
			
		||||
                    prefEdit.putLong(key, (Long) v);
 | 
			
		||||
                else if (v instanceof String)
 | 
			
		||||
                    prefEdit.putString(key, ((String) v));
 | 
			
		||||
            }
 | 
			
		||||
            prefEdit.commit();
 | 
			
		||||
            prefEdit.apply();
 | 
			
		||||
        } catch (FileNotFoundException e) {
 | 
			
		||||
            e.printStackTrace();
 | 
			
		||||
        } catch (IOException e) {
 | 
			
		||||
@@ -286,13 +280,12 @@ public class ContentSettingsFragment extends BasePreferenceFragment {
 | 
			
		||||
    // Error
 | 
			
		||||
    //////////////////////////////////////////////////////////////////////////*/
 | 
			
		||||
 | 
			
		||||
    protected boolean onError(Throwable e) {
 | 
			
		||||
    protected void onError(Throwable e) {
 | 
			
		||||
        final Activity activity = getActivity();
 | 
			
		||||
        ErrorActivity.reportError(activity, e,
 | 
			
		||||
                activity.getClass(),
 | 
			
		||||
                null,
 | 
			
		||||
                ErrorActivity.ErrorInfo.make(UserAction.UI_ERROR,
 | 
			
		||||
                        "none", "", R.string.app_ui_crash));
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,29 +1,20 @@
 | 
			
		||||
package org.schabi.newpipe.settings;
 | 
			
		||||
 | 
			
		||||
import android.content.DialogInterface;
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import android.support.annotation.Nullable;
 | 
			
		||||
import android.support.design.widget.Snackbar;
 | 
			
		||||
import android.support.v7.app.AlertDialog;
 | 
			
		||||
import android.support.v7.preference.Preference;
 | 
			
		||||
import android.util.Log;
 | 
			
		||||
import android.widget.Toast;
 | 
			
		||||
 | 
			
		||||
import org.schabi.newpipe.MainActivity;
 | 
			
		||||
import org.schabi.newpipe.R;
 | 
			
		||||
import org.schabi.newpipe.local.history.HistoryRecordManager;
 | 
			
		||||
import org.schabi.newpipe.report.ErrorActivity;
 | 
			
		||||
import org.schabi.newpipe.report.UserAction;
 | 
			
		||||
import org.schabi.newpipe.util.InfoCache;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Collection;
 | 
			
		||||
 | 
			
		||||
import io.reactivex.Single;
 | 
			
		||||
import io.reactivex.android.schedulers.AndroidSchedulers;
 | 
			
		||||
import io.reactivex.disposables.CompositeDisposable;
 | 
			
		||||
import io.reactivex.disposables.Disposable;
 | 
			
		||||
import io.reactivex.disposables.Disposables;
 | 
			
		||||
 | 
			
		||||
public class HistorySettingsFragment extends BasePreferenceFragment {
 | 
			
		||||
    private String cacheWipeKey;
 | 
			
		||||
 
 | 
			
		||||
@@ -51,9 +51,7 @@ import io.reactivex.schedulers.Schedulers;
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
public class SelectChannelFragment extends DialogFragment {
 | 
			
		||||
    private SelectChannelAdapter channelAdapter;
 | 
			
		||||
    private SubscriptionService subscriptionService;
 | 
			
		||||
    private ImageLoader imageLoader = ImageLoader.getInstance();
 | 
			
		||||
    private final ImageLoader imageLoader = ImageLoader.getInstance();
 | 
			
		||||
 | 
			
		||||
    private ProgressBar progressBar;
 | 
			
		||||
    private TextView emptyView;
 | 
			
		||||
@@ -89,9 +87,9 @@ public class SelectChannelFragment extends DialogFragment {
 | 
			
		||||
    @Override
 | 
			
		||||
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
 | 
			
		||||
        View v = inflater.inflate(R.layout.select_channel_fragment, container, false);
 | 
			
		||||
        recyclerView = (RecyclerView) v.findViewById(R.id.items_list);
 | 
			
		||||
        recyclerView = v.findViewById(R.id.items_list);
 | 
			
		||||
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
 | 
			
		||||
        channelAdapter = new SelectChannelAdapter();
 | 
			
		||||
        SelectChannelAdapter channelAdapter = new SelectChannelAdapter();
 | 
			
		||||
        recyclerView.setAdapter(channelAdapter);
 | 
			
		||||
 | 
			
		||||
        progressBar = v.findViewById(R.id.progressBar);
 | 
			
		||||
@@ -101,7 +99,7 @@ public class SelectChannelFragment extends DialogFragment {
 | 
			
		||||
        emptyView.setVisibility(View.GONE);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        subscriptionService = SubscriptionService.getInstance(getContext());
 | 
			
		||||
        SubscriptionService subscriptionService = SubscriptionService.getInstance(getContext());
 | 
			
		||||
        subscriptionService.getSubscription().toObservable()
 | 
			
		||||
                .subscribeOn(Schedulers.io())
 | 
			
		||||
                .observeOn(AndroidSchedulers.mainThread())
 | 
			
		||||
@@ -203,9 +201,9 @@ public class SelectChannelFragment extends DialogFragment {
 | 
			
		||||
                thumbnailView = v.findViewById(R.id.itemThumbnailView);
 | 
			
		||||
                titleView = v.findViewById(R.id.itemTitleView);
 | 
			
		||||
            }
 | 
			
		||||
            public View view;
 | 
			
		||||
            public CircleImageView thumbnailView;
 | 
			
		||||
            public TextView titleView;
 | 
			
		||||
            public final View view;
 | 
			
		||||
            public final CircleImageView thumbnailView;
 | 
			
		||||
            public final TextView titleView;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -213,14 +211,13 @@ public class SelectChannelFragment extends DialogFragment {
 | 
			
		||||
    // Error
 | 
			
		||||
    //////////////////////////////////////////////////////////////////////////*/
 | 
			
		||||
 | 
			
		||||
    protected boolean onError(Throwable e) {
 | 
			
		||||
    protected void onError(Throwable e) {
 | 
			
		||||
        final Activity activity = getActivity();
 | 
			
		||||
        ErrorActivity.reportError(activity, e,
 | 
			
		||||
                activity.getClass(),
 | 
			
		||||
                null,
 | 
			
		||||
                ErrorActivity.ErrorInfo.make(UserAction.UI_ERROR,
 | 
			
		||||
                        "none", "", R.string.app_ui_crash));
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -75,7 +75,7 @@ public class SelectKioskFragment extends DialogFragment {
 | 
			
		||||
    @Override
 | 
			
		||||
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
 | 
			
		||||
        View v = inflater.inflate(R.layout.select_kiosk_fragment, container, false);
 | 
			
		||||
        recyclerView = (RecyclerView) v.findViewById(R.id.items_list);
 | 
			
		||||
        recyclerView = v.findViewById(R.id.items_list);
 | 
			
		||||
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
 | 
			
		||||
        try {
 | 
			
		||||
            selectKioskAdapter = new SelectKioskAdapter();
 | 
			
		||||
@@ -112,13 +112,13 @@ public class SelectKioskFragment extends DialogFragment {
 | 
			
		||||
            public Entry (int i, int si, String ki, String kn){
 | 
			
		||||
                icon = i; serviceId=si; kioskId=ki; kioskName = kn;
 | 
			
		||||
            }
 | 
			
		||||
            int icon;
 | 
			
		||||
            int serviceId;
 | 
			
		||||
            String kioskId;
 | 
			
		||||
            String kioskName;
 | 
			
		||||
            final int icon;
 | 
			
		||||
            final int serviceId;
 | 
			
		||||
            final String kioskId;
 | 
			
		||||
            final String kioskName;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private List<Entry> kioskList = new Vector<>();
 | 
			
		||||
        private final List<Entry> kioskList = new Vector<>();
 | 
			
		||||
 | 
			
		||||
        public SelectKioskAdapter()
 | 
			
		||||
                throws Exception {
 | 
			
		||||
@@ -157,9 +157,9 @@ public class SelectKioskFragment extends DialogFragment {
 | 
			
		||||
                thumbnailView = v.findViewById(R.id.itemThumbnailView);
 | 
			
		||||
                titleView = v.findViewById(R.id.itemTitleView);
 | 
			
		||||
            }
 | 
			
		||||
            public View view;
 | 
			
		||||
            public ImageView thumbnailView;
 | 
			
		||||
            public TextView titleView;
 | 
			
		||||
            public final View view;
 | 
			
		||||
            public final ImageView thumbnailView;
 | 
			
		||||
            public final TextView titleView;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void onBindViewHolder(SelectKioskItemHolder holder, final int position) {
 | 
			
		||||
@@ -179,13 +179,12 @@ public class SelectKioskFragment extends DialogFragment {
 | 
			
		||||
    // Error
 | 
			
		||||
    //////////////////////////////////////////////////////////////////////////*/
 | 
			
		||||
 | 
			
		||||
    protected boolean onError(Throwable e) {
 | 
			
		||||
    protected void onError(Throwable e) {
 | 
			
		||||
        final Activity activity = getActivity();
 | 
			
		||||
        ErrorActivity.reportError(activity, e,
 | 
			
		||||
                activity.getClass(),
 | 
			
		||||
                null,
 | 
			
		||||
                ErrorActivity.ErrorInfo.make(UserAction.UI_ERROR,
 | 
			
		||||
                        "none", "", R.string.app_ui_crash));
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -183,7 +183,7 @@ public final class ExtractorHelper {
 | 
			
		||||
            cache.removeInfo(serviceId, url);
 | 
			
		||||
            load = loadFromNetwork;
 | 
			
		||||
        } else {
 | 
			
		||||
            load = Maybe.concat(ExtractorHelper.<I>loadFromCache(serviceId, url),
 | 
			
		||||
            load = Maybe.concat(ExtractorHelper.loadFromCache(serviceId, url),
 | 
			
		||||
                    loadFromNetwork.toMaybe())
 | 
			
		||||
                    .firstElement() //Take the first valid
 | 
			
		||||
                    .toSingle();
 | 
			
		||||
 
 | 
			
		||||
@@ -28,9 +28,6 @@ import org.schabi.newpipe.MainActivity;
 | 
			
		||||
import org.schabi.newpipe.extractor.Info;
 | 
			
		||||
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.concurrent.TimeUnit;
 | 
			
		||||
 | 
			
		||||
import static org.schabi.newpipe.extractor.ServiceList.SoundCloud;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
public final class InfoCache {
 | 
			
		||||
@@ -58,7 +55,7 @@ public final class InfoCache {
 | 
			
		||||
    public Info getFromKey(int serviceId, @NonNull String url) {
 | 
			
		||||
        if (DEBUG) Log.d(TAG, "getFromKey() called with: serviceId = [" + serviceId + "], url = [" + url + "]");
 | 
			
		||||
        synchronized (lruCache) {
 | 
			
		||||
            return getInfo(lruCache, keyOf(serviceId, url));
 | 
			
		||||
            return getInfo(keyOf(serviceId, url));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -89,7 +86,7 @@ public final class InfoCache {
 | 
			
		||||
    public void trimCache() {
 | 
			
		||||
        if (DEBUG) Log.d(TAG, "trimCache() called");
 | 
			
		||||
        synchronized (lruCache) {
 | 
			
		||||
            removeStaleCache(lruCache);
 | 
			
		||||
            removeStaleCache();
 | 
			
		||||
            lruCache.trimToSize(TRIM_CACHE_TO);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -105,23 +102,22 @@ public final class InfoCache {
 | 
			
		||||
        return serviceId + url;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static void removeStaleCache(@NonNull final LruCache<String, CacheData> cache) {
 | 
			
		||||
        for (Map.Entry<String, CacheData> entry : cache.snapshot().entrySet()) {
 | 
			
		||||
    private static void removeStaleCache() {
 | 
			
		||||
        for (Map.Entry<String, CacheData> entry : InfoCache.lruCache.snapshot().entrySet()) {
 | 
			
		||||
            final CacheData data = entry.getValue();
 | 
			
		||||
            if (data != null && data.isExpired()) {
 | 
			
		||||
                cache.remove(entry.getKey());
 | 
			
		||||
                InfoCache.lruCache.remove(entry.getKey());
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Nullable
 | 
			
		||||
    private static Info getInfo(@NonNull final LruCache<String, CacheData> cache,
 | 
			
		||||
                                @NonNull final String key) {
 | 
			
		||||
        final CacheData data = cache.get(key);
 | 
			
		||||
    private static Info getInfo(@NonNull final String key) {
 | 
			
		||||
        final CacheData data = InfoCache.lruCache.get(key);
 | 
			
		||||
        if (data == null) return null;
 | 
			
		||||
 | 
			
		||||
        if (data.isExpired()) {
 | 
			
		||||
            cache.remove(key);
 | 
			
		||||
            InfoCache.lruCache.remove(key);
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -204,7 +204,7 @@ public final class ListHelper {
 | 
			
		||||
     */
 | 
			
		||||
    private static void sortStreamList(List<VideoStream> videoStreams, final boolean ascendingOrder) {
 | 
			
		||||
        Collections.sort(videoStreams, (o1, o2) -> {
 | 
			
		||||
            int result = compareVideoStreamResolution(o1, o2, VIDEO_FORMAT_QUALITY_RANKING);
 | 
			
		||||
            int result = compareVideoStreamResolution(o1, o2);
 | 
			
		||||
            return result == 0 ? 0 : (ascendingOrder ? result : -result);
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
@@ -399,8 +399,7 @@ public final class ListHelper {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Compares the quality of two video streams.
 | 
			
		||||
    private static int compareVideoStreamResolution(VideoStream streamA, VideoStream streamB,
 | 
			
		||||
                                                    List<MediaFormat> formatRanking) {
 | 
			
		||||
    private static int compareVideoStreamResolution(VideoStream streamA, VideoStream streamB) {
 | 
			
		||||
        if (streamA == null) {
 | 
			
		||||
            return -1;
 | 
			
		||||
        }
 | 
			
		||||
@@ -414,7 +413,7 @@ public final class ListHelper {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Same bitrate and format
 | 
			
		||||
        return formatRanking.indexOf(streamA.getFormat()) - formatRanking.indexOf(streamB.getFormat());
 | 
			
		||||
        return ListHelper.VIDEO_FORMAT_QUALITY_RANKING.indexOf(streamA.getFormat()) - ListHelper.VIDEO_FORMAT_QUALITY_RANKING.indexOf(streamB.getFormat());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,6 @@ import org.schabi.newpipe.download.DownloadActivity;
 | 
			
		||||
import org.schabi.newpipe.extractor.NewPipe;
 | 
			
		||||
import org.schabi.newpipe.extractor.StreamingService;
 | 
			
		||||
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
 | 
			
		||||
import org.schabi.newpipe.extractor.search.SearchExtractor;
 | 
			
		||||
import org.schabi.newpipe.extractor.stream.AudioStream;
 | 
			
		||||
import org.schabi.newpipe.extractor.stream.Stream;
 | 
			
		||||
import org.schabi.newpipe.extractor.stream.StreamInfo;
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,6 @@ package org.schabi.newpipe.util;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.os.Build;
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import android.os.Parcel;
 | 
			
		||||
import android.os.Parcelable;
 | 
			
		||||
 
 | 
			
		||||
@@ -31,7 +31,7 @@ import us.shandian.giga.util.Utility;
 | 
			
		||||
public class StreamItemAdapter<T extends Stream> extends BaseAdapter {
 | 
			
		||||
    private final Context context;
 | 
			
		||||
 | 
			
		||||
    private StreamSizeWrapper<T> streamsWrapper;
 | 
			
		||||
    private final StreamSizeWrapper<T> streamsWrapper;
 | 
			
		||||
    private final boolean showIconNoAudio;
 | 
			
		||||
 | 
			
		||||
    public StreamItemAdapter(Context context, StreamSizeWrapper<T> streamsWrapper, boolean showIconNoAudio) {
 | 
			
		||||
@@ -124,7 +124,7 @@ public class StreamItemAdapter<T extends Stream> extends BaseAdapter {
 | 
			
		||||
    public static class StreamSizeWrapper<T extends Stream> implements Serializable {
 | 
			
		||||
        private static final StreamSizeWrapper<Stream> EMPTY = new StreamSizeWrapper<>(Collections.emptyList());
 | 
			
		||||
        private final List<T> streamsList;
 | 
			
		||||
        private long[] streamSizes;
 | 
			
		||||
        private final long[] streamSizes;
 | 
			
		||||
 | 
			
		||||
        public StreamSizeWrapper(List<T> streamsList) {
 | 
			
		||||
            this.streamsList = streamsList;
 | 
			
		||||
 
 | 
			
		||||
@@ -56,7 +56,6 @@ public class ZipHelper {
 | 
			
		||||
    /**
 | 
			
		||||
     * This will extract data from Zipfiles.
 | 
			
		||||
     * Caution this will override the original file.
 | 
			
		||||
     * @param inZip The ZipOutputStream where the data is stored in
 | 
			
		||||
     * @param file The path of the file on the disk where the data should be extracted to.
 | 
			
		||||
     * @param name The path of the file inside the zip.
 | 
			
		||||
     * @return will return true if the file was found within the zip file
 | 
			
		||||
 
 | 
			
		||||
@@ -81,7 +81,7 @@ public class CollapsibleView extends LinearLayout {
 | 
			
		||||
 | 
			
		||||
    private int targetHeight = -1;
 | 
			
		||||
    private ValueAnimator currentAnimator;
 | 
			
		||||
    private List<StateListener> listeners = new ArrayList<>();
 | 
			
		||||
    private final List<StateListener> listeners = new ArrayList<>();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This method recalculates the height of this view so it <b>must</b> be called when
 | 
			
		||||
 
 | 
			
		||||
@@ -123,7 +123,7 @@ public class DownloadManagerImpl implements DownloadManager {
 | 
			
		||||
        Collections.sort(missions, new Comparator<DownloadMission>() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public int compare(DownloadMission o1, DownloadMission o2) {
 | 
			
		||||
                return Long.valueOf(o1.timestamp).compareTo(o2.timestamp);
 | 
			
		||||
                return Long.compare(o1.timestamp, o2.timestamp);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -67,8 +67,8 @@ public class DownloadMission implements Serializable {
 | 
			
		||||
    public long done;
 | 
			
		||||
    public int threadCount = 3;
 | 
			
		||||
    public int finishCount;
 | 
			
		||||
    private List<Long> threadPositions = new ArrayList<Long>();
 | 
			
		||||
    public final Map<Long, Boolean> blockState = new HashMap<Long, Boolean>();
 | 
			
		||||
    private final List<Long> threadPositions = new ArrayList<>();
 | 
			
		||||
    public final Map<Long, Boolean> blockState = new HashMap<>();
 | 
			
		||||
    public boolean running;
 | 
			
		||||
    public boolean finished;
 | 
			
		||||
    public boolean fallback;
 | 
			
		||||
@@ -77,7 +77,7 @@ public class DownloadMission implements Serializable {
 | 
			
		||||
 | 
			
		||||
    public transient boolean recovered;
 | 
			
		||||
 | 
			
		||||
    private transient ArrayList<WeakReference<MissionListener>> mListeners = new ArrayList<WeakReference<MissionListener>>();
 | 
			
		||||
    private transient ArrayList<WeakReference<MissionListener>> mListeners = new ArrayList<>();
 | 
			
		||||
    private transient boolean mWritingToFile;
 | 
			
		||||
 | 
			
		||||
    private static final int NO_IDENTIFIER = -1;
 | 
			
		||||
@@ -232,7 +232,7 @@ public class DownloadMission implements Serializable {
 | 
			
		||||
    public synchronized void addListener(MissionListener listener) {
 | 
			
		||||
        Handler handler = new Handler(Looper.getMainLooper());
 | 
			
		||||
        MissionListener.handlerStore.put(listener, handler);
 | 
			
		||||
        mListeners.add(new WeakReference<MissionListener>(listener));
 | 
			
		||||
        mListeners.add(new WeakReference<>(listener));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public synchronized void removeListener(MissionListener listener) {
 | 
			
		||||
 
 | 
			
		||||
@@ -92,7 +92,7 @@ public class DownloadRunnable implements Runnable {
 | 
			
		||||
                // A server may be ignoring the range request
 | 
			
		||||
                if (conn.getResponseCode() != 206) {
 | 
			
		||||
                    mMission.errCode = DownloadMission.ERROR_SERVER_UNSUPPORTED;
 | 
			
		||||
                    notifyError(DownloadMission.ERROR_SERVER_UNSUPPORTED);
 | 
			
		||||
                    notifyError();
 | 
			
		||||
 | 
			
		||||
                    if (DEBUG) {
 | 
			
		||||
                        Log.e(TAG, mId + ":Unsupported " + conn.getResponseCode());
 | 
			
		||||
@@ -161,9 +161,9 @@ public class DownloadRunnable implements Runnable {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void notifyError(final int err) {
 | 
			
		||||
    private void notifyError() {
 | 
			
		||||
        synchronized (mMission) {
 | 
			
		||||
            mMission.notifyError(err);
 | 
			
		||||
            mMission.notifyError(DownloadMission.ERROR_SERVER_UNSUPPORTED);
 | 
			
		||||
            mMission.pause();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -56,7 +56,7 @@ public class DownloadManagerService extends Service {
 | 
			
		||||
    private DownloadDataSource mDataSource;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    private MissionListener missionListener = new MissionListener();
 | 
			
		||||
    private final MissionListener missionListener = new MissionListener();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    private void notifyMediaScanner(DownloadMission mission) {
 | 
			
		||||
 
 | 
			
		||||
@@ -306,12 +306,12 @@ public class MissionAdapter extends RecyclerView.Adapter<MissionAdapter.ViewHold
 | 
			
		||||
        public DownloadMission mission;
 | 
			
		||||
        public int position;
 | 
			
		||||
 | 
			
		||||
        public TextView status;
 | 
			
		||||
        public ImageView icon;
 | 
			
		||||
        public TextView name;
 | 
			
		||||
        public TextView size;
 | 
			
		||||
        public View bkg;
 | 
			
		||||
        public ImageView menu;
 | 
			
		||||
        public final TextView status;
 | 
			
		||||
        public final ImageView icon;
 | 
			
		||||
        public final TextView name;
 | 
			
		||||
        public final TextView size;
 | 
			
		||||
        public final View bkg;
 | 
			
		||||
        public final ImageView menu;
 | 
			
		||||
        public ProgressDrawable progress;
 | 
			
		||||
        public MissionObserver observer;
 | 
			
		||||
 | 
			
		||||
@@ -332,8 +332,8 @@ public class MissionAdapter extends RecyclerView.Adapter<MissionAdapter.ViewHold
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    static class MissionObserver implements DownloadMission.MissionListener {
 | 
			
		||||
        private MissionAdapter mAdapter;
 | 
			
		||||
        private ViewHolder mHolder;
 | 
			
		||||
        private final MissionAdapter mAdapter;
 | 
			
		||||
        private final ViewHolder mHolder;
 | 
			
		||||
 | 
			
		||||
        public MissionObserver(MissionAdapter adapter, ViewHolder holder) {
 | 
			
		||||
            mAdapter = adapter;
 | 
			
		||||
@@ -365,7 +365,7 @@ public class MissionAdapter extends RecyclerView.Adapter<MissionAdapter.ViewHold
 | 
			
		||||
 | 
			
		||||
    private static class ChecksumTask extends AsyncTask<String, Void, String> {
 | 
			
		||||
        ProgressDialog prog;
 | 
			
		||||
        WeakReference<Activity> weakReference;
 | 
			
		||||
        final WeakReference<Activity> weakReference;
 | 
			
		||||
 | 
			
		||||
        ChecksumTask(@NonNull Activity activity) {
 | 
			
		||||
            weakReference = new WeakReference<>(activity);
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,8 @@ import android.support.v4.content.ContextCompat;
 | 
			
		||||
 | 
			
		||||
public class ProgressDrawable extends Drawable {
 | 
			
		||||
    private float mProgress;
 | 
			
		||||
    private int mBackgroundColor, mForegroundColor;
 | 
			
		||||
    private final int mBackgroundColor;
 | 
			
		||||
    private final int mForegroundColor;
 | 
			
		||||
 | 
			
		||||
    public ProgressDrawable(Context context, @ColorRes int background, @ColorRes int foreground) {
 | 
			
		||||
        this(ContextCompat.getColor(context, background), ContextCompat.getColor(context, foreground));
 | 
			
		||||
 
 | 
			
		||||
@@ -16,6 +16,8 @@ import android.support.v7.widget.GridLayoutManager;
 | 
			
		||||
import android.support.v7.widget.LinearLayoutManager;
 | 
			
		||||
import android.support.v7.widget.RecyclerView;
 | 
			
		||||
import android.view.LayoutInflater;
 | 
			
		||||
import android.view.Menu;
 | 
			
		||||
import android.view.MenuInflater;
 | 
			
		||||
import android.view.MenuItem;
 | 
			
		||||
import android.view.View;
 | 
			
		||||
import android.view.ViewGroup;
 | 
			
		||||
@@ -44,7 +46,7 @@ public abstract class MissionsFragment extends Fragment {
 | 
			
		||||
    private DeleteDownloadManager mDeleteDownloadManager;
 | 
			
		||||
    private Disposable mDeleteDisposable;
 | 
			
		||||
 | 
			
		||||
    private ServiceConnection mConnection = new ServiceConnection() {
 | 
			
		||||
    private final ServiceConnection mConnection = new ServiceConnection() {
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public void onServiceConnected(ComponentName name, IBinder binder) {
 | 
			
		||||
@@ -144,17 +146,21 @@ public abstract class MissionsFragment extends Fragment {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean onOptionsItemSelected(MenuItem item) {
 | 
			
		||||
        return super.onOptionsItemSelected(item);
 | 
			
		||||
    public void onPrepareOptionsMenu(Menu menu) {
 | 
			
		||||
        mSwitch = menu.findItem(R.id.switch_mode);
 | 
			
		||||
        super.onPrepareOptionsMenu(menu);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
		/*switch (item.getItemId()) {
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean onOptionsItemSelected(MenuItem item) {
 | 
			
		||||
        switch (item.getItemId()) {
 | 
			
		||||
            case R.id.switch_mode:
 | 
			
		||||
				mLinear = !mLinear;
 | 
			
		||||
				updateList();
 | 
			
		||||
				return true;
 | 
			
		||||
			default:
 | 
			
		||||
				return super.onOptionsItemSelected(item);
 | 
			
		||||
		}*/
 | 
			
		||||
		}
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void notifyChange() {
 | 
			
		||||
 
 | 
			
		||||
@@ -11,9 +11,7 @@ import android.widget.Toast;
 | 
			
		||||
 | 
			
		||||
import org.schabi.newpipe.R;
 | 
			
		||||
 | 
			
		||||
import java.io.BufferedInputStream;
 | 
			
		||||
import java.io.BufferedOutputStream;
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.io.FileInputStream;
 | 
			
		||||
import java.io.FileNotFoundException;
 | 
			
		||||
import java.io.FileOutputStream;
 | 
			
		||||
@@ -198,7 +196,7 @@ public class Utility {
 | 
			
		||||
            while ((len = i.read(buf)) != -1) {
 | 
			
		||||
                md.update(buf, 0, len);
 | 
			
		||||
            }
 | 
			
		||||
        } catch (IOException e) {
 | 
			
		||||
        } catch (IOException ignored) {
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -16,7 +16,8 @@
 | 
			
		||||
        android:layout_height="match_parent"
 | 
			
		||||
        android:background="?attr/colorPrimary"
 | 
			
		||||
        android:scaleType="centerCrop"
 | 
			
		||||
        android:src="@drawable/background_header" />
 | 
			
		||||
        android:src="@drawable/background_header"
 | 
			
		||||
        android:contentDescription="TODO" />
 | 
			
		||||
 | 
			
		||||
    <ImageView
 | 
			
		||||
        android:id="@+id/drawer_header_np_nude_view"
 | 
			
		||||
@@ -26,7 +27,8 @@
 | 
			
		||||
 | 
			
		||||
        android:layout_marginStart="30dp"
 | 
			
		||||
        android:layout_marginTop="30dp"
 | 
			
		||||
        android:src="@drawable/np_logo_nude_shadow" />
 | 
			
		||||
        android:src="@drawable/np_logo_nude_shadow"
 | 
			
		||||
        android:contentDescription="TODO" />
 | 
			
		||||
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/drawer_header_np_text_view"
 | 
			
		||||
@@ -38,7 +40,7 @@
 | 
			
		||||
        android:layout_toRightOf="@id/drawer_header_np_nude_view"
 | 
			
		||||
        android:gravity="center"
 | 
			
		||||
        android:text="@string/app_name"
 | 
			
		||||
        android:textSize="30dp"
 | 
			
		||||
        android:textSize="30sp"
 | 
			
		||||
        android:textColor="@color/drawer_header_font_color"
 | 
			
		||||
        android:textStyle="bold|italic" />
 | 
			
		||||
 | 
			
		||||
@@ -50,7 +52,7 @@
 | 
			
		||||
        android:layout_alignStart="@id/drawer_header_np_text_view"
 | 
			
		||||
        android:layout_below="@id/drawer_header_np_text_view"
 | 
			
		||||
        android:text="YouTube"
 | 
			
		||||
        android:textSize="18dp"
 | 
			
		||||
        android:textSize="18sp"
 | 
			
		||||
        android:textColor="@color/drawer_header_font_color"
 | 
			
		||||
        android:textStyle="italic" />
 | 
			
		||||
 | 
			
		||||
@@ -66,6 +68,7 @@
 | 
			
		||||
        android:paddingBottom="20dp"
 | 
			
		||||
        android:paddingEnd="20dp"
 | 
			
		||||
        android:paddingRight="20dp"
 | 
			
		||||
        android:src="@drawable/ic_arrow_down_white" />
 | 
			
		||||
        android:src="@drawable/ic_arrow_down_white"
 | 
			
		||||
        android:contentDescription="TODO" />
 | 
			
		||||
 | 
			
		||||
</RelativeLayout>
 | 
			
		||||
@@ -114,7 +114,8 @@
 | 
			
		||||
            <EditText
 | 
			
		||||
                android:id="@+id/errorCommentBox"
 | 
			
		||||
                android:layout_width="match_parent"
 | 
			
		||||
                android:layout_height="wrap_content"/>
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:inputType="" />
 | 
			
		||||
 | 
			
		||||
            <Button
 | 
			
		||||
                android:id="@+id/errorReportButton"
 | 
			
		||||
 
 | 
			
		||||
@@ -16,7 +16,8 @@ android:focusable="true">
 | 
			
		||||
        android:layout_height="match_parent"
 | 
			
		||||
        android:background="?attr/colorPrimary"
 | 
			
		||||
        android:src="@drawable/background_header"
 | 
			
		||||
        android:scaleType="centerCrop"/>
 | 
			
		||||
        android:scaleType="centerCrop"
 | 
			
		||||
        android:contentDescription="TODO" />
 | 
			
		||||
 | 
			
		||||
    <ImageView
 | 
			
		||||
        android:id="@+id/drawer_header_np_nude_view"
 | 
			
		||||
@@ -26,7 +27,8 @@ android:focusable="true">
 | 
			
		||||
 | 
			
		||||
        android:layout_width="70dp"
 | 
			
		||||
        android:layout_height="70dp"
 | 
			
		||||
        android:src="@drawable/np_logo_nude_shadow"/>
 | 
			
		||||
        android:src="@drawable/np_logo_nude_shadow"
 | 
			
		||||
        android:contentDescription="TODO" />
 | 
			
		||||
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/drawer_header_np_text_view"
 | 
			
		||||
@@ -38,7 +40,7 @@ android:focusable="true">
 | 
			
		||||
        android:layout_alignTop="@id/drawer_header_np_nude_view"
 | 
			
		||||
        android:layout_alignBottom="@id/drawer_header_np_nude_view"
 | 
			
		||||
        android:gravity="center"
 | 
			
		||||
        android:textSize="30dp"
 | 
			
		||||
        android:textSize="30sp"
 | 
			
		||||
        android:textColor="@color/drawer_header_font_color"
 | 
			
		||||
        android:textStyle="bold|italic"/>
 | 
			
		||||
 | 
			
		||||
@@ -50,7 +52,7 @@ android:focusable="true">
 | 
			
		||||
        android:layout_below="@id/drawer_header_np_text_view"
 | 
			
		||||
        android:layout_alignLeft="@id/drawer_header_np_text_view"
 | 
			
		||||
        android:layout_alignStart="@id/drawer_header_np_text_view"
 | 
			
		||||
        android:textSize="18dp"
 | 
			
		||||
        android:textSize="18sp"
 | 
			
		||||
        android:textColor="@color/drawer_header_font_color"
 | 
			
		||||
        android:textStyle="italic"/>
 | 
			
		||||
 | 
			
		||||
@@ -66,6 +68,7 @@ android:focusable="true">
 | 
			
		||||
        android:paddingBottom="20dp"
 | 
			
		||||
        android:paddingRight="20dp"
 | 
			
		||||
        android:src="@drawable/ic_arrow_down_white"
 | 
			
		||||
        android:paddingEnd="20dp" />
 | 
			
		||||
        android:paddingEnd="20dp"
 | 
			
		||||
        android:contentDescription="TODO" />
 | 
			
		||||
 | 
			
		||||
</RelativeLayout>
 | 
			
		||||
@@ -21,7 +21,8 @@
 | 
			
		||||
            android:layout_height="wrap_content"
 | 
			
		||||
            android:layout_gravity="center_horizontal"
 | 
			
		||||
            android:layout_marginBottom="8dp"
 | 
			
		||||
            app:srcCompat="@mipmap/ic_launcher" />
 | 
			
		||||
            app:srcCompat="@mipmap/ic_launcher"
 | 
			
		||||
            android:contentDescription="TODO" />
 | 
			
		||||
 | 
			
		||||
        <TextView
 | 
			
		||||
            android:id="@+id/app_name"
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,8 @@
 | 
			
		||||
    android:paddingBottom="8dp"
 | 
			
		||||
    android:paddingLeft="@dimen/activity_horizontal_margin"
 | 
			
		||||
    android:paddingRight="@dimen/activity_horizontal_margin"
 | 
			
		||||
    android:paddingTop="8dp">
 | 
			
		||||
    android:paddingTop="8dp"
 | 
			
		||||
    android:focusable="true">
 | 
			
		||||
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/info"
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,8 @@
 | 
			
		||||
    android:paddingRight="@dimen/activity_horizontal_margin"
 | 
			
		||||
    android:orientation="vertical"
 | 
			
		||||
    android:background="?attr/selectableItemBackground"
 | 
			
		||||
    android:clickable="true">
 | 
			
		||||
    android:clickable="true"
 | 
			
		||||
    android:focusable="true">
 | 
			
		||||
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/name"
 | 
			
		||||
 
 | 
			
		||||
@@ -38,7 +38,8 @@
 | 
			
		||||
				android:layout_centerVertical="true"
 | 
			
		||||
				android:layout_marginRight="1dp"
 | 
			
		||||
				android:src="@drawable/ic_menu_more"
 | 
			
		||||
				android:scaleType="centerInside"/>
 | 
			
		||||
				android:scaleType="centerInside"
 | 
			
		||||
                android:contentDescription="TODO" />
 | 
			
		||||
			
 | 
			
		||||
		</RelativeLayout>
 | 
			
		||||
		
 | 
			
		||||
@@ -50,7 +51,8 @@
 | 
			
		||||
			android:layout_centerHorizontal="true"
 | 
			
		||||
			android:scaleType="fitXY"
 | 
			
		||||
			android:gravity="center"
 | 
			
		||||
			android:padding="10dp"/>
 | 
			
		||||
			android:padding="10dp"
 | 
			
		||||
            android:contentDescription="TODO" />
 | 
			
		||||
		
 | 
			
		||||
		<TextView
 | 
			
		||||
			android:id="@+id/item_name"
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
		android:layout_width="match_parent"
 | 
			
		||||
		android:layout_margin="2dp"
 | 
			
		||||
		android:background="@color/bluegray">
 | 
			
		||||
		
 | 
			
		||||
 | 
			
		||||
		<ImageView
 | 
			
		||||
			android:id="@+id/item_icon"
 | 
			
		||||
			android:layout_width="72dp"
 | 
			
		||||
@@ -17,66 +17,60 @@
 | 
			
		||||
			android:layout_centerVertical="true"
 | 
			
		||||
			android:scaleType="fitXY"
 | 
			
		||||
			android:gravity="center"
 | 
			
		||||
			android:padding="15dp"/>
 | 
			
		||||
		
 | 
			
		||||
		<LinearLayout
 | 
			
		||||
			android:id="@+id/item_name_and_size"
 | 
			
		||||
			android:padding="15dp"
 | 
			
		||||
            android:contentDescription="TODO" />
 | 
			
		||||
 | 
			
		||||
		<TextView
 | 
			
		||||
			android:id="@+id/item_name"
 | 
			
		||||
			android:layout_width="match_parent"
 | 
			
		||||
			android:layout_height="wrap_content"
 | 
			
		||||
			android:layout_toLeftOf="@+id/item_more"
 | 
			
		||||
			android:layout_toRightOf="@id/item_icon"
 | 
			
		||||
			android:layout_toLeftOf="@+id/item_status"
 | 
			
		||||
			android:layout_centerVertical="true"
 | 
			
		||||
			android:orientation="vertical">
 | 
			
		||||
			android:ellipsize="end"
 | 
			
		||||
			android:padding="6dp"
 | 
			
		||||
			android:text="XXX.xx"
 | 
			
		||||
			android:textColor="@color/white"
 | 
			
		||||
			android:textSize="16sp"
 | 
			
		||||
			android:textStyle="bold" />
 | 
			
		||||
 | 
			
		||||
			<TextView
 | 
			
		||||
				android:id="@+id/item_name"
 | 
			
		||||
				android:layout_width="match_parent"
 | 
			
		||||
				android:layout_height="wrap_content"
 | 
			
		||||
				android:padding="6dp"
 | 
			
		||||
				android:singleLine="true"
 | 
			
		||||
				android:ellipsize="end"
 | 
			
		||||
				android:text="XXX.xx"
 | 
			
		||||
				android:textSize="16sp"
 | 
			
		||||
				android:textStyle="bold"
 | 
			
		||||
				android:textColor="@color/white"/>
 | 
			
		||||
 | 
			
		||||
			<TextView
 | 
			
		||||
				android:id="@+id/item_size"
 | 
			
		||||
				android:layout_width="match_parent"
 | 
			
		||||
				android:layout_height="wrap_content"
 | 
			
		||||
				android:layout_below="@id/item_name"
 | 
			
		||||
				android:padding="6dp"
 | 
			
		||||
				android:singleLine="true"
 | 
			
		||||
				android:text="100.00MB"
 | 
			
		||||
				android:textSize="12sp"
 | 
			
		||||
				android:textColor="@color/white"/>
 | 
			
		||||
		
 | 
			
		||||
		</LinearLayout>
 | 
			
		||||
		
 | 
			
		||||
		<TextView
 | 
			
		||||
			android:id="@+id/item_size"
 | 
			
		||||
			android:layout_width="wrap_content"
 | 
			
		||||
			android:layout_height="wrap_content"
 | 
			
		||||
			android:layout_toRightOf="@id/item_icon"
 | 
			
		||||
			android:layout_below="@+id/item_name"
 | 
			
		||||
			android:padding="6dp"
 | 
			
		||||
			android:singleLine="true"
 | 
			
		||||
			android:text="100.00MB"
 | 
			
		||||
			android:textSize="12sp"
 | 
			
		||||
			android:textColor="@color/white"/>
 | 
			
		||||
 | 
			
		||||
		<TextView
 | 
			
		||||
			android:id="@+id/item_status"
 | 
			
		||||
			android:layout_width="wrap_content"
 | 
			
		||||
			android:layout_height="wrap_content"
 | 
			
		||||
			android:layout_toLeftOf="@+id/item_more"
 | 
			
		||||
			android:layout_centerVertical="true"
 | 
			
		||||
			android:layout_below="@+id/item_name"
 | 
			
		||||
			android:layout_marginLeft="6dp"
 | 
			
		||||
			android:layout_marginRight="6dp"
 | 
			
		||||
			android:layout_marginRight="5dp"
 | 
			
		||||
			android:layout_toLeftOf="@+id/item_more"
 | 
			
		||||
			android:layout_toRightOf="@id/item_size"
 | 
			
		||||
			android:padding="6dp"
 | 
			
		||||
			android:singleLine="true"
 | 
			
		||||
			android:text="0%"
 | 
			
		||||
			android:textSize="20sp"
 | 
			
		||||
			android:textColor="@color/white"/>
 | 
			
		||||
			android:textColor="@color/white"
 | 
			
		||||
			android:textSize="12sp" />
 | 
			
		||||
 | 
			
		||||
		<ImageView
 | 
			
		||||
			style="?attr/buttonBarButtonStyle"
 | 
			
		||||
			android:id="@+id/item_more"
 | 
			
		||||
			android:layout_width="36dp"
 | 
			
		||||
			android:layout_height="36dp"
 | 
			
		||||
			android:layout_width="49dp"
 | 
			
		||||
			android:layout_height="49dp"
 | 
			
		||||
			android:layout_alignParentRight="true"
 | 
			
		||||
			android:layout_centerVertical="true"
 | 
			
		||||
			android:layout_marginRight="4dp"
 | 
			
		||||
			android:src="@drawable/ic_menu_more"
 | 
			
		||||
			android:scaleType="centerInside"/>
 | 
			
		||||
			android:scaleType="centerInside"
 | 
			
		||||
            android:contentDescription="TODO" />
 | 
			
		||||
 | 
			
		||||
	</RelativeLayout>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,8 @@
 | 
			
		||||
    android:layout_height="wrap_content"
 | 
			
		||||
    android:background="?attr/selectableItemBackground"
 | 
			
		||||
    android:clickable="true"
 | 
			
		||||
    android:padding="5dp">
 | 
			
		||||
    android:padding="5dp"
 | 
			
		||||
    android:focusable="true">
 | 
			
		||||
 | 
			
		||||
    <de.hdodenhof.circleimageview.CircleImageView
 | 
			
		||||
        android:id="@+id/itemThumbnailView"
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,8 @@
 | 
			
		||||
    android:layout_height="wrap_content"
 | 
			
		||||
    android:background="?attr/selectableItemBackground"
 | 
			
		||||
    android:clickable="true"
 | 
			
		||||
    android:padding="5dp">
 | 
			
		||||
    android:padding="5dp"
 | 
			
		||||
    android:focusable="true">
 | 
			
		||||
 | 
			
		||||
    <ImageView
 | 
			
		||||
        android:id="@+id/itemThumbnailView"
 | 
			
		||||
@@ -17,7 +18,8 @@
 | 
			
		||||
        android:layout_alignParentTop="true"
 | 
			
		||||
        android:layout_marginRight="5dp"
 | 
			
		||||
        android:src="@drawable/service"
 | 
			
		||||
        tools:ignore="RtlHardcoded"/>
 | 
			
		||||
        tools:ignore="RtlHardcoded"
 | 
			
		||||
        android:contentDescription="TODO" />
 | 
			
		||||
 | 
			
		||||
    <TextView
 | 
			
		||||
        android:id="@+id/itemTitleView"
 | 
			
		||||
 
 | 
			
		||||
@@ -5,4 +5,7 @@
 | 
			
		||||
    <item android:id="@+id/action_settings"
 | 
			
		||||
        app:showAsAction="never"
 | 
			
		||||
        android:title="@string/settings"/>
 | 
			
		||||
    <item android:id="@+id/switch_mode"
 | 
			
		||||
        app:showAsAction="ifRoom"
 | 
			
		||||
        android:title="@string/switch_view"/>
 | 
			
		||||
</menu>
 | 
			
		||||
@@ -7,16 +7,16 @@
 | 
			
		||||
        android:id="@+id/toggleOrientation"
 | 
			
		||||
        android:icon="@drawable/ic_screen_rotation_white"
 | 
			
		||||
        android:title="@string/toggle_orientation"
 | 
			
		||||
        app:showAsAction="always|withText" />
 | 
			
		||||
        app:showAsAction="ifRoom|withText" />
 | 
			
		||||
    <item
 | 
			
		||||
        android:id="@+id/switchPopup"
 | 
			
		||||
        android:icon="@drawable/ic_fullscreen_exit_white"
 | 
			
		||||
        android:title="@string/switch_to_popup"
 | 
			
		||||
        app:showAsAction="always|withText" />
 | 
			
		||||
        app:showAsAction="ifRoom|withText" />
 | 
			
		||||
    <item
 | 
			
		||||
        android:id="@+id/switchBackground"
 | 
			
		||||
        android:icon="?audio"
 | 
			
		||||
        android:title="@string/switch_to_background"
 | 
			
		||||
        app:showAsAction="always|withText" />
 | 
			
		||||
        app:showAsAction="ifRoom|withText" />
 | 
			
		||||
</menu>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -111,7 +111,7 @@
 | 
			
		||||
    <string name="msg_url_malform">Hibás URL vagy nincs internet</string>
 | 
			
		||||
    <string name="msg_running">NewPipe letöltés folyamatban</string>
 | 
			
		||||
    <string name="msg_running_detail">Katt a részletekért</string>
 | 
			
		||||
    <string name="msg_wait">Kérlek várj...</string>
 | 
			
		||||
    <string name="msg_wait">Kérlek várj…</string>
 | 
			
		||||
    <string name="msg_copied">Vágólapra másolva.</string>
 | 
			
		||||
    <string name="no_available_dir">Kérlek válassz egy létező könyvtárat a letöltésekhez.</string>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -414,7 +414,7 @@
 | 
			
		||||
\n
 | 
			
		||||
\n만약 모르신다면, 다음을 참고하세요:
 | 
			
		||||
\n
 | 
			
		||||
\n1. 모바일 환경이시면 브라우저 설정에서 데스크탑 모드를 활성화해주세요. Chrome 모바일에서는 오른쪽 ... 클릭시 아래쪽에 있습니다.
 | 
			
		||||
\n1. 모바일 환경이시면 브라우저 설정에서 데스크탑 모드를 활성화해주세요. Chrome 모바일에서는 오른쪽 … 클릭시 아래쪽에 있습니다.
 | 
			
		||||
\n2. 이 주소로 가세요: %1$s 
 | 
			
		||||
\n3. 로그인이 필요하면 하세요.
 | 
			
		||||
\n4. 리디렉트된 곳의 URL을 복사하세요. (이 URL이 당신의 프로필 URL 입니다)</string>
 | 
			
		||||
 
 | 
			
		||||
@@ -105,6 +105,8 @@
 | 
			
		||||
 | 
			
		||||
    <string name="last_orientation_landscape_key" translatable="false">last_orientation_landscape_key</string>
 | 
			
		||||
 | 
			
		||||
    <string name="last_resize_mode" translatable="false">last_resize_mode</string>
 | 
			
		||||
 | 
			
		||||
    <!-- DEBUG ONLY -->
 | 
			
		||||
    <string name="debug_pref_screen_key" translatable="false">debug_pref_screen_key</string>
 | 
			
		||||
    <string name="allow_heap_dumping_key" translatable="false">allow_heap_dumping_key</string>
 | 
			
		||||
 
 | 
			
		||||
@@ -517,5 +517,6 @@
 | 
			
		||||
    <string name="minimize_on_exit_none_description">None</string>
 | 
			
		||||
    <string name="minimize_on_exit_background_description">Minimize to background player</string>
 | 
			
		||||
    <string name="minimize_on_exit_popup_description">Minimize to popup player</string>
 | 
			
		||||
    <string name="switch_view">Switch View</string>
 | 
			
		||||
 | 
			
		||||
</resources>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<paths xmlns:android="http://schemas.android.com/apk/res/android">
 | 
			
		||||
<paths>
 | 
			
		||||
    <external-path name="external_files" path="."/>
 | 
			
		||||
    <root-path name="external_files" path="/storage/" />
 | 
			
		||||
</paths>
 | 
			
		||||
@@ -27,7 +27,7 @@ public class ImportExportJsonHelperTest {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testInvalidSource() throws Exception {
 | 
			
		||||
    public void testInvalidSource() {
 | 
			
		||||
        List<String> invalidList = Arrays.asList(
 | 
			
		||||
                "{}",
 | 
			
		||||
                "",
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,7 @@ import static org.junit.Assert.assertNull;
 | 
			
		||||
 */
 | 
			
		||||
public class ErrorActivityTest {
 | 
			
		||||
    @Test
 | 
			
		||||
    public void getReturnActivity() throws Exception {
 | 
			
		||||
    public void getReturnActivity() {
 | 
			
		||||
        Class<? extends Activity> returnActivity;
 | 
			
		||||
        returnActivity = ErrorActivity.getReturnActivity(MainActivity.class);
 | 
			
		||||
        assertEquals(MainActivity.class, returnActivity);
 | 
			
		||||
 
 | 
			
		||||
@@ -45,7 +45,7 @@ public class ListHelperTest {
 | 
			
		||||
            new VideoStream("", MediaFormat.MPEG_4,   /**/ "1080p60", true));
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void getSortedStreamVideosListTest() throws Exception {
 | 
			
		||||
    public void getSortedStreamVideosListTest() {
 | 
			
		||||
        List<VideoStream> result = ListHelper.getSortedStreamVideosList(MediaFormat.MPEG_4, true, videoStreamsTestList, videoOnlyStreamsTestList, true);
 | 
			
		||||
 | 
			
		||||
        List<String> expected = Arrays.asList("144p", "240p", "360p", "480p", "720p", "720p60", "1080p", "1080p60", "1440p60", "2160p", "2160p60");
 | 
			
		||||
@@ -67,7 +67,7 @@ public class ListHelperTest {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void getSortedStreamVideosExceptHighResolutionsTest() throws Exception {
 | 
			
		||||
    public void getSortedStreamVideosExceptHighResolutionsTest() {
 | 
			
		||||
        ////////////////////////////////////
 | 
			
		||||
        // Don't show Higher resolutions //
 | 
			
		||||
        //////////////////////////////////
 | 
			
		||||
@@ -79,7 +79,7 @@ public class ListHelperTest {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void getDefaultResolutionTest() throws Exception {
 | 
			
		||||
    public void getDefaultResolutionTest() {
 | 
			
		||||
        List<VideoStream> testList = Arrays.asList(
 | 
			
		||||
                new VideoStream("", MediaFormat.MPEG_4,   /**/ "720p"),
 | 
			
		||||
                new VideoStream("", MediaFormat.v3GPP,    /**/ "240p"),
 | 
			
		||||
@@ -130,7 +130,7 @@ public class ListHelperTest {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void getHighestQualityAudioFormatTest() throws Exception {
 | 
			
		||||
    public void getHighestQualityAudioFormatTest() {
 | 
			
		||||
        AudioStream stream = audioStreamsTestList.get(ListHelper.getHighestQualityAudioIndex(MediaFormat.M4A, audioStreamsTestList));
 | 
			
		||||
        assertEquals(320, stream.average_bitrate);
 | 
			
		||||
        assertEquals(MediaFormat.M4A, stream.getFormat());
 | 
			
		||||
@@ -145,7 +145,7 @@ public class ListHelperTest {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void getHighestQualityAudioFormatPreferredAbsent() throws Exception {
 | 
			
		||||
    public void getHighestQualityAudioFormatPreferredAbsent() {
 | 
			
		||||
 | 
			
		||||
        //////////////////////////////////////////
 | 
			
		||||
        // Doesn't contain the preferred format //
 | 
			
		||||
@@ -186,13 +186,13 @@ public class ListHelperTest {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void getHighestQualityAudioNull() throws Exception {
 | 
			
		||||
    public void getHighestQualityAudioNull() {
 | 
			
		||||
        assertEquals(-1, ListHelper.getHighestQualityAudioIndex(null, null));
 | 
			
		||||
        assertEquals(-1, ListHelper.getHighestQualityAudioIndex(null, new ArrayList<AudioStream>()));
 | 
			
		||||
        assertEquals(-1, ListHelper.getHighestQualityAudioIndex(null, new ArrayList<>()));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void getLowestQualityAudioFormatTest() throws Exception {
 | 
			
		||||
    public void getLowestQualityAudioFormatTest() {
 | 
			
		||||
        AudioStream stream = audioStreamsTestList.get(ListHelper.getMostCompactAudioIndex(MediaFormat.M4A, audioStreamsTestList));
 | 
			
		||||
        assertEquals(128, stream.average_bitrate);
 | 
			
		||||
        assertEquals(MediaFormat.M4A, stream.getFormat());
 | 
			
		||||
@@ -207,7 +207,7 @@ public class ListHelperTest {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void getLowestQualityAudioFormatPreferredAbsent() throws Exception {
 | 
			
		||||
    public void getLowestQualityAudioFormatPreferredAbsent() {
 | 
			
		||||
 | 
			
		||||
        //////////////////////////////////////////
 | 
			
		||||
        // Doesn't contain the preferred format //
 | 
			
		||||
@@ -250,13 +250,13 @@ public class ListHelperTest {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void getLowestQualityAudioNull() throws Exception {
 | 
			
		||||
    public void getLowestQualityAudioNull() {
 | 
			
		||||
        assertEquals(-1, ListHelper.getMostCompactAudioIndex(null, null));
 | 
			
		||||
        assertEquals(-1, ListHelper.getMostCompactAudioIndex(null, new ArrayList<AudioStream>()));
 | 
			
		||||
        assertEquals(-1, ListHelper.getMostCompactAudioIndex(null, new ArrayList<>()));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void getVideoDefaultStreamIndexCombinations() throws Exception {
 | 
			
		||||
    public void getVideoDefaultStreamIndexCombinations() {
 | 
			
		||||
        List<VideoStream> testList = Arrays.asList(
 | 
			
		||||
                new VideoStream("", MediaFormat.MPEG_4,   /**/ "1080p"),
 | 
			
		||||
                new VideoStream("", MediaFormat.MPEG_4,   /**/ "720p60"),
 | 
			
		||||
 
 | 
			
		||||
@@ -11,25 +11,25 @@ public class QuadraticSliderStrategyTest {
 | 
			
		||||
    private final SliderStrategy.Quadratic standard =
 | 
			
		||||
            new SliderStrategy.Quadratic(0f, 100f, 50f, STEP);
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testLeftBound() throws Exception {
 | 
			
		||||
    public void testLeftBound() {
 | 
			
		||||
        assertEquals(standard.progressOf(0), 0);
 | 
			
		||||
        assertEquals(standard.valueOf(0), 0f, DELTA);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testCenter() throws Exception {
 | 
			
		||||
    public void testCenter() {
 | 
			
		||||
        assertEquals(standard.progressOf(50), 50);
 | 
			
		||||
        assertEquals(standard.valueOf(50), 50f, DELTA);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testRightBound() throws Exception {
 | 
			
		||||
    public void testRightBound() {
 | 
			
		||||
        assertEquals(standard.progressOf(100), 100);
 | 
			
		||||
        assertEquals(standard.valueOf(100), 100f, DELTA);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testLeftRegion() throws Exception {
 | 
			
		||||
    public void testLeftRegion() {
 | 
			
		||||
        final int leftProgress = standard.progressOf(25);
 | 
			
		||||
        final double leftValue = standard.valueOf(25);
 | 
			
		||||
        assertTrue(leftProgress > 0 && leftProgress < 50);
 | 
			
		||||
@@ -37,7 +37,7 @@ public class QuadraticSliderStrategyTest {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testRightRegion() throws Exception {
 | 
			
		||||
    public void testRightRegion() {
 | 
			
		||||
        final int leftProgress = standard.progressOf(75);
 | 
			
		||||
        final double leftValue = standard.valueOf(75);
 | 
			
		||||
        assertTrue(leftProgress > 50 && leftProgress < 100);
 | 
			
		||||
@@ -45,7 +45,7 @@ public class QuadraticSliderStrategyTest {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testConversion() throws Exception {
 | 
			
		||||
    public void testConversion() {
 | 
			
		||||
        assertEquals(standard.progressOf(standard.valueOf(0)), 0);
 | 
			
		||||
        assertEquals(standard.progressOf(standard.valueOf(25)), 25);
 | 
			
		||||
        assertEquals(standard.progressOf(standard.valueOf(50)), 50);
 | 
			
		||||
@@ -54,7 +54,7 @@ public class QuadraticSliderStrategyTest {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testReverseConversion() throws Exception {
 | 
			
		||||
    public void testReverseConversion() {
 | 
			
		||||
        // Need a larger delta since step size / granularity is too small and causes
 | 
			
		||||
        // floating point round-off errors during conversion
 | 
			
		||||
        final float largeDelta = 1f;
 | 
			
		||||
@@ -67,7 +67,7 @@ public class QuadraticSliderStrategyTest {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testQuadraticPropertyLeftRegion() throws Exception {
 | 
			
		||||
    public void testQuadraticPropertyLeftRegion() {
 | 
			
		||||
        final double differenceCloserToCenter =
 | 
			
		||||
                Math.abs(standard.valueOf(40) - standard.valueOf(45));
 | 
			
		||||
        final double differenceFurtherFromCenter =
 | 
			
		||||
@@ -76,7 +76,7 @@ public class QuadraticSliderStrategyTest {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testQuadraticPropertyRightRegion() throws Exception {
 | 
			
		||||
    public void testQuadraticPropertyRightRegion() {
 | 
			
		||||
        final double differenceCloserToCenter =
 | 
			
		||||
                Math.abs(standard.valueOf(75) - standard.valueOf(70));
 | 
			
		||||
        final double differenceFurtherFromCenter =
 | 
			
		||||
 
 | 
			
		||||
@@ -42,12 +42,12 @@ public class DownloadManagerImplTest {
 | 
			
		||||
            missions.add(generateFinishedDownloadMission());
 | 
			
		||||
        }
 | 
			
		||||
        when(downloadDataSource.loadMissions()).thenReturn(new ArrayList<>(missions));
 | 
			
		||||
        downloadManager = new DownloadManagerImpl(new ArrayList<String>(), downloadDataSource);
 | 
			
		||||
        downloadManager = new DownloadManagerImpl(new ArrayList<>(), downloadDataSource);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test(expected = NullPointerException.class)
 | 
			
		||||
    public void testConstructorWithNullAsDownloadDataSource() {
 | 
			
		||||
        new DownloadManagerImpl(new ArrayList<String>(), null);
 | 
			
		||||
        new DownloadManagerImpl(new ArrayList<>(), null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -84,7 +84,7 @@ public class DownloadManagerImplTest {
 | 
			
		||||
 | 
			
		||||
        downloadDataSource = mock(DownloadDataSource.class);
 | 
			
		||||
        when(downloadDataSource.loadMissions()).thenReturn(new ArrayList<>(missions));
 | 
			
		||||
        downloadManager = new DownloadManagerImpl(new ArrayList<String>(), downloadDataSource);
 | 
			
		||||
        downloadManager = new DownloadManagerImpl(new ArrayList<>(), downloadDataSource);
 | 
			
		||||
        verify(downloadDataSource, times(1)).loadMissions();
 | 
			
		||||
 | 
			
		||||
        assertEquals(50, downloadManager.getCount());
 | 
			
		||||
@@ -110,7 +110,7 @@ public class DownloadManagerImplTest {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void resumeMission() throws Exception {
 | 
			
		||||
    public void resumeMission() {
 | 
			
		||||
        DownloadMission mission = missions.get(0);
 | 
			
		||||
        mission.running = true;
 | 
			
		||||
        verify(mission, never()).start();
 | 
			
		||||
@@ -122,7 +122,7 @@ public class DownloadManagerImplTest {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void pauseMission() throws Exception {
 | 
			
		||||
    public void pauseMission() {
 | 
			
		||||
        DownloadMission mission = missions.get(0);
 | 
			
		||||
        mission.running = false;
 | 
			
		||||
        downloadManager.pauseMission(0);
 | 
			
		||||
@@ -133,7 +133,7 @@ public class DownloadManagerImplTest {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void deleteMission() throws Exception {
 | 
			
		||||
    public void deleteMission() {
 | 
			
		||||
        DownloadMission mission = missions.get(0);
 | 
			
		||||
        assertEquals(mission, downloadManager.getMission(0));
 | 
			
		||||
        downloadManager.deleteMission(0);
 | 
			
		||||
@@ -143,18 +143,18 @@ public class DownloadManagerImplTest {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test(expected = RuntimeException.class)
 | 
			
		||||
    public void getMissionWithNegativeIndex() throws Exception {
 | 
			
		||||
    public void getMissionWithNegativeIndex() {
 | 
			
		||||
        downloadManager.getMission(-1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void getMission() throws Exception {
 | 
			
		||||
    public void getMission() {
 | 
			
		||||
        assertSame(missions.get(0), downloadManager.getMission(0));
 | 
			
		||||
        assertSame(missions.get(1), downloadManager.getMission(1));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void sortByTimestamp() throws Exception {
 | 
			
		||||
    public void sortByTimestamp() {
 | 
			
		||||
        ArrayList<DownloadMission> downloadMissions = new ArrayList<>();
 | 
			
		||||
        DownloadMission mission = new DownloadMission();
 | 
			
		||||
        mission.timestamp = 0;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user