mirror of
				https://github.com/TeamNewPipe/NewPipe
				synced 2025-10-31 15:23:00 +00:00 
			
		
		
		
	creating first prototype of kiosk page
This commit is contained in:
		| @@ -45,7 +45,7 @@ dependencies { | |||||||
|         exclude module: 'support-annotations' |         exclude module: 'support-annotations' | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     compile 'com.github.TeamNewPipe:NewPipeExtractor:7ae274b' |     compile 'com.github.TeamNewPipe:NewPipeExtractor:7fffef5' | ||||||
|  |  | ||||||
|     testCompile 'junit:junit:4.12' |     testCompile 'junit:junit:4.12' | ||||||
|     testCompile 'org.mockito:mockito-core:1.10.19' |     testCompile 'org.mockito:mockito-core:1.10.19' | ||||||
|   | |||||||
| @@ -18,11 +18,16 @@ import android.view.ViewGroup; | |||||||
|  |  | ||||||
| import org.schabi.newpipe.BaseFragment; | import org.schabi.newpipe.BaseFragment; | ||||||
| import org.schabi.newpipe.R; | import org.schabi.newpipe.R; | ||||||
|  | import org.schabi.newpipe.fragments.list.kisok.KioskFragment; | ||||||
| import org.schabi.newpipe.fragments.subscription.SubscriptionFragment; | import org.schabi.newpipe.fragments.subscription.SubscriptionFragment; | ||||||
| import org.schabi.newpipe.util.NavigationHelper; | import org.schabi.newpipe.util.NavigationHelper; | ||||||
|  |  | ||||||
| public class MainFragment extends BaseFragment implements TabLayout.OnTabSelectedListener { | public class MainFragment extends BaseFragment implements TabLayout.OnTabSelectedListener { | ||||||
|     private ViewPager viewPager; |     private ViewPager viewPager; | ||||||
|  |     private boolean showBlankTab = false; | ||||||
|  |  | ||||||
|  |     //todo: FIX THIS URGENTLY | ||||||
|  |     public int currentServiceId = 0; //for youtube | ||||||
|  |  | ||||||
|     /*////////////////////////////////////////////////////////////////////////// |     /*////////////////////////////////////////////////////////////////////////// | ||||||
|     // Fragment's LifeCycle |     // Fragment's LifeCycle | ||||||
| @@ -115,7 +120,17 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte | |||||||
|                 case 1: |                 case 1: | ||||||
|                     return new SubscriptionFragment(); |                     return new SubscriptionFragment(); | ||||||
|                 default: |                 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(); | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -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 <chris.schabesberger@mailbox.org> | ||||||
|  |  * 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 <http://www.gnu.org/licenses/>. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | public class KioskFragment extends BaseListInfoFragment<KioskInfo> { | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /*////////////////////////////////////////////////////////////////////////// | ||||||
|  |     // 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<KioskInfo> 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<ListExtractor.NextItemsResult> 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); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -26,6 +26,7 @@ import org.schabi.newpipe.extractor.Info; | |||||||
| import org.schabi.newpipe.extractor.ListExtractor.NextItemsResult; | import org.schabi.newpipe.extractor.ListExtractor.NextItemsResult; | ||||||
| import org.schabi.newpipe.extractor.NewPipe; | import org.schabi.newpipe.extractor.NewPipe; | ||||||
| import org.schabi.newpipe.extractor.channel.ChannelInfo; | 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.playlist.PlaylistInfo; | ||||||
| import org.schabi.newpipe.extractor.search.SearchEngine; | import org.schabi.newpipe.extractor.search.SearchEngine; | ||||||
| import org.schabi.newpipe.extractor.search.SearchResult; | import org.schabi.newpipe.extractor.search.SearchResult; | ||||||
| @@ -124,6 +125,24 @@ public final class ExtractorHelper { | |||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     public static Single<KioskInfo> getKioskInfo(final int serviceId, final String url, final String contentCountry, boolean forceLoad) { | ||||||
|  |         return checkCache(forceLoad, serviceId, url, Single.fromCallable(new Callable<KioskInfo>() { | ||||||
|  |             @Override | ||||||
|  |             public KioskInfo call() throws Exception { | ||||||
|  |                 return KioskInfo.getInfo(NewPipe.getService(serviceId), url, contentCountry); | ||||||
|  |             } | ||||||
|  |         })); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public static Single<NextItemsResult> getMoreKisokItems(final int serviceId, final String url, final String nextStreamsUrl) { | ||||||
|  |         return Single.fromCallable(new Callable<NextItemsResult>() { | ||||||
|  |             @Override | ||||||
|  |             public NextItemsResult call() throws Exception { | ||||||
|  |                 return KioskInfo.getMoreItems(NewPipe.getService(serviceId), url, nextStreamsUrl); | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /*////////////////////////////////////////////////////////////////////////// |     /*////////////////////////////////////////////////////////////////////////// | ||||||
|     // Utils |     // Utils | ||||||
|     //////////////////////////////////////////////////////////////////////////*/ |     //////////////////////////////////////////////////////////////////////////*/ | ||||||
|   | |||||||
							
								
								
									
										64
									
								
								app/src/main/res/layout/fragment_kiosk.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								app/src/main/res/layout/fragment_kiosk.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,64 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||||
|  |     xmlns:tools="http://schemas.android.com/tools" | ||||||
|  |     android:orientation="vertical" | ||||||
|  |     android:layout_width="match_parent" | ||||||
|  |     android:layout_height="match_parent"> | ||||||
|  |     <android.support.v7.widget.RecyclerView | ||||||
|  |         android:id="@+id/items_list" | ||||||
|  |         android:layout_width="match_parent" | ||||||
|  |         android:layout_height="match_parent" | ||||||
|  |         android:background="?android:windowBackground" | ||||||
|  |         android:scrollbars="vertical" | ||||||
|  |         tools:listitem="@layout/list_stream_item"/> | ||||||
|  |  | ||||||
|  |     <ProgressBar | ||||||
|  |         android:id="@+id/loading_progress_bar" | ||||||
|  |         android:layout_width="wrap_content" | ||||||
|  |         android:layout_height="wrap_content" | ||||||
|  |         android:layout_centerInParent="true" | ||||||
|  |         android:indeterminate="true" | ||||||
|  |         android:visibility="gone" | ||||||
|  |         tools:visibility="visible"/> | ||||||
|  |  | ||||||
|  |     <LinearLayout | ||||||
|  |         android:id="@+id/empty_state_view" | ||||||
|  |         android:layout_width="wrap_content" | ||||||
|  |         android:layout_height="wrap_content" | ||||||
|  |         android:layout_centerInParent="true" | ||||||
|  |         android:orientation="vertical" | ||||||
|  |         android:paddingTop="90dp" | ||||||
|  |         android:visibility="gone" | ||||||
|  |         tools:visibility="visible"> | ||||||
|  |  | ||||||
|  |         <TextView | ||||||
|  |             android:layout_width="wrap_content" | ||||||
|  |             android:layout_height="wrap_content" | ||||||
|  |             android:layout_gravity="center" | ||||||
|  |             android:layout_marginBottom="10dp" | ||||||
|  |             android:fontFamily="monospace" | ||||||
|  |             android:text="(╯°-°)╯" | ||||||
|  |             android:textSize="35sp" | ||||||
|  |             tools:ignore="HardcodedText,UnusedAttribute"/> | ||||||
|  |  | ||||||
|  |         <TextView | ||||||
|  |             android:layout_width="wrap_content" | ||||||
|  |             android:layout_height="wrap_content" | ||||||
|  |             android:layout_gravity="center" | ||||||
|  |             android:text="@string/empty_view_no_videos" | ||||||
|  |             android:textSize="24sp"/> | ||||||
|  |  | ||||||
|  |     </LinearLayout> | ||||||
|  |  | ||||||
|  |     <!--ERROR PANEL--> | ||||||
|  |     <include | ||||||
|  |         android:id="@+id/error_panel" | ||||||
|  |         layout="@layout/error_retry" | ||||||
|  |         android:layout_width="wrap_content" | ||||||
|  |         android:layout_height="wrap_content" | ||||||
|  |         android:layout_centerInParent="true" | ||||||
|  |         android:layout_marginTop="50dp" | ||||||
|  |         android:visibility="gone" | ||||||
|  |         tools:visibility="visible"/> | ||||||
|  |  | ||||||
|  | </RelativeLayout> | ||||||
							
								
								
									
										23
									
								
								app/src/main/res/layout/kiosk_header.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								app/src/main/res/layout/kiosk_header.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||||
|  |     xmlns:tools="http://schemas.android.com/tools" | ||||||
|  |     android:orientation="vertical" | ||||||
|  |     android:layout_width="match_parent" | ||||||
|  |     android:layout_height="wrap_content"> | ||||||
|  |  | ||||||
|  |     <TextView | ||||||
|  |         android:id="@+id/kiosk_title_view" | ||||||
|  |         android:layout_width="match_parent" | ||||||
|  |         android:layout_height="wrap_content" | ||||||
|  |         android:layout_marginLeft="8dp" | ||||||
|  |         android:layout_marginRight="8dp" | ||||||
|  |         android:layout_marginTop="6dp" | ||||||
|  |         android:ellipsize="end" | ||||||
|  |         android:maxLines="1" | ||||||
|  |         android:textAlignment="center" | ||||||
|  |         android:textAppearance="?android:attr/textAppearanceSmall" | ||||||
|  |         android:textSize="@dimen/kiosk_title_text_size" | ||||||
|  |         tools:text="Top 20" | ||||||
|  |         android:gravity="center_horizontal"/> | ||||||
|  |  | ||||||
|  | </RelativeLayout> | ||||||
| @@ -67,4 +67,6 @@ | |||||||
|     <dimen name="playlist_detail_uploader_image_size">24dp</dimen> |     <dimen name="playlist_detail_uploader_image_size">24dp</dimen> | ||||||
|     <dimen name="playlist_detail_uploader_layout_height">28dp</dimen> |     <dimen name="playlist_detail_uploader_layout_height">28dp</dimen> | ||||||
|  |  | ||||||
|  |     <!-- Kiosk view Dimensions--> | ||||||
|  |     <dimen name="kiosk_title_text_size">30sp</dimen> | ||||||
| </resources> | </resources> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Christian Schabesberger
					Christian Schabesberger