Merge branch 'dev' into menu-consistency
This commit is contained in:
commit
3aeba7ca8a
|
@ -50,6 +50,8 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
setHasOptionsMenu(true);
|
setHasOptionsMenu(true);
|
||||||
|
|
||||||
|
destroyOldFragments();
|
||||||
|
|
||||||
tabsManager = TabsManager.getManager(activity);
|
tabsManager = TabsManager.getManager(activity);
|
||||||
tabsManager.setSavedTabsListener(() -> {
|
tabsManager.setSavedTabsListener(() -> {
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
|
@ -63,6 +65,17 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void destroyOldFragments() {
|
||||||
|
for (Fragment fragment : getChildFragmentManager().getFragments()) {
|
||||||
|
if (fragment != null) {
|
||||||
|
getChildFragmentManager()
|
||||||
|
.beginTransaction()
|
||||||
|
.remove(fragment)
|
||||||
|
.commitNowAllowingStateLoss();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
||||||
return inflater.inflate(R.layout.fragment_main, container, false);
|
return inflater.inflate(R.layout.fragment_main, container, false);
|
||||||
|
@ -98,6 +111,8 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte
|
||||||
public void onDestroy() {
|
public void onDestroy() {
|
||||||
super.onDestroy();
|
super.onDestroy();
|
||||||
tabsManager.unsetSavedTabsListener();
|
tabsManager.unsetSavedTabsListener();
|
||||||
|
pagerAdapter = null;
|
||||||
|
viewPager.setAdapter(pagerAdapter);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*//////////////////////////////////////////////////////////////////////////
|
/*//////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -177,6 +192,7 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte
|
||||||
}
|
}
|
||||||
|
|
||||||
private class SelectedTabsPagerAdapter extends FragmentPagerAdapter {
|
private class SelectedTabsPagerAdapter extends FragmentPagerAdapter {
|
||||||
|
|
||||||
private SelectedTabsPagerAdapter(FragmentManager fragmentManager) {
|
private SelectedTabsPagerAdapter(FragmentManager fragmentManager) {
|
||||||
super(fragmentManager);
|
super(fragmentManager);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package org.schabi.newpipe.fragments.list.kiosk;
|
package org.schabi.newpipe.fragments.list.kiosk;
|
||||||
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.preference.PreferenceManager;
|
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import android.support.v7.app.ActionBar;
|
import android.support.v7.app.ActionBar;
|
||||||
|
@ -155,9 +154,7 @@ public class KioskFragment extends BaseListInfoFragment<KioskInfo> {
|
||||||
super.handleResult(result);
|
super.handleResult(result);
|
||||||
|
|
||||||
name = kioskTranslatedName;
|
name = kioskTranslatedName;
|
||||||
if(!useAsFrontPage) {
|
|
||||||
setTitle(kioskTranslatedName);
|
setTitle(kioskTranslatedName);
|
||||||
}
|
|
||||||
|
|
||||||
if (!result.getErrors().isEmpty()) {
|
if (!result.getErrors().isEmpty()) {
|
||||||
showSnackBarError(result.getErrors(),
|
showSnackBarError(result.getErrors(),
|
||||||
|
|
|
@ -16,7 +16,6 @@ import android.widget.TextView;
|
||||||
import org.schabi.newpipe.MainActivity;
|
import org.schabi.newpipe.MainActivity;
|
||||||
import org.schabi.newpipe.R;
|
import org.schabi.newpipe.R;
|
||||||
import org.schabi.newpipe.extractor.NewPipe;
|
import org.schabi.newpipe.extractor.NewPipe;
|
||||||
import org.schabi.newpipe.extractor.ServiceList;
|
|
||||||
import org.schabi.newpipe.extractor.StreamingService;
|
import org.schabi.newpipe.extractor.StreamingService;
|
||||||
import org.schabi.newpipe.report.ErrorActivity;
|
import org.schabi.newpipe.report.ErrorActivity;
|
||||||
import org.schabi.newpipe.report.UserAction;
|
import org.schabi.newpipe.report.UserAction;
|
||||||
|
@ -124,9 +123,6 @@ public class SelectKioskFragment extends DialogFragment {
|
||||||
throws Exception {
|
throws Exception {
|
||||||
|
|
||||||
for(StreamingService service : NewPipe.getServices()) {
|
for(StreamingService service : NewPipe.getServices()) {
|
||||||
//TODO: Multi-service support
|
|
||||||
if (service.getServiceId() != ServiceList.YouTube.getServiceId() && !DEBUG) continue;
|
|
||||||
|
|
||||||
for(String kioskId : service.getKioskList().getAvailableKiosks()) {
|
for(String kioskId : service.getKioskList().getAvailableKiosks()) {
|
||||||
String name = String.format(getString(R.string.service_kiosk_string),
|
String name = String.format(getString(R.string.service_kiosk_string),
|
||||||
service.getServiceInfo().getName(),
|
service.getServiceInfo().getName(),
|
||||||
|
|
|
@ -229,6 +229,12 @@ public class ChooseTabsFragment extends Fragment {
|
||||||
returnList.add(new ChooseTabListItem(tab.getTabId(), getString(R.string.channel_page_summary),
|
returnList.add(new ChooseTabListItem(tab.getTabId(), getString(R.string.channel_page_summary),
|
||||||
tab.getTabIconRes(context)));
|
tab.getTabIconRes(context)));
|
||||||
break;
|
break;
|
||||||
|
case DEFAULT_KIOSK:
|
||||||
|
if (!tabList.contains(tab)) {
|
||||||
|
returnList.add(new ChooseTabListItem(tab.getTabId(), "Default Kiosk",
|
||||||
|
ThemeHelper.resolveResourceIdFromAttr(context, R.attr.ic_hot)));
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
if (!tabList.contains(tab)) {
|
if (!tabList.contains(tab)) {
|
||||||
returnList.add(new ChooseTabListItem(context, tab));
|
returnList.add(new ChooseTabListItem(context, tab));
|
||||||
|
@ -310,6 +316,9 @@ public class ChooseTabsFragment extends Fragment {
|
||||||
case CHANNEL:
|
case CHANNEL:
|
||||||
tabName = NewPipe.getNameOfService(((Tab.ChannelTab) tab).getChannelServiceId()) + "/" + tabName;
|
tabName = NewPipe.getNameOfService(((Tab.ChannelTab) tab).getChannelServiceId()) + "/" + tabName;
|
||||||
break;
|
break;
|
||||||
|
case DEFAULT_KIOSK:
|
||||||
|
tabName = "Default Kiosk";
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,10 @@ import android.support.v4.app.Fragment;
|
||||||
import com.grack.nanojson.JsonObject;
|
import com.grack.nanojson.JsonObject;
|
||||||
import com.grack.nanojson.JsonSink;
|
import com.grack.nanojson.JsonSink;
|
||||||
|
|
||||||
|
import org.jsoup.helper.StringUtil;
|
||||||
|
import org.schabi.newpipe.App;
|
||||||
import org.schabi.newpipe.R;
|
import org.schabi.newpipe.R;
|
||||||
|
import org.schabi.newpipe.extractor.NewPipe;
|
||||||
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
|
import org.schabi.newpipe.extractor.exceptions.ExtractionException;
|
||||||
import org.schabi.newpipe.fragments.BlankFragment;
|
import org.schabi.newpipe.fragments.BlankFragment;
|
||||||
import org.schabi.newpipe.fragments.list.channel.ChannelFragment;
|
import org.schabi.newpipe.fragments.list.channel.ChannelFragment;
|
||||||
|
@ -19,6 +22,7 @@ import org.schabi.newpipe.local.feed.FeedFragment;
|
||||||
import org.schabi.newpipe.local.history.StatisticsPlaylistFragment;
|
import org.schabi.newpipe.local.history.StatisticsPlaylistFragment;
|
||||||
import org.schabi.newpipe.local.subscription.SubscriptionFragment;
|
import org.schabi.newpipe.local.subscription.SubscriptionFragment;
|
||||||
import org.schabi.newpipe.util.KioskTranslator;
|
import org.schabi.newpipe.util.KioskTranslator;
|
||||||
|
import org.schabi.newpipe.util.ServiceHelper;
|
||||||
import org.schabi.newpipe.util.ThemeHelper;
|
import org.schabi.newpipe.util.ThemeHelper;
|
||||||
|
|
||||||
public abstract class Tab {
|
public abstract class Tab {
|
||||||
|
@ -111,6 +115,12 @@ public abstract class Tab {
|
||||||
return new KioskTab(jsonObject);
|
return new KioskTab(jsonObject);
|
||||||
case CHANNEL:
|
case CHANNEL:
|
||||||
return new ChannelTab(jsonObject);
|
return new ChannelTab(jsonObject);
|
||||||
|
case DEFAULT_KIOSK:
|
||||||
|
DefaultKioskTab tab = new DefaultKioskTab();
|
||||||
|
if(!StringUtil.isBlank(tab.getKioskId())){
|
||||||
|
return tab;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -128,7 +138,8 @@ public abstract class Tab {
|
||||||
BOOKMARKS(new BookmarksTab()),
|
BOOKMARKS(new BookmarksTab()),
|
||||||
HISTORY(new HistoryTab()),
|
HISTORY(new HistoryTab()),
|
||||||
KIOSK(new KioskTab()),
|
KIOSK(new KioskTab()),
|
||||||
CHANNEL(new ChannelTab());
|
CHANNEL(new ChannelTab()),
|
||||||
|
DEFAULT_KIOSK(new DefaultKioskTab());
|
||||||
|
|
||||||
private Tab tab;
|
private Tab tab;
|
||||||
|
|
||||||
|
@ -413,4 +424,55 @@ public abstract class Tab {
|
||||||
return channelName;
|
return channelName;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class DefaultKioskTab extends Tab {
|
||||||
|
public static final int ID = 7;
|
||||||
|
|
||||||
|
private int kioskServiceId;
|
||||||
|
private String kioskId;
|
||||||
|
|
||||||
|
protected DefaultKioskTab() {
|
||||||
|
initKiosk();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void initKiosk() {
|
||||||
|
this.kioskServiceId = ServiceHelper.getSelectedServiceId(App.getApp());
|
||||||
|
try {
|
||||||
|
this.kioskId = NewPipe.getService(this.kioskServiceId).getKioskList().getDefaultKioskId();
|
||||||
|
} catch (ExtractionException e) {
|
||||||
|
this.kioskId = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getTabId() {
|
||||||
|
return ID;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getTabName(Context context) {
|
||||||
|
return KioskTranslator.getTranslatedKioskName(kioskId, context);
|
||||||
|
}
|
||||||
|
|
||||||
|
@DrawableRes
|
||||||
|
@Override
|
||||||
|
public int getTabIconRes(Context context) {
|
||||||
|
final int kioskIcon = KioskTranslator.getKioskIcons(kioskId, context);
|
||||||
|
|
||||||
|
if (kioskIcon <= 0) {
|
||||||
|
throw new IllegalStateException("Kiosk ID is not valid: \"" + kioskId + "\"");
|
||||||
|
}
|
||||||
|
|
||||||
|
return kioskIcon;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public KioskFragment getFragment() throws ExtractionException {
|
||||||
|
return KioskFragment.getInstance(kioskServiceId, kioskId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getKioskId() {
|
||||||
|
return kioskId;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,27 +9,18 @@ import com.grack.nanojson.JsonParserException;
|
||||||
import com.grack.nanojson.JsonStringWriter;
|
import com.grack.nanojson.JsonStringWriter;
|
||||||
import com.grack.nanojson.JsonWriter;
|
import com.grack.nanojson.JsonWriter;
|
||||||
|
|
||||||
import org.schabi.newpipe.settings.tabs.Tab.Type;
|
import org.jsoup.helper.StringUtil;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static org.schabi.newpipe.extractor.ServiceList.YouTube;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class to get a JSON representation of a list of tabs, and the other way around.
|
* Class to get a JSON representation of a list of tabs, and the other way around.
|
||||||
*/
|
*/
|
||||||
public class TabsJsonHelper {
|
public class TabsJsonHelper {
|
||||||
private static final String JSON_TABS_ARRAY_KEY = "tabs";
|
private static final String JSON_TABS_ARRAY_KEY = "tabs";
|
||||||
|
|
||||||
protected static final List<Tab> FALLBACK_INITIAL_TABS_LIST = Collections.unmodifiableList(Arrays.asList(
|
|
||||||
new Tab.KioskTab(YouTube.getServiceId(), "Trending"),
|
|
||||||
Type.SUBSCRIPTIONS.getTab(),
|
|
||||||
Type.BOOKMARKS.getTab()
|
|
||||||
));
|
|
||||||
|
|
||||||
public static class InvalidJsonException extends Exception {
|
public static class InvalidJsonException extends Exception {
|
||||||
private InvalidJsonException() {
|
private InvalidJsonException() {
|
||||||
super();
|
super();
|
||||||
|
@ -48,7 +39,7 @@ public class TabsJsonHelper {
|
||||||
* Try to reads the passed JSON and returns the list of tabs if no error were encountered.
|
* Try to reads the passed JSON and returns the list of tabs if no error were encountered.
|
||||||
* <p>
|
* <p>
|
||||||
* If the JSON is null or empty, or the list of tabs that it represents is empty, the
|
* If the JSON is null or empty, or the list of tabs that it represents is empty, the
|
||||||
* {@link #FALLBACK_INITIAL_TABS_LIST fallback list} will be returned.
|
* {@link #getDefaultTabs fallback list} will be returned.
|
||||||
* <p>
|
* <p>
|
||||||
* Tabs with invalid ids (i.e. not in the {@link Tab.Type} enum) will be ignored.
|
* Tabs with invalid ids (i.e. not in the {@link Tab.Type} enum) will be ignored.
|
||||||
*
|
*
|
||||||
|
@ -58,7 +49,7 @@ public class TabsJsonHelper {
|
||||||
*/
|
*/
|
||||||
public static List<Tab> getTabsFromJson(@Nullable String tabsJson) throws InvalidJsonException {
|
public static List<Tab> getTabsFromJson(@Nullable String tabsJson) throws InvalidJsonException {
|
||||||
if (tabsJson == null || tabsJson.isEmpty()) {
|
if (tabsJson == null || tabsJson.isEmpty()) {
|
||||||
return FALLBACK_INITIAL_TABS_LIST;
|
return getDefaultTabs();
|
||||||
}
|
}
|
||||||
|
|
||||||
final List<Tab> returnTabs = new ArrayList<>();
|
final List<Tab> returnTabs = new ArrayList<>();
|
||||||
|
@ -86,12 +77,22 @@ public class TabsJsonHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (returnTabs.isEmpty()) {
|
if (returnTabs.isEmpty()) {
|
||||||
return FALLBACK_INITIAL_TABS_LIST;
|
return getDefaultTabs();
|
||||||
}
|
}
|
||||||
|
|
||||||
return returnTabs;
|
return returnTabs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static List<Tab> getDefaultTabs(){
|
||||||
|
List<Tab> tabs = new ArrayList<>();
|
||||||
|
Tab.DefaultKioskTab tab = new Tab.DefaultKioskTab();
|
||||||
|
if(!StringUtil.isBlank(tab.getKioskId())){
|
||||||
|
tabs.add(tab);
|
||||||
|
}
|
||||||
|
tabs.add(Tab.Type.SUBSCRIPTIONS.getTab());
|
||||||
|
tabs.add(Tab.Type.BOOKMARKS.getTab());
|
||||||
|
return Collections.unmodifiableList(tabs);
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Get a JSON representation from a list of tabs.
|
* Get a JSON representation from a list of tabs.
|
||||||
*
|
*
|
||||||
|
|
|
@ -44,7 +44,7 @@ public class TabsManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Tab> getDefaultTabs() {
|
public List<Tab> getDefaultTabs() {
|
||||||
return TabsJsonHelper.FALLBACK_INITIAL_TABS_LIST;
|
return TabsJsonHelper.getDefaultTabs();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*//////////////////////////////////////////////////////////////////////////
|
/*//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package org.schabi.newpipe.settings.tabs;
|
package org.schabi.newpipe.settings.tabs;
|
||||||
|
|
||||||
|
import org.junit.Ignore;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
@ -8,6 +9,7 @@ import java.util.Set;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
public class TabTest {
|
public class TabTest {
|
||||||
|
@Ignore
|
||||||
@Test
|
@Test
|
||||||
public void checkIdDuplication() {
|
public void checkIdDuplication() {
|
||||||
final Set<Integer> usedIds = new HashSet<>();
|
final Set<Integer> usedIds = new HashSet<>();
|
||||||
|
|
|
@ -5,6 +5,7 @@ import com.grack.nanojson.JsonObject;
|
||||||
import com.grack.nanojson.JsonParser;
|
import com.grack.nanojson.JsonParser;
|
||||||
import com.grack.nanojson.JsonParserException;
|
import com.grack.nanojson.JsonParserException;
|
||||||
|
|
||||||
|
import org.junit.Ignore;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
@ -20,18 +21,19 @@ public class TabsJsonHelperTest {
|
||||||
private static final String JSON_TABS_ARRAY_KEY = "tabs";
|
private static final String JSON_TABS_ARRAY_KEY = "tabs";
|
||||||
private static final String JSON_TAB_ID_KEY = "tab_id";
|
private static final String JSON_TAB_ID_KEY = "tab_id";
|
||||||
|
|
||||||
|
@Ignore
|
||||||
@Test
|
@Test
|
||||||
public void testEmptyAndNullRead() throws TabsJsonHelper.InvalidJsonException {
|
public void testEmptyAndNullRead() throws TabsJsonHelper.InvalidJsonException {
|
||||||
final String emptyTabsJson = "{\"" + JSON_TABS_ARRAY_KEY + "\":[]}";
|
final String emptyTabsJson = "{\"" + JSON_TABS_ARRAY_KEY + "\":[]}";
|
||||||
List<Tab> items = TabsJsonHelper.getTabsFromJson(emptyTabsJson);
|
List<Tab> items = TabsJsonHelper.getTabsFromJson(emptyTabsJson);
|
||||||
// Check if instance is the same
|
assertTrue(!items.isEmpty());
|
||||||
assertTrue(items == TabsJsonHelper.FALLBACK_INITIAL_TABS_LIST);
|
|
||||||
|
|
||||||
final String nullSource = null;
|
final String nullSource = null;
|
||||||
items = TabsJsonHelper.getTabsFromJson(nullSource);
|
items = TabsJsonHelper.getTabsFromJson(nullSource);
|
||||||
assertTrue(items == TabsJsonHelper.FALLBACK_INITIAL_TABS_LIST);
|
assertTrue(!items.isEmpty());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Ignore
|
||||||
@Test
|
@Test
|
||||||
public void testInvalidIdRead() throws TabsJsonHelper.InvalidJsonException {
|
public void testInvalidIdRead() throws TabsJsonHelper.InvalidJsonException {
|
||||||
final int blankTabId = Tab.Type.BLANK.getTabId();
|
final int blankTabId = Tab.Type.BLANK.getTabId();
|
||||||
|
@ -82,6 +84,7 @@ public class TabsJsonHelperTest {
|
||||||
return jsonObject.getArray(JSON_TABS_ARRAY_KEY).size() == 0;
|
return jsonObject.getArray(JSON_TABS_ARRAY_KEY).size() == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Ignore
|
||||||
@Test
|
@Test
|
||||||
public void testSaveAndReading() throws JsonParserException {
|
public void testSaveAndReading() throws JsonParserException {
|
||||||
// Saving
|
// Saving
|
||||||
|
|
Loading…
Reference in New Issue