aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/net/lacolaco/smileessence/IntentRouter.kt
diff options
context:
space:
mode:
authorKazuki Yamaguchi <k@rhe.jp>2017-10-05 15:58:59 +0900
committerKazuki Yamaguchi <k@rhe.jp>2017-10-05 15:58:59 +0900
commit9db537d339faa3ad44dfdcadb23f4c14bd8aceb4 (patch)
tree6b151cdfd0ca7dc44b9a189045b2b2cbc5aefc21 /app/src/main/java/net/lacolaco/smileessence/IntentRouter.kt
parent52ad6edcb217762154a80990c34ca94772393848 (diff)
downloadSmileEssence-9db537d339faa3ad44dfdcadb23f4c14bd8aceb4.tar.gz
kotlin work part. 1
Diffstat (limited to 'app/src/main/java/net/lacolaco/smileessence/IntentRouter.kt')
-rw-r--r--app/src/main/java/net/lacolaco/smileessence/IntentRouter.kt142
1 files changed, 142 insertions, 0 deletions
diff --git a/app/src/main/java/net/lacolaco/smileessence/IntentRouter.kt b/app/src/main/java/net/lacolaco/smileessence/IntentRouter.kt
new file mode 100644
index 00000000..e5f9d0ce
--- /dev/null
+++ b/app/src/main/java/net/lacolaco/smileessence/IntentRouter.kt
@@ -0,0 +1,142 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2012-2014 lacolaco.net
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package net.lacolaco.smileessence
+
+import android.app.Activity
+import android.content.Intent
+import android.net.Uri
+import android.os.Bundle
+import android.text.TextUtils
+import android.widget.Toast
+import net.lacolaco.smileessence.activity.MainActivity
+import net.lacolaco.smileessence.command.CommandOpenUserDetail
+import net.lacolaco.smileessence.entity.Tweet
+import net.lacolaco.smileessence.logging.Logger
+import net.lacolaco.smileessence.util.UIHandler
+import net.lacolaco.smileessence.view.DialogHelper
+import net.lacolaco.smileessence.view.dialog.StatusDetailDialogFragment
+
+import java.util.regex.Matcher
+import java.util.regex.Pattern
+
+object IntentRouter {
+
+ // ------------------------------ FIELDS ------------------------------
+
+ private val TWITTER_HOST = "twitter.com"
+ private val TWITTER_STATUS_PATTERN = Pattern.compile("\\A(?:/#!)?/(?:\\w{1,15})/status(?:es)?/(\\d+)\\z", Pattern.CASE_INSENSITIVE)
+ private val TWITTER_USER_PATTERN = Pattern.compile("\\A(?:/#!)?/(\\w{1,15})/?\\z", Pattern.CASE_INSENSITIVE)
+ private val TWITTER_POST_PATTERN = Pattern.compile("\\A/(intent/tweet|share)\\z", Pattern.CASE_INSENSITIVE)
+
+ // -------------------------- STATIC METHODS --------------------------
+
+ fun onNewIntent(activity: MainActivity, intent: Intent) {
+ Logger.debug("onNewIntent")
+ val uri = intent.data
+ if (uri != null) {
+ onUriIntent(activity, uri)
+ } else if (intent.action != null) {
+ when (intent.action) {
+ Intent.ACTION_SEND -> {
+ if ("text/plain" == intent.type) {
+ val extra = intent.extras
+ if (extra != null) {
+ val text = getText(extra)
+ openPostPage(activity, text)
+ }
+ } else if (intent.type.startsWith("image/")) {
+ val imageUri = intent.getParcelableExtra<Uri>(Intent.EXTRA_STREAM)
+ openPostPageWithImage(activity, imageUri)
+ }
+ }
+ }
+ }
+ }
+
+ private fun onUriIntent(activity: MainActivity, uri: Uri) {
+ Logger.debug(uri.toString())
+
+ if (uri.host == TWITTER_HOST) {
+ val postMatcher = TWITTER_POST_PATTERN.matcher(uri.path) // /share and /intent/tweet: don't accept status parameter
+ if (postMatcher.find()) {
+ openPostPage(activity, extractText(uri))
+ return
+ }
+ val statusMatcher = TWITTER_STATUS_PATTERN.matcher(uri.path)
+ if (statusMatcher.find()) {
+ showStatusDialog(activity, java.lang.Long.parseLong(statusMatcher.group(1)))
+ return
+ }
+ val userMatcher = TWITTER_USER_PATTERN.matcher(uri.path)
+ if (userMatcher.find()) {
+ showUserDialog(activity, userMatcher.group(1))
+ }
+ }
+ }
+
+ private fun getText(extra: Bundle): String {
+ val builder = StringBuilder()
+ if (!TextUtils.isEmpty(extra.getCharSequence(Intent.EXTRA_SUBJECT))) {
+ builder.append(extra.getCharSequence(Intent.EXTRA_SUBJECT)).append(" ")
+ }
+ builder.append(extra.getCharSequence(Intent.EXTRA_TEXT))
+ return builder.toString()
+ }
+
+ private fun extractText(uri: Uri): String {
+ var result = ""
+ val text = uri.getQueryParameter("text")
+ val url = uri.getQueryParameter("url")
+ val via = uri.getQueryParameter("via")
+ val hashtags = uri.getQueryParameter("hashtags")
+
+ if (!TextUtils.isEmpty(text)) result += text
+ if (!TextUtils.isEmpty(url)) result += " " + url
+ if (!TextUtils.isEmpty(hashtags)) result += " " + hashtags.trim { it <= ' ' }.replace(",".toRegex(), " #")
+ if (!TextUtils.isEmpty(via)) result += " via @" + via
+
+ return result
+ }
+
+ private fun showStatusDialog(activity: Activity, id: Long) {
+ Tweet.fetchTask(id, Application.currentWorld!!.account)
+ .onDoneUI { tweet -> DialogHelper.showDialog(activity, StatusDetailDialogFragment.newInstance(tweet)) }
+ .onFail { x -> Application.toast(R.string.error_intent_status_cannot_load) }
+ .execute()
+ }
+
+ private fun showUserDialog(activity: MainActivity, screenName: String) {
+ val openUserDetail = CommandOpenUserDetail(activity, screenName)
+ openUserDetail.execute()
+ }
+
+ private fun openPostPage(activity: MainActivity, str: String) {
+ UIHandler().post { activity.world.postState.beginTransaction().setText(str).commitWithOpen(activity) }
+ }
+
+ private fun openPostPageWithImage(activity: MainActivity, imageUri: Uri) {
+ UIHandler().post { activity.openPostPageWithImage(imageUri) }
+ }
+}