Advertisement
Guest User

Untitled

a guest
Dec 12th, 2014
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. trait FsmActivity extends ActivityExtras {
  2.   type State
  3.   type Data
  4.   def actorClass: ClassTag[_ <: FSM[State, Data]]
  5.   lazy val actor = App.system.actorOf(Props(actorClass.runtimeClass))
  6.   implicit def timeout: Timeout = 2 seconds
  7.   override def onDestroy() = {
  8.     super.onDestroy()
  9.     actor ! PoisonPill
  10.   }
  11. }
  12.  
  13. class FsmActorActivity extends Activity with ActivityExtras with FsmActivity {
  14.   type State = DoorState
  15.   type Data = Int
  16.   def actorClass = implicitly[ClassTag[DoorActor]]
  17.   lazy val door = findViewById(R.id.door).asInstanceOf[ImageView]
  18.   lazy val List(openButton, closeButton, stateButton) = List(R.id.open, R.id.close, R.id.state).map{ this.gtTxt }
  19.  
  20.   private def handleActorResponse(a: Any): Unit  = a match {
  21.     case newState: State => newState match {
  22.       case Open => ui { door.setImageResource(R.drawable.door_open) }
  23.       case Closed => ui { door.setImageResource(R.drawable.door_closed) }
  24.     }
  25.     case Already(str) => ui { toast(s"Door is already $str, why would you do that")}
  26.     case (state: DoorState, openCount: Int) => ui{
  27.       toast(s"Door is $state, it was opened $openCount times")
  28.     }
  29.     case str: String => ui { toast(str) }
  30.     case i: Data => ui { toast(s"Door opened $i times") }
  31.     case that => ui { toast(s"Got strange response from actor: $that") }
  32.   }
  33.  
  34.   override def onCreate(b: Bundle) = {
  35.     super.onCreate(b)
  36.     setContentView(R.layout.activity_door)
  37.     List(openButton -> Open, closeButton -> Closed, stateButton -> "state").foreach{
  38.       case (button, message) => button.setCl {
  39.         actor ? message foreach handleActorResponse
  40.       }
  41.     }
  42.   }
  43. }
  44.  
  45. sealed trait DoorState
  46. case object Open extends DoorState
  47. case object Closed extends DoorState
  48.  
  49. case class Already(string: String)
  50.  
  51. class DoorActor extends FSM[DoorState, Int] {
  52.   startWith(Closed, 0)
  53.   when(Closed) {
  54.     case Event(Open, sd) =>
  55.       sender ! Open
  56.       goto(Open) using sd + 1
  57.   }
  58.   when(Open) {
  59.     case Event(Closed, sd) =>
  60.       sender ! Closed
  61.       goto(Closed)
  62.   }
  63.  
  64.   whenUnhandled {
  65.     case Event(e: DoorState, _) => sender ! Already(e.toString); stay()
  66.     case Event("openCount", _) => sender ! stateData; stay()
  67.     case Event("state", _) => sender ! (stateName, stateData); stay()
  68.   }
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement