diff --git a/app/src/main/java/com/hippo/ehviewer/EhApplication.kt b/app/src/main/java/com/hippo/ehviewer/EhApplication.kt index dc86a6b7f..b536008e2 100644 --- a/app/src/main/java/com/hippo/ehviewer/EhApplication.kt +++ b/app/src/main/java/com/hippo/ehviewer/EhApplication.kt @@ -275,9 +275,6 @@ class EhApplication : SceneApplication(), DefaultLifecycleObserver, ImageLoaderF @JvmStatic val ehCookieStore by lazy { EhCookieStore(application) } - @JvmStatic - val ehClient by lazy { EhClient() } - @JvmStatic val ehProxySelector by lazy { EhProxySelector() } diff --git a/app/src/main/java/com/hippo/ehviewer/client/EhClient.kt b/app/src/main/java/com/hippo/ehviewer/client/EhClient.kt index a85eacf13..644168ecf 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhClient.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/EhClient.kt @@ -16,167 +16,154 @@ package com.hippo.ehviewer.client import com.hippo.ehviewer.EhApplication.Companion.okHttpClient +import eu.kanade.tachiyomi.util.lang.launchIO import eu.kanade.tachiyomi.util.lang.withUIContext import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.CoroutineStart -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.Job -import kotlinx.coroutines.launch import java.io.File -class EhClient { +object EhClient { fun execute(request: EhRequest, scope: CoroutineScope) { - if (!request.isCancelled) { - val task = Task() - val job = scope.launch(Dispatchers.IO, CoroutineStart.LAZY) { - val method = request.method - val params = request.args - val callback: Callback? = request.callback - try { - val result: Any? = when (method) { - METHOD_SIGN_IN -> EhEngine.signIn( - mOkHttpClient, - params[0] as String, - params[1] as String - ) + check(!request.isActive) // Abort if attempt to execute an active request + request.job = scope.launchIO { + val method = request.method + val params = request.args + val callback: Callback? = request.callback + try { + val result: Any? = when (method) { + METHOD_SIGN_IN -> EhEngine.signIn( + mOkHttpClient, + params!![0] as String, + params[1] as String + ) - METHOD_GET_GALLERY_LIST -> EhEngine.getGalleryList( - mOkHttpClient, - params[0] as String - ) + METHOD_GET_GALLERY_LIST -> EhEngine.getGalleryList( + mOkHttpClient, + params!![0] as String + ) - METHOD_GET_GALLERY_DETAIL -> EhEngine.getGalleryDetail( - mOkHttpClient, - params[0] as String? - ) + METHOD_GET_GALLERY_DETAIL -> EhEngine.getGalleryDetail( + mOkHttpClient, + params!![0] as String? + ) - METHOD_GET_PREVIEW_SET -> EhEngine.getPreviewSet( - mOkHttpClient, - params[0] as String? - ) + METHOD_GET_PREVIEW_SET -> EhEngine.getPreviewSet( + mOkHttpClient, + params!![0] as String? + ) - METHOD_GET_RATE_GALLERY -> EhEngine.rateGallery( - mOkHttpClient, - (params[0] as Long), - params[1] as String?, - (params[2] as Long), - params[3] as String?, - (params[4] as Float) - ) + METHOD_GET_RATE_GALLERY -> EhEngine.rateGallery( + mOkHttpClient, + params!![0] as Long, + params[1] as String?, + params[2] as Long, + params[3] as String?, + params[4] as Float + ) - METHOD_GET_COMMENT_GALLERY -> EhEngine.commentGallery( - mOkHttpClient, - params[0] as String?, - params[1] as String, - params[2] as String? - ) + METHOD_GET_COMMENT_GALLERY -> EhEngine.commentGallery( + mOkHttpClient, + params!![0] as String?, + params[1] as String, + params[2] as String? + ) - METHOD_GET_GALLERY_TOKEN -> EhEngine.getGalleryToken( - mOkHttpClient, - (params[0] as Long), - params[1] as String?, - (params[2] as Int) - ) + METHOD_GET_GALLERY_TOKEN -> EhEngine.getGalleryToken( + mOkHttpClient, + params!![0] as Long, + params[1] as String?, + params[2] as Int + ) - METHOD_GET_FAVORITES -> EhEngine.getFavorites( - mOkHttpClient, - params[0] as String - ) + METHOD_GET_FAVORITES -> EhEngine.getFavorites( + mOkHttpClient, + params!![0] as String + ) - METHOD_ADD_FAVORITES -> EhEngine.addFavorites( - mOkHttpClient, - (params[0] as Long), - params[1] as String?, - (params[2] as Int), - params[3] as String? - ) + METHOD_ADD_FAVORITES -> EhEngine.addFavorites( + mOkHttpClient, + params!![0] as Long, + params[1] as String?, + params[2] as Int, + params[3] as String? + ) - METHOD_ADD_FAVORITES_RANGE -> @Suppress("UNCHECKED_CAST") EhEngine.addFavoritesRange( - mOkHttpClient, - params[0] as LongArray, - params[1] as Array, - (params[2] as Int) - ) + METHOD_ADD_FAVORITES_RANGE -> @Suppress("UNCHECKED_CAST") EhEngine.addFavoritesRange( + mOkHttpClient, + params!![0] as LongArray, + params[1] as Array, + params[2] as Int + ) - METHOD_MODIFY_FAVORITES -> EhEngine.modifyFavorites( - mOkHttpClient, - params[0] as String, - params[1] as LongArray, - (params[2] as Int) - ) + METHOD_MODIFY_FAVORITES -> EhEngine.modifyFavorites( + mOkHttpClient, + params!![0] as String, + params[1] as LongArray, + params[2] as Int + ) - METHOD_GET_TORRENT_LIST -> EhEngine.getTorrentList( - mOkHttpClient, - params[0] as String?, - (params[1] as Long), - params[2] as String? - ) + METHOD_GET_TORRENT_LIST -> EhEngine.getTorrentList( + mOkHttpClient, + params!![0] as String?, + params[1] as Long, + params[2] as String? + ) - METHOD_GET_PROFILE -> EhEngine.getProfile(mOkHttpClient) - METHOD_VOTE_COMMENT -> EhEngine.voteComment( - mOkHttpClient, - (params[0] as Long), - params[1] as String?, - (params[2] as Long), - params[3] as String?, - (params[4] as Long), - (params[5] as Int) - ) + METHOD_GET_PROFILE -> EhEngine.getProfile(mOkHttpClient) + METHOD_VOTE_COMMENT -> EhEngine.voteComment( + mOkHttpClient, + params!![0] as Long, + params[1] as String?, + params[2] as Long, + params[3] as String?, + params[4] as Long, + params[5] as Int + ) - METHOD_IMAGE_SEARCH -> EhEngine.imageSearch( - mOkHttpClient, - params[0] as File, - (params[1] as Boolean), - (params[2] as Boolean), - (params[3] as Boolean) - ) + METHOD_IMAGE_SEARCH -> EhEngine.imageSearch( + mOkHttpClient, + params!![0] as File, + params[1] as Boolean, + params[2] as Boolean, + params[3] as Boolean + ) - METHOD_ARCHIVE_LIST -> EhEngine.getArchiveList( - mOkHttpClient, - params[0] as String?, - (params[1] as Long), - params[2] as String? - ) + METHOD_ARCHIVE_LIST -> EhEngine.getArchiveList( + mOkHttpClient, + params!![0] as String?, + params[1] as Long, + params[2] as String? + ) - METHOD_DOWNLOAD_ARCHIVE -> EhEngine.downloadArchive( - mOkHttpClient, - (params[0] as Long), - params[1] as String?, - params[2] as String?, - params[3] as String?, - (params[4] as Boolean) - ) + METHOD_DOWNLOAD_ARCHIVE -> EhEngine.downloadArchive( + mOkHttpClient, + params!![0] as Long, + params[1] as String?, + params[2] as String?, + params[3] as String?, + params[4] as Boolean + ) - METHOD_VOTE_TAG -> EhEngine.voteTag( - mOkHttpClient, - (params[0] as Long), - params[1] as String?, - (params[2] as Long), - params[3] as String?, - params[4] as String?, - (params[5] as Int) - ) + METHOD_VOTE_TAG -> EhEngine.voteTag( + mOkHttpClient, + params!![0] as Long, + params[1] as String?, + params[2] as Long, + params[3] as String?, + params[4] as String?, + params[5] as Int + ) - METHOD_GET_UCONFIG -> EhEngine.getUConfig(mOkHttpClient) - else -> throw IllegalStateException("Can't detect method $method") - } - withUIContext { callback?.onSuccess(result) } - } catch (e: Exception) { - if (e is CancellationException) - throw e // Don't catch coroutine CancellationException - e.printStackTrace() - withUIContext { callback?.onFailure(e) } + METHOD_GET_UCONFIG -> EhEngine.getUConfig(mOkHttpClient) + else -> throw IllegalStateException("Can't detect method $method") } - request.task = null - request.callback = null + withUIContext { callback?.onSuccess(result) } + } catch (e: Exception) { + if (e is CancellationException) + throw e // Don't catch coroutine CancellationException + e.printStackTrace() + withUIContext { callback?.onFailure(e) } } - task.job = job - task.mCallback = request.callback - request.task = task - job.start() - } else { - request.callback?.onCancel() } } @@ -186,40 +173,24 @@ class EhClient { fun onCancel() } - class Task { - internal var mCallback: Callback<*>? = null - internal var job: Job? = null - private val mStop - get() = !(job?.isActive ?: false) - - fun stop() { - if (!mStop) { - job?.cancel() - mCallback?.onCancel() - } - } - } - - companion object { - const val METHOD_SIGN_IN = 0 - const val METHOD_GET_GALLERY_LIST = 1 - const val METHOD_GET_GALLERY_DETAIL = 3 - const val METHOD_GET_PREVIEW_SET = 4 - const val METHOD_GET_RATE_GALLERY = 5 - const val METHOD_GET_COMMENT_GALLERY = 6 - const val METHOD_GET_GALLERY_TOKEN = 7 - const val METHOD_GET_FAVORITES = 8 - const val METHOD_ADD_FAVORITES = 9 - const val METHOD_ADD_FAVORITES_RANGE = 10 - const val METHOD_MODIFY_FAVORITES = 11 - const val METHOD_GET_TORRENT_LIST = 12 - const val METHOD_GET_PROFILE = 14 - const val METHOD_VOTE_COMMENT = 15 - const val METHOD_IMAGE_SEARCH = 16 - const val METHOD_ARCHIVE_LIST = 17 - const val METHOD_DOWNLOAD_ARCHIVE = 18 - const val METHOD_VOTE_TAG = 19 - const val METHOD_GET_UCONFIG = 20 - private val mOkHttpClient = okHttpClient - } + const val METHOD_SIGN_IN = 0 + const val METHOD_GET_GALLERY_LIST = 1 + const val METHOD_GET_GALLERY_DETAIL = 3 + const val METHOD_GET_PREVIEW_SET = 4 + const val METHOD_GET_RATE_GALLERY = 5 + const val METHOD_GET_COMMENT_GALLERY = 6 + const val METHOD_GET_GALLERY_TOKEN = 7 + const val METHOD_GET_FAVORITES = 8 + const val METHOD_ADD_FAVORITES = 9 + const val METHOD_ADD_FAVORITES_RANGE = 10 + const val METHOD_MODIFY_FAVORITES = 11 + const val METHOD_GET_TORRENT_LIST = 12 + const val METHOD_GET_PROFILE = 14 + const val METHOD_VOTE_COMMENT = 15 + const val METHOD_IMAGE_SEARCH = 16 + const val METHOD_ARCHIVE_LIST = 17 + const val METHOD_DOWNLOAD_ARCHIVE = 18 + const val METHOD_VOTE_TAG = 19 + const val METHOD_GET_UCONFIG = 20 + private val mOkHttpClient = okHttpClient } \ No newline at end of file diff --git a/app/src/main/java/com/hippo/ehviewer/client/EhRequest.kt b/app/src/main/java/com/hippo/ehviewer/client/EhRequest.kt index 5cd308d80..a80cadb4e 100644 --- a/app/src/main/java/com/hippo/ehviewer/client/EhRequest.kt +++ b/app/src/main/java/com/hippo/ehviewer/client/EhRequest.kt @@ -13,67 +13,43 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +package com.hippo.ehviewer.client -package com.hippo.ehviewer.client; +import androidx.annotation.MainThread +import kotlinx.coroutines.Job -import com.hippo.ehviewer.Settings; +class EhRequest { + internal var job: Job? = null + val isActive + get() = job?.isActive ?: false + var method = 0 + private set + var args: Array? = null + private set + var callback: EhClient.Callback? = null + private set -public class EhRequest { - - EhClient.Task task; - private int mMethod; - private Object[] mArgs; - private EhClient.Callback mCallback; - private EhConfig mEhConfig; - private boolean mCancel = false; - - public int getMethod() { - return mMethod; + fun setMethod(method: Int): EhRequest { + this.method = method + return this } - public EhRequest setMethod(int method) { - mMethod = method; - return this; + fun setArgs(vararg args: Any): EhRequest { + this.args = args + return this } - public Object[] getArgs() { - return mArgs; + @Suppress("UNCHECKED_CAST") + fun setCallback(callback: EhClient.Callback<*>?): EhRequest { + this.callback = callback as EhClient.Callback? + return this } - public EhRequest setArgs(Object... args) { - mArgs = args; - return this; - } - - public EhClient.Callback getCallback() { - return mCallback; - } - - public EhRequest setCallback(EhClient.Callback callback) { - mCallback = callback; - return this; - } - - public EhConfig getEhConfig() { - return mEhConfig != null ? mEhConfig : Settings.getEhConfig(); - } - - public EhRequest setEhConfig(EhConfig ehConfig) { - mEhConfig = ehConfig; - return this; - } - - public void cancel() { - if (!mCancel) { - mCancel = true; - if (task != null) { - task.stop(); - task = null; - } + @MainThread + fun cancel() { + if (isActive) { + job?.cancel() + callback?.onCancel() } } - - public boolean isCancelled() { - return mCancel; - } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/hippo/ehviewer/ui/CommonOperations.java b/app/src/main/java/com/hippo/ehviewer/ui/CommonOperations.java index 0af1aef43..5c2950ca4 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/CommonOperations.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/CommonOperations.java @@ -55,7 +55,7 @@ public final class CommonOperations { EhDB.putLocalFavorites(galleryInfo); listener.onSuccess(null); } else if (slot >= 0 && slot <= 9) { - EhClient client = EhApplication.getEhClient(); + EhClient client = EhClient.INSTANCE; EhRequest request = new EhRequest(); request.setMethod(EhClient.METHOD_ADD_FAVORITES); request.setArgs(galleryInfo.gid, galleryInfo.token, slot, ""); @@ -102,7 +102,7 @@ public final class CommonOperations { public static void removeFromFavorites(Activity activity, GalleryInfo galleryInfo, final EhClient.Callback listener) { EhDB.removeLocalFavorites(galleryInfo.gid); - EhClient client = EhApplication.getEhClient(); + EhClient client = EhClient.INSTANCE; EhRequest request = new EhRequest(); request.setMethod(EhClient.METHOD_ADD_FAVORITES); request.setArgs(galleryInfo.gid, galleryInfo.token, -1, ""); diff --git a/app/src/main/java/com/hippo/ehviewer/ui/fragment/AdvancedFragment.kt b/app/src/main/java/com/hippo/ehviewer/ui/fragment/AdvancedFragment.kt index 032ca2a27..d026b1a35 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/fragment/AdvancedFragment.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/fragment/AdvancedFragment.kt @@ -13,377 +13,395 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +package com.hippo.ehviewer.ui.fragment -package com.hippo.ehviewer.ui.fragment; +import android.annotation.SuppressLint +import android.app.Activity +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.os.Bundle +import android.provider.Settings +import android.util.Log +import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.app.AppCompatDelegate +import androidx.core.os.LocaleListCompat +import androidx.lifecycle.coroutineScope +import androidx.lifecycle.lifecycleScope +import androidx.preference.Preference +import com.hippo.app.BaseDialogBuilder +import com.hippo.ehviewer.AppConfig +import com.hippo.ehviewer.BuildConfig +import com.hippo.ehviewer.EhDB +import com.hippo.ehviewer.GetText +import com.hippo.ehviewer.R +import com.hippo.ehviewer.client.EhClient +import com.hippo.ehviewer.client.EhRequest +import com.hippo.ehviewer.client.data.FavListUrlBuilder +import com.hippo.ehviewer.client.parser.FavoritesParser +import com.hippo.ehviewer.ui.scene.BaseScene +import com.hippo.util.ExceptionUtils +import com.hippo.util.IoThreadPoolExecutor +import com.hippo.util.LogCat +import com.hippo.util.ReadableTime +import com.hippo.yorozuya.IOUtils +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking +import java.io.BufferedInputStream +import java.io.BufferedOutputStream +import java.io.File +import java.io.FileInputStream +import java.io.FileOutputStream +import java.util.zip.ZipEntry +import java.util.zip.ZipOutputStream +import kotlin.math.ceil -import android.annotation.SuppressLint; -import android.app.Activity; -import android.content.Intent; -import android.net.Uri; -import android.os.Build; -import android.os.Bundle; -import android.util.Log; - -import androidx.activity.result.ActivityResultLauncher; -import androidx.activity.result.contract.ActivityResultContracts; -import androidx.annotation.Nullable; -import androidx.appcompat.app.AlertDialog; -import androidx.appcompat.app.AppCompatDelegate; -import androidx.core.os.LocaleListCompat; -import androidx.lifecycle.LifecycleKt; -import androidx.preference.Preference; - -import com.hippo.app.BaseDialogBuilder; -import com.hippo.ehviewer.AppConfig; -import com.hippo.ehviewer.BuildConfig; -import com.hippo.ehviewer.EhApplication; -import com.hippo.ehviewer.EhDB; -import com.hippo.ehviewer.GetText; -import com.hippo.ehviewer.R; -import com.hippo.ehviewer.Settings; -import com.hippo.ehviewer.client.EhClient; -import com.hippo.ehviewer.client.EhRequest; -import com.hippo.ehviewer.client.data.FavListUrlBuilder; -import com.hippo.ehviewer.client.parser.FavoritesParser; -import com.hippo.ehviewer.ui.scene.BaseScene; -import com.hippo.util.ExceptionUtils; -import com.hippo.util.IoThreadPoolExecutor; -import com.hippo.util.LogCat; -import com.hippo.util.ReadableTime; -import com.hippo.yorozuya.IOUtils; - -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; - -public class AdvancedFragment extends BasePreferenceFragment { - - private static final String KEY_DUMP_LOGCAT = "dump_logcat"; - private static final String KEY_APP_LANGUAGE = "app_language"; - private static final String KEY_IMPORT_DATA = "import_data"; - private static final String KEY_EXPORT_DATA = "export_data"; - private static final String KEY_OPEN_BY_DEFAULT = "open_by_default"; - private static final String KEY_BACKUP_FAVORITE = "backup_favorite"; - ActivityResultLauncher exportLauncher = registerForActivityResult( - new ActivityResultContracts.CreateDocument("application/vnd.sqlite3"), - uri -> { - if (uri != null) { - try { - // grantUriPermission might throw RemoteException on MIUI - requireActivity().grantUriPermission(BuildConfig.APPLICATION_ID, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION); - } catch (Exception e) { - ExceptionUtils.throwIfFatal(e); - e.printStackTrace(); - } - try { - AlertDialog alertDialog = new BaseDialogBuilder(requireActivity()) - .setCancelable(false) - .setView(R.layout.preference_dialog_task) - .show(); - IoThreadPoolExecutor.getInstance().execute(() -> { - boolean success = EhDB.exportDB(requireActivity(), uri); - Activity activity = getActivity(); - if (activity != null) { - activity.runOnUiThread(() -> { - if (alertDialog.isShowing()) { - alertDialog.dismiss(); - } - showTip( - (success) - ? GetText.getString(R.string.settings_advanced_export_data_to, uri.toString()) - : GetText.getString(R.string.settings_advanced_export_data_failed), - BaseScene.LENGTH_SHORT); - }); - } - }); - } catch (Exception e) { - showTip(R.string.settings_advanced_export_data_failed, BaseScene.LENGTH_SHORT); - } - } - }); - ActivityResultLauncher dumpLogcatLauncher = registerForActivityResult( - new ActivityResultContracts.CreateDocument("application/zip"), - uri -> { - if (uri != null) { - try { - // grantUriPermission might throw RemoteException on MIUI - requireActivity().grantUriPermission(BuildConfig.APPLICATION_ID, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION); - } catch (Exception e) { - ExceptionUtils.throwIfFatal(e); - e.printStackTrace(); - } - try { - File zipFile = new File(AppConfig.getExternalTempDir(), "logs.zip"); - if (zipFile.exists()) { - //noinspection ResultOfMethodCallIgnored - zipFile.delete(); - } - - ArrayList files = new ArrayList<>(); - files.addAll(Arrays.asList(AppConfig.getExternalParseErrorDir().listFiles())); - files.addAll(Arrays.asList(AppConfig.getExternalCrashDir().listFiles())); - - boolean finished = false; - - BufferedInputStream origin = null; - ZipOutputStream out = null; - try { - FileOutputStream dest = new FileOutputStream(zipFile); - out = new ZipOutputStream(new BufferedOutputStream(dest)); - byte[] bytes = new byte[1024 * 64]; - - for (File file : files) { - if (!file.isFile()) { - continue; - } - try { - FileInputStream fi = new FileInputStream(file); - origin = new BufferedInputStream(fi, bytes.length); - - ZipEntry entry = new ZipEntry(file.getName()); - out.putNextEntry(entry); - int count; - while ((count = origin.read(bytes, 0, bytes.length)) != -1) { - out.write(bytes, 0, count); - } - origin.close(); - origin = null; - } catch (Exception e) { - e.printStackTrace(); - } - } - - ZipEntry entry = new ZipEntry("logcat-" + ReadableTime.getFilenamableTime(System.currentTimeMillis()) + ".txt"); - out.putNextEntry(entry); - LogCat.save(out); - out.closeEntry(); - out.close(); - IOUtils.copy(new FileInputStream(zipFile), requireActivity().getContentResolver().openOutputStream(uri)); - finished = true; - } catch (Exception e) { - e.printStackTrace(); - } finally { - if (origin != null) { - origin.close(); - } - if (out != null) { - out.close(); - } - } - if (!finished) { - finished = LogCat.save(requireActivity().getContentResolver().openOutputStream(uri)); +class AdvancedFragment : BasePreferenceFragment() { + private var exportLauncher = registerForActivityResult( + ActivityResultContracts.CreateDocument("application/vnd.sqlite3") + ) { uri: Uri? -> + if (uri != null) { + try { + // grantUriPermission might throw RemoteException on MIUI + requireActivity().grantUriPermission( + BuildConfig.APPLICATION_ID, + uri, + Intent.FLAG_GRANT_WRITE_URI_PERMISSION + ) + } catch (e: Exception) { + ExceptionUtils.throwIfFatal(e) + e.printStackTrace() + } + try { + val alertDialog = BaseDialogBuilder(requireActivity()) + .setCancelable(false) + .setView(R.layout.preference_dialog_task) + .show() + IoThreadPoolExecutor.getInstance().execute { + val success = EhDB.exportDB(requireActivity(), uri) + val activity: Activity? = activity + activity?.runOnUiThread { + if (alertDialog.isShowing) { + alertDialog.dismiss() } showTip( - finished ? getString(R.string.settings_advanced_dump_logcat_to, uri.toString()) : - getString(R.string.settings_advanced_dump_logcat_failed), BaseScene.LENGTH_SHORT); - } catch (Exception e) { - showTip(getString(R.string.settings_advanced_dump_logcat_failed), BaseScene.LENGTH_SHORT); + if (success) GetText.getString( + R.string.settings_advanced_export_data_to, + uri.toString() + ) else GetText.getString(R.string.settings_advanced_export_data_failed), + BaseScene.LENGTH_SHORT + ) } } - }); - ActivityResultLauncher importDataLauncher = registerForActivityResult( - new ActivityResultContracts.OpenDocument(), - uri -> { - if (uri != null) { - try { - // grantUriPermission might throw RemoteException on MIUI - requireActivity().grantUriPermission(BuildConfig.APPLICATION_ID, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION); - } catch (Exception e) { - ExceptionUtils.throwIfFatal(e); - e.printStackTrace(); - } - try { - AlertDialog alertDialog = new BaseDialogBuilder(requireActivity()) - .setCancelable(false) - .setView(R.layout.preference_dialog_task) - .show(); - IoThreadPoolExecutor.getInstance().execute(() -> { - final String error = EhDB.importDB(requireActivity(), uri); - Activity activity = getActivity(); - if (activity != null) { - activity.runOnUiThread(() -> { - if (alertDialog.isShowing()) { - alertDialog.dismiss(); - } - if (null == error) { - showTip(getString(R.string.settings_advanced_import_data_successfully), BaseScene.LENGTH_SHORT); - } else { - showTip(error, BaseScene.LENGTH_SHORT); - } - }); + } catch (e: Exception) { + showTip(R.string.settings_advanced_export_data_failed, BaseScene.LENGTH_SHORT) + } + } + } + private var dumpLogcatLauncher = registerForActivityResult( + ActivityResultContracts.CreateDocument("application/zip") + ) { uri: Uri? -> + if (uri != null) { + try { + // grantUriPermission might throw RemoteException on MIUI + requireActivity().grantUriPermission( + BuildConfig.APPLICATION_ID, + uri, + Intent.FLAG_GRANT_WRITE_URI_PERMISSION + ) + } catch (e: Exception) { + ExceptionUtils.throwIfFatal(e) + e.printStackTrace() + } + try { + val zipFile = File(AppConfig.getExternalTempDir(), "logs.zip") + if (zipFile.exists()) { + zipFile.delete() + } + val files = ArrayList() + AppConfig.getExternalParseErrorDir()?.listFiles()?.let { files.addAll(it) } + AppConfig.getExternalCrashDir()?.listFiles()?.let { files.addAll(it) } + var finished = false + var origin: BufferedInputStream? = null + var out: ZipOutputStream? = null + try { + val dest = FileOutputStream(zipFile) + out = ZipOutputStream(BufferedOutputStream(dest)) + val bytes = ByteArray(1024 * 64) + for (file in files) { + if (!file.isFile) { + continue + } + try { + val fi = FileInputStream(file) + origin = BufferedInputStream(fi, bytes.size) + val entry = ZipEntry(file.name) + out.putNextEntry(entry) + var count: Int + while (origin.read(bytes, 0, bytes.size).also { count = it } != -1) { + out.write(bytes, 0, count) } - - }); - } catch (Exception e) { - showTip(e.getLocalizedMessage(), BaseScene.LENGTH_SHORT); + origin.close() + origin = null + } catch (e: Exception) { + e.printStackTrace() + } + } + val entry = + ZipEntry("logcat-" + ReadableTime.getFilenamableTime(System.currentTimeMillis()) + ".txt") + out.putNextEntry(entry) + LogCat.save(out) + out.closeEntry() + out.close() + IOUtils.copy( + FileInputStream(zipFile), + requireActivity().contentResolver.openOutputStream(uri) + ) + finished = true + } catch (e: Exception) { + e.printStackTrace() + } finally { + origin?.close() + out?.close() + } + if (!finished) { + finished = LogCat.save(requireActivity().contentResolver.openOutputStream(uri)) + } + showTip( + if (finished) getString( + R.string.settings_advanced_dump_logcat_to, + uri.toString() + ) else getString(R.string.settings_advanced_dump_logcat_failed), + BaseScene.LENGTH_SHORT + ) + } catch (e: Exception) { + showTip( + getString(R.string.settings_advanced_dump_logcat_failed), + BaseScene.LENGTH_SHORT + ) + } + } + } + private var importDataLauncher = registerForActivityResult, Uri>( + ActivityResultContracts.OpenDocument() + ) { uri: Uri? -> + if (uri != null) { + try { + // grantUriPermission might throw RemoteException on MIUI + requireActivity().grantUriPermission( + BuildConfig.APPLICATION_ID, + uri, + Intent.FLAG_GRANT_READ_URI_PERMISSION + ) + } catch (e: Exception) { + ExceptionUtils.throwIfFatal(e) + e.printStackTrace() + } + try { + val alertDialog = BaseDialogBuilder(requireActivity()) + .setCancelable(false) + .setView(R.layout.preference_dialog_task) + .show() + IoThreadPoolExecutor.getInstance().execute { + val error = EhDB.importDB(requireActivity(), uri) + val activity: Activity? = activity + activity?.runOnUiThread { + if (alertDialog.isShowing) { + alertDialog.dismiss() + } + if (null == error) { + showTip( + getString(R.string.settings_advanced_import_data_successfully), + BaseScene.LENGTH_SHORT + ) + } else { + showTip(error, BaseScene.LENGTH_SHORT) + } } } - }); - private int favTotal; - private int favIndex; - - @Override - public void onCreatePreferences(@Nullable Bundle savedInstanceState, String rootKey) { - addPreferencesFromResource(R.xml.advanced_settings); - - Preference dumpLogcat = findPreference(KEY_DUMP_LOGCAT); - Preference appLanguage = findPreference(KEY_APP_LANGUAGE); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) - appLanguage.setVisible(false); - Preference importData = findPreference(KEY_IMPORT_DATA); - Preference exportData = findPreference(KEY_EXPORT_DATA); - Preference backupFavorite = findPreference(KEY_BACKUP_FAVORITE); - Preference openByDefault = findPreference(KEY_OPEN_BY_DEFAULT); - + } catch (e: Exception) { + showTip(e.localizedMessage, BaseScene.LENGTH_SHORT) + } + } + } + private var favTotal = 0 + private var favIndex = 0 + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + addPreferencesFromResource(R.xml.advanced_settings) + val dumpLogcat = findPreference(KEY_DUMP_LOGCAT) + val appLanguage = findPreference(KEY_APP_LANGUAGE) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) appLanguage!!.isVisible = false + val importData = findPreference(KEY_IMPORT_DATA) + val exportData = findPreference(KEY_EXPORT_DATA) + val backupFavorite = findPreference(KEY_BACKUP_FAVORITE) + val openByDefault = findPreference(KEY_OPEN_BY_DEFAULT) if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { - openByDefault.setVisible(false); + openByDefault!!.isVisible = false } else { - openByDefault.setOnPreferenceClickListener(this); + openByDefault!!.onPreferenceClickListener = this } - - dumpLogcat.setOnPreferenceClickListener(this); - importData.setOnPreferenceClickListener(this); - exportData.setOnPreferenceClickListener(this); - backupFavorite.setOnPreferenceClickListener(this); - - appLanguage.setOnPreferenceChangeListener(this); + dumpLogcat!!.onPreferenceClickListener = this + importData!!.onPreferenceClickListener = this + exportData!!.onPreferenceClickListener = this + backupFavorite!!.onPreferenceClickListener = this + appLanguage!!.onPreferenceChangeListener = this } - @Override - public boolean onPreferenceClick(Preference preference) { - String key = preference.getKey(); - if (KEY_DUMP_LOGCAT.equals(key)) { + override fun onPreferenceClick(preference: Preference): Boolean { + val key = preference.key + if (KEY_DUMP_LOGCAT == key) { try { - dumpLogcatLauncher.launch("log-" + ReadableTime.getFilenamableTime(System.currentTimeMillis()) + ".zip"); - } catch (Throwable e) { - ExceptionUtils.throwIfFatal(e); - showTip(R.string.error_cant_find_activity, BaseScene.LENGTH_SHORT); + dumpLogcatLauncher.launch("log-" + ReadableTime.getFilenamableTime(System.currentTimeMillis()) + ".zip") + } catch (e: Throwable) { + ExceptionUtils.throwIfFatal(e) + showTip(R.string.error_cant_find_activity, BaseScene.LENGTH_SHORT) } - return true; - } else if (KEY_IMPORT_DATA.equals(key)) { + return true + } else if (KEY_IMPORT_DATA == key) { try { - importDataLauncher.launch(new String[]{"*/*"}); - } catch (Throwable e) { - ExceptionUtils.throwIfFatal(e); - showTip(R.string.error_cant_find_activity, BaseScene.LENGTH_SHORT); + importDataLauncher.launch(arrayOf("*/*")) + } catch (e: Throwable) { + ExceptionUtils.throwIfFatal(e) + showTip(R.string.error_cant_find_activity, BaseScene.LENGTH_SHORT) } - return true; - } else if (KEY_EXPORT_DATA.equals(key)) { + return true + } else if (KEY_EXPORT_DATA == key) { try { - exportLauncher.launch(ReadableTime.getFilenamableTime(System.currentTimeMillis()) + ".db"); - } catch (Throwable e) { - ExceptionUtils.throwIfFatal(e); - showTip(R.string.error_cant_find_activity, BaseScene.LENGTH_SHORT); + exportLauncher.launch(ReadableTime.getFilenamableTime(System.currentTimeMillis()) + ".db") + } catch (e: Throwable) { + ExceptionUtils.throwIfFatal(e) + showTip(R.string.error_cant_find_activity, BaseScene.LENGTH_SHORT) } - return true; - } else if (KEY_BACKUP_FAVORITE.equals(key)) { + return true + } else if (KEY_BACKUP_FAVORITE == key) { try { - backupFavorite(); - } catch (Exception e) { - ExceptionUtils.throwIfFatal(e); - showTip(R.string.settings_advanced_backup_favorite_failed, BaseScene.LENGTH_SHORT); + backupFavorite() + } catch (e: Exception) { + ExceptionUtils.throwIfFatal(e) + showTip(R.string.settings_advanced_backup_favorite_failed, BaseScene.LENGTH_SHORT) } - return true; - } else if (KEY_OPEN_BY_DEFAULT.equals(key)) { + return true + } else if (KEY_OPEN_BY_DEFAULT == key) { try { - @SuppressLint("InlinedApi") Intent intent = new Intent(android.provider.Settings.ACTION_APP_OPEN_BY_DEFAULT_SETTINGS, - Uri.parse("package:" + requireContext().getPackageName())); - startActivity(intent); - } catch (Throwable t) { - Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, - Uri.parse("package:" + requireContext().getPackageName())); - startActivity(intent); + @SuppressLint("InlinedApi") val intent = Intent( + Settings.ACTION_APP_OPEN_BY_DEFAULT_SETTINGS, + Uri.parse("package:" + requireContext().packageName) + ) + startActivity(intent) + } catch (t: Throwable) { + val intent = Intent( + Settings.ACTION_APPLICATION_DETAILS_SETTINGS, + Uri.parse("package:" + requireContext().packageName) + ) + startActivity(intent) } - return true; + return true } - return false; + return false } - private void backupFavorite() { - EhClient mClient = EhApplication.getEhClient(); - FavListUrlBuilder favListUrlBuilder = new FavListUrlBuilder(); - favTotal = 0; - favIndex = 1; - - EhRequest request = new EhRequest(); - request.setMethod(EhClient.METHOD_GET_FAVORITES); - request.setCallback(new EhClient.Callback() { - @Override - public void onSuccess(FavoritesParser.Result result) { + private fun backupFavorite() { + val mClient = EhClient + val favListUrlBuilder = FavListUrlBuilder() + favTotal = 0 + favIndex = 1 + val request = EhRequest() + request.setMethod(EhClient.METHOD_GET_FAVORITES) + request.setCallback(object : EhClient.Callback { + override fun onSuccess(result: FavoritesParser.Result) { try { if (result.galleryInfoList.isEmpty()) { - showTip(R.string.settings_advanced_backup_favorite_nothing, BaseScene.LENGTH_SHORT); + showTip( + R.string.settings_advanced_backup_favorite_nothing, + BaseScene.LENGTH_SHORT + ) } else { if (favTotal == 0 && result.countArray != null) { - int totalFav = 0; - for (int i = 0; i < 10; i++) { - totalFav = totalFav + result.countArray[i]; + var totalFav = 0 + for (i in 0..9) { + totalFav += result.countArray[i] } - favTotal = (int) Math.ceil((double) totalFav / result.galleryInfoList.size()); + favTotal = + ceil(totalFav.toDouble() / result.galleryInfoList.size).toInt() } - - String status = "(" + favIndex + "/" + favTotal + ")"; - showTip(GetText.getString(R.string.settings_advanced_backup_favorite_start, status), BaseScene.LENGTH_SHORT); - Log.d("LocalFavorites", "now backup page " + status); - EhDB.putLocalFavorites(result.galleryInfoList); - + val status = "($favIndex/$favTotal)" + showTip( + GetText.getString( + R.string.settings_advanced_backup_favorite_start, + status + ), BaseScene.LENGTH_SHORT + ) + Log.d("LocalFavorites", "now backup page $status") + EhDB.putLocalFavorites(result.galleryInfoList) if (result.next != null) { try { - Thread.sleep(Settings.getDownloadDelay()); - } catch (InterruptedException e) { - e.printStackTrace(); + runBlocking { + delay(com.hippo.ehviewer.Settings.getDownloadDelay().toLong()) + } + } catch (e: InterruptedException) { + e.printStackTrace() + } + favIndex++ + favListUrlBuilder.setIndex(result.next, true) + request.setArgs(favListUrlBuilder.build()) + viewLifecycleOwner.lifecycleScope.launch { + delay(100) + mClient.execute( + request, + viewLifecycleOwner.lifecycle.coroutineScope + ) } - favIndex++; - favListUrlBuilder.setIndex(result.next, true); - request.setArgs(favListUrlBuilder.build()); - mClient.execute(request, LifecycleKt.getCoroutineScope(getViewLifecycleOwner().getLifecycle())); } else { - showTip(R.string.settings_advanced_backup_favorite_success, BaseScene.LENGTH_SHORT); + showTip( + R.string.settings_advanced_backup_favorite_success, + BaseScene.LENGTH_SHORT + ) } } - } catch (Exception e) { - showTip(R.string.settings_advanced_backup_favorite_failed, BaseScene.LENGTH_SHORT); + } catch (e: Exception) { + showTip( + R.string.settings_advanced_backup_favorite_failed, + BaseScene.LENGTH_SHORT + ) } } - @Override - public void onFailure(Exception e) { - showTip(R.string.settings_advanced_backup_favorite_failed, BaseScene.LENGTH_SHORT); + override fun onFailure(e: Exception) { + showTip(R.string.settings_advanced_backup_favorite_failed, BaseScene.LENGTH_SHORT) } - @Override - public void onCancel() { - showTip(R.string.settings_advanced_backup_favorite_failed, BaseScene.LENGTH_SHORT); + override fun onCancel() { + showTip(R.string.settings_advanced_backup_favorite_failed, BaseScene.LENGTH_SHORT) } - }); - - request.setArgs(favListUrlBuilder.build()); - mClient.execute(request, LifecycleKt.getCoroutineScope(getViewLifecycleOwner().getLifecycle())); + }) + request.setArgs(favListUrlBuilder.build()) + mClient.execute(request, viewLifecycleOwner.lifecycle.coroutineScope) } - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - String key = preference.getKey(); - if (KEY_APP_LANGUAGE.equals(key) && Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { - if ("system".equals(newValue)) { - AppCompatDelegate.setApplicationLocales(LocaleListCompat.getEmptyLocaleList()); + override fun onPreferenceChange(preference: Preference, newValue: Any): Boolean { + val key = preference.key + if (KEY_APP_LANGUAGE == key && Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { + if ("system" == newValue) { + AppCompatDelegate.setApplicationLocales(LocaleListCompat.getEmptyLocaleList()) } else { - AppCompatDelegate.setApplicationLocales(LocaleListCompat.forLanguageTags((String) newValue)); + AppCompatDelegate.setApplicationLocales(LocaleListCompat.forLanguageTags(newValue as String)) } - requireActivity().recreate(); - return true; + requireActivity().recreate() + return true } - return false; + return false } - @Override - public int getFragmentTitle() { - return R.string.settings_advanced; + override val fragmentTitle: Int + get() = R.string.settings_advanced + + companion object { + private const val KEY_DUMP_LOGCAT = "dump_logcat" + private const val KEY_APP_LANGUAGE = "app_language" + private const val KEY_IMPORT_DATA = "import_data" + private const val KEY_EXPORT_DATA = "export_data" + private const val KEY_OPEN_BY_DEFAULT = "open_by_default" + private const val KEY_BACKUP_FAVORITE = "backup_favorite" } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/CookieSignInScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/CookieSignInScene.java index 69d494143..9eaf99977 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/CookieSignInScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/CookieSignInScene.java @@ -199,7 +199,7 @@ public class CookieSignInScene extends SolidScene implements EditText.OnEditorAc EhRequest request = new EhRequest() .setMethod(EhClient.METHOD_GET_PROFILE) .setCallback(new CookieSignInListener()); - EhApplication.getEhClient().execute(request, LifecycleKt.getCoroutineScope(getViewLifecycleOwner().getLifecycle())); + EhClient.INSTANCE.execute(request, LifecycleKt.getCoroutineScope(getViewLifecycleOwner().getLifecycle())); } private void storeCookie(String id, String hash, String igneous) { diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.java index 5804edc3b..be2de8c5e 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.java @@ -169,7 +169,7 @@ public class FavoritesScene extends SearchBarScene implements Context context = getContext(); AssertUtils.assertNotNull(context); - mClient = EhApplication.getEhClient(); + mClient = EhClient.INSTANCE; mFavCatArray = Settings.getFavCat(); mFavCountArray = Settings.getFavCount(); mFavLocalCount = Settings.getFavLocalCount(); diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryCommentsScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryCommentsScene.java index 428abb64e..c5c5b3558 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryCommentsScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryCommentsScene.java @@ -318,7 +318,7 @@ public final class GalleryCommentsScene extends BaseToolbarScene .setArgs(mGalleryDetail.apiUid, mGalleryDetail.apiKey, mGalleryDetail.gid, mGalleryDetail.token, id, vote) .setCallback(new VoteCommentListener(context, activity.getStageId(), getTag())); - EhApplication.getEhClient().execute(request, LifecycleKt.getCoroutineScope(getViewLifecycleOwner().getLifecycle())); + EhClient.INSTANCE.execute(request, LifecycleKt.getCoroutineScope(getViewLifecycleOwner().getLifecycle())); } @SuppressLint("InflateParams") @@ -454,7 +454,7 @@ public final class GalleryCommentsScene extends BaseToolbarScene .setMethod(EhClient.METHOD_GET_GALLERY_DETAIL) .setArgs(url) .setCallback(new RefreshCommentListener(activity, activity.getStageId(), getTag())); - EhApplication.getEhClient().execute(request, LifecycleKt.getCoroutineScope(getViewLifecycleOwner().getLifecycle())); + EhClient.INSTANCE.execute(request, LifecycleKt.getCoroutineScope(getViewLifecycleOwner().getLifecycle())); } } @@ -639,7 +639,7 @@ public final class GalleryCommentsScene extends BaseToolbarScene .setArgs(url, comment, mCommentId != 0 ? Long.toString(mCommentId) : null) .setCallback(new CommentGalleryListener(context, activity.getStageId(), getTag(), mCommentId)); - EhApplication.getEhClient().execute(request, LifecycleKt.getCoroutineScope(getViewLifecycleOwner().getLifecycle())); + EhClient.INSTANCE.execute(request, LifecycleKt.getCoroutineScope(getViewLifecycleOwner().getLifecycle())); hideSoftInput(); hideEditPanel(true); } @@ -745,7 +745,7 @@ public final class GalleryCommentsScene extends BaseToolbarScene .setMethod(EhClient.METHOD_GET_GALLERY_DETAIL) .setArgs(url) .setCallback(new RefreshCommentListener(activity, activity.getStageId(), getTag())); - EhApplication.getEhClient().execute(request, LifecycleKt.getCoroutineScope(getViewLifecycleOwner().getLifecycle())); + EhClient.INSTANCE.execute(request, LifecycleKt.getCoroutineScope(getViewLifecycleOwner().getLifecycle())); } } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.java index 55d09bcbb..f286bc53a 100755 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryDetailScene.java @@ -729,7 +729,7 @@ public class GalleryDetailScene extends CollapsingToolbarScene implements View.O .setMethod(EhClient.METHOD_GET_GALLERY_DETAIL) .setArgs(url) .setCallback(callback); - EhApplication.getEhClient().execute(request, LifecycleKt.getCoroutineScope(getViewLifecycleOwner().getLifecycle())); + EhClient.INSTANCE.execute(request, LifecycleKt.getCoroutineScope(getViewLifecycleOwner().getLifecycle())); return true; } @@ -1358,7 +1358,7 @@ public class GalleryDetailScene extends CollapsingToolbarScene implements View.O .setArgs(mGalleryDetail.apiUid, mGalleryDetail.apiKey, mGalleryDetail.gid, mGalleryDetail.token, tag, vote) .setCallback(new VoteTagListener(context, activity.getStageId(), getTag())); - EhApplication.getEhClient().execute(request, LifecycleKt.getCoroutineScope(getViewLifecycleOwner().getLifecycle())); + EhClient.INSTANCE.execute(request, LifecycleKt.getCoroutineScope(getViewLifecycleOwner().getLifecycle())); } @Override @@ -1794,7 +1794,7 @@ public class GalleryDetailScene extends CollapsingToolbarScene implements View.O mRequest = new EhRequest().setMethod(EhClient.METHOD_ARCHIVE_LIST) .setArgs(url, mGid, mToken) .setCallback(this); - EhApplication.getEhClient().execute(mRequest, LifecycleKt.getCoroutineScope(getViewLifecycleOwner().getLifecycle())); + EhClient.INSTANCE.execute(mRequest, LifecycleKt.getCoroutineScope(getViewLifecycleOwner().getLifecycle())); } else { bind(mArchiveList); } @@ -1831,7 +1831,7 @@ public class GalleryDetailScene extends CollapsingToolbarScene implements View.O request.setMethod(EhClient.METHOD_DOWNLOAD_ARCHIVE); request.setArgs(mGalleryDetail.gid, mGalleryDetail.token, mArchiveFormParamOr, res, isHAtH); request.setCallback(new DownloadArchiveListener(context, activity.getStageId(), getTag(), mGalleryDetail)); - EhApplication.getEhClient().execute(request, LifecycleKt.getCoroutineScope(getViewLifecycleOwner().getLifecycle())); + EhClient.INSTANCE.execute(request, LifecycleKt.getCoroutineScope(getViewLifecycleOwner().getLifecycle())); } if (mDialog != null) { @@ -1909,7 +1909,7 @@ public class GalleryDetailScene extends CollapsingToolbarScene implements View.O mRequest = new EhRequest().setMethod(EhClient.METHOD_GET_TORRENT_LIST) .setArgs(url, mGid, mToken) .setCallback(this); - EhApplication.getEhClient().execute(mRequest, LifecycleKt.getCoroutineScope(getViewLifecycleOwner().getLifecycle())); + EhClient.INSTANCE.execute(mRequest, LifecycleKt.getCoroutineScope(getViewLifecycleOwner().getLifecycle())); } else { bind(mTorrentList); } @@ -2042,7 +2042,7 @@ public class GalleryDetailScene extends CollapsingToolbarScene implements View.O mGalleryDetail.gid, mGalleryDetail.token, mRatingBar.getRating()) .setCallback(new RateGalleryListener(context, activity.getStageId(), getTag(), mGalleryDetail.gid)); - EhApplication.getEhClient().execute(request, LifecycleKt.getCoroutineScope(getViewLifecycleOwner().getLifecycle())); + EhClient.INSTANCE.execute(request, LifecycleKt.getCoroutineScope(getViewLifecycleOwner().getLifecycle())); } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java index 9f45ae570..8aca9fea9 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java @@ -323,7 +323,7 @@ public final class GalleryListScene extends SearchBarScene Context context = getContext(); AssertUtils.assertNotNull(context); - mClient = EhApplication.getEhClient(); + mClient = EhClient.INSTANCE; mDownloadManager = EhApplication.getDownloadManager(); mFavouriteStatusRouter = EhApplication.getFavouriteStatusRouter(); diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewsScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewsScene.java index 68e38ba0d..4020bce14 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewsScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryPreviewsScene.java @@ -92,7 +92,7 @@ public class GalleryPreviewsScene extends BaseToolbarScene { Context context = getContext(); AssertUtils.assertNotNull(context); - mClient = EhApplication.getEhClient(); + mClient = EhClient.INSTANCE; if (savedInstanceState == null) { onInit(); } else { diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/ProgressScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/ProgressScene.java index 59b8899b3..7b20ac1ef 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/ProgressScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/ProgressScene.java @@ -100,7 +100,7 @@ public final class ProgressScene extends BaseScene implements View.OnClickListen .setArgs(mGid, mPToken, mPage) .setCallback(new GetGalleryTokenListener(context, activity.getStageId(), getTag())); - EhApplication.getEhClient().execute(request, LifecycleKt.getCoroutineScope(getViewLifecycleOwner().getLifecycle())); + EhClient.INSTANCE.execute(request, LifecycleKt.getCoroutineScope(getViewLifecycleOwner().getLifecycle())); return true; } return false; diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/SignInScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/SignInScene.java index d3691dab9..2d8c614f3 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/SignInScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/SignInScene.java @@ -50,6 +50,8 @@ import com.hippo.yorozuya.AssertUtils; import com.hippo.yorozuya.IntIdGenerator; import com.hippo.yorozuya.ViewUtils; +import kotlinx.coroutines.GlobalScope; + public final class SignInScene extends SolidScene implements EditText.OnEditorActionListener, View.OnClickListener { @@ -290,7 +292,7 @@ public final class SignInScene extends SolidScene implements EditText.OnEditorAc .setMethod(EhClient.METHOD_SIGN_IN) .setArgs(username, password) .setCallback(callback); - EhApplication.getEhClient().execute(request, LifecycleKt.getCoroutineScope(getViewLifecycleOwner().getLifecycle())); + EhClient.INSTANCE.execute(request, LifecycleKt.getCoroutineScope(getViewLifecycleOwner().getLifecycle())); mSigningIn = true; } @@ -311,9 +313,9 @@ public final class SignInScene extends SolidScene implements EditText.OnEditorAc EhRequest request = new EhRequest() .setMethod(EhClient.METHOD_GET_PROFILE) .setCallback(callback); - EhApplication.getEhClient().execute(request, LifecycleKt.getCoroutineScope(getViewLifecycleOwner().getLifecycle())); + EhClient.INSTANCE.execute(request, GlobalScope.INSTANCE); - EhApplication.getEhClient().execute(new EhRequest().setMethod(EhClient.METHOD_GET_UCONFIG), LifecycleKt.getCoroutineScope(getViewLifecycleOwner().getLifecycle())); + EhClient.INSTANCE.execute(new EhRequest().setMethod(EhClient.METHOD_GET_UCONFIG), GlobalScope.INSTANCE); } private void redirectTo() {