Refine ProfilesFragment
This commit is contained in:
@@ -269,8 +269,6 @@ class MainActivity extends Activity with ServiceBoundContext with Drawer.OnDrawe
|
||||
|
||||
val intent = getIntent
|
||||
if (intent != null) handleShareIntent(intent)
|
||||
|
||||
if (app.profileManager.getFirstProfile.isEmpty) app.profileId(app.profileManager.createProfile().id)
|
||||
}
|
||||
|
||||
override def onNewIntent(intent: Intent) {
|
||||
|
||||
@@ -20,11 +20,10 @@
|
||||
|
||||
package com.github.shadowsocks
|
||||
|
||||
import android.content.{DialogInterface, Intent, SharedPreferences}
|
||||
import android.content.SharedPreferences.OnSharedPreferenceChangeListener
|
||||
import android.content.{DialogInterface, Intent, SharedPreferences}
|
||||
import android.os.{Build, Bundle, UserManager}
|
||||
import android.support.v14.preference.SwitchPreference
|
||||
import android.support.v4.content.LocalBroadcastManager
|
||||
import android.support.v7.app.AlertDialog
|
||||
import android.support.v7.preference.Preference
|
||||
import android.support.v7.widget.Toolbar.OnMenuItemClickListener
|
||||
@@ -87,8 +86,6 @@ class ProfileConfigFragment extends PreferenceFragment with OnMenuItemClickListe
|
||||
.setTitle("Confirm?") // TODO
|
||||
.setPositiveButton("Yes", ((_, _) => {
|
||||
app.profileManager.delProfile(profile.id)
|
||||
LocalBroadcastManager.getInstance(getActivity)
|
||||
.sendBroadcast(new Intent(Action.PROFILE_REMOVED).putExtra(Action.EXTRA_PROFILE_ID, profile.id))
|
||||
getActivity.finish()
|
||||
}): DialogInterface.OnClickListener)
|
||||
.setNegativeButton("No", null)
|
||||
@@ -104,8 +101,7 @@ class ProfileConfigFragment extends PreferenceFragment with OnMenuItemClickListe
|
||||
def saveAndExit() {
|
||||
profile.deserialize(app.settings)
|
||||
app.profileManager.updateProfile(profile)
|
||||
LocalBroadcastManager.getInstance(getActivity)
|
||||
.sendBroadcast(new Intent(Action.PROFILE_CHANGED).putExtra(Action.EXTRA_PROFILE_ID, profile.id))
|
||||
if (ProfilesFragment.instance != null) ProfilesFragment.instance.profilesAdapter.refreshId(profile.id)
|
||||
getActivity.finish()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,13 +24,12 @@ import java.util.GregorianCalendar
|
||||
|
||||
import android.content._
|
||||
import android.os.{Bundle, Handler}
|
||||
import android.support.v4.content.LocalBroadcastManager
|
||||
import android.support.v7.widget._
|
||||
import android.support.v7.widget.RecyclerView.ViewHolder
|
||||
import android.support.v7.widget._
|
||||
import android.support.v7.widget.helper.ItemTouchHelper
|
||||
import android.support.v7.widget.helper.ItemTouchHelper.SimpleCallback
|
||||
import android.view._
|
||||
import android.view.View.OnLongClickListener
|
||||
import android.view._
|
||||
import android.widget.{LinearLayout, PopupMenu, TextView, Toast}
|
||||
import com.github.shadowsocks.ShadowsocksApplication.app
|
||||
import com.github.shadowsocks.database.Profile
|
||||
@@ -41,14 +40,20 @@ import com.google.android.gms.ads.{AdRequest, AdSize, NativeExpressAdView}
|
||||
import scala.collection.mutable.ArrayBuffer
|
||||
import scala.util.Random
|
||||
|
||||
object ProfilesFragment {
|
||||
var instance: ProfilesFragment = _ // used for callback from ProfileManager
|
||||
}
|
||||
|
||||
final class ProfilesFragment extends ToolbarFragment with Toolbar.OnMenuItemClickListener {
|
||||
import ProfilesFragment._
|
||||
|
||||
private val cardButtonLongClickListener: OnLongClickListener = view => {
|
||||
Utils.positionToast(Toast.makeText(getActivity, view.getContentDescription, Toast.LENGTH_SHORT), view,
|
||||
getActivity.getWindow, 0, Utils.dpToPx(getActivity, 8)).show()
|
||||
true
|
||||
}
|
||||
|
||||
private final class ProfileViewHolder(val view: View) extends RecyclerView.ViewHolder(view)
|
||||
final class ProfileViewHolder(val view: View) extends RecyclerView.ViewHolder(view)
|
||||
with View.OnClickListener with PopupMenu.OnMenuItemClickListener {
|
||||
|
||||
var item: Profile = _
|
||||
@@ -153,7 +158,7 @@ final class ProfilesFragment extends ToolbarFragment with Toolbar.OnMenuItemClic
|
||||
}
|
||||
}
|
||||
|
||||
private class ProfilesAdapter extends RecyclerView.Adapter[ProfileViewHolder] {
|
||||
final class ProfilesAdapter extends RecyclerView.Adapter[ProfileViewHolder] {
|
||||
var profiles = new ArrayBuffer[Profile]
|
||||
profiles ++= app.profileManager.getAllProfiles.getOrElse(List.empty[Profile])
|
||||
|
||||
@@ -210,23 +215,18 @@ final class ProfilesFragment extends ToolbarFragment with Toolbar.OnMenuItemClic
|
||||
}
|
||||
def removeId(id: Int) {
|
||||
val index = profiles.indexWhere(_.id == id)
|
||||
profiles.remove(index)
|
||||
notifyItemRemoved(index)
|
||||
if (id == app.profileId) app.profileId(0)
|
||||
if (index >= 0) {
|
||||
profiles.remove(index)
|
||||
notifyItemRemoved(index)
|
||||
if (id == app.profileId) app.profileId(0) // switch to null profile
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private var selectedItem: ProfileViewHolder = _
|
||||
private val handler = new Handler
|
||||
private val profilesListener: BroadcastReceiver = (_, intent) => {
|
||||
val id = intent.getIntExtra(Action.EXTRA_PROFILE_ID, -1)
|
||||
intent.getAction match {
|
||||
case Action.PROFILE_CHANGED => profilesAdapter.refreshId(id)
|
||||
case Action.PROFILE_REMOVED => profilesAdapter.removeId(id)
|
||||
}
|
||||
}
|
||||
|
||||
private lazy val profilesAdapter = new ProfilesAdapter
|
||||
lazy val profilesAdapter = new ProfilesAdapter
|
||||
private var undoManager: UndoSnackbarManager[Profile] = _
|
||||
|
||||
private lazy val clipboard = getActivity.getSystemService(Context.CLIPBOARD_SERVICE).asInstanceOf[ClipboardManager]
|
||||
@@ -243,12 +243,13 @@ final class ProfilesFragment extends ToolbarFragment with Toolbar.OnMenuItemClic
|
||||
toolbar.inflateMenu(R.menu.profile_manager_menu)
|
||||
toolbar.setOnMenuItemClickListener(this)
|
||||
|
||||
app.profileManager.setProfileAddedListener(profilesAdapter.add)
|
||||
if (app.profileManager.getFirstProfile.isEmpty) app.profileId(app.profileManager.createProfile().id)
|
||||
val profilesList = view.findViewById(R.id.profilesList).asInstanceOf[RecyclerView]
|
||||
val layoutManager = new LinearLayoutManager(getActivity)
|
||||
profilesList.setLayoutManager(layoutManager)
|
||||
profilesList.setItemAnimator(new DefaultItemAnimator)
|
||||
profilesList.setAdapter(profilesAdapter)
|
||||
instance = this
|
||||
layoutManager.scrollToPosition(profilesAdapter.profiles.zipWithIndex.collectFirst {
|
||||
case (profile, i) if profile.id == app.profileId => i
|
||||
}.getOrElse(-1))
|
||||
@@ -265,10 +266,6 @@ final class ProfilesFragment extends ToolbarFragment with Toolbar.OnMenuItemClic
|
||||
true
|
||||
}
|
||||
}).attachToRecyclerView(profilesList)
|
||||
val filter = new IntentFilter(Action.PROFILE_CHANGED)
|
||||
filter.addAction(Action.PROFILE_REMOVED)
|
||||
LocalBroadcastManager.getInstance(getActivity).registerReceiver(profilesListener, filter)
|
||||
|
||||
}
|
||||
|
||||
override def onTrafficUpdated(txRate: Long, rxRate: Long, txTotal: Long, rxTotal: Long): Unit =
|
||||
@@ -280,7 +277,7 @@ final class ProfilesFragment extends ToolbarFragment with Toolbar.OnMenuItemClic
|
||||
}
|
||||
|
||||
override def onDestroy() {
|
||||
LocalBroadcastManager.getInstance(getActivity).unregisterReceiver(profilesListener)
|
||||
instance = null
|
||||
super.onDestroy()
|
||||
}
|
||||
|
||||
@@ -300,9 +297,7 @@ final class ProfilesFragment extends ToolbarFragment with Toolbar.OnMenuItemClic
|
||||
Toast.makeText(getActivity, R.string.action_import_err, Toast.LENGTH_SHORT).show()
|
||||
true
|
||||
case R.id.action_manual_settings =>
|
||||
val profile = app.profileManager.createProfile()
|
||||
app.profileManager.updateProfile(profile)
|
||||
startConfig(profile.id)
|
||||
startConfig(app.profileManager.createProfile().id)
|
||||
true
|
||||
case R.id.action_export =>
|
||||
app.profileManager.getAllProfiles match {
|
||||
|
||||
@@ -88,8 +88,9 @@ class ShadowsocksApplication extends Application {
|
||||
def currentProfile: Option[Profile] = profileManager.getProfile(profileId)
|
||||
|
||||
def switchProfile(id: Int): Profile = {
|
||||
profileId(id)
|
||||
profileManager.getProfile(id) getOrElse profileManager.createProfile()
|
||||
val result = profileManager.getProfile(id) getOrElse profileManager.createProfile()
|
||||
profileId(result.id)
|
||||
result
|
||||
}
|
||||
|
||||
private def checkChineseLocale(locale: Locale): Locale = if (locale.getLanguage == "zh") locale.getCountry match {
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
package com.github.shadowsocks.database
|
||||
|
||||
import android.util.Log
|
||||
import com.github.shadowsocks.ProfilesFragment
|
||||
import com.github.shadowsocks.ShadowsocksApplication.app
|
||||
|
||||
object ProfileManager {
|
||||
@@ -30,9 +31,6 @@ object ProfileManager {
|
||||
class ProfileManager(dbHelper: DBHelper) {
|
||||
import ProfileManager._
|
||||
|
||||
var profileAddedListener: Profile => Any = _
|
||||
def setProfileAddedListener(listener: Profile => Any): Unit = this.profileAddedListener = listener
|
||||
|
||||
def createProfile(p: Profile = null): Profile = {
|
||||
val profile = if (p == null) new Profile else p
|
||||
profile.id = 0
|
||||
@@ -52,7 +50,7 @@ class ProfileManager(dbHelper: DBHelper) {
|
||||
.prepareStatementString).getFirstResult
|
||||
if (last != null && last.length == 1 && last(0) != null) profile.userOrder = last(0).toInt + 1
|
||||
dbHelper.profileDao.createOrUpdate(profile)
|
||||
if (profileAddedListener != null) profileAddedListener(profile)
|
||||
if (ProfilesFragment.instance != null) ProfilesFragment.instance.profilesAdapter.add(profile)
|
||||
} catch {
|
||||
case ex: Exception =>
|
||||
Log.e(TAG, "addProfile", ex)
|
||||
@@ -90,6 +88,7 @@ class ProfileManager(dbHelper: DBHelper) {
|
||||
def delProfile(id: Int): Boolean = {
|
||||
try {
|
||||
dbHelper.profileDao.deleteById(id)
|
||||
if (ProfilesFragment.instance != null) ProfilesFragment.instance.profilesAdapter.removeId(id)
|
||||
true
|
||||
} catch {
|
||||
case ex: Exception =>
|
||||
|
||||
@@ -176,8 +176,6 @@ object State {
|
||||
object Action {
|
||||
final val SERVICE = "com.github.shadowsocks.SERVICE"
|
||||
final val CLOSE = "com.github.shadowsocks.CLOSE"
|
||||
final val PROFILE_CHANGED = "com.github.shadowsocks.PROFILE_CHANGED"
|
||||
final val PROFILE_REMOVED = "com.github.shadowsocks.PROFILE_REMOVED"
|
||||
|
||||
final val EXTRA_PROFILE_ID = "com.github.shadowsocks.EXTRA_PROFILE_ID"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user