From c22c2009d4053b94bfee3c07816254298665d4ec Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Thu, 29 Oct 2015 17:56:35 +0100 Subject: [PATCH] - changed icon again - made ActionBarHandler not be a singelton anymore - fixed go back bug for the "Next Video" thing - fixed opening youtube mobile links --- .../org/schabi/newpipe/ActionBarHandler.java | 87 ++- .../newpipe/VideoItemDetailActivity.java | 44 +- .../newpipe/VideoItemDetailFragment.java | 47 +- .../schabi/newpipe/VideoItemListActivity.java | 34 +- .../newpipe/youtube/YoutubeExtractor.java | 21 +- .../layout-land/fragment_videoitem_detail.xml | 4 +- .../fragment_videoitem_detail.xml | 4 +- .../res/layout/fragment_videoitem_detail.xml | 2 +- .../main/res/menu/videoitem_two_pannel.xml | 9 + app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 2780 -> 3432 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 1571 -> 1970 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 3649 -> 4545 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 5738 -> 7252 bytes assets/new_pipe_icon_4.svg | 526 ++++++++++++++++++ 14 files changed, 682 insertions(+), 96 deletions(-) create mode 100644 app/src/main/res/menu/videoitem_two_pannel.xml create mode 100644 assets/new_pipe_icon_4.svg diff --git a/app/src/main/java/org/schabi/newpipe/ActionBarHandler.java b/app/src/main/java/org/schabi/newpipe/ActionBarHandler.java index 56f78d0d6..024974089 100644 --- a/app/src/main/java/org/schabi/newpipe/ActionBarHandler.java +++ b/app/src/main/java/org/schabi/newpipe/ActionBarHandler.java @@ -1,6 +1,5 @@ package org.schabi.newpipe; -import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; @@ -41,9 +40,6 @@ public class ActionBarHandler { private static final String TAG = ActionBarHandler.class.toString(); private static final String KORE_PACKET = "org.xbmc.kore"; - private static ActionBarHandler handler = null; - - private Context context = null; private String websiteUrl = ""; private AppCompatActivity activity; private VideoInfo.VideoStream[] videoStreams = null; @@ -53,13 +49,6 @@ public class ActionBarHandler { SharedPreferences defaultPreferences = null; - public static ActionBarHandler getHandler() { - if(handler == null) { - handler = new ActionBarHandler(); - } - return handler; - } - class FormatItemSelectListener implements ActionBar.OnNavigationListener { @Override public boolean onNavigationItemSelected(int itemPosition, long itemId) { @@ -68,6 +57,10 @@ public class ActionBarHandler { } } + public ActionBarHandler(AppCompatActivity activity) { + this.activity = activity; + } + public void setupNavMenu(AppCompatActivity activity) { this.activity = activity; activity.getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); @@ -78,8 +71,8 @@ public class ActionBarHandler { selectedStream = 0; String[] itemArray = new String[videoStreams.length]; String defaultResolution = defaultPreferences - .getString(context.getString(R.string.defaultResolutionPreference), - context.getString(R.string.defaultResolutionListItem)); + .getString(activity.getString(R.string.defaultResolutionPreference), + activity.getString(R.string.defaultResolutionListItem)); int defaultResolutionPos = 0; for(int i = 0; i < videoStreams.length; i++) { @@ -100,8 +93,8 @@ public class ActionBarHandler { // set audioStream audioStream = null; - String preferedFormat = PreferenceManager.getDefaultSharedPreferences(context) - .getString(context.getString(R.string.defaultAudioFormatPreference), "webm"); + String preferedFormat = PreferenceManager.getDefaultSharedPreferences(activity) + .getString(activity.getString(R.string.defaultAudioFormatPreference), "webm"); if(preferedFormat.equals("webm")) { for(VideoInfo.AudioStream s : audioStreams) { if(s.format == VideoInfo.I_WEBMA) { @@ -124,12 +117,11 @@ public class ActionBarHandler { selectedStream = i; } - public boolean setupMenu(Menu menu, MenuInflater inflater, Context context) { - this.context = context; + public boolean setupMenu(Menu menu, MenuInflater inflater) { // CAUTION set item properties programmatically otherwise it would not be accepted by // appcompat itemsinflater.inflate(R.menu.videoitem_detail, menu); - defaultPreferences = PreferenceManager.getDefaultSharedPreferences(context); + defaultPreferences = PreferenceManager.getDefaultSharedPreferences(activity); inflater.inflate(R.menu.videoitem_detail, menu); MenuItem playItem = menu.findItem(R.id.menu_item_play); @@ -142,49 +134,48 @@ public class ActionBarHandler { | MenuItemCompat.SHOW_AS_ACTION_WITH_TEXT); castItem.setVisible(defaultPreferences - .getBoolean(context.getString(R.string.showPlayWidthKodiPreference), false)); + .getBoolean(activity.getString(R.string.showPlayWidthKodiPreference), false)); return true; } - public boolean onItemSelected(MenuItem item, Context context) { - this.context = context; + public boolean onItemSelected(MenuItem item) { int id = item.getItemId(); switch(id) { case R.id.menu_item_play: playVideo(); - break; + return true; case R.id.menu_item_share: if(!videoTitle.isEmpty()) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_SEND); intent.putExtra(Intent.EXTRA_TEXT, websiteUrl); intent.setType("text/plain"); - context.startActivity(Intent.createChooser(intent, context.getString(R.string.shareDialogTitle))); + activity.startActivity(Intent.createChooser(intent, activity.getString(R.string.shareDialogTitle))); } - break; + return true; case R.id.menu_item_openInBrowser: { openInBrowser(); } - break; + return true; case R.id.menu_item_download: downloadVideo(); - break; + return true; case R.id.action_settings: { - Intent intent = new Intent(context, SettingsActivity.class); - context.startActivity(intent); + Intent intent = new Intent(activity, SettingsActivity.class); + activity.startActivity(intent); } break; case R.id.action_play_with_kodi: playWithKodi(); - break; + return true; case R.id.menu_item_play_audio: playAudio(); - break; + return true; default: Log.e(TAG, "Menu Item not known"); } - return true; + return false; } public void setVideoInfo(String websiteUrl, String videoTitle) { @@ -195,8 +186,8 @@ public class ActionBarHandler { public void playVideo() { // ----------- THE MAGIC MOMENT --------------- if(!videoTitle.isEmpty()) { - if (PreferenceManager.getDefaultSharedPreferences(context) - .getBoolean(context.getString(R.string.useExternalPlayer), false)) { + if (PreferenceManager.getDefaultSharedPreferences(activity) + .getBoolean(activity.getString(R.string.useExternalPlayer), false)) { // External Player Intent intent = new Intent(); @@ -208,18 +199,18 @@ public class ActionBarHandler { intent.putExtra(Intent.EXTRA_TITLE, videoTitle); intent.putExtra("title", videoTitle); - context.startActivity(intent); // HERE !!! + activity.startActivity(intent); // HERE !!! } catch (Exception e) { e.printStackTrace(); - AlertDialog.Builder builder = new AlertDialog.Builder(context); + AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setMessage(R.string.noPlayerFound) .setPositiveButton(R.string.installStreamPlayer, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); - intent.setData(Uri.parse(context.getString(R.string.fdroidVLCurl))); - context.startActivity(intent); + intent.setData(Uri.parse(activity.getString(R.string.fdroidVLCurl))); + activity.startActivity(intent); } }) .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { @@ -232,11 +223,11 @@ public class ActionBarHandler { } } else { // Internal Player - Intent intent = new Intent(context, PlayVideoActivity.class); + Intent intent = new Intent(activity, PlayVideoActivity.class); intent.putExtra(PlayVideoActivity.VIDEO_TITLE, videoTitle); intent.putExtra(PlayVideoActivity.STREAM_URL, videoStreams[selectedStream].url); intent.putExtra(PlayVideoActivity.VIDEO_URL, websiteUrl); - context.startActivity(intent); + activity.startActivity(intent); } } // -------------------------------------------- @@ -265,7 +256,7 @@ public class ActionBarHandler { intent.setAction(Intent.ACTION_VIEW); intent.setData(Uri.parse(websiteUrl)); - context.startActivity(Intent.createChooser(intent, context.getString(R.string.chooseBrowser))); + activity.startActivity(Intent.createChooser(intent, activity.getString(R.string.chooseBrowser))); } } @@ -275,18 +266,18 @@ public class ActionBarHandler { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setPackage(KORE_PACKET); intent.setData(Uri.parse(websiteUrl.replace("https", "http"))); - context.startActivity(intent); + activity.startActivity(intent); } catch (Exception e) { e.printStackTrace(); - AlertDialog.Builder builder = new AlertDialog.Builder(context); + AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setMessage(R.string.koreNotFound) .setPositiveButton(R.string.installeKore, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); - intent.setData(Uri.parse(context.getString(R.string.fdroidKoreUrl))); - context.startActivity(intent); + intent.setData(Uri.parse(activity.getString(R.string.fdroidKoreUrl))); + activity.startActivity(intent); } }) .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { @@ -308,18 +299,18 @@ public class ActionBarHandler { VideoInfo.getMimeById(audioStream.format)); intent.putExtra(Intent.EXTRA_TITLE, videoTitle); intent.putExtra("title", videoTitle); - context.startActivity(intent); // HERE !!! + activity.startActivity(intent); // HERE !!! } catch (Exception e) { e.printStackTrace(); - AlertDialog.Builder builder = new AlertDialog.Builder(context); + AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setMessage(R.string.noPlayerFound) .setPositiveButton(R.string.installStreamPlayer, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); - intent.setData(Uri.parse(context.getString(R.string.fdroidVLCurl))); - context.startActivity(intent); + intent.setData(Uri.parse(activity.getString(R.string.fdroidVLCurl))); + activity.startActivity(intent); } }) .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { diff --git a/app/src/main/java/org/schabi/newpipe/VideoItemDetailActivity.java b/app/src/main/java/org/schabi/newpipe/VideoItemDetailActivity.java index 6bf6eef49..8f4416f76 100644 --- a/app/src/main/java/org/schabi/newpipe/VideoItemDetailActivity.java +++ b/app/src/main/java/org/schabi/newpipe/VideoItemDetailActivity.java @@ -33,9 +33,11 @@ public class VideoItemDetailActivity extends AppCompatActivity { private static final String TAG = VideoItemDetailActivity.class.toString(); + VideoItemDetailFragment fragment; + private String videoUrl; private int currentStreamingService = -1; - private boolean isLandscape; + private Menu menu = null; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -43,7 +45,6 @@ public class VideoItemDetailActivity extends AppCompatActivity { // Show the Up button in the action bar. getSupportActionBar().setDisplayHomeAsUpEnabled(true); - ActionBarHandler.getHandler().setupNavMenu(this); // savedInstanceState is non-null when there is fragment state // saved from previous configurations of this activity @@ -91,14 +92,27 @@ public class VideoItemDetailActivity extends AppCompatActivity { arguments.putInt(VideoItemDetailFragment.STREAMING_SERVICE, currentStreamingService); arguments.putBoolean(VideoItemDetailFragment.AUTO_PLAY, false); } - // Create the detail fragment and add it to the activity - // using a fragment transaction. - VideoItemDetailFragment fragment = new VideoItemDetailFragment(); - fragment.setArguments(arguments); - getSupportFragmentManager().beginTransaction() - .add(R.id.videoitem_detail_container, fragment) - .commit(); + + } else { + videoUrl = savedInstanceState.getString(VideoItemDetailFragment.VIDEO_URL); + currentStreamingService = savedInstanceState.getInt(VideoItemDetailFragment.STREAMING_SERVICE); + arguments = savedInstanceState; } + + // Create the detail fragment and add it to the activity + // using a fragment transaction. + fragment = new VideoItemDetailFragment(); + fragment.setArguments(arguments); + getSupportFragmentManager().beginTransaction() + .add(R.id.videoitem_detail_container, fragment) + .commit(); + } + + @Override + public void onSaveInstanceState(Bundle outState) { + outState.putString(VideoItemDetailFragment.VIDEO_URL, videoUrl); + outState.putInt(VideoItemDetailFragment.STREAMING_SERVICE, currentStreamingService); + outState.putBoolean(VideoItemDetailFragment.AUTO_PLAY, false); } @Override @@ -117,17 +131,15 @@ public class VideoItemDetailActivity extends AppCompatActivity { NavUtils.navigateUpTo(this, intent); return true; } else { - ActionBarHandler.getHandler().onItemSelected(item, this); + return fragment.onOptionsItemSelected(item) || + super.onOptionsItemSelected(item); } - return super.onOptionsItemSelected(item); } @Override - public boolean onCreatePanelMenu(int featured, Menu menu) { - super.onCreatePanelMenu(featured, menu); - MenuInflater inflater = getMenuInflater(); - ActionBarHandler.getHandler().setupMenu(menu, inflater, this); - + public boolean onCreateOptionsMenu(Menu menu) { + super.onCreateOptionsMenu(menu); + fragment.onCreateOptionsMenu(menu, getMenuInflater()); return true; } } diff --git a/app/src/main/java/org/schabi/newpipe/VideoItemDetailFragment.java b/app/src/main/java/org/schabi/newpipe/VideoItemDetailFragment.java index f7d803787..653aed1af 100644 --- a/app/src/main/java/org/schabi/newpipe/VideoItemDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/VideoItemDetailFragment.java @@ -9,11 +9,14 @@ import android.os.Handler; import android.preference.PreferenceManager; import android.support.design.widget.FloatingActionButton; import android.support.v4.app.Fragment; +import android.support.v7.app.AppCompatActivity; import android.text.Html; import android.text.method.LinkMovementMethod; import android.util.DisplayMetrics; import android.util.Log; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; @@ -23,7 +26,7 @@ import android.widget.ProgressBar; import android.widget.RelativeLayout; import android.widget.ScrollView; import android.widget.TextView; -import android.content.Context; +import android.view.MenuItem; import java.net.URL; import java.util.Vector; @@ -60,12 +63,20 @@ public class VideoItemDetailFragment extends Fragment { public static final String STREAMING_SERVICE = "streaming_service"; public static final String AUTO_PLAY = "auto_play"; + private AppCompatActivity activity; + private ActionBarHandler actionBarHandler; + private boolean autoPlayEnabled = false; private Thread extractorThread = null; private VideoInfo currentVideoInfo = null; - private boolean showNextVideoItem = false; + public interface OnInvokeCreateOptionsMenuListener { + void createOptionsMenu(); + } + + private OnInvokeCreateOptionsMenuListener onInvokeCreateOptionsMenuListener = null; + private class ExtractorRunnable implements Runnable { private Handler h = new Handler(); private Class extractorClass; @@ -206,7 +217,7 @@ public class VideoItemDetailFragment extends Fragment { descriptionView.setText(Html.fromHtml(info.description)); descriptionView.setMovementMethod(LinkMovementMethod.getInstance()); - ActionBarHandler.getHandler().setVideoInfo(info.webpage_url, info.title); + actionBarHandler.setVideoInfo(info.webpage_url, info.title); // parse streams Vector streamsToUse = new Vector<>(); @@ -219,7 +230,7 @@ public class VideoItemDetailFragment extends Fragment { for (int i = 0; i < streamList.length; i++) { streamList[i] = streamsToUse.get(i); } - ActionBarHandler.getHandler().setStreams(streamList, info.audioStreams); + actionBarHandler.setStreams(streamList, info.audioStreams); } nextVideoButton.setOnClickListener(new View.OnClickListener() { @@ -245,7 +256,7 @@ public class VideoItemDetailFragment extends Fragment { } if(autoPlayEnabled) { - ActionBarHandler.getHandler().playVideo(); + actionBarHandler.playVideo(); } } catch (java.lang.NullPointerException e) { Log.w(TAG, "updateInfo(): Fragment closed before thread ended work... or else"); @@ -272,15 +283,21 @@ public class VideoItemDetailFragment extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - Context context = getActivity(); + activity = (AppCompatActivity) getActivity(); showNextVideoItem = PreferenceManager.getDefaultSharedPreferences(getActivity()) - .getBoolean(context.getString(R.string.showNextVideo), true); + .getBoolean(activity.getString(R.string.showNextVideo), true); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_videoitem_detail, container, false); + actionBarHandler = new ActionBarHandler(activity); + actionBarHandler.setupNavMenu(activity); + if(onInvokeCreateOptionsMenuListener != null) { + onInvokeCreateOptionsMenuListener.createOptionsMenu(); + } + return rootView; } @@ -317,7 +334,7 @@ public class VideoItemDetailFragment extends Fragment { playVideoButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - ActionBarHandler.getHandler().playVideo(); + actionBarHandler.playVideo(); } }); } @@ -328,4 +345,18 @@ public class VideoItemDetailFragment extends Fragment { getActivity().getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); return displayMetrics.heightPixels < displayMetrics.widthPixels; } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + actionBarHandler.setupMenu(menu, inflater); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + return actionBarHandler.onItemSelected(item); + } + + public void setOnInvokeCreateOptionsMenuListener(OnInvokeCreateOptionsMenuListener listener) { + this.onInvokeCreateOptionsMenuListener = listener; + } } \ No newline at end of file diff --git a/app/src/main/java/org/schabi/newpipe/VideoItemListActivity.java b/app/src/main/java/org/schabi/newpipe/VideoItemListActivity.java index 483261f76..241cd6517 100644 --- a/app/src/main/java/org/schabi/newpipe/VideoItemListActivity.java +++ b/app/src/main/java/org/schabi/newpipe/VideoItemListActivity.java @@ -41,6 +41,8 @@ public class VideoItemListActivity extends AppCompatActivity private String searchQuery = ""; private VideoItemListFragment listFragment; + private VideoItemDetailFragment videoFragment = null; + Menu menu = null; public class SearchVideoQueryListener implements SearchView.OnQueryTextListener { @@ -132,9 +134,6 @@ public class VideoItemListActivity extends AppCompatActivity searchView.setIconifiedByDefault(false); searchView.setIconified(false); searchView.setOnQueryTextListener(new SearchVideoQueryListener()); - - ActionBarHandler.getHandler().setupNavMenu(this); - } SettingsActivity.initSettings(this); @@ -160,10 +159,17 @@ public class VideoItemListActivity extends AppCompatActivity arguments.putString(VideoItemDetailFragment.ARG_ITEM_ID, id); arguments.putString(VideoItemDetailFragment.VIDEO_URL, webpage_url); arguments.putInt(VideoItemDetailFragment.STREAMING_SERVICE, currentStreamingServiceId); - VideoItemDetailFragment fragment = new VideoItemDetailFragment(); - fragment.setArguments(arguments); + videoFragment = new VideoItemDetailFragment(); + videoFragment.setArguments(arguments); + videoFragment.setOnInvokeCreateOptionsMenuListener(new VideoItemDetailFragment.OnInvokeCreateOptionsMenuListener() { + @Override + public void createOptionsMenu() { + menu.clear(); + onCreateOptionsMenu(menu); + } + }); getSupportFragmentManager().beginTransaction() - .replace(R.id.videoitem_detail_container, fragment) + .replace(R.id.videoitem_detail_container, videoFragment) .commit(); } else { // In single-pane mode, simply start the detail activity @@ -177,10 +183,11 @@ public class VideoItemListActivity extends AppCompatActivity } - public boolean onCreatePanelMenu(int featured, Menu menu) { - super.onCreatePanelMenu(featured, menu); + public boolean onCreateOptionsMenu(Menu menu) { + super.onCreateOptionsMenu(menu); + this.menu = menu; + MenuInflater inflater = getMenuInflater(); if(findViewById(R.id.videoitem_detail_container) == null) { - MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.videoitem_list, menu); MenuItem searchItem = menu.findItem(R.id.action_search); SearchView searchView = (SearchView) searchItem.getActionView(); @@ -188,9 +195,10 @@ public class VideoItemListActivity extends AppCompatActivity searchView.setOnQueryTextListener( new SearchVideoQueryListener()); + } else if (videoFragment != null){ + videoFragment.onCreateOptionsMenu(menu, inflater); } else { - MenuInflater inflater = getMenuInflater(); - ActionBarHandler.getHandler().setupMenu(menu, inflater, this); + inflater.inflate(R.menu.videoitem_two_pannel, menu); } return true; @@ -203,8 +211,8 @@ public class VideoItemListActivity extends AppCompatActivity Intent intent = new Intent(this, SettingsActivity.class); startActivity(intent); } else { - ActionBarHandler.getHandler().onItemSelected(item, this); - return super.onOptionsItemSelected(item); + return videoFragment.onOptionsItemSelected(item) || + super.onOptionsItemSelected(item); } return true; } diff --git a/app/src/main/java/org/schabi/newpipe/youtube/YoutubeExtractor.java b/app/src/main/java/org/schabi/newpipe/youtube/YoutubeExtractor.java index 15a3fdbbc..92a161c5b 100644 --- a/app/src/main/java/org/schabi/newpipe/youtube/YoutubeExtractor.java +++ b/app/src/main/java/org/schabi/newpipe/youtube/YoutubeExtractor.java @@ -98,9 +98,13 @@ public class YoutubeExtractor implements Extractor { try { URI uri = new URI(videoUrl); if(uri.getHost().contains("youtube")) { - String fragment = uri.getFragment(); - fragment = fragment.replace("/watch?", ""); - String queryElements[] = fragment.split("&"); + String query = uri.getFragment(); + if(query == null) { + query = uri.getQuery(); + } else { + query = query.replace("/watch?", ""); + } + String queryElements[] = query.split("&"); Map queryArguments = new HashMap<>(); for (String e : queryElements) { String[] s = e.split("="); @@ -181,8 +185,6 @@ public class YoutubeExtractor implements Extractor { videoInfo.thumbnail_url = playerArgs.getString("thumbnail_url"); videoInfo.duration = playerArgs.getInt("length_seconds"); videoInfo.average_rating = playerArgs.getString("avg_rating"); - // View Count will be extracted from html - dashManifest = playerArgs.getString("dashmpd"); String playerUrl = ytAssets.getString("js"); if(playerUrl.startsWith("//")) { playerUrl = "https:" + playerUrl; @@ -192,7 +194,14 @@ public class YoutubeExtractor implements Extractor { } // extract audio - videoInfo.audioStreams = parseDashManifest(dashManifest, decryptionCode); + try { + dashManifest = playerArgs.getString("dashmpd"); + videoInfo.audioStreams = parseDashManifest(dashManifest, decryptionCode); + } catch (Exception e) { + //todo: check if the following statement is true + Log.e(TAG, "Dash manifest seems not to bee available."); + e.printStackTrace(); + } //------------------------------------ // extract video stream url diff --git a/app/src/main/res/layout-land/fragment_videoitem_detail.xml b/app/src/main/res/layout-land/fragment_videoitem_detail.xml index 39313887c..8a93ce015 100644 --- a/app/src/main/res/layout-land/fragment_videoitem_detail.xml +++ b/app/src/main/res/layout-land/fragment_videoitem_detail.xml @@ -190,8 +190,8 @@ + android:layout_height="70dip" + android:layout_below="@id/detailNextVideoRootLayout"/> diff --git a/app/src/main/res/layout-sw600dp/fragment_videoitem_detail.xml b/app/src/main/res/layout-sw600dp/fragment_videoitem_detail.xml index 39313887c..8a93ce015 100644 --- a/app/src/main/res/layout-sw600dp/fragment_videoitem_detail.xml +++ b/app/src/main/res/layout-sw600dp/fragment_videoitem_detail.xml @@ -190,8 +190,8 @@ + android:layout_height="70dip" + android:layout_below="@id/detailNextVideoRootLayout"/> diff --git a/app/src/main/res/layout/fragment_videoitem_detail.xml b/app/src/main/res/layout/fragment_videoitem_detail.xml index 564db87ca..583869345 100644 --- a/app/src/main/res/layout/fragment_videoitem_detail.xml +++ b/app/src/main/res/layout/fragment_videoitem_detail.xml @@ -187,7 +187,7 @@ diff --git a/app/src/main/res/menu/videoitem_two_pannel.xml b/app/src/main/res/menu/videoitem_two_pannel.xml new file mode 100644 index 000000000..8b96a99d4 --- /dev/null +++ b/app/src/main/res/menu/videoitem_two_pannel.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png index b4f3d0d38f0b7b936e49029dd8426ff02d271d8d..fd8bb11b60c29b6efc91e6890ba2f118dc8b115a 100644 GIT binary patch delta 3356 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 delta 1480 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 delta 5680 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + +