aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/net/lacolaco/smileessence/activity/OAuthActivity.kt
blob: 5e877b22dd97868ebb52f03105ba219929735908 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package net.lacolaco.smileessence.activity

import android.annotation.SuppressLint
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.os.Parcelable
import android.support.v7.app.AppCompatActivity
import android.text.Editable
import android.text.TextWatcher
import android.widget.Toast
import kotlinx.android.parcel.Parcelize
import kotlinx.android.synthetic.main.layout_oauth.*
import net.lacolaco.smileessence.R
import net.lacolaco.smileessence.twitter.TwitterTaskException
import net.lacolaco.smileessence.util.bg
import net.lacolaco.smileessence.util.browse
import net.lacolaco.smileessence.util.launchUi
import twitter4j.TwitterFactory
import twitter4j.auth.RequestToken

class OAuthActivity : AppCompatActivity() {
    private var requestTokenPair: RequestTokenPair? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.layout_oauth)

        if (savedInstanceState != null)
            requestTokenPair = savedInstanceState.getParcelable(KEY_REQUEST_TOKEN)
        else
            launchUi {
                try {
                    requestTokenPair = RequestTokenPair.requestNewAsync().await()
                    browse(requestTokenPair!!.requestToken.authorizationURL)
                } catch (e: TwitterTaskException) {
                    e.printStackTrace()
                    Toast.makeText(this@OAuthActivity,
                            "Could not get a request token (${e.message})",
                            Toast.LENGTH_LONG).show()
                    setResult(Activity.RESULT_CANCELED)
                    finish()
                }
            }

        button_oauth_auth.isEnabled = false
        editText_oauth_verifier.addTextChangedListener(object : TextWatcher {
            override fun afterTextChanged(p0: Editable) {}

            override fun beforeTextChanged(p0: CharSequence, p1: Int, p2: Int, p3: Int) {}

            override fun onTextChanged(p0: CharSequence, p1: Int, p2: Int, p3: Int) {
                button_oauth_auth.isEnabled = requestTokenPair != null && p0.isNotEmpty()
            }
        })
        button_oauth_auth.setOnClickListener { verify(editText_oauth_verifier.text.toString()) }
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        outState.putParcelable(KEY_REQUEST_TOKEN, requestTokenPair)
    }

    private fun verify(verifier: String) {
        launchUi {
            val accessToken = try {
                requestTokenPair!!.getAccessTokenAsync(verifier).await()
            } catch (e: TwitterTaskException) {
                Toast.makeText(this@OAuthActivity,
                        "Could not get an access token (${e.message})",
                        Toast.LENGTH_LONG).show()
                setResult(Activity.RESULT_CANCELED)
                finish()
                return@launchUi
            }

            val intent = Intent()
            intent.putExtra(KEY_TOKEN, accessToken.token)
            intent.putExtra(KEY_TOKEN_SECRET, accessToken.tokenSecret)
            intent.putExtra(KEY_USER_ID, accessToken.userId)
            intent.putExtra(KEY_SCREEN_NAME, accessToken.screenName)
            setResult(RESULT_OK, intent)
            finish()
        }
    }

    companion object {
        const val KEY_TOKEN = "token"
        const val KEY_TOKEN_SECRET = "tokenSecret"
        const val KEY_SCREEN_NAME = "screenName"
        const val KEY_USER_ID = "userID"
        private const val KEY_REQUEST_TOKEN = "REQUEST_TOKEN"
    }

    @Parcelize
    @SuppressLint("ParcelCreator")
    private class RequestTokenPair(val token: String, val tokenSecret: String) : Parcelable {
        val requestToken
            get() = RequestToken(token, tokenSecret)

        fun getAccessTokenAsync(verifier: String) = bg {
            TwitterTaskException.wrap {
                TwitterFactory().instance.getOAuthAccessToken(requestToken, verifier)
            }
        }

        companion object {
            fun requestNewAsync() = bg {
                val requestToken = TwitterTaskException.wrap {
                    TwitterFactory().instance.getOAuthRequestToken("oob")
                }
                RequestTokenPair(requestToken.token, requestToken.tokenSecret)
            }
        }
    }
}