Commit e615ee9c authored by Mygod's avatar Mygod

Check failure for copying large data

parent 9f122193
......@@ -22,6 +22,8 @@ package com.github.shadowsocks
import android.app.*
import android.app.admin.DevicePolicyManager
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.content.Intent
import android.content.pm.PackageInfo
......@@ -65,6 +67,7 @@ object Core {
@VisibleForTesting set
lateinit var configureIntent: (Context) -> PendingIntent
val activity by lazy { app.getSystemService<ActivityManager>()!! }
val clipboard by lazy { app.getSystemService<ClipboardManager>()!! }
val connectivity by lazy { app.getSystemService<ConnectivityManager>()!! }
val notification by lazy { app.getSystemService<NotificationManager>()!! }
val packageInfo: PackageInfo by lazy { getPackageInfo(app.packageName) }
......@@ -159,6 +162,14 @@ object Core {
if (Build.VERSION.SDK_INT >= 28) PackageManager.GET_SIGNING_CERTIFICATES
else @Suppress("DEPRECATION") PackageManager.GET_SIGNATURES)!!
fun trySetPrimaryClip(clip: String) = try {
clipboard.setPrimaryClip(ClipData.newPlainText(null, clip))
true
} catch (e: RuntimeException) {
Timber.d(e)
false
}
fun startService() = ContextCompat.startForegroundService(app, Intent(app, ShadowsocksConnection.serviceClass))
fun reloadService() = app.sendBroadcast(Intent(Action.RELOAD).setPackage(app.packageName))
fun stopService() = app.sendBroadcast(Intent(Action.CLOSE).setPackage(app.packageName))
......
......@@ -25,8 +25,6 @@ import android.animation.Animator
import android.animation.AnimatorListenerAdapter
import android.annotation.SuppressLint
import android.content.BroadcastReceiver
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Intent
import android.content.pm.ApplicationInfo
import android.content.pm.PackageInfo
......@@ -40,7 +38,6 @@ import android.widget.Filterable
import android.widget.SearchView
import androidx.annotation.UiThread
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.getSystemService
import androidx.core.util.set
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.DefaultItemAnimator
......@@ -50,7 +47,6 @@ import com.github.shadowsocks.Core.app
import com.github.shadowsocks.database.ProfileManager
import com.github.shadowsocks.preference.DataStore
import com.github.shadowsocks.utils.DirectBoot
import com.github.shadowsocks.utils.Key
import com.github.shadowsocks.utils.SingleInstanceActivity
import com.github.shadowsocks.utils.listenForPackageChanges
import com.github.shadowsocks.widget.ListHolderListener
......@@ -58,7 +54,10 @@ import com.github.shadowsocks.widget.ListListener
import com.google.android.material.snackbar.Snackbar
import kotlinx.android.synthetic.main.layout_apps.*
import kotlinx.android.synthetic.main.layout_apps_item.view.*
import kotlinx.coroutines.*
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.ensureActive
import kotlinx.coroutines.withContext
import me.zhanghai.android.fastscroll.FastScrollerBuilder
import me.zhanghai.android.fastscroll.PopupTextProvider
import kotlin.coroutines.coroutineContext
......@@ -177,7 +176,6 @@ class AppManager : AppCompatActivity() {
}
private val proxiedUids = SparseBooleanArray()
private val clipboard by lazy { getSystemService<ClipboardManager>()!! }
private var loader: Job? = null
private var apps = emptyList<ProxiedApp>()
private val appsAdapter = AppsAdapter()
......@@ -280,13 +278,12 @@ class AppManager : AppCompatActivity() {
return true
}
R.id.action_export_clipboard -> {
clipboard.setPrimaryClip(ClipData.newPlainText(Key.individual,
"${DataStore.bypass}\n${DataStore.individual}"))
Snackbar.make(list, R.string.action_export_msg, Snackbar.LENGTH_LONG).show()
Snackbar.make(list, if (Core.trySetPrimaryClip("${DataStore.bypass}\n${DataStore.individual}"))
R.string.action_export_msg else R.string.action_export_err, Snackbar.LENGTH_LONG).show()
return true
}
R.id.action_import_clipboard -> {
val proxiedAppString = clipboard.primaryClip?.getItemAt(0)?.text?.toString()
val proxiedAppString = Core.clipboard.primaryClip?.getItemAt(0)?.text?.toString()
if (!proxiedAppString.isNullOrEmpty()) {
val i = proxiedAppString.indexOf('\n')
try {
......
......@@ -23,8 +23,6 @@ package com.github.shadowsocks
import android.annotation.SuppressLint
import android.app.Activity
import android.content.ActivityNotFoundException
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.Color
......@@ -39,7 +37,6 @@ import android.widget.*
import androidx.appcompat.widget.PopupMenu
import androidx.appcompat.widget.Toolbar
import androidx.appcompat.widget.TooltipCompat
import androidx.core.content.getSystemService
import androidx.core.os.bundleOf
import androidx.fragment.app.DialogFragment
import androidx.lifecycle.lifecycleScope
......@@ -328,7 +325,8 @@ class ProfilesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener {
true
}
R.id.action_export_clipboard -> {
clipboard.setPrimaryClip(ClipData.newPlainText(null, this.item.toString()))
(activity as MainActivity).snackbar().setText(if (Core.trySetPrimaryClip(this.item.toString()))
R.string.action_export_msg else R.string.action_export_err).show()
true
}
else -> false
......@@ -439,8 +437,6 @@ class ProfilesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener {
private lateinit var undoManager: UndoSnackbarManager<Profile>
private val statsCache = LongSparseArray<TrafficStats>()
private val clipboard by lazy { requireContext().getSystemService<ClipboardManager>()!! }
private fun startConfig(profile: Profile) {
profile.serialize()
startActivity(Intent(context, ProfileConfigActivity::class.java).putExtra(Action.EXTRA_PROFILE_ID, profile.id))
......@@ -505,7 +501,7 @@ class ProfilesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener {
R.id.action_import_clipboard -> {
try {
val profiles = Profile.findAllUrls(
clipboard.primaryClip!!.getItemAt(0).text,
Core.clipboard.primaryClip!!.getItemAt(0).text,
Core.currentProfile?.first
).toList()
if (profiles.isNotEmpty()) {
......@@ -542,10 +538,9 @@ class ProfilesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener {
}
R.id.action_export_clipboard -> {
val profiles = ProfileManager.getActiveProfiles()
(activity as MainActivity).snackbar().setText(if (profiles != null) {
clipboard.setPrimaryClip(ClipData.newPlainText(null, profiles.joinToString("\n")))
R.string.action_export_msg
} else R.string.action_export_err).show()
val success = profiles != null && Core.trySetPrimaryClip(profiles.joinToString("\n"))
(activity as MainActivity).snackbar().setText(if (success)
R.string.action_export_msg else R.string.action_export_err).show()
true
}
R.id.action_export_file -> {
......
......@@ -21,8 +21,6 @@
package com.github.shadowsocks.acl
import android.annotation.SuppressLint
import android.content.ClipData
import android.content.ClipboardManager
import android.content.DialogInterface
import android.content.Intent
import android.content.res.Configuration
......@@ -39,7 +37,6 @@ import android.widget.TextView
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.widget.Toolbar
import androidx.core.content.ContextCompat
import androidx.core.content.getSystemService
import androidx.recyclerview.widget.DefaultItemAnimator
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
......@@ -372,7 +369,6 @@ class CustomRulesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener,
private lateinit var list: RecyclerView
private var mode: ActionMode? = null
private lateinit var undoManager: UndoSnackbarManager<Any>
private val clipboard by lazy { requireContext().getSystemService<ClipboardManager>()!! }
private fun onSelectedItemsUpdated() {
if (selectedItems.isEmpty()) mode?.finish() else if (mode == null) mode = toolbar.startActionMode(this)
......@@ -440,7 +436,8 @@ class CustomRulesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener,
is URL -> acl.urls.add(it)
}
}
clipboard.setPrimaryClip(ClipData.newPlainText(null, acl.toString()))
(activity as MainActivity).snackbar().setText(if (Core.trySetPrimaryClip(acl.toString()))
R.string.action_export_msg else R.string.action_export_err).show()
}
override fun onMenuItemClick(item: MenuItem): Boolean = when (item.itemId) {
......@@ -450,7 +447,7 @@ class CustomRulesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener,
}
R.id.action_import_clipboard -> {
try {
check(adapter.addToProxy(clipboard.primaryClip!!.getItemAt(0).text.toString()) != null)
check(adapter.addToProxy(Core.clipboard.primaryClip!!.getItemAt(0).text.toString()) != null)
} catch (exc: Exception) {
(activity as MainActivity).snackbar().setText(R.string.action_import_err).show()
Timber.d(exc)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment