package org.schabi.newpipe.settings.tabs; import androidx.annotation.Nullable; import com.grack.nanojson.JsonArray; import com.grack.nanojson.JsonObject; import com.grack.nanojson.JsonParser; import com.grack.nanojson.JsonParserException; import com.grack.nanojson.JsonStringWriter; import com.grack.nanojson.JsonWriter; import java.util.ArrayList; import java.util.List; /** * Class to get a JSON representation of a list of tabs, and the other way around. */ public final class TabsJsonHelper { private static final String JSON_TABS_ARRAY_KEY = "tabs"; private static final List FALLBACK_INITIAL_TABS_LIST = List.of( Tab.Type.DEFAULT_KIOSK.getTab(), Tab.Type.FEED.getTab(), Tab.Type.SUBSCRIPTIONS.getTab(), Tab.Type.BOOKMARKS.getTab()); private TabsJsonHelper() { } /** * Try to reads the passed JSON and returns the list of tabs if no error were encountered. *

* If the JSON is null or empty, or the list of tabs that it represents is empty, the * {@link #getDefaultTabs fallback list} will be returned. *

* Tabs with invalid ids (i.e. not in the {@link Tab.Type} enum) will be ignored. * * @param tabsJson a JSON string got from {@link #getJsonToSave(List)}. * @return a list of {@link Tab tabs}. * @throws InvalidJsonException if the JSON string is not valid */ public static List getTabsFromJson(@Nullable final String tabsJson) throws InvalidJsonException { if (tabsJson == null || tabsJson.isEmpty()) { return getDefaultTabs(); } final List returnTabs = new ArrayList<>(); final JsonObject outerJsonObject; try { outerJsonObject = JsonParser.object().from(tabsJson); if (!outerJsonObject.has(JSON_TABS_ARRAY_KEY)) { throw new InvalidJsonException("JSON doesn't contain \"" + JSON_TABS_ARRAY_KEY + "\" array"); } final JsonArray tabsArray = outerJsonObject.getArray(JSON_TABS_ARRAY_KEY); for (final Object o : tabsArray) { if (!(o instanceof JsonObject)) { continue; } final Tab tab = Tab.from((JsonObject) o); if (tab != null) { returnTabs.add(tab); } } } catch (final JsonParserException e) { throw new InvalidJsonException(e); } if (returnTabs.isEmpty()) { return getDefaultTabs(); } return returnTabs; } /** * Get a JSON representation from a list of tabs. * * @param tabList a list of {@link Tab tabs}. * @return a JSON string representing the list of tabs */ public static String getJsonToSave(@Nullable final List tabList) { final JsonStringWriter jsonWriter = JsonWriter.string(); jsonWriter.object(); jsonWriter.array(JSON_TABS_ARRAY_KEY); if (tabList != null) { for (final Tab tab : tabList) { tab.writeJsonOn(jsonWriter); } } jsonWriter.end(); jsonWriter.end(); return jsonWriter.done(); } public static List getDefaultTabs() { return FALLBACK_INITIAL_TABS_LIST; } public static final class InvalidJsonException extends Exception { private InvalidJsonException() { super(); } private InvalidJsonException(final String message) { super(message); } private InvalidJsonException(final Throwable cause) { super(cause); } } }