From bedb39cd44acbeb92d2892039e9d5447934fedbf Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Thu, 8 Mar 2018 20:31:48 +0100
Subject: [PATCH] Implement sharing of links and plain text

---
 app/src/main/AndroidManifest.xml              | 30 ++++++++------
 .../quasseldroid_ng/ui/chat/ChatActivity.kt   | 19 +++++++--
 .../quasseldroid_ng/ui/chat/InputEditor.kt    |  5 +++
 .../accounts/AccountSelectionActivity.kt      | 29 +++-----------
 .../util/service/ServiceBoundActivity.kt      | 40 ++++++++++++++++---
 5 files changed, 79 insertions(+), 44 deletions(-)

diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 5b46c8ad2..5e08fb93a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -14,10 +14,23 @@
     android:theme="@style/Theme.SplashTheme">
     <activity
       android:name=".ui.chat.ChatActivity"
-      android:exported="false"
+      android:exported="true"
       android:label="@string/app_name"
-      android:launchMode="singleInstance"
-      android:windowSoftInputMode="adjustResize" />
+      android:launchMode="singleTask"
+      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>
+      <intent-filter>
+        <action android:name="android.intent.action.SEND" />
+        <category android:name="android.intent.category.DEFAULT" />
+        <data android:mimeType="text/plain" />
+      </intent-filter>
+    </activity>
+
     <activity
       android:name=".ui.setup.accounts.AccountSetupActivity"
       android:exported="false"
@@ -38,16 +51,9 @@
       android:windowSoftInputMode="adjustResize" />
     <activity
       android:name=".ui.setup.accounts.AccountSelectionActivity"
-      android:exported="true"
+      android:exported="false"
       android:label="@string/app_name"
-      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" />
 
     <service
       android:name=".service.QuasselService"
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.kt
index c333d2fbd..3ee817471 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatActivity.kt
@@ -1,7 +1,6 @@
 package de.kuschku.quasseldroid_ng.ui.chat
 
 import android.annotation.TargetApi
-import android.app.Activity
 import android.arch.lifecycle.Observer
 import android.arch.lifecycle.ViewModelProviders
 import android.content.Context
@@ -39,6 +38,7 @@ import de.kuschku.quasseldroid_ng.settings.AppearanceSettings
 import de.kuschku.quasseldroid_ng.settings.BacklogSettings
 import de.kuschku.quasseldroid_ng.settings.Settings
 import de.kuschku.quasseldroid_ng.ui.settings.SettingsActivity
+import de.kuschku.quasseldroid_ng.ui.setup.accounts.AccountSelectionActivity
 import de.kuschku.quasseldroid_ng.ui.viewmodel.QuasselViewModel
 import de.kuschku.quasseldroid_ng.util.AndroidHandlerThread
 import de.kuschku.quasseldroid_ng.util.helper.*
@@ -123,6 +123,17 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
     override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) = Unit
   }
 
+  override fun onNewIntent(intent: Intent?) {
+    super.onNewIntent(intent)
+    if (intent != null) {
+      when {
+        intent.type == "text/plain" -> {
+          inputEditor.share(intent.getStringExtra(Intent.EXTRA_TEXT))
+        }
+      }
+    }
+  }
+
   override fun onCreate(savedInstanceState: Bundle?) {
     handler.onCreate()
     super.onCreate(savedInstanceState)
@@ -385,8 +396,10 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
             putBoolean(Keys.Status.reconnect, false)
           }
         }
-        setResult(Activity.RESULT_OK)
-        finish()
+
+        val intent = Intent(this, AccountSelectionActivity::class.java)
+        intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
+        startActivityForResult(intent, REQUEST_SELECT_ACCOUNT)
       }
       true
     }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/InputEditor.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/InputEditor.kt
index 8b00f4c4d..6eed8d219 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/InputEditor.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/InputEditor.kt
@@ -222,4 +222,9 @@ class InputEditor(private val editText: EditText) {
       editText.setSelection(editText.text.length)
     }
   }
+
+  fun share(text: CharSequence?) {
+    editText.setText(text)
+    editText.setSelection(editText.text.length)
+  }
 }
\ No newline at end of file
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 525ae03d1..33644c911 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
@@ -2,19 +2,16 @@ package de.kuschku.quasseldroid_ng.ui.setup.accounts
 
 import android.app.Activity
 import android.content.Context
-import android.content.Intent
 import android.content.SharedPreferences
 import android.os.Bundle
 import de.kuschku.quasseldroid_ng.Keys
-import de.kuschku.quasseldroid_ng.ui.chat.ChatActivity
 import de.kuschku.quasseldroid_ng.ui.setup.SetupActivity
-import de.kuschku.quasseldroid_ng.util.helper.editApply
+import de.kuschku.quasseldroid_ng.util.helper.editCommit
 
 class AccountSelectionActivity : SetupActivity() {
   companion object {
-    const val REQUEST_CHAT = 0
-    const val REQUEST_CREATE_FIRST = 1
-    const val REQUEST_CREATE_NEW = 2
+    const val REQUEST_CREATE_FIRST = 0
+    const val REQUEST_CREATE_NEW = 1
   }
 
   override val fragments = listOf(
@@ -23,13 +20,12 @@ class AccountSelectionActivity : SetupActivity() {
 
   private lateinit var statusPreferences: SharedPreferences
   override fun onDone(data: Bundle) {
-    statusPreferences.editApply {
+    statusPreferences.editCommit {
       putLong(Keys.Status.selectedAccount, data.getLong(Keys.Status.selectedAccount, -1))
       putBoolean(Keys.Status.reconnect, true)
     }
-    val intent = Intent(this, ChatActivity::class.java)
-    intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
-    startActivityForResult(intent, REQUEST_CHAT)
+    setResult(Activity.RESULT_OK)
+    finish()
   }
 
   override fun onCreate(savedInstanceState: Bundle?) {
@@ -39,18 +35,5 @@ class AccountSelectionActivity : SetupActivity() {
     val selectedAccount = statusPreferences.getLong(Keys.Status.selectedAccount, -1)
     data.putLong(Keys.Status.selectedAccount, selectedAccount)
     setInitData(data)
-
-    if (statusPreferences.getBoolean(Keys.Status.reconnect, false) && selectedAccount != -1L) {
-      val intent = Intent(this, ChatActivity::class.java)
-      intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
-      startActivityForResult(intent, REQUEST_CHAT)
-    }
-  }
-
-  override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
-    super.onActivityResult(requestCode, resultCode, data)
-    if (requestCode == REQUEST_CHAT && resultCode == Activity.RESULT_CANCELED) {
-      finish()
-    }
   }
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/service/ServiceBoundActivity.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/util/service/ServiceBoundActivity.kt
index b2d194642..ed35f704f 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/util/service/ServiceBoundActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/util/service/ServiceBoundActivity.kt
@@ -3,6 +3,7 @@ package de.kuschku.quasseldroid_ng.util.service
 import android.app.Activity
 import android.arch.lifecycle.LiveData
 import android.content.Context
+import android.content.Intent
 import android.content.SharedPreferences
 import android.os.Bundle
 import android.support.annotation.ColorRes
@@ -14,6 +15,7 @@ import de.kuschku.quasseldroid_ng.R
 import de.kuschku.quasseldroid_ng.settings.AppearanceSettings
 import de.kuschku.quasseldroid_ng.settings.ConnectionSettings
 import de.kuschku.quasseldroid_ng.settings.Settings
+import de.kuschku.quasseldroid_ng.ui.setup.accounts.AccountSelectionActivity
 import de.kuschku.quasseldroid_ng.util.helper.sharedPreferences
 import de.kuschku.quasseldroid_ng.util.helper.updateRecentsHeaderIfExisting
 
@@ -32,17 +34,18 @@ abstract class ServiceBoundActivity : AppCompatActivity(),
   protected lateinit var connectionSettings: ConnectionSettings
   protected var accountId: Long = -1
 
+  private var startedSelection = false
+
   override fun onCreate(savedInstanceState: Bundle?) {
     connection.context = this
 
     appearanceSettings = Settings.appearance(this)
     connectionSettings = Settings.connection(this)
-    accountId = getSharedPreferences(Keys.Status.NAME, Context.MODE_PRIVATE)
-      ?.getLong(Keys.Status.selectedAccount, -1) ?: -1
+
+    checkConnection()
 
     setTheme(appearanceSettings.theme.style)
     super.onCreate(savedInstanceState)
-    connection.start()
     updateRecentsHeader()
   }
 
@@ -79,11 +82,32 @@ abstract class ServiceBoundActivity : AppCompatActivity(),
   }
 
   private fun checkConnection() {
+    accountId = getSharedPreferences(Keys.Status.NAME, Context.MODE_PRIVATE)
+      ?.getLong(Keys.Status.selectedAccount, -1) ?: -1
+
     if (!sharedPreferences(Keys.Status.NAME, Context.MODE_PRIVATE) {
         getBoolean(Keys.Status.reconnect, false)
-      }) {
-      setResult(Activity.RESULT_OK)
-      finish()
+      } || accountId == -1L) {
+
+      if (!startedSelection) {
+        startActivityForResult(
+          Intent(this, AccountSelectionActivity::class.java), REQUEST_SELECT_ACCOUNT
+        )
+        startedSelection = true
+      }
+    } else {
+      connection.start()
+    }
+  }
+
+  override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
+    super.onActivityResult(requestCode, resultCode, data)
+    if (requestCode == REQUEST_SELECT_ACCOUNT) {
+      startedSelection = false
+
+      if (resultCode == Activity.RESULT_CANCELED) {
+        finish()
+      }
     }
   }
 
@@ -91,4 +115,8 @@ abstract class ServiceBoundActivity : AppCompatActivity(),
     connection.unbind()
     connection.stop()
   }
+
+  companion object {
+    const val REQUEST_SELECT_ACCOUNT = 0
+  }
 }
-- 
GitLab