diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/ActionBarHandler.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/ActionBarHandler.java deleted file mode 100644 index d928166ab..000000000 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/ActionBarHandler.java +++ /dev/null @@ -1,150 +0,0 @@ -package org.schabi.newpipe.fragments.detail; - -import android.content.SharedPreferences; -import android.preference.PreferenceManager; -import android.support.v7.app.AppCompatActivity; -import android.util.Log; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.widget.AdapterView; -import android.widget.Spinner; - -import org.schabi.newpipe.R; -import org.schabi.newpipe.extractor.stream.VideoStream; -import org.schabi.newpipe.util.ListHelper; - -import java.util.List; - -/* - * Created by Christian Schabesberger on 18.08.15. - *

- * Copyright (C) Christian Schabesberger 2015 - * DetailsMenuHandler.java is part of NewPipe. - *

- * NewPipe is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - *

- * NewPipe is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - *

- * You should have received a copy of the GNU General Public License - * along with NewPipe. If not, see . - */ - - -@SuppressWarnings("WeakerAccess") -class ActionBarHandler { - private static final String TAG = "ActionBarHandler"; - - private AppCompatActivity activity; - private int selectedVideoStream = -1; - - private SharedPreferences defaultPreferences; - - private Menu menu; - - // Only callbacks are listed here, there are more actions which don't need a callback. - // those are edited directly. Typically VideoDetailFragment will implement those callbacks. - private OnActionListener onShareListener; - private OnActionListener onOpenInBrowserListener; - private OnActionListener onPlayWithKodiListener; - - // Triggered when a stream related action is triggered. - public interface OnActionListener { - void onActionSelected(int selectedStreamId); - } - - public ActionBarHandler(AppCompatActivity activity) { - this.activity = activity; - } - - public void setupStreamList(final List videoStreams, Spinner toolbarSpinner) { - if (activity == null) return; - - selectedVideoStream = ListHelper.getDefaultResolutionIndex(activity, videoStreams); - - boolean isExternalPlayerEnabled = PreferenceManager.getDefaultSharedPreferences(activity).getBoolean(activity.getString(R.string.use_external_video_player_key), false); - toolbarSpinner.setAdapter(new SpinnerToolbarAdapter(activity, videoStreams, isExternalPlayerEnabled)); - toolbarSpinner.setSelection(selectedVideoStream); - toolbarSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - selectedVideoStream = position; - } - - @Override - public void onNothingSelected(AdapterView parent) { - } - }); - - } - - public void setupMenu(Menu menu, MenuInflater inflater) { - this.menu = menu; - - // CAUTION set item properties programmatically otherwise it would not be accepted by - // appcompat itemsinflater.inflate(R.menu.videoitem_detail, menu); - - defaultPreferences = PreferenceManager.getDefaultSharedPreferences(activity); - inflater.inflate(R.menu.video_detail_menu, menu); - - updateItemsVisibility(); - } - - public void updateItemsVisibility(){ - showPlayWithKodiAction(defaultPreferences.getBoolean(activity.getString(R.string.show_play_with_kodi_key), false)); - } - - public boolean onItemSelected(MenuItem item) { - int id = item.getItemId(); - switch (id) { - case R.id.menu_item_share: { - if (onShareListener != null) { - onShareListener.onActionSelected(selectedVideoStream); - } - return true; - } - case R.id.menu_item_openInBrowser: { - if (onOpenInBrowserListener != null) { - onOpenInBrowserListener.onActionSelected(selectedVideoStream); - } - return true; - } - case R.id.action_play_with_kodi: - if (onPlayWithKodiListener != null) { - onPlayWithKodiListener.onActionSelected(selectedVideoStream); - } - return true; - default: - Log.e(TAG, "Menu Item not known"); - } - return false; - } - - public int getSelectedVideoStream() { - return selectedVideoStream; - } - - public void setOnShareListener(OnActionListener listener) { - onShareListener = listener; - } - - public void setOnOpenInBrowserListener(OnActionListener listener) { - onOpenInBrowserListener = listener; - } - - public void setOnPlayWithKodiListener(OnActionListener listener) { - onPlayWithKodiListener = listener; - } - - public void showPlayWithKodiAction(boolean visible) { - menu.findItem(R.id.action_play_with_kodi).setVisible(visible); - } - -} diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index a4c1bacbf..94a2f8ec0 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -31,6 +31,7 @@ import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; +import android.widget.AdapterView; import android.widget.FrameLayout; import android.widget.ImageButton; import android.widget.ImageView; @@ -106,7 +107,6 @@ public class VideoDetailFragment // Amount of videos to show on start private static final int INITIAL_RELATED_VIDEOS = 8; - private ActionBarHandler actionBarHandler; private ArrayList sortedStreamVideosList; private InfoItemBuilder infoItemBuilder = null; @@ -131,9 +131,12 @@ public class VideoDetailFragment private Disposable currentWorker; private CompositeDisposable disposables = new CompositeDisposable(); + private int selectedVideoStream = -1; + /*////////////////////////////////////////////////////////////////////////// // Views //////////////////////////////////////////////////////////////////////////*/ + private Menu menu; private Spinner spinnerToolbar; @@ -174,6 +177,7 @@ public class VideoDetailFragment private LinearLayout relatedStreamsView; private ImageButton relatedStreamExpandButton; + /*////////////////////////////////////////////////////////////////////////*/ public static VideoDetailFragment getInstance(int serviceId, String videoUrl, String name) { @@ -215,12 +219,12 @@ public class VideoDetailFragment if (updateFlags != 0) { if (!isLoading.get() && currentInfo != null) { if ((updateFlags & RELATED_STREAMS_UPDATE_FLAG) != 0) initRelatedVideos(currentInfo); - if ((updateFlags & RESOLUTIONS_MENU_UPDATE_FLAG) != 0) setupActionBarHandler(currentInfo); + if ((updateFlags & RESOLUTIONS_MENU_UPDATE_FLAG) != 0) setupActionBar(currentInfo); } if ((updateFlags & TOOLBAR_ITEMS_UPDATE_FLAG) != 0 - && actionBarHandler != null) { - actionBarHandler.updateItemsVisibility(); + && menu != null) { + updateMenuItemVisibility(); } updateFlags = 0; } @@ -357,7 +361,7 @@ public class VideoDetailFragment DownloadDialog downloadDialog = DownloadDialog.newInstance(currentInfo, sortedStreamVideosList, - actionBarHandler.getSelectedVideoStream()); + selectedVideoStream); downloadDialog.show(activity.getSupportFragmentManager(), "downloadDialog"); } catch (Exception e) { Toast.makeText(activity, @@ -499,7 +503,6 @@ public class VideoDetailFragment relatedStreamExpandButton = rootView.findViewById(R.id.detail_related_streams_expand); - actionBarHandler = new ActionBarHandler(activity); infoItemBuilder = new InfoItemBuilder(activity); setHeightThumbnail(); } @@ -644,7 +647,15 @@ public class VideoDetailFragment @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - actionBarHandler.setupMenu(menu, inflater); + this.menu = menu; + + // CAUTION set item properties programmatically otherwise it would not be accepted by + // appcompat itemsinflater.inflate(R.menu.videoitem_detail, menu); + + inflater.inflate(R.menu.video_detail_menu, menu); + + updateMenuItemVisibility(); + ActionBar supportActionBar = activity.getSupportActionBar(); if (supportActionBar != null) { supportActionBar.setDisplayHomeAsUpEnabled(true); @@ -652,10 +663,47 @@ public class VideoDetailFragment } } + private void updateMenuItemVisibility() { + + // show kodi if set in settings + menu.findItem(R.id.action_play_with_kodi).setVisible( + PreferenceManager.getDefaultSharedPreferences(activity).getBoolean( + activity.getString(R.string.show_play_with_kodi_key), false)); + } + @Override public boolean onOptionsItemSelected(MenuItem item) { - return (!isLoading.get() && actionBarHandler.onItemSelected(item)) - || super.onOptionsItemSelected(item); + if(isLoading.get()) { + // if is still loading block menu + return true; + } + + int id = item.getItemId(); + switch (id) { + case R.id.menu_item_share: { + if(currentInfo != null) { + shareUrl(currentInfo.name, url); + } else { + shareUrl(url, url); + } + return true; + } + case R.id.menu_item_openInBrowser: { + openUrlInBrowser(url); + return true; + } + case R.id.action_play_with_kodi: + try { + NavigationHelper.playWithKore(activity, Uri.parse( + url.replace("https", "http"))); + } catch (Exception e) { + if(DEBUG) Log.i(TAG, "Failed to start kore", e); + showInstallKoreDialog(activity); + } + return true; + default: + return super.onOptionsItemSelected(item); + } } private static void showInstallKoreDialog(final Context context) { @@ -667,23 +715,31 @@ public class VideoDetailFragment builder.create().show(); } - private void setupActionBarHandler(final StreamInfo info) { + private void setupActionBarOnError(final String url) { + if (DEBUG) Log.d(TAG, "setupActionBarHandlerOnError() called with: url = [" + url + "]"); + Log.e("-----", "missing code"); + } + + private void setupActionBar(final StreamInfo info) { if (DEBUG) Log.d(TAG, "setupActionBarHandler() called with: info = [" + info + "]"); sortedStreamVideosList = new ArrayList<>(ListHelper.getSortedStreamVideosList( activity, info.getVideoStreams(), info.getVideoOnlyStreams(), false)); - actionBarHandler.setupStreamList(sortedStreamVideosList, spinnerToolbar); - actionBarHandler.setOnShareListener(selectedStreamId -> shareUrl(info.name, info.url)); - actionBarHandler.setOnOpenInBrowserListener((int selectedStreamId)-> - openUrlInBrowser(info.getUrl())); + selectedVideoStream = ListHelper.getDefaultResolutionIndex(activity, sortedStreamVideosList); - actionBarHandler.setOnPlayWithKodiListener((int selectedStreamId) -> { - try { - NavigationHelper.playWithKore(activity, Uri.parse( - info.getUrl().replace("https", "http"))); - } catch (Exception e) { - if(DEBUG) Log.i(TAG, "Failed to start kore", e); - showInstallKoreDialog(activity); + boolean isExternalPlayerEnabled = PreferenceManager.getDefaultSharedPreferences(activity) + .getBoolean(activity.getString(R.string.use_external_video_player_key), false); + spinnerToolbar.setAdapter(new SpinnerToolbarAdapter(activity, sortedStreamVideosList, + isExternalPlayerEnabled)); + spinnerToolbar.setSelection(selectedVideoStream); + spinnerToolbar.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + selectedVideoStream = position; + } + + @Override + public void onNothingSelected(AdapterView parent) { } }); @@ -899,7 +955,7 @@ public class VideoDetailFragment } private VideoStream getSelectedVideoStream() { - return sortedStreamVideosList.get(actionBarHandler.getSelectedVideoStream()); + return sortedStreamVideosList.get(selectedVideoStream); } private void prepareDescription(final String descriptionHtml) { @@ -1119,7 +1175,7 @@ public class VideoDetailFragment prepareDescription(info.getDescription()); animateView(spinnerToolbar, true, 500); - setupActionBarHandler(info); + setupActionBar(info); initThumbnailViews(info); initRelatedVideos(info); if (wasRelatedStreamsExpanded) {