From b5729f45b2fb5e358a8a12169140d8b5f2adc0de Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Thu, 28 Sep 2017 01:00:45 +0200
Subject: [PATCH] Integrated account setup with the test activity

---
 app/src/main/AndroidManifest.xml              | 20 ++---
 .../persistence/AccountDatabase.kt            |  2 +-
 .../quasseldroid_ng/ui/ChatActivity.kt        | 73 +++++++++++++------
 .../accounts/AccountSelectionActivity.kt      | 11 ++-
 app/src/main/res/layout/activity_main.xml     | 55 --------------
 app/src/main/res/menu/main.xml                |  3 +
 6 files changed, 75 insertions(+), 89 deletions(-)

diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index dc4385a64..930331580 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -17,14 +17,7 @@
       android:exported="true"
       android:label="@string/app_name"
       android:theme="@style/SplashTheme"
-      android:windowSoftInputMode="adjustResize">
-      <intent-filter>
-        <action android:name="android.intent.action.MAIN" />
-        <action android:name="android.intent.action.VIEW" />
-
-        <category android:name="android.intent.category.LAUNCHER" />
-      </intent-filter>
-    </activity>
+      android:windowSoftInputMode="adjustResize" />
     <activity
       android:name=".ui.setup.accounts.AccountSetupActivity"
       android:exported="false"
@@ -38,11 +31,18 @@
       android:theme="@style/SplashTheme"
       android:windowSoftInputMode="adjustResize" />
     <activity
-      android:name="de.kuschku.quasseldroid_ng.ui.setup.accounts.AccountSelectionActivity"
+      android:name=".ui.setup.accounts.AccountSelectionActivity"
       android:exported="true"
       android:label="AccountSelection"
       android:theme="@style/SplashTheme"
-      android:windowSoftInputMode="adjustResize" />
+      android:windowSoftInputMode="adjustResize">
+      <intent-filter>
+        <action android:name="android.intent.action.MAIN" />
+        <action android:name="android.intent.action.VIEW" />
+
+        <category android:name="android.intent.category.LAUNCHER" />
+      </intent-filter>
+    </activity>
 
     <service
       android:name=".service.QuasselService"
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/persistence/AccountDatabase.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/persistence/AccountDatabase.kt
index d00c55335..d17a86787 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/persistence/AccountDatabase.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/persistence/AccountDatabase.kt
@@ -29,7 +29,7 @@ abstract class AccountDatabase : RoomDatabase() {
     fun create(vararg entities: AccountDatabase.Account): Array<Long>
 
     @Query("SELECT * FROM account WHERE id = :id")
-    fun findById(id: Long): AccountDatabase.Account
+    fun findById(id: Long): AccountDatabase.Account?
 
     @Query("SELECT * FROM account ORDER BY lastUsed DESC")
     fun all(): LivePagedListProvider<Int, Account>
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/ChatActivity.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/ChatActivity.kt
index e20f0f475..4e44fe7e3 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/ChatActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/ChatActivity.kt
@@ -1,15 +1,18 @@
 package de.kuschku.quasseldroid_ng.ui
 
+import android.app.Activity
 import android.arch.lifecycle.LiveDataReactiveStreams
 import android.arch.lifecycle.Observer
+import android.content.Context
 import android.content.Intent
 import android.os.Bundle
+import android.os.Handler
+import android.os.HandlerThread
 import android.support.design.widget.Snackbar
 import android.util.Log
 import android.view.Menu
 import android.view.MenuItem
 import android.widget.Button
-import android.widget.EditText
 import android.widget.TextView
 import butterknife.BindView
 import butterknife.ButterKnife
@@ -18,7 +21,9 @@ import de.kuschku.libquassel.session.ConnectionState
 import de.kuschku.libquassel.session.SocketAddress
 import de.kuschku.libquassel.util.compatibility.LoggingHandler
 import de.kuschku.quasseldroid_ng.R
+import de.kuschku.quasseldroid_ng.persistence.AccountDatabase
 import de.kuschku.quasseldroid_ng.service.QuasselService
+import de.kuschku.quasseldroid_ng.util.helper.editApply
 import de.kuschku.quasseldroid_ng.util.helper.stickyMapNotNull
 import de.kuschku.quasseldroid_ng.util.helper.stickySwitchMapNotNull
 import org.threeten.bp.ZoneOffset
@@ -26,18 +31,6 @@ import org.threeten.bp.ZonedDateTime
 import org.threeten.bp.format.DateTimeFormatter
 
 class ChatActivity : ServiceBoundActivity() {
-  @BindView(R.id.host)
-  lateinit var host: EditText
-
-  @BindView(R.id.port)
-  lateinit var port: EditText
-
-  @BindView(R.id.user)
-  lateinit var user: EditText
-
-  @BindView(R.id.pass)
-  lateinit var pass: EditText
-
   @BindView(R.id.connect)
   lateinit var connect: Button
 
@@ -50,6 +43,9 @@ class ChatActivity : ServiceBoundActivity() {
   @BindView(R.id.errorList)
   lateinit var errorList: TextView
 
+  private val thread = HandlerThread("Chat")
+  private lateinit var handler: Handler
+
   private val state = backend.stickyMapNotNull(null, Backend::sessionManager)
     .stickySwitchMapNotNull(ConnectionState.DISCONNECTED) { session ->
       LiveDataReactiveStreams.fromPublisher(session.state)
@@ -58,7 +54,7 @@ class ChatActivity : ServiceBoundActivity() {
   private var snackbar: Snackbar? = null
 
   private val dateTimeFormatter: DateTimeFormatter = DateTimeFormatter.ISO_TIME
-  private val handler = object : LoggingHandler() {
+  private val logHandler = object : LoggingHandler() {
     override fun log(logLevel: LogLevel, tag: String, message: String?, throwable: Throwable?) {
       val time = dateTimeFormatter.format(ZonedDateTime.now(ZoneOffset.UTC))
       runOnUiThread {
@@ -78,19 +74,41 @@ class ChatActivity : ServiceBoundActivity() {
       = (logLevel.ordinal >= LogLevel.INFO.ordinal)
   }
 
+  var account: AccountDatabase.Account? = null
   override fun onCreate(savedInstanceState: Bundle?) {
+    thread.start()
+    handler = Handler(thread.looper)
+
     startService(Intent(this, QuasselService::class.java))
     setTheme(R.style.AppTheme)
     super.onCreate(savedInstanceState)
     setContentView(R.layout.activity_main)
     ButterKnife.bind(this)
 
+    val database = AccountDatabase.Creator.init(this)
+    handler.post {
+      val accountId = getSharedPreferences("status", Context.MODE_PRIVATE)
+        ?.getLong(selectedAccountKey, -1) ?: -1
+      if (accountId == -1L) {
+        setResult(Activity.RESULT_CANCELED)
+        finish()
+      }
+      val it = database.accounts().findById(accountId)
+      if (it == null) {
+        setResult(Activity.RESULT_CANCELED)
+        finish()
+      }
+      account = it
+    }
+
     connect.setOnClickListener {
-      backend.value?.connect(
-        SocketAddress(host.text.toString(), port.text.toString().toShort()),
-        user.text.toString(),
-        pass.text.toString()
-      )
+      val account = account
+      if (account != null)
+        backend.value?.connect(
+          SocketAddress(account.host, account.port.toShort()),
+          account.user,
+          account.pass
+        )
     }
 
     disconnect.setOnClickListener {
@@ -120,16 +138,27 @@ class ChatActivity : ServiceBoundActivity() {
   }
 
   override fun onOptionsItemSelected(item: MenuItem?) = when (item?.itemId) {
-    else -> super.onOptionsItemSelected(item)
+    R.id.disconnect -> {
+      getSharedPreferences("status", Context.MODE_PRIVATE).editApply {
+        putBoolean("reconnect", false)
+      }
+      finish()
+      true
+    }
+    else            -> super.onOptionsItemSelected(item)
   }
 
   override fun onStart() {
     super.onStart()
-    LoggingHandler.loggingHandlers.add(handler)
+    LoggingHandler.loggingHandlers.add(logHandler)
   }
 
   override fun onStop() {
-    LoggingHandler.loggingHandlers.remove(handler)
+    LoggingHandler.loggingHandlers.remove(logHandler)
     super.onStop()
   }
+
+  companion object {
+    private const val selectedAccountKey = "selectedAccount"
+  }
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/accounts/AccountSelectionActivity.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/accounts/AccountSelectionActivity.kt
index 9d969f9fe..437f31369 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/accounts/AccountSelectionActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/accounts/AccountSelectionActivity.kt
@@ -1,8 +1,10 @@
 package de.kuschku.quasseldroid_ng.ui.setup.accounts
 
 import android.content.Context
+import android.content.Intent
 import android.content.SharedPreferences
 import android.os.Bundle
+import de.kuschku.quasseldroid_ng.ui.ChatActivity
 import de.kuschku.quasseldroid_ng.ui.setup.SetupActivity
 import de.kuschku.quasseldroid_ng.util.helper.editCommit
 
@@ -15,15 +17,22 @@ class AccountSelectionActivity : SetupActivity() {
   override fun onDone(data: Bundle) {
     statusPreferences.editCommit {
       putLong(selectedAccountKey, data.getLong(selectedAccountKey, -1))
+      putBoolean("reconnect", true)
     }
+    startActivity(Intent(this, ChatActivity::class.java))
   }
 
   override fun onCreate(savedInstanceState: Bundle?) {
     super.onCreate(savedInstanceState)
     statusPreferences = this.getSharedPreferences("status", Context.MODE_PRIVATE)
     val data = Bundle()
-    data.putLong(selectedAccountKey, statusPreferences.getLong(selectedAccountKey, -1))
+    val selectedAccount = statusPreferences.getLong(selectedAccountKey, -1)
+    data.putLong(selectedAccountKey, selectedAccount)
     setInitData(data)
+
+    if (statusPreferences.getBoolean("reconnect", false) && selectedAccount != -1L) {
+      startActivity(Intent(this, ChatActivity::class.java))
+    }
   }
 
   companion object {
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index c125e2959..ae8a6ba04 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -12,61 +12,6 @@
     android:paddingLeft="24dp"
     android:paddingRight="24dp">
 
-    <android.support.design.widget.TextInputLayout
-      android:layout_width="match_parent"
-      android:layout_height="wrap_content">
-
-      <android.support.design.widget.TextInputEditText
-        android:id="@+id/host"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:hint="Host"
-        android:maxLines="1"
-        android:singleLine="true" />
-    </android.support.design.widget.TextInputLayout>
-
-    <android.support.design.widget.TextInputLayout
-      android:layout_width="match_parent"
-      android:layout_height="wrap_content">
-
-      <android.support.design.widget.TextInputEditText
-        android:id="@+id/port"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:hint="Port"
-        android:inputType="number"
-        android:maxLines="1"
-        android:singleLine="true"
-        android:text="4242" />
-    </android.support.design.widget.TextInputLayout>
-
-    <android.support.design.widget.TextInputLayout
-      android:layout_width="match_parent"
-      android:layout_height="wrap_content">
-
-      <android.support.design.widget.TextInputEditText
-        android:id="@+id/user"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:hint="Username"
-        android:maxLines="1"
-        android:singleLine="true" />
-    </android.support.design.widget.TextInputLayout>
-
-    <android.support.design.widget.TextInputLayout
-      android:layout_width="match_parent"
-      android:layout_height="wrap_content">
-
-      <android.support.design.widget.TextInputEditText
-        android:id="@+id/pass"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:hint="Password"
-        android:inputType="textPassword"
-        android:maxLines="1"
-        android:singleLine="true" />
-    </android.support.design.widget.TextInputLayout>
-
     <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content">
diff --git a/app/src/main/res/menu/main.xml b/app/src/main/res/menu/main.xml
index 270a5385a..2079987d4 100644
--- a/app/src/main/res/menu/main.xml
+++ b/app/src/main/res/menu/main.xml
@@ -3,4 +3,7 @@
   <item
     android:id="@+id/settings"
     android:title="Settings" />
+  <item
+    android:id="@+id/disconnect"
+    android:title="Disconnect" />
 </menu>
-- 
GitLab