From 0d2296917a791d26845ffdd7c4040480c867a901 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Sat, 23 Sep 2017 17:39:04 +0200 Subject: [PATCH 01/23] creating first prototype of kiosk page --- app/build.gradle | 2 +- .../newpipe/fragments/MainFragment.java | 17 +- .../fragments/list/kisok/KioskFragment.java | 148 ++++++++++++++++++ .../schabi/newpipe/util/ExtractorHelper.java | 19 +++ app/src/main/res/layout/fragment_kiosk.xml | 64 ++++++++ app/src/main/res/layout/kiosk_header.xml | 23 +++ app/src/main/res/values/dimens.xml | 2 + 7 files changed, 273 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/fragments/list/kisok/KioskFragment.java create mode 100644 app/src/main/res/layout/fragment_kiosk.xml create mode 100644 app/src/main/res/layout/kiosk_header.xml diff --git a/app/build.gradle b/app/build.gradle index 941dc72d7..742b00d4b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -45,7 +45,7 @@ dependencies { exclude module: 'support-annotations' } - compile 'com.github.TeamNewPipe:NewPipeExtractor:7ae274b' + compile 'com.github.TeamNewPipe:NewPipeExtractor:7fffef5' testCompile 'junit:junit:4.12' testCompile 'org.mockito:mockito-core:1.10.19' diff --git a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java index 236f95968..6f313aee0 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java @@ -18,11 +18,16 @@ import android.view.ViewGroup; import org.schabi.newpipe.BaseFragment; import org.schabi.newpipe.R; +import org.schabi.newpipe.fragments.list.kisok.KioskFragment; import org.schabi.newpipe.fragments.subscription.SubscriptionFragment; import org.schabi.newpipe.util.NavigationHelper; public class MainFragment extends BaseFragment implements TabLayout.OnTabSelectedListener { private ViewPager viewPager; + private boolean showBlankTab = false; + + //todo: FIX THIS URGENTLY + public int currentServiceId = 0; //for youtube /*////////////////////////////////////////////////////////////////////////// // Fragment's LifeCycle @@ -115,7 +120,17 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte case 1: return new SubscriptionFragment(); default: - return new BlankFragment(); + if(showBlankTab) { + return new BlankFragment(); + } else { + try { + return KioskFragment.getInstance(currentServiceId); + } catch (Exception e) { + //todo: replace this with propper error reporting + e.printStackTrace(); + return new BlankFragment(); + } + } } } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/kisok/KioskFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/kisok/KioskFragment.java new file mode 100644 index 000000000..a1e5a960f --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/kisok/KioskFragment.java @@ -0,0 +1,148 @@ +package org.schabi.newpipe.fragments.list.kisok; + +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.extractor.ListExtractor; +import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.StreamingService; +import org.schabi.newpipe.extractor.UrlIdHandler; +import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.extractor.kiosk.KioskInfo; +import org.schabi.newpipe.extractor.kiosk.KioskList; +import org.schabi.newpipe.extractor.playlist.PlaylistInfo; +import org.schabi.newpipe.fragments.list.BaseListInfoFragment; +import org.schabi.newpipe.fragments.list.channel.ChannelFragment; +import org.schabi.newpipe.report.UserAction; +import org.schabi.newpipe.util.ExtractorHelper; +import org.schabi.newpipe.util.NavigationHelper; + +import io.reactivex.Single; + +import static org.schabi.newpipe.util.AnimationUtils.animateView; + +/** + * Created by Christian Schabesberger on 23.09.17. + * + * Copyright (C) Christian Schabesberger 2017 + * KioskFragment.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 OpenHitboxStreams. If not, see . + */ + +public class KioskFragment extends BaseListInfoFragment { + + + /*////////////////////////////////////////////////////////////////////////// + // Views + //////////////////////////////////////////////////////////////////////////*/ + + private View headerRootLayout; + private TextView headerTitleView; + + public static KioskFragment getInstance(int serviceId) + throws ExtractionException { + KioskFragment instance = new KioskFragment(); + StreamingService service = NewPipe.getService(serviceId); + String defaultKioskType = service.getKioskList().getDefaultKioskType(); + UrlIdHandler defaultKioskTypeUrlIdHandler = service.getKioskList() + .getUrlIdHandlerByType(defaultKioskType); + instance.setInitialData(serviceId, + defaultKioskTypeUrlIdHandler.getUrl(defaultKioskType), + defaultKioskType); + return instance; + } + + /*////////////////////////////////////////////////////////////////////////// + // LifeCycle + //////////////////////////////////////////////////////////////////////////*/ + + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_kiosk, container, false); + } + + /*////////////////////////////////////////////////////////////////////////// + // Init + //////////////////////////////////////////////////////////////////////////*/ + + protected View getListHeader() { + headerRootLayout = activity.getLayoutInflater().inflate(R.layout.kiosk_header, itemsList, false); + headerTitleView = headerRootLayout.findViewById(R.id.kiosk_title_view); + + return headerRootLayout; + } + + /*////////////////////////////////////////////////////////////////////////// + // Load and handle + //////////////////////////////////////////////////////////////////////////*/ + + @Override + public Single loadResult(boolean forceReload) { + String contentCountry = PreferenceManager + .getDefaultSharedPreferences(activity) + .getString(getString(R.string.search_language_key), + getString(R.string.default_language_value)); + return ExtractorHelper.getKioskInfo(serviceId, url, contentCountry, forceReload); + } + + @Override + public Single loadMoreItemsLogic() { + return ExtractorHelper.getMoreKisokItems(serviceId, url, currentNextItemsUrl); + } + + /*////////////////////////////////////////////////////////////////////////// + // Contract + //////////////////////////////////////////////////////////////////////////*/ + + @Override + public void showLoading() { + super.showLoading(); + animateView(headerRootLayout, false, 200); + animateView(itemsList, false, 100); + } + + @Override + public void handleResult(@NonNull final KioskInfo result) { + super.handleResult(result); + + animateView(headerRootLayout, true, 100); + headerTitleView.setText(result.type); + + if (!result.errors.isEmpty()) { + showSnackBarError(result.errors, + UserAction.REQUESTED_PLAYLIST, + NewPipe.getNameOfService(result.service_id), result.url, 0); + } + } + + @Override + public void handleNextItems(ListExtractor.NextItemsResult result) { + super.handleNextItems(result); + + if (!result.errors.isEmpty()) { + showSnackBarError(result.errors, + UserAction.REQUESTED_PLAYLIST, NewPipe.getNameOfService(serviceId) + , "Get next page of: " + url, 0); + } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java index 5cf9f057e..856769da8 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java @@ -26,6 +26,7 @@ import org.schabi.newpipe.extractor.Info; import org.schabi.newpipe.extractor.ListExtractor.NextItemsResult; import org.schabi.newpipe.extractor.NewPipe; import org.schabi.newpipe.extractor.channel.ChannelInfo; +import org.schabi.newpipe.extractor.kiosk.KioskInfo; import org.schabi.newpipe.extractor.playlist.PlaylistInfo; import org.schabi.newpipe.extractor.search.SearchEngine; import org.schabi.newpipe.extractor.search.SearchResult; @@ -124,6 +125,24 @@ public final class ExtractorHelper { }); } + public static Single getKioskInfo(final int serviceId, final String url, final String contentCountry, boolean forceLoad) { + return checkCache(forceLoad, serviceId, url, Single.fromCallable(new Callable() { + @Override + public KioskInfo call() throws Exception { + return KioskInfo.getInfo(NewPipe.getService(serviceId), url, contentCountry); + } + })); + } + + public static Single getMoreKisokItems(final int serviceId, final String url, final String nextStreamsUrl) { + return Single.fromCallable(new Callable() { + @Override + public NextItemsResult call() throws Exception { + return KioskInfo.getMoreItems(NewPipe.getService(serviceId), url, nextStreamsUrl); + } + }); + } + /*////////////////////////////////////////////////////////////////////////// // Utils //////////////////////////////////////////////////////////////////////////*/ diff --git a/app/src/main/res/layout/fragment_kiosk.xml b/app/src/main/res/layout/fragment_kiosk.xml new file mode 100644 index 000000000..a85c30cb1 --- /dev/null +++ b/app/src/main/res/layout/fragment_kiosk.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/kiosk_header.xml b/app/src/main/res/layout/kiosk_header.xml new file mode 100644 index 000000000..c161ca83d --- /dev/null +++ b/app/src/main/res/layout/kiosk_header.xml @@ -0,0 +1,23 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 32e300ca1..1c5265b8b 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -67,4 +67,6 @@ 24dp 28dp + + 30sp From f6c624b59a56904ddbeba1bad2a19bfa5d024c49 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Mon, 25 Sep 2017 12:49:14 +0200 Subject: [PATCH 02/23] make name translatable, fix tab on items, remove back button s/kisok/kiosk/g --- app/build.gradle | 2 +- .../newpipe/fragments/MainFragment.java | 2 +- .../list/{kisok => kiosk}/KioskFragment.java | 52 +++++++++++++++---- .../schabi/newpipe/util/ExtractorHelper.java | 2 +- 4 files changed, 44 insertions(+), 14 deletions(-) rename app/src/main/java/org/schabi/newpipe/fragments/list/{kisok => kiosk}/KioskFragment.java (73%) diff --git a/app/build.gradle b/app/build.gradle index 8bb0d19b2..a3ad71b5c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -48,7 +48,7 @@ dependencies { exclude module: 'support-annotations' } - compile 'com.github.TeamNewPipe:NewPipeExtractor:7fffef5' + compile 'com.github.TeamNewPipe:NewPipeExtractor:466d87c' testCompile 'junit:junit:4.12' testCompile 'org.mockito:mockito-core:1.10.19' diff --git a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java index 6f313aee0..3ca14f552 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java @@ -18,7 +18,7 @@ import android.view.ViewGroup; import org.schabi.newpipe.BaseFragment; import org.schabi.newpipe.R; -import org.schabi.newpipe.fragments.list.kisok.KioskFragment; +import org.schabi.newpipe.fragments.list.kiosk.KioskFragment; import org.schabi.newpipe.fragments.subscription.SubscriptionFragment; import org.schabi.newpipe.util.NavigationHelper; diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/kisok/KioskFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java similarity index 73% rename from app/src/main/java/org/schabi/newpipe/fragments/list/kisok/KioskFragment.java rename to app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java index a1e5a960f..932cf2a44 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/kisok/KioskFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java @@ -1,11 +1,13 @@ -package org.schabi.newpipe.fragments.list.kisok; +package org.schabi.newpipe.fragments.list.kiosk; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import android.text.TextUtils; +import android.support.v7.app.ActionBar; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; @@ -17,10 +19,9 @@ import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.UrlIdHandler; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.extractor.kiosk.KioskInfo; -import org.schabi.newpipe.extractor.kiosk.KioskList; -import org.schabi.newpipe.extractor.playlist.PlaylistInfo; +import org.schabi.newpipe.extractor.stream.StreamInfoItem; import org.schabi.newpipe.fragments.list.BaseListInfoFragment; -import org.schabi.newpipe.fragments.list.channel.ChannelFragment; +import org.schabi.newpipe.info_list.InfoItemBuilder; import org.schabi.newpipe.report.UserAction; import org.schabi.newpipe.util.ExtractorHelper; import org.schabi.newpipe.util.NavigationHelper; @@ -63,12 +64,12 @@ public class KioskFragment extends BaseListInfoFragment { throws ExtractionException { KioskFragment instance = new KioskFragment(); StreamingService service = NewPipe.getService(serviceId); - String defaultKioskType = service.getKioskList().getDefaultKioskType(); + String defaultKioskId = service.getKioskList().getDefaultKioskId(); UrlIdHandler defaultKioskTypeUrlIdHandler = service.getKioskList() - .getUrlIdHandlerByType(defaultKioskType); + .getUrlIdHandlerByType(defaultKioskId); instance.setInitialData(serviceId, - defaultKioskTypeUrlIdHandler.getUrl(defaultKioskType), - defaultKioskType); + defaultKioskTypeUrlIdHandler.getUrl(defaultKioskId), + defaultKioskId); return instance; } @@ -81,6 +82,20 @@ public class KioskFragment extends BaseListInfoFragment { return inflater.inflate(R.layout.fragment_kiosk, container, false); } + /*////////////////////////////////////////////////////////////////////////// + // Menu + //////////////////////////////////////////////////////////////////////////*/ + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + super.onCreateOptionsMenu(menu, inflater); + ActionBar supportActionBar = activity.getSupportActionBar(); + if (supportActionBar != null) { + supportActionBar.setDisplayShowTitleEnabled(false); + supportActionBar.setDisplayHomeAsUpEnabled(false); + } + } + /*////////////////////////////////////////////////////////////////////////// // Init //////////////////////////////////////////////////////////////////////////*/ @@ -92,6 +107,21 @@ public class KioskFragment extends BaseListInfoFragment { return headerRootLayout; } + @Override + public void initListeners() { + // We have to override this because the default implementation of this function calls + // openVideoDetailFragment on getFragmentManager() but what we want here is + // getParentFragment().getFragmentManager() + infoListAdapter.setOnStreamSelectedListener(new InfoItemBuilder.OnInfoItemSelectedListener() { + @Override + public void selected(StreamInfoItem selectedItem) { + onItemSelected(selectedItem); + NavigationHelper.openVideoDetailFragment(getParentFragment().getFragmentManager(), + selectedItem.service_id, selectedItem.url, selectedItem.name); + } + }); + } + /*////////////////////////////////////////////////////////////////////////// // Load and handle //////////////////////////////////////////////////////////////////////////*/ @@ -107,7 +137,7 @@ public class KioskFragment extends BaseListInfoFragment { @Override public Single loadMoreItemsLogic() { - return ExtractorHelper.getMoreKisokItems(serviceId, url, currentNextItemsUrl); + return ExtractorHelper.getMoreKioskItems(serviceId, url, currentNextItemsUrl); } /*////////////////////////////////////////////////////////////////////////// @@ -126,7 +156,7 @@ public class KioskFragment extends BaseListInfoFragment { super.handleResult(result); animateView(headerRootLayout, true, 100); - headerTitleView.setText(result.type); + headerTitleView.setText("★★ " +result.name+ " ★★"); if (!result.errors.isEmpty()) { showSnackBarError(result.errors, diff --git a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java index 856769da8..b1ed2e901 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java @@ -134,7 +134,7 @@ public final class ExtractorHelper { })); } - public static Single getMoreKisokItems(final int serviceId, final String url, final String nextStreamsUrl) { + public static Single getMoreKioskItems(final int serviceId, final String url, final String nextStreamsUrl) { return Single.fromCallable(new Callable() { @Override public NextItemsResult call() throws Exception { From 5ebde97352c28fd540ce6ee1577bb2e0e2bc7145 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Mon, 25 Sep 2017 13:05:54 +0200 Subject: [PATCH 03/23] fix error report and add setting for current_service --- .../schabi/newpipe/fragments/MainFragment.java | 15 +++++++++++---- app/src/main/res/values/settings_keys.xml | 3 +++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java index 3ca14f552..a92287089 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java @@ -8,6 +8,7 @@ import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.support.v7.app.ActionBar; +import android.support.v7.preference.PreferenceManager; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; @@ -20,14 +21,15 @@ import org.schabi.newpipe.BaseFragment; import org.schabi.newpipe.R; import org.schabi.newpipe.fragments.list.kiosk.KioskFragment; import org.schabi.newpipe.fragments.subscription.SubscriptionFragment; +import org.schabi.newpipe.report.ErrorActivity; +import org.schabi.newpipe.report.UserAction; import org.schabi.newpipe.util.NavigationHelper; public class MainFragment extends BaseFragment implements TabLayout.OnTabSelectedListener { private ViewPager viewPager; private boolean showBlankTab = false; - //todo: FIX THIS URGENTLY - public int currentServiceId = 0; //for youtube + public int currentServiceId = -1; /*////////////////////////////////////////////////////////////////////////// // Fragment's LifeCycle @@ -41,6 +43,8 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + currentServiceId = Integer.parseInt(PreferenceManager.getDefaultSharedPreferences(getActivity()) + .getString(getString(R.string.current_service_key), "0")); return inflater.inflate(R.layout.fragment_main, container, false); } @@ -126,8 +130,11 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte try { return KioskFragment.getInstance(currentServiceId); } catch (Exception e) { - //todo: replace this with propper error reporting - e.printStackTrace(); + ErrorActivity.reportError(activity, e, + activity.getClass(), + null, + ErrorActivity.ErrorInfo.make(UserAction.UI_ERROR, + "none", "", R.string.app_ui_crash)); return new BlankFragment(); } } diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index 76cd10681..f5cef09a0 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -1,5 +1,8 @@ + + current_service + download_path download_path_audio From 65c8b6e66a14144c59173cc085108526feda12d5 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Tue, 26 Sep 2017 17:29:38 +0200 Subject: [PATCH 04/23] add selection for front page --- .../org/schabi/newpipe/RouterActivity.java | 10 +- .../newpipe/fragments/MainFragment.java | 49 +++-- .../settings/ContentSettingsFragment.java | 49 +++++ .../settings/SelectChannelFragment.java | 184 ++++++++++++++++++ .../res/layout/select_channel_fragment.xml | 42 ++++ .../main/res/layout/select_channel_item.xml | 38 ++++ app/src/main/res/values/settings_keys.xml | 16 ++ app/src/main/res/values/strings.xml | 11 ++ app/src/main/res/xml/content_settings.xml | 7 + 9 files changed, 387 insertions(+), 19 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/settings/SelectChannelFragment.java create mode 100644 app/src/main/res/layout/select_channel_fragment.xml create mode 100644 app/src/main/res/layout/select_channel_item.xml diff --git a/app/src/main/java/org/schabi/newpipe/RouterActivity.java b/app/src/main/java/org/schabi/newpipe/RouterActivity.java index ce9c3802f..41e557b52 100644 --- a/app/src/main/java/org/schabi/newpipe/RouterActivity.java +++ b/app/src/main/java/org/schabi/newpipe/RouterActivity.java @@ -10,22 +10,22 @@ import org.schabi.newpipe.util.NavigationHelper; import java.util.Collection; import java.util.HashSet; -/* +/** * Copyright (C) Christian Schabesberger 2017 - * RouterActivity .java is part of NewPipe. + * RouterActivity.java is part of NewPipe. * - * OpenHitboxStreams is free software: you can redistribute it and/or modify + * 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. * - * OpenHitboxStreams is distributed in the hope that it will be useful, + * 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 OpenHitboxStreams. If not, see . + * along with NewPipe. If not, see . */ /** diff --git a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java index a92287089..0a8e9b655 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java @@ -25,6 +25,8 @@ import org.schabi.newpipe.report.ErrorActivity; import org.schabi.newpipe.report.UserAction; import org.schabi.newpipe.util.NavigationHelper; +import java.util.concurrent.ExecutionException; + public class MainFragment extends BaseFragment implements TabLayout.OnTabSelectedListener { private ViewPager viewPager; private boolean showBlankTab = false; @@ -124,20 +126,7 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte case 1: return new SubscriptionFragment(); default: - if(showBlankTab) { - return new BlankFragment(); - } else { - try { - return KioskFragment.getInstance(currentServiceId); - } catch (Exception e) { - ErrorActivity.reportError(activity, e, - activity.getClass(), - null, - ErrorActivity.ErrorInfo.make(UserAction.UI_ERROR, - "none", "", R.string.app_ui_crash)); - return new BlankFragment(); - } - } + return getMainPageFramgent(); } } @@ -151,4 +140,36 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte return this.tabTitles.length; } } + + /*////////////////////////////////////////////////////////////////////////// + // Main page content + //////////////////////////////////////////////////////////////////////////*/ + + private Fragment getMainPageFramgent() { + try { + final String set_main_page = PreferenceManager.getDefaultSharedPreferences(getActivity()) + .getString(getString(R.string.main_page_content_key), + getString(R.string.main_page_selectd_kiosk_id)); + if(set_main_page.equals(getString(R.string.blank_page_key))) { + return new BlankFragment(); + } else if(set_main_page.equals(getString(R.string.kiosk_page_key))) { + return KioskFragment.getInstance(currentServiceId); + } else if(set_main_page.equals(getString(R.string.feed_page_key))) { + return new BlankFragment(); + } else if(set_main_page.equals(getString(R.string.channel_page_key))) { + return new BlankFragment(); + } else { + return new BlankFragment(); + } + + + } catch (Exception e) { + ErrorActivity.reportError(activity, e, + activity.getClass(), + null, + ErrorActivity.ErrorInfo.make(UserAction.UI_ERROR, + "none", "", R.string.app_ui_crash)); + return new BlankFragment(); + } + } } diff --git a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java index 6021b40fd..0164f584e 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java @@ -1,6 +1,9 @@ package org.schabi.newpipe.settings; import android.os.Bundle; +import android.support.v7.preference.ListPreference; +import android.support.v7.preference.Preference; +import android.util.Log; import org.schabi.newpipe.R; @@ -8,5 +11,51 @@ public class ContentSettingsFragment extends BasePreferenceFragment { @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { addPreferencesFromResource(R.xml.content_settings); + + findPreference(getString(R.string.main_page_content_key)) + .setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValueO) { + final String newValue = newValueO.toString(); + + if(newValue.equals(getString(R.string.kiosk_page_key))) { + //todo on multyservice support show a kiosk an service selector here + } else if(newValue.equals(getString(R.string.channel_page_key))) { + SelectChannelFragment selectChannelFragment = new SelectChannelFragment(); + selectChannelFragment.setOnSelectedLisener(new SelectChannelFragment.OnSelectedLisener() { + @Override + public void onChannelSelected(String url, String name, int service) { + defaultPreferences.edit() + .putInt(getString(R.string.main_page_selected_service), service).apply(); + defaultPreferences.edit() + .putString(getString(R.string.main_page_selected_channel_url), url).apply(); + defaultPreferences.edit() + .putString(getString(R.string.main_page_selected_channel_name), name).apply(); + + //change summery + Preference pref = findPreference(getString(R.string.main_page_content_key)); + pref.setSummary(name); + + } + }); + selectChannelFragment.show(getFragmentManager(), "select_channel"); + } + + return true; + } + }); + } + + @Override + public void onResume() { + super.onResume(); + + final String mainPageContentKey = getString(R.string.main_page_content_key); + if(defaultPreferences.getString(mainPageContentKey, + getString(R.string.blank_page_key)) + .equals(getString(R.string.channel_page_key))) { + Preference pref = findPreference(getString(R.string.main_page_content_key)); + pref.setSummary(defaultPreferences.getString(getString(R.string.main_page_selected_channel_name), "error")); + } } } diff --git a/app/src/main/java/org/schabi/newpipe/settings/SelectChannelFragment.java b/app/src/main/java/org/schabi/newpipe/settings/SelectChannelFragment.java new file mode 100644 index 000000000..5cc7070f9 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/SelectChannelFragment.java @@ -0,0 +1,184 @@ +package org.schabi.newpipe.settings; + +import android.app.Activity; +import android.content.DialogInterface; +import android.os.Bundle; +import android.support.v4.app.DialogFragment; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ProgressBar; +import android.widget.TextView; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.database.subscription.SubscriptionEntity; +import org.schabi.newpipe.fragments.subscription.SubscriptionService; +import org.schabi.newpipe.report.ErrorActivity; +import org.schabi.newpipe.report.UserAction; + +import java.util.List; +import java.util.Vector; + +import de.hdodenhof.circleimageview.CircleImageView; +import io.reactivex.Observer; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; +import io.reactivex.schedulers.Schedulers; + + +/** + * Created by Christian Schabesberger on 26.09.17. + * SelectChannelFragment.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 . + */ + +public class SelectChannelFragment extends DialogFragment { + private SelectChannelAdapter channelAdapter; + private SubscriptionService subscriptionService; + + private ProgressBar progressBar; + private TextView emptyView; + private RecyclerView recyclerView; + + private List subscriptions = new Vector<>(); + + public interface OnSelectedLisener { + public void onChannelSelected(String url, String name, int service); + } + + OnSelectedLisener onSelectedLisener; + public void setOnSelectedLisener(OnSelectedLisener listener) { + onSelectedLisener = listener; + } + + + @Override + public View onCreateView(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.setLayoutManager(new LinearLayoutManager(getContext())); + channelAdapter = new SelectChannelAdapter(); + recyclerView.setAdapter(channelAdapter); + + progressBar = v.findViewById(R.id.progressBar); + emptyView = v.findViewById(R.id.empty_state_view); + progressBar.setVisibility(View.VISIBLE); + recyclerView.setVisibility(View.GONE); + emptyView.setVisibility(View.GONE); + + + subscriptionService = SubscriptionService.getInstance(); + subscriptionService.getSubscription().toObservable() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(getSubscriptionObserver()); + + return v; + } + + private void displayChannels(List subscriptions) { + this.subscriptions = subscriptions; + progressBar.setVisibility(View.GONE); + if(subscriptions.isEmpty()) { + emptyView.setVisibility(View.VISIBLE); + return; + } + recyclerView.setVisibility(View.VISIBLE); + + } + + private void clickedItem(int position) { + if(onSelectedLisener != null) { + SubscriptionEntity entry = subscriptions.get(position); + onSelectedLisener.onChannelSelected(entry.getUrl(), entry.getName(), entry.getServiceId()); + } + dismiss(); + } + + private Observer> getSubscriptionObserver() { + return new Observer>() { + @Override + public void onSubscribe(Disposable d) { + } + + @Override + public void onNext(List subscriptions) { + displayChannels(subscriptions); + } + + @Override + public void onError(Throwable exception) { + onError(exception); + } + + @Override + public void onComplete() { + } + }; + } + + private class SelectChannelAdapter extends + RecyclerView.Adapter { + + @Override + public SelectChannelItemHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View item = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.select_channel_item, parent, false); + return new SelectChannelItemHolder(item); + } + + @Override + public void onBindViewHolder(SelectChannelItemHolder holder, final int position) { + SubscriptionEntity entry = subscriptions.get(position); + holder.titleView.setText(entry.getName()); + holder.view.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + clickedItem(position); + } + }); + } + + @Override + public int getItemCount() { + return subscriptions.size(); + } + + public class SelectChannelItemHolder extends RecyclerView.ViewHolder { + public SelectChannelItemHolder(View v) { + super(v); + this.view = v; + thumbnailView = v.findViewById(R.id.itemThumbnailView); + titleView = v.findViewById(R.id.itemTitleView); + } + public View view; + public CircleImageView thumbnailView; + public TextView titleView; + } + } + + protected boolean 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; + } +} diff --git a/app/src/main/res/layout/select_channel_fragment.xml b/app/src/main/res/layout/select_channel_fragment.xml new file mode 100644 index 000000000..9c8e79779 --- /dev/null +++ b/app/src/main/res/layout/select_channel_fragment.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/select_channel_item.xml b/app/src/main/res/layout/select_channel_item.xml new file mode 100644 index 000000000..903894aeb --- /dev/null +++ b/app/src/main/res/layout/select_channel_item.xml @@ -0,0 +1,38 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index f5cef09a0..878d51741 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -92,6 +92,7 @@ @string/black_theme_title + show_search_suggestions show_play_with_kodi show_next_video @@ -101,6 +102,21 @@ use_tor enable_search_history enable_watch_history + main_page_content + blank_page + feed_page + kiosk_page + channel_page + + @string/blank_page_key + @string/kiosk_page_key + @string/feed_page_key + @string/channel_page_key + + main_page_selected_service + main_page_selected_channel_name + main_page_selected_channel_url + main_page_selectd_kiosk_id file_rename diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a5b3993d8..e16bfca16 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -265,4 +265,15 @@ The history is empty History cleared Item deleted + + + Content of main page + + Blank Page + Trending Page + Feed Page + Channel Page + + Select a channel + No channel subscribed yet diff --git a/app/src/main/res/xml/content_settings.xml b/app/src/main/res/xml/content_settings.xml index 63cd3cd01..11672671e 100644 --- a/app/src/main/res/xml/content_settings.xml +++ b/app/src/main/res/xml/content_settings.xml @@ -21,5 +21,12 @@ android:key="@string/show_search_suggestions_key" android:summary="@string/show_search_suggestions_summary" android:title="@string/show_search_suggestions_title"/> + From 3490273b498156ccd56ee29b63d0db09fa2cb169 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Tue, 26 Sep 2017 18:16:39 +0200 Subject: [PATCH 05/23] made fragments frontpagable --- .../newpipe/fragments/BaseStateFragment.java | 6 +++++ .../newpipe/fragments/MainFragment.java | 22 +++++++++++++++---- .../fragments/list/BaseListFragment.java | 12 +++++++--- .../list/channel/ChannelFragment.java | 19 +++++++++++----- .../fragments/list/feed/FeedFragment.java | 7 ++++-- .../fragments/list/kiosk/KioskFragment.java | 18 +-------------- .../settings/ContentSettingsFragment.java | 2 ++ .../settings/SelectChannelFragment.java | 1 - 8 files changed, 54 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/BaseStateFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/BaseStateFragment.java index 5a8d8dd52..80f05585b 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/BaseStateFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/BaseStateFragment.java @@ -50,6 +50,8 @@ public abstract class BaseStateFragment extends BaseFragment implements ViewC protected Button errorButtonRetry; protected TextView errorTextView; + protected boolean useAsFrontPage = false; + @Override public void onViewCreated(View rootView, Bundle savedInstanceState) { super.onViewCreated(rootView, savedInstanceState); @@ -62,6 +64,10 @@ public abstract class BaseStateFragment extends BaseFragment implements ViewC wasLoading.set(isLoading.get()); } + public void useAsFrontPage(boolean value) { + useAsFrontPage = value; + } + /*////////////////////////////////////////////////////////////////////////// // Init //////////////////////////////////////////////////////////////////////////*/ diff --git a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java index 0a8e9b655..aa28c54fb 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java @@ -1,5 +1,6 @@ package org.schabi.newpipe.fragments; +import android.content.SharedPreferences; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.design.widget.TabLayout; @@ -19,6 +20,8 @@ import android.view.ViewGroup; import org.schabi.newpipe.BaseFragment; import org.schabi.newpipe.R; +import org.schabi.newpipe.fragments.list.channel.ChannelFragment; +import org.schabi.newpipe.fragments.list.feed.FeedFragment; import org.schabi.newpipe.fragments.list.kiosk.KioskFragment; import org.schabi.newpipe.fragments.subscription.SubscriptionFragment; import org.schabi.newpipe.report.ErrorActivity; @@ -153,16 +156,27 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte if(set_main_page.equals(getString(R.string.blank_page_key))) { return new BlankFragment(); } else if(set_main_page.equals(getString(R.string.kiosk_page_key))) { - return KioskFragment.getInstance(currentServiceId); + KioskFragment fragment = KioskFragment.getInstance(currentServiceId); + fragment.useAsFrontPage(true); + return fragment; } else if(set_main_page.equals(getString(R.string.feed_page_key))) { - return new BlankFragment(); + FeedFragment fragment = new FeedFragment(); + fragment.useAsFrontPage(true); + return fragment; } else if(set_main_page.equals(getString(R.string.channel_page_key))) { - return new BlankFragment(); + SharedPreferences preferences = + PreferenceManager.getDefaultSharedPreferences(getActivity()); + int serviceId = preferences.getInt(getString(R.string.main_page_selected_service), 0); + String url = preferences.getString(getString(R.string.main_page_selected_channel_url), + "https://www.youtube.com/channel/UC-9-kyTW8ZkZNDHQJ6FgpwQ"); + String name = preferences.getString(getString(R.string.main_page_selected_channel_name), "Music"); + ChannelFragment fragment = ChannelFragment.getInstance(serviceId, url, name); + fragment.useAsFrontPage(true); + return fragment; } else { return new BlankFragment(); } - } catch (Exception e) { ErrorActivity.reportError(activity, e, activity.getClass(), diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java index 4501ab859..48661969f 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java @@ -135,7 +135,9 @@ public abstract class BaseListFragment extends BaseStateFragment implem @Override public void selected(StreamInfoItem selectedItem) { onItemSelected(selectedItem); - NavigationHelper.openVideoDetailFragment(getFragmentManager(), selectedItem.service_id, selectedItem.url, selectedItem.name); + NavigationHelper.openVideoDetailFragment( + useAsFrontPage?getParentFragment().getFragmentManager():getFragmentManager(), + selectedItem.service_id, selectedItem.url, selectedItem.name); } }); @@ -143,7 +145,9 @@ public abstract class BaseListFragment extends BaseStateFragment implem @Override public void selected(ChannelInfoItem selectedItem) { onItemSelected(selectedItem); - NavigationHelper.openChannelFragment(getFragmentManager(), selectedItem.service_id, selectedItem.url, selectedItem.name); + NavigationHelper.openChannelFragment( + useAsFrontPage?getParentFragment().getFragmentManager():getFragmentManager(), + selectedItem.service_id, selectedItem.url, selectedItem.name); } }); @@ -151,7 +155,9 @@ public abstract class BaseListFragment extends BaseStateFragment implem @Override public void selected(PlaylistInfoItem selectedItem) { onItemSelected(selectedItem); - NavigationHelper.openPlaylistFragment(getFragmentManager(), selectedItem.service_id, selectedItem.url, selectedItem.name); + NavigationHelper.openPlaylistFragment( + useAsFrontPage?getParentFragment().getFragmentManager():getFragmentManager(), + selectedItem.service_id, selectedItem.url, selectedItem.name); } }); diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java index b7148fe63..5a722ec4c 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java @@ -7,6 +7,7 @@ import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.content.ContextCompat; +import android.support.v7.app.ActionBar; import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; @@ -118,15 +119,21 @@ public class ChannelFragment extends BaseListInfoFragment { @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { - if (DEBUG) Log.d(TAG, "onCreateOptionsMenu() called with: menu = [" + menu + "], inflater = [" + inflater + "]"); super.onCreateOptionsMenu(menu, inflater); - inflater.inflate(R.menu.menu_channel, menu); + ActionBar supportActionBar = activity.getSupportActionBar(); + if(useAsFrontPage) { + supportActionBar.setDisplayHomeAsUpEnabled(false); + supportActionBar.setDisplayShowTitleEnabled(false); + } else { + inflater.inflate(R.menu.menu_channel, menu); + + if (DEBUG) Log.d(TAG, "onCreateOptionsMenu() called with: menu = [" + menu + "], inflater = [" + inflater + "]"); + menuRssButton = menu.findItem(R.id.menu_item_rss); + if (currentInfo != null) { + menuRssButton.setVisible(!TextUtils.isEmpty(currentInfo.feed_url)); + } - menuRssButton = menu.findItem(R.id.menu_item_rss); - if (currentInfo != null) { - menuRssButton.setVisible(!TextUtils.isEmpty(currentInfo.feed_url)); } - } @Override diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/feed/FeedFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/feed/FeedFragment.java index 2af9a9270..1a8f8e625 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/feed/FeedFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/feed/FeedFragment.java @@ -36,10 +36,8 @@ import io.reactivex.MaybeObserver; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; import io.reactivex.disposables.Disposable; -import io.reactivex.functions.Action; import io.reactivex.functions.Consumer; import io.reactivex.functions.Predicate; -import io.reactivex.schedulers.Schedulers; public class FeedFragment extends BaseListFragment, Void> { @@ -121,6 +119,11 @@ public class FeedFragment extends BaseListFragment, Voi if (supportActionBar != null) { supportActionBar.setTitle(R.string.fragment_whats_new); } + + if(useAsFrontPage) { + supportActionBar.setDisplayHomeAsUpEnabled(false); + supportActionBar.setDisplayShowTitleEnabled(false); + } } @Override diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java index 932cf2a44..3d019e6cb 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java @@ -52,7 +52,6 @@ import static org.schabi.newpipe.util.AnimationUtils.animateView; public class KioskFragment extends BaseListInfoFragment { - /*////////////////////////////////////////////////////////////////////////// // Views //////////////////////////////////////////////////////////////////////////*/ @@ -90,7 +89,7 @@ public class KioskFragment extends BaseListInfoFragment { public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); ActionBar supportActionBar = activity.getSupportActionBar(); - if (supportActionBar != null) { + if (supportActionBar != null && useAsFrontPage) { supportActionBar.setDisplayShowTitleEnabled(false); supportActionBar.setDisplayHomeAsUpEnabled(false); } @@ -107,21 +106,6 @@ public class KioskFragment extends BaseListInfoFragment { return headerRootLayout; } - @Override - public void initListeners() { - // We have to override this because the default implementation of this function calls - // openVideoDetailFragment on getFragmentManager() but what we want here is - // getParentFragment().getFragmentManager() - infoListAdapter.setOnStreamSelectedListener(new InfoItemBuilder.OnInfoItemSelectedListener() { - @Override - public void selected(StreamInfoItem selectedItem) { - onItemSelected(selectedItem); - NavigationHelper.openVideoDetailFragment(getParentFragment().getFragmentManager(), - selectedItem.service_id, selectedItem.url, selectedItem.name); - } - }); - } - /*////////////////////////////////////////////////////////////////////////// // Load and handle //////////////////////////////////////////////////////////////////////////*/ diff --git a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java index 0164f584e..9b3ffb5ae 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java @@ -6,6 +6,7 @@ import android.support.v7.preference.Preference; import android.util.Log; import org.schabi.newpipe.R; +import org.schabi.newpipe.util.Constants; public class ContentSettingsFragment extends BasePreferenceFragment { @Override @@ -36,6 +37,7 @@ public class ContentSettingsFragment extends BasePreferenceFragment { Preference pref = findPreference(getString(R.string.main_page_content_key)); pref.setSummary(name); + } }); selectChannelFragment.show(getFragmentManager(), "select_channel"); diff --git a/app/src/main/java/org/schabi/newpipe/settings/SelectChannelFragment.java b/app/src/main/java/org/schabi/newpipe/settings/SelectChannelFragment.java index 5cc7070f9..16b68196a 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SelectChannelFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SelectChannelFragment.java @@ -66,7 +66,6 @@ public class SelectChannelFragment extends DialogFragment { onSelectedLisener = listener; } - @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.select_channel_fragment, container, false); From 29fee28d1d2f7e83ecacade996912a129151acfc Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Thu, 28 Sep 2017 15:36:15 +0200 Subject: [PATCH 06/23] fix channel selection --- .../settings/BasePreferenceFragment.java | 2 +- .../settings/ContentSettingsFragment.java | 55 +++++++++++-- .../settings/SelectChannelFragment.java | 79 ++++++++++++++++--- app/src/main/res/values/strings.xml | 12 ++- 4 files changed, 123 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/BasePreferenceFragment.java b/app/src/main/java/org/schabi/newpipe/settings/BasePreferenceFragment.java index a16f7dd79..e3c52cdad 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/BasePreferenceFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/BasePreferenceFragment.java @@ -19,8 +19,8 @@ public abstract class BasePreferenceFragment extends PreferenceFragmentCompat { @Override public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); defaultPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); + super.onCreate(savedInstanceState); } @Override diff --git a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java index 9b3ffb5ae..02038f9fa 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java @@ -3,22 +3,27 @@ package org.schabi.newpipe.settings; import android.os.Bundle; import android.support.v7.preference.ListPreference; import android.support.v7.preference.Preference; -import android.util.Log; import org.schabi.newpipe.R; -import org.schabi.newpipe.util.Constants; public class ContentSettingsFragment extends BasePreferenceFragment { + @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + addPreferencesFromResource(R.xml.content_settings); - findPreference(getString(R.string.main_page_content_key)) - .setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + final ListPreference mainPageContentPref = (ListPreference) findPreference(getString(R.string.main_page_content_key)); + + mainPageContentPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValueO) { final String newValue = newValueO.toString(); + final String mainPrefOldValue = + defaultPreferences.getString(getString(R.string.main_page_content_key), "blank_page"); + final String mainPrefOldSummary = getMainPagePrefSummery(mainPrefOldValue, mainPageContentPref); + if(newValue.equals(getString(R.string.kiosk_page_key))) { //todo on multyservice support show a kiosk an service selector here } else if(newValue.equals(getString(R.string.channel_page_key))) { @@ -34,15 +39,25 @@ public class ContentSettingsFragment extends BasePreferenceFragment { .putString(getString(R.string.main_page_selected_channel_name), name).apply(); //change summery - Preference pref = findPreference(getString(R.string.main_page_content_key)); - pref.setSummary(name); - - + mainPageContentPref.setSummary(name); + } + }); + selectChannelFragment.setOnCancelListener(new SelectChannelFragment.OnCancelListener() { + @Override + public void onCancel() { + //defaultPreferences.edit() + // .putString(getString(R.string.main_page_content_key), mainPrefOldValue).apply(); + mainPageContentPref.setSummary(mainPrefOldSummary); + mainPageContentPref.setValue(mainPrefOldValue); } }); selectChannelFragment.show(getFragmentManager(), "select_channel"); } + if(!newValue.equals(getString(R.string.channel_page_key))) { + mainPageContentPref.setSummary(getMainPageSummeryByKey(newValue)); + } + return true; } }); @@ -60,4 +75,28 @@ public class ContentSettingsFragment extends BasePreferenceFragment { pref.setSummary(defaultPreferences.getString(getString(R.string.main_page_selected_channel_name), "error")); } } + + /*////////////////////////////////////////////////////////////////////////// + // Utils + //////////////////////////////////////////////////////////////////////////*/ + private String getMainPagePrefSummery(final String mainPrefOldValue, final ListPreference mainPageContentPref) { + if(mainPrefOldValue.equals(getString(R.string.channel_page_key))) { + return defaultPreferences.getString(getString(R.string.main_page_selected_channel_name), "error"); + } else { + return mainPageContentPref.getSummary().toString(); + } + } + + private int getMainPageSummeryByKey(final String key) { + if(key.equals(getString(R.string.blank_page_key))) { + return R.string.blank_page_summary; + } else if(key.equals(getString(R.string.kiosk_page_key))) { + return R.string.kiosk_page_summary; + } else if(key.equals(getString(R.string.feed_page_key))) { + return R.string.feed_page_summary; + } else if(key.equals(getString(R.string.channel_page_key))) { + return R.string.channel_page_summary; + } + return R.string.blank_page_summary; + } } diff --git a/app/src/main/java/org/schabi/newpipe/settings/SelectChannelFragment.java b/app/src/main/java/org/schabi/newpipe/settings/SelectChannelFragment.java index 16b68196a..97af11f1b 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SelectChannelFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SelectChannelFragment.java @@ -13,6 +13,9 @@ import android.view.ViewGroup; import android.widget.ProgressBar; import android.widget.TextView; +import com.nostra13.universalimageloader.core.DisplayImageOptions; +import com.nostra13.universalimageloader.core.ImageLoader; + import org.schabi.newpipe.R; import org.schabi.newpipe.database.subscription.SubscriptionEntity; import org.schabi.newpipe.fragments.subscription.SubscriptionService; @@ -50,6 +53,7 @@ import io.reactivex.schedulers.Schedulers; public class SelectChannelFragment extends DialogFragment { private SelectChannelAdapter channelAdapter; private SubscriptionService subscriptionService; + private ImageLoader imageLoader = ImageLoader.getInstance(); private ProgressBar progressBar; private TextView emptyView; @@ -57,15 +61,31 @@ public class SelectChannelFragment extends DialogFragment { private List subscriptions = new Vector<>(); - public interface OnSelectedLisener { - public void onChannelSelected(String url, String name, int service); - } + /*////////////////////////////////////////////////////////////////////////// + // Interfaces + //////////////////////////////////////////////////////////////////////////*/ - OnSelectedLisener onSelectedLisener; + public interface OnSelectedLisener { + void onChannelSelected(String url, String name, int service); + } + OnSelectedLisener onSelectedLisener = null; public void setOnSelectedLisener(OnSelectedLisener listener) { onSelectedLisener = listener; } + public interface OnCancelListener { + void onCancel(); + } + OnCancelListener onCancelListener = null; + public void setOnCancelListener(OnCancelListener listener) { + onCancelListener = listener; + } + + /*////////////////////////////////////////////////////////////////////////// + // Init + //////////////////////////////////////////////////////////////////////////*/ + + @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.select_channel_fragment, container, false); @@ -90,6 +110,31 @@ public class SelectChannelFragment extends DialogFragment { return v; } + + /*////////////////////////////////////////////////////////////////////////// + // Handle actions + //////////////////////////////////////////////////////////////////////////*/ + + @Override + public void onCancel(final DialogInterface dialogInterface) { + super.onCancel(dialogInterface); + if(onCancelListener != null) { + onCancelListener.onCancel(); + } + } + + private void clickedItem(int position) { + if(onSelectedLisener != null) { + SubscriptionEntity entry = subscriptions.get(position); + onSelectedLisener.onChannelSelected(entry.getUrl(), entry.getName(), entry.getServiceId()); + } + dismiss(); + } + + /*////////////////////////////////////////////////////////////////////////// + // Item handling + //////////////////////////////////////////////////////////////////////////*/ + private void displayChannels(List subscriptions) { this.subscriptions = subscriptions; progressBar.setVisibility(View.GONE); @@ -101,14 +146,6 @@ public class SelectChannelFragment extends DialogFragment { } - private void clickedItem(int position) { - if(onSelectedLisener != null) { - SubscriptionEntity entry = subscriptions.get(position); - onSelectedLisener.onChannelSelected(entry.getUrl(), entry.getName(), entry.getServiceId()); - } - dismiss(); - } - private Observer> getSubscriptionObserver() { return new Observer>() { @Override @@ -151,6 +188,7 @@ public class SelectChannelFragment extends DialogFragment { clickedItem(position); } }); + imageLoader.displayImage(entry.getAvatarUrl(), holder.thumbnailView, DISPLAY_IMAGE_OPTIONS); } @Override @@ -171,6 +209,10 @@ public class SelectChannelFragment extends DialogFragment { } } + /*////////////////////////////////////////////////////////////////////////// + // Error + //////////////////////////////////////////////////////////////////////////*/ + protected boolean onError(Throwable e) { final Activity activity = getActivity(); ErrorActivity.reportError(activity, e, @@ -180,4 +222,17 @@ public class SelectChannelFragment extends DialogFragment { "none", "", R.string.app_ui_crash)); return true; } + + + /*////////////////////////////////////////////////////////////////////////// + // ImageLoaderOptions + //////////////////////////////////////////////////////////////////////////*/ + + /** + * Base display options + */ + public static final DisplayImageOptions DISPLAY_IMAGE_OPTIONS = + new DisplayImageOptions.Builder() + .cacheInMemory(true) + .build(); } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e16bfca16..b71bfa7db 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -268,11 +268,15 @@ Content of main page + Blank Page + Kiosk Page + Feed Page + Channel Page - Blank Page - Trending Page - Feed Page - Channel Page + @string/blank_page_summary + @string/kiosk_page_summary + @string/feed_page_summary + @string/channel_page_summary Select a channel No channel subscribed yet From 46fa9a9366cf74e6381384f794027ee6c1034a54 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Thu, 28 Sep 2017 16:15:09 +0200 Subject: [PATCH 07/23] translate kiosk name using resources fix CDATA fuu --- .../newpipe/fragments/MainFragment.java | 24 +++++++++++- .../list/channel/ChannelFragment.java | 6 ++- .../fragments/list/feed/FeedFragment.java | 2 +- .../fragments/list/kiosk/KioskFragment.java | 5 ++- .../subscription/SubscriptionFragment.java | 2 + .../settings/ContentSettingsFragment.java | 2 + .../schabi/newpipe/util/KioskTranslator.java | 38 +++++++++++++++++++ app/src/main/res/menu/main_menu.xml | 2 +- app/src/main/res/values/settings_keys.xml | 2 + app/src/main/res/values/strings.xml | 7 ++++ 10 files changed, 82 insertions(+), 8 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/util/KioskTranslator.java diff --git a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java index aa28c54fb..c6d3f07f9 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java @@ -126,10 +126,18 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte @Override public Fragment getItem(int position) { switch (position) { + case 0: + if(PreferenceManager.getDefaultSharedPreferences(getActivity()) + .getString(getString(R.string.main_page_content_key), getString(R.string.blank_page_key)) + .equals(getString(R.string.subscription_page_key))) { + return new SubscriptionFragment(); + } else { + return getMainPageFramgent(); + } case 1: return new SubscriptionFragment(); default: - return getMainPageFramgent(); + return new BlankFragment(); } } @@ -140,7 +148,13 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte @Override public int getCount() { - return this.tabTitles.length; + if(PreferenceManager.getDefaultSharedPreferences(getActivity()) + .getString(getString(R.string.main_page_content_key), getString(R.string.blank_page_key)) + .equals(getString(R.string.subscription_page_key))) { + return 1; + } else { + return 2; + } } } @@ -186,4 +200,10 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte return new BlankFragment(); } } + + /*////////////////////////////////////////////////////////////////////////// + // Main page content + //////////////////////////////////////////////////////////////////////////*/ + + } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java index 5a722ec4c..daa1b62ed 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelFragment.java @@ -89,7 +89,8 @@ public class ChannelFragment extends BaseListInfoFragment { @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - return inflater.inflate(R.layout.fragment_channel, container, false); + View v = inflater.inflate(R.layout.fragment_channel, container, false); + return v; } @Override @@ -110,6 +111,7 @@ public class ChannelFragment extends BaseListInfoFragment { headerTitleView = headerRootLayout.findViewById(R.id.channel_title_view); headerSubscribersTextView = headerRootLayout.findViewById(R.id.channel_subscriber_view); headerSubscribeButton = headerRootLayout.findViewById(R.id.channel_subscribe_button); + return headerRootLayout; } @@ -123,7 +125,7 @@ public class ChannelFragment extends BaseListInfoFragment { ActionBar supportActionBar = activity.getSupportActionBar(); if(useAsFrontPage) { supportActionBar.setDisplayHomeAsUpEnabled(false); - supportActionBar.setDisplayShowTitleEnabled(false); + //supportActionBar.setDisplayShowTitleEnabled(false); } else { inflater.inflate(R.menu.menu_channel, menu); diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/feed/FeedFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/feed/FeedFragment.java index 1a8f8e625..379ec591a 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/feed/FeedFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/feed/FeedFragment.java @@ -122,7 +122,7 @@ public class FeedFragment extends BaseListFragment, Voi if(useAsFrontPage) { supportActionBar.setDisplayHomeAsUpEnabled(false); - supportActionBar.setDisplayShowTitleEnabled(false); + //supportActionBar.setDisplayShowTitleEnabled(false); } } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java index 3d019e6cb..451ade674 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java @@ -24,6 +24,7 @@ import org.schabi.newpipe.fragments.list.BaseListInfoFragment; import org.schabi.newpipe.info_list.InfoItemBuilder; import org.schabi.newpipe.report.UserAction; import org.schabi.newpipe.util.ExtractorHelper; +import org.schabi.newpipe.util.KioskTranslator; import org.schabi.newpipe.util.NavigationHelper; import io.reactivex.Single; @@ -90,7 +91,7 @@ public class KioskFragment extends BaseListInfoFragment { super.onCreateOptionsMenu(menu, inflater); ActionBar supportActionBar = activity.getSupportActionBar(); if (supportActionBar != null && useAsFrontPage) { - supportActionBar.setDisplayShowTitleEnabled(false); + //supportActionBar.setDisplayShowTitleEnabled(false); supportActionBar.setDisplayHomeAsUpEnabled(false); } } @@ -140,7 +141,7 @@ public class KioskFragment extends BaseListInfoFragment { super.handleResult(result); animateView(headerRootLayout, true, 100); - headerTitleView.setText("★★ " +result.name+ " ★★"); + headerTitleView.setText("★★ " + KioskTranslator.getTranslatedKioskName(result.id, getActivity())+ " ★★"); if (!result.errors.isEmpty()) { showSnackBarError(result.errors, diff --git a/app/src/main/java/org/schabi/newpipe/fragments/subscription/SubscriptionFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/subscription/SubscriptionFragment.java index 646fe597e..afb2f078e 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/subscription/SubscriptionFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/subscription/SubscriptionFragment.java @@ -62,6 +62,8 @@ public class SubscriptionFragment extends BaseStateFragment. + */ + +public class KioskTranslator { + public static String getTranslatedKioskName(String kioskId, Context c) { + switch(kioskId) { + case "Trending": + return c.getString(R.string.trending); + case "Top 50": + return c.getString(R.string.top_50); + case "New & hot": + return c.getString(R.string.new_and_hot); + default: + return kioskId; + } + } +} diff --git a/app/src/main/res/menu/main_menu.xml b/app/src/main/res/menu/main_menu.xml index be3548532..02402e2e8 100644 --- a/app/src/main/res/menu/main_menu.xml +++ b/app/src/main/res/menu/main_menu.xml @@ -20,6 +20,6 @@ + android:title="@string/action_about"/> \ No newline at end of file diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index 878d51741..dabbfb40d 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -105,12 +105,14 @@ main_page_content blank_page feed_page + subscription_page_key kiosk_page channel_page @string/blank_page_key @string/kiosk_page_key @string/feed_page_key + @string/subscription_page_key @string/channel_page_key main_page_selected_service diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b71bfa7db..bd8bdc048 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -270,14 +270,21 @@ Content of main page Blank Page Kiosk Page + Subscription Page Feed Page Channel Page @string/blank_page_summary @string/kiosk_page_summary @string/feed_page_summary + @string/subscription_page_summary @string/channel_page_summary Select a channel No channel subscribed yet + + + Trending + Top 50 + New & hot From 6d8a361c9af75938ed6480f30c6fd3265aa538bb Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Thu, 5 Oct 2017 14:57:19 +0200 Subject: [PATCH 08/23] add menu to select kiosk of current service --- .../newpipe/fragments/MainFragment.java | 50 ++++++++++++++++++- .../fragments/list/kiosk/KioskFragment.java | 16 ++++-- .../schabi/newpipe/util/NavigationHelper.java | 10 ++++ app/src/main/res/values/strings.xml | 1 + 4 files changed, 70 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java index c6d3f07f9..4ba648402 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java @@ -15,17 +15,22 @@ import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; +import android.view.SubMenu; import android.view.View; import android.view.ViewGroup; import org.schabi.newpipe.BaseFragment; import org.schabi.newpipe.R; +import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.StreamingService; +import org.schabi.newpipe.extractor.kiosk.KioskList; import org.schabi.newpipe.fragments.list.channel.ChannelFragment; import org.schabi.newpipe.fragments.list.feed.FeedFragment; import org.schabi.newpipe.fragments.list.kiosk.KioskFragment; import org.schabi.newpipe.fragments.subscription.SubscriptionFragment; import org.schabi.newpipe.report.ErrorActivity; import org.schabi.newpipe.report.UserAction; +import org.schabi.newpipe.util.KioskTranslator; import org.schabi.newpipe.util.NavigationHelper; import java.util.concurrent.ExecutionException; @@ -36,6 +41,12 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte public int currentServiceId = -1; + /*////////////////////////////////////////////////////////////////////////// + // Konst + //////////////////////////////////////////////////////////////////////////*/ + + private static final int KIOSK_MENU_OFFSETT = 2000; + /*////////////////////////////////////////////////////////////////////////// // Fragment's LifeCycle //////////////////////////////////////////////////////////////////////////*/ @@ -77,6 +88,16 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte super.onCreateOptionsMenu(menu, inflater); if (DEBUG) Log.d(TAG, "onCreateOptionsMenu() called with: menu = [" + menu + "], inflater = [" + inflater + "]"); inflater.inflate(R.menu.main_fragment_menu, menu); + SubMenu kioskMenu = menu.addSubMenu(getString(R.string.kiosk)); + try { + createKioskMenu(kioskMenu, inflater); + } catch (Exception e) { + ErrorActivity.reportError(activity, e, + activity.getClass(), + null, + ErrorActivity.ErrorInfo.make(UserAction.UI_ERROR, + "none", "", R.string.app_ui_crash)); + } ActionBar supportActionBar = activity.getSupportActionBar(); if (supportActionBar != null) { @@ -202,8 +223,33 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte } /*////////////////////////////////////////////////////////////////////////// - // Main page content + // Select Kiosk //////////////////////////////////////////////////////////////////////////*/ - + private void createKioskMenu(Menu menu, MenuInflater menuInflater) + throws Exception { + StreamingService service = NewPipe.getService(currentServiceId); + KioskList kl = service.getKioskList(); + int i = 0; + for(final String ks : kl.getAvailableKisoks()) { + menu.add(0, KIOSK_MENU_OFFSETT + i, Menu.NONE, + KioskTranslator.getTranslatedKioskName(ks, getContext())) + .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem menuItem) { + try { + NavigationHelper.openKioskFragment(getFragmentManager(), currentServiceId, ks); + } catch (Exception e) { + ErrorActivity.reportError(activity, e, + activity.getClass(), + null, + ErrorActivity.ErrorInfo.make(UserAction.UI_ERROR, + "none", "", R.string.app_ui_crash)); + } + return true; + } + }); + i++; + } + } } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java index 451ade674..8e1acb572 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java @@ -62,14 +62,20 @@ public class KioskFragment extends BaseListInfoFragment { public static KioskFragment getInstance(int serviceId) throws ExtractionException { + return getInstance(serviceId, NewPipe.getService(serviceId) + .getKioskList() + .getDefaultKioskId()); + } + + public static KioskFragment getInstance(int serviceId, String kioskId) + throws ExtractionException { KioskFragment instance = new KioskFragment(); StreamingService service = NewPipe.getService(serviceId); - String defaultKioskId = service.getKioskList().getDefaultKioskId(); - UrlIdHandler defaultKioskTypeUrlIdHandler = service.getKioskList() - .getUrlIdHandlerByType(defaultKioskId); + UrlIdHandler kioskTypeUrlIdHandler = service.getKioskList() + .getUrlIdHandlerByType(kioskId); instance.setInitialData(serviceId, - defaultKioskTypeUrlIdHandler.getUrl(defaultKioskId), - defaultKioskId); + kioskTypeUrlIdHandler.getUrl(kioskId), + kioskId); return instance; } diff --git a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java index 538675685..b30407315 100644 --- a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java @@ -23,6 +23,7 @@ import org.schabi.newpipe.fragments.MainFragment; import org.schabi.newpipe.fragments.detail.VideoDetailFragment; import org.schabi.newpipe.fragments.list.channel.ChannelFragment; import org.schabi.newpipe.fragments.list.feed.FeedFragment; +import org.schabi.newpipe.fragments.list.kiosk.KioskFragment; import org.schabi.newpipe.fragments.list.playlist.PlaylistFragment; import org.schabi.newpipe.fragments.list.search.SearchFragment; import org.schabi.newpipe.history.HistoryActivity; @@ -163,6 +164,15 @@ public class NavigationHelper { .commit(); } + public static void openKioskFragment(FragmentManager fragmentManager, int serviceId, String kioskId) + throws ExtractionException { + fragmentManager.beginTransaction() + .setCustomAnimations(R.animator.custom_fade_in, R.animator.custom_fade_out, R.animator.custom_fade_in, R.animator.custom_fade_out) + .replace(R.id.fragment_holder, KioskFragment.getInstance(serviceId, kioskId)) + .addToBackStack(null) + .commit(); + } + /*////////////////////////////////////////////////////////////////////////// // Through Intents //////////////////////////////////////////////////////////////////////////*/ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bd8bdc048..e11483ac0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -284,6 +284,7 @@ No channel subscribed yet + Kisok Trending Top 50 New & hot From cbfc359a99c18e37b45c86c98fbeadba20fdb821 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Mon, 9 Oct 2017 12:22:01 +0200 Subject: [PATCH 09/23] add service icons --- app/src/main/res/drawable-nodpi/soud_cloud.png | Bin 0 -> 12259 bytes app/src/main/res/drawable-nodpi/youtube.png | Bin 0 -> 6182 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 app/src/main/res/drawable-nodpi/soud_cloud.png create mode 100644 app/src/main/res/drawable-nodpi/youtube.png diff --git a/app/src/main/res/drawable-nodpi/soud_cloud.png b/app/src/main/res/drawable-nodpi/soud_cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..0fa6045d5e89b438b5b2b15eb61a44bd878797ad GIT binary patch literal 12259 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 Date: Mon, 9 Oct 2017 14:22:27 +0200 Subject: [PATCH 10/23] add selector for kiosk --- .../settings/ContentSettingsFragment.java | 85 ++++++-- .../newpipe/settings/SelectKioskFragment.java | 185 ++++++++++++++++++ .../newpipe/util/ServiceIconMapper.java | 35 ++++ app/src/main/res/drawable-nodpi/service.png | Bin 0 -> 5765 bytes .../main/res/layout/select_kiosk_fragment.xml | 26 +++ app/src/main/res/layout/select_kiosk_item.xml | 37 ++++ app/src/main/res/values/strings.xml | 1 + assets/service.svg | 109 +++++++++++ 8 files changed, 466 insertions(+), 12 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java create mode 100644 app/src/main/java/org/schabi/newpipe/util/ServiceIconMapper.java create mode 100644 app/src/main/res/drawable-nodpi/service.png create mode 100644 app/src/main/res/layout/select_kiosk_fragment.xml create mode 100644 app/src/main/res/layout/select_kiosk_item.xml create mode 100644 assets/service.svg diff --git a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java index 4c0c7aec3..381c20ff1 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java @@ -1,10 +1,17 @@ package org.schabi.newpipe.settings; +import android.app.Activity; import android.os.Bundle; import android.support.v7.preference.ListPreference; import android.support.v7.preference.Preference; import org.schabi.newpipe.R; +import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.StreamingService; +import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.report.ErrorActivity; +import org.schabi.newpipe.report.UserAction; +import org.schabi.newpipe.util.KioskTranslator; public class ContentSettingsFragment extends BasePreferenceFragment { @@ -14,7 +21,6 @@ public class ContentSettingsFragment extends BasePreferenceFragment { addPreferencesFromResource(R.xml.content_settings); final ListPreference mainPageContentPref = (ListPreference) findPreference(getString(R.string.main_page_content_key)); - mainPageContentPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValueO) { @@ -25,7 +31,36 @@ public class ContentSettingsFragment extends BasePreferenceFragment { final String mainPrefOldSummary = getMainPagePrefSummery(mainPrefOldValue, mainPageContentPref); if(newValue.equals(getString(R.string.kiosk_page_key))) { - //todo on multyservice support show a kiosk an service selector here + SelectKioskFragment selectKioskFragment = new SelectKioskFragment(); + selectKioskFragment.setOnSelectedLisener(new SelectKioskFragment.OnSelectedLisener() { + @Override + public void onKioskSelected(String kioskId, int service_id) { + defaultPreferences.edit() + .putInt(getString(R.string.main_page_selected_service), service_id).apply(); + defaultPreferences.edit() + .putString(getString(R.string.main_page_selectd_kiosk_id), kioskId).apply(); + String summary = ""; + try { + summary += NewPipe.getService(service_id).getServiceInfo().name; + } catch (ExtractionException e) { + onError(e); + } + summary += "/"; + summary += KioskTranslator.getTranslatedKioskName(kioskId, getContext()); + + + + mainPageContentPref.setSummary(summary); + } + }); + selectKioskFragment.setOnCancelListener(new SelectKioskFragment.OnCancelListener() { + @Override + public void onCancel() { + mainPageContentPref.setSummary(mainPrefOldSummary); + mainPageContentPref.setValue(mainPrefOldValue); + } + }); + selectKioskFragment.show(getFragmentManager(), "select_kiosk"); } else if(newValue.equals(getString(R.string.channel_page_key))) { SelectChannelFragment selectChannelFragment = new SelectChannelFragment(); selectChannelFragment.setOnSelectedLisener(new SelectChannelFragment.OnSelectedLisener() { @@ -38,23 +73,18 @@ public class ContentSettingsFragment extends BasePreferenceFragment { defaultPreferences.edit() .putString(getString(R.string.main_page_selected_channel_name), name).apply(); - //change summery mainPageContentPref.setSummary(name); } }); selectChannelFragment.setOnCancelListener(new SelectChannelFragment.OnCancelListener() { @Override public void onCancel() { - //defaultPreferences.edit() - // .putString(getString(R.string.main_page_content_key), mainPrefOldValue).apply(); mainPageContentPref.setSummary(mainPrefOldSummary); mainPageContentPref.setValue(mainPrefOldValue); } }); selectChannelFragment.show(getFragmentManager(), "select_channel"); - } - - if(!newValue.equals(getString(R.string.channel_page_key))) { + } else { mainPageContentPref.setSummary(getMainPageSummeryByKey(newValue)); } @@ -68,11 +98,28 @@ public class ContentSettingsFragment extends BasePreferenceFragment { super.onResume(); final String mainPageContentKey = getString(R.string.main_page_content_key); - if(defaultPreferences.getString(mainPageContentKey, - getString(R.string.blank_page_key)) + final Preference mainPagePref = findPreference(getString(R.string.main_page_content_key)); + final String bpk = getString(R.string.blank_page_key); + if(defaultPreferences.getString(mainPageContentKey, bpk) .equals(getString(R.string.channel_page_key))) { - Preference pref = findPreference(getString(R.string.main_page_content_key)); - pref.setSummary(defaultPreferences.getString(getString(R.string.main_page_selected_channel_name), "error")); + mainPagePref.setSummary(defaultPreferences.getString(getString(R.string.main_page_selected_channel_name), "error")); + } else if(defaultPreferences.getString(mainPageContentKey, bpk) + .equals(getString(R.string.kiosk_page_key))) { + try { + StreamingService service = NewPipe.getService( + defaultPreferences.getInt( + getString(R.string.main_page_selected_service), 0)); + String summary = ""; + summary += service.getServiceInfo().name; + summary += "/"; + summary += KioskTranslator.getTranslatedKioskName( + defaultPreferences.getString( + getString(R.string.main_page_selectd_kiosk_id), "Trending"), + getContext()); + mainPagePref.setSummary(summary); + } catch (Exception e) { + onError(e); + } } } @@ -101,4 +148,18 @@ public class ContentSettingsFragment extends BasePreferenceFragment { } return R.string.blank_page_summary; } + + /*////////////////////////////////////////////////////////////////////////// + // Error + //////////////////////////////////////////////////////////////////////////*/ + + protected boolean 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; + } } diff --git a/app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java b/app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java new file mode 100644 index 000000000..6e7ba191e --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java @@ -0,0 +1,185 @@ +package org.schabi.newpipe.settings; + +import android.app.Activity; +import android.content.DialogInterface; +import android.os.Bundle; +import android.support.v4.app.DialogFragment; +import android.support.v4.content.ContextCompat; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.database.subscription.SubscriptionEntity; +import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.StreamingService; +import org.schabi.newpipe.fragments.subscription.SubscriptionService; +import org.schabi.newpipe.report.ErrorActivity; +import org.schabi.newpipe.report.UserAction; +import org.schabi.newpipe.util.KioskTranslator; +import org.schabi.newpipe.util.ServiceIconMapper; + +import java.util.List; +import java.util.Vector; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +/** + * Created by Christian Schabesberger on 09.10.17. + * SelectKioskFragment.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 . + */ + +public class SelectKioskFragment extends DialogFragment { + + RecyclerView recyclerView = null; + SelectKioskAdapter selectKioskAdapter = null; + + /*////////////////////////////////////////////////////////////////////////// + // Interfaces + //////////////////////////////////////////////////////////////////////////*/ + + public interface OnSelectedLisener { + void onKioskSelected(String kioskId, int service_id); + } + + OnSelectedLisener onSelectedLisener = null; + public void setOnSelectedLisener(OnSelectedLisener listener) { + onSelectedLisener = listener; + } + + public interface OnCancelListener { + void onCancel(); + } + OnCancelListener onCancelListener = null; + public void setOnCancelListener(OnCancelListener listener) { + onCancelListener = listener; + } + + @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.setLayoutManager(new LinearLayoutManager(getContext())); + try { + selectKioskAdapter = new SelectKioskAdapter(); + } catch (Exception e) { + onError(e); + } + recyclerView.setAdapter(selectKioskAdapter); + + return v; + } + + /*////////////////////////////////////////////////////////////////////////// + // Handle actions + //////////////////////////////////////////////////////////////////////////*/ + + @Override + public void onCancel(final DialogInterface dialogInterface) { + super.onCancel(dialogInterface); + if(onCancelListener != null) { + onCancelListener.onCancel(); + } + } + + private void clickedItem(SelectKioskAdapter.Entry entry) { + if(onSelectedLisener != null) { + onSelectedLisener.onKioskSelected(entry.kioskId, entry.serviceId); + } + dismiss(); + } + + private class SelectKioskAdapter + extends RecyclerView.Adapter { + public class Entry { + 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; + }; + + private List kioskList = new Vector<>(); + + public SelectKioskAdapter() + throws Exception { + for(StreamingService service : NewPipe.getServices()) { + for(String kioskId : service.getKioskList().getAvailableKisoks()) { + kioskList.add(new Entry( + ServiceIconMapper.getIconResource(service.getServiceId()), + service.getServiceId(), + kioskId, + KioskTranslator.getTranslatedKioskName(kioskId, getContext()))); + } + } + } + + public int getItemCount() { + return kioskList.size(); + } + + public SelectKioskItemHolder onCreateViewHolder(ViewGroup parent, int type) { + View item = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.select_kiosk_item, parent, false); + return new SelectKioskItemHolder(item); + } + + public class SelectKioskItemHolder extends RecyclerView.ViewHolder { + public SelectKioskItemHolder(View v) { + super(v); + this.view = v; + thumbnailView = v.findViewById(R.id.itemThumbnailView); + titleView = v.findViewById(R.id.itemTitleView); + } + public View view; + public ImageView thumbnailView; + public TextView titleView; + } + + public void onBindViewHolder(SelectKioskItemHolder holder, final int position) { + final Entry entry = kioskList.get(position); + holder.titleView.setText(entry.kioskName); + holder.thumbnailView.setImageDrawable(ContextCompat.getDrawable(getContext(), entry.icon)); + holder.view.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + clickedItem(entry); + } + }); + } + } + + /*////////////////////////////////////////////////////////////////////////// + // Error + //////////////////////////////////////////////////////////////////////////*/ + + protected boolean 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; + } +} diff --git a/app/src/main/java/org/schabi/newpipe/util/ServiceIconMapper.java b/app/src/main/java/org/schabi/newpipe/util/ServiceIconMapper.java new file mode 100644 index 000000000..060013dd2 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/ServiceIconMapper.java @@ -0,0 +1,35 @@ +package org.schabi.newpipe.util; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.extractor.NewPipe; + +/** + * Created by Chrsitian Schabesberger on 09.10.17. + * ServiceIconMapper.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 . + */ + +public class ServiceIconMapper { + public static int getIconResource(int service_id) { + switch(service_id) { + case 0: + return R.drawable.youtube; + case 1: + return R.drawable.soud_cloud; + default: + return R.drawable.service; + } + } +} diff --git a/app/src/main/res/drawable-nodpi/service.png b/app/src/main/res/drawable-nodpi/service.png new file mode 100644 index 0000000000000000000000000000000000000000..cfaff19e2df8b3954bae3630c1d68bd811a1e279 GIT binary patch literal 5765 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/select_kiosk_fragment.xml b/app/src/main/res/layout/select_kiosk_fragment.xml new file mode 100644 index 000000000..7be96754a --- /dev/null +++ b/app/src/main/res/layout/select_kiosk_fragment.xml @@ -0,0 +1,26 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/select_kiosk_item.xml b/app/src/main/res/layout/select_kiosk_item.xml new file mode 100644 index 000000000..818380849 --- /dev/null +++ b/app/src/main/res/layout/select_kiosk_item.xml @@ -0,0 +1,37 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e11483ac0..371ad1688 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -282,6 +282,7 @@ Select a channel No channel subscribed yet + Select a kiosk Kisok diff --git a/assets/service.svg b/assets/service.svg new file mode 100644 index 000000000..172cc106f --- /dev/null +++ b/assets/service.svg @@ -0,0 +1,109 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + From 7fcc07805a20d0eb350e3efd77b3ca18777243c1 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Mon, 9 Oct 2017 14:34:10 +0200 Subject: [PATCH 11/23] make kiosk selector signle service again --- .../org/schabi/newpipe/fragments/MainFragment.java | 12 +++++++----- .../schabi/newpipe/settings/SelectKioskFragment.java | 12 +++++++++--- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java index 4ba648402..48f2d150e 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java @@ -185,13 +185,17 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte private Fragment getMainPageFramgent() { try { - final String set_main_page = PreferenceManager.getDefaultSharedPreferences(getActivity()) - .getString(getString(R.string.main_page_content_key), + SharedPreferences preferences = + PreferenceManager.getDefaultSharedPreferences(getActivity()); + final String set_main_page = preferences.getString(getString(R.string.main_page_content_key), getString(R.string.main_page_selectd_kiosk_id)); if(set_main_page.equals(getString(R.string.blank_page_key))) { return new BlankFragment(); } else if(set_main_page.equals(getString(R.string.kiosk_page_key))) { - KioskFragment fragment = KioskFragment.getInstance(currentServiceId); + int serviceId = preferences.getInt(getString(R.string.main_page_selected_service), 0); + String kioskId = preferences.getString(getString(R.string.main_page_selectd_kiosk_id), "Trending"); + KioskFragment fragment = KioskFragment.getInstance(serviceId, kioskId + ); fragment.useAsFrontPage(true); return fragment; } else if(set_main_page.equals(getString(R.string.feed_page_key))) { @@ -199,8 +203,6 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte fragment.useAsFrontPage(true); return fragment; } else if(set_main_page.equals(getString(R.string.channel_page_key))) { - SharedPreferences preferences = - PreferenceManager.getDefaultSharedPreferences(getActivity()); int serviceId = preferences.getInt(getString(R.string.main_page_selected_service), 0); String url = preferences.getString(getString(R.string.main_page_selected_channel_url), "https://www.youtube.com/channel/UC-9-kyTW8ZkZNDHQJ6FgpwQ"); diff --git a/app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java b/app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java index 6e7ba191e..204b35905 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java @@ -117,25 +117,31 @@ public class SelectKioskFragment extends DialogFragment { int serviceId; String kioskId; String kioskName; - }; + } private List kioskList = new Vector<>(); public SelectKioskAdapter() throws Exception { + for(StreamingService service : NewPipe.getServices()) { for(String kioskId : service.getKioskList().getAvailableKisoks()) { + String name = service.getServiceInfo().name; + name += "/"; + name += KioskTranslator.getTranslatedKioskName(kioskId, getContext()); kioskList.add(new Entry( ServiceIconMapper.getIconResource(service.getServiceId()), service.getServiceId(), kioskId, - KioskTranslator.getTranslatedKioskName(kioskId, getContext()))); + name)); } } } public int getItemCount() { - return kioskList.size(); + //todo: uncommend this line on multyservice support + //return kioskList.size(); + return 1; } public SelectKioskItemHolder onCreateViewHolder(ViewGroup parent, int type) { From 0951f0f824fb55e4a2d4e28487ef1a9ddeb3dfae Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Wed, 11 Oct 2017 15:24:57 +0200 Subject: [PATCH 12/23] small fixes small fixes --- .../schabi/newpipe/fragments/list/kiosk/KioskFragment.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java index 8e1acb572..c308fe1ec 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java @@ -48,7 +48,7 @@ import static org.schabi.newpipe.util.AnimationUtils.animateView; * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with OpenHitboxStreams. If not, see . + * along with NewPipe. If not, see . */ public class KioskFragment extends BaseListInfoFragment { @@ -147,7 +147,10 @@ public class KioskFragment extends BaseListInfoFragment { super.handleResult(result); animateView(headerRootLayout, true, 100); - headerTitleView.setText("★★ " + KioskTranslator.getTranslatedKioskName(result.id, getActivity())+ " ★★"); + String title = KioskTranslator.getTranslatedKioskName(result.id, getActivity()); + headerTitleView.setText("★★ " + title + " ★★"); + ActionBar supportActionBar = activity.getSupportActionBar(); + supportActionBar.setTitle(title); if (!result.errors.isEmpty()) { showSnackBarError(result.errors, From 8e8d74b5b7bb0c3d00b3fbcacd20461ffdc96222 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Fri, 13 Oct 2017 13:01:16 +0200 Subject: [PATCH 13/23] remove header front kiosk --- .../fragments/list/kiosk/KioskFragment.java | 14 ----------- app/src/main/res/layout/kiosk_header.xml | 23 ------------------- 2 files changed, 37 deletions(-) delete mode 100644 app/src/main/res/layout/kiosk_header.xml diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java index c308fe1ec..b1387b1ad 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/kiosk/KioskFragment.java @@ -102,17 +102,6 @@ public class KioskFragment extends BaseListInfoFragment { } } - /*////////////////////////////////////////////////////////////////////////// - // Init - //////////////////////////////////////////////////////////////////////////*/ - - protected View getListHeader() { - headerRootLayout = activity.getLayoutInflater().inflate(R.layout.kiosk_header, itemsList, false); - headerTitleView = headerRootLayout.findViewById(R.id.kiosk_title_view); - - return headerRootLayout; - } - /*////////////////////////////////////////////////////////////////////////// // Load and handle //////////////////////////////////////////////////////////////////////////*/ @@ -138,7 +127,6 @@ public class KioskFragment extends BaseListInfoFragment { @Override public void showLoading() { super.showLoading(); - animateView(headerRootLayout, false, 200); animateView(itemsList, false, 100); } @@ -146,9 +134,7 @@ public class KioskFragment extends BaseListInfoFragment { public void handleResult(@NonNull final KioskInfo result) { super.handleResult(result); - animateView(headerRootLayout, true, 100); String title = KioskTranslator.getTranslatedKioskName(result.id, getActivity()); - headerTitleView.setText("★★ " + title + " ★★"); ActionBar supportActionBar = activity.getSupportActionBar(); supportActionBar.setTitle(title); diff --git a/app/src/main/res/layout/kiosk_header.xml b/app/src/main/res/layout/kiosk_header.xml deleted file mode 100644 index c161ca83d..000000000 --- a/app/src/main/res/layout/kiosk_header.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - \ No newline at end of file From 23eeb4353dc96504f1fa6a8fbc8a5e1b5256c757 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Fri, 13 Oct 2017 13:49:31 +0200 Subject: [PATCH 14/23] make main page changes display emediatly --- app/src/main/java/org/schabi/newpipe/MainActivity.java | 6 ++++++ .../java/org/schabi/newpipe/fragments/MainFragment.java | 1 + .../schabi/newpipe/settings/ContentSettingsFragment.java | 3 +++ app/src/main/java/org/schabi/newpipe/util/Constants.java | 1 + .../main/java/org/schabi/newpipe/util/NavigationHelper.java | 2 +- 5 files changed, 12 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/MainActivity.java b/app/src/main/java/org/schabi/newpipe/MainActivity.java index 67689d541..3ff55cb76 100644 --- a/app/src/main/java/org/schabi/newpipe/MainActivity.java +++ b/app/src/main/java/org/schabi/newpipe/MainActivity.java @@ -119,6 +119,12 @@ public class MainActivity extends AppCompatActivity implements HistoryListener { }); } + if(sharedPreferences.getBoolean(Constants.KEY_MAIN_PAGE_CHANGE, false)) { + if (DEBUG) Log.d(TAG, "main page has changed, recreating main fragment..."); + sharedPreferences.edit().putBoolean(Constants.KEY_MAIN_PAGE_CHANGE, false).apply(); + NavigationHelper.openMainActivity(this); + } + } @Override diff --git a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java index 48f2d150e..ba09f4001 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java @@ -30,6 +30,7 @@ import org.schabi.newpipe.fragments.list.kiosk.KioskFragment; import org.schabi.newpipe.fragments.subscription.SubscriptionFragment; import org.schabi.newpipe.report.ErrorActivity; import org.schabi.newpipe.report.UserAction; +import org.schabi.newpipe.util.Constants; import org.schabi.newpipe.util.KioskTranslator; import org.schabi.newpipe.util.NavigationHelper; diff --git a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java index 381c20ff1..aeba78cbd 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java @@ -11,6 +11,7 @@ import org.schabi.newpipe.extractor.StreamingService; import org.schabi.newpipe.extractor.exceptions.ExtractionException; import org.schabi.newpipe.report.ErrorActivity; import org.schabi.newpipe.report.UserAction; +import org.schabi.newpipe.util.Constants; import org.schabi.newpipe.util.KioskTranslator; public class ContentSettingsFragment extends BasePreferenceFragment { @@ -88,6 +89,8 @@ public class ContentSettingsFragment extends BasePreferenceFragment { mainPageContentPref.setSummary(getMainPageSummeryByKey(newValue)); } + defaultPreferences.edit().putBoolean(Constants.KEY_MAIN_PAGE_CHANGE, true).apply(); + return true; } }); diff --git a/app/src/main/java/org/schabi/newpipe/util/Constants.java b/app/src/main/java/org/schabi/newpipe/util/Constants.java index f9329b0be..08e64aceb 100644 --- a/app/src/main/java/org/schabi/newpipe/util/Constants.java +++ b/app/src/main/java/org/schabi/newpipe/util/Constants.java @@ -9,4 +9,5 @@ public class Constants { public static final String KEY_QUERY = "key_query"; public static final String KEY_THEME_CHANGE = "key_theme_change"; + public static final String KEY_MAIN_PAGE_CHANGE = "key_main_page_change"; } diff --git a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java index b30407315..b08251436 100644 --- a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java @@ -94,7 +94,7 @@ public class NavigationHelper { if (!popped) openMainFragment(fragmentManager); } - private static void openMainFragment(FragmentManager fragmentManager) { + public static void openMainFragment(FragmentManager fragmentManager) { InfoCache.getInstance().trimCache(); fragmentManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); From d928f5759fd358be5e48a309922a8c74b2eb604a Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Fri, 13 Oct 2017 13:55:55 +0200 Subject: [PATCH 15/23] try to fix margin / padding --- app/src/main/res/layout/select_channel_fragment.xml | 6 ++++-- app/src/main/res/layout/select_channel_item.xml | 2 -- app/src/main/res/layout/select_kiosk_fragment.xml | 3 ++- app/src/main/res/layout/select_kiosk_item.xml | 2 -- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/app/src/main/res/layout/select_channel_fragment.xml b/app/src/main/res/layout/select_channel_fragment.xml index 9c8e79779..11c723b4b 100644 --- a/app/src/main/res/layout/select_channel_fragment.xml +++ b/app/src/main/res/layout/select_channel_fragment.xml @@ -3,7 +3,8 @@ xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="match_parent" + android:padding="13dp"> + android:layout_marginEnd="5dp" + android:layout_marginBottom="10dp"/> + android:layout_height="match_parent" + android:padding="13dp"> Date: Sun, 22 Oct 2017 21:46:50 +0200 Subject: [PATCH 16/23] fix Kisok spelling error --- app/build.gradle | 2 +- .../main/java/org/schabi/newpipe/fragments/MainFragment.java | 2 +- .../java/org/schabi/newpipe/settings/SelectKioskFragment.java | 2 +- app/src/main/res/values/strings.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 2f1dd4005..529d04425 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -48,7 +48,7 @@ dependencies { exclude module: 'support-annotations' } - compile 'com.github.TeamNewPipe:NewPipeExtractor:1df3f67' + compile 'com.github.TeamNewPipe:NewPipeExtractor:7899cd1' testCompile 'junit:junit:4.12' testCompile 'org.mockito:mockito-core:1.10.19' diff --git a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java index ba09f4001..f26f9739e 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java @@ -234,7 +234,7 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte StreamingService service = NewPipe.getService(currentServiceId); KioskList kl = service.getKioskList(); int i = 0; - for(final String ks : kl.getAvailableKisoks()) { + for(final String ks : kl.getAvailableKiosks()) { menu.add(0, KIOSK_MENU_OFFSETT + i, Menu.NONE, KioskTranslator.getTranslatedKioskName(ks, getContext())) .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { diff --git a/app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java b/app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java index 204b35905..3f84f9006 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java @@ -125,7 +125,7 @@ public class SelectKioskFragment extends DialogFragment { throws Exception { for(StreamingService service : NewPipe.getServices()) { - for(String kioskId : service.getKioskList().getAvailableKisoks()) { + for(String kioskId : service.getKioskList().getAvailableKiosks()) { String name = service.getServiceInfo().name; name += "/"; name += KioskTranslator.getTranslatedKioskName(kioskId, getContext()); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e552177c5..035e94418 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -286,7 +286,7 @@ Select a kiosk - Kisok + Kiosk Trending Top 50 New & hot From d1f446aae241357b0294f5bf64829c2e27e6ed3c Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Sun, 22 Oct 2017 22:06:25 +0200 Subject: [PATCH 17/23] make summary a dynamic string --- .../settings/ContentSettingsFragment.java | 25 ++++++++++++------- app/src/main/res/values/strings.xml | 1 + 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java index aeba78cbd..4f6c2d1ae 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java @@ -40,16 +40,19 @@ public class ContentSettingsFragment extends BasePreferenceFragment { .putInt(getString(R.string.main_page_selected_service), service_id).apply(); defaultPreferences.edit() .putString(getString(R.string.main_page_selectd_kiosk_id), kioskId).apply(); - String summary = ""; + String serviceName = ""; try { - summary += NewPipe.getService(service_id).getServiceInfo().name; + serviceName = NewPipe.getService(service_id).getServiceInfo().name; } catch (ExtractionException e) { onError(e); } - summary += "/"; - summary += KioskTranslator.getTranslatedKioskName(kioskId, getContext()); - + String kioskName = KioskTranslator.getTranslatedKioskName(kioskId, + getContext()); + String summary = + String.format(getString(R.string.service_kosk_string), + serviceName, + kioskName); mainPageContentPref.setSummary(summary); } @@ -112,13 +115,17 @@ public class ContentSettingsFragment extends BasePreferenceFragment { StreamingService service = NewPipe.getService( defaultPreferences.getInt( getString(R.string.main_page_selected_service), 0)); - String summary = ""; - summary += service.getServiceInfo().name; - summary += "/"; - summary += KioskTranslator.getTranslatedKioskName( + + String kioskName = KioskTranslator.getTranslatedKioskName( defaultPreferences.getString( getString(R.string.main_page_selectd_kiosk_id), "Trending"), getContext()); + + String summary = + String.format(getString(R.string.service_kosk_string), + service.getServiceInfo().name, + kioskName); + mainPagePref.setSummary(summary); } catch (Exception e) { onError(e); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 035e94418..94b185988 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -290,4 +290,5 @@ Trending Top 50 New & hot + %1$s/%2$s From fd899a2e9505211d301492e5a2e542a940292bd0 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Sun, 22 Oct 2017 22:10:48 +0200 Subject: [PATCH 18/23] fix cammel case --- .../org/schabi/newpipe/fragments/MainFragment.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java index f26f9739e..a1dd34467 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java @@ -188,22 +188,22 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte try { SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); - final String set_main_page = preferences.getString(getString(R.string.main_page_content_key), + final String setMainPage = preferences.getString(getString(R.string.main_page_content_key), getString(R.string.main_page_selectd_kiosk_id)); - if(set_main_page.equals(getString(R.string.blank_page_key))) { + if(setMainPage.equals(getString(R.string.blank_page_key))) { return new BlankFragment(); - } else if(set_main_page.equals(getString(R.string.kiosk_page_key))) { + } else if(setMainPage.equals(getString(R.string.kiosk_page_key))) { int serviceId = preferences.getInt(getString(R.string.main_page_selected_service), 0); String kioskId = preferences.getString(getString(R.string.main_page_selectd_kiosk_id), "Trending"); KioskFragment fragment = KioskFragment.getInstance(serviceId, kioskId ); fragment.useAsFrontPage(true); return fragment; - } else if(set_main_page.equals(getString(R.string.feed_page_key))) { + } else if(setMainPage.equals(getString(R.string.feed_page_key))) { FeedFragment fragment = new FeedFragment(); fragment.useAsFrontPage(true); return fragment; - } else if(set_main_page.equals(getString(R.string.channel_page_key))) { + } else if(setMainPage.equals(getString(R.string.channel_page_key))) { int serviceId = preferences.getInt(getString(R.string.main_page_selected_service), 0); String url = preferences.getString(getString(R.string.main_page_selected_channel_url), "https://www.youtube.com/channel/UC-9-kyTW8ZkZNDHQJ6FgpwQ"); From 54cdfc0c1650750d5a6c2b98cf4a6b6847903d02 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Sun, 22 Oct 2017 22:53:27 +0200 Subject: [PATCH 19/23] deactivate icon --- .../org/schabi/newpipe/settings/SelectKioskFragment.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java b/app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java index 3f84f9006..0a8f3bfdc 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java @@ -126,11 +126,12 @@ public class SelectKioskFragment extends DialogFragment { for(StreamingService service : NewPipe.getServices()) { for(String kioskId : service.getKioskList().getAvailableKiosks()) { - String name = service.getServiceInfo().name; - name += "/"; - name += KioskTranslator.getTranslatedKioskName(kioskId, getContext()); + String name = String.format(getString(R.string.service_kosk_string), + service.getServiceInfo().name, + KioskTranslator.getTranslatedKioskName(kioskId, getContext())); kioskList.add(new Entry( - ServiceIconMapper.getIconResource(service.getServiceId()), + //ServiceIconMapper.getIconResource(service.getServiceId()), + 0, service.getServiceId(), kioskId, name)); From ccd26b4146de9d32b622f8577dd28c08db3973e0 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Sun, 22 Oct 2017 23:56:39 +0200 Subject: [PATCH 20/23] fix kiosk service/icon --- .../java/org/schabi/newpipe/settings/SelectKioskFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java b/app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java index 0a8f3bfdc..a9f0a53ed 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java @@ -131,7 +131,7 @@ public class SelectKioskFragment extends DialogFragment { KioskTranslator.getTranslatedKioskName(kioskId, getContext())); kioskList.add(new Entry( //ServiceIconMapper.getIconResource(service.getServiceId()), - 0, + ServiceIconMapper.getIconResource(-1), service.getServiceId(), kioskId, name)); From 7d296ee65056d783253e5b26808da01d29a97588 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Mon, 23 Oct 2017 00:26:20 +0200 Subject: [PATCH 21/23] remove hardcoded strings form MainFragment --- .../newpipe/fragments/MainFragment.java | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java index a1dd34467..317630faa 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java @@ -40,6 +40,12 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte private ViewPager viewPager; private boolean showBlankTab = false; + private static final int FALLBACK_SERVICE_ID = 0; // Youtbe + private static final String FALLBACK_CHANNEL_URL = + "https://www.youtube.com/channel/UC-9-kyTW8ZkZNDHQJ6FgpwQ"; + private static final String FALLBACK_CHANNEL_NAME = "Music"; + private static final String FALLBACK_KIOSK_ID = "Trending"; + public int currentServiceId = -1; /*////////////////////////////////////////////////////////////////////////// @@ -193,8 +199,10 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte if(setMainPage.equals(getString(R.string.blank_page_key))) { return new BlankFragment(); } else if(setMainPage.equals(getString(R.string.kiosk_page_key))) { - int serviceId = preferences.getInt(getString(R.string.main_page_selected_service), 0); - String kioskId = preferences.getString(getString(R.string.main_page_selectd_kiosk_id), "Trending"); + int serviceId = preferences.getInt(getString(R.string.main_page_selected_service), + FALLBACK_SERVICE_ID); + String kioskId = preferences.getString(getString(R.string.main_page_selectd_kiosk_id), + FALLBACK_KIOSK_ID); KioskFragment fragment = KioskFragment.getInstance(serviceId, kioskId ); fragment.useAsFrontPage(true); @@ -204,10 +212,12 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte fragment.useAsFrontPage(true); return fragment; } else if(setMainPage.equals(getString(R.string.channel_page_key))) { - int serviceId = preferences.getInt(getString(R.string.main_page_selected_service), 0); + int serviceId = preferences.getInt(getString(R.string.main_page_selected_service), + FALLBACK_SERVICE_ID); String url = preferences.getString(getString(R.string.main_page_selected_channel_url), - "https://www.youtube.com/channel/UC-9-kyTW8ZkZNDHQJ6FgpwQ"); - String name = preferences.getString(getString(R.string.main_page_selected_channel_name), "Music"); + FALLBACK_CHANNEL_URL); + String name = preferences.getString(getString(R.string.main_page_selected_channel_name), + FALLBACK_CHANNEL_NAME); ChannelFragment fragment = ChannelFragment.getInstance(serviceId, url, name); fragment.useAsFrontPage(true); return fragment; From 2756db66013c3ad7db8829e42cdea43be66e365b Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Mon, 23 Oct 2017 14:59:30 +0200 Subject: [PATCH 22/23] downgrade gralde wrapper to 4.2 --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 74bb77845..52dd1f044 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.2.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.2-bin.zip From 3ac3cedc19a81393ad3d431ce96940910c9345db Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Mon, 23 Oct 2017 15:16:34 +0200 Subject: [PATCH 23/23] add fdroid build server node to contribution.md --- .github/CONTRIBUTING.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index a003040c8..4a3cc8254 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -34,6 +34,8 @@ Do not report crashes in the GitHub issue tracker. NewPipe has an automated cras * Make sure your PR is up-to-date with the rest of the code. Often, a simple click on "Update branch" will do the job, but if not, you are asked to merge the master branch manually and resolve the problems on your own. That will make the maintainers' jobs way easier. * Please show intention to maintain your features and code after you contributed it. Unmaintained code is a hassle for the core developers, and just adds work. If you do not intend to maintain features you contributed, please think again about sumission, or clearly state that in the description of your PR. * Respond yourselves if someone requests changes or otherwise raises issues about your PRs. +* Check if your contributions align with the [fdroid inclusion guidelines](https://f-droid.org/en/docs/Inclusion_Policy/). +* Check if your submission can be build with the current fdroid build server setup. ## Communication