mirror of
https://github.com/tachiyomiorg/tachiyomi-extensions-inspector.git
synced 2024-10-31 22:45:06 +01:00
Fixes and Updates (#3)
* Update AndroidCompat to recent Tachidesk * Add StubbedCookieManager * Fix main thread scheduler
This commit is contained in:
parent
e9b9efcf31
commit
6d16266029
@ -1,4 +0,0 @@
|
||||
dependencies {
|
||||
// Config API, moved to the global build.gradle
|
||||
// implementation("com.typesafe:config:1.4.0")
|
||||
}
|
@ -12,7 +12,6 @@ import com.typesafe.config.Config
|
||||
import com.typesafe.config.ConfigFactory
|
||||
import com.typesafe.config.ConfigRenderOptions
|
||||
import mu.KotlinLogging
|
||||
import java.io.File
|
||||
|
||||
/**
|
||||
* Manages app config.
|
||||
@ -35,6 +34,7 @@ open class ConfigManager {
|
||||
/**
|
||||
* Get a config module (Java API)
|
||||
*/
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
fun <T : ConfigModule> module(type: Class<T>): T = loadedModules[type] as T
|
||||
|
||||
/**
|
||||
|
@ -1,8 +1,15 @@
|
||||
package xyz.nulldev.ts.config
|
||||
|
||||
/*
|
||||
* Copyright (C) Contributors to the Suwayomi project
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
import com.typesafe.config.Config
|
||||
|
||||
/**
|
||||
* Abstract config module.
|
||||
*/
|
||||
abstract class ConfigModule(config: Config)
|
||||
abstract class ConfigModule(config: Config, moduleName: String = "")
|
@ -8,7 +8,6 @@ package xyz.nulldev.ts.config
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
import ch.qos.logback.classic.Level
|
||||
import com.typesafe.config.Config
|
||||
import mu.KotlinLogging
|
||||
import org.slf4j.Logger
|
||||
|
||||
|
@ -1 +0,0 @@
|
||||
xyz.nulldev.ts.api.v2.java.impl.ServerAPIImpl
|
Binary file not shown.
Before Width: | Height: | Size: 2.4 KiB |
Binary file not shown.
Before Width: | Height: | Size: 6.9 KiB |
Binary file not shown.
Before Width: | Height: | Size: 2.2 KiB |
File diff suppressed because one or more lines are too long
@ -1,22 +0,0 @@
|
||||
[
|
||||
{
|
||||
"label": "Sync",
|
||||
"icon": "import_export",
|
||||
"type": "nested",
|
||||
"prefs": []
|
||||
},
|
||||
{
|
||||
"label": "Server",
|
||||
"icon": "dns",
|
||||
"type": "nested",
|
||||
"prefs": [
|
||||
{
|
||||
"label": "Password authentication",
|
||||
"type": "text-password",
|
||||
"default": "",
|
||||
"key": "pref_ts_server_password",
|
||||
"hint": "Enter a password"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
@ -20,18 +20,11 @@ dependencies {
|
||||
// Android stub library
|
||||
implementation(fileTree("lib/"))
|
||||
|
||||
|
||||
// Android JAR libs
|
||||
// compileOnly( fileTree(dir: new File(rootProject.rootDir, "libs/other"), include: "*.jar")
|
||||
|
||||
// JSON
|
||||
compileOnly( "com.google.code.gson:gson:2.8.6")
|
||||
|
||||
// Javassist
|
||||
compileOnly( "org.javassist:javassist:3.27.0-GA")
|
||||
compileOnly("com.google.code.gson:gson:2.8.6")
|
||||
|
||||
// XML
|
||||
compileOnly( group= "xmlpull", name= "xmlpull", version= "1.1.3.1")
|
||||
compileOnly(group= "xmlpull", name= "xmlpull", version= "1.1.3.1")
|
||||
|
||||
// Config API
|
||||
implementation(project(":AndroidCompat:Config"))
|
||||
@ -40,18 +33,19 @@ dependencies {
|
||||
compileOnly("com.android.tools.build:apksig:4.2.0-alpha13")
|
||||
|
||||
// AndroidX annotations
|
||||
compileOnly( "androidx.annotation:annotation:1.2.0-alpha01")
|
||||
compileOnly("androidx.annotation:annotation:1.2.0-alpha01")
|
||||
|
||||
// substitute for duktape-android
|
||||
// 'org.mozilla:rhino' includes some code that we don't need so use 'org.mozilla:rhino-runtime' instead
|
||||
implementation("org.mozilla:rhino-runtime:1.7.13")
|
||||
// 'org.mozilla:rhino-engine' provides the same interface as 'javax.script' a.k.a Nashorn
|
||||
implementation("org.mozilla:rhino-engine:1.7.13")
|
||||
implementation("org.mozilla:rhino-runtime:1.7.13") // slimmer version of 'org.mozilla:rhino'
|
||||
implementation("org.mozilla:rhino-engine:1.7.13") // provides the same interface as 'javax.script' a.k.a Nashorn
|
||||
|
||||
// Kotlin wrapper around Java Preferences, makes certain things easier
|
||||
val multiplatformSettingsVersion = "0.7.7"
|
||||
implementation("com.russhwolf:multiplatform-settings-jvm:$multiplatformSettingsVersion")
|
||||
implementation("com.russhwolf:multiplatform-settings-serialization-jvm:$multiplatformSettingsVersion")
|
||||
|
||||
// Android version of SimpleDateFormat
|
||||
implementation("com.ibm.icu:icu4j:69.1")
|
||||
}
|
||||
|
||||
tasks {
|
||||
|
@ -15,7 +15,7 @@ Write-Output "Getting required Android.jar..."
|
||||
Remove-Item -Recurse -Force "tmp" -ErrorAction SilentlyContinue | Out-Null
|
||||
New-Item -ItemType Directory -Force -Path "tmp" | Out-Null
|
||||
|
||||
$androidEncoded = (Invoke-WebRequest -Uri "https://android.googlesource.com/platform/prebuilts/sdk/+/3b8a524d25fa6c3d795afb1eece3f24870c60988/27/public/android.jar?format=TEXT" -UseBasicParsing).content
|
||||
$androidEncoded = (Invoke-WebRequest -Uri "https://android.googlesource.com/platform/prebuilts/sdk/+/6cd31be5e4e25901aadf838120d71a79b46d9add/30/public/android.jar?format=TEXT" -UseBasicParsing).content
|
||||
|
||||
$android_jar = (Get-Location).Path + "\tmp\android.jar"
|
||||
|
||||
|
@ -13,7 +13,7 @@ do
|
||||
which $dep >/dev/null 2>&1 || { echo >&2 "Error: This script needs $dep installed."; abort=yes; }
|
||||
done
|
||||
|
||||
if [ $abort = yes ]; then
|
||||
if [ "$abort" = yes ]; then
|
||||
echo "Some of the dependencies didn't exist. Aborting."
|
||||
exit 1
|
||||
fi
|
||||
@ -30,7 +30,7 @@ rm -rf "tmp"
|
||||
mkdir -p "tmp"
|
||||
pushd "tmp"
|
||||
|
||||
curl "https://android.googlesource.com/platform/prebuilts/sdk/+/3b8a524d25fa6c3d795afb1eece3f24870c60988/27/public/android.jar?format=TEXT" | base64 --decode > android.jar
|
||||
curl "https://android.googlesource.com/platform/prebuilts/sdk/+/6cd31be5e4e25901aadf838120d71a79b46d9add/30/public/android.jar?format=TEXT" | base64 --decode > android.jar
|
||||
|
||||
# We need to remove any stub classes that we have implementations for
|
||||
echo "Patching JAR..."
|
||||
|
@ -1,291 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2012 The Android Open Source Project
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package android.support.v4.content;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Bundle;
|
||||
import android.os.StatFs;
|
||||
import android.support.v4.os.EnvironmentCompat;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
/**
|
||||
* Helper for accessing features in {@link android.content.Context}
|
||||
* introduced after API level 4 in a backwards compatible fashion.
|
||||
*/
|
||||
public class ContextCompat {
|
||||
/**
|
||||
* Start a set of activities as a synthesized task stack, if able.
|
||||
*
|
||||
* <p>In API level 11 (Android 3.0/Honeycomb) the recommended conventions for
|
||||
* app navigation using the back key changed. The back key's behavior is local
|
||||
* to the current task and does not capture navigation across different tasks.
|
||||
* Navigating across tasks and easily reaching the previous task is accomplished
|
||||
* through the "recents" UI, accessible through the software-provided Recents key
|
||||
* on the navigation or system bar. On devices with the older hardware button configuration
|
||||
* the recents UI can be accessed with a long press on the Home key.</p>
|
||||
*
|
||||
* <p>When crossing from one task stack to another post-Android 3.0,
|
||||
* the application should synthesize a back stack/history for the new task so that
|
||||
* the user may navigate out of the new task and back to the Launcher by repeated
|
||||
* presses of the back key. Back key presses should not navigate across task stacks.</p>
|
||||
*
|
||||
* <p>startActivities provides a mechanism for constructing a synthetic task stack of
|
||||
* multiple activities. If the underlying API is not available on the system this method
|
||||
* will return false.</p>
|
||||
*
|
||||
* @param context Start activities using this activity as the starting context
|
||||
* @param intents Array of intents defining the activities that will be started. The element
|
||||
* length-1 will correspond to the top activity on the resulting task stack.
|
||||
* @return true if the underlying API was available and the call was successful, false otherwise
|
||||
*/
|
||||
public static boolean startActivities(Context context, Intent[] intents) {
|
||||
return startActivities(context, intents, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Start a set of activities as a synthesized task stack, if able.
|
||||
*
|
||||
* <p>In API level 11 (Android 3.0/Honeycomb) the recommended conventions for
|
||||
* app navigation using the back key changed. The back key's behavior is local
|
||||
* to the current task and does not capture navigation across different tasks.
|
||||
* Navigating across tasks and easily reaching the previous task is accomplished
|
||||
* through the "recents" UI, accessible through the software-provided Recents key
|
||||
* on the navigation or system bar. On devices with the older hardware button configuration
|
||||
* the recents UI can be accessed with a long press on the Home key.</p>
|
||||
*
|
||||
* <p>When crossing from one task stack to another post-Android 3.0,
|
||||
* the application should synthesize a back stack/history for the new task so that
|
||||
* the user may navigate out of the new task and back to the Launcher by repeated
|
||||
* presses of the back key. Back key presses should not navigate across task stacks.</p>
|
||||
*
|
||||
* <p>startActivities provides a mechanism for constructing a synthetic task stack of
|
||||
* multiple activities. If the underlying API is not available on the system this method
|
||||
* will return false.</p>
|
||||
*
|
||||
* @param context Start activities using this activity as the starting context
|
||||
* @param intents Array of intents defining the activities that will be started. The element
|
||||
* length-1 will correspond to the top activity on the resulting task stack.
|
||||
* @param options Additional options for how the Activity should be started.
|
||||
* See {@link android.content.Context#startActivity(Intent, Bundle)
|
||||
* @return true if the underlying API was available and the call was successful, false otherwise
|
||||
*/
|
||||
public static boolean startActivities(Context context, Intent[] intents,
|
||||
Bundle options) {
|
||||
context.startActivities(intents, options);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns absolute paths to application-specific directories on all
|
||||
* external storage devices where the application's OBB files (if there are
|
||||
* any) can be found. Note if the application does not have any OBB files,
|
||||
* these directories may not exist.
|
||||
* <p>
|
||||
* This is like {@link Context#getFilesDir()} in that these files will be
|
||||
* deleted when the application is uninstalled, however there are some
|
||||
* important differences:
|
||||
* <ul>
|
||||
* <li>External files are not always available: they will disappear if the
|
||||
* user mounts the external storage on a computer or removes it.
|
||||
* <li>There is no security enforced with these files.
|
||||
* </ul>
|
||||
* <p>
|
||||
* External storage devices returned here are considered a permanent part of
|
||||
* the device, including both emulated external storage and physical media
|
||||
* slots, such as SD cards in a battery compartment. The returned paths do
|
||||
* not include transient devices, such as USB flash drives.
|
||||
* <p>
|
||||
* An application may store data on any or all of the returned devices. For
|
||||
* example, an app may choose to store large files on the device with the
|
||||
* most available space, as measured by {@link StatFs}.
|
||||
* <p>
|
||||
* Starting in {@link android.os.Build.VERSION_CODES#KITKAT}, no permissions
|
||||
* are required to write to the returned paths; they're always accessible to
|
||||
* the calling app. Before then,
|
||||
* {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} is required to
|
||||
* write. Write access outside of these paths on secondary external storage
|
||||
* devices is not available. To request external storage access in a
|
||||
* backwards compatible way, consider using {@code android:maxSdkVersion}
|
||||
* like this:
|
||||
*
|
||||
* <pre class="prettyprint"><uses-permission
|
||||
* android:name="android.permission.WRITE_EXTERNAL_STORAGE"
|
||||
* android:maxSdkVersion="18" /></pre>
|
||||
* <p>
|
||||
* The first path returned is the same as {@link Context#getObbDir()}.
|
||||
* Returned paths may be {@code null} if a storage device is unavailable.
|
||||
*
|
||||
* @see Context#getObbDir()
|
||||
* @see EnvironmentCompat#getStorageState(File)
|
||||
*/
|
||||
public static File[] getObbDirs(Context context) {
|
||||
return context.getObbDirs();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns absolute paths to application-specific directories on all
|
||||
* external storage devices where the application can place persistent files
|
||||
* it owns. These files are internal to the application, and not typically
|
||||
* visible to the user as media.
|
||||
* <p>
|
||||
* This is like {@link Context#getFilesDir()} in that these files will be
|
||||
* deleted when the application is uninstalled, however there are some
|
||||
* important differences:
|
||||
* <ul>
|
||||
* <li>External files are not always available: they will disappear if the
|
||||
* user mounts the external storage on a computer or removes it.
|
||||
* <li>There is no security enforced with these files.
|
||||
* </ul>
|
||||
* <p>
|
||||
* External storage devices returned here are considered a permanent part of
|
||||
* the device, including both emulated external storage and physical media
|
||||
* slots, such as SD cards in a battery compartment. The returned paths do
|
||||
* not include transient devices, such as USB flash drives.
|
||||
* <p>
|
||||
* An application may store data on any or all of the returned devices. For
|
||||
* example, an app may choose to store large files on the device with the
|
||||
* most available space, as measured by {@link StatFs}.
|
||||
* <p>
|
||||
* Starting in {@link android.os.Build.VERSION_CODES#KITKAT}, no permissions
|
||||
* are required to write to the returned paths; they're always accessible to
|
||||
* the calling app. Before then,
|
||||
* {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} is required to
|
||||
* write. Write access outside of these paths on secondary external storage
|
||||
* devices is not available. To request external storage access in a
|
||||
* backwards compatible way, consider using {@code android:maxSdkVersion}
|
||||
* like this:
|
||||
*
|
||||
* <pre class="prettyprint"><uses-permission
|
||||
* android:name="android.permission.WRITE_EXTERNAL_STORAGE"
|
||||
* android:maxSdkVersion="18" /></pre>
|
||||
* <p>
|
||||
* The first path returned is the same as
|
||||
* {@link Context#getExternalFilesDir(String)}. Returned paths may be
|
||||
* {@code null} if a storage device is unavailable.
|
||||
*
|
||||
* @see Context#getExternalFilesDir(String)
|
||||
* @see EnvironmentCompat#getStorageState(File)
|
||||
*/
|
||||
public static File[] getExternalFilesDirs(Context context, String type) {
|
||||
return context.getExternalFilesDirs(type);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns absolute paths to application-specific directories on all
|
||||
* external storage devices where the application can place cache files it
|
||||
* owns. These files are internal to the application, and not typically
|
||||
* visible to the user as media.
|
||||
* <p>
|
||||
* This is like {@link Context#getCacheDir()} in that these files will be
|
||||
* deleted when the application is uninstalled, however there are some
|
||||
* important differences:
|
||||
* <ul>
|
||||
* <li>External files are not always available: they will disappear if the
|
||||
* user mounts the external storage on a computer or removes it.
|
||||
* <li>There is no security enforced with these files.
|
||||
* </ul>
|
||||
* <p>
|
||||
* External storage devices returned here are considered a permanent part of
|
||||
* the device, including both emulated external storage and physical media
|
||||
* slots, such as SD cards in a battery compartment. The returned paths do
|
||||
* not include transient devices, such as USB flash drives.
|
||||
* <p>
|
||||
* An application may store data on any or all of the returned devices. For
|
||||
* example, an app may choose to store large files on the device with the
|
||||
* most available space, as measured by {@link StatFs}.
|
||||
* <p>
|
||||
* Starting in {@link android.os.Build.VERSION_CODES#KITKAT}, no permissions
|
||||
* are required to write to the returned paths; they're always accessible to
|
||||
* the calling app. Before then,
|
||||
* {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} is required to
|
||||
* write. Write access outside of these paths on secondary external storage
|
||||
* devices is not available. To request external storage access in a
|
||||
* backwards compatible way, consider using {@code android:maxSdkVersion}
|
||||
* like this:
|
||||
*
|
||||
* <pre class="prettyprint"><uses-permission
|
||||
* android:name="android.permission.WRITE_EXTERNAL_STORAGE"
|
||||
* android:maxSdkVersion="18" /></pre>
|
||||
* <p>
|
||||
* The first path returned is the same as
|
||||
* {@link Context#getExternalCacheDir()}. Returned paths may be {@code null}
|
||||
* if a storage device is unavailable.
|
||||
*
|
||||
* @see Context#getExternalCacheDir()
|
||||
* @see EnvironmentCompat#getStorageState(File)
|
||||
*/
|
||||
public static File[] getExternalCacheDirs(Context context) {
|
||||
return context.getExternalCacheDirs();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a drawable object associated with a particular resource ID.
|
||||
* <p>
|
||||
* Starting in {@link android.os.Build.VERSION_CODES#LOLLIPOP}, the returned
|
||||
* drawable will be styled for the specified Context's theme.
|
||||
*
|
||||
* @param id The desired resource identifier, as generated by the aapt tool.
|
||||
* This integer encodes the package, type, and resource entry.
|
||||
* The value 0 is an invalid identifier.
|
||||
* @return Drawable An object that can be used to draw this resource.
|
||||
*/
|
||||
public static final Drawable getDrawable(Context context, int id) {
|
||||
return context.getDrawable(id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the absolute path to the directory on the filesystem similar to
|
||||
* {@link Context#getFilesDir()}. The difference is that files placed under this
|
||||
* directory will be excluded from automatic backup to remote storage on
|
||||
* devices running {@link android.os.Build.VERSION_CODES#LOLLIPOP} or later. See
|
||||
* {@link android.app.backup.BackupAgent BackupAgent} for a full discussion
|
||||
* of the automatic backup mechanism in Android.
|
||||
*
|
||||
* <p>No permissions are required to read or write to the returned path, since this
|
||||
* path is internal storage.
|
||||
*
|
||||
* @return The path of the directory holding application files that will not be
|
||||
* automatically backed up to remote storage.
|
||||
*
|
||||
* @see android.content.Context.getFilesDir
|
||||
*/
|
||||
public final File getNoBackupFilesDir(Context context) {
|
||||
return context.getNoBackupFilesDir();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the absolute path to the application specific cache directory on
|
||||
* the filesystem designed for storing cached code. On devices running
|
||||
* {@link android.os.Build.VERSION_CODES#LOLLIPOP} or later, the system will delete
|
||||
* any files stored in this location both when your specific application is
|
||||
* upgraded, and when the entire platform is upgraded.
|
||||
* <p>
|
||||
* This location is optimal for storing compiled or optimized code generated
|
||||
* by your application at runtime.
|
||||
* <p>
|
||||
* Apps require no extra permissions to read or write to the returned path,
|
||||
* since this path lives in their private storage.
|
||||
*
|
||||
* @return The path of the directory holding application code cache files.
|
||||
*/
|
||||
public final File getCodeCacheDir(Context context) {
|
||||
return context.getCodeCacheDir();
|
||||
}
|
||||
}
|
@ -1,53 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2011 The Android Open Source Project
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package android.support.v4.os;
|
||||
|
||||
import android.os.Environment;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
/**
|
||||
* Helper for accessing features in {@link Environment} introduced after API
|
||||
* level 4 in a backwards compatible fashion.
|
||||
*/
|
||||
public class EnvironmentCompat {
|
||||
/**
|
||||
* Unknown storage state, such as when a path isn't backed by known storage
|
||||
* media.
|
||||
*
|
||||
* @see #getStorageState(File)
|
||||
*/
|
||||
public static final String MEDIA_UNKNOWN = "unknown";
|
||||
|
||||
/**
|
||||
* Returns the current state of the storage device that provides the given
|
||||
* path.
|
||||
*
|
||||
* @return one of {@link #MEDIA_UNKNOWN}, {@link Environment#MEDIA_REMOVED},
|
||||
* {@link Environment#MEDIA_UNMOUNTED},
|
||||
* {@link Environment#MEDIA_CHECKING},
|
||||
* {@link Environment#MEDIA_NOFS},
|
||||
* {@link Environment#MEDIA_MOUNTED},
|
||||
* {@link Environment#MEDIA_MOUNTED_READ_ONLY},
|
||||
* {@link Environment#MEDIA_SHARED},
|
||||
* {@link Environment#MEDIA_BAD_REMOVAL}, or
|
||||
* {@link Environment#MEDIA_UNMOUNTABLE}.
|
||||
*/
|
||||
public static String getStorageState(File path) {
|
||||
return Environment.getStorageState(path);
|
||||
}
|
||||
}
|
@ -1,193 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2017 The Android Open Source Project
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
package android.support.v7.preference;
|
||||
|
||||
import android.support.annotation.Nullable;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* A data store interface to be implemented and provided to the Preferences framework. This can be
|
||||
* used to replace the default {@link android.content.SharedPreferences}, if needed.
|
||||
*
|
||||
* <p>In most cases you want to use {@link android.content.SharedPreferences} as it is automatically
|
||||
* backed up and migrated to new devices. However, providing custom data store to preferences can be
|
||||
* useful if your app stores its preferences in a local db, cloud or they are device specific like
|
||||
* "Developer settings". It might be also useful when you want to use the preferences UI but
|
||||
* the data are not supposed to be stored at all because they are valid per session only.
|
||||
*
|
||||
* <p>Once a put method is called it is full responsibility of the data store implementation to
|
||||
* safely store the given values. Time expensive operations need to be done in the background to
|
||||
* prevent from blocking the UI. You also need to have a plan on how to serialize the data in case
|
||||
* the activity holding this object gets destroyed.
|
||||
*
|
||||
* <p>By default, all "put" methods throw {@link UnsupportedOperationException}.
|
||||
*/
|
||||
public abstract class PreferenceDataStore {
|
||||
|
||||
/**
|
||||
* Sets a {@link String} value to the data store.
|
||||
*
|
||||
* <p>Once the value is set the data store is responsible for holding it.
|
||||
*
|
||||
* @param key the name of the preference to modify
|
||||
* @param value the new value for the preference
|
||||
* @see #getString(String, String)
|
||||
*/
|
||||
public void putString(String key, @Nullable String value) {
|
||||
throw new UnsupportedOperationException("Not implemented on this data store");
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a set of Strings to the data store.
|
||||
*
|
||||
* <p>Once the value is set the data store is responsible for holding it.
|
||||
*
|
||||
* @param key the name of the preference to modify
|
||||
* @param values the set of new values for the preference
|
||||
* @see #getStringSet(String, Set<String>)
|
||||
*/
|
||||
public void putStringSet(String key, @Nullable Set<String> values) {
|
||||
throw new UnsupportedOperationException("Not implemented on this data store");
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets an {@link Integer} value to the data store.
|
||||
*
|
||||
* <p>Once the value is set the data store is responsible for holding it.
|
||||
*
|
||||
* @param key the name of the preference to modify
|
||||
* @param value the new value for the preference
|
||||
* @see #getInt(String, int)
|
||||
*/
|
||||
public void putInt(String key, int value) {
|
||||
throw new UnsupportedOperationException("Not implemented on this data store");
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a {@link Long} value to the data store.
|
||||
*
|
||||
* <p>Once the value is set the data store is responsible for holding it.
|
||||
*
|
||||
* @param key the name of the preference to modify
|
||||
* @param value the new value for the preference
|
||||
* @see #getLong(String, long)
|
||||
*/
|
||||
public void putLong(String key, long value) {
|
||||
throw new UnsupportedOperationException("Not implemented on this data store");
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a {@link Float} value to the data store.
|
||||
*
|
||||
* <p>Once the value is set the data store is responsible for holding it.
|
||||
*
|
||||
* @param key the name of the preference to modify
|
||||
* @param value the new value for the preference
|
||||
* @see #getFloat(String, float)
|
||||
*/
|
||||
public void putFloat(String key, float value) {
|
||||
throw new UnsupportedOperationException("Not implemented on this data store");
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a {@link Boolean} value to the data store.
|
||||
*
|
||||
* <p>Once the value is set the data store is responsible for holding it.
|
||||
*
|
||||
* @param key the name of the preference to modify
|
||||
* @param value the new value for the preference
|
||||
* @see #getBoolean(String, boolean)
|
||||
*/
|
||||
public void putBoolean(String key, boolean value) {
|
||||
throw new UnsupportedOperationException("Not implemented on this data store");
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves a {@link String} value from the data store.
|
||||
*
|
||||
* @param key the name of the preference to retrieve
|
||||
* @param defValue value to return if this preference does not exist in the storage
|
||||
* @return the value from the data store or the default return value
|
||||
* @see #putString(String, String)
|
||||
*/
|
||||
@Nullable
|
||||
public String getString(String key, @Nullable String defValue) {
|
||||
return defValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves a set of Strings from the data store.
|
||||
*
|
||||
* @param key the name of the preference to retrieve
|
||||
* @param defValues values to return if this preference does not exist in the storage
|
||||
* @return the values from the data store or the default return values
|
||||
* @see #putStringSet(String, Set<String>)
|
||||
*/
|
||||
@Nullable
|
||||
public Set<String> getStringSet(String key, @Nullable Set<String> defValues) {
|
||||
return defValues;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves an {@link Integer} value from the data store.
|
||||
*
|
||||
* @param key the name of the preference to retrieve
|
||||
* @param defValue value to return if this preference does not exist in the storage
|
||||
* @return the value from the data store or the default return value
|
||||
* @see #putInt(String, int)
|
||||
*/
|
||||
public int getInt(String key, int defValue) {
|
||||
return defValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves a {@link Long} value from the data store.
|
||||
*
|
||||
* @param key the name of the preference to retrieve
|
||||
* @param defValue value to return if this preference does not exist in the storage
|
||||
* @return the value from the data store or the default return value
|
||||
* @see #putLong(String, long)
|
||||
*/
|
||||
public long getLong(String key, long defValue) {
|
||||
return defValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves a {@link Float} value from the data store.
|
||||
*
|
||||
* @param key the name of the preference to retrieve
|
||||
* @param defValue value to return if this preference does not exist in the storage
|
||||
* @return the value from the data store or the default return value
|
||||
* @see #putFloat(String, float)
|
||||
*/
|
||||
public float getFloat(String key, float defValue) {
|
||||
return defValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves a {@link Boolean} value from the data store.
|
||||
*
|
||||
* @param key the name of the preference to retrieve
|
||||
* @param defValue value to return if this preference does not exist in the storage
|
||||
* @return the value from the data store or the default return value
|
||||
* @see #getBoolean(String, boolean)
|
||||
*/
|
||||
public boolean getBoolean(String key, boolean defValue) {
|
||||
return defValue;
|
||||
}
|
||||
}
|
@ -1,4 +0,0 @@
|
||||
package android.support.v7.preference;
|
||||
|
||||
public class PreferenceScreen {
|
||||
}
|
@ -0,0 +1,78 @@
|
||||
package android.webkit;
|
||||
|
||||
import android.annotation.Nullable;
|
||||
import android.annotation.SystemApi;
|
||||
import android.net.WebAddress;
|
||||
import xyz.nulldev.androidcompat.androidimpl.StubbedCookieManager;
|
||||
|
||||
public abstract class CookieManager {
|
||||
|
||||
@Deprecated
|
||||
public CookieManager() {}
|
||||
@Override
|
||||
protected Object clone() throws CloneNotSupportedException {
|
||||
throw new CloneNotSupportedException("doesn't implement Cloneable");
|
||||
}
|
||||
|
||||
public static CookieManager getInstance() {
|
||||
return new StubbedCookieManager();
|
||||
}
|
||||
|
||||
public abstract void setAcceptCookie(boolean accept);
|
||||
|
||||
public abstract boolean acceptCookie();
|
||||
|
||||
public abstract void setAcceptThirdPartyCookies(WebView webview, boolean accept);
|
||||
|
||||
public abstract boolean acceptThirdPartyCookies(WebView webview);
|
||||
|
||||
public abstract void setCookie(String url, String value);
|
||||
|
||||
public abstract void setCookie(String url, String value, @Nullable ValueCallback<Boolean>
|
||||
callback);
|
||||
|
||||
public abstract String getCookie(String url);
|
||||
|
||||
@SystemApi
|
||||
public abstract String getCookie(String url, boolean privateBrowsing);
|
||||
|
||||
@SystemApi
|
||||
public synchronized String getCookie(WebAddress uri) {
|
||||
return getCookie(uri.toString());
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public abstract void removeSessionCookie();
|
||||
|
||||
public abstract void removeSessionCookies(@Nullable ValueCallback<Boolean> callback);
|
||||
|
||||
@Deprecated
|
||||
public abstract void removeAllCookie();
|
||||
|
||||
public abstract void removeAllCookies(@Nullable ValueCallback<Boolean> callback);
|
||||
|
||||
public abstract boolean hasCookies();
|
||||
|
||||
@SystemApi
|
||||
public abstract boolean hasCookies(boolean privateBrowsing);
|
||||
|
||||
@Deprecated
|
||||
public abstract void removeExpiredCookie();
|
||||
|
||||
public abstract void flush();
|
||||
|
||||
public static boolean allowFileSchemeCookies() {
|
||||
return getInstance().allowFileSchemeCookiesImpl();
|
||||
}
|
||||
|
||||
@SystemApi
|
||||
protected abstract boolean allowFileSchemeCookiesImpl();
|
||||
|
||||
@Deprecated
|
||||
public static void setAcceptFileSchemeCookies(boolean accept) {
|
||||
getInstance().setAcceptFileSchemeCookiesImpl(accept);
|
||||
}
|
||||
|
||||
@SystemApi
|
||||
protected abstract void setAcceptFileSchemeCookiesImpl(boolean accept);
|
||||
}
|
40
AndroidCompat/src/main/java/android/widget/EditText.java
Normal file
40
AndroidCompat/src/main/java/android/widget/EditText.java
Normal file
@ -0,0 +1,40 @@
|
||||
package android.widget;
|
||||
|
||||
/*
|
||||
* Copyright (C) Contributors to the Suwayomi project
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
public class EditText {
|
||||
public EditText(android.content.Context context) { throw new RuntimeException("Stub!"); }
|
||||
|
||||
public EditText(android.content.Context context, android.util.AttributeSet attrs) { throw new RuntimeException("Stub!"); }
|
||||
|
||||
public EditText(android.content.Context context, android.util.AttributeSet attrs, int defStyleAttr) { throw new RuntimeException("Stub!"); }
|
||||
|
||||
public EditText(android.content.Context context, android.util.AttributeSet attrs, int defStyleAttr, int defStyleRes) { throw new RuntimeException("Stub!"); }
|
||||
|
||||
public boolean getFreezesText() { throw new RuntimeException("Stub!"); }
|
||||
|
||||
protected boolean getDefaultEditable() { throw new RuntimeException("Stub!"); }
|
||||
|
||||
protected android.text.method.MovementMethod getDefaultMovementMethod() { throw new RuntimeException("Stub!"); }
|
||||
|
||||
public android.text.Editable getText() { throw new RuntimeException("Stub!"); }
|
||||
|
||||
public void setText(java.lang.CharSequence text, android.widget.TextView.BufferType type) { throw new RuntimeException("Stub!"); }
|
||||
|
||||
public void setSelection(int start, int stop) { throw new RuntimeException("Stub!"); }
|
||||
|
||||
public void setSelection(int index) { throw new RuntimeException("Stub!"); }
|
||||
|
||||
public void selectAll() { throw new RuntimeException("Stub!"); }
|
||||
|
||||
public void extendSelection(int index) { throw new RuntimeException("Stub!"); }
|
||||
|
||||
public void setEllipsize(android.text.TextUtils.TruncateAt ellipsis) { throw new RuntimeException("Stub!"); }
|
||||
|
||||
public java.lang.CharSequence getAccessibilityClassName() { throw new RuntimeException("Stub!"); }
|
||||
}
|
91
AndroidCompat/src/main/java/android/widget/Toast.java
Normal file
91
AndroidCompat/src/main/java/android/widget/Toast.java
Normal file
@ -0,0 +1,91 @@
|
||||
package android.widget;
|
||||
|
||||
/*
|
||||
* Copyright (C) Contributors to the Suwayomi project
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
public class Toast {
|
||||
public static final int LENGTH_LONG = 1;
|
||||
public static final int LENGTH_SHORT = 0;
|
||||
|
||||
private CharSequence text;
|
||||
|
||||
private Toast(CharSequence text) {
|
||||
this.text = text;
|
||||
}
|
||||
|
||||
public Toast(android.content.Context context) {
|
||||
throw new RuntimeException("Stub!");
|
||||
}
|
||||
|
||||
public void show() {
|
||||
System.out.printf("made a Toast: \"%s\"\n", text.toString());
|
||||
}
|
||||
|
||||
public void cancel() {
|
||||
throw new RuntimeException("Stub!");
|
||||
}
|
||||
|
||||
public void setView(android.view.View view) {
|
||||
throw new RuntimeException("Stub!");
|
||||
}
|
||||
|
||||
public android.view.View getView() {
|
||||
throw new RuntimeException("Stub!");
|
||||
}
|
||||
|
||||
public void setDuration(int duration) {
|
||||
throw new RuntimeException("Stub!");
|
||||
}
|
||||
|
||||
public int getDuration() {
|
||||
throw new RuntimeException("Stub!");
|
||||
}
|
||||
|
||||
public void setMargin(float horizontalMargin, float verticalMargin) {
|
||||
throw new RuntimeException("Stub!");
|
||||
}
|
||||
|
||||
public float getHorizontalMargin() {
|
||||
throw new RuntimeException("Stub!");
|
||||
}
|
||||
|
||||
public float getVerticalMargin() {
|
||||
throw new RuntimeException("Stub!");
|
||||
}
|
||||
|
||||
public void setGravity(int gravity, int xOffset, int yOffset) {
|
||||
throw new RuntimeException("Stub!");
|
||||
}
|
||||
|
||||
public int getGravity() {
|
||||
throw new RuntimeException("Stub!");
|
||||
}
|
||||
|
||||
public int getXOffset() {
|
||||
throw new RuntimeException("Stub!");
|
||||
}
|
||||
|
||||
public int getYOffset() {
|
||||
throw new RuntimeException("Stub!");
|
||||
}
|
||||
|
||||
public static Toast makeText(android.content.Context context, java.lang.CharSequence text, int duration) {
|
||||
return new Toast(text);
|
||||
}
|
||||
|
||||
public static android.widget.Toast makeText(android.content.Context context, int resId, int duration) throws android.content.res.Resources.NotFoundException {
|
||||
throw new RuntimeException("Stub!");
|
||||
}
|
||||
|
||||
public void setText(int resId) {
|
||||
throw new RuntimeException("Stub!");
|
||||
}
|
||||
|
||||
public void setText(java.lang.CharSequence s) {
|
||||
throw new RuntimeException("Stub!");
|
||||
}
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
package androidx.preference;
|
||||
|
||||
/*
|
||||
* Copyright (C) Contributors to the Suwayomi project
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
public class CheckBoxPreference extends TwoStatePreference {
|
||||
// reference: https://android.googlesource.com/platform/frameworks/support/+/996971f962fcd554339a7cb2859cef9ca89dbcb7/preference/preference/src/main/java/androidx/preference/CheckBoxPreference.java
|
||||
|
||||
public CheckBoxPreference(Context context) {
|
||||
super(context);
|
||||
}
|
||||
}
|
@ -0,0 +1,33 @@
|
||||
package androidx.preference;
|
||||
|
||||
/*
|
||||
* Copyright (C) Contributors to the Suwayomi project
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
public abstract class DialogPreference extends Preference {
|
||||
private CharSequence dialogTitle;
|
||||
private CharSequence dialogMessage;
|
||||
|
||||
public DialogPreference(Context context) { super(context); }
|
||||
|
||||
public CharSequence getDialogTitle() {
|
||||
return dialogTitle;
|
||||
}
|
||||
|
||||
public void setDialogTitle(CharSequence dialogTitle) {
|
||||
this.dialogTitle = dialogTitle;
|
||||
}
|
||||
|
||||
public CharSequence getDialogMessage() {
|
||||
return dialogMessage;
|
||||
}
|
||||
|
||||
public void setDialogMessage(CharSequence dialogMessage) {
|
||||
this.dialogMessage = dialogMessage;
|
||||
}
|
||||
}
|
@ -0,0 +1,51 @@
|
||||
package androidx.preference;
|
||||
|
||||
/*
|
||||
* Copyright (C) Contributors to the Suwayomi project
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.annotation.Nullable;
|
||||
import android.content.Context;
|
||||
import android.widget.EditText;
|
||||
|
||||
public class EditTextPreference extends DialogPreference {
|
||||
// reference: https://android.googlesource.com/platform/frameworks/support/+/996971f962fcd554339a7cb2859cef9ca89dbcb7/preference/preference/src/main/java/androidx/preference/EditTextPreference.java
|
||||
|
||||
private String text;
|
||||
|
||||
private OnBindEditTextListener onBindEditTextListener;
|
||||
|
||||
public EditTextPreference(Context context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
public String getText() {
|
||||
return text;
|
||||
}
|
||||
|
||||
public void setText(String text) {
|
||||
this.text = text;
|
||||
}
|
||||
|
||||
public OnBindEditTextListener getOnBindEditTextListener() {
|
||||
return onBindEditTextListener;
|
||||
}
|
||||
|
||||
public void setOnBindEditTextListener(@Nullable OnBindEditTextListener onBindEditTextListener) {
|
||||
this.onBindEditTextListener = onBindEditTextListener;
|
||||
}
|
||||
|
||||
public interface OnBindEditTextListener {
|
||||
void onBindEditText(@NonNull EditText editText);
|
||||
}
|
||||
|
||||
/** Tachidesk specific API */
|
||||
@Override
|
||||
public String getDefaultValueType() {
|
||||
return "String";
|
||||
}
|
||||
}
|
@ -0,0 +1,62 @@
|
||||
package androidx.preference;
|
||||
|
||||
/*
|
||||
* Copyright (C) Contributors to the Suwayomi project
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
import android.content.Context;
|
||||
import android.text.TextUtils;
|
||||
|
||||
public class ListPreference extends Preference {
|
||||
// reference: https://android.googlesource.com/platform/frameworks/support/+/996971f962fcd554339a7cb2859cef9ca89dbcb7/preference/preference/src/main/java/androidx/preference/ListPreference.java
|
||||
// Note: remove @JsonIgnore and implement methods if any extension ever uses these methods or the variables behind them
|
||||
|
||||
private CharSequence[] entries;
|
||||
private CharSequence[] entryValues;
|
||||
|
||||
public ListPreference(Context context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
public CharSequence[] getEntries() {
|
||||
return entries;
|
||||
}
|
||||
|
||||
public void setEntries(CharSequence[] entries) {
|
||||
this.entries = entries;
|
||||
}
|
||||
|
||||
public int findIndexOfValue(String value) {
|
||||
if (value != null && entryValues != null) {
|
||||
for (int i = entryValues.length - 1; i >= 0; i--) {
|
||||
if (TextUtils.equals(entryValues[i].toString(), value)) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
public CharSequence[] getEntryValues() {
|
||||
return entryValues;
|
||||
}
|
||||
|
||||
public void setEntryValues(CharSequence[] entryValues) {
|
||||
this.entryValues = entryValues;
|
||||
}
|
||||
|
||||
public void setValueIndex(int index) { throw new RuntimeException("Stub!"); }
|
||||
|
||||
public String getValue() { throw new RuntimeException("Stub!"); }
|
||||
|
||||
public void setValue(String value) { throw new RuntimeException("Stub!"); }
|
||||
|
||||
/** Tachidesk specific API */
|
||||
@Override
|
||||
public String getDefaultValueType() {
|
||||
return "String";
|
||||
}
|
||||
}
|
@ -0,0 +1,38 @@
|
||||
package androidx.preference;
|
||||
|
||||
/*
|
||||
* Copyright (C) Contributors to the Suwayomi project
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
public class MultiSelectListPreference extends DialogPreference {
|
||||
// Note: remove @JsonIgnore and implement methods if any extension ever uses these methods or the variables behind them
|
||||
|
||||
public MultiSelectListPreference(Context context) { super(context); }
|
||||
|
||||
public void setEntries(CharSequence[] entries) { throw new RuntimeException("Stub!"); }
|
||||
|
||||
public CharSequence[] getEntries() { throw new RuntimeException("Stub!"); }
|
||||
|
||||
public void setEntryValues(CharSequence[] entryValues) { throw new RuntimeException("Stub!"); }
|
||||
|
||||
public CharSequence[] getEntryValues() { throw new RuntimeException("Stub!"); }
|
||||
|
||||
public void setValues(Set<String> values) { throw new RuntimeException("Stub!"); }
|
||||
|
||||
public Set<String> getValues() { throw new RuntimeException("Stub!"); }
|
||||
|
||||
public int findIndexOfValue(String value) { throw new RuntimeException("Stub!"); }
|
||||
|
||||
/** Tachidesk specific API */
|
||||
@Override
|
||||
public String getDefaultValueType() {
|
||||
return "Set";
|
||||
}
|
||||
}
|
136
AndroidCompat/src/main/java/androidx/preference/Preference.java
Normal file
136
AndroidCompat/src/main/java/androidx/preference/Preference.java
Normal file
@ -0,0 +1,136 @@
|
||||
package androidx.preference;
|
||||
|
||||
/*
|
||||
* Copyright (C) Contributors to the Suwayomi project
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
|
||||
/**
|
||||
* A minimal implementation of androidx.preference.Preference
|
||||
*/
|
||||
public class Preference {
|
||||
// reference: https://android.googlesource.com/platform/frameworks/support/+/996971f962fcd554339a7cb2859cef9ca89dbcb7/preference/preference/src/main/java/androidx/preference/Preference.java
|
||||
// Note: `Preference` doesn't actually hold or persist the value, `OnPreferenceChangeListener` is called and it's up to the extension to persist it.
|
||||
|
||||
protected Context context;
|
||||
|
||||
private String key;
|
||||
private CharSequence title;
|
||||
private CharSequence summary;
|
||||
private Object defaultValue;
|
||||
|
||||
/** Tachidesk specific API */
|
||||
private SharedPreferences sharedPreferences;
|
||||
|
||||
public OnPreferenceChangeListener onChangeListener;
|
||||
|
||||
public Preference(Context context) {
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
public Context getContext() {
|
||||
return context;
|
||||
}
|
||||
|
||||
public void setOnPreferenceChangeListener(OnPreferenceChangeListener onPreferenceChangeListener) {
|
||||
this.onChangeListener = onPreferenceChangeListener;
|
||||
}
|
||||
|
||||
public void setOnPreferenceClickListener(OnPreferenceClickListener onPreferenceClickListener) {
|
||||
throw new RuntimeException("Stub!");
|
||||
}
|
||||
|
||||
public CharSequence getTitle() {
|
||||
return title;
|
||||
}
|
||||
|
||||
public void setTitle(CharSequence title) {
|
||||
this.title = title;
|
||||
}
|
||||
|
||||
public CharSequence getSummary() {
|
||||
return summary;
|
||||
}
|
||||
|
||||
public void setSummary(CharSequence summary) {
|
||||
this.summary = summary;
|
||||
}
|
||||
|
||||
public void setEnabled(boolean enabled) {
|
||||
throw new RuntimeException("Stub!");
|
||||
}
|
||||
|
||||
public String getKey() {
|
||||
return key;
|
||||
}
|
||||
|
||||
public void setKey(String key) {
|
||||
this.key = key;
|
||||
}
|
||||
|
||||
public void setDefaultValue(Object defaultValue) {
|
||||
this.defaultValue = defaultValue;
|
||||
}
|
||||
|
||||
public boolean callChangeListener(Object newValue) {
|
||||
return onChangeListener == null || onChangeListener.onPreferenceChange(this, newValue);
|
||||
}
|
||||
|
||||
public Object getDefaultValue() {
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
/** Tachidesk specific API */
|
||||
public String getDefaultValueType() {
|
||||
return defaultValue.getClass().getSimpleName();
|
||||
}
|
||||
|
||||
/** Tachidesk specific API */
|
||||
public SharedPreferences getSharedPreferences() {
|
||||
return sharedPreferences;
|
||||
}
|
||||
|
||||
/** Tachidesk specific API */
|
||||
public void setSharedPreferences(SharedPreferences sharedPreferences) {
|
||||
this.sharedPreferences = sharedPreferences;
|
||||
}
|
||||
|
||||
public interface OnPreferenceChangeListener {
|
||||
boolean onPreferenceChange(Preference preference, Object newValue);
|
||||
}
|
||||
|
||||
public interface OnPreferenceClickListener {
|
||||
boolean onPreferenceClick(Preference preference);
|
||||
}
|
||||
|
||||
/** Tachidesk specific API */
|
||||
public Object getCurrentValue() {
|
||||
switch (getDefaultValueType()) {
|
||||
case "String":
|
||||
return sharedPreferences.getString(key, (String)defaultValue);
|
||||
case "Boolean":
|
||||
return sharedPreferences.getBoolean(key, (Boolean)defaultValue);
|
||||
default:
|
||||
throw new RuntimeException("Unsupported type");
|
||||
}
|
||||
}
|
||||
|
||||
/** Tachidesk specific API */
|
||||
public void saveNewValue(Object value) {
|
||||
switch (getDefaultValueType()) {
|
||||
case "String":
|
||||
sharedPreferences.edit().putString(key, (String)value).apply();
|
||||
break;
|
||||
case "Boolean":
|
||||
sharedPreferences.edit().putBoolean(key, (Boolean)value).apply();
|
||||
break;
|
||||
default:
|
||||
throw new RuntimeException("Unsupported type");
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,36 @@
|
||||
package androidx.preference;
|
||||
|
||||
/*
|
||||
* Copyright (C) Contributors to the Suwayomi project
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
public class PreferenceScreen extends Preference {
|
||||
/** Tachidesk specific API */
|
||||
private List<Preference> preferences = new LinkedList<>();
|
||||
|
||||
public PreferenceScreen(Context context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
public boolean addPreference(Preference preference) {
|
||||
// propagate own shared preferences
|
||||
preference.setSharedPreferences(getSharedPreferences());
|
||||
|
||||
preferences.add(preference);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/** Tachidesk specific API */
|
||||
public List<Preference> getPreferences(){
|
||||
return preferences;
|
||||
}
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
package androidx.preference;
|
||||
|
||||
/*
|
||||
* Copyright (C) Contributors to the Suwayomi project
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
public class SwitchPreferenceCompat extends TwoStatePreference {
|
||||
// reference: https://android.googlesource.com/platform/frameworks/support/+/996971f962fcd554339a7cb2859cef9ca89dbcb7/preference/preference/src/main/java/androidx/preference/CheckBoxPreference.java
|
||||
|
||||
public SwitchPreferenceCompat(Context context) {
|
||||
super(context);
|
||||
}
|
||||
}
|
@ -0,0 +1,38 @@
|
||||
package androidx.preference;
|
||||
|
||||
/*
|
||||
* Copyright (C) Contributors to the Suwayomi project
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
public class TwoStatePreference extends Preference {
|
||||
// Note: remove @JsonIgnore and implement methods if any extension ever uses these methods or the variables behind them
|
||||
|
||||
public TwoStatePreference(Context context) { super(context); }
|
||||
|
||||
public boolean isChecked() { throw new RuntimeException("Stub!"); }
|
||||
|
||||
public void setChecked(boolean checked) { throw new RuntimeException("Stub!"); }
|
||||
|
||||
public CharSequence getSummaryOn() { throw new RuntimeException("Stub!"); }
|
||||
|
||||
public void setSummaryOn(CharSequence summary) { throw new RuntimeException("Stub!"); }
|
||||
|
||||
public CharSequence getSummaryOff() { throw new RuntimeException("Stub!"); }
|
||||
|
||||
public void setSummaryOff(CharSequence summary) { throw new RuntimeException("Stub!"); }
|
||||
|
||||
public boolean getDisableDependentsState() { throw new RuntimeException("Stub!"); }
|
||||
|
||||
public void setDisableDependentsState(boolean disableDependentsState) { throw new RuntimeException("Stub!"); }
|
||||
|
||||
/** Tachidesk specific API */
|
||||
@Override
|
||||
public String getDefaultValueType() {
|
||||
return "Boolean";
|
||||
}
|
||||
}
|
@ -1,2 +0,0 @@
|
||||
package com.f2prateek;
|
||||
//TODO Consider if we can change this package into an Android dependency
|
@ -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<Boolean> {
|
||||
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);
|
||||
}
|
||||
}
|
@ -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<T extends Enum<T>> implements Preference.Adapter<T> {
|
||||
private final Class<T> enumClass;
|
||||
|
||||
EnumAdapter(Class<T> 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());
|
||||
}
|
||||
}
|
@ -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<Float> {
|
||||
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);
|
||||
}
|
||||
}
|
@ -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<Integer> {
|
||||
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);
|
||||
}
|
||||
}
|
@ -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<Long> {
|
||||
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);
|
||||
}
|
||||
}
|
@ -1,30 +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;
|
||||
|
||||
final class Preconditions {
|
||||
static void checkNotNull(Object o, String message) {
|
||||
if (o == null) {
|
||||
throw new NullPointerException(message);
|
||||
}
|
||||
}
|
||||
|
||||
private Preconditions() {
|
||||
throw new AssertionError("No instances");
|
||||
}
|
||||
}
|
@ -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<T> {
|
||||
/** Stores and retrieves instances of {@code T} in {@link SharedPreferences}. */
|
||||
public interface Adapter<T> {
|
||||
/** 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}.
|
||||
* <p>
|
||||
* Note: Implementations <b>must not</b> 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<T> adapter;
|
||||
private final Observable<T> values;
|
||||
|
||||
Preference(SharedPreferences preferences, final String key, T defaultValue, Adapter<T> adapter,
|
||||
Observable<String> keyChanges) {
|
||||
this.preferences = preferences;
|
||||
this.key = key;
|
||||
this.defaultValue = defaultValue;
|
||||
this.adapter = adapter;
|
||||
this.values = keyChanges
|
||||
.filter(key::equals)
|
||||
.startWith("<init>") // 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<T> asObservable() {
|
||||
return values;
|
||||
}
|
||||
|
||||
/**
|
||||
* An action which stores a new value for this preference. Passing {@code null} will delete the
|
||||
* preference.
|
||||
*/
|
||||
@CheckResult @NonNull
|
||||
public Action1<? super T> asAction() {
|
||||
return (Action1<T>) this::set;
|
||||
}
|
||||
}
|
@ -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<String> keyChanges;
|
||||
|
||||
private RxSharedPreferences(final SharedPreferences preferences) {
|
||||
this.preferences = preferences;
|
||||
this.keyChanges = Observable.create((Observable.OnSubscribe<String>) 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<Boolean> 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<Boolean> 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 <T extends Enum<T>> Preference<T> getEnum(@NonNull String key,
|
||||
@NonNull Class<T> enumClass) {
|
||||
return getEnum(key, null, enumClass);
|
||||
}
|
||||
|
||||
/** Create an enum preference for {@code key} with a default of {@code defaultValue}. */
|
||||
@CheckResult @NonNull
|
||||
public <T extends Enum<T>> Preference<T> getEnum(@NonNull String key, @Nullable T defaultValue,
|
||||
@NonNull Class<T> enumClass) {
|
||||
checkNotNull(key, "key == null");
|
||||
checkNotNull(enumClass, "enumClass == null");
|
||||
Preference.Adapter<T> 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<Float> 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<Float> 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<Integer> 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<Integer> 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<Long> 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<Long> 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 <T> Preference<T> getObject(@NonNull String key, @NonNull Preference.Adapter<T> 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 <T> Preference<T> getObject(@NonNull String key, @Nullable T defaultValue,
|
||||
@NonNull Preference.Adapter<T> 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<String> 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<String> 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<Set<String>> 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<Set<String>> getStringSet(@NonNull String key,
|
||||
@NonNull Set<String> defaultValue) {
|
||||
checkNotNull(key, "key == null");
|
||||
return new Preference<>(preferences, key, defaultValue, StringSetAdapter.INSTANCE, keyChanges);
|
||||
}
|
||||
}
|
@ -1,17 +0,0 @@
|
||||
package com.f2prateek.rx.preferences;
|
||||
|
||||
import android.content.SharedPreferences;
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
final class StringAdapter implements Preference.Adapter<String> {
|
||||
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);
|
||||
}
|
||||
}
|
@ -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<Set<String>> {
|
||||
static final StringSetAdapter INSTANCE = new StringSetAdapter();
|
||||
|
||||
@Override public Set<String> get(@NonNull String key, @NonNull SharedPreferences preferences) {
|
||||
return preferences.getStringSet(key, null);
|
||||
}
|
||||
|
||||
@Override public void set(@NonNull String key, @NonNull Set<String> value,
|
||||
@NonNull SharedPreferences.Editor editor) {
|
||||
editor.putStringSet(key, value);
|
||||
}
|
||||
}
|
@ -1,7 +0,0 @@
|
||||
package com.github.pwittchen.reactivenetwork.library
|
||||
|
||||
import android.net.NetworkInfo
|
||||
|
||||
class Connectivity {
|
||||
val state = NetworkInfo.State.CONNECTED
|
||||
}
|
@ -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())!!
|
||||
}
|
||||
}
|
@ -1,5 +0,0 @@
|
||||
package kotlinx.coroutines.experimental.android
|
||||
|
||||
import kotlinx.coroutines.GlobalScope
|
||||
|
||||
val UI = GlobalScope.coroutineContext
|
@ -1,5 +1,6 @@
|
||||
package rx.android.schedulers
|
||||
|
||||
import rx.Scheduler
|
||||
import rx.internal.schedulers.ImmediateScheduler
|
||||
|
||||
class AndroidSchedulers {
|
||||
@ -11,6 +12,7 @@ class AndroidSchedulers {
|
||||
/**
|
||||
* Simulated main thread scheduler
|
||||
*/
|
||||
fun mainThread() = mainThreadScheduler
|
||||
@JvmStatic
|
||||
fun mainThread(): Scheduler = mainThreadScheduler
|
||||
}
|
||||
}
|
||||
|
@ -2,7 +2,6 @@ package xyz.nulldev.androidcompat
|
||||
|
||||
import org.kodein.di.DI
|
||||
import org.kodein.di.conf.global
|
||||
import xyz.nulldev.androidcompat.bytecode.ModApplier
|
||||
import xyz.nulldev.androidcompat.config.ApplicationInfoConfigModule
|
||||
import xyz.nulldev.androidcompat.config.FilesConfigModule
|
||||
import xyz.nulldev.androidcompat.config.SystemConfigModule
|
||||
@ -12,12 +11,7 @@ import xyz.nulldev.ts.config.GlobalConfigManager
|
||||
* Initializes the Android compatibility module
|
||||
*/
|
||||
class AndroidCompatInitializer {
|
||||
|
||||
val modApplier by lazy { ModApplier() }
|
||||
|
||||
fun init() {
|
||||
modApplier.apply()
|
||||
|
||||
DI.global.addImport(AndroidCompatModule().create())
|
||||
|
||||
//Register config modules
|
||||
|
@ -33,7 +33,10 @@ import android.view.Display;
|
||||
import android.view.DisplayAdjustments;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.kodein.di.*;
|
||||
import org.kodein.di.DI;
|
||||
import org.kodein.di.DIAware;
|
||||
import org.kodein.di.DIContext;
|
||||
import org.kodein.di.DITrigger;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import xyz.nulldev.androidcompat.info.ApplicationInfoImpl;
|
||||
@ -50,10 +53,9 @@ import java.util.Map;
|
||||
/**
|
||||
* Custom context implementation.
|
||||
*
|
||||
* TODO Deal with packagemanager for extension sources
|
||||
*/
|
||||
public class CustomContext extends Context implements DIAware {
|
||||
private DI kodein;
|
||||
private final DI kodein;
|
||||
public CustomContext() {
|
||||
this(KodeinGlobalHelper.kodein());
|
||||
}
|
||||
@ -734,4 +736,3 @@ public class CustomContext extends Context implements DIAware {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -0,0 +1,79 @@
|
||||
package xyz.nulldev.androidcompat.androidimpl
|
||||
|
||||
import android.webkit.CookieManager
|
||||
import android.webkit.ValueCallback
|
||||
import android.webkit.WebView
|
||||
|
||||
class StubbedCookieManager : CookieManager() {
|
||||
override fun setAcceptCookie(accept: Boolean) {
|
||||
throw NotImplementedError()
|
||||
}
|
||||
|
||||
override fun acceptCookie(): Boolean {
|
||||
throw NotImplementedError()
|
||||
}
|
||||
|
||||
override fun setAcceptThirdPartyCookies(webview: WebView?, accept: Boolean) {
|
||||
throw NotImplementedError()
|
||||
}
|
||||
|
||||
override fun acceptThirdPartyCookies(webview: WebView?): Boolean {
|
||||
throw NotImplementedError()
|
||||
}
|
||||
|
||||
override fun setCookie(url: String, value: String) {
|
||||
throw NotImplementedError()
|
||||
}
|
||||
|
||||
override fun setCookie(url: String?, value: String?, callback: ValueCallback<Boolean>?) {
|
||||
throw NotImplementedError()
|
||||
}
|
||||
|
||||
override fun getCookie(url: String?): String {
|
||||
throw NotImplementedError()
|
||||
}
|
||||
|
||||
override fun getCookie(url: String?, privateBrowsing: Boolean): String {
|
||||
throw NotImplementedError()
|
||||
}
|
||||
|
||||
override fun removeSessionCookie() {
|
||||
throw NotImplementedError()
|
||||
}
|
||||
|
||||
override fun removeSessionCookies(callback: ValueCallback<Boolean>?) {
|
||||
throw NotImplementedError()
|
||||
}
|
||||
|
||||
override fun removeAllCookie() {
|
||||
throw NotImplementedError()
|
||||
}
|
||||
|
||||
override fun removeAllCookies(callback: ValueCallback<Boolean>?) {
|
||||
throw NotImplementedError()
|
||||
}
|
||||
|
||||
override fun hasCookies(): Boolean {
|
||||
throw NotImplementedError()
|
||||
}
|
||||
|
||||
override fun hasCookies(privateBrowsing: Boolean): Boolean {
|
||||
throw NotImplementedError()
|
||||
}
|
||||
|
||||
override fun removeExpiredCookie() {
|
||||
throw NotImplementedError()
|
||||
}
|
||||
|
||||
override fun flush() {
|
||||
throw NotImplementedError()
|
||||
}
|
||||
|
||||
override fun allowFileSchemeCookiesImpl(): Boolean {
|
||||
throw NotImplementedError()
|
||||
}
|
||||
|
||||
override fun setAcceptFileSchemeCookiesImpl(accept: Boolean) {
|
||||
throw NotImplementedError()
|
||||
}
|
||||
}
|
@ -1,22 +0,0 @@
|
||||
package xyz.nulldev.androidcompat.bytecode
|
||||
|
||||
import javassist.CtClass
|
||||
import mu.KotlinLogging
|
||||
|
||||
/**
|
||||
* Applies Javassist modifications
|
||||
*/
|
||||
|
||||
class ModApplier {
|
||||
|
||||
val logger = KotlinLogging.logger {}
|
||||
|
||||
fun apply() {
|
||||
logger.info { "Applying Javassist mods..." }
|
||||
val modifiedClasses = mutableListOf<CtClass>()
|
||||
|
||||
modifiedClasses.forEach {
|
||||
it.toClass()
|
||||
}
|
||||
}
|
||||
}
|
@ -4,11 +4,21 @@ import java.io.InputStream
|
||||
import java.io.Reader
|
||||
import java.math.BigDecimal
|
||||
import java.net.URL
|
||||
import java.sql.*
|
||||
import java.sql.Array
|
||||
import java.sql.Blob
|
||||
import java.sql.Clob
|
||||
import java.sql.Date
|
||||
import java.util.*
|
||||
import java.sql.NClob
|
||||
import java.sql.Ref
|
||||
import java.sql.ResultSet
|
||||
import java.sql.ResultSetMetaData
|
||||
import java.sql.RowId
|
||||
import java.sql.SQLXML
|
||||
import java.sql.Time
|
||||
import java.sql.Timestamp
|
||||
import java.util.Calendar
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
class ScrollableResultSet(val parent: ResultSet) : ResultSet by parent {
|
||||
|
||||
private val cachedContent = mutableListOf<ResultSetEntry>()
|
||||
|
@ -26,6 +26,8 @@ class AndroidFiles(val configManager: ConfigManager = GlobalConfigManager) {
|
||||
val downloadCacheDir: File get() = registerFile(filesConfig.downloadCacheDir)
|
||||
val databasesDir: File get() = registerFile(filesConfig.databasesDir)
|
||||
|
||||
val prefsDir: File get() = registerFile(filesConfig.prefsDir)
|
||||
|
||||
val packagesDir: File get() = registerFile(filesConfig.packageDir)
|
||||
|
||||
fun registerFile(file: String): File {
|
||||
|
@ -1,12 +1,18 @@
|
||||
package xyz.nulldev.androidcompat.io.sharedprefs
|
||||
|
||||
/*
|
||||
* Copyright (C) Contributors to the Suwayomi project
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
import android.content.SharedPreferences
|
||||
import com.russhwolf.settings.ExperimentalSettingsApi
|
||||
import com.russhwolf.settings.ExperimentalSettingsImplementation
|
||||
import com.russhwolf.settings.JvmPreferencesSettings
|
||||
import com.russhwolf.settings.serialization.decodeValue
|
||||
import com.russhwolf.settings.serialization.encodeValue
|
||||
import com.russhwolf.settings.set
|
||||
import kotlinx.serialization.ExperimentalSerializationApi
|
||||
import kotlinx.serialization.SerializationException
|
||||
import kotlinx.serialization.builtins.SetSerializer
|
||||
@ -138,9 +144,12 @@ class JavaSharedPreferences(key: String) : SharedPreferences {
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
when (value) {
|
||||
is Set<*> -> preferences.encodeValue(SetSerializer(String.serializer()), key, value as Set<String>)
|
||||
else -> {
|
||||
preferences[key] = value
|
||||
}
|
||||
is String -> preferences.putString(key, value)
|
||||
is Int -> preferences.putInt(key, value)
|
||||
is Long -> preferences.putLong(key, value)
|
||||
is Float -> preferences.putFloat(key, value)
|
||||
is Double -> preferences.putDouble(key, value)
|
||||
is Boolean -> preferences.putBoolean(key, value)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -233,7 +233,7 @@ public class JsonSharedPreferences implements SharedPreferences {
|
||||
private JsonSharedPreferencesEditor() {
|
||||
}
|
||||
|
||||
private void recordChange(String key) {
|
||||
private void recordChange(String key) {
|
||||
if (!affectedKeys.contains(key)) {
|
||||
affectedKeys.add(key);
|
||||
}
|
||||
|
@ -0,0 +1,249 @@
|
||||
package xyz.nulldev.androidcompat.replace.java.text;
|
||||
|
||||
/*
|
||||
* Copyright (C) Contributors to the Suwayomi project
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
import com.ibm.icu.text.DisplayContext;
|
||||
import com.ibm.icu.util.Currency;
|
||||
import com.ibm.icu.util.CurrencyAmount;
|
||||
import com.ibm.icu.util.ULocale;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.math.BigInteger;
|
||||
import java.text.AttributedCharacterIterator;
|
||||
import java.text.FieldPosition;
|
||||
import java.text.ParseException;
|
||||
import java.text.ParsePosition;
|
||||
import java.util.Locale;
|
||||
|
||||
public class NumberFormat extends java.text.NumberFormat {
|
||||
private com.ibm.icu.text.NumberFormat delegate;
|
||||
|
||||
public NumberFormat(com.ibm.icu.text.NumberFormat delegate) {
|
||||
this.delegate = delegate;
|
||||
}
|
||||
|
||||
public StringBuffer format(Object number, StringBuffer toAppendTo, FieldPosition pos) {
|
||||
return delegate.format(number, toAppendTo, pos);
|
||||
}
|
||||
|
||||
public String format(BigInteger number) {
|
||||
return delegate.format(number);
|
||||
}
|
||||
|
||||
public String format(BigDecimal number) {
|
||||
return delegate.format(number);
|
||||
}
|
||||
|
||||
public String format(com.ibm.icu.math.BigDecimal number) {
|
||||
return delegate.format(number);
|
||||
}
|
||||
|
||||
public String format(CurrencyAmount currAmt) {
|
||||
return delegate.format(currAmt);
|
||||
}
|
||||
|
||||
public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) {
|
||||
return delegate.format(number, toAppendTo, pos);
|
||||
}
|
||||
|
||||
public StringBuffer format(long number, StringBuffer toAppendTo, FieldPosition pos) {
|
||||
return delegate.format(number, toAppendTo, pos);
|
||||
}
|
||||
|
||||
public StringBuffer format(BigInteger number, StringBuffer toAppendTo, FieldPosition pos) {
|
||||
return delegate.format(number, toAppendTo, pos);
|
||||
}
|
||||
|
||||
public StringBuffer format(BigDecimal number, StringBuffer toAppendTo, FieldPosition pos) {
|
||||
return delegate.format(number, toAppendTo, pos);
|
||||
}
|
||||
|
||||
public StringBuffer format(com.ibm.icu.math.BigDecimal number, StringBuffer toAppendTo, FieldPosition pos) {
|
||||
return delegate.format(number, toAppendTo, pos);
|
||||
}
|
||||
|
||||
public StringBuffer format(CurrencyAmount currAmt, StringBuffer toAppendTo, FieldPosition pos) {
|
||||
return delegate.format(currAmt, toAppendTo, pos);
|
||||
}
|
||||
|
||||
public Number parse(String text, ParsePosition parsePosition) {
|
||||
return delegate.parse(text, parsePosition);
|
||||
}
|
||||
|
||||
public Number parse(String text) throws ParseException {
|
||||
return delegate.parse(text);
|
||||
}
|
||||
|
||||
public CurrencyAmount parseCurrency(CharSequence text, ParsePosition pos) {
|
||||
return delegate.parseCurrency(text, pos);
|
||||
}
|
||||
|
||||
public boolean isParseIntegerOnly() {
|
||||
return delegate.isParseIntegerOnly();
|
||||
}
|
||||
|
||||
public void setParseIntegerOnly(boolean value) {
|
||||
delegate.setParseIntegerOnly(value);
|
||||
}
|
||||
|
||||
public void setParseStrict(boolean value) {
|
||||
delegate.setParseStrict(value);
|
||||
}
|
||||
|
||||
public boolean isParseStrict() {
|
||||
return delegate.isParseStrict();
|
||||
}
|
||||
|
||||
public void setContext(DisplayContext context) {
|
||||
delegate.setContext(context);
|
||||
}
|
||||
|
||||
public DisplayContext getContext(DisplayContext.Type type) {
|
||||
return delegate.getContext(type);
|
||||
}
|
||||
|
||||
public static java.text.NumberFormat getInstance(Locale inLocale) {
|
||||
return new NumberFormat(com.ibm.icu.text.NumberFormat.getInstance(inLocale));
|
||||
}
|
||||
|
||||
public static com.ibm.icu.text.NumberFormat getInstance(ULocale inLocale) {
|
||||
return com.ibm.icu.text.NumberFormat.getInstance(inLocale);
|
||||
}
|
||||
|
||||
public static com.ibm.icu.text.NumberFormat getInstance(int style) {
|
||||
return com.ibm.icu.text.NumberFormat.getInstance(style);
|
||||
}
|
||||
|
||||
public static com.ibm.icu.text.NumberFormat getInstance(Locale inLocale, int style) {
|
||||
return com.ibm.icu.text.NumberFormat.getInstance(inLocale, style);
|
||||
}
|
||||
|
||||
public static com.ibm.icu.text.NumberFormat getNumberInstance(ULocale inLocale) {
|
||||
return com.ibm.icu.text.NumberFormat.getNumberInstance(inLocale);
|
||||
}
|
||||
|
||||
public static com.ibm.icu.text.NumberFormat getIntegerInstance(ULocale inLocale) {
|
||||
return com.ibm.icu.text.NumberFormat.getIntegerInstance(inLocale);
|
||||
}
|
||||
|
||||
public static com.ibm.icu.text.NumberFormat getCurrencyInstance(ULocale inLocale) {
|
||||
return com.ibm.icu.text.NumberFormat.getCurrencyInstance(inLocale);
|
||||
}
|
||||
|
||||
public static com.ibm.icu.text.NumberFormat getPercentInstance(ULocale inLocale) {
|
||||
return com.ibm.icu.text.NumberFormat.getPercentInstance(inLocale);
|
||||
}
|
||||
|
||||
public static com.ibm.icu.text.NumberFormat getScientificInstance(ULocale inLocale) {
|
||||
return com.ibm.icu.text.NumberFormat.getScientificInstance(inLocale);
|
||||
}
|
||||
|
||||
public static Locale[] getAvailableLocales() {
|
||||
return com.ibm.icu.text.NumberFormat.getAvailableLocales();
|
||||
}
|
||||
|
||||
public static ULocale[] getAvailableULocales() {
|
||||
return com.ibm.icu.text.NumberFormat.getAvailableULocales();
|
||||
}
|
||||
|
||||
public static Object registerFactory(com.ibm.icu.text.NumberFormat.NumberFormatFactory factory) {
|
||||
return com.ibm.icu.text.NumberFormat.registerFactory(factory);
|
||||
}
|
||||
|
||||
public static boolean unregister(Object registryKey) {
|
||||
return com.ibm.icu.text.NumberFormat.unregister(registryKey);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return delegate.hashCode();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
return delegate.equals(obj);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object clone() {
|
||||
return delegate.clone();
|
||||
}
|
||||
|
||||
public boolean isGroupingUsed() {
|
||||
return delegate.isGroupingUsed();
|
||||
}
|
||||
|
||||
public void setGroupingUsed(boolean newValue) {
|
||||
delegate.setGroupingUsed(newValue);
|
||||
}
|
||||
|
||||
public int getMaximumIntegerDigits() {
|
||||
return delegate.getMaximumIntegerDigits();
|
||||
}
|
||||
|
||||
public void setMaximumIntegerDigits(int newValue) {
|
||||
delegate.setMaximumIntegerDigits(newValue);
|
||||
}
|
||||
|
||||
public int getMinimumIntegerDigits() {
|
||||
return delegate.getMinimumIntegerDigits();
|
||||
}
|
||||
|
||||
public void setMinimumIntegerDigits(int newValue) {
|
||||
delegate.setMinimumIntegerDigits(newValue);
|
||||
}
|
||||
|
||||
public int getMaximumFractionDigits() {
|
||||
return delegate.getMaximumFractionDigits();
|
||||
}
|
||||
|
||||
public void setMaximumFractionDigits(int newValue) {
|
||||
delegate.setMaximumFractionDigits(newValue);
|
||||
}
|
||||
|
||||
public int getMinimumFractionDigits() {
|
||||
return delegate.getMinimumFractionDigits();
|
||||
}
|
||||
|
||||
public void setMinimumFractionDigits(int newValue) {
|
||||
delegate.setMinimumFractionDigits(newValue);
|
||||
}
|
||||
|
||||
public void setCurrency(Currency theCurrency) {
|
||||
delegate.setCurrency(theCurrency);
|
||||
}
|
||||
|
||||
public java.util.Currency getCurrency() {
|
||||
return java.util.Currency.getInstance(delegate.getCurrency().getCurrencyCode());
|
||||
}
|
||||
|
||||
public void setRoundingMode(int roundingMode) {
|
||||
delegate.setRoundingMode(roundingMode);
|
||||
}
|
||||
|
||||
public static com.ibm.icu.text.NumberFormat getInstance(ULocale desiredLocale, int choice) {
|
||||
return com.ibm.icu.text.NumberFormat.getInstance(desiredLocale, choice);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public static String getPatternForStyle(ULocale forLocale, int choice) {
|
||||
return com.ibm.icu.text.NumberFormat.getPatternForStyle(forLocale, choice);
|
||||
}
|
||||
|
||||
public ULocale getLocale(ULocale.Type type) {
|
||||
return delegate.getLocale(type);
|
||||
}
|
||||
|
||||
public AttributedCharacterIterator formatToCharacterIterator(Object obj) {
|
||||
return delegate.formatToCharacterIterator(obj);
|
||||
}
|
||||
|
||||
public Object parseObject(String source) throws ParseException {
|
||||
return delegate.parseObject(source);
|
||||
}
|
||||
}
|
@ -0,0 +1,349 @@
|
||||
package xyz.nulldev.androidcompat.replace.java.text;
|
||||
|
||||
/*
|
||||
* Copyright (C) Contributors to the Suwayomi project
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
import com.ibm.icu.text.DateFormatSymbols;
|
||||
import com.ibm.icu.text.DisplayContext;
|
||||
import com.ibm.icu.text.TimeZoneFormat;
|
||||
import com.ibm.icu.util.ULocale;
|
||||
import xyz.nulldev.androidcompat.replace.java.util.Calendar;
|
||||
import xyz.nulldev.androidcompat.replace.java.util.TimeZone;
|
||||
|
||||
import java.text.AttributedCharacterIterator;
|
||||
import java.text.FieldPosition;
|
||||
import java.text.ParseException;
|
||||
import java.text.ParsePosition;
|
||||
import java.util.Date;
|
||||
import java.util.Locale;
|
||||
|
||||
/**
|
||||
* Overridden to switch to Android implementation
|
||||
*/
|
||||
public class SimpleDateFormat extends java.text.DateFormat {
|
||||
private com.ibm.icu.text.SimpleDateFormat delegate;
|
||||
|
||||
public SimpleDateFormat() {
|
||||
delegate = new com.ibm.icu.text.SimpleDateFormat();
|
||||
}
|
||||
|
||||
private SimpleDateFormat(com.ibm.icu.text.SimpleDateFormat delegate) {
|
||||
this.delegate = delegate;
|
||||
}
|
||||
|
||||
public SimpleDateFormat(String pattern) {
|
||||
delegate = new com.ibm.icu.text.SimpleDateFormat(pattern);
|
||||
}
|
||||
|
||||
public SimpleDateFormat(String pattern, Locale loc) {
|
||||
delegate = new com.ibm.icu.text.SimpleDateFormat(pattern, loc);
|
||||
}
|
||||
|
||||
public SimpleDateFormat(String pattern, ULocale loc) {
|
||||
delegate = new com.ibm.icu.text.SimpleDateFormat(pattern, loc);
|
||||
}
|
||||
|
||||
public SimpleDateFormat(String pattern, String override, ULocale loc) {
|
||||
delegate = new com.ibm.icu.text.SimpleDateFormat(pattern, override, loc);
|
||||
}
|
||||
|
||||
public SimpleDateFormat(String pattern, DateFormatSymbols formatData) {
|
||||
delegate = new com.ibm.icu.text.SimpleDateFormat(pattern, formatData);
|
||||
}
|
||||
|
||||
public SimpleDateFormat(String pattern, DateFormatSymbols formatData, ULocale loc) {
|
||||
delegate = new com.ibm.icu.text.SimpleDateFormat(pattern, formatData, loc);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public static SimpleDateFormat getInstance(com.ibm.icu.util.Calendar.FormatConfiguration formatConfig) {
|
||||
return new SimpleDateFormat(com.ibm.icu.text.SimpleDateFormat.getInstance(formatConfig));
|
||||
}
|
||||
|
||||
public void set2DigitYearStart(Date startDate) {
|
||||
delegate.set2DigitYearStart(startDate);
|
||||
}
|
||||
|
||||
public Date get2DigitYearStart() {
|
||||
return delegate.get2DigitYearStart();
|
||||
}
|
||||
|
||||
public void setContext(DisplayContext context) {
|
||||
delegate.setContext(context);
|
||||
}
|
||||
|
||||
public StringBuffer format(com.ibm.icu.util.Calendar cal, StringBuffer toAppendTo, FieldPosition pos) {
|
||||
return delegate.format(cal, toAppendTo, pos);
|
||||
}
|
||||
|
||||
public void setNumberFormat(com.ibm.icu.text.NumberFormat newNumberFormat) {
|
||||
delegate.setNumberFormat(newNumberFormat);
|
||||
}
|
||||
|
||||
public void parse(String text, com.ibm.icu.util.Calendar cal, ParsePosition parsePos) {
|
||||
delegate.parse(text, cal, parsePos);
|
||||
}
|
||||
|
||||
public String toPattern() {
|
||||
return delegate.toPattern();
|
||||
}
|
||||
|
||||
public String toLocalizedPattern() {
|
||||
return delegate.toLocalizedPattern();
|
||||
}
|
||||
|
||||
public void applyPattern(String pat) {
|
||||
delegate.applyPattern(pat);
|
||||
}
|
||||
|
||||
public void applyLocalizedPattern(String pat) {
|
||||
delegate.applyLocalizedPattern(pat);
|
||||
}
|
||||
|
||||
public DateFormatSymbols getDateFormatSymbols() {
|
||||
return delegate.getDateFormatSymbols();
|
||||
}
|
||||
|
||||
public void setDateFormatSymbols(DateFormatSymbols newFormatSymbols) {
|
||||
delegate.setDateFormatSymbols(newFormatSymbols);
|
||||
}
|
||||
|
||||
public TimeZoneFormat getTimeZoneFormat() {
|
||||
return delegate.getTimeZoneFormat();
|
||||
}
|
||||
|
||||
public void setTimeZoneFormat(TimeZoneFormat tzfmt) {
|
||||
delegate.setTimeZoneFormat(tzfmt);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object clone() {
|
||||
return delegate.clone();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return delegate.hashCode();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
return delegate.equals(obj);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttributedCharacterIterator formatToCharacterIterator(Object obj) {
|
||||
return delegate.formatToCharacterIterator(obj);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public StringBuffer intervalFormatByAlgorithm(com.ibm.icu.util.Calendar fromCalendar, com.ibm.icu.util.Calendar toCalendar, StringBuffer appendTo, FieldPosition pos) throws IllegalArgumentException {
|
||||
return delegate.intervalFormatByAlgorithm(fromCalendar, toCalendar, appendTo, pos);
|
||||
}
|
||||
|
||||
public void setNumberFormat(String fields, com.ibm.icu.text.NumberFormat overrideNF) {
|
||||
delegate.setNumberFormat(fields, overrideNF);
|
||||
}
|
||||
|
||||
public com.ibm.icu.text.NumberFormat getNumberFormat(char field) {
|
||||
return delegate.getNumberFormat(field);
|
||||
}
|
||||
|
||||
@Override
|
||||
public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) {
|
||||
return delegate.format(date, toAppendTo, fieldPosition);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Date parse(String text) throws ParseException {
|
||||
return delegate.parse(text);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Date parse(String text, ParsePosition pos) {
|
||||
return delegate.parse(text, pos);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object parseObject(String source, ParsePosition pos) {
|
||||
return delegate.parseObject(source, pos);
|
||||
}
|
||||
|
||||
public static com.ibm.icu.text.DateFormat getTimeInstance(int style, ULocale locale) {
|
||||
return com.ibm.icu.text.DateFormat.getTimeInstance(style, locale);
|
||||
}
|
||||
|
||||
public static com.ibm.icu.text.DateFormat getDateInstance(int style, ULocale locale) {
|
||||
return com.ibm.icu.text.DateFormat.getDateInstance(style, locale);
|
||||
}
|
||||
|
||||
public static com.ibm.icu.text.DateFormat getDateTimeInstance(int dateStyle, int timeStyle, ULocale locale) {
|
||||
return com.ibm.icu.text.DateFormat.getDateTimeInstance(dateStyle, timeStyle, locale);
|
||||
}
|
||||
|
||||
public static Locale[] getAvailableLocales() {
|
||||
return com.ibm.icu.text.DateFormat.getAvailableLocales();
|
||||
}
|
||||
|
||||
public static ULocale[] getAvailableULocales() {
|
||||
return com.ibm.icu.text.DateFormat.getAvailableULocales();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setCalendar(java.util.Calendar newCalendar) {
|
||||
com.ibm.icu.util.Calendar cal = com.ibm.icu.util.Calendar.getInstance(com.ibm.icu.util.TimeZone.getTimeZone(newCalendar.getTimeZone().getID()));
|
||||
cal.setTimeInMillis(newCalendar.getTimeInMillis());
|
||||
delegate.setCalendar(cal);
|
||||
}
|
||||
|
||||
@Override
|
||||
public java.util.Calendar getCalendar() {
|
||||
return new Calendar(delegate.getCalendar());
|
||||
}
|
||||
|
||||
@Override
|
||||
public java.text.NumberFormat getNumberFormat() {
|
||||
return new NumberFormat(delegate.getNumberFormat());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setTimeZone(java.util.TimeZone zone) {
|
||||
delegate.setTimeZone(com.ibm.icu.util.TimeZone.getTimeZone(zone.getID()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public java.util.TimeZone getTimeZone() {
|
||||
return new TimeZone(delegate.getTimeZone());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setLenient(boolean lenient) {
|
||||
delegate.setLenient(lenient);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLenient() {
|
||||
return delegate.isLenient();
|
||||
}
|
||||
|
||||
public void setCalendarLenient(boolean lenient) {
|
||||
delegate.setCalendarLenient(lenient);
|
||||
}
|
||||
|
||||
public boolean isCalendarLenient() {
|
||||
return delegate.isCalendarLenient();
|
||||
}
|
||||
|
||||
public com.ibm.icu.text.DateFormat setBooleanAttribute(com.ibm.icu.text.DateFormat.BooleanAttribute key, boolean value) {
|
||||
return delegate.setBooleanAttribute(key, value);
|
||||
}
|
||||
|
||||
public boolean getBooleanAttribute(com.ibm.icu.text.DateFormat.BooleanAttribute key) {
|
||||
return delegate.getBooleanAttribute(key);
|
||||
}
|
||||
|
||||
public DisplayContext getContext(DisplayContext.Type type) {
|
||||
return delegate.getContext(type);
|
||||
}
|
||||
|
||||
public static com.ibm.icu.text.DateFormat getDateInstance(com.ibm.icu.util.Calendar cal, int dateStyle, Locale locale) {
|
||||
return com.ibm.icu.text.DateFormat.getDateInstance(cal, dateStyle, locale);
|
||||
}
|
||||
|
||||
public static com.ibm.icu.text.DateFormat getDateInstance(com.ibm.icu.util.Calendar cal, int dateStyle, ULocale locale) {
|
||||
return com.ibm.icu.text.DateFormat.getDateInstance(cal, dateStyle, locale);
|
||||
}
|
||||
|
||||
public static com.ibm.icu.text.DateFormat getTimeInstance(com.ibm.icu.util.Calendar cal, int timeStyle, Locale locale) {
|
||||
return com.ibm.icu.text.DateFormat.getTimeInstance(cal, timeStyle, locale);
|
||||
}
|
||||
|
||||
public static com.ibm.icu.text.DateFormat getTimeInstance(com.ibm.icu.util.Calendar cal, int timeStyle, ULocale locale) {
|
||||
return com.ibm.icu.text.DateFormat.getTimeInstance(cal, timeStyle, locale);
|
||||
}
|
||||
|
||||
public static com.ibm.icu.text.DateFormat getDateTimeInstance(com.ibm.icu.util.Calendar cal, int dateStyle, int timeStyle, Locale locale) {
|
||||
return com.ibm.icu.text.DateFormat.getDateTimeInstance(cal, dateStyle, timeStyle, locale);
|
||||
}
|
||||
|
||||
public static com.ibm.icu.text.DateFormat getDateTimeInstance(com.ibm.icu.util.Calendar cal, int dateStyle, int timeStyle, ULocale locale) {
|
||||
return com.ibm.icu.text.DateFormat.getDateTimeInstance(cal, dateStyle, timeStyle, locale);
|
||||
}
|
||||
|
||||
public static com.ibm.icu.text.DateFormat getInstance(com.ibm.icu.util.Calendar cal, Locale locale) {
|
||||
return com.ibm.icu.text.DateFormat.getInstance(cal, locale);
|
||||
}
|
||||
|
||||
public static com.ibm.icu.text.DateFormat getInstance(com.ibm.icu.util.Calendar cal, ULocale locale) {
|
||||
return com.ibm.icu.text.DateFormat.getInstance(cal, locale);
|
||||
}
|
||||
|
||||
public static com.ibm.icu.text.DateFormat getInstance(com.ibm.icu.util.Calendar cal) {
|
||||
return com.ibm.icu.text.DateFormat.getInstance(cal);
|
||||
}
|
||||
|
||||
public static com.ibm.icu.text.DateFormat getDateInstance(com.ibm.icu.util.Calendar cal, int dateStyle) {
|
||||
return com.ibm.icu.text.DateFormat.getDateInstance(cal, dateStyle);
|
||||
}
|
||||
|
||||
public static com.ibm.icu.text.DateFormat getTimeInstance(com.ibm.icu.util.Calendar cal, int timeStyle) {
|
||||
return com.ibm.icu.text.DateFormat.getTimeInstance(cal, timeStyle);
|
||||
}
|
||||
|
||||
public static com.ibm.icu.text.DateFormat getDateTimeInstance(com.ibm.icu.util.Calendar cal, int dateStyle, int timeStyle) {
|
||||
return com.ibm.icu.text.DateFormat.getDateTimeInstance(cal, dateStyle, timeStyle);
|
||||
}
|
||||
|
||||
public static com.ibm.icu.text.DateFormat getInstanceForSkeleton(String skeleton) {
|
||||
return com.ibm.icu.text.DateFormat.getInstanceForSkeleton(skeleton);
|
||||
}
|
||||
|
||||
public static com.ibm.icu.text.DateFormat getInstanceForSkeleton(String skeleton, Locale locale) {
|
||||
return com.ibm.icu.text.DateFormat.getInstanceForSkeleton(skeleton, locale);
|
||||
}
|
||||
|
||||
public static com.ibm.icu.text.DateFormat getInstanceForSkeleton(String skeleton, ULocale locale) {
|
||||
return com.ibm.icu.text.DateFormat.getInstanceForSkeleton(skeleton, locale);
|
||||
}
|
||||
|
||||
public static com.ibm.icu.text.DateFormat getInstanceForSkeleton(com.ibm.icu.util.Calendar cal, String skeleton, Locale locale) {
|
||||
return com.ibm.icu.text.DateFormat.getInstanceForSkeleton(cal, skeleton, locale);
|
||||
}
|
||||
|
||||
public static com.ibm.icu.text.DateFormat getInstanceForSkeleton(com.ibm.icu.util.Calendar cal, String skeleton, ULocale locale) {
|
||||
return com.ibm.icu.text.DateFormat.getInstanceForSkeleton(cal, skeleton, locale);
|
||||
}
|
||||
|
||||
public static com.ibm.icu.text.DateFormat getPatternInstance(String skeleton) {
|
||||
return com.ibm.icu.text.DateFormat.getPatternInstance(skeleton);
|
||||
}
|
||||
|
||||
public static com.ibm.icu.text.DateFormat getPatternInstance(String skeleton, Locale locale) {
|
||||
return com.ibm.icu.text.DateFormat.getPatternInstance(skeleton, locale);
|
||||
}
|
||||
|
||||
public static com.ibm.icu.text.DateFormat getPatternInstance(String skeleton, ULocale locale) {
|
||||
return com.ibm.icu.text.DateFormat.getPatternInstance(skeleton, locale);
|
||||
}
|
||||
|
||||
public static com.ibm.icu.text.DateFormat getPatternInstance(com.ibm.icu.util.Calendar cal, String skeleton, Locale locale) {
|
||||
return com.ibm.icu.text.DateFormat.getPatternInstance(cal, skeleton, locale);
|
||||
}
|
||||
|
||||
public static com.ibm.icu.text.DateFormat getPatternInstance(com.ibm.icu.util.Calendar cal, String skeleton, ULocale locale) {
|
||||
return com.ibm.icu.text.DateFormat.getPatternInstance(cal, skeleton, locale);
|
||||
}
|
||||
|
||||
public ULocale getLocale(ULocale.Type type) {
|
||||
return delegate.getLocale(type);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object parseObject(String source) throws ParseException {
|
||||
return delegate.parseObject(source);
|
||||
}
|
||||
}
|
@ -0,0 +1,294 @@
|
||||
package xyz.nulldev.androidcompat.replace.java.util;
|
||||
|
||||
/*
|
||||
* Copyright (C) Contributors to the Suwayomi project
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
import com.ibm.icu.text.DateFormat;
|
||||
import com.ibm.icu.util.ULocale;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.Locale;
|
||||
|
||||
public class Calendar extends java.util.Calendar {
|
||||
private com.ibm.icu.util.Calendar delegate;
|
||||
|
||||
public Calendar(com.ibm.icu.util.Calendar delegate) {
|
||||
this.delegate = delegate;
|
||||
}
|
||||
|
||||
public static java.util.Calendar getInstance() {
|
||||
return new Calendar(com.ibm.icu.util.Calendar.getInstance());
|
||||
}
|
||||
|
||||
public static com.ibm.icu.util.Calendar getInstance(com.ibm.icu.util.TimeZone zone) {
|
||||
return com.ibm.icu.util.Calendar.getInstance(zone);
|
||||
}
|
||||
|
||||
public static java.util.Calendar getInstance(Locale aLocale) {
|
||||
return new Calendar(com.ibm.icu.util.Calendar.getInstance(aLocale));
|
||||
}
|
||||
|
||||
public static com.ibm.icu.util.Calendar getInstance(ULocale locale) {
|
||||
return com.ibm.icu.util.Calendar.getInstance(locale);
|
||||
}
|
||||
|
||||
public static com.ibm.icu.util.Calendar getInstance(com.ibm.icu.util.TimeZone zone, Locale aLocale) {
|
||||
return com.ibm.icu.util.Calendar.getInstance(zone, aLocale);
|
||||
}
|
||||
|
||||
public static com.ibm.icu.util.Calendar getInstance(com.ibm.icu.util.TimeZone zone, ULocale locale) {
|
||||
return com.ibm.icu.util.Calendar.getInstance(zone, locale);
|
||||
}
|
||||
|
||||
public static Locale[] getAvailableLocales() {
|
||||
return com.ibm.icu.util.Calendar.getAvailableLocales();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void computeTime() {}
|
||||
|
||||
@Override
|
||||
protected void computeFields() {}
|
||||
|
||||
public static ULocale[] getAvailableULocales() {
|
||||
return com.ibm.icu.util.Calendar.getAvailableULocales();
|
||||
}
|
||||
|
||||
public static String[] getKeywordValuesForLocale(String key, ULocale locale, boolean commonlyUsed) {
|
||||
return com.ibm.icu.util.Calendar.getKeywordValuesForLocale(key, locale, commonlyUsed);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getTimeInMillis() {
|
||||
return delegate.getTimeInMillis();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setTimeInMillis(long millis) {
|
||||
delegate.setTimeInMillis(millis);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public int getRelatedYear() {
|
||||
return delegate.getRelatedYear();
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public void setRelatedYear(int year) {
|
||||
delegate.setRelatedYear(year);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
return delegate.equals(obj);
|
||||
}
|
||||
|
||||
public boolean isEquivalentTo(com.ibm.icu.util.Calendar other) {
|
||||
return delegate.isEquivalentTo(other);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return delegate.hashCode();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean before(Object when) {
|
||||
return delegate.before(when);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean after(Object when) {
|
||||
return delegate.after(when);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getActualMaximum(int field) {
|
||||
return delegate.getActualMaximum(field);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getActualMinimum(int field) {
|
||||
return delegate.getActualMinimum(field);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void roll(int field, int amount) {
|
||||
delegate.roll(field, amount);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void add(int field, int amount) {
|
||||
delegate.add(field, amount);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void roll(int field, boolean up) {
|
||||
roll(field, up ? 1 : -1);
|
||||
}
|
||||
|
||||
public String getDisplayName(Locale loc) {
|
||||
return delegate.getDisplayName(loc);
|
||||
}
|
||||
|
||||
public String getDisplayName(ULocale loc) {
|
||||
return delegate.getDisplayName(loc);
|
||||
}
|
||||
|
||||
public int compareTo(com.ibm.icu.util.Calendar that) {
|
||||
return delegate.compareTo(that);
|
||||
}
|
||||
|
||||
public DateFormat getDateTimeFormat(int dateStyle, int timeStyle, Locale loc) {
|
||||
return delegate.getDateTimeFormat(dateStyle, timeStyle, loc);
|
||||
}
|
||||
|
||||
public DateFormat getDateTimeFormat(int dateStyle, int timeStyle, ULocale loc) {
|
||||
return delegate.getDateTimeFormat(dateStyle, timeStyle, loc);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public static String getDateTimePattern(com.ibm.icu.util.Calendar cal, ULocale uLocale, int dateStyle) {
|
||||
return com.ibm.icu.util.Calendar.getDateTimePattern(cal, uLocale, dateStyle);
|
||||
}
|
||||
|
||||
public int fieldDifference(Date when, int field) {
|
||||
return delegate.fieldDifference(when, field);
|
||||
}
|
||||
|
||||
public void setTimeZone(com.ibm.icu.util.TimeZone value) {
|
||||
delegate.setTimeZone(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public java.util.TimeZone getTimeZone() {
|
||||
return new TimeZone(delegate.getTimeZone());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setLenient(boolean lenient) {
|
||||
delegate.setLenient(lenient);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLenient() {
|
||||
return delegate.isLenient();
|
||||
}
|
||||
|
||||
public void setRepeatedWallTimeOption(int option) {
|
||||
delegate.setRepeatedWallTimeOption(option);
|
||||
}
|
||||
|
||||
public int getRepeatedWallTimeOption() {
|
||||
return delegate.getRepeatedWallTimeOption();
|
||||
}
|
||||
|
||||
public void setSkippedWallTimeOption(int option) {
|
||||
delegate.setSkippedWallTimeOption(option);
|
||||
}
|
||||
|
||||
public int getSkippedWallTimeOption() {
|
||||
return delegate.getSkippedWallTimeOption();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setFirstDayOfWeek(int value) {
|
||||
delegate.setFirstDayOfWeek(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getFirstDayOfWeek() {
|
||||
return delegate.getFirstDayOfWeek();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setMinimalDaysInFirstWeek(int value) {
|
||||
delegate.setMinimalDaysInFirstWeek(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMinimalDaysInFirstWeek() {
|
||||
return delegate.getMinimalDaysInFirstWeek();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMinimum(int field) {
|
||||
return delegate.getMinimum(field);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMaximum(int field) {
|
||||
return delegate.getMaximum(field);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getGreatestMinimum(int field) {
|
||||
return delegate.getGreatestMinimum(field);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getLeastMaximum(int field) {
|
||||
return delegate.getLeastMaximum(field);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public int getDayOfWeekType(int dayOfWeek) {
|
||||
return delegate.getDayOfWeekType(dayOfWeek);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public int getWeekendTransition(int dayOfWeek) {
|
||||
return delegate.getWeekendTransition(dayOfWeek);
|
||||
}
|
||||
|
||||
public boolean isWeekend(Date date) {
|
||||
return delegate.isWeekend(date);
|
||||
}
|
||||
|
||||
public boolean isWeekend() {
|
||||
return delegate.isWeekend();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object clone() {
|
||||
return delegate.clone();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return delegate.toString();
|
||||
}
|
||||
|
||||
public static com.ibm.icu.util.Calendar.WeekData getWeekDataForRegion(String region) {
|
||||
return com.ibm.icu.util.Calendar.getWeekDataForRegion(region);
|
||||
}
|
||||
|
||||
public com.ibm.icu.util.Calendar.WeekData getWeekData() {
|
||||
return delegate.getWeekData();
|
||||
}
|
||||
|
||||
public com.ibm.icu.util.Calendar setWeekData(com.ibm.icu.util.Calendar.WeekData wdata) {
|
||||
return delegate.setWeekData(wdata);
|
||||
}
|
||||
|
||||
public int getFieldCount() {
|
||||
return delegate.getFieldCount();
|
||||
}
|
||||
|
||||
public String getType() {
|
||||
return delegate.getType();
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public boolean haveDefaultCentury() {
|
||||
return delegate.haveDefaultCentury();
|
||||
}
|
||||
|
||||
public ULocale getLocale(ULocale.Type type) {
|
||||
return delegate.getLocale(type);
|
||||
}
|
||||
}
|
@ -0,0 +1,196 @@
|
||||
package xyz.nulldev.androidcompat.replace.java.util;
|
||||
|
||||
/*
|
||||
* Copyright (C) Contributors to the Suwayomi project
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
import com.ibm.icu.util.ULocale;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.Locale;
|
||||
import java.util.Set;
|
||||
|
||||
public class TimeZone extends java.util.TimeZone {
|
||||
private com.ibm.icu.util.TimeZone delegate;
|
||||
|
||||
public TimeZone(com.ibm.icu.util.TimeZone delegate) {
|
||||
this.delegate = delegate;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getOffset(int era, int year, int month, int day, int dayOfWeek, int milliseconds) {
|
||||
return delegate.getOffset(era, year, month, day, dayOfWeek, milliseconds);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getOffset(long date) {
|
||||
return delegate.getOffset(date);
|
||||
}
|
||||
|
||||
public void getOffset(long date, boolean local, int[] offsets) {
|
||||
delegate.getOffset(date, local, offsets);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setRawOffset(int offsetMillis) {
|
||||
delegate.setRawOffset(offsetMillis);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getRawOffset() {
|
||||
return delegate.getRawOffset();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getID() {
|
||||
return delegate.getID();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setID(String ID) {
|
||||
delegate.setID(ID);
|
||||
}
|
||||
|
||||
public String getDisplayName(ULocale locale) {
|
||||
return delegate.getDisplayName(locale);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDisplayName(boolean daylight, int style, Locale locale) {
|
||||
return delegate.getDisplayName(daylight, style, locale);
|
||||
}
|
||||
|
||||
public String getDisplayName(boolean daylight, int style, ULocale locale) {
|
||||
return delegate.getDisplayName(daylight, style, locale);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getDSTSavings() {
|
||||
return delegate.getDSTSavings();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean useDaylightTime() {
|
||||
return delegate.useDaylightTime();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean observesDaylightTime() {
|
||||
return delegate.observesDaylightTime();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean inDaylightTime(Date date) {
|
||||
return delegate.inDaylightTime(date);
|
||||
}
|
||||
|
||||
public static java.util.TimeZone getTimeZone(String ID) {
|
||||
return new TimeZone(com.ibm.icu.util.TimeZone.getTimeZone(ID));
|
||||
}
|
||||
|
||||
public static com.ibm.icu.util.TimeZone getFrozenTimeZone(String ID) {
|
||||
return com.ibm.icu.util.TimeZone.getFrozenTimeZone(ID);
|
||||
}
|
||||
|
||||
public static com.ibm.icu.util.TimeZone getTimeZone(String ID, int type) {
|
||||
return com.ibm.icu.util.TimeZone.getTimeZone(ID, type);
|
||||
}
|
||||
|
||||
public static void setDefaultTimeZoneType(int type) {
|
||||
com.ibm.icu.util.TimeZone.setDefaultTimeZoneType(type);
|
||||
}
|
||||
|
||||
public static int getDefaultTimeZoneType() {
|
||||
return com.ibm.icu.util.TimeZone.getDefaultTimeZoneType();
|
||||
}
|
||||
|
||||
public static Set<String> getAvailableIDs(com.ibm.icu.util.TimeZone.SystemTimeZoneType zoneType, String region, Integer rawOffset) {
|
||||
return com.ibm.icu.util.TimeZone.getAvailableIDs(zoneType, region, rawOffset);
|
||||
}
|
||||
|
||||
public static String[] getAvailableIDs(int rawOffset) {
|
||||
return com.ibm.icu.util.TimeZone.getAvailableIDs(rawOffset);
|
||||
}
|
||||
|
||||
public static String[] getAvailableIDs(String country) {
|
||||
return com.ibm.icu.util.TimeZone.getAvailableIDs(country);
|
||||
}
|
||||
|
||||
public static String[] getAvailableIDs() {
|
||||
return com.ibm.icu.util.TimeZone.getAvailableIDs();
|
||||
}
|
||||
|
||||
public static int countEquivalentIDs(String id) {
|
||||
return com.ibm.icu.util.TimeZone.countEquivalentIDs(id);
|
||||
}
|
||||
|
||||
public static String getEquivalentID(String id, int index) {
|
||||
return com.ibm.icu.util.TimeZone.getEquivalentID(id, index);
|
||||
}
|
||||
|
||||
public static java.util.TimeZone getDefault() {
|
||||
return new TimeZone(com.ibm.icu.util.TimeZone.getDefault());
|
||||
}
|
||||
|
||||
public static void setDefault(com.ibm.icu.util.TimeZone tz) {
|
||||
com.ibm.icu.util.TimeZone.setDefault(tz);
|
||||
}
|
||||
|
||||
public boolean hasSameRules(com.ibm.icu.util.TimeZone other) {
|
||||
return delegate.hasSameRules(other);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object clone() {
|
||||
return delegate.clone();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
return delegate.equals(obj);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return delegate.hashCode();
|
||||
}
|
||||
|
||||
public static String getTZDataVersion() {
|
||||
return com.ibm.icu.util.TimeZone.getTZDataVersion();
|
||||
}
|
||||
|
||||
public static String getCanonicalID(String id) {
|
||||
return com.ibm.icu.util.TimeZone.getCanonicalID(id);
|
||||
}
|
||||
|
||||
public static String getCanonicalID(String id, boolean[] isSystemID) {
|
||||
return com.ibm.icu.util.TimeZone.getCanonicalID(id, isSystemID);
|
||||
}
|
||||
|
||||
public static String getRegion(String id) {
|
||||
return com.ibm.icu.util.TimeZone.getRegion(id);
|
||||
}
|
||||
|
||||
public static String getWindowsID(String id) {
|
||||
return com.ibm.icu.util.TimeZone.getWindowsID(id);
|
||||
}
|
||||
|
||||
public static String getIDForWindowsID(String winid, String region) {
|
||||
return com.ibm.icu.util.TimeZone.getIDForWindowsID(winid, region);
|
||||
}
|
||||
|
||||
public boolean isFrozen() {
|
||||
return delegate.isFrozen();
|
||||
}
|
||||
|
||||
public com.ibm.icu.util.TimeZone freeze() {
|
||||
return delegate.freeze();
|
||||
}
|
||||
|
||||
public com.ibm.icu.util.TimeZone cloneAsThawed() {
|
||||
return delegate.cloneAsThawed();
|
||||
}
|
||||
}
|
@ -18,7 +18,7 @@ class ServiceSupport {
|
||||
|
||||
private val logger = KotlinLogging.logger {}
|
||||
|
||||
fun startService(context: Context, intent: Intent) {
|
||||
fun startService(@Suppress("UNUSED_PARAMETER") context: Context, intent: Intent) {
|
||||
val name = intentToClassName(intent)
|
||||
|
||||
logger.debug { "Starting service: $name" }
|
||||
@ -35,7 +35,7 @@ class ServiceSupport {
|
||||
}
|
||||
}
|
||||
|
||||
fun stopService(context: Context, intent: Intent) {
|
||||
fun stopService(@Suppress("UNUSED_PARAMETER") context: Context, intent: Intent) {
|
||||
val name = intentToClassName(intent)
|
||||
stopService(name)
|
||||
}
|
||||
|
@ -25,6 +25,7 @@ object KodeinGlobalHelper {
|
||||
* Get a dependency
|
||||
*/
|
||||
@JvmStatic
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
fun <T : Any> instance(type: Class<T>, kodein: DI? = null): T {
|
||||
return when(type) {
|
||||
AndroidFiles::class.java -> {
|
||||
|
Loading…
Reference in New Issue
Block a user