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) } } } }