-Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
-
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
diff --git a/app/src/main/assets/mpl2.html b/app/src/main/assets/mpl2.html
index 5009391a0..5e988a70c 100644
--- a/app/src/main/assets/mpl2.html
+++ b/app/src/main/assets/mpl2.html
@@ -4,6 +4,7 @@
Mozilla Public License, version 2.0
+
Mozilla Public License Version 2.0
1. Definitions
diff --git a/app/src/main/java/org/schabi/newpipe/about/License.java b/app/src/main/java/org/schabi/newpipe/about/License.java
index 312ad5087..e51e1d0f1 100644
--- a/app/src/main/java/org/schabi/newpipe/about/License.java
+++ b/app/src/main/java/org/schabi/newpipe/about/License.java
@@ -50,6 +50,10 @@ public class License implements Parcelable {
public String getAbbreviation() {
return abbreviation;
}
+
+ public String getFilename() {
+ return filename;
+ }
@Override
public int describeContents() {
diff --git a/app/src/main/java/org/schabi/newpipe/about/LicenseFragment.java b/app/src/main/java/org/schabi/newpipe/about/LicenseFragment.java
index 8b0e67d18..42e886d30 100644
--- a/app/src/main/java/org/schabi/newpipe/about/LicenseFragment.java
+++ b/app/src/main/java/org/schabi/newpipe/about/LicenseFragment.java
@@ -8,17 +8,15 @@ import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.app.AlertDialog;
-import android.view.ContextMenu;
-import android.view.LayoutInflater;
-import android.view.MenuInflater;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
+import android.view.*;
import android.webkit.WebView;
import android.widget.TextView;
import org.schabi.newpipe.R;
+import org.schabi.newpipe.util.ThemeHelper;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
@@ -58,7 +56,26 @@ public class LicenseFragment extends Fragment {
alert.setTitle(license.getName());
WebView wv = new WebView(context);
- wv.loadUrl(license.getContentUri().toString());
+ String licenseContent = "";
+ String webViewData;
+ try {
+ BufferedReader in = new BufferedReader(new InputStreamReader(context.getAssets().open(license.getFilename()), "UTF-8"));
+ String str;
+ while ((str = in.readLine()) != null) {
+ licenseContent += str;
+ }
+ in.close();
+
+ // split the HTML file and insert the stylesheet into the HEAD of the file
+ String[] insert = licenseContent.split("");
+ webViewData = insert[0] + ""
+ + insert[1];
+ } catch (Exception e) {
+ throw new NullPointerException("could not get license file:" + getLicenseStylesheet(context));
+ }
+ wv.loadData(webViewData, "text/html", "utf-8");
+
alert.setView(wv);
alert.setNegativeButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
@@ -69,6 +86,32 @@ public class LicenseFragment extends Fragment {
alert.show();
}
+ public static String getLicenseStylesheet(Context context) {
+ return "body{padding:12px 15px;margin:0;background:#"
+ + getHexRGBColor(context,(ThemeHelper.isLightThemeSelected(context))
+ ? R.color.light_license_background_color
+ : R.color.dark_license_background_color)
+ + ";color:#"
+ + getHexRGBColor(context,(ThemeHelper.isLightThemeSelected(context))
+ ? R.color.light_license_text_color
+ : R.color.dark_license_text_color) + ";}"
+ + "a[href]{color:#"
+ + getHexRGBColor(context,(ThemeHelper.isLightThemeSelected(context))
+ ? R.color.light_youtube_primary_color
+ : R.color.dark_youtube_primary_color) + ";}"
+ + "pre{white-space: pre-wrap;}";
+ }
+
+ /**
+ * Cast R.color to a hexadecimal color value
+ * @param context the context to use
+ * @param color the color number from R.color
+ * @return a six characters long String with hexadecimal RGB values
+ */
+ public static String getHexRGBColor(Context context, int color) {
+ return context.getResources().getString(color).substring(3);
+ }
+
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 9f8a41bc5..3008f68ee 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -10,6 +10,8 @@
#48868686#1fa6a6a6#5a000000
+ #ffffff
+ #212121#222222
@@ -20,6 +22,8 @@
#48ffffff#1f717171#82000000
+ #424242
+ #ffffff#000
@@ -37,8 +41,8 @@
#e53935#fff
- #d6d6d6d
- #717171d
+ #d6d6d6
+ #717171#607D8B
From 0d2296917a791d26845ffdd7c4040480c867a901 Mon Sep 17 00:00:00 2001
From: Christian Schabesberger
Date: Sat, 23 Sep 2017 17:39:04 +0200
Subject: [PATCH 002/154] 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 @@
24dp28dp
+
+ 30sp
From f6c624b59a56904ddbeba1bad2a19bfa5d024c49 Mon Sep 17 00:00:00 2001
From: Christian Schabesberger
Date: Mon, 25 Sep 2017 12:49:14 +0200
Subject: [PATCH 003/154] 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 004/154] 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_pathdownload_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 005/154] 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_suggestionsshow_play_with_kodishow_next_video
@@ -101,6 +102,21 @@
use_torenable_search_historyenable_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_idfile_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 emptyHistory clearedItem 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 006/154] 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 007/154] 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_summarySelect a channelNo 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 008/154] 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_contentblank_pagefeed_page
+ subscription_page_keykiosk_pagechannel_page@string/blank_page_key@string/kiosk_page_key@string/feed_page_key
+ @string/subscription_page_key@string/channel_page_keymain_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 pageBlank PageKiosk Page
+ Subscription PageFeed PageChannel Page@string/blank_page_summary@string/kiosk_page_summary@string/feed_page_summary
+ @string/subscription_page_summary@string/channel_page_summarySelect a channelNo 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 009/154] 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
+ KisokTrendingTop 50New & hot
From cbfc359a99c18e37b45c86c98fbeadba20fdb821 Mon Sep 17 00:00:00 2001
From: Christian Schabesberger
Date: Mon, 9 Oct 2017 12:22:01 +0200
Subject: [PATCH 010/154] 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 011/154] 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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