Skip to content

Instantly share code, notes, and snippets.

@pfn
Created January 27, 2016 05:36
Show Gist options
  • Save pfn/41a1056a6f2e58a99c50 to your computer and use it in GitHub Desktop.
Save pfn/41a1056a6f2e58a99c50 to your computer and use it in GitHub Desktop.
startActivityForResult as Future
requestActivityResult(intent).onSuccessMain { case data =>
val ringtone = data.?.map(_.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI): Uri)
setRingtone(ringtone.fold("")(_.toString))
}
package com.hanhuy.android.irc
import android.app.Activity
import android.content.Intent
import android.support.v4.app.Fragment
import com.hanhuy.android.common.Logcat
import scala.concurrent.{Future, Promise}
/**
* @author pfnguyen
*/
trait ActivityResultManager extends Activity {
case object ActivityResultCancel extends Exception
private[this] var _requestCode = 0
def requestCode = {
_requestCode = _requestCode + 1
_requestCode % 0xff
}
private[this] val arlog = Logcat("ActivityResultManager")
private[this] var results = Map.empty[Int,Promise[Intent]]
final override def onActivityResult(request: Int,
resultCode: Int,
data: Intent): Unit = {
if (results.contains(request)) {
if (resultCode != Activity.RESULT_OK) {
results(request).failure(ActivityResultCancel)
} else {
results(request).success(data)
}
results -= request
} else {
super.onActivityResult(request, resultCode, data)
arlog.w(s"Request code $request not found: " + data)
}
}
final def requestActivityResult(intent: Intent): Future[Intent] = {
val req = requestCode
val p = results.getOrElse(req, Promise[Intent]())
super.startActivityForResult(intent, req)
results += ((req, p))
p.future
}
}
trait FragmentResultManager extends Fragment {
case object ActivityResultCancel extends Exception
private[this] var _requestCode = 0
def requestCode = {
_requestCode = _requestCode + 1
_requestCode % 0xff
}
private[this] val arlog = Logcat("ActivityResultManager")
private[this] var results = Map.empty[Int,Promise[Intent]]
final override def onActivityResult(request: Int,
resultCode: Int,
data: Intent): Unit = {
if (results.contains(request)) {
if (resultCode != Activity.RESULT_OK) {
results(request).failure(ActivityResultCancel)
} else {
results(request).success(data)
}
results -= request
} else {
super.onActivityResult(request, resultCode, data)
arlog.w(s"Request code $request not found: " + data)
}
}
final def requestActivityResult(intent: Intent): Future[Intent] = {
val req = requestCode
val p = results.getOrElse(req, Promise[Intent]())
super.startActivityForResult(intent, req)
results += ((req, p))
p.future
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment