creating first prototype of kiosk page
This commit is contained in:
parent
283d33aa27
commit
0d2296917a
|
@ -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
|
||||||
//////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////*/
|
||||||
|
|
|
@ -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>
|
|
@ -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>
|
||||||
|
|
Loading…
Reference in New Issue