diff --git a/src/main/res/values/styles.xml b/src/main/res/values/styles.xml index a2272424..3382923c 100644 --- a/src/main/res/values/styles.xml +++ b/src/main/res/values/styles.xml @@ -23,6 +23,7 @@ + \ No newline at end of file diff --git a/src/main/scala/com/github/shadowsocks/Shadowsocks.scala b/src/main/scala/com/github/shadowsocks/Shadowsocks.scala index 8f698033..7a1a2dde 100644 --- a/src/main/scala/com/github/shadowsocks/Shadowsocks.scala +++ b/src/main/scala/com/github/shadowsocks/Shadowsocks.scala @@ -289,6 +289,9 @@ class Shadowsocks private val MSG_CRASH_RECOVER: Int = 1 private val MSG_INITIAL_FINISH: Int = 2 + private val STATE_MENUDRAWER = "com.github.shadowsocks.menuDrawer" + private val STATE_ACTIVE_VIEW_ID = "com.github.shadowsocks.activeViewId" + private var switchButton: Switch = null private var progressDialog: ProgressDialog = null @@ -483,6 +486,8 @@ class Shadowsocks profileManager.getProfile(settings.getInt(Key.profileId, -1)) getOrElse new Profile() } + menuAdapter.setActiveId(settings.getInt(Key.profileId, -1)) + menuAdapter.setListener(this) listView.setAdapter(menuAdapter) drawer.setMenuView(listView) @@ -522,17 +527,53 @@ class Shadowsocks } } + override def onRestoreInstanceState(inState: Bundle) { + super.onRestoreInstanceState(inState) + drawer.restoreState(inState.getParcelable(STATE_MENUDRAWER)) + } + + override def onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + outState.putParcelable(STATE_MENUDRAWER, drawer.saveState()) + outState.putInt(STATE_ACTIVE_VIEW_ID, Shadowsocks.currentProfile.id) + } + + override def onBackPressed() { + val drawerState = drawer.getDrawerState + if (drawerState == MenuDrawer.STATE_OPEN || drawerState == MenuDrawer.STATE_OPENING) { + drawer.closeMenu() + return + } + super.onBackPressed() + } + override def onActiveViewChanged(v: View, pos: Int) { drawer.setActiveView(v, pos) } + def addProfile(id: Int) { + drawer.closeMenu(true) + + handler.postDelayed(new Runnable { + def run() { + Shadowsocks.currentProfile = profileManager.reload(id) + updatePreferenceScreen() + profileManager.save() + menuAdapter.updateList(getMenuList, Shadowsocks.currentProfile.id) + } + }, 600) + + if (!isSinglePane) sendBroadcast(new Intent(Action.UPDATE_FRAGMENT)) + } + def updateProfile(id: Int) { drawer.closeMenu(true) handler.postDelayed(new Runnable { def run() { - Shadowsocks.currentProfile = profileManager.load(id) + Shadowsocks.currentProfile = profileManager.reload(id) updatePreferenceScreen() + menuAdapter.setActiveId(id) } }, 600) @@ -573,11 +614,7 @@ class Shadowsocks buf ++= getProfileList - buf += new Item(-1, getString(R.string.add_profile), android.R.drawable.ic_menu_add, _ => { - updateProfile(-1) - profileManager.save() - menuAdapter.updateList(getMenuList, Shadowsocks.currentProfile.id) - }) + buf += new Item(-1, getString(R.string.add_profile), android.R.drawable.ic_menu_add, addProfile) buf += new Category("Settings") diff --git a/src/main/scala/com/github/shadowsocks/database/MenuAdapter.scala b/src/main/scala/com/github/shadowsocks/database/MenuAdapter.scala index ef2d1077..66448a6e 100644 --- a/src/main/scala/com/github/shadowsocks/database/MenuAdapter.scala +++ b/src/main/scala/com/github/shadowsocks/database/MenuAdapter.scala @@ -70,8 +70,8 @@ class MenuAdapter(context: Context, var items: List[Any]) extends BaseAdapter { this.listener = listener } - def setActivePosition(activePosition: Int) { - this.activePosition = activePosition + def setActiveId(activeId: Int) { + this.activeId = activeId } @Override def getCount: Int = { @@ -139,28 +139,26 @@ class MenuAdapter(context: Context, var items: List[Any]) extends BaseAdapter { v.setTag(R.id.mdItem, value) + if (value.id == activeId) { + if (listener != null) listener.onActiveViewChanged(v, position) + } + case _ => } v.setTag(R.id.mdActiveViewPosition, position) - if (position == activePosition) { - if (listener != null) listener.onActiveViewChanged(v, position) - } v } def updateList(list: List[Any], activeId: Int) { items = list - activePosition = items.indexWhere{ - case item: Item => item.id == activeId - case _ => false - } + this.activeId = activeId notifyDataSetChanged() } private var listener: MenuAdapter.MenuListener = null - private var activePosition: Int = -1 + private var activeId: Int = -1 } diff --git a/src/main/scala/com/github/shadowsocks/database/ProfileManager.scala b/src/main/scala/com/github/shadowsocks/database/ProfileManager.scala index 4b0b667d..d4772cdb 100644 --- a/src/main/scala/com/github/shadowsocks/database/ProfileManager.scala +++ b/src/main/scala/com/github/shadowsocks/database/ProfileManager.scala @@ -91,11 +91,12 @@ class ProfileManager(settings: SharedPreferences, dbHelper: DBHelper) { } } - def load(id: Int): Profile = { - - Log.d(Shadowsocks.TAG, id + " ") - + def reload(id: Int): Profile = { save() + load(id) + } + + def load(id: Int): Profile = { val profile = getProfile(id) getOrElse { val p = new Profile() @@ -103,8 +104,6 @@ class ProfileManager(settings: SharedPreferences, dbHelper: DBHelper) { p } - Log.d(Shadowsocks.TAG, "load " + profile.id + " " + profile.name) - val edit = settings.edit() edit.putBoolean(Key.isGlobalProxy, profile.global) edit.putBoolean(Key.isGFWList, profile.chnroute)