diff --git a/AndroidCompat/Config/src/main/java/xyz/nulldev/ts/config/ConfigManager.kt b/AndroidCompat/Config/src/main/java/xyz/nulldev/ts/config/ConfigManager.kt index 43c3cd9e..cfa6f9ce 100644 --- a/AndroidCompat/Config/src/main/java/xyz/nulldev/ts/config/ConfigManager.kt +++ b/AndroidCompat/Config/src/main/java/xyz/nulldev/ts/config/ConfigManager.kt @@ -35,6 +35,7 @@ open class ConfigManager { /** * Get a config module (Java API) */ + @Suppress("UNCHECKED_CAST") fun module(type: Class): T = loadedModules[type] as T /** diff --git a/AndroidCompat/src/main/java/com/f2prateek/package-info.java b/AndroidCompat/src/main/java/com/f2prateek/package-info.java deleted file mode 100644 index d15ae402..00000000 --- a/AndroidCompat/src/main/java/com/f2prateek/package-info.java +++ /dev/null @@ -1,2 +0,0 @@ -package com.f2prateek; -//TODO Consider if we can change this package into an Android dependency \ No newline at end of file diff --git a/AndroidCompat/src/main/java/com/f2prateek/rx/preferences/BooleanAdapter.java b/AndroidCompat/src/main/java/com/f2prateek/rx/preferences/BooleanAdapter.java deleted file mode 100644 index d8226948..00000000 --- a/AndroidCompat/src/main/java/com/f2prateek/rx/preferences/BooleanAdapter.java +++ /dev/null @@ -1,34 +0,0 @@ -/* -Copyright 2014 Prateek Srivastava - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -This file may have been modified after being copied from it's original source. - */ -package com.f2prateek.rx.preferences; - -import android.content.SharedPreferences; -import android.support.annotation.NonNull; - -final class BooleanAdapter implements Preference.Adapter { - static final BooleanAdapter INSTANCE = new BooleanAdapter(); - - @Override public Boolean get(@NonNull String key, @NonNull SharedPreferences preferences) { - return preferences.getBoolean(key, false); - } - - @Override public void set(@NonNull String key, @NonNull Boolean value, - @NonNull SharedPreferences.Editor editor) { - editor.putBoolean(key, value); - } -} diff --git a/AndroidCompat/src/main/java/com/f2prateek/rx/preferences/EnumAdapter.java b/AndroidCompat/src/main/java/com/f2prateek/rx/preferences/EnumAdapter.java deleted file mode 100644 index 58bd419c..00000000 --- a/AndroidCompat/src/main/java/com/f2prateek/rx/preferences/EnumAdapter.java +++ /dev/null @@ -1,40 +0,0 @@ -/* -Copyright 2014 Prateek Srivastava - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -This file may have been modified after being copied from it's original source. - */ -package com.f2prateek.rx.preferences; - -import android.content.SharedPreferences; -import android.support.annotation.NonNull; - -final class EnumAdapter> implements Preference.Adapter { - private final Class enumClass; - - EnumAdapter(Class enumClass) { - this.enumClass = enumClass; - } - - @Override public T get(@NonNull String key, @NonNull SharedPreferences preferences) { - String value = preferences.getString(key, null); - assert value != null; // Not called unless key is present. - return Enum.valueOf(enumClass, value); - } - - @Override - public void set(@NonNull String key, @NonNull T value, @NonNull SharedPreferences.Editor editor) { - editor.putString(key, value.name()); - } -} diff --git a/AndroidCompat/src/main/java/com/f2prateek/rx/preferences/FloatAdapter.java b/AndroidCompat/src/main/java/com/f2prateek/rx/preferences/FloatAdapter.java deleted file mode 100644 index 9a749f19..00000000 --- a/AndroidCompat/src/main/java/com/f2prateek/rx/preferences/FloatAdapter.java +++ /dev/null @@ -1,34 +0,0 @@ -/* -Copyright 2014 Prateek Srivastava - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -This file may have been modified after being copied from it's original source. - */ -package com.f2prateek.rx.preferences; - -import android.content.SharedPreferences; -import android.support.annotation.NonNull; - -final class FloatAdapter implements Preference.Adapter { - static final FloatAdapter INSTANCE = new FloatAdapter(); - - @Override public Float get(@NonNull String key, @NonNull SharedPreferences preferences) { - return preferences.getFloat(key, 0f); - } - - @Override public void set(@NonNull String key, @NonNull Float value, - @NonNull SharedPreferences.Editor editor) { - editor.putFloat(key, value); - } -} diff --git a/AndroidCompat/src/main/java/com/f2prateek/rx/preferences/IntegerAdapter.java b/AndroidCompat/src/main/java/com/f2prateek/rx/preferences/IntegerAdapter.java deleted file mode 100644 index efda9d99..00000000 --- a/AndroidCompat/src/main/java/com/f2prateek/rx/preferences/IntegerAdapter.java +++ /dev/null @@ -1,34 +0,0 @@ -/* -Copyright 2014 Prateek Srivastava - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -This file may have been modified after being copied from it's original source. - */ -package com.f2prateek.rx.preferences; - -import android.content.SharedPreferences; -import android.support.annotation.NonNull; - -final class IntegerAdapter implements Preference.Adapter { - static final IntegerAdapter INSTANCE = new IntegerAdapter(); - - @Override public Integer get(@NonNull String key, @NonNull SharedPreferences preferences) { - return preferences.getInt(key, 0); - } - - @Override public void set(@NonNull String key, @NonNull Integer value, - @NonNull SharedPreferences.Editor editor) { - editor.putInt(key, value); - } -} diff --git a/AndroidCompat/src/main/java/com/f2prateek/rx/preferences/LongAdapter.java b/AndroidCompat/src/main/java/com/f2prateek/rx/preferences/LongAdapter.java deleted file mode 100644 index 7c5d452f..00000000 --- a/AndroidCompat/src/main/java/com/f2prateek/rx/preferences/LongAdapter.java +++ /dev/null @@ -1,34 +0,0 @@ -/* -Copyright 2014 Prateek Srivastava - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -This file may have been modified after being copied from it's original source. - */ -package com.f2prateek.rx.preferences; - -import android.content.SharedPreferences; -import android.support.annotation.NonNull; - -final class LongAdapter implements Preference.Adapter { - static final LongAdapter INSTANCE = new LongAdapter(); - - @Override public Long get(@NonNull String key, @NonNull SharedPreferences preferences) { - return preferences.getLong(key, 0L); - } - - @Override public void set(@NonNull String key, @NonNull Long value, - @NonNull SharedPreferences.Editor editor) { - editor.putLong(key, value); - } -} diff --git a/AndroidCompat/src/main/java/com/f2prateek/rx/preferences/Preference.java b/AndroidCompat/src/main/java/com/f2prateek/rx/preferences/Preference.java deleted file mode 100644 index cfdafb63..00000000 --- a/AndroidCompat/src/main/java/com/f2prateek/rx/preferences/Preference.java +++ /dev/null @@ -1,127 +0,0 @@ -/* -Copyright 2014 Prateek Srivastava - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -This file has been modified after being copied from it's original source. - */ -package com.f2prateek.rx.preferences; - -import android.content.SharedPreferences; -import android.support.annotation.CheckResult; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import rx.Observable; -import rx.functions.Action1; - -/** A preference of type {@link T}. Instances can be created from {@link RxSharedPreferences}. */ -public final class Preference { - /** Stores and retrieves instances of {@code T} in {@link SharedPreferences}. */ - public interface Adapter { - /** Retrieve the value for {@code key} from {@code preferences}. */ - T get(@NonNull String key, @NonNull SharedPreferences preferences); - - /** - * Store non-null {@code value} for {@code key} in {@code editor}. - *

- * Note: Implementations must not call {@code commit()} or {@code apply()} on - * {@code editor}. - */ - void set(@NonNull String key, @NonNull T value, @NonNull SharedPreferences.Editor editor); - } - - private final SharedPreferences preferences; - private final String key; - private final T defaultValue; - private final Adapter adapter; - private final Observable values; - - Preference(SharedPreferences preferences, final String key, T defaultValue, Adapter adapter, - Observable keyChanges) { - this.preferences = preferences; - this.key = key; - this.defaultValue = defaultValue; - this.adapter = adapter; - this.values = keyChanges - .filter(key::equals) - .startWith("") // Dummy value to trigger initial load. - .onBackpressureLatest() - .map(ignored -> get()); - } - - /** The key for which this preference will store and retrieve values. */ - @NonNull - public String key() { - return key; - } - - /** The value used if none is stored. May be {@code null}. */ - @Nullable - public T defaultValue() { - return defaultValue; - } - - /** - * Retrieve the current value for this preference. Returns {@link #defaultValue()} if no value is - * set. - */ - @Nullable - public T get() { - if (!preferences.contains(key)) { - return defaultValue; - } - return adapter.get(key, preferences); - } - - /** - * Change this preference's stored value to {@code value}. A value of {@code null} will delete the - * preference. - */ - public void set(@Nullable T value) { - SharedPreferences.Editor editor = preferences.edit(); - if (value == null) { - editor.remove(key); - } else { - adapter.set(key, value, editor); - } - editor.apply(); - } - - /** Returns true if this preference has a stored value. */ - public boolean isSet() { - return preferences.contains(key); - } - - /** Delete the stored value for this preference, if any. */ - public void delete() { - set(null); - } - - /** - * Observe changes to this preference. The current value or {@link #defaultValue()} will be - * emitted on first subscribe. - */ - @CheckResult @NonNull - public Observable asObservable() { - return values; - } - - /** - * An action which stores a new value for this preference. Passing {@code null} will delete the - * preference. - */ - @CheckResult @NonNull - public Action1 asAction() { - return (Action1) this::set; - } -} diff --git a/AndroidCompat/src/main/java/com/f2prateek/rx/preferences/RxSharedPreferences.java b/AndroidCompat/src/main/java/com/f2prateek/rx/preferences/RxSharedPreferences.java deleted file mode 100644 index 824e801c..00000000 --- a/AndroidCompat/src/main/java/com/f2prateek/rx/preferences/RxSharedPreferences.java +++ /dev/null @@ -1,178 +0,0 @@ -/* -Copyright 2014 Prateek Srivastava - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -This file has been modified after being copied from it's original source. - */ -package com.f2prateek.rx.preferences; - -import android.annotation.TargetApi; -import android.content.SharedPreferences; -import android.content.SharedPreferences.OnSharedPreferenceChangeListener; -import android.support.annotation.CheckResult; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import java.util.Collections; -import java.util.Set; -import rx.Observable; -import rx.subscriptions.Subscriptions; - -import static android.os.Build.VERSION_CODES.HONEYCOMB; -import static com.f2prateek.rx.preferences.Preconditions.checkNotNull; - -/** A factory for reactive {@link Preference} objects. */ -public final class RxSharedPreferences { - private static final Float DEFAULT_FLOAT = 0f; - private static final Integer DEFAULT_INTEGER = 0; - private static final Boolean DEFAULT_BOOLEAN = Boolean.FALSE; - private static final Long DEFAULT_LONG = 0L; - - /** Create an instance of {@link RxSharedPreferences} for {@code preferences}. */ - @CheckResult @NonNull - public static RxSharedPreferences create(@NonNull SharedPreferences preferences) { - checkNotNull(preferences, "preferences == null"); - return new RxSharedPreferences(preferences); - } - - private final SharedPreferences preferences; - private final Observable keyChanges; - - private RxSharedPreferences(final SharedPreferences preferences) { - this.preferences = preferences; - this.keyChanges = Observable.create((Observable.OnSubscribe) subscriber -> { - final OnSharedPreferenceChangeListener listener = (preferences1, key) -> subscriber.onNext(key); - - preferences.registerOnSharedPreferenceChangeListener(listener); - - subscriber.add(Subscriptions.create(() -> preferences.unregisterOnSharedPreferenceChangeListener(listener))); - }).share(); - } - - /** Create a boolean preference for {@code key}. Default is {@code false}. */ - @CheckResult @NonNull - public Preference getBoolean(@NonNull String key) { - return getBoolean(key, DEFAULT_BOOLEAN); - } - - /** Create a boolean preference for {@code key} with a default of {@code defaultValue}. */ - @CheckResult @NonNull - public Preference getBoolean(@NonNull String key, @Nullable Boolean defaultValue) { - checkNotNull(key, "key == null"); - return new Preference<>(preferences, key, defaultValue, BooleanAdapter.INSTANCE, keyChanges); - } - - /** Create an enum preference for {@code key}. Default is {@code null}. */ - @CheckResult @NonNull - public > Preference getEnum(@NonNull String key, - @NonNull Class enumClass) { - return getEnum(key, null, enumClass); - } - - /** Create an enum preference for {@code key} with a default of {@code defaultValue}. */ - @CheckResult @NonNull - public > Preference getEnum(@NonNull String key, @Nullable T defaultValue, - @NonNull Class enumClass) { - checkNotNull(key, "key == null"); - checkNotNull(enumClass, "enumClass == null"); - Preference.Adapter adapter = new EnumAdapter<>(enumClass); - return new Preference<>(preferences, key, defaultValue, adapter, keyChanges); - } - - /** Create a float preference for {@code key}. Default is {@code 0}. */ - @CheckResult @NonNull - public Preference getFloat(@NonNull String key) { - return getFloat(key, DEFAULT_FLOAT); - } - - /** Create a float preference for {@code key} with a default of {@code defaultValue}. */ - @CheckResult @NonNull - public Preference getFloat(@NonNull String key, @Nullable Float defaultValue) { - checkNotNull(key, "key == null"); - return new Preference<>(preferences, key, defaultValue, FloatAdapter.INSTANCE, keyChanges); - } - - /** Create an integer preference for {@code key}. Default is {@code 0}. */ - @CheckResult @NonNull - public Preference getInteger(@NonNull String key) { - //noinspection UnnecessaryBoxing - return getInteger(key, DEFAULT_INTEGER); - } - - /** Create an integer preference for {@code key} with a default of {@code defaultValue}. */ - @CheckResult @NonNull - public Preference getInteger(@NonNull String key, @Nullable Integer defaultValue) { - checkNotNull(key, "key == null"); - return new Preference<>(preferences, key, defaultValue, IntegerAdapter.INSTANCE, keyChanges); - } - - /** Create a long preference for {@code key}. Default is {@code 0}. */ - @CheckResult @NonNull - public Preference getLong(@NonNull String key) { - //noinspection UnnecessaryBoxing - return getLong(key, DEFAULT_LONG); - } - - /** Create a long preference for {@code key} with a default of {@code defaultValue}. */ - @CheckResult @NonNull - public Preference getLong(@NonNull String key, @Nullable Long defaultValue) { - checkNotNull(key, "key == null"); - return new Preference<>(preferences, key, defaultValue, LongAdapter.INSTANCE, keyChanges); - } - - /** Create a preference of type {@code T} for {@code key}. Default is {@code null}. */ - @CheckResult @NonNull - public Preference getObject(@NonNull String key, @NonNull Preference.Adapter adapter) { - return getObject(key, null, adapter); - } - - /** - * Create a preference for type {@code T} for {@code key} with a default of {@code defaultValue}. - */ - @CheckResult @NonNull - public Preference getObject(@NonNull String key, @Nullable T defaultValue, - @NonNull Preference.Adapter adapter) { - checkNotNull(key, "key == null"); - checkNotNull(adapter, "adapter == null"); - return new Preference<>(preferences, key, defaultValue, adapter, keyChanges); - } - - /** Create a string preference for {@code key}. Default is {@code null}. */ - @CheckResult @NonNull - public Preference getString(@NonNull String key) { - return getString(key, null); - } - - /** Create a string preference for {@code key} with a default of {@code defaultValue}. */ - @CheckResult @NonNull - public Preference getString(@NonNull String key, @Nullable String defaultValue) { - checkNotNull(key, "key == null"); - return new Preference<>(preferences, key, defaultValue, StringAdapter.INSTANCE, keyChanges); - } - - /** Create a string set preference for {@code key}. Default is an empty set. */ - @TargetApi(HONEYCOMB) - @CheckResult @NonNull - public Preference> getStringSet(@NonNull String key) { - return getStringSet(key, Collections.emptySet()); - } - - /** Create a string set preference for {@code key} with a default of {@code defaultValue}. */ - @TargetApi(HONEYCOMB) - @CheckResult @NonNull - public Preference> getStringSet(@NonNull String key, - @NonNull Set defaultValue) { - checkNotNull(key, "key == null"); - return new Preference<>(preferences, key, defaultValue, StringSetAdapter.INSTANCE, keyChanges); - } -} diff --git a/AndroidCompat/src/main/java/com/f2prateek/rx/preferences/StringAdapter.java b/AndroidCompat/src/main/java/com/f2prateek/rx/preferences/StringAdapter.java deleted file mode 100644 index e95747a7..00000000 --- a/AndroidCompat/src/main/java/com/f2prateek/rx/preferences/StringAdapter.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.f2prateek.rx.preferences; - -import android.content.SharedPreferences; -import android.support.annotation.NonNull; - -final class StringAdapter implements Preference.Adapter { - static final StringAdapter INSTANCE = new StringAdapter(); - - @Override public String get(@NonNull String key, @NonNull SharedPreferences preferences) { - return preferences.getString(key, null); - } - - @Override public void set(@NonNull String key, @NonNull String value, - @NonNull SharedPreferences.Editor editor) { - editor.putString(key, value); - } -} diff --git a/AndroidCompat/src/main/java/com/f2prateek/rx/preferences/StringSetAdapter.java b/AndroidCompat/src/main/java/com/f2prateek/rx/preferences/StringSetAdapter.java deleted file mode 100644 index 3ebab280..00000000 --- a/AndroidCompat/src/main/java/com/f2prateek/rx/preferences/StringSetAdapter.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.f2prateek.rx.preferences; - -import android.annotation.TargetApi; -import android.content.SharedPreferences; -import android.support.annotation.NonNull; -import java.util.Set; - -import static android.os.Build.VERSION_CODES.HONEYCOMB; - -@TargetApi(HONEYCOMB) -final class StringSetAdapter implements Preference.Adapter> { - static final StringSetAdapter INSTANCE = new StringSetAdapter(); - - @Override public Set get(@NonNull String key, @NonNull SharedPreferences preferences) { - return preferences.getStringSet(key, null); - } - - @Override public void set(@NonNull String key, @NonNull Set value, - @NonNull SharedPreferences.Editor editor) { - editor.putStringSet(key, value); - } -} diff --git a/AndroidCompat/src/main/java/com/github/pwittchen/reactivenetwork/library/Connectivity.kt b/AndroidCompat/src/main/java/com/github/pwittchen/reactivenetwork/library/Connectivity.kt deleted file mode 100644 index 725c6869..00000000 --- a/AndroidCompat/src/main/java/com/github/pwittchen/reactivenetwork/library/Connectivity.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.github.pwittchen.reactivenetwork.library - -import android.net.NetworkInfo - -class Connectivity { - val state = NetworkInfo.State.CONNECTED -} diff --git a/AndroidCompat/src/main/java/com/github/pwittchen/reactivenetwork/library/ReactiveNetwork.kt b/AndroidCompat/src/main/java/com/github/pwittchen/reactivenetwork/library/ReactiveNetwork.kt deleted file mode 100644 index a278a844..00000000 --- a/AndroidCompat/src/main/java/com/github/pwittchen/reactivenetwork/library/ReactiveNetwork.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.github.pwittchen.reactivenetwork.library - -import android.content.Context -import rx.Observable - -/** - * Created by nulldev on 12/29/16. - */ - -class ReactiveNetwork { - companion object { - fun observeNetworkConnectivity(context: Context) = Observable.just(Connectivity())!! - } -} diff --git a/server/build.gradle.kts b/server/build.gradle.kts index 7293851a..72bf2809 100644 --- a/server/build.gradle.kts +++ b/server/build.gradle.kts @@ -102,7 +102,7 @@ sourceSets { // should be bumped with each stable release val tachideskVersion = System.getenv("ProductVersion") ?: "v0.4.4" -val webUIRevisionTag = System.getenv("WebUIRevision") ?: "r22" +val webUIRevisionTag = System.getenv("WebUIRevision") ?: "r23" // counts commit count on master val tachideskRevision = runCatching { @@ -172,7 +172,6 @@ tasks { withType { destinationDirectory.set(File("$rootDir/server/build")) - dependsOn("formatKotlin", "lintKotlin") } named("run") { diff --git a/AndroidCompat/src/main/java/com/f2prateek/rx/preferences/Preconditions.java b/server/src/main/kotlin/eu/kanade/tachiyomi/LICENSE similarity index 51% rename from AndroidCompat/src/main/java/com/f2prateek/rx/preferences/Preconditions.java rename to server/src/main/kotlin/eu/kanade/tachiyomi/LICENSE index b4441fc9..68e745e9 100644 --- a/AndroidCompat/src/main/java/com/f2prateek/rx/preferences/Preconditions.java +++ b/server/src/main/kotlin/eu/kanade/tachiyomi/LICENSE @@ -1,30 +1,13 @@ -/* -Copyright 2014 Prateek Srivastava +Copyright 2015 Javier Tomás Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 +http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - -This file may have been modified after being copied from it's original source. - */ -package com.f2prateek.rx.preferences; - -final class Preconditions { - static void checkNotNull(Object o, String message) { - if (o == null) { - throw new NullPointerException(message); - } - } - - private Preconditions() { - throw new AssertionError("No instances"); - } -} diff --git a/server/src/main/kotlin/eu/kanade/tachiyomi/animesource/AnimeCatalogueSource.kt b/server/src/main/kotlin/eu/kanade/tachiyomi/animesource/AnimeCatalogueSource.kt index dc95193c..67d99256 100644 --- a/server/src/main/kotlin/eu/kanade/tachiyomi/animesource/AnimeCatalogueSource.kt +++ b/server/src/main/kotlin/eu/kanade/tachiyomi/animesource/AnimeCatalogueSource.kt @@ -9,7 +9,7 @@ interface AnimeCatalogueSource : AnimeSource { /** * An ISO 639-1 compliant language code (two letters in lower case). */ - val lang: String + override val lang: String /** * Whether the source has support for latest updates. diff --git a/server/src/main/kotlin/eu/kanade/tachiyomi/animesource/AnimeSource.kt b/server/src/main/kotlin/eu/kanade/tachiyomi/animesource/AnimeSource.kt index 3ac73ada..59274a59 100644 --- a/server/src/main/kotlin/eu/kanade/tachiyomi/animesource/AnimeSource.kt +++ b/server/src/main/kotlin/eu/kanade/tachiyomi/animesource/AnimeSource.kt @@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.animesource import eu.kanade.tachiyomi.animesource.model.SAnime import eu.kanade.tachiyomi.animesource.model.SEpisode +import eu.kanade.tachiyomi.animesource.model.Video import rx.Observable /** @@ -19,6 +20,9 @@ interface AnimeSource { */ val name: String + val lang: String + get() = "" + /** * Returns an observable with the updated details for a anime. * @@ -36,12 +40,12 @@ interface AnimeSource { fun fetchEpisodeList(anime: SAnime): Observable> /** - * Returns an observable with a link for the episode of an anime. + * Returns an observable with a list of video for the episode of an anime. * * @param episode the episode to get the link for. */ // @Deprecated("Use getEpisodeList instead") - fun fetchEpisodeLink(episode: SEpisode): Observable + fun fetchVideoList(episode: SEpisode): Observable> // /** // * [1.x API] Get the updated details for a anime. @@ -74,4 +78,4 @@ interface AnimeSource { // fun AnimeSource.icon(): Drawable? = Injekt.get().getAppIconForSource(this) -// fun AnimeSource.getPreferenceKey(): String = "source_$id" +fun AnimeSource.getPreferenceKey(): String = "source_$id" diff --git a/server/src/main/kotlin/eu/kanade/tachiyomi/animesource/AnimeSourceManager.kt b/server/src/main/kotlin/eu/kanade/tachiyomi/animesource/AnimeSourceManager.kt deleted file mode 100644 index 9838e71d..00000000 --- a/server/src/main/kotlin/eu/kanade/tachiyomi/animesource/AnimeSourceManager.kt +++ /dev/null @@ -1,76 +0,0 @@ -package eu.kanade.tachiyomi.animesource - -import android.content.Context -import eu.kanade.tachiyomi.animesource.model.SAnime -import eu.kanade.tachiyomi.animesource.model.SEpisode -import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource -import rx.Observable - -open class AnimeSourceManager(private val context: Context) { - - private val sourcesMap = mutableMapOf() - - private val stubSourcesMap = mutableMapOf() - - init { - createInternalSources().forEach { registerSource(it) } - } - - open fun get(sourceKey: Long): AnimeSource? { - return sourcesMap[sourceKey] - } - - fun getOrStub(sourceKey: Long): AnimeSource { - return sourcesMap[sourceKey] ?: stubSourcesMap.getOrPut(sourceKey) { - StubSource(sourceKey) - } - } - - fun getOnlineSources() = sourcesMap.values.filterIsInstance() - - fun getCatalogueSources() = sourcesMap.values.filterIsInstance() - - internal fun registerSource(source: AnimeSource) { - if (!sourcesMap.containsKey(source.id)) { - sourcesMap[source.id] = source - } - if (!stubSourcesMap.containsKey(source.id)) { - stubSourcesMap[source.id] = StubSource(source.id) - } - } - - internal fun unregisterSource(source: AnimeSource) { - sourcesMap.remove(source.id) - } - - private fun createInternalSources(): List = listOf( -// LocalAnimeSource(context) - ) - - inner class StubSource(override val id: Long) : AnimeSource { - - override val name: String - get() = id.toString() - - override fun fetchAnimeDetails(anime: SAnime): Observable { - return Observable.error(getSourceNotInstalledException()) - } - - override fun fetchEpisodeList(anime: SAnime): Observable> { - return Observable.error(getSourceNotInstalledException()) - } - - override fun fetchEpisodeLink(episode: SEpisode): Observable { - return Observable.error(getSourceNotInstalledException()) - } - - override fun toString(): String { - return name - } - - private fun getSourceNotInstalledException(): Exception { -// return Exception(context.getString(R.string.source_not_installed, id.toString())) - return Exception("source not found") - } - } -} diff --git a/server/src/main/kotlin/eu/kanade/tachiyomi/animesource/model/SAnime.kt b/server/src/main/kotlin/eu/kanade/tachiyomi/animesource/model/SAnime.kt index 15577f7a..2c37a009 100644 --- a/server/src/main/kotlin/eu/kanade/tachiyomi/animesource/model/SAnime.kt +++ b/server/src/main/kotlin/eu/kanade/tachiyomi/animesource/model/SAnime.kt @@ -1,5 +1,6 @@ package eu.kanade.tachiyomi.animesource.model +// import tachiyomi.animesource.model.AnimeInfo import java.io.Serializable interface SAnime : Serializable { @@ -23,9 +24,7 @@ interface SAnime : Serializable { var initialized: Boolean fun copyFrom(other: SAnime) { - if (other.title != null) { - title = other.title - } + title = other.title if (other.author != null) { author = other.author @@ -65,3 +64,30 @@ interface SAnime : Serializable { } } } + +// fun SAnime.toAnimeInfo(): AnimeInfo { +// return AnimeInfo( +// key = this.url, +// title = this.title, +// artist = this.artist ?: "", +// author = this.author ?: "", +// description = this.description ?: "", +// genres = this.genre?.split(", ") ?: emptyList(), +// status = this.status, +// cover = this.thumbnail_url ?: "" +// ) +// } + +// fun AnimeInfo.toSAnime(): SAnime { +// val animeInfo = this +// return SAnime.create().apply { +// url = animeInfo.key +// title = animeInfo.title +// artist = animeInfo.artist +// author = animeInfo.author +// description = animeInfo.description +// genre = animeInfo.genres.joinToString(", ") +// status = animeInfo.status +// thumbnail_url = animeInfo.cover +// } +// } diff --git a/server/src/main/kotlin/eu/kanade/tachiyomi/animesource/model/SEpisode.kt b/server/src/main/kotlin/eu/kanade/tachiyomi/animesource/model/SEpisode.kt index f1fac239..b1a11099 100644 --- a/server/src/main/kotlin/eu/kanade/tachiyomi/animesource/model/SEpisode.kt +++ b/server/src/main/kotlin/eu/kanade/tachiyomi/animesource/model/SEpisode.kt @@ -1,5 +1,6 @@ package eu.kanade.tachiyomi.animesource.model +// import tachiyomi.animesource.model.EpisodeInfo import java.io.Serializable interface SEpisode : Serializable { @@ -28,3 +29,24 @@ interface SEpisode : Serializable { } } } + +// fun SEpisode.toEpisodeInfo(): EpisodeInfo { +// return EpisodeInfo( +// dateUpload = this.date_upload, +// key = this.url, +// name = this.name, +// number = this.episode_number, +// scanlator = this.scanlator ?: "" +// ) +// } +// +// fun EpisodeInfo.toSEpisode(): SEpisode { +// val episode = this +// return SEpisode.create().apply { +// url = episode.key +// name = episode.name +// date_upload = episode.dateUpload +// episode_number = episode.number +// scanlator = episode.scanlator +// } +// } diff --git a/server/src/main/kotlin/eu/kanade/tachiyomi/animesource/model/Video.kt b/server/src/main/kotlin/eu/kanade/tachiyomi/animesource/model/Video.kt new file mode 100644 index 00000000..ddca7205 --- /dev/null +++ b/server/src/main/kotlin/eu/kanade/tachiyomi/animesource/model/Video.kt @@ -0,0 +1,73 @@ +package eu.kanade.tachiyomi.animesource.model + +import android.net.Uri +import eu.kanade.tachiyomi.network.ProgressListener +import rx.subjects.Subject +// import tachiyomi.animesource.model.VideoUrl + +open class Video( + val url: String = "", + val quality: String = "", + var videoUrl: String? = null, + @Transient var uri: Uri? = null // Deprecated but can't be deleted due to extensions +) : ProgressListener { + + @Transient + @Volatile + var status: Int = 0 + set(value) { + field = value + statusSubject?.onNext(value) + statusCallback?.invoke(this) + } + + @Transient + @Volatile + var progress: Int = 0 + set(value) { + field = value + statusCallback?.invoke(this) + } + + @Transient + private var statusSubject: Subject? = null + + @Transient + private var statusCallback: ((Video) -> Unit)? = null + + override fun update(bytesRead: Long, contentLength: Long, done: Boolean) { + progress = if (contentLength > 0) { + (100 * bytesRead / contentLength).toInt() + } else { + -1 + } + } + + fun setStatusSubject(subject: Subject?) { + this.statusSubject = subject + } + + fun setStatusCallback(f: ((Video) -> Unit)?) { + statusCallback = f + } + + companion object { + const val QUEUE = 0 + const val LOAD_VIDEO = 1 + const val DOWNLOAD_IMAGE = 2 + const val READY = 3 + const val ERROR = 4 + } +} + +// fun Video.toVideoUrl(): VideoUrl { +// return VideoUrl( +// url = this.videoUrl ?: this.url +// ) +// } +// +// fun VideoUrl.toVideo(index: Int): Video { +// return Video( +// videoUrl = this.url +// ) +// } diff --git a/server/src/main/kotlin/eu/kanade/tachiyomi/animesource/online/AnimeHttpSource.kt b/server/src/main/kotlin/eu/kanade/tachiyomi/animesource/online/AnimeHttpSource.kt index 028103c7..0810a931 100644 --- a/server/src/main/kotlin/eu/kanade/tachiyomi/animesource/online/AnimeHttpSource.kt +++ b/server/src/main/kotlin/eu/kanade/tachiyomi/animesource/online/AnimeHttpSource.kt @@ -5,11 +5,11 @@ import eu.kanade.tachiyomi.animesource.model.AnimeFilterList import eu.kanade.tachiyomi.animesource.model.AnimesPage import eu.kanade.tachiyomi.animesource.model.SAnime import eu.kanade.tachiyomi.animesource.model.SEpisode +import eu.kanade.tachiyomi.animesource.model.Video import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.NetworkHelper import eu.kanade.tachiyomi.network.asObservableSuccess import eu.kanade.tachiyomi.network.newCallWithProgress -import eu.kanade.tachiyomi.source.model.Page import okhttp3.Headers import okhttp3.OkHttpClient import okhttp3.Request @@ -218,14 +218,6 @@ abstract class AnimeHttpSource : AnimeCatalogueSource { } } - override fun fetchEpisodeLink(episode: SEpisode): Observable { - return client.newCall(episodeLinkRequest(episode)) - .asObservableSuccess() - .map { response -> - episodeLinkParse(response) - } - } - /** * Returns the request for updating the episode list. Override only if it's needed to override * the url, send different headers or request method like POST. @@ -236,16 +228,6 @@ abstract class AnimeHttpSource : AnimeCatalogueSource { return GET(baseUrl + anime.url, headers) } - /** - * Returns the request for getting the episode link. Override only if it's needed to override - * the url, send different headers or request method like POST. - * - * @param episode the episode to look for links. - */ - protected open fun episodeLinkRequest(episode: SEpisode): Request { - return GET(baseUrl + episode.url, headers) - } - /** * Parses the response from the site and returns a list of episodes. * @@ -254,19 +236,25 @@ abstract class AnimeHttpSource : AnimeCatalogueSource { protected abstract fun episodeListParse(response: Response): List /** - * Parses the response from the site and returns a list of episodes. + * Returns an observable with the page list for a chapter. * - * @param response the response from the site. + * @param chapter the chapter whose page list has to be fetched. */ - protected abstract fun episodeLinkParse(response: Response): String + override fun fetchVideoList(episode: SEpisode): Observable> { + return client.newCall(videoListRequest(episode)) + .asObservableSuccess() + .map { response -> + videoListParse(response) + } + } /** - * Returns the request for getting the page list. Override only if it's needed to override the - * url, send different headers or request method like POST. + * Returns the request for getting the episode link. Override only if it's needed to override + * the url, send different headers or request method like POST. * - * @param episode the episode whose page list has to be fetched. + * @param episode the episode to look for links. */ - protected open fun pageListRequest(episode: SEpisode): Request { + protected open fun videoListRequest(episode: SEpisode): Request { return GET(baseUrl + episode.url, headers) } @@ -275,7 +263,7 @@ abstract class AnimeHttpSource : AnimeCatalogueSource { * * @param response the response from the site. */ - protected abstract fun pageListParse(response: Response): List + protected abstract fun videoListParse(response: Response): List