Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.mldz.igrodil.db
- import android.content.Intent
- import android.provider.Settings
- import androidx.localbroadcastmanager.content.LocalBroadcastManager
- import com.google.firebase.database.*
- import com.mldz.igrodil.App
- import com.mldz.igrodil.R
- import com.mldz.igrodil.api.models.GameDataModel
- import com.mldz.igrodil.api.models.RoomModelItem
- import com.mldz.igrodil.managers.IgrodilManager
- import com.mldz.igrodil.ui.fragments.FinishGameFragment
- import io.reactivex.Observable
- import timber.log.Timber
- object RealtimeDatabase {
- private var database: FirebaseDatabase = FirebaseDatabase.getInstance()
- private lateinit var roomRef: DatabaseReference
- private var roomsRef: DatabaseReference
- private lateinit var playerRef: DatabaseReference
- private val gameRef: DatabaseReference
- private var playerName = App.getPreferences().getUsername()
- private var room = ""
- private var roomList = ArrayList<RoomModelItem>()
- val fullName: String
- private const val gameStatus = "gameStatus"
- const val WAIT_PLAYERS = 1
- const val GAME_RUN = 2
- const val GAME_FINISH = 3
- const val IN_GAME = 11
- const val PLAYER_FINISH_GAME = 12
- init {
- gameRef = database.reference.child("games")
- roomsRef = database.reference.child("rooms")
- fullName = initName()
- }
- private fun initName(): String {
- val fName = App.getPreferences().getUserFirstName()
- val lName = App.getPreferences().getUserLastName()
- return if (App.getPreferences().isAuth()) {
- if (lName.isNotEmpty())
- "$fName $lName"
- else
- fName
- } else {
- val id = Settings.Secure.getString(
- IgrodilManager.getContext().contentResolver,
- Settings.Secure.ANDROID_ID
- )
- "$fName ${id.substring(id.length - 4)}"
- }
- }
- fun getRooms(): Observable<List<RoomModelItem>> {
- return Observable.create {
- roomsRef.addValueEventListener(object : ValueEventListener {
- override fun onCancelled(p0: DatabaseError) {
- it.onError(Throwable(p0.message))
- }
- override fun onDataChange(p0: DataSnapshot) {
- // update room list
- roomList.clear()
- val rooms = p0.children
- for (room in rooms) {
- val level = (room.child("level").value as Long).toInt()
- var size = -1
- for (c in room.children) {
- size++
- }
- roomList.add(RoomModelItem(room.key!!, level, size))
- }
- it.onNext(roomList)
- }
- })
- }
- }
- fun createRoom(name: String, level: Int): Observable<HashMap<Int, String>> {
- // create room and add yourself as player1
- return Observable.create {
- room = name
- roomRef = database.getReference("rooms/$room/$playerName")
- roomsRef.child(room).child("level").setValue(level)
- roomRef.child("name").setValue(fullName)
- roomRef.child("isCreator").setValue(1)
- roomsRef.child(room).child("creator").setValue(playerName)
- val res = hashMapOf(0 to playerName, 1 to room)
- it.onNext(res)
- }
- }
- fun initPlayer(): Observable<Boolean> {
- // logging player in
- playerRef = database.getReference("players/$playerName")
- val res = addPlayerEventListener()
- playerRef.setValue("")
- return res
- }
- private fun addPlayerEventListener(): Observable<Boolean> {
- // read from database players
- return Observable.create {
- playerRef.addValueEventListener(object : ValueEventListener {
- override fun onCancelled(p0: DatabaseError) {
- Timber.d(p0.message)
- it.onError(Throwable(p0.message))
- }
- override fun onDataChange(p0: DataSnapshot) {
- // success player
- it.onNext(true)
- }
- })
- }
- }
- fun loginRoom(roomName: String): Observable<HashMap<Int, String>> {
- //join in existing room and add yourself as player (playerName)
- return Observable.create {
- roomsRef.child(roomName).addListenerForSingleValueEvent(object : ValueEventListener {
- override fun onCancelled(p0: DatabaseError) {
- }
- override fun onDataChange(p0: DataSnapshot) {
- var size = -1
- val users = p0.children
- for (user in users)
- size++
- if (size < 5) {
- roomRef = roomsRef.child(roomName)
- if (!App.getPreferences().isAuth())
- playerName = Settings.Secure.getString(IgrodilManager.getContext().contentResolver, Settings.Secure.ANDROID_ID)
- roomsRef.child(roomName).child(playerName).child("name").setValue(fullName)
- room = roomName
- it.onNext(hashMapOf(0 to "", 1 to room))
- }
- else
- it.onError(Throwable(IgrodilManager.getContext().getString(R.string.no_place_in_room)))
- }
- })
- }
- }
- fun getUsers(roomName: String): Observable<ArrayList<String>> {
- return Observable.create {
- val users = ArrayList<String>()
- database.reference.child("rooms").child(roomName).addChildEventListener(object : ChildEventListener {
- override fun onCancelled(p0: DatabaseError) {
- }
- override fun onChildMoved(p0: DataSnapshot, p1: String?) {
- }
- override fun onChildChanged(p0: DataSnapshot, p1: String?) {
- }
- override fun onChildAdded(p0: DataSnapshot, p1: String?) {
- if (p0.key != "level" && p0.key != "creator")
- users.add((p0.value as HashMap<*, *>)["name"] as String)
- it.onNext(users)
- }
- override fun onChildRemoved(p0: DataSnapshot) {
- try {
- users.remove((p0.value as HashMap<*, *>)["name"] as String)
- } catch (e: Exception) {
- }
- if (users.size < 1) {
- closeRoom(roomName)
- gameRef.child(roomName).removeValue()
- }
- else
- it.onNext(users)
- }
- })
- }
- }
- fun leaveRoom() {
- if (room.isNotEmpty()) {
- database.reference.child("rooms").child(room).child(playerName).removeValue()
- }
- }
- fun closeRoom(roomName: String) {
- database.reference.child("rooms").child(roomName).removeValue()
- }
- fun addGameEventListener(roomName: String, video: GameDataModel): Observable<GameDataModel> {
- var statusGame = WAIT_PLAYERS
- return Observable.create {
- if (roomName.isNotEmpty()) {
- val isCreator = roomName == App.getPreferences().getUsername()
- if (isCreator) {
- val key = gameRef.child(roomName).push().key
- if (key != null) {
- val childUpdates = HashMap<String, Any>()
- val videoMap = video.toMap()
- videoMap[gameStatus] = WAIT_PLAYERS
- videoMap["winner"] = ""
- childUpdates["games/$roomName"] = videoMap
- database.reference.updateChildren(childUpdates)
- }
- }
- gameRef.child(roomName).addValueEventListener(object : ValueEventListener {
- override fun onCancelled(p0: DatabaseError) {
- it.onError(Throwable())
- }
- override fun onDataChange(p0: DataSnapshot) {
- try {
- if (p0.value != null) {
- val result = p0.value as HashMap<*, *>
- when {
- result["winner"].toString().isNotEmpty() -> {
- if (statusGame == GAME_RUN) {
- it.onNext(
- GameDataModel(
- result["id"].toString().toInt(),
- result["thumbnail"].toString(),
- result["url"].toString(),
- result["word"].toString(),
- result["winner"].toString()
- )
- )
- }
- statusGame = GAME_FINISH
- }
- result[gameStatus].toString().toInt() == GAME_RUN -> {
- it.onNext(
- GameDataModel(
- result["id"].toString().toInt(),
- result["thumbnail"].toString(),
- result["url"].toString(),
- result["word"].toString(),
- null
- )
- )
- setPlayerStatus(roomName, IN_GAME)
- statusGame = GAME_RUN
- }
- result[gameStatus].toString().toInt() == WAIT_PLAYERS ->
- LocalBroadcastManager.getInstance(IgrodilManager.getContext()).sendBroadcast(
- Intent(FinishGameFragment.START_NEW_GAME_ROOM)
- )
- }
- }
- } catch (e: Exception) {
- it.onError(e)
- }
- }
- })
- }
- }
- }
- fun setGameRun(roomName: String) {
- if (roomName.isNotEmpty())
- gameRef.child(roomName).child(gameStatus).setValue(GAME_RUN)
- }
- fun startNewGame(roomName: String) {
- gameRef.child(roomName).child(gameStatus).setValue(WAIT_PLAYERS)
- }
- fun onGameWin(roomName: String) {
- if (roomName.isNotEmpty()) {
- gameRef.child(roomName).child("winner").setValue(fullName)
- gameRef.child(roomName).child(gameStatus).setValue(GAME_FINISH)
- }
- }
- fun setPlayerStatus(roomName: String, status: Int) {
- if (roomName.isNotEmpty())
- roomsRef.child(roomName).child(playerName).child("status").setValue(status)
- }
- fun getRoomListener(): Observable<Boolean> {
- return Observable.create {
- roomsRef.child(room).addValueEventListener(object : ValueEventListener {
- override fun onCancelled(p0: DatabaseError) {
- }
- override fun onDataChange(p0: DataSnapshot) {
- val players = p0.children
- var allReady = true
- for (player in players) {
- val data = player.child("status").value
- if (data != null) {
- val status = (data as Long).toInt()
- if (status != PLAYER_FINISH_GAME) {
- allReady = false
- break
- }
- }
- }
- it.onNext(allReady)
- }
- })
- }
- }
- fun getCreatorOfRoom() {
- if (room.isNotEmpty()) {
- // return roomsRef.child(room).child("creator").addListenerForSingleValueEvent(object : ValueEventListener {
- // override fun onCancelled(p0: DatabaseError) {
- // TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
- // }
- //
- // override fun onDataChange(p0: DataSnapshot) {
- // TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
- // }
- // })
- }
- }
- }
- package com.mldz.igrodil.mvp.views
- import com.mldz.igrodil.api.models.RoomModelItem
- interface RoomFragmentView: ProgressBarView, NoInternetView {
- fun showLevelDialog()
- fun setRooms(rooms: List<RoomModelItem>)
- fun startGame(level: Int, room: HashMap<Int, String>)
- fun showNoRooms()
- fun hideNoRooms()
- fun showSnackBar(message: String)
- fun disableCreateRoomButton()
- }
- package com.mldz.igrodil.mvp.models
- import com.mldz.igrodil.api.models.RoomModelItem
- import com.mldz.igrodil.db.RealtimeDatabase
- import io.reactivex.Observable
- class RoomFragmentModel {
- fun getRooms(): Observable<List<RoomModelItem>> {
- return RealtimeDatabase.getRooms()
- }
- fun createRoom(name: String, level: Int): Observable<HashMap<Int, String>> {
- return RealtimeDatabase.createRoom(name, level)
- }
- fun initPlayer(): Observable<Boolean> {
- return RealtimeDatabase.initPlayer()
- }
- fun loginRoom(roomName: String): Observable<HashMap<Int, String>> {
- return RealtimeDatabase.loginRoom(roomName)
- }
- }
- package com.mldz.igrodil.mvp.presenters
- import com.mldz.igrodil.App
- import com.mldz.igrodil.api.models.FinishGameModel
- import com.mldz.igrodil.api.models.GameDataModel
- import com.mldz.igrodil.mvp.models.ProcessGameFragmentModel
- import com.mldz.igrodil.mvp.views.ProcessGameFragmentView
- import com.mldz.igrodil.ui.activities.GameActivity
- import com.mldz.igrodil.utils.Define
- import com.mldz.igrodil.utils.NetworkUtils
- import io.reactivex.android.schedulers.AndroidSchedulers
- import io.reactivex.disposables.CompositeDisposable
- import io.reactivex.schedulers.Schedulers
- import timber.log.Timber
- import java.util.concurrent.TimeUnit
- import kotlin.random.Random
- class ProcessGameFragmentPresenter(private val view: ProcessGameFragmentView): VideoPresenter() {
- private val model: ProcessGameFragmentModel = ProcessGameFragmentModel()
- private val disposable = CompositeDisposable()
- private lateinit var word: String
- private lateinit var knownWord: CharArray
- private lateinit var nonKnownWord: CharArray
- private var videoId: Int = -1
- private var lettersNumber: ArrayList<Int> = ArrayList()
- private lateinit var roomName: String
- private lateinit var creator: String
- private var isRoom = false
- private var myWin = false
- fun onCreate(type: Int, room: String, level: Int, creator: String) {
- roomName = room
- this.creator = creator
- isRoom = type == GameActivity.GAME_TYPE_MULTI
- prepareGame(isRoom, level)
- }
- private fun getUsers() {
- if (roomName.isNotEmpty()) {
- disposable.add(model.getUsers(roomName)
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe {
- when {
- it.size > 0 -> view.updateUsers(it)
- else -> view.onCloseRoom()
- }
- })
- }
- }
- private fun prepareGame(isRoom: Boolean, level: Int) {
- if (NetworkUtils.isOnline()) {
- view.enableProgressBar(true)
- disposable.add(model.getWord(level)
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe({
- if (it.isSuccessful && it.body() != null) {
- when (isRoom) {
- false -> startGame(it.body()!!)
- true -> {
- view.enableProgressBar(false)
- if (roomName.isNotEmpty()) {
- val isCreator = creator == App.getPreferences().getUsername()
- // val isCreator = model.isCreator()
- view.showWaitPlayers(isCreator)
- getUsers()
- prepareGameObservable(it.body()!!)
- }
- }
- }
- }
- }, {
- Timber.d(it)
- }))
- } else {
- view.showNoInternet()
- }
- }
- private fun prepareGameObservable(video: GameDataModel) {
- disposable.add(model.addGameEventListener(roomName, video)
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe({
- if (it.winner != null && !myWin) {
- view.finish(FinishGameModel(false, it.id, it.word, it.winner, 0, 0, isRoom, roomName))
- }
- else
- startGame(it)
- }, {
- }, {
- }))
- }
- private fun startGame(it: GameDataModel) {
- view.enableProgressBar(false)
- videoId = it.id
- view.setVideo(it.url)
- createWords(it.word)
- if (!model.isEnoughScores()) {
- view.disableAddLetterBtn()
- view.disableAddMinuteBtn()
- }
- }
- fun onRoomGameStart() {
- if (roomName.isNotEmpty()) {
- view.hideWaitPlayers()
- model.setStartGame(roomName)
- }
- }
- private fun createWords(word: String) {
- this.word = word
- knownWord = word.toCharArray()
- nonKnownWord = CharArray(knownWord.size)
- for ((i, l) in knownWord.withIndex()) {
- lettersNumber.add(i)
- nonKnownWord[i] = '_'
- }
- }
- fun addMinute() {
- if (model.isEnoughScores()) {
- if (model.changeScores(Define.ADD_MINUTE_SCORES) == 0) {
- view.disableAddLetterBtn()
- view.disableAddMinuteBtn()
- }
- view.addMinute()
- view.updatePoints(model.getPointsValue().toString())
- } else {
- view.disableAddLetterBtn()
- view.disableAddMinuteBtn()
- }
- }
- fun addLetter() {
- if (model.isEnoughScores() && lettersNumber.size > 0) {
- if (model.changeScores(Define.ADD_LETTER_SCORES) == 0) {
- view.disableAddLetterBtn()
- view.disableAddMinuteBtn()
- }
- var random = 0
- if (lettersNumber.size > 2)
- random = Random.nextInt(0, lettersNumber.size - 1)
- val pos = lettersNumber[random]
- lettersNumber.removeAt(random)
- if (lettersNumber.size == 0) {
- view.disableAddLetterBtn()
- }
- val letter = knownWord[pos]
- nonKnownWord[pos] = letter
- view.showLetter(nonKnownWord.joinToString(""))
- view.updatePoints(model.getPointsValue().toString())
- } else {
- view.disableAddLetterBtn()
- view.disableAddMinuteBtn()
- }
- }
- fun tryWord(word: String, timeLeft : Long) {
- val isWin = word.equals(this.word, true)
- if (isWin) {
- myWin = true
- model.sendVideoGuessed(videoId)
- model.increaseGameWin()
- model.onGameWin(roomName)
- val seconds = TimeUnit.MILLISECONDS.toSeconds(-timeLeft)
- view.finish(FinishGameModel(isWin, videoId, word, App.getPreferences().getUsername(), 1, seconds, isRoom, roomName))
- } else
- view.showNotRightWord()
- }
- fun onTimeLeft() {
- view.showTimeLeft(model.isEnoughScores())
- }
- fun tryAgain() {
- if (model.isEnoughScores()) {
- if (model.changeScores(1) == 0) {
- view.disableAddLetterBtn()
- view.disableAddMinuteBtn()
- }
- view.startAgain()
- view.updatePoints(model.getPointsValue().toString())
- } else {
- view.disableAddLetterBtn()
- view.disableAddMinuteBtn()
- }
- }
- fun finish() {
- view.finish(FinishGameModel(false, videoId, word, null, 1, 0, isRoom, roomName))
- }
- fun videoStart() {
- model.sendVideoWatch(videoId)
- }
- fun onCloseRoom() {
- if (roomName.isNotEmpty())
- model.closeRoom(roomName)
- }
- fun onLeaveRoom() {
- if (roomName.isNotEmpty())
- model.leaveRoom()
- }
- fun destroy() {
- disposable.clear()
- model.clear()
- }
- }
- fun loginInRoom(roomName: String) {
- addSubscription(model.loginRoom(roomName)
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe ({
- view.startGame(1, it)
- }, {
- view.showSnackBar(it.message!!)
- }))
- }
- fun onCreateRoomConfirm(name: String, level: Int) {
- addSubscription(model.createRoom(name, level)
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe ({
- view.startGame(level, it)
- }, {
- it.printStackTrace()
- }))
- }
- package com.mldz.igrodil.ui.fragments
- import android.content.Intent
- import android.os.Bundle
- import android.provider.Settings
- import android.view.LayoutInflater
- import android.view.View
- import android.view.ViewGroup
- import com.afollestad.materialdialogs.MaterialDialog
- import com.afollestad.materialdialogs.input.input
- import com.afollestad.materialdialogs.list.listItemsSingleChoice
- import com.google.android.material.snackbar.Snackbar
- import com.mldz.igrodil.App
- import com.mldz.igrodil.R
- import com.mldz.igrodil.api.models.RoomModelItem
- import com.mldz.igrodil.managers.IgrodilManager
- import com.mldz.igrodil.managers.services.RoomService
- import com.mldz.igrodil.mvp.presenters.RoomFragmentPresenter
- import com.mldz.igrodil.mvp.views.RoomFragmentView
- import com.mldz.igrodil.ui.activities.GameActivity
- import com.mldz.igrodil.ui.adapters.RoomAdapter
- import com.mldz.igrodil.utils.replaceFragment
- import kotlinx.android.synthetic.main.fragment_room.view.*
- class RoomFragment: BaseFragment(), RoomFragmentView, RoomAdapter.OnRoomClickListener {
- private lateinit var presenter: RoomFragmentPresenter
- companion object {
- fun newInstance(): RoomFragment {
- val args = Bundle()
- val fragment = RoomFragment()
- fragment.arguments = args
- return fragment
- }
- }
- override fun onCreateView(
- inflater: LayoutInflater,
- container: ViewGroup?,
- savedInstanceState: Bundle?
- ): View? {
- val view = inflater.inflate(R.layout.fragment_room, container, false)
- presenter = RoomFragmentPresenter(this)
- view.btnCreateRoom.setOnClickListener {
- presenter.onCreateRoomClick()
- }
- return view
- }
- override fun onResume() {
- super.onResume()
- presenter.onCreate()
- }
- override fun showLevelDialog() {
- val levelItems = listOf(getString(R.string.lvl_simple), getString(R.string.lvl_hard))
- var level = LevelGameFragment.LEVEL_ID_SIMPLE
- var name = ""
- // MaterialDialog(context!!).show {
- // title(R.string.choose_level)
- // listItemsSingleChoice(items = levelItems, initialSelection = 0, waitForPositiveButton = false) { s, i, text ->
- // level = i + 1
- // }
- // positiveButton(android.R.string.ok) {
- // presenter.onCreateRoomConfirm(level)
- // }
- // negativeButton(R.string.cancel)
- // }
- MaterialDialog(context!!).show {
- title(R.string.create_room)
- listItemsSingleChoice(items = levelItems, initialSelection = 0, waitForPositiveButton = false) { dialog, index, text ->
- level = index + 1
- }
- input(waitForPositiveButton = false, allowEmpty = false, hintRes = R.string.room_name) { dialog, text ->
- name = text.toString()
- }
- positiveButton(android.R.string.ok) {
- presenter.onCreateRoomConfirm(name, level)
- }
- negativeButton(R.string.cancel)
- }
- }
- override fun setRooms(rooms: List<RoomModelItem>) {
- view?.roomList?.adapter = RoomAdapter(rooms, this)
- }
- override fun startGame(level: Int, room: HashMap<Int, String>) {
- startRoomService(room[1]!!)
- (activity as GameActivity?)?.replaceFragment(ProcessGameFragment.newInstance(level, GameActivity.GAME_TYPE_MULTI, room), R.id.frame, true)
- }
- override fun showNoRooms() {
- view?.emptyRoomList?.visibility = View.VISIBLE
- }
- override fun hideNoRooms() {
- view?.emptyRoomList?.visibility = View.GONE
- }
- override fun showSnackBar(message: String) {
- Snackbar.make(view?.mainLayout!!, message, Snackbar.LENGTH_SHORT).show()
- }
- override fun disableCreateRoomButton() {
- view?.btnCreateRoom?.isEnabled = false
- view?.btnCreateRoom?.setOnClickListener { showSnackBar(context!!.getString(R.string.need_auth_to_create)) }
- }
- override fun enableProgressBar(enabled: Boolean) {
- when(enabled) {
- true -> view?.progressBar?.visibility = View.VISIBLE
- else -> view?.progressBar?.visibility = View.GONE
- }
- }
- override fun showNoInternet() {
- view?.noInternet?.visibility = View.VISIBLE
- }
- override fun onDestroy() {
- super.onDestroy()
- presenter.clearSubscriptions()
- }
- override fun onClick(roomName: String) {
- presenter.loginInRoom(roomName)
- }
- private fun startRoomService(roomName: String) {
- val playerName = if (App.getPreferences().isAuth()) {
- App.getPreferences().getUsername()
- } else {
- Settings.Secure.getString(IgrodilManager.getContext().contentResolver, Settings.Secure.ANDROID_ID)
- }
- val intent = Intent(context!!, RoomService::class.java)
- intent.putExtra("roomName", roomName)
- intent.putExtra("playerName", playerName)
- activity?.startService(intent)
- }
- }
- package com.mldz.igrodil.ui.fragments
- import android.os.Build
- import android.os.Bundle
- import android.os.SystemClock
- import android.view.LayoutInflater
- import android.view.MenuItem
- import android.view.View
- import android.view.ViewGroup
- import android.widget.ArrayAdapter
- import androidx.appcompat.app.AlertDialog
- import androidx.core.text.HtmlCompat
- import androidx.core.widget.doOnTextChanged
- import com.afollestad.materialdialogs.MaterialDialog
- import com.google.android.exoplayer2.ExoPlayer
- import com.google.android.exoplayer2.Player
- import com.mldz.igrodil.App
- import com.mldz.igrodil.R
- import com.mldz.igrodil.api.models.FinishGameModel
- import com.mldz.igrodil.mvp.presenters.ProcessGameFragmentPresenter
- import com.mldz.igrodil.mvp.views.ProcessGameFragmentView
- import com.mldz.igrodil.ui.activities.GameActivity
- import com.mldz.igrodil.ui.dialogs.TimeLeftDialog
- import com.mldz.igrodil.utils.Define
- import com.mldz.igrodil.utils.replaceFragment
- import kotlinx.android.synthetic.main.fragment_process_game.view.*
- class ProcessGameFragment: BaseFragment(), ProcessGameFragmentView, Player.EventListener {
- private val minute = 60000
- private var level: Int = 1
- private var type = GameActivity.GAME_TYPE_SIMPLE
- private lateinit var roomName: String
- private lateinit var creator: String
- private lateinit var fragmentPresenter: ProcessGameFragmentPresenter
- private var timeLeftDialog: AlertDialog? = null
- private var videoStart = false
- private var isGame = false
- private lateinit var videoPath: String
- companion object {
- fun newInstance(level: Int, type: Int = GameActivity.GAME_TYPE_SIMPLE, room: HashMap<Int, String>): ProcessGameFragment{
- val args = Bundle()
- args.putInt(LevelGameFragment.LEVEL_ID_NAME, level)
- args.putInt(GameActivity.GAME_TYPE_NAME, type)
- args.putString("roomName", room[1])
- args.putString("creator", room[0])
- val fragment = ProcessGameFragment()
- fragment.arguments = args
- return fragment
- }
- }
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- val args: Bundle? = arguments
- level = args?.getInt(LevelGameFragment.LEVEL_ID_NAME) ?: LevelGameFragment.LEVEL_ID_SIMPLE
- type = args?.getInt(GameActivity.GAME_TYPE_NAME) ?: GameActivity.GAME_TYPE_SIMPLE
- roomName = args?.getString("roomName") ?: ""
- creator = args?.getString("creator") ?: ""
- }
- override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
- val view = inflater.inflate(R.layout.fragment_process_game, container, false)
- fragmentPresenter = ProcessGameFragmentPresenter(this)
- fragmentPresenter.onCreate(type, roomName, level, creator)
- setHasOptionsMenu(true)
- view.btnSendWord.setOnClickListener {
- fragmentPresenter.tryWord(
- view.word.text.toString().trim(),
- SystemClock.elapsedRealtime() - view!!.chronometer!!.base)
- }
- view.btnAddMinute.setOnClickListener { fragmentPresenter.addMinute() }
- view.btnAddLetter.setOnClickListener { fragmentPresenter.addLetter() }
- view.chronometer.setOnChronometerTickListener {
- val elapsedMillis: Long = SystemClock.elapsedRealtime() - view.chronometer.base
- if (elapsedMillis >= 0) {
- fragmentPresenter.onTimeLeft()
- }
- }
- view.wordLayout.word?.doOnTextChanged { _, _, count, _ ->
- if (count > 0) view.wordLayout.error = null
- }
- view.btnExit.setOnClickListener {
- fragmentPresenter.onLeaveRoom()
- (activity as GameActivity?)?.onBackPressed()
- }
- view.btnStopGame.setOnClickListener {
- fragmentPresenter.onCloseRoom()
- (activity as GameActivity?)?.onBackPressed()
- }
- view.btnStartGame.setOnClickListener {
- isGame = true
- fragmentPresenter.onRoomGameStart()
- }
- view.levelTitle.text = HtmlCompat.fromHtml(getString(R.string.level_desc, Define.levelNames[level]), HtmlCompat.FROM_HTML_MODE_LEGACY)
- return view
- }
- override fun addMinute() {
- val elapsedMillis = SystemClock.elapsedRealtime() - view!!.chronometer!!.base
- view?.chronometer?.base = SystemClock.elapsedRealtime() - elapsedMillis + minute
- }
- override fun showLetter(word: String) {
- view?.shownWord?.text = word
- }
- override fun finish(data: FinishGameModel) {
- data.level = level
- (activity as GameActivity?)?.replaceFragment(FinishGameFragment.newInstance(data), R.id.frame, false)
- }
- override fun setVideo(path: String) {
- videoPath = path
- fragmentPresenter.play(path)
- fragmentPresenter.videoStart()
- view?.btnExit?.visibility = View.GONE
- }
- override fun showTimeLeft(canRepeat: Boolean) {
- view?.chronometer?.stop()
- view?.videoPlayer?.player?.playWhenReady = false
- if (timeLeftDialog == null) {
- timeLeftDialog = TimeLeftDialog(context!!).apply {
- cancelable = false
- if (!canRepeat) {
- makeTryAgainDisable()
- } else {
- tryAgainClickListener {
- timeLeftDialog = null
- fragmentPresenter.tryAgain()
- }
- }
- closeClickListener {
- fragmentPresenter.finish()
- }
- }.create()
- timeLeftDialog!!.show()
- }
- }
- override fun disableAddMinuteBtn() {
- view?.btnAddMinute?.isClickable = false
- view?.btnAddMinute?.setBackgroundColor(resources.getColor(R.color.colorAccent))
- }
- override fun disableAddLetterBtn() {
- view?.btnAddLetter?.isClickable = false
- view?.btnAddLetter?.setBackgroundColor(resources.getColor(R.color.colorAccent))
- }
- override fun showNotRightWord() {
- view?.wordLayout?.error = getString(R.string.try_again)
- }
- override fun updatePoints(points: String) {
- (activity as GameActivity?)?.updatePoints(points)
- }
- override fun startAgain() {
- view?.chronometer?.stop()
- view?.chronometer?.base = SystemClock.elapsedRealtime() + minute
- view?.chronometer?.start()
- view?.videoPlayer?.player?.playWhenReady = true
- }
- override fun showWaitPlayers(isCreator: Boolean) {
- view?.gameLayout?.visibility = View.GONE
- view?.waitPlayersLayout?.visibility = View.VISIBLE
- when(isCreator) {
- true -> view?.btnExit?.visibility = View.GONE
- else -> {
- view?.btnStartGame?.visibility = View.GONE
- view?.btnStopGame?.visibility = View.GONE
- }
- }
- }
- override fun hideWaitPlayers() {
- view?.gameLayout?.visibility = View.VISIBLE
- view?.waitPlayersLayout?.visibility = View.GONE
- }
- override fun updateUsers(users: ArrayList<String>) {
- val adapter = ArrayAdapter(context!!, android.R.layout.simple_list_item_1, users)
- view?.playersList?.adapter = adapter
- view?.playersCount?.text = getString(R.string.players_count, users.size)
- }
- override fun onCloseRoom() {
- if (roomName == App.getPreferences().getUsername())
- (activity as GameActivity?)?.onBackPressed()
- else {
- MaterialDialog(context!!).show {
- title(R.string.room_close)
- message(R.string.room_close_desc)
- positiveButton(android.R.string.ok) {
- (activity as GameActivity?)?.onBackPressed()
- }
- }
- }
- }
- override fun enableProgressBar(enabled: Boolean) {
- when(enabled) {
- true -> {
- view?.progressBar?.visibility = View.VISIBLE
- view?.gameLayout?.visibility = View.GONE
- }
- else -> {
- view?.progressBar?.visibility = View.GONE
- view?.gameLayout?.visibility = View.VISIBLE
- }
- }
- }
- override fun showNoInternet() {
- view?.noInternet?.visibility = View.VISIBLE
- view?.gameLayout?.visibility = View.GONE
- }
- override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
- super.onPlayerStateChanged(playWhenReady, playbackState)
- when (playbackState) {
- ExoPlayer.STATE_IDLE -> view?.videoProgressBar?.visibility = View.VISIBLE
- ExoPlayer.STATE_BUFFERING -> view?.videoProgressBar?.visibility = View.VISIBLE
- ExoPlayer.STATE_READY -> {
- view?.videoProgressBar?.visibility = View.GONE
- if (!videoStart) {
- videoStart = true
- view?.chronometer?.base = SystemClock.elapsedRealtime() + minute
- view?.chronometer?.start()
- view?.progressBarButtons?.visibility = View.GONE
- view?.btnLayout?.visibility = View.VISIBLE
- }
- }
- ExoPlayer.STATE_ENDED -> view?.videoProgressBar?.visibility = View.GONE
- }
- }
- override fun onOptionsItemSelected(item: MenuItem): Boolean {
- when(item.itemId) {
- android.R.id.home -> {
- (activity as GameActivity?)?.onBackPressed()
- }
- }
- return super.onOptionsItemSelected(item)
- }
- override fun onResume() {
- super.onResume()
- (activity as GameActivity?)?.changeToolbarColor(false)
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
- view?.videoPlayer?.player = fragmentPresenter.getPlayer().getPlayerImpl(context!!, this)
- if (this::videoPath.isInitialized)
- fragmentPresenter.play(videoPath)
- }
- }
- override fun onStart() {
- super.onStart()
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
- view?.videoPlayer?.player = fragmentPresenter.getPlayer().getPlayerImpl(context!!, this)
- if (this::videoPath.isInitialized)
- fragmentPresenter.play(videoPath)
- }
- }
- override fun onPause() {
- super.onPause()
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
- fragmentPresenter.releasePlayer()
- }
- }
- override fun onStop() {
- super.onStop()
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
- fragmentPresenter.releasePlayer()
- }
- }
- override fun onDestroy() {
- super.onDestroy()
- fragmentPresenter.destroy()
- (activity as GameActivity?)?.changeToolbarColor(true)
- }
- }
Add Comment
Please, Sign In to add comment