diff options
Diffstat (limited to 'app/src/main/java/net/lacolaco/smileessence/activity/MainActivity.kt')
-rw-r--r-- | app/src/main/java/net/lacolaco/smileessence/activity/MainActivity.kt | 87 |
1 files changed, 85 insertions, 2 deletions
diff --git a/app/src/main/java/net/lacolaco/smileessence/activity/MainActivity.kt b/app/src/main/java/net/lacolaco/smileessence/activity/MainActivity.kt index 28a95a27..cdbc94d4 100644 --- a/app/src/main/java/net/lacolaco/smileessence/activity/MainActivity.kt +++ b/app/src/main/java/net/lacolaco/smileessence/activity/MainActivity.kt @@ -31,6 +31,7 @@ import android.net.Uri import android.os.Bundle import android.provider.MediaStore import android.support.v4.view.ViewPager +import android.text.TextUtils import android.view.Menu import android.view.MenuItem import android.view.WindowManager @@ -38,15 +39,21 @@ import android.widget.ImageView import de.keyboardsurfer.android.widget.crouton.Crouton import kotlinx.android.synthetic.main.layout_main.* import net.lacolaco.smileessence.* +import net.lacolaco.smileessence.command.CommandOpenUserDetail import net.lacolaco.smileessence.data.ExtractionWord +import net.lacolaco.smileessence.entity.Tweet import net.lacolaco.smileessence.logging.Logger import net.lacolaco.smileessence.twitter.task.Users import net.lacolaco.smileessence.util.BitmapURLTask +import net.lacolaco.smileessence.view.DialogHelper import net.lacolaco.smileessence.view.adapter.PageListAdapter import net.lacolaco.smileessence.view.dialog.ConfirmDialogFragment +import net.lacolaco.smileessence.view.dialog.StatusDetailDialogFragment +import net.lacolaco.smileessence.view.dialog.UserDetailDialogFragment import net.lacolaco.smileessence.view.page.* import org.jetbrains.anko.browse import org.jetbrains.anko.startActivity; +import java.util.regex.Pattern class MainActivity : Activity(), ViewPager.OnPageChangeListener { val world: World by lazy { @@ -111,6 +118,65 @@ class MainActivity : Activity(), ViewPager.OnPageChangeListener { BitmapURLTask(world.account.user.profileImageUrl, currentAccountIconImageView).execute() } + private fun processIntent(intent: Intent) { + val uri = intent.getParcelableExtra<Uri>(KEY_ORIGINAL_DATA) + if (uri != null){ + if (uri.host == "twitter.com") { + // /share and /intent/tweet: don't accept status parameter + val postMatcher = TWITTER_POST_PATTERN.matcher(uri.path) + if (postMatcher.find()) { + var text = uri.getQueryParameter("text") ?: "" + val url = uri.getQueryParameter("url") + if (!TextUtils.isEmpty(url)) + text += " " + url + val hashtags = uri.getQueryParameter("hashtags") + if (!TextUtils.isEmpty(hashtags)) + text += " " + hashtags.trim { it <= ' ' }.replace(",".toRegex(), " #") + val via = uri.getQueryParameter("via") + if (!TextUtils.isEmpty(via)) + text += " via @" + via + world.postState.beginTransaction().setText(text).commitWithOpen(this) + return + } + val statusMatcher = TWITTER_STATUS_PATTERN.matcher(uri.path) + if (statusMatcher.find()) { + Tweet.fetchTask(java.lang.Long.parseLong(statusMatcher.group(1)), world.account) + .onDoneUI { tweet -> DialogHelper.showDialog(this, StatusDetailDialogFragment.newInstance(tweet)) } + .onFail { _ -> world.notifyError(R.string.error_intent_status_cannot_load) } + .execute() + return + } + val userMatcher = TWITTER_USER_PATTERN.matcher(uri.path) + if (userMatcher.find()) { + Users.GetTask(world.account, userMatcher.group(1)) + .onDoneUI { user -> + DialogHelper.showDialog(this, UserDetailDialogFragment.newInstance(user)) + } + .onFail { _ -> world.notifyError(R.string.notice_error_show_user) } + .execute() + return + } + } + } else when (intent.action) { + Intent.ACTION_SEND -> { + val type = intent.getStringExtra(KEY_ORIGINAL_TYPE) + if (type == "text/plain") { + val extra = intent.extras + if (extra != null) { + var text = extra.getCharSequence(Intent.EXTRA_TEXT).toString() + if (!TextUtils.isEmpty(extra.getCharSequence(Intent.EXTRA_SUBJECT))) { + text = extra.getCharSequence(Intent.EXTRA_SUBJECT).toString() + " " + text + } + world.postState.beginTransaction().setText(text).commitWithOpen(this) + return + } + } else if (type != null && type.startsWith("image/")) { + openPostPageWithImage(intent.getParcelableExtra(Intent.EXTRA_STREAM)) + } + } + } + } + // ------------------------ OVERRIDE METHODS ------------------------ override fun onBackPressed() { @@ -183,7 +249,7 @@ class MainActivity : Activity(), ViewPager.OnPageChangeListener { setTitle() // refresh all pages - for (i in 0..pagerAdapter.count - 1) { + for (i in 0 until pagerAdapter.count) { val pf = pagerAdapter.getCachedFragment(i) if (pf != null && pf.isAdded) { Logger.debug(String.format("PageFragment %s is already attached; refreshing", pf.javaClass.name)) @@ -194,7 +260,7 @@ class MainActivity : Activity(), ViewPager.OnPageChangeListener { // start user stream world.setupStreaming() - window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) } override fun onDestroy() { @@ -248,6 +314,17 @@ class MainActivity : Activity(), ViewPager.OnPageChangeListener { super.onResume() Application.currentWorld = world world.setMainActivityActive(true) + val intent = world.mainActivityIntent + if (intent != null) { + world.mainActivityIntent = null + processIntent(intent) + } + } + + override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent) + // With the current releases (~ 7) of Android, onNewIntent() doesn't seem to be called properly + if (false) processIntent(intent) } // --------------------- Interface OnPageChangeListener --------------------- @@ -263,5 +340,11 @@ class MainActivity : Activity(), ViewPager.OnPageChangeListener { companion object { val REQUEST_GET_PICTURE_FROM_GALLERY = 11 + val KEY_ORIGINAL_DATA = "originalData" + val KEY_ORIGINAL_TYPE = "originalType" + private val TWITTER_POST_PATTERN = Pattern.compile("\\A/(intent/tweet|share)\\z", Pattern.CASE_INSENSITIVE) + 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) + } } |