diff --git a/mobile/src/main/java/com/github/shadowsocks/MainActivity.kt b/mobile/src/main/java/com/github/shadowsocks/MainActivity.kt index 4fcb9fac..628a48a4 100644 --- a/mobile/src/main/java/com/github/shadowsocks/MainActivity.kt +++ b/mobile/src/main/java/com/github/shadowsocks/MainActivity.kt @@ -38,11 +38,11 @@ import android.support.v7.app.AlertDialog import android.support.v7.app.AppCompatActivity import android.support.v7.content.res.AppCompatResources import android.support.v7.preference.PreferenceDataStore +import android.support.v7.widget.TooltipCompat import android.text.TextUtils import android.util.Log import android.view.View import android.widget.TextView -import android.widget.Toast import com.github.jorgecastilloprz.FABProgressCircle import com.github.shadowsocks.App.Companion.app import com.github.shadowsocks.acl.Acl @@ -57,7 +57,6 @@ import com.github.shadowsocks.database.ProfileManager import com.github.shadowsocks.preference.DataStore import com.github.shadowsocks.preference.OnPreferenceDataStoreChangeListener import com.github.shadowsocks.utils.Key -import com.github.shadowsocks.utils.position import com.github.shadowsocks.utils.responseLength import com.github.shadowsocks.utils.thread import com.mikepenz.crossfader.Crossfader @@ -165,8 +164,12 @@ class MainActivity : AppCompatActivity(), ShadowsocksConnection.Interface, Drawe } } this.state = state - if (state == BaseService.CONNECTED) fab.backgroundTintList = greenTint else { + if (state == BaseService.CONNECTED) { + fab.backgroundTintList = greenTint + TooltipCompat.setTooltipText(fab, getString(R.string.stop)) + } else { fab.backgroundTintList = greyTint + TooltipCompat.setTooltipText(fab, getString(R.string.connect)) updateTraffic(-1, 0, 0, 0, 0) testCount += 1 // suppress previous test messages } @@ -329,13 +332,6 @@ class MainActivity : AppCompatActivity(), ShadowsocksConnection.Interface, Drawe } else app.startService() } } - fab.setOnLongClickListener { - Toast.makeText(this, if (state == BaseService.CONNECTED) R.string.stop else R.string.connect, - Toast.LENGTH_SHORT) - .position(fab, window, 0, resources.getDimensionPixelOffset(R.dimen.margin_small)) - .show() - true - } changeState(BaseService.IDLE) // reset everything to init state app.handler.post { connection.connect() } diff --git a/mobile/src/main/java/com/github/shadowsocks/ProfilesFragment.kt b/mobile/src/main/java/com/github/shadowsocks/ProfilesFragment.kt index fa68e458..aeb3a04c 100644 --- a/mobile/src/main/java/com/github/shadowsocks/ProfilesFragment.kt +++ b/mobile/src/main/java/com/github/shadowsocks/ProfilesFragment.kt @@ -46,7 +46,6 @@ import com.github.shadowsocks.database.ProfileManager import com.github.shadowsocks.plugin.PluginConfiguration import com.github.shadowsocks.preference.DataStore import com.github.shadowsocks.utils.Action -import com.github.shadowsocks.utils.position import com.github.shadowsocks.widget.UndoSnackbarManager import com.google.android.gms.ads.AdRequest import com.google.android.gms.ads.AdSize @@ -112,7 +111,7 @@ class ProfilesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener { } inner class ProfileViewHolder(view: View) : RecyclerView.ViewHolder(view), - View.OnClickListener, View.OnLongClickListener, PopupMenu.OnMenuItemClickListener { + View.OnClickListener, PopupMenu.OnMenuItemClickListener { internal lateinit var item: Profile private val text1 = itemView.findViewById(android.R.id.text1) @@ -123,7 +122,7 @@ class ProfilesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener { init { edit.setOnClickListener { startConfig(item.id) } - edit.setOnLongClickListener(this) + TooltipCompat.setTooltipText(edit, edit.contentDescription) itemView.setOnClickListener(this) val share = itemView.findViewById(R.id.share) share.setOnClickListener { @@ -132,7 +131,7 @@ class ProfilesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener { popup.setOnMenuItemClickListener(this) popup.show() } - share.setOnLongClickListener(this) + TooltipCompat.setTooltipText(share, share.contentDescription) } fun bind(item: Profile) { @@ -202,12 +201,6 @@ class ProfilesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener { } } - override fun onLongClick(view: View): Boolean { - Toast.makeText(activity, view.contentDescription, Toast.LENGTH_SHORT).position(view, activity!!.window, - 0, resources.getDimensionPixelOffset(R.dimen.margin_small)).show() - return true - } - override fun onMenuItemClick(item: MenuItem): Boolean = when (item.itemId) { R.id.action_qr_code_nfc -> { fragmentManager!!.beginTransaction().add(QRCodeDialog(this.item.toString()), "") diff --git a/mobile/src/main/java/com/github/shadowsocks/utils/Utils.kt b/mobile/src/main/java/com/github/shadowsocks/utils/Utils.kt index a3410711..2becad25 100644 --- a/mobile/src/main/java/com/github/shadowsocks/utils/Utils.kt +++ b/mobile/src/main/java/com/github/shadowsocks/utils/Utils.kt @@ -3,17 +3,11 @@ package com.github.shadowsocks.utils import android.content.BroadcastReceiver import android.content.Context import android.content.Intent -import android.graphics.Rect import android.os.Build import android.support.v4.app.Fragment import android.support.v4.app.FragmentManager import android.support.v7.util.SortedList -import android.util.DisplayMetrics import android.util.TypedValue -import android.view.Gravity -import android.view.View -import android.view.Window -import android.widget.Toast import com.github.shadowsocks.App.Companion.app import java.lang.reflect.InvocationTargetException import java.net.InetAddress @@ -59,25 +53,6 @@ fun thread(start: Boolean = true, isDaemon: Boolean = false, contextClassLoader: val URLConnection.responseLength: Long get() = if (Build.VERSION.SDK_INT >= 24) contentLengthLong else contentLength.toLong() -/** - * Based on: http://stackoverflow.com/a/21026866/2245107 - */ -fun Toast.position(view: View, window: Window, offsetX: Int = 0, offsetY: Int = 0): Toast { - val rect = Rect() - window.decorView.getWindowVisibleDisplayFrame(rect) - val viewLocation = IntArray(2) - view.getLocationInWindow(viewLocation) - val metrics = DisplayMetrics() - window.windowManager.defaultDisplay.getMetrics(metrics) - val toastView = this.view - toastView.measure(View.MeasureSpec.makeMeasureSpec(metrics.widthPixels, View.MeasureSpec.UNSPECIFIED), - View.MeasureSpec.makeMeasureSpec(metrics.heightPixels, View.MeasureSpec.UNSPECIFIED)) - setGravity(Gravity.START or Gravity.TOP, - viewLocation[0] - rect.left + (view.width - toastView.measuredWidth) / 2 + offsetX, - viewLocation[1] - rect.top + view.height + offsetY) - return this -} - fun Float.dp(): Float = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, this, app.resources.displayMetrics) /**