mirror of
				https://github.com/TeamNewPipe/NewPipe
				synced 2025-10-31 15:23:00 +00:00 
			
		
		
		
	Merge branch '1520_app_update_notif' of https://github.com/krtkush/NewPipe into 1520_app_update_notif
This commit is contained in:
		| @@ -112,7 +112,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) { | ||||
|  | ||||
|         } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 krtkush
					krtkush