owenclave / app/src/main/java/io/nekohasekai/sagernet/group/GroupInterfaceAdapter.kt

github - dev - back to tree - upstream
/****************************************************************************** * * * Copyright (C) 2021 by nekohasekai * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program. If not, see . * * * ******************************************************************************/ package io.nekohasekai.sagernet.group import com.google.android.material.dialog.MaterialAlertDialogBuilder import io.nekohasekai.sagernet.R import io.nekohasekai.sagernet.database.GroupManager import io.nekohasekai.sagernet.database.ProxyGroup import io.nekohasekai.sagernet.ktx.onMainDispatcher import io.nekohasekai.sagernet.ktx.runOnMainDispatcher import io.nekohasekai.sagernet.ui.ThemedActivity import kotlinx.coroutines.suspendCancellableCoroutine import kotlin.coroutines.resume class GroupInterfaceAdapter(val context: ThemedActivity) : GroupManager.Interface { override suspend fun confirm(message: String): Boolean { return suspendCancellableCoroutine { var resumed = false fun tryResume(value: Boolean) { if (!resumed) { resumed = true it.resume(value) } } runOnMainDispatcher { MaterialAlertDialogBuilder(context).setTitle(R.string.confirm) .setMessage(message) .setPositiveButton(android.R.string.ok) { _, _ -> tryResume(true) } .setNegativeButton(android.R.string.cancel) { _, _ -> tryResume(false) } .setOnCancelListener { _ -> tryResume(false) } .show() } } } override suspend fun onUpdateSuccess( group: ProxyGroup, changed: Int, added: List, updated: Map, deleted: List, duplicate: List, ) { if (changed == 0 && duplicate.isEmpty()) { onMainDispatcher { context.snackbar(context.getString(R.string.group_no_difference, group.displayName())).show() } } else { var status = context.resources.getQuantityString(R.plurals.group_updated, changed, group.name, changed) + "\n\n" if (added.isNotEmpty()) { status += context.getString( R.string.group_added, added.joinToString("\n", postfix = "\n\n") ) } if (updated.isNotEmpty()) { status += context.getString(R.string.group_changed, updated.map { it }.joinToString("\n", postfix = "\n\n") { if (it.key == it.value) it.key else "${it.key} => ${it.value}" }) } if (deleted.isNotEmpty()) { status += context.getString( R.string.group_deleted, deleted.joinToString("\n", postfix = "\n\n") ) } if (duplicate.isNotEmpty()) { status += context.getString( R.string.group_duplicate, duplicate.joinToString("\n", postfix = "\n\n") ) } onMainDispatcher { MaterialAlertDialogBuilder(context).setTitle( context.getString( R.string.group_diff, group.displayName() ) ).setMessage(status.trim()).setPositiveButton(android.R.string.ok, null).show() } } } override suspend fun onUpdateFailure(group: ProxyGroup, message: String) { onMainDispatcher { context.snackbar(message).show() } } }