Advertisement
Guest User

Untitled

a guest
Dec 12th, 2014
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 2.24 KB | None | 0 0
  1. package com.example.android2111.app
  2.  
  3. import akka.actor.FSM
  4. import akka.actor.FSM.Event
  5. import android.app.Activity
  6. import android.os.Bundle
  7. import android.widget.{Button, ImageView}
  8. import Implicits._
  9. import scala.reflect.ClassTag
  10. import akka.pattern._
  11. import concurrent.ExecutionContext.Implicits._
  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.  
  46. sealed trait DoorState
  47. case object Open extends DoorState
  48. case object Closed extends DoorState
  49.  
  50. case class Already(string: String)
  51.  
  52. class DoorActor extends FSM[DoorState, Int] {
  53.   startWith(Closed, 0)
  54.   when(Closed) {
  55.     case Event(Open, sd) =>
  56.       sender ! Open
  57.       goto(Open) using sd + 1
  58.   }
  59.   when(Open) {
  60.     case Event(Closed, sd) =>
  61.       sender ! Closed
  62.       goto(Closed)
  63.   }
  64.  
  65.   whenUnhandled {
  66.     case Event(e: DoorState, _) => sender ! Already(e.toString); stay()
  67.     case Event("openCount", _) => sender ! stateData; stay()
  68.     case Event("state", _) => sender ! (stateName, stateData); stay()
  69.   }
  70. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement