From 7f9f075147d6c5a1de0aa93520eda5457eb47b97 Mon Sep 17 00:00:00 2001 From: Christian Schabesberger Date: Mon, 9 Oct 2017 14:22:27 +0200 Subject: [PATCH] add selector for kiosk --- .../settings/ContentSettingsFragment.java | 85 ++++++-- .../newpipe/settings/SelectKioskFragment.java | 185 ++++++++++++++++++ .../newpipe/util/ServiceIconMapper.java | 35 ++++ app/src/main/res/drawable-nodpi/service.png | Bin 0 -> 5765 bytes .../main/res/layout/select_kiosk_fragment.xml | 26 +++ app/src/main/res/layout/select_kiosk_item.xml | 37 ++++ app/src/main/res/values/strings.xml | 1 + assets/service.svg | 109 +++++++++++ 8 files changed, 466 insertions(+), 12 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java create mode 100644 app/src/main/java/org/schabi/newpipe/util/ServiceIconMapper.java create mode 100644 app/src/main/res/drawable-nodpi/service.png create mode 100644 app/src/main/res/layout/select_kiosk_fragment.xml create mode 100644 app/src/main/res/layout/select_kiosk_item.xml create mode 100644 assets/service.svg diff --git a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java index 4c0c7aec3..381c20ff1 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java @@ -1,10 +1,17 @@ package org.schabi.newpipe.settings; +import android.app.Activity; import android.os.Bundle; import android.support.v7.preference.ListPreference; import android.support.v7.preference.Preference; import org.schabi.newpipe.R; +import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.StreamingService; +import org.schabi.newpipe.extractor.exceptions.ExtractionException; +import org.schabi.newpipe.report.ErrorActivity; +import org.schabi.newpipe.report.UserAction; +import org.schabi.newpipe.util.KioskTranslator; public class ContentSettingsFragment extends BasePreferenceFragment { @@ -14,7 +21,6 @@ public class ContentSettingsFragment extends BasePreferenceFragment { addPreferencesFromResource(R.xml.content_settings); final ListPreference mainPageContentPref = (ListPreference) findPreference(getString(R.string.main_page_content_key)); - mainPageContentPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValueO) { @@ -25,7 +31,36 @@ public class ContentSettingsFragment extends BasePreferenceFragment { final String mainPrefOldSummary = getMainPagePrefSummery(mainPrefOldValue, mainPageContentPref); if(newValue.equals(getString(R.string.kiosk_page_key))) { - //todo on multyservice support show a kiosk an service selector here + SelectKioskFragment selectKioskFragment = new SelectKioskFragment(); + selectKioskFragment.setOnSelectedLisener(new SelectKioskFragment.OnSelectedLisener() { + @Override + public void onKioskSelected(String kioskId, int service_id) { + defaultPreferences.edit() + .putInt(getString(R.string.main_page_selected_service), service_id).apply(); + defaultPreferences.edit() + .putString(getString(R.string.main_page_selectd_kiosk_id), kioskId).apply(); + String summary = ""; + try { + summary += NewPipe.getService(service_id).getServiceInfo().name; + } catch (ExtractionException e) { + onError(e); + } + summary += "/"; + summary += KioskTranslator.getTranslatedKioskName(kioskId, getContext()); + + + + mainPageContentPref.setSummary(summary); + } + }); + selectKioskFragment.setOnCancelListener(new SelectKioskFragment.OnCancelListener() { + @Override + public void onCancel() { + mainPageContentPref.setSummary(mainPrefOldSummary); + mainPageContentPref.setValue(mainPrefOldValue); + } + }); + selectKioskFragment.show(getFragmentManager(), "select_kiosk"); } else if(newValue.equals(getString(R.string.channel_page_key))) { SelectChannelFragment selectChannelFragment = new SelectChannelFragment(); selectChannelFragment.setOnSelectedLisener(new SelectChannelFragment.OnSelectedLisener() { @@ -38,23 +73,18 @@ public class ContentSettingsFragment extends BasePreferenceFragment { defaultPreferences.edit() .putString(getString(R.string.main_page_selected_channel_name), name).apply(); - //change summery mainPageContentPref.setSummary(name); } }); selectChannelFragment.setOnCancelListener(new SelectChannelFragment.OnCancelListener() { @Override public void onCancel() { - //defaultPreferences.edit() - // .putString(getString(R.string.main_page_content_key), mainPrefOldValue).apply(); mainPageContentPref.setSummary(mainPrefOldSummary); mainPageContentPref.setValue(mainPrefOldValue); } }); selectChannelFragment.show(getFragmentManager(), "select_channel"); - } - - if(!newValue.equals(getString(R.string.channel_page_key))) { + } else { mainPageContentPref.setSummary(getMainPageSummeryByKey(newValue)); } @@ -68,11 +98,28 @@ public class ContentSettingsFragment extends BasePreferenceFragment { super.onResume(); final String mainPageContentKey = getString(R.string.main_page_content_key); - if(defaultPreferences.getString(mainPageContentKey, - getString(R.string.blank_page_key)) + final Preference mainPagePref = findPreference(getString(R.string.main_page_content_key)); + final String bpk = getString(R.string.blank_page_key); + if(defaultPreferences.getString(mainPageContentKey, bpk) .equals(getString(R.string.channel_page_key))) { - Preference pref = findPreference(getString(R.string.main_page_content_key)); - pref.setSummary(defaultPreferences.getString(getString(R.string.main_page_selected_channel_name), "error")); + mainPagePref.setSummary(defaultPreferences.getString(getString(R.string.main_page_selected_channel_name), "error")); + } else if(defaultPreferences.getString(mainPageContentKey, bpk) + .equals(getString(R.string.kiosk_page_key))) { + try { + StreamingService service = NewPipe.getService( + defaultPreferences.getInt( + getString(R.string.main_page_selected_service), 0)); + String summary = ""; + summary += service.getServiceInfo().name; + summary += "/"; + summary += KioskTranslator.getTranslatedKioskName( + defaultPreferences.getString( + getString(R.string.main_page_selectd_kiosk_id), "Trending"), + getContext()); + mainPagePref.setSummary(summary); + } catch (Exception e) { + onError(e); + } } } @@ -101,4 +148,18 @@ public class ContentSettingsFragment extends BasePreferenceFragment { } return R.string.blank_page_summary; } + + /*////////////////////////////////////////////////////////////////////////// + // Error + //////////////////////////////////////////////////////////////////////////*/ + + protected boolean onError(Throwable e) { + final Activity activity = getActivity(); + ErrorActivity.reportError(activity, e, + activity.getClass(), + null, + ErrorActivity.ErrorInfo.make(UserAction.UI_ERROR, + "none", "", R.string.app_ui_crash)); + return true; + } } diff --git a/app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java b/app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java new file mode 100644 index 000000000..6e7ba191e --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/SelectKioskFragment.java @@ -0,0 +1,185 @@ +package org.schabi.newpipe.settings; + +import android.app.Activity; +import android.content.DialogInterface; +import android.os.Bundle; +import android.support.v4.app.DialogFragment; +import android.support.v4.content.ContextCompat; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.database.subscription.SubscriptionEntity; +import org.schabi.newpipe.extractor.NewPipe; +import org.schabi.newpipe.extractor.StreamingService; +import org.schabi.newpipe.fragments.subscription.SubscriptionService; +import org.schabi.newpipe.report.ErrorActivity; +import org.schabi.newpipe.report.UserAction; +import org.schabi.newpipe.util.KioskTranslator; +import org.schabi.newpipe.util.ServiceIconMapper; + +import java.util.List; +import java.util.Vector; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +/** + * Created by Christian Schabesberger on 09.10.17. + * SelectKioskFragment.java is part of NewPipe. + * + * NewPipe is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * NewPipe is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with NewPipe. If not, see . + */ + +public class SelectKioskFragment extends DialogFragment { + + RecyclerView recyclerView = null; + SelectKioskAdapter selectKioskAdapter = null; + + /*////////////////////////////////////////////////////////////////////////// + // Interfaces + //////////////////////////////////////////////////////////////////////////*/ + + public interface OnSelectedLisener { + void onKioskSelected(String kioskId, int service_id); + } + + OnSelectedLisener onSelectedLisener = null; + public void setOnSelectedLisener(OnSelectedLisener listener) { + onSelectedLisener = listener; + } + + public interface OnCancelListener { + void onCancel(); + } + OnCancelListener onCancelListener = null; + public void setOnCancelListener(OnCancelListener listener) { + onCancelListener = listener; + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View v = inflater.inflate(R.layout.select_kiosk_fragment, container, false); + recyclerView = (RecyclerView) v.findViewById(R.id.items_list); + recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); + try { + selectKioskAdapter = new SelectKioskAdapter(); + } catch (Exception e) { + onError(e); + } + recyclerView.setAdapter(selectKioskAdapter); + + return v; + } + + /*////////////////////////////////////////////////////////////////////////// + // Handle actions + //////////////////////////////////////////////////////////////////////////*/ + + @Override + public void onCancel(final DialogInterface dialogInterface) { + super.onCancel(dialogInterface); + if(onCancelListener != null) { + onCancelListener.onCancel(); + } + } + + private void clickedItem(SelectKioskAdapter.Entry entry) { + if(onSelectedLisener != null) { + onSelectedLisener.onKioskSelected(entry.kioskId, entry.serviceId); + } + dismiss(); + } + + private class SelectKioskAdapter + extends RecyclerView.Adapter { + public class Entry { + public Entry (int i, int si, String ki, String kn){ + icon = i; serviceId=si; kioskId=ki; kioskName = kn; + } + int icon; + int serviceId; + String kioskId; + String kioskName; + }; + + private List kioskList = new Vector<>(); + + public SelectKioskAdapter() + throws Exception { + for(StreamingService service : NewPipe.getServices()) { + for(String kioskId : service.getKioskList().getAvailableKisoks()) { + kioskList.add(new Entry( + ServiceIconMapper.getIconResource(service.getServiceId()), + service.getServiceId(), + kioskId, + KioskTranslator.getTranslatedKioskName(kioskId, getContext()))); + } + } + } + + public int getItemCount() { + return kioskList.size(); + } + + public SelectKioskItemHolder onCreateViewHolder(ViewGroup parent, int type) { + View item = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.select_kiosk_item, parent, false); + return new SelectKioskItemHolder(item); + } + + public class SelectKioskItemHolder extends RecyclerView.ViewHolder { + public SelectKioskItemHolder(View v) { + super(v); + this.view = v; + thumbnailView = v.findViewById(R.id.itemThumbnailView); + titleView = v.findViewById(R.id.itemTitleView); + } + public View view; + public ImageView thumbnailView; + public TextView titleView; + } + + public void onBindViewHolder(SelectKioskItemHolder holder, final int position) { + final Entry entry = kioskList.get(position); + holder.titleView.setText(entry.kioskName); + holder.thumbnailView.setImageDrawable(ContextCompat.getDrawable(getContext(), entry.icon)); + holder.view.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + clickedItem(entry); + } + }); + } + } + + /*////////////////////////////////////////////////////////////////////////// + // Error + //////////////////////////////////////////////////////////////////////////*/ + + protected boolean onError(Throwable e) { + final Activity activity = getActivity(); + ErrorActivity.reportError(activity, e, + activity.getClass(), + null, + ErrorActivity.ErrorInfo.make(UserAction.UI_ERROR, + "none", "", R.string.app_ui_crash)); + return true; + } +} diff --git a/app/src/main/java/org/schabi/newpipe/util/ServiceIconMapper.java b/app/src/main/java/org/schabi/newpipe/util/ServiceIconMapper.java new file mode 100644 index 000000000..060013dd2 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/util/ServiceIconMapper.java @@ -0,0 +1,35 @@ +package org.schabi.newpipe.util; + +import org.schabi.newpipe.R; +import org.schabi.newpipe.extractor.NewPipe; + +/** + * Created by Chrsitian Schabesberger on 09.10.17. + * ServiceIconMapper.java is part of NewPipe. + * + * NewPipe is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * NewPipe is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with NewPipe. If not, see . + */ + +public class ServiceIconMapper { + public static int getIconResource(int service_id) { + switch(service_id) { + case 0: + return R.drawable.youtube; + case 1: + return R.drawable.soud_cloud; + default: + return R.drawable.service; + } + } +} diff --git a/app/src/main/res/drawable-nodpi/service.png b/app/src/main/res/drawable-nodpi/service.png new file mode 100644 index 0000000000000000000000000000000000000000..cfaff19e2df8b3954bae3630c1d68bd811a1e279 GIT binary patch literal 5765 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/select_kiosk_fragment.xml b/app/src/main/res/layout/select_kiosk_fragment.xml new file mode 100644 index 000000000..7be96754a --- /dev/null +++ b/app/src/main/res/layout/select_kiosk_fragment.xml @@ -0,0 +1,26 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/select_kiosk_item.xml b/app/src/main/res/layout/select_kiosk_item.xml new file mode 100644 index 000000000..818380849 --- /dev/null +++ b/app/src/main/res/layout/select_kiosk_item.xml @@ -0,0 +1,37 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e11483ac0..371ad1688 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -282,6 +282,7 @@ Select a channel No channel subscribed yet + Select a kiosk Kisok diff --git a/assets/service.svg b/assets/service.svg new file mode 100644 index 000000000..172cc106f --- /dev/null +++ b/assets/service.svg @@ -0,0 +1,109 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + +