Commit e615ee9c authored by Mygod's avatar Mygod

Check failure for copying large data

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