add GuessTheWord solution apps: GuessTheWordViewModel, GuessTheWordTransformation, GuessTheWordLiveData, GuessTheWordDataBinding
45
GuessTheWordDataBinding/README.md
Normal file
@ -0,0 +1,45 @@
|
||||
ViewModel and LiveData with Data Binding - Solution Code
|
||||
==================================
|
||||
|
||||
This is the starter code for the ViewModel and LiveData with Data Binding codelab.
|
||||
|
||||
Introduction
|
||||
------------
|
||||
|
||||
This starter app is a two player game, GuessTheWord. It is a word guessing app you can play with one or more friends. To play, hold the device in landscape, facing away from you with your thumbs on the **Skip** and **Got It** buttons. Your friends can then give you clues to help you guess the word. If you get the word right, press **Got It**. If you're stuck, press **Skip** or you can use the **End** button to end the game.
|
||||
This code demostrates how to use Data Binding with the Android Architecture components, LiveData and ViewModel.
|
||||
|
||||
Pre-requisites
|
||||
--------------
|
||||
|
||||
You need to know:
|
||||
- How to open, build, and run Android apps with Android Studio.
|
||||
- How to use the Navigation Architecture Component
|
||||
- Passing the data between navigation destinations.
|
||||
- Read the logs using the Logcat.
|
||||
|
||||
|
||||
Getting Started
|
||||
---------------
|
||||
|
||||
1. Download and run the app.
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
Copyright 2019 Google, Inc.
|
||||
|
||||
Licensed to the Apache Software Foundation (ASF) under one or more contributor
|
||||
license agreements. See the NOTICE file distributed with this work for
|
||||
additional information regarding copyright ownership. The ASF licenses this
|
||||
file to you under the Apache License, Version 2.0 (the "License"); you may not
|
||||
use this file except in compliance with the License. You may obtain a copy of
|
||||
the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
License for the specific language governing permissions and limitations under
|
||||
the License.
|
||||
1
GuessTheWordDataBinding/app/.gitignore
vendored
Executable file
@ -0,0 +1 @@
|
||||
/build
|
||||
62
GuessTheWordDataBinding/app/build.gradle
Executable file
@ -0,0 +1,62 @@
|
||||
/*
|
||||
* Copyright (C) 2019 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
apply plugin: 'com.android.application'
|
||||
apply plugin: 'kotlin-android'
|
||||
apply plugin: 'kotlin-kapt'
|
||||
apply plugin: 'kotlin-android-extensions'
|
||||
apply plugin: "androidx.navigation.safeargs"
|
||||
|
||||
android {
|
||||
compileSdkVersion 28
|
||||
defaultConfig {
|
||||
applicationId "com.example.android.guesstheword"
|
||||
minSdkVersion 19
|
||||
targetSdkVersion 28
|
||||
versionCode 1
|
||||
versionName "1.0"
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
buildTypes {
|
||||
release {
|
||||
minifyEnabled false
|
||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||
}
|
||||
}
|
||||
|
||||
dataBinding {
|
||||
enabled = true
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation fileTree(dir: 'libs', include: ['*.jar'])
|
||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
|
||||
implementation 'androidx.appcompat:appcompat:1.0.2'
|
||||
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
|
||||
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
|
||||
testImplementation 'junit:junit:4.12'
|
||||
|
||||
// KTX
|
||||
implementation 'androidx.core:core-ktx:1.0.1'
|
||||
|
||||
// Navigation
|
||||
implementation "android.arch.navigation:navigation-fragment-ktx:1.0.0"
|
||||
implementation "android.arch.navigation:navigation-ui-ktx:1.0.0"
|
||||
|
||||
//ViewModel and LiveData
|
||||
implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'
|
||||
}
|
||||
21
GuessTheWordDataBinding/app/proguard-rules.pro
vendored
Executable file
@ -0,0 +1,21 @@
|
||||
# Add project specific ProGuard rules here.
|
||||
# You can control the set of applied configuration files using the
|
||||
# proguardFiles setting in build.gradle.
|
||||
#
|
||||
# For more details, see
|
||||
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||
|
||||
# If your project uses WebView with JS, uncomment the following
|
||||
# and specify the fully qualified class name to the JavaScript interface
|
||||
# class:
|
||||
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||
# public *;
|
||||
#}
|
||||
|
||||
# Uncomment this to preserve the line number information for
|
||||
# debugging stack traces.
|
||||
#-keepattributes SourceFile,LineNumberTable
|
||||
|
||||
# If you keep the line number information, uncomment this to
|
||||
# hide the original source file name.
|
||||
#-renamesourcefileattribute SourceFile
|
||||
@ -0,0 +1,39 @@
|
||||
/*
|
||||
* Copyright (C) 2019 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.android.guesstheword
|
||||
|
||||
import androidx.test.InstrumentationRegistry
|
||||
import androidx.test.runner.AndroidJUnit4
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
|
||||
/**
|
||||
* Instrumented test, which will execute on an Android device.
|
||||
*
|
||||
* See [testing documentation](http://d.android.com/tools/testing).
|
||||
*/
|
||||
@RunWith(AndroidJUnit4::class)
|
||||
class ExampleInstrumentedTest {
|
||||
|
||||
@Test
|
||||
fun useAppContext() {
|
||||
// Context of the app under test.
|
||||
val appContext = InstrumentationRegistry.getTargetContext()
|
||||
assertEquals("com.example.android.guesstheword", appContext.packageName)
|
||||
}
|
||||
}
|
||||
43
GuessTheWordDataBinding/app/src/main/AndroidManifest.xml
Executable file
@ -0,0 +1,43 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!--
|
||||
~ Copyright (C) 2019 Google Inc.
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
package="com.example.android.guesstheword">
|
||||
|
||||
<application
|
||||
android:allowBackup="true"
|
||||
android:icon="@mipmap/ic_guess_it"
|
||||
android:label="@string/app_name"
|
||||
android:roundIcon="@mipmap/ic_guess_it_round"
|
||||
android:supportsRtl="true"
|
||||
android:theme="@style/AppTheme"
|
||||
tools:ignore="GoogleAppIndexingWarning">
|
||||
|
||||
<!-- Screen locked to landscape for easier play -->
|
||||
<!-- configChanges attribute makes the following actions NOT cause a config change -->
|
||||
<!-- screenOrientation attribute sets the default animation-->
|
||||
<activity android:name=".MainActivity">
|
||||
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
BIN
GuessTheWordDataBinding/app/src/main/ic_guess_it-web.png
Executable file
|
After Width: | Height: | Size: 19 KiB |
@ -0,0 +1,32 @@
|
||||
/*
|
||||
* Copyright (C) 2019 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.android.guesstheword
|
||||
|
||||
import android.os.Bundle
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
|
||||
/**
|
||||
* Creates an Activity that hosts all of the fragments in the app
|
||||
*/
|
||||
class MainActivity : AppCompatActivity() {
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
setContentView(R.layout.main_activity)
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,79 @@
|
||||
/*
|
||||
* Copyright (C) 2019 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.android.guesstheword.screens.game
|
||||
|
||||
import android.os.Bundle
|
||||
import android.util.Log
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.Toast
|
||||
import androidx.databinding.DataBindingUtil
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.lifecycle.Observer
|
||||
import androidx.lifecycle.ViewModelProviders
|
||||
import androidx.navigation.fragment.NavHostFragment.findNavController
|
||||
import com.example.android.guesstheword.R
|
||||
import com.example.android.guesstheword.databinding.GameFragmentBinding
|
||||
|
||||
/**
|
||||
* Fragment where the game is played
|
||||
*/
|
||||
class GameFragment : Fragment() {
|
||||
|
||||
private lateinit var binding: GameFragmentBinding
|
||||
|
||||
private lateinit var viewModel: GameViewModel
|
||||
|
||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
|
||||
savedInstanceState: Bundle?): View? {
|
||||
|
||||
// Inflate view and obtain an instance of the binding class
|
||||
binding = DataBindingUtil.inflate(
|
||||
inflater,
|
||||
R.layout.game_fragment,
|
||||
container,
|
||||
false
|
||||
)
|
||||
Log.i("GameFragment", "Called ViewModelProviders.of")
|
||||
|
||||
viewModel = ViewModelProviders.of(this).get(GameViewModel::class.java)
|
||||
|
||||
// Set the viewmodel for databinding - this allows the bound layout access
|
||||
// to all the data in the VieWModel
|
||||
binding.gameViewModel = viewModel
|
||||
|
||||
// Specify the current activity as the lifecycle owner of the binding.
|
||||
// This is used so that the binding can observe LiveData updates
|
||||
binding.lifecycleOwner = this
|
||||
|
||||
// Observer for the Game finished event
|
||||
viewModel.eventGameFinish.observe(this, Observer<Boolean> { hasFinished ->
|
||||
if (hasFinished) gameFinished()
|
||||
})
|
||||
|
||||
return binding.root
|
||||
}
|
||||
|
||||
private fun gameFinished() {
|
||||
Toast.makeText(activity, "Game has just finished", Toast.LENGTH_SHORT).show()
|
||||
val action = GameFragmentDirections.actionGameToScore()
|
||||
action.score = viewModel.score.value?:0
|
||||
findNavController(this).navigate(action)
|
||||
viewModel.onGameFinishComplete()
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,134 @@
|
||||
/*
|
||||
* Copyright (C) 2019 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.android.guesstheword.screens.game
|
||||
|
||||
import android.util.Log
|
||||
import androidx.lifecycle.LiveData
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.lifecycle.ViewModel
|
||||
|
||||
/**
|
||||
* ViewModel containing all the logic needed to run the game
|
||||
*/
|
||||
class GameViewModel : ViewModel() {
|
||||
|
||||
// The current _word
|
||||
private val _word = MutableLiveData<String>()
|
||||
val word: LiveData<String>
|
||||
get() = _word
|
||||
|
||||
// The current score
|
||||
private val _score = MutableLiveData<Int>()
|
||||
val score: LiveData<Int>
|
||||
get() = _score
|
||||
|
||||
// Countdown time
|
||||
private val _eventGameFinish = MutableLiveData<Boolean>()
|
||||
val eventGameFinish: LiveData<Boolean>
|
||||
get() = _eventGameFinish
|
||||
|
||||
|
||||
// The list of words - the front of the list is the next _word to guess
|
||||
private lateinit var wordList: MutableList<String>
|
||||
|
||||
|
||||
/**
|
||||
* Resets the list of words and randomizes the order
|
||||
*/
|
||||
private fun resetList() {
|
||||
wordList = mutableListOf(
|
||||
"queen",
|
||||
"hospital",
|
||||
"basketball",
|
||||
"cat",
|
||||
"change",
|
||||
"snail",
|
||||
"soup",
|
||||
"calendar",
|
||||
"sad",
|
||||
"desk",
|
||||
"guitar",
|
||||
"home",
|
||||
"railway",
|
||||
"zebra",
|
||||
"jelly",
|
||||
"car",
|
||||
"crow",
|
||||
"trade",
|
||||
"bag",
|
||||
"roll",
|
||||
"bubble"
|
||||
)
|
||||
wordList.shuffle()
|
||||
}
|
||||
|
||||
init {
|
||||
_word.value = ""
|
||||
_score.value = 0
|
||||
Log.i("GameViewModel", "GameViewModel created!")
|
||||
resetList()
|
||||
nextWord()
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback called when the ViewModel is destroyed
|
||||
*/
|
||||
override fun onCleared() {
|
||||
super.onCleared()
|
||||
Log.i("GameViewModel", "GameViewModel destroyed!")
|
||||
}
|
||||
|
||||
/** Methods for updating the UI **/
|
||||
fun onSkip() {
|
||||
if (!wordList.isEmpty()) {
|
||||
_score.value = (_score.value)?.minus(1)
|
||||
}
|
||||
nextWord()
|
||||
}
|
||||
fun onCorrect() {
|
||||
if (!wordList.isEmpty()) {
|
||||
_score.value = (_score.value)?.plus(1)
|
||||
}
|
||||
nextWord()
|
||||
}
|
||||
|
||||
/**
|
||||
* Moves to the next _word in the list.
|
||||
*/
|
||||
private fun nextWord() {
|
||||
if (wordList.isEmpty()) {
|
||||
onGameFinish()
|
||||
|
||||
} else {
|
||||
//Select and remove a _word from the list
|
||||
_word.value = wordList.removeAt(0)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** Method for the game completed event **/
|
||||
|
||||
fun onGameFinishComplete() {
|
||||
_eventGameFinish.value = false
|
||||
}
|
||||
|
||||
fun onGameFinish() {
|
||||
_eventGameFinish.value = true
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,72 @@
|
||||
/*
|
||||
* Copyright (C) 2019 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.android.guesstheword.screens.score
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.databinding.DataBindingUtil
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.lifecycle.Observer
|
||||
import androidx.lifecycle.ViewModelProviders
|
||||
import androidx.navigation.fragment.findNavController
|
||||
import com.example.android.guesstheword.R
|
||||
import com.example.android.guesstheword.databinding.ScoreFragmentBinding
|
||||
|
||||
/**
|
||||
* Fragment where the final score is shown, after the game is over
|
||||
*/
|
||||
class ScoreFragment : Fragment() {
|
||||
|
||||
private lateinit var viewModel: ScoreViewModel
|
||||
private lateinit var viewModelFactory: ScoreViewModelFactory
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater,
|
||||
container: ViewGroup?,
|
||||
savedInstanceState: Bundle?
|
||||
): View? {
|
||||
|
||||
// Inflate view and obtain an instance of the binding class.
|
||||
val binding: ScoreFragmentBinding = DataBindingUtil.inflate(
|
||||
inflater,
|
||||
R.layout.score_fragment,
|
||||
container,
|
||||
false
|
||||
)
|
||||
|
||||
viewModelFactory = ScoreViewModelFactory(ScoreFragmentArgs.fromBundle(arguments!!).score)
|
||||
viewModel = ViewModelProviders.of(this, viewModelFactory)
|
||||
.get(ScoreViewModel::class.java)
|
||||
binding.scoreViewModel = viewModel
|
||||
|
||||
// Specify the current activity as the lifecycle owner of the binding.
|
||||
// This is used so that the binding can observe LiveData updates
|
||||
binding.lifecycleOwner = this
|
||||
|
||||
// Navigates back to game when button is pressed
|
||||
viewModel.eventPlayAgain.observe(this, Observer { playAgain ->
|
||||
if (playAgain) {
|
||||
findNavController().navigate(ScoreFragmentDirections.actionRestart())
|
||||
viewModel.onPlayAgainComplete()
|
||||
}
|
||||
})
|
||||
|
||||
return binding.root
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,50 @@
|
||||
/*
|
||||
* Copyright (C) 2019 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.android.guesstheword.screens.score
|
||||
|
||||
import androidx.lifecycle.LiveData
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.lifecycle.ViewModel
|
||||
|
||||
/**
|
||||
* ViewModel for the final screen showing the score
|
||||
*/
|
||||
class ScoreViewModel(finalScore: Int) : ViewModel() {
|
||||
|
||||
private val _score = MutableLiveData<Int>()
|
||||
val score: LiveData<Int>
|
||||
get() = _score
|
||||
|
||||
private val _eventPlayAgain = MutableLiveData<Boolean>()
|
||||
val eventPlayAgain: LiveData<Boolean>
|
||||
get() = _eventPlayAgain
|
||||
|
||||
|
||||
init {
|
||||
_score.value = finalScore
|
||||
}
|
||||
|
||||
fun onPlayAgain() {
|
||||
_eventPlayAgain.value = true
|
||||
}
|
||||
|
||||
fun onPlayAgainComplete() {
|
||||
_eventPlayAgain.value = false
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,31 @@
|
||||
/*
|
||||
* Copyright (C) 2019 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.android.guesstheword.screens.score
|
||||
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
|
||||
class ScoreViewModelFactory (private val finalScore: Int) : ViewModelProvider.Factory {
|
||||
|
||||
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
|
||||
if (modelClass.isAssignableFrom(ScoreViewModel::class.java)) {
|
||||
return ScoreViewModel(finalScore) as T
|
||||
}
|
||||
throw IllegalArgumentException("Unknown ViewModel class")
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Copyright (C) 2019 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.android.guesstheword.screens.title
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.databinding.DataBindingUtil
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.navigation.fragment.findNavController
|
||||
import com.example.android.guesstheword.R
|
||||
import com.example.android.guesstheword.databinding.TitleFragmentBinding
|
||||
|
||||
/**
|
||||
* Fragment for the starting or title screen of the app
|
||||
*/
|
||||
class TitleFragment : Fragment() {
|
||||
|
||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
|
||||
savedInstanceState: Bundle?): View {
|
||||
// Inflate the layout for this fragment
|
||||
val binding: TitleFragmentBinding = DataBindingUtil.inflate(
|
||||
inflater, R.layout.title_fragment, container, false)
|
||||
|
||||
binding.playGameButton.setOnClickListener {
|
||||
findNavController().navigate(TitleFragmentDirections.actionTitleToGame())
|
||||
}
|
||||
return binding.root
|
||||
}
|
||||
}
|
||||
25
GuessTheWordDataBinding/app/src/main/res/anim/slide_in_right.xml
Executable file
@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!--
|
||||
~ Copyright (C) 2019 Google Inc.
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<translate
|
||||
android:duration="700"
|
||||
android:fromXDelta="100%"
|
||||
android:fromYDelta="0%"
|
||||
android:toXDelta="0%"
|
||||
android:toYDelta="0%" />
|
||||
</set>
|
||||
25
GuessTheWordDataBinding/app/src/main/res/anim/slide_out_left.xml
Executable file
@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!--
|
||||
~ Copyright (C) 2019 Google Inc.
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<translate
|
||||
android:duration="700"
|
||||
android:fromXDelta="0%"
|
||||
android:fromYDelta="0%"
|
||||
android:toXDelta="-100%"
|
||||
android:toYDelta="0%" />
|
||||
</set>
|
||||
32
GuessTheWordDataBinding/app/src/main/res/drawable/ic_launcher_background.xml
Executable file
@ -0,0 +1,32 @@
|
||||
<!--
|
||||
~ Copyright (C) 2019 Google Inc.
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="108dp"
|
||||
android:height="108dp"
|
||||
android:viewportWidth="742.029"
|
||||
android:viewportHeight="742.029">
|
||||
<group
|
||||
android:translateX="115.014496"
|
||||
android:translateY="115.014496">
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M0,0h513.3v513.3h-513.3z" />
|
||||
<path
|
||||
android:fillColor="#6AB343"
|
||||
android:pathData="M339.3,122.5c-7.1,-11.2 -16.8,-20.5 -28.3,-27.2l15.1,-27.6c2.5,-4.5 0.8,-10.1 -3.6,-12.5l-0.1,-0.1c-4.5,-2.4 -10,-0.7 -12.5,3.7l-15.6,28.6c-12.6,-4.4 -25.8,-6.6 -39.1,-6.4c-13.8,0 -26.3,2.1 -37.4,6.3l-15.6,-28.5c-2.5,-4.5 -8.1,-6.1 -12.5,-3.7c-4.5,2.5 -6.1,8.1 -3.7,12.5l0,0l15.4,28c-2.7,1.8 -5.4,3.8 -7.9,5.9c-16.3,13.8 -27.2,30.1 -32.9,49.1l51.1,21.3c2.7,-10 8.3,-19 16,-26c7.7,-6.9 17.5,-10.4 29.3,-10.4c11.3,0 20.3,3.2 27.1,9.6c6.6,5.9 10.3,14.4 10.2,23.3c0.1,7.3 -2,14.4 -6,20.4c-4,5.9 -10.4,12.9 -19.3,20.9c-15.4,13.3 -26.1,25.2 -32,35.6S228,268 228,282.2v14.7c19.2,-7.2 38.6,-7.1 58.2,0v-7.1c0,-10.4 1.9,-19 5.6,-25.8c3.7,-6.8 10.6,-15 20.7,-24.4c13,-12.4 22.8,-24.1 29.3,-34.9c6.5,-10.8 9.8,-23.9 9.8,-39.3C351.7,150.2 347.4,135.3 339.3,122.5z" />
|
||||
</group>
|
||||
</vector>
|
||||
54
GuessTheWordDataBinding/app/src/main/res/drawable/ic_launcher_foreground.xml
Executable file
@ -0,0 +1,54 @@
|
||||
<!--
|
||||
~ Copyright (C) 2019 Google Inc.
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="108dp"
|
||||
android:height="108dp"
|
||||
android:viewportWidth="742.029"
|
||||
android:viewportHeight="742.029">
|
||||
<group
|
||||
android:translateX="115.014496"
|
||||
android:translateY="115.014496">
|
||||
<path
|
||||
android:fillColor="#6ab343"
|
||||
android:pathData="M256.22,464c-23.07,0 -42.89,-8.29 -58.91,-24.64s-24.1,-36.25 -24.1,-59.27 8.12,-42.84 24.14,-58.86 35.83,-24.14 58.87,-24.14 42.95,8.11 59.27,24.1 24.63,35.85 24.63,58.9 -8.27,43 -24.59,59.32S279.26,464 256.22,464Z" />
|
||||
<path
|
||||
android:fillColor="#fff"
|
||||
android:pathData="M256.22,303.09q32.23,0 55.07,22.38t22.83,54.62q0,32.25 -22.83,55.07T256.22,458Q224,458 201.6,435.16t-22.39,-55.07q0,-32.23 22.39,-54.62t54.62,-22.38m0,-12c-24.69,0 -45.92,8.71 -63.11,25.9s-25.9,38.41 -25.9,63.1 8.69,46 25.82,63.48S231.47,470 256.22,470s46.07,-8.87 63.55,-26.35 26.35,-38.87 26.35,-63.56 -8.89,-46 -26.43,-63.18 -38.84,-25.82 -63.47,-25.82Z" />
|
||||
<path
|
||||
android:fillColor="#f5f5f5"
|
||||
android:pathData="M256.38,330.37q-20.9,0 -35.39,14.5t-14.5,35.38A49.13,49.13 0,0 0,221 415.93a47.66,47.66 0,0 0,35.39 14.79,50.5 50.5,0 0,0 50.46,-50.47 47.67,47.67 0,0 0,-14.79 -35.38A49.13,49.13 0,0 0,256.38 330.37Z" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M256.64,373.29L256.64,346.43"
|
||||
android:strokeWidth="10"
|
||||
android:strokeColor="#6ab343"
|
||||
android:strokeLineCap="round"
|
||||
android:strokeLineJoin="round" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M262.48,384.63L282.67,396.96"
|
||||
android:strokeWidth="10"
|
||||
android:strokeColor="#6ab343"
|
||||
android:strokeLineCap="round"
|
||||
android:strokeLineJoin="round" />
|
||||
<path
|
||||
android:fillColor="#f5f5f5"
|
||||
android:pathData="M256.62,373.29a7.15,7.15 0,0 0,-7.21 7.21,7.11 7.11,0 0,0 2.1,5.16 6.91,6.91 0,0 0,5.11 2.14,7.31 7.31,0 0,0 7.3,-7.3 6.89,6.89 0,0 0,-2.14 -5.12A7.11,7.11 0,0 0,256.62 373.29Z"
|
||||
android:strokeWidth="7"
|
||||
android:strokeColor="#6ab343" />
|
||||
</group>
|
||||
</vector>
|
||||
150
GuessTheWordDataBinding/app/src/main/res/layout/game_fragment.xml
Executable file
@ -0,0 +1,150 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!--
|
||||
~ Copyright (C) 2019 Google Inc.
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<layout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools">
|
||||
<data>
|
||||
|
||||
<variable
|
||||
name="gameViewModel"
|
||||
type="com.example.android.guesstheword.screens.game.GameViewModel" />
|
||||
|
||||
</data>
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/game_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".screens.game.GameFragment">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/word_is_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:fontFamily="sans-serif"
|
||||
android:text="@string/word_is"
|
||||
android:textColor="@color/black_text_color"
|
||||
android:textSize="14sp"
|
||||
android:textStyle="normal"
|
||||
app:layout_constraintBottom_toTopOf="@+id/word_text"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintHorizontal_bias="0.5"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintVertical_chainStyle="packed" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/word_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:animateLayoutChanges="true"
|
||||
android:fontFamily="sans-serif"
|
||||
android:textAppearance="@style/TextAppearance.AppCompat.Headline"
|
||||
android:textColor="@color/black_text_color"
|
||||
android:textSize="34sp"
|
||||
android:textStyle="normal"
|
||||
android:text="@{@string/quote_format(gameViewModel.word)}"
|
||||
app:layout_constraintBottom_toTopOf="@+id/score_text"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintHorizontal_bias="0.5"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/word_is_text"
|
||||
app:layout_constraintVertical_chainStyle="packed"
|
||||
tools:text=""Tuna"" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/timer_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="8dp"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:fontFamily="sans-serif"
|
||||
android:textColor="@color/grey_text_color"
|
||||
android:textSize="14sp"
|
||||
android:textStyle="normal"
|
||||
app:layout_constraintBottom_toTopOf="@+id/score_text"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
tools:text="0:00" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/score_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="8dp"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:fontFamily="sans-serif"
|
||||
android:textColor="@color/grey_text_color"
|
||||
android:textSize="14sp"
|
||||
android:textStyle="normal"
|
||||
android:text="@{@string/score_format(gameViewModel.score)}"
|
||||
app:layout_constraintBottom_toTopOf="@+id/guideline"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
tools:text="Score: 2" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/skip_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="16dp"
|
||||
android:text="@string/skip"
|
||||
android:theme="@style/SkipButton"
|
||||
android:onClick="@{() -> gameViewModel.onSkip()}"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintHorizontal_chainStyle="spread_inside"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="@+id/guideline" />
|
||||
|
||||
|
||||
<androidx.constraintlayout.widget.Guideline
|
||||
android:id="@+id/guideline"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
app:layout_constraintGuide_end="96dp" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/correct_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="8dp"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:text="@string/got_it"
|
||||
android:theme="@style/GoButton"
|
||||
android:onClick="@{() -> gameViewModel.onCorrect()}"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/end_game_button"
|
||||
app:layout_constraintStart_toEndOf="@+id/skip_button"
|
||||
app:layout_constraintTop_toTopOf="@+id/guideline" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/end_game_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="16dp"
|
||||
android:text="@string/end_game"
|
||||
android:theme="@style/SkipButton"
|
||||
android:onClick="@{() -> gameViewModel.onGameFinish()}"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="@+id/guideline" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</layout>
|
||||
32
GuessTheWordDataBinding/app/src/main/res/layout/main_activity.xml
Executable file
@ -0,0 +1,32 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!--
|
||||
~ Copyright (C) 2019 Google Inc.
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<merge xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".MainActivity">
|
||||
|
||||
<fragment
|
||||
android:id="@+id/nav_host_fragment"
|
||||
android:name="androidx.navigation.fragment.NavHostFragment"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
app:defaultNavHost="true"
|
||||
app:navGraph="@navigation/main_navigation" />
|
||||
</merge>
|
||||
83
GuessTheWordDataBinding/app/src/main/res/layout/score_fragment.xml
Executable file
@ -0,0 +1,83 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!--
|
||||
~ Copyright (C) 2019 Google Inc.
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<layout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools">
|
||||
|
||||
<data>
|
||||
<variable
|
||||
name="scoreViewModel"
|
||||
type="com.example.android.guesstheword.screens.score.ScoreViewModel" />
|
||||
</data>
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/score_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".screens.score.ScoreFragment">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/you_scored_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="32dp"
|
||||
android:fontFamily="sans-serif"
|
||||
android:text="@string/you_scored"
|
||||
android:textColor="@color/black_text_color"
|
||||
android:textSize="14sp"
|
||||
android:textStyle="normal"
|
||||
app:layout_constraintBottom_toTopOf="@+id/score_text"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintHorizontal_bias="0.5"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintVertical_chainStyle="packed" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/score_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dp"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:fontFamily="sans-serif"
|
||||
android:textColor="@color/black_text_color"
|
||||
android:textSize="34sp"
|
||||
android:textStyle="normal"
|
||||
android:text="@{String.valueOf(scoreViewModel.score)}"
|
||||
app:layout_constraintBottom_toTopOf="@+id/play_again_button"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintHorizontal_bias="0.5"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/you_scored_text"
|
||||
app:layout_constraintVertical_chainStyle="packed"
|
||||
tools:text="40" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/play_again_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="32dp"
|
||||
android:text="@string/play_again"
|
||||
android:theme="@style/GoButton"
|
||||
android:visibility="visible"
|
||||
android:onClick="@{() -> scoreViewModel.onPlayAgain()}"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</layout>
|
||||
74
GuessTheWordDataBinding/app/src/main/res/layout/title_fragment.xml
Executable file
@ -0,0 +1,74 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!--
|
||||
~ Copyright (C) 2019 Google Inc.
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<layout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools">
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/title_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".screens.title.TitleFragment">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/get_ready_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="8dp"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:fontFamily="sans-serif"
|
||||
android:text="@string/get_ready"
|
||||
android:textColor="@color/black_text_color"
|
||||
android:textSize="14sp"
|
||||
android:textStyle="normal"
|
||||
app:layout_constraintBottom_toTopOf="@+id/title_text"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintHorizontal_bias="0.5"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintVertical_chainStyle="packed" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/title_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dp"
|
||||
android:fontFamily="sans-serif"
|
||||
android:text="@string/title_text"
|
||||
android:textColor="@color/black_text_color"
|
||||
android:textSize="34sp"
|
||||
android:textStyle="normal"
|
||||
app:layout_constraintBottom_toTopOf="@+id/play_game_button"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintHorizontal_bias="0.5"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/get_ready_text"
|
||||
app:layout_constraintVertical_chainStyle="packed" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/play_game_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="32dp"
|
||||
android:text="@string/play_button"
|
||||
android:theme="@style/GoButton"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</layout>
|
||||
21
GuessTheWordDataBinding/app/src/main/res/mipmap-anydpi-v26/ic_guess_it.xml
Executable file
@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
~ Copyright (C) 2019 Google Inc.
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@drawable/ic_launcher_background" />
|
||||
<foreground android:drawable="@drawable/ic_launcher_foreground" />
|
||||
</adaptive-icon>
|
||||
@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
~ Copyright (C) 2019 Google Inc.
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@drawable/ic_launcher_background" />
|
||||
<foreground android:drawable="@drawable/ic_launcher_foreground" />
|
||||
</adaptive-icon>
|
||||
BIN
GuessTheWordDataBinding/app/src/main/res/mipmap-hdpi/ic_guess_it.png
Executable file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
GuessTheWordDataBinding/app/src/main/res/mipmap-hdpi/ic_guess_it_round.png
Executable file
|
After Width: | Height: | Size: 3.8 KiB |
BIN
GuessTheWordDataBinding/app/src/main/res/mipmap-mdpi/ic_guess_it.png
Executable file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
GuessTheWordDataBinding/app/src/main/res/mipmap-mdpi/ic_guess_it_round.png
Executable file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
GuessTheWordDataBinding/app/src/main/res/mipmap-xhdpi/ic_guess_it.png
Executable file
|
After Width: | Height: | Size: 2.6 KiB |
BIN
GuessTheWordDataBinding/app/src/main/res/mipmap-xhdpi/ic_guess_it_round.png
Executable file
|
After Width: | Height: | Size: 5.4 KiB |
BIN
GuessTheWordDataBinding/app/src/main/res/mipmap-xxhdpi/ic_guess_it.png
Executable file
|
After Width: | Height: | Size: 4.1 KiB |
BIN
GuessTheWordDataBinding/app/src/main/res/mipmap-xxhdpi/ic_guess_it_round.png
Executable file
|
After Width: | Height: | Size: 8.5 KiB |
BIN
GuessTheWordDataBinding/app/src/main/res/mipmap-xxxhdpi/ic_guess_it.png
Executable file
|
After Width: | Height: | Size: 5.8 KiB |
BIN
GuessTheWordDataBinding/app/src/main/res/mipmap-xxxhdpi/ic_guess_it_round.png
Executable file
|
After Width: | Height: | Size: 12 KiB |
69
GuessTheWordDataBinding/app/src/main/res/navigation/main_navigation.xml
Executable file
@ -0,0 +1,69 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!--
|
||||
~ Copyright (C) 2019 Google Inc.
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
app:startDestination="@id/title_destination">
|
||||
|
||||
<fragment
|
||||
android:id="@+id/title_destination"
|
||||
android:name="com.example.android.guesstheword.screens.title.TitleFragment"
|
||||
android:label="title_fragment"
|
||||
tools:layout="@layout/title_fragment">
|
||||
<action
|
||||
android:id="@+id/action_title_to_game"
|
||||
app:destination="@id/game_destination"
|
||||
app:enterAnim="@anim/slide_in_right"
|
||||
app:exitAnim="@anim/slide_out_left"
|
||||
app:launchSingleTop="true"
|
||||
app:popEnterAnim="@anim/slide_in_right"
|
||||
app:popExitAnim="@anim/slide_out_left" />
|
||||
</fragment>
|
||||
<fragment
|
||||
android:id="@+id/game_destination"
|
||||
android:name="com.example.android.guesstheword.screens.game.GameFragment"
|
||||
android:label="game_fragment"
|
||||
tools:layout="@layout/game_fragment">
|
||||
<action
|
||||
android:id="@+id/action_game_to_score"
|
||||
app:destination="@id/score_destination"
|
||||
app:enterAnim="@anim/slide_in_right"
|
||||
app:exitAnim="@anim/slide_out_left"
|
||||
app:launchSingleTop="true"
|
||||
app:popEnterAnim="@anim/slide_in_right"
|
||||
app:popExitAnim="@anim/slide_out_left"
|
||||
app:popUpTo="@+id/title_destination" />
|
||||
</fragment>
|
||||
<fragment
|
||||
android:id="@+id/score_destination"
|
||||
android:name="com.example.android.guesstheword.screens.score.ScoreFragment"
|
||||
android:label="score_fragment"
|
||||
tools:layout="@layout/score_fragment">
|
||||
<action
|
||||
android:id="@+id/action_restart"
|
||||
app:destination="@+id/game_destination"
|
||||
app:enterAnim="@anim/slide_in_right"
|
||||
app:exitAnim="@anim/slide_out_left"
|
||||
app:popEnterAnim="@anim/slide_in_right"
|
||||
app:popExitAnim="@anim/slide_out_left"
|
||||
app:popUpTo="@+id/title_destination" />
|
||||
<argument
|
||||
android:name="score"
|
||||
android:defaultValue="0"
|
||||
app:argType="integer" />
|
||||
</fragment>
|
||||
</navigation>
|
||||
29
GuessTheWordDataBinding/app/src/main/res/values/colors.xml
Executable file
@ -0,0 +1,29 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!--
|
||||
~ Copyright (C) 2019 Google Inc.
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<resources>
|
||||
<color name="colorPrimary">#6ab343</color>
|
||||
<color name="colorPrimaryDark">#388310</color>
|
||||
<color name="colorAccent">#D81B60</color>
|
||||
<color name="ok_green_color">#6ab343</color>
|
||||
<color name="selected_green_color">#388310</color>
|
||||
<color name="skip_red_color">#f44336</color>
|
||||
<color name="selected_red_color">#ba000d</color>
|
||||
<color name="black_text_color">#de000000</color>
|
||||
<color name="grey_text_color">#99000000</color>
|
||||
<color name="grey_button_color">#606060</color>
|
||||
<color name="white_text_color">#ffffff</color>
|
||||
</resources>
|
||||
30
GuessTheWordDataBinding/app/src/main/res/values/strings.xml
Executable file
@ -0,0 +1,30 @@
|
||||
<!--
|
||||
~ Copyright (C) 2019 Google Inc.
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<resources>
|
||||
<string name="app_name">Guess the Word</string>
|
||||
<string name="skip">Skip</string>
|
||||
<string name="play_again">Play Again</string>
|
||||
<string name="you_scored">You Scored</string>
|
||||
<string name="title_text">guess the word!</string>
|
||||
<string name="play_button">Play</string>
|
||||
<string name="get_ready">Get ready to</string>
|
||||
<string name="got_it">Got it</string>
|
||||
<string name="end_game">End game</string>
|
||||
<string name="word_is">The word is…</string>
|
||||
<string name="quote_format">\"%s\"</string>
|
||||
<string name="score_format">Current Score: %d</string>
|
||||
</resources>
|
||||
41
GuessTheWordDataBinding/app/src/main/res/values/styles.xml
Executable file
@ -0,0 +1,41 @@
|
||||
<!--
|
||||
~ Copyright (C) 2019 Google Inc.
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<resources>
|
||||
|
||||
<!-- Base application theme. -->
|
||||
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
|
||||
<!-- Customize your theme here. -->
|
||||
<item name="colorPrimary">@color/colorPrimary</item>
|
||||
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
|
||||
<item name="colorAccent">@color/colorAccent</item>
|
||||
</style>
|
||||
|
||||
<!-- Button Styles -->
|
||||
<style name="GoButton" parent="Widget.AppCompat.Button.Colored">
|
||||
<item name="colorButtonNormal">@color/ok_green_color</item>
|
||||
<item name="colorControlHighlight">@color/selected_green_color</item>
|
||||
<item name="android:textColor">@color/white_text_color</item>
|
||||
<item name="colorAccent">@color/selected_green_color</item>
|
||||
</style>
|
||||
|
||||
<style name="SkipButton" parent="Widget.AppCompat.Button.Colored">
|
||||
<item name="android:buttonStyle">@style/Widget.AppCompat.Button.Borderless.Colored</item>
|
||||
<item name="android:textColor">@color/grey_button_color</item>
|
||||
<item name="colorControlHighlight">@color/skip_red_color</item>
|
||||
</style>
|
||||
|
||||
</resources>
|
||||
@ -0,0 +1,33 @@
|
||||
/*
|
||||
* Copyright (C) 2019 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.android.guesstheword
|
||||
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Test
|
||||
|
||||
/**
|
||||
* Example local unit test, which will execute on the development machine (host).
|
||||
*
|
||||
* See [testing documentation](http://d.android.com/tools/testing).
|
||||
*/
|
||||
class ExampleUnitTest {
|
||||
|
||||
@Test
|
||||
fun addition_isCorrect() {
|
||||
assertEquals(4, 2 + 2)
|
||||
}
|
||||
}
|
||||
44
GuessTheWordDataBinding/build.gradle
Executable file
@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Copyright (C) 2019 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||
|
||||
buildscript {
|
||||
ext.kotlin_version = '1.3.30'
|
||||
repositories {
|
||||
google()
|
||||
jcenter()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:3.4.0'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
classpath "android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0"
|
||||
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
// in the individual module build.gradle files
|
||||
}
|
||||
}
|
||||
|
||||
allprojects {
|
||||
repositories {
|
||||
google()
|
||||
jcenter()
|
||||
}
|
||||
}
|
||||
|
||||
task clean(type: Delete) {
|
||||
delete rootProject.buildDir
|
||||
}
|
||||
23
GuessTheWordDataBinding/gradle.properties
Executable file
@ -0,0 +1,23 @@
|
||||
#
|
||||
# Copyright (C) 2019 Google Inc.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
org.gradle.jvmargs=-Xmx1536m
|
||||
# When configured, Gradle will run in incubating parallel mode.
|
||||
# This option should only be used with decoupled projects. More details, visit
|
||||
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
|
||||
# org.gradle.parallel=true
|
||||
android.databinding.enableV2=true
|
||||
android.useAndroidX=true
|
||||
android.enableJetifier=true
|
||||
BIN
GuessTheWordDataBinding/gradle/wrapper/gradle-wrapper.jar
vendored
Executable file
6
GuessTheWordDataBinding/gradle/wrapper/gradle-wrapper.properties
vendored
Executable file
@ -0,0 +1,6 @@
|
||||
#Thu Apr 25 11:40:45 PDT 2019
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
|
||||
172
GuessTheWordDataBinding/gradlew
vendored
Executable file
@ -0,0 +1,172 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
##############################################################################
|
||||
##
|
||||
## Gradle start up script for UN*X
|
||||
##
|
||||
##############################################################################
|
||||
|
||||
# Attempt to set APP_HOME
|
||||
# Resolve links: $0 may be a link
|
||||
PRG="$0"
|
||||
# Need this for relative symlinks.
|
||||
while [ -h "$PRG" ] ; do
|
||||
ls=`ls -ld "$PRG"`
|
||||
link=`expr "$ls" : '.*-> \(.*\)$'`
|
||||
if expr "$link" : '/.*' > /dev/null; then
|
||||
PRG="$link"
|
||||
else
|
||||
PRG=`dirname "$PRG"`"/$link"
|
||||
fi
|
||||
done
|
||||
SAVED="`pwd`"
|
||||
cd "`dirname \"$PRG\"`/" >/dev/null
|
||||
APP_HOME="`pwd -P`"
|
||||
cd "$SAVED" >/dev/null
|
||||
|
||||
APP_NAME="Gradle"
|
||||
APP_BASE_NAME=`basename "$0"`
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS=""
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD="maximum"
|
||||
|
||||
warn () {
|
||||
echo "$*"
|
||||
}
|
||||
|
||||
die () {
|
||||
echo
|
||||
echo "$*"
|
||||
echo
|
||||
exit 1
|
||||
}
|
||||
|
||||
# OS specific support (must be 'true' or 'false').
|
||||
cygwin=false
|
||||
msys=false
|
||||
darwin=false
|
||||
nonstop=false
|
||||
case "`uname`" in
|
||||
CYGWIN* )
|
||||
cygwin=true
|
||||
;;
|
||||
Darwin* )
|
||||
darwin=true
|
||||
;;
|
||||
MINGW* )
|
||||
msys=true
|
||||
;;
|
||||
NONSTOP* )
|
||||
nonstop=true
|
||||
;;
|
||||
esac
|
||||
|
||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||
|
||||
# Determine the Java command to use to start the JVM.
|
||||
if [ -n "$JAVA_HOME" ] ; then
|
||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||
# IBM's JDK on AIX uses strange locations for the executables
|
||||
JAVACMD="$JAVA_HOME/jre/sh/java"
|
||||
else
|
||||
JAVACMD="$JAVA_HOME/bin/java"
|
||||
fi
|
||||
if [ ! -x "$JAVACMD" ] ; then
|
||||
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
else
|
||||
JAVACMD="java"
|
||||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
|
||||
# Increase the maximum file descriptors if we can.
|
||||
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
|
||||
MAX_FD_LIMIT=`ulimit -H -n`
|
||||
if [ $? -eq 0 ] ; then
|
||||
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
|
||||
MAX_FD="$MAX_FD_LIMIT"
|
||||
fi
|
||||
ulimit -n $MAX_FD
|
||||
if [ $? -ne 0 ] ; then
|
||||
warn "Could not set maximum file descriptor limit: $MAX_FD"
|
||||
fi
|
||||
else
|
||||
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
|
||||
fi
|
||||
fi
|
||||
|
||||
# For Darwin, add options to specify how the application appears in the dock
|
||||
if $darwin; then
|
||||
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
|
||||
fi
|
||||
|
||||
# For Cygwin, switch paths to Windows format before running java
|
||||
if $cygwin ; then
|
||||
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
||||
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
||||
JAVACMD=`cygpath --unix "$JAVACMD"`
|
||||
|
||||
# We build the pattern for arguments to be converted via cygpath
|
||||
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
|
||||
SEP=""
|
||||
for dir in $ROOTDIRSRAW ; do
|
||||
ROOTDIRS="$ROOTDIRS$SEP$dir"
|
||||
SEP="|"
|
||||
done
|
||||
OURCYGPATTERN="(^($ROOTDIRS))"
|
||||
# Add a user-defined pattern to the cygpath arguments
|
||||
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
|
||||
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
|
||||
fi
|
||||
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||
i=0
|
||||
for arg in "$@" ; do
|
||||
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
|
||||
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
|
||||
|
||||
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
|
||||
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
|
||||
else
|
||||
eval `echo args$i`="\"$arg\""
|
||||
fi
|
||||
i=$((i+1))
|
||||
done
|
||||
case $i in
|
||||
(0) set -- ;;
|
||||
(1) set -- "$args0" ;;
|
||||
(2) set -- "$args0" "$args1" ;;
|
||||
(3) set -- "$args0" "$args1" "$args2" ;;
|
||||
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
||||
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
||||
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
||||
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
||||
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
||||
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# Escape application args
|
||||
save () {
|
||||
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
|
||||
echo " "
|
||||
}
|
||||
APP_ARGS=$(save "$@")
|
||||
|
||||
# Collect all arguments for the java command, following the shell quoting and substitution rules
|
||||
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
|
||||
|
||||
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
|
||||
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
|
||||
cd "$(dirname "$0")"
|
||||
fi
|
||||
|
||||
exec "$JAVACMD" "$@"
|
||||
84
GuessTheWordDataBinding/gradlew.bat
vendored
Executable file
@ -0,0 +1,84 @@
|
||||
@if "%DEBUG%" == "" @echo off
|
||||
@rem ##########################################################################
|
||||
@rem
|
||||
@rem Gradle startup script for Windows
|
||||
@rem
|
||||
@rem ##########################################################################
|
||||
|
||||
@rem Set local scope for the variables with windows NT shell
|
||||
if "%OS%"=="Windows_NT" setlocal
|
||||
|
||||
set DIRNAME=%~dp0
|
||||
if "%DIRNAME%" == "" set DIRNAME=.
|
||||
set APP_BASE_NAME=%~n0
|
||||
set APP_HOME=%DIRNAME%
|
||||
|
||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
set DEFAULT_JVM_OPTS=
|
||||
|
||||
@rem Find java.exe
|
||||
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||
|
||||
set JAVA_EXE=java.exe
|
||||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if "%ERRORLEVEL%" == "0" goto init
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:findJavaFromJavaHome
|
||||
set JAVA_HOME=%JAVA_HOME:"=%
|
||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||
|
||||
if exist "%JAVA_EXE%" goto init
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:init
|
||||
@rem Get command-line arguments, handling Windows variants
|
||||
|
||||
if not "%OS%" == "Windows_NT" goto win9xME_args
|
||||
|
||||
:win9xME_args
|
||||
@rem Slurp the command line arguments.
|
||||
set CMD_LINE_ARGS=
|
||||
set _SKIP=2
|
||||
|
||||
:win9xME_args_slurp
|
||||
if "x%~1" == "x" goto execute
|
||||
|
||||
set CMD_LINE_ARGS=%*
|
||||
|
||||
:execute
|
||||
@rem Setup the command line
|
||||
|
||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||
|
||||
@rem Execute Gradle
|
||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
|
||||
|
||||
:end
|
||||
@rem End local scope for the variables with windows NT shell
|
||||
if "%ERRORLEVEL%"=="0" goto mainEnd
|
||||
|
||||
:fail
|
||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||
rem the _cmd.exe /c_ return code!
|
||||
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
||||
exit /b 1
|
||||
|
||||
:mainEnd
|
||||
if "%OS%"=="Windows_NT" endlocal
|
||||
|
||||
:omega
|
||||
17
GuessTheWordDataBinding/settings.gradle
Executable file
@ -0,0 +1,17 @@
|
||||
/*
|
||||
* Copyright (C) 2019 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
include ':app'
|
||||
45
GuessTheWordLiveData/README.md
Normal file
@ -0,0 +1,45 @@
|
||||
LiveData - Solution Code
|
||||
==================================
|
||||
|
||||
This is solution code for Use as starter code for the LiveData codelab.
|
||||
|
||||
Introduction
|
||||
------------
|
||||
|
||||
This starter app is a two player game, GuessTheWord. It is a word guessing app you can play with one or more friends. To play, hold the device in landscape, facing away from you with your thumbs on the **Skip** and **Got It** buttons. Your friends can then give you clues to help you guess the word. If you get the word right, press **Got It**. If you're stuck, press **Skip** or you can use the **End** button to end the game.
|
||||
This code demostrates the Android Architecture components, LiveData and LiveData observer pattern.
|
||||
|
||||
Pre-requisites
|
||||
--------------
|
||||
|
||||
You need to know:
|
||||
- How to open, build, and run Android apps with Android Studio.
|
||||
- How to use the Navigation Architecture Component
|
||||
- Passing the data between navigation destinations.
|
||||
- Read the logs using the Logcat.
|
||||
|
||||
|
||||
Getting Started
|
||||
---------------
|
||||
|
||||
1. Download and run the app.
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
Copyright 2019 Google, Inc.
|
||||
|
||||
Licensed to the Apache Software Foundation (ASF) under one or more contributor
|
||||
license agreements. See the NOTICE file distributed with this work for
|
||||
additional information regarding copyright ownership. The ASF licenses this
|
||||
file to you under the Apache License, Version 2.0 (the "License"); you may not
|
||||
use this file except in compliance with the License. You may obtain a copy of
|
||||
the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
License for the specific language governing permissions and limitations under
|
||||
the License.
|
||||
1
GuessTheWordLiveData/app/.gitignore
vendored
Executable file
@ -0,0 +1 @@
|
||||
/build
|
||||
62
GuessTheWordLiveData/app/build.gradle
Executable file
@ -0,0 +1,62 @@
|
||||
/*
|
||||
* Copyright (C) 2019 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
apply plugin: 'com.android.application'
|
||||
apply plugin: 'kotlin-android'
|
||||
apply plugin: 'kotlin-kapt'
|
||||
apply plugin: 'kotlin-android-extensions'
|
||||
apply plugin: "androidx.navigation.safeargs"
|
||||
|
||||
android {
|
||||
compileSdkVersion 28
|
||||
defaultConfig {
|
||||
applicationId "com.example.android.guesstheword"
|
||||
minSdkVersion 19
|
||||
targetSdkVersion 28
|
||||
versionCode 1
|
||||
versionName "1.0"
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
buildTypes {
|
||||
release {
|
||||
minifyEnabled false
|
||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||
}
|
||||
}
|
||||
|
||||
dataBinding {
|
||||
enabled = true
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation fileTree(dir: 'libs', include: ['*.jar'])
|
||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
|
||||
implementation 'androidx.appcompat:appcompat:1.0.2'
|
||||
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
|
||||
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
|
||||
testImplementation 'junit:junit:4.12'
|
||||
|
||||
// KTX
|
||||
implementation 'androidx.core:core-ktx:1.0.1'
|
||||
|
||||
// Navigation
|
||||
implementation "android.arch.navigation:navigation-fragment-ktx:1.0.0"
|
||||
implementation "android.arch.navigation:navigation-ui-ktx:1.0.0"
|
||||
|
||||
//ViewModel and LiveData
|
||||
implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'
|
||||
}
|
||||
21
GuessTheWordLiveData/app/proguard-rules.pro
vendored
Executable file
@ -0,0 +1,21 @@
|
||||
# Add project specific ProGuard rules here.
|
||||
# You can control the set of applied configuration files using the
|
||||
# proguardFiles setting in build.gradle.
|
||||
#
|
||||
# For more details, see
|
||||
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||
|
||||
# If your project uses WebView with JS, uncomment the following
|
||||
# and specify the fully qualified class name to the JavaScript interface
|
||||
# class:
|
||||
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||
# public *;
|
||||
#}
|
||||
|
||||
# Uncomment this to preserve the line number information for
|
||||
# debugging stack traces.
|
||||
#-keepattributes SourceFile,LineNumberTable
|
||||
|
||||
# If you keep the line number information, uncomment this to
|
||||
# hide the original source file name.
|
||||
#-renamesourcefileattribute SourceFile
|
||||
@ -0,0 +1,39 @@
|
||||
/*
|
||||
* Copyright (C) 2019 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.android.guesstheword
|
||||
|
||||
import androidx.test.InstrumentationRegistry
|
||||
import androidx.test.runner.AndroidJUnit4
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
|
||||
/**
|
||||
* Instrumented test, which will execute on an Android device.
|
||||
*
|
||||
* See [testing documentation](http://d.android.com/tools/testing).
|
||||
*/
|
||||
@RunWith(AndroidJUnit4::class)
|
||||
class ExampleInstrumentedTest {
|
||||
|
||||
@Test
|
||||
fun useAppContext() {
|
||||
// Context of the app under test.
|
||||
val appContext = InstrumentationRegistry.getTargetContext()
|
||||
assertEquals("com.example.android.guesstheword", appContext.packageName)
|
||||
}
|
||||
}
|
||||
43
GuessTheWordLiveData/app/src/main/AndroidManifest.xml
Executable file
@ -0,0 +1,43 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!--
|
||||
~ Copyright (C) 2019 Google Inc.
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
package="com.example.android.guesstheword">
|
||||
|
||||
<application
|
||||
android:allowBackup="true"
|
||||
android:icon="@mipmap/ic_guess_it"
|
||||
android:label="@string/app_name"
|
||||
android:roundIcon="@mipmap/ic_guess_it_round"
|
||||
android:supportsRtl="true"
|
||||
android:theme="@style/AppTheme"
|
||||
tools:ignore="GoogleAppIndexingWarning">
|
||||
|
||||
<!-- Screen locked to landscape for easier play -->
|
||||
<!-- configChanges attribute makes the following actions NOT cause a config change -->
|
||||
<!-- screenOrientation attribute sets the default animation-->
|
||||
<activity android:name=".MainActivity">
|
||||
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
BIN
GuessTheWordLiveData/app/src/main/ic_guess_it-web.png
Executable file
|
After Width: | Height: | Size: 19 KiB |
@ -0,0 +1,32 @@
|
||||
/*
|
||||
* Copyright (C) 2019 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.android.guesstheword
|
||||
|
||||
import android.os.Bundle
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
|
||||
/**
|
||||
* Creates an Activity that hosts all of the fragments in the app
|
||||
*/
|
||||
class MainActivity : AppCompatActivity() {
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
setContentView(R.layout.main_activity)
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,97 @@
|
||||
/*
|
||||
* Copyright (C) 2019 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.android.guesstheword.screens.game
|
||||
|
||||
import android.os.Bundle
|
||||
import android.util.Log
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.Toast
|
||||
import androidx.databinding.DataBindingUtil
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.lifecycle.Observer
|
||||
import androidx.lifecycle.ViewModelProviders
|
||||
import androidx.navigation.fragment.NavHostFragment.findNavController
|
||||
import com.example.android.guesstheword.R
|
||||
import com.example.android.guesstheword.databinding.GameFragmentBinding
|
||||
|
||||
/**
|
||||
* Fragment where the game is played
|
||||
*/
|
||||
class GameFragment : Fragment() {
|
||||
|
||||
private lateinit var binding: GameFragmentBinding
|
||||
|
||||
private lateinit var viewModel: GameViewModel
|
||||
|
||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
|
||||
savedInstanceState: Bundle?): View? {
|
||||
|
||||
// Inflate view and obtain an instance of the binding class
|
||||
binding = DataBindingUtil.inflate(
|
||||
inflater,
|
||||
R.layout.game_fragment,
|
||||
container,
|
||||
false
|
||||
)
|
||||
Log.i("GameFragment", "Called ViewModelProviders.of")
|
||||
|
||||
viewModel = ViewModelProviders.of(this).get(GameViewModel::class.java)
|
||||
|
||||
/** Setting up LiveData observation relationship **/
|
||||
viewModel.word.observe(this, Observer { newWord ->
|
||||
binding.wordText.text = newWord
|
||||
})
|
||||
|
||||
viewModel.score.observe(this, Observer { newScore ->
|
||||
binding.scoreText.text = newScore.toString()
|
||||
|
||||
})
|
||||
|
||||
// Observer for the Game finished event
|
||||
viewModel.eventGameFinish.observe(this, Observer<Boolean> { hasFinished ->
|
||||
if (hasFinished) gameFinished()
|
||||
})
|
||||
|
||||
binding.correctButton.setOnClickListener { onCorrect() }
|
||||
binding.skipButton.setOnClickListener { onSkip() }
|
||||
binding.endGameButton.setOnClickListener { onEndGame() }
|
||||
return binding.root
|
||||
}
|
||||
|
||||
|
||||
/** Methods for buttons presses **/
|
||||
|
||||
private fun onSkip() {
|
||||
viewModel.onSkip()
|
||||
}
|
||||
private fun onCorrect() {
|
||||
viewModel.onCorrect()
|
||||
}
|
||||
private fun onEndGame() {
|
||||
gameFinished()
|
||||
}
|
||||
|
||||
private fun gameFinished() {
|
||||
Toast.makeText(activity, "Game has just finished", Toast.LENGTH_SHORT).show()
|
||||
val action = GameFragmentDirections.actionGameToScore()
|
||||
action.score = viewModel.score.value?:0
|
||||
findNavController(this).navigate(action)
|
||||
viewModel.onGameFinishComplete()
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,134 @@
|
||||
/*
|
||||
* Copyright (C) 2019 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.android.guesstheword.screens.game
|
||||
|
||||
import android.util.Log
|
||||
import androidx.lifecycle.LiveData
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.lifecycle.ViewModel
|
||||
|
||||
|
||||
class GameViewModel : ViewModel() {
|
||||
|
||||
// The current _word
|
||||
private val _word = MutableLiveData<String>()
|
||||
|
||||
// The current score
|
||||
private val _score = MutableLiveData<Int>()
|
||||
val score: LiveData<Int>
|
||||
get() = _score
|
||||
|
||||
val word: LiveData<String>
|
||||
get() = _word
|
||||
|
||||
|
||||
|
||||
private val _eventGameFinish = MutableLiveData<Boolean>()
|
||||
val eventGameFinish: LiveData<Boolean>
|
||||
get() = _eventGameFinish
|
||||
|
||||
|
||||
// The list of words - the front of the list is the next _word to guess
|
||||
private lateinit var wordList: MutableList<String>
|
||||
|
||||
|
||||
/**
|
||||
* Resets the list of words and randomizes the order
|
||||
*/
|
||||
private fun resetList() {
|
||||
wordList = mutableListOf(
|
||||
"queen",
|
||||
"hospital",
|
||||
"basketball",
|
||||
"cat",
|
||||
"change",
|
||||
"snail",
|
||||
"soup",
|
||||
"calendar",
|
||||
"sad",
|
||||
"desk",
|
||||
"guitar",
|
||||
"home",
|
||||
"railway",
|
||||
"zebra",
|
||||
"jelly",
|
||||
"car",
|
||||
"crow",
|
||||
"trade",
|
||||
"bag",
|
||||
"roll",
|
||||
"bubble"
|
||||
)
|
||||
wordList.shuffle()
|
||||
}
|
||||
|
||||
init {
|
||||
_word.value = ""
|
||||
_score.value = 0
|
||||
Log.i("GameViewModel", "GameViewModel created!")
|
||||
resetList()
|
||||
nextWord()
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback called when the ViewModel is destroyed
|
||||
*/
|
||||
override fun onCleared() {
|
||||
super.onCleared()
|
||||
Log.i("GameViewModel", "GameViewModel destroyed!")
|
||||
}
|
||||
|
||||
/** Methods for updating the UI **/
|
||||
fun onSkip() {
|
||||
if (!wordList.isEmpty()) {
|
||||
_score.value = (_score.value)?.minus(1)
|
||||
}
|
||||
nextWord()
|
||||
}
|
||||
fun onCorrect() {
|
||||
if (!wordList.isEmpty()) {
|
||||
_score.value = (_score.value)?.plus(1)
|
||||
}
|
||||
nextWord()
|
||||
}
|
||||
|
||||
/**
|
||||
* Moves to the next _word in the list.
|
||||
*/
|
||||
private fun nextWord() {
|
||||
if (wordList.isEmpty()) {
|
||||
onGameFinish()
|
||||
|
||||
} else {
|
||||
//Select and remove a _word from the list
|
||||
_word.value = wordList.removeAt(0)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** Method for the game completed event **/
|
||||
|
||||
fun onGameFinish() {
|
||||
_eventGameFinish.value = true
|
||||
}
|
||||
|
||||
fun onGameFinishComplete() {
|
||||
_eventGameFinish.value = false
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,75 @@
|
||||
/*
|
||||
* Copyright (C) 2019 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.android.guesstheword.screens.score
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.databinding.DataBindingUtil
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.lifecycle.Observer
|
||||
import androidx.lifecycle.ViewModelProviders
|
||||
import androidx.navigation.fragment.findNavController
|
||||
import com.example.android.guesstheword.R
|
||||
import com.example.android.guesstheword.databinding.ScoreFragmentBinding
|
||||
|
||||
/**
|
||||
* Fragment where the final score is shown, after the game is over
|
||||
*/
|
||||
class ScoreFragment : Fragment() {
|
||||
|
||||
private lateinit var viewModel: ScoreViewModel
|
||||
private lateinit var viewModelFactory: ScoreViewModelFactory
|
||||
|
||||
override fun onCreateView(
|
||||
inflater: LayoutInflater,
|
||||
container: ViewGroup?,
|
||||
savedInstanceState: Bundle?
|
||||
): View? {
|
||||
|
||||
// Inflate view and obtain an instance of the binding class.
|
||||
val binding: ScoreFragmentBinding = DataBindingUtil.inflate(
|
||||
inflater,
|
||||
R.layout.score_fragment,
|
||||
container,
|
||||
false
|
||||
)
|
||||
|
||||
|
||||
viewModelFactory = ScoreViewModelFactory(ScoreFragmentArgs.fromBundle(arguments!!).score)
|
||||
viewModel = ViewModelProviders.of(this, viewModelFactory)
|
||||
.get(ScoreViewModel::class.java)
|
||||
|
||||
// Add observer for score
|
||||
viewModel.score.observe(this, Observer { newScore ->
|
||||
binding.scoreText.text = newScore.toString()
|
||||
})
|
||||
|
||||
binding.playAgainButton.setOnClickListener { viewModel.onPlayAgain() }
|
||||
|
||||
// Navigates back to game when button is pressed
|
||||
viewModel.eventPlayAgain.observe(this, Observer { playAgain ->
|
||||
if (playAgain) {
|
||||
findNavController().navigate(ScoreFragmentDirections.actionRestart())
|
||||
viewModel.onPlayAgainComplete()
|
||||
}
|
||||
})
|
||||
|
||||
return binding.root
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,49 @@
|
||||
/*
|
||||
* Copyright (C) 2019 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.android.guesstheword.screens.score
|
||||
|
||||
import android.util.Log
|
||||
import androidx.lifecycle.LiveData
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.lifecycle.ViewModel
|
||||
|
||||
|
||||
class ScoreViewModel(finalScore: Int) : ViewModel() {
|
||||
|
||||
private val _score = MutableLiveData<Int>()
|
||||
val score: LiveData<Int>
|
||||
get() = _score
|
||||
|
||||
private val _eventPlayAgain = MutableLiveData<Boolean>()
|
||||
val eventPlayAgain: LiveData<Boolean>
|
||||
get() = _eventPlayAgain
|
||||
|
||||
|
||||
init {
|
||||
_score.value = finalScore
|
||||
}
|
||||
|
||||
fun onPlayAgain() {
|
||||
_eventPlayAgain.value = true
|
||||
}
|
||||
|
||||
fun onPlayAgainComplete() {
|
||||
_eventPlayAgain.value = false
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,31 @@
|
||||
/*
|
||||
* Copyright (C) 2019 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.android.guesstheword.screens.score
|
||||
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
|
||||
class ScoreViewModelFactory (private val finalScore: Int) : ViewModelProvider.Factory {
|
||||
|
||||
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
|
||||
if (modelClass.isAssignableFrom(ScoreViewModel::class.java)) {
|
||||
return ScoreViewModel(finalScore) as T
|
||||
}
|
||||
throw IllegalArgumentException("Unknown ViewModel class")
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Copyright (C) 2019 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.android.guesstheword.screens.title
|
||||
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.databinding.DataBindingUtil
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.navigation.fragment.findNavController
|
||||
import com.example.android.guesstheword.R
|
||||
import com.example.android.guesstheword.databinding.TitleFragmentBinding
|
||||
|
||||
/**
|
||||
* Fragment for the starting or title screen of the app
|
||||
*/
|
||||
class TitleFragment : Fragment() {
|
||||
|
||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
|
||||
savedInstanceState: Bundle?): View {
|
||||
// Inflate the layout for this fragment
|
||||
val binding: TitleFragmentBinding = DataBindingUtil.inflate(
|
||||
inflater, R.layout.title_fragment, container, false)
|
||||
|
||||
binding.playGameButton.setOnClickListener {
|
||||
findNavController().navigate(TitleFragmentDirections.actionTitleToGame())
|
||||
}
|
||||
return binding.root
|
||||
}
|
||||
}
|
||||
25
GuessTheWordLiveData/app/src/main/res/anim/slide_in_right.xml
Executable file
@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!--
|
||||
~ Copyright (C) 2019 Google Inc.
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<translate
|
||||
android:duration="700"
|
||||
android:fromXDelta="100%"
|
||||
android:fromYDelta="0%"
|
||||
android:toXDelta="0%"
|
||||
android:toYDelta="0%" />
|
||||
</set>
|
||||
25
GuessTheWordLiveData/app/src/main/res/anim/slide_out_left.xml
Executable file
@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!--
|
||||
~ Copyright (C) 2019 Google Inc.
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<translate
|
||||
android:duration="700"
|
||||
android:fromXDelta="0%"
|
||||
android:fromYDelta="0%"
|
||||
android:toXDelta="-100%"
|
||||
android:toYDelta="0%" />
|
||||
</set>
|
||||
32
GuessTheWordLiveData/app/src/main/res/drawable/ic_launcher_background.xml
Executable file
@ -0,0 +1,32 @@
|
||||
<!--
|
||||
~ Copyright (C) 2019 Google Inc.
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="108dp"
|
||||
android:height="108dp"
|
||||
android:viewportWidth="742.029"
|
||||
android:viewportHeight="742.029">
|
||||
<group
|
||||
android:translateX="115.014496"
|
||||
android:translateY="115.014496">
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M0,0h513.3v513.3h-513.3z" />
|
||||
<path
|
||||
android:fillColor="#6AB343"
|
||||
android:pathData="M339.3,122.5c-7.1,-11.2 -16.8,-20.5 -28.3,-27.2l15.1,-27.6c2.5,-4.5 0.8,-10.1 -3.6,-12.5l-0.1,-0.1c-4.5,-2.4 -10,-0.7 -12.5,3.7l-15.6,28.6c-12.6,-4.4 -25.8,-6.6 -39.1,-6.4c-13.8,0 -26.3,2.1 -37.4,6.3l-15.6,-28.5c-2.5,-4.5 -8.1,-6.1 -12.5,-3.7c-4.5,2.5 -6.1,8.1 -3.7,12.5l0,0l15.4,28c-2.7,1.8 -5.4,3.8 -7.9,5.9c-16.3,13.8 -27.2,30.1 -32.9,49.1l51.1,21.3c2.7,-10 8.3,-19 16,-26c7.7,-6.9 17.5,-10.4 29.3,-10.4c11.3,0 20.3,3.2 27.1,9.6c6.6,5.9 10.3,14.4 10.2,23.3c0.1,7.3 -2,14.4 -6,20.4c-4,5.9 -10.4,12.9 -19.3,20.9c-15.4,13.3 -26.1,25.2 -32,35.6S228,268 228,282.2v14.7c19.2,-7.2 38.6,-7.1 58.2,0v-7.1c0,-10.4 1.9,-19 5.6,-25.8c3.7,-6.8 10.6,-15 20.7,-24.4c13,-12.4 22.8,-24.1 29.3,-34.9c6.5,-10.8 9.8,-23.9 9.8,-39.3C351.7,150.2 347.4,135.3 339.3,122.5z" />
|
||||
</group>
|
||||
</vector>
|
||||
54
GuessTheWordLiveData/app/src/main/res/drawable/ic_launcher_foreground.xml
Executable file
@ -0,0 +1,54 @@
|
||||
<!--
|
||||
~ Copyright (C) 2019 Google Inc.
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="108dp"
|
||||
android:height="108dp"
|
||||
android:viewportWidth="742.029"
|
||||
android:viewportHeight="742.029">
|
||||
<group
|
||||
android:translateX="115.014496"
|
||||
android:translateY="115.014496">
|
||||
<path
|
||||
android:fillColor="#6ab343"
|
||||
android:pathData="M256.22,464c-23.07,0 -42.89,-8.29 -58.91,-24.64s-24.1,-36.25 -24.1,-59.27 8.12,-42.84 24.14,-58.86 35.83,-24.14 58.87,-24.14 42.95,8.11 59.27,24.1 24.63,35.85 24.63,58.9 -8.27,43 -24.59,59.32S279.26,464 256.22,464Z" />
|
||||
<path
|
||||
android:fillColor="#fff"
|
||||
android:pathData="M256.22,303.09q32.23,0 55.07,22.38t22.83,54.62q0,32.25 -22.83,55.07T256.22,458Q224,458 201.6,435.16t-22.39,-55.07q0,-32.23 22.39,-54.62t54.62,-22.38m0,-12c-24.69,0 -45.92,8.71 -63.11,25.9s-25.9,38.41 -25.9,63.1 8.69,46 25.82,63.48S231.47,470 256.22,470s46.07,-8.87 63.55,-26.35 26.35,-38.87 26.35,-63.56 -8.89,-46 -26.43,-63.18 -38.84,-25.82 -63.47,-25.82Z" />
|
||||
<path
|
||||
android:fillColor="#f5f5f5"
|
||||
android:pathData="M256.38,330.37q-20.9,0 -35.39,14.5t-14.5,35.38A49.13,49.13 0,0 0,221 415.93a47.66,47.66 0,0 0,35.39 14.79,50.5 50.5,0 0,0 50.46,-50.47 47.67,47.67 0,0 0,-14.79 -35.38A49.13,49.13 0,0 0,256.38 330.37Z" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M256.64,373.29L256.64,346.43"
|
||||
android:strokeWidth="10"
|
||||
android:strokeColor="#6ab343"
|
||||
android:strokeLineCap="round"
|
||||
android:strokeLineJoin="round" />
|
||||
<path
|
||||
android:fillColor="#00000000"
|
||||
android:pathData="M262.48,384.63L282.67,396.96"
|
||||
android:strokeWidth="10"
|
||||
android:strokeColor="#6ab343"
|
||||
android:strokeLineCap="round"
|
||||
android:strokeLineJoin="round" />
|
||||
<path
|
||||
android:fillColor="#f5f5f5"
|
||||
android:pathData="M256.62,373.29a7.15,7.15 0,0 0,-7.21 7.21,7.11 7.11,0 0,0 2.1,5.16 6.91,6.91 0,0 0,5.11 2.14,7.31 7.31,0 0,0 7.3,-7.3 6.89,6.89 0,0 0,-2.14 -5.12A7.11,7.11 0,0 0,256.62 373.29Z"
|
||||
android:strokeWidth="7"
|
||||
android:strokeColor="#6ab343" />
|
||||
</group>
|
||||
</vector>
|
||||
137
GuessTheWordLiveData/app/src/main/res/layout/game_fragment.xml
Executable file
@ -0,0 +1,137 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!--
|
||||
~ Copyright (C) 2019 Google Inc.
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<layout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools">
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/game_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".screens.game.GameFragment">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/word_is_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:fontFamily="sans-serif"
|
||||
android:text="@string/word_is"
|
||||
android:textColor="@color/black_text_color"
|
||||
android:textSize="14sp"
|
||||
android:textStyle="normal"
|
||||
app:layout_constraintBottom_toTopOf="@+id/word_text"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintHorizontal_bias="0.5"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintVertical_chainStyle="packed" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/word_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:animateLayoutChanges="true"
|
||||
android:fontFamily="sans-serif"
|
||||
android:textAppearance="@style/TextAppearance.AppCompat.Headline"
|
||||
android:textColor="@color/black_text_color"
|
||||
android:textSize="34sp"
|
||||
android:textStyle="normal"
|
||||
app:layout_constraintBottom_toTopOf="@+id/score_text"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintHorizontal_bias="0.5"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/word_is_text"
|
||||
app:layout_constraintVertical_chainStyle="packed"
|
||||
tools:text=""Tuna"" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/timer_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="8dp"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:fontFamily="sans-serif"
|
||||
android:textColor="@color/grey_text_color"
|
||||
android:textSize="14sp"
|
||||
android:textStyle="normal"
|
||||
app:layout_constraintBottom_toTopOf="@+id/score_text"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
tools:text="0:00" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/score_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="8dp"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:fontFamily="sans-serif"
|
||||
android:textColor="@color/grey_text_color"
|
||||
android:textSize="14sp"
|
||||
android:textStyle="normal"
|
||||
app:layout_constraintBottom_toTopOf="@+id/guideline"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
tools:text="Score: 2" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/skip_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="16dp"
|
||||
android:text="@string/skip"
|
||||
android:theme="@style/SkipButton"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintHorizontal_chainStyle="spread_inside"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="@+id/guideline" />
|
||||
|
||||
<androidx.constraintlayout.widget.Guideline
|
||||
android:id="@+id/guideline"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="horizontal"
|
||||
app:layout_constraintGuide_end="96dp" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/correct_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="8dp"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:text="@string/got_it"
|
||||
android:theme="@style/GoButton"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/end_game_button"
|
||||
app:layout_constraintStart_toEndOf="@+id/skip_button"
|
||||
app:layout_constraintTop_toTopOf="@+id/guideline" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/end_game_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginEnd="16dp"
|
||||
android:text="@string/end_game"
|
||||
android:theme="@style/SkipButton"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="@+id/guideline" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</layout>
|
||||
32
GuessTheWordLiveData/app/src/main/res/layout/main_activity.xml
Executable file
@ -0,0 +1,32 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!--
|
||||
~ Copyright (C) 2019 Google Inc.
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<merge xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".MainActivity">
|
||||
|
||||
<fragment
|
||||
android:id="@+id/nav_host_fragment"
|
||||
android:name="androidx.navigation.fragment.NavHostFragment"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
app:defaultNavHost="true"
|
||||
app:navGraph="@navigation/main_navigation" />
|
||||
</merge>
|
||||
75
GuessTheWordLiveData/app/src/main/res/layout/score_fragment.xml
Executable file
@ -0,0 +1,75 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!--
|
||||
~ Copyright (C) 2019 Google Inc.
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<layout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools">
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/score_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".screens.score.ScoreFragment">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/you_scored_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="32dp"
|
||||
android:fontFamily="sans-serif"
|
||||
android:text="@string/you_scored"
|
||||
android:textColor="@color/black_text_color"
|
||||
android:textSize="14sp"
|
||||
android:textStyle="normal"
|
||||
app:layout_constraintBottom_toTopOf="@+id/score_text"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintHorizontal_bias="0.5"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintVertical_chainStyle="packed" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/score_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dp"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:fontFamily="sans-serif"
|
||||
android:textColor="@color/black_text_color"
|
||||
android:textSize="34sp"
|
||||
android:textStyle="normal"
|
||||
app:layout_constraintBottom_toTopOf="@+id/play_again_button"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintHorizontal_bias="0.5"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/you_scored_text"
|
||||
app:layout_constraintVertical_chainStyle="packed"
|
||||
tools:text="40" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/play_again_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="32dp"
|
||||
android:text="@string/play_again"
|
||||
android:theme="@style/GoButton"
|
||||
android:visibility="visible"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</layout>
|
||||
74
GuessTheWordLiveData/app/src/main/res/layout/title_fragment.xml
Executable file
@ -0,0 +1,74 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!--
|
||||
~ Copyright (C) 2019 Google Inc.
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<layout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools">
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/title_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context=".screens.title.TitleFragment">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/get_ready_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="8dp"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:fontFamily="sans-serif"
|
||||
android:text="@string/get_ready"
|
||||
android:textColor="@color/black_text_color"
|
||||
android:textSize="14sp"
|
||||
android:textStyle="normal"
|
||||
app:layout_constraintBottom_toTopOf="@+id/title_text"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintHorizontal_bias="0.5"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintVertical_chainStyle="packed" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/title_text"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dp"
|
||||
android:fontFamily="sans-serif"
|
||||
android:text="@string/title_text"
|
||||
android:textColor="@color/black_text_color"
|
||||
android:textSize="34sp"
|
||||
android:textStyle="normal"
|
||||
app:layout_constraintBottom_toTopOf="@+id/play_game_button"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintHorizontal_bias="0.5"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@+id/get_ready_text"
|
||||
app:layout_constraintVertical_chainStyle="packed" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/play_game_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginBottom="32dp"
|
||||
android:text="@string/play_button"
|
||||
android:theme="@style/GoButton"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent" />
|
||||
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</layout>
|
||||
21
GuessTheWordLiveData/app/src/main/res/mipmap-anydpi-v26/ic_guess_it.xml
Executable file
@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
~ Copyright (C) 2019 Google Inc.
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@drawable/ic_launcher_background" />
|
||||
<foreground android:drawable="@drawable/ic_launcher_foreground" />
|
||||
</adaptive-icon>
|
||||
@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
~ Copyright (C) 2019 Google Inc.
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@drawable/ic_launcher_background" />
|
||||
<foreground android:drawable="@drawable/ic_launcher_foreground" />
|
||||
</adaptive-icon>
|
||||
BIN
GuessTheWordLiveData/app/src/main/res/mipmap-hdpi/ic_guess_it.png
Executable file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
GuessTheWordLiveData/app/src/main/res/mipmap-hdpi/ic_guess_it_round.png
Executable file
|
After Width: | Height: | Size: 3.8 KiB |
BIN
GuessTheWordLiveData/app/src/main/res/mipmap-mdpi/ic_guess_it.png
Executable file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
GuessTheWordLiveData/app/src/main/res/mipmap-mdpi/ic_guess_it_round.png
Executable file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
GuessTheWordLiveData/app/src/main/res/mipmap-xhdpi/ic_guess_it.png
Executable file
|
After Width: | Height: | Size: 2.6 KiB |
BIN
GuessTheWordLiveData/app/src/main/res/mipmap-xhdpi/ic_guess_it_round.png
Executable file
|
After Width: | Height: | Size: 5.4 KiB |
BIN
GuessTheWordLiveData/app/src/main/res/mipmap-xxhdpi/ic_guess_it.png
Executable file
|
After Width: | Height: | Size: 4.1 KiB |
BIN
GuessTheWordLiveData/app/src/main/res/mipmap-xxhdpi/ic_guess_it_round.png
Executable file
|
After Width: | Height: | Size: 8.5 KiB |
BIN
GuessTheWordLiveData/app/src/main/res/mipmap-xxxhdpi/ic_guess_it.png
Executable file
|
After Width: | Height: | Size: 5.8 KiB |
BIN
GuessTheWordLiveData/app/src/main/res/mipmap-xxxhdpi/ic_guess_it_round.png
Executable file
|
After Width: | Height: | Size: 12 KiB |
69
GuessTheWordLiveData/app/src/main/res/navigation/main_navigation.xml
Executable file
@ -0,0 +1,69 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!--
|
||||
~ Copyright (C) 2019 Google Inc.
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
app:startDestination="@id/title_destination">
|
||||
|
||||
<fragment
|
||||
android:id="@+id/title_destination"
|
||||
android:name="com.example.android.guesstheword.screens.title.TitleFragment"
|
||||
android:label="title_fragment"
|
||||
tools:layout="@layout/title_fragment">
|
||||
<action
|
||||
android:id="@+id/action_title_to_game"
|
||||
app:destination="@id/game_destination"
|
||||
app:enterAnim="@anim/slide_in_right"
|
||||
app:exitAnim="@anim/slide_out_left"
|
||||
app:launchSingleTop="true"
|
||||
app:popEnterAnim="@anim/slide_in_right"
|
||||
app:popExitAnim="@anim/slide_out_left" />
|
||||
</fragment>
|
||||
<fragment
|
||||
android:id="@+id/game_destination"
|
||||
android:name="com.example.android.guesstheword.screens.game.GameFragment"
|
||||
android:label="game_fragment"
|
||||
tools:layout="@layout/game_fragment">
|
||||
<action
|
||||
android:id="@+id/action_game_to_score"
|
||||
app:destination="@id/score_destination"
|
||||
app:enterAnim="@anim/slide_in_right"
|
||||
app:exitAnim="@anim/slide_out_left"
|
||||
app:launchSingleTop="true"
|
||||
app:popEnterAnim="@anim/slide_in_right"
|
||||
app:popExitAnim="@anim/slide_out_left"
|
||||
app:popUpTo="@+id/title_destination" />
|
||||
</fragment>
|
||||
<fragment
|
||||
android:id="@+id/score_destination"
|
||||
android:name="com.example.android.guesstheword.screens.score.ScoreFragment"
|
||||
android:label="score_fragment"
|
||||
tools:layout="@layout/score_fragment">
|
||||
<action
|
||||
android:id="@+id/action_restart"
|
||||
app:destination="@+id/game_destination"
|
||||
app:enterAnim="@anim/slide_in_right"
|
||||
app:exitAnim="@anim/slide_out_left"
|
||||
app:popEnterAnim="@anim/slide_in_right"
|
||||
app:popExitAnim="@anim/slide_out_left"
|
||||
app:popUpTo="@+id/title_destination" />
|
||||
<argument
|
||||
android:name="score"
|
||||
android:defaultValue="0"
|
||||
app:argType="integer" />
|
||||
</fragment>
|
||||
</navigation>
|
||||
29
GuessTheWordLiveData/app/src/main/res/values/colors.xml
Executable file
@ -0,0 +1,29 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!--
|
||||
~ Copyright (C) 2019 Google Inc.
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<resources>
|
||||
<color name="colorPrimary">#6ab343</color>
|
||||
<color name="colorPrimaryDark">#388310</color>
|
||||
<color name="colorAccent">#D81B60</color>
|
||||
<color name="ok_green_color">#6ab343</color>
|
||||
<color name="selected_green_color">#388310</color>
|
||||
<color name="skip_red_color">#f44336</color>
|
||||
<color name="selected_red_color">#ba000d</color>
|
||||
<color name="black_text_color">#de000000</color>
|
||||
<color name="grey_text_color">#99000000</color>
|
||||
<color name="grey_button_color">#606060</color>
|
||||
<color name="white_text_color">#ffffff</color>
|
||||
</resources>
|
||||
28
GuessTheWordLiveData/app/src/main/res/values/strings.xml
Executable file
@ -0,0 +1,28 @@
|
||||
<!--
|
||||
~ Copyright (C) 2019 Google Inc.
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<resources>
|
||||
<string name="app_name">Guess the Word</string>
|
||||
<string name="skip">Skip</string>
|
||||
<string name="play_again">Play Again</string>
|
||||
<string name="you_scored">You Scored</string>
|
||||
<string name="title_text">guess the word!</string>
|
||||
<string name="play_button">Play</string>
|
||||
<string name="get_ready">Get ready to</string>
|
||||
<string name="got_it">Got it</string>
|
||||
<string name="end_game">End game</string>
|
||||
<string name="word_is">The word is…</string>
|
||||
</resources>
|
||||
41
GuessTheWordLiveData/app/src/main/res/values/styles.xml
Executable file
@ -0,0 +1,41 @@
|
||||
<!--
|
||||
~ Copyright (C) 2019 Google Inc.
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<resources>
|
||||
|
||||
<!-- Base application theme. -->
|
||||
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
|
||||
<!-- Customize your theme here. -->
|
||||
<item name="colorPrimary">@color/colorPrimary</item>
|
||||
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
|
||||
<item name="colorAccent">@color/colorAccent</item>
|
||||
</style>
|
||||
|
||||
<!-- Button Styles -->
|
||||
<style name="GoButton" parent="Widget.AppCompat.Button.Colored">
|
||||
<item name="colorButtonNormal">@color/ok_green_color</item>
|
||||
<item name="colorControlHighlight">@color/selected_green_color</item>
|
||||
<item name="android:textColor">@color/white_text_color</item>
|
||||
<item name="colorAccent">@color/selected_green_color</item>
|
||||
</style>
|
||||
|
||||
<style name="SkipButton" parent="Widget.AppCompat.Button.Colored">
|
||||
<item name="android:buttonStyle">@style/Widget.AppCompat.Button.Borderless.Colored</item>
|
||||
<item name="android:textColor">@color/grey_button_color</item>
|
||||
<item name="colorControlHighlight">@color/skip_red_color</item>
|
||||
</style>
|
||||
|
||||
</resources>
|
||||
@ -0,0 +1,33 @@
|
||||
/*
|
||||
* Copyright (C) 2019 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.android.guesstheword
|
||||
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Test
|
||||
|
||||
/**
|
||||
* Example local unit test, which will execute on the development machine (host).
|
||||
*
|
||||
* See [testing documentation](http://d.android.com/tools/testing).
|
||||
*/
|
||||
class ExampleUnitTest {
|
||||
|
||||
@Test
|
||||
fun addition_isCorrect() {
|
||||
assertEquals(4, 2 + 2)
|
||||
}
|
||||
}
|
||||
44
GuessTheWordLiveData/build.gradle
Executable file
@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Copyright (C) 2019 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||
|
||||
buildscript {
|
||||
ext.kotlin_version = '1.3.30'
|
||||
repositories {
|
||||
google()
|
||||
jcenter()
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:3.4.0'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
classpath "android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0"
|
||||
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
// in the individual module build.gradle files
|
||||
}
|
||||
}
|
||||
|
||||
allprojects {
|
||||
repositories {
|
||||
google()
|
||||
jcenter()
|
||||
}
|
||||
}
|
||||
|
||||
task clean(type: Delete) {
|
||||
delete rootProject.buildDir
|
||||
}
|
||||
23
GuessTheWordLiveData/gradle.properties
Executable file
@ -0,0 +1,23 @@
|
||||
#
|
||||
# Copyright (C) 2019 Google Inc.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
org.gradle.jvmargs=-Xmx1536m
|
||||
# When configured, Gradle will run in incubating parallel mode.
|
||||
# This option should only be used with decoupled projects. More details, visit
|
||||
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
|
||||
# org.gradle.parallel=true
|
||||
android.databinding.enableV2=true
|
||||
android.useAndroidX=true
|
||||
android.enableJetifier=true
|
||||
BIN
GuessTheWordLiveData/gradle/wrapper/gradle-wrapper.jar
vendored
Executable file
6
GuessTheWordLiveData/gradle/wrapper/gradle-wrapper.properties
vendored
Executable file
@ -0,0 +1,6 @@
|
||||
#Thu Apr 25 11:45:20 PDT 2019
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
|
||||
172
GuessTheWordLiveData/gradlew
vendored
Executable file
@ -0,0 +1,172 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
##############################################################################
|
||||
##
|
||||
## Gradle start up script for UN*X
|
||||
##
|
||||
##############################################################################
|
||||
|
||||
# Attempt to set APP_HOME
|
||||
# Resolve links: $0 may be a link
|
||||
PRG="$0"
|
||||
# Need this for relative symlinks.
|
||||
while [ -h "$PRG" ] ; do
|
||||
ls=`ls -ld "$PRG"`
|
||||
link=`expr "$ls" : '.*-> \(.*\)$'`
|
||||
if expr "$link" : '/.*' > /dev/null; then
|
||||
PRG="$link"
|
||||
else
|
||||
PRG=`dirname "$PRG"`"/$link"
|
||||
fi
|
||||
done
|
||||
SAVED="`pwd`"
|
||||
cd "`dirname \"$PRG\"`/" >/dev/null
|
||||
APP_HOME="`pwd -P`"
|
||||
cd "$SAVED" >/dev/null
|
||||
|
||||
APP_NAME="Gradle"
|
||||
APP_BASE_NAME=`basename "$0"`
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS=""
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD="maximum"
|
||||
|
||||
warn () {
|
||||
echo "$*"
|
||||
}
|
||||
|
||||
die () {
|
||||
echo
|
||||
echo "$*"
|
||||
echo
|
||||
exit 1
|
||||
}
|
||||
|
||||
# OS specific support (must be 'true' or 'false').
|
||||
cygwin=false
|
||||
msys=false
|
||||
darwin=false
|
||||
nonstop=false
|
||||
case "`uname`" in
|
||||
CYGWIN* )
|
||||
cygwin=true
|
||||
;;
|
||||
Darwin* )
|
||||
darwin=true
|
||||
;;
|
||||
MINGW* )
|
||||
msys=true
|
||||
;;
|
||||
NONSTOP* )
|
||||
nonstop=true
|
||||
;;
|
||||
esac
|
||||
|
||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||
|
||||
# Determine the Java command to use to start the JVM.
|
||||
if [ -n "$JAVA_HOME" ] ; then
|
||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||
# IBM's JDK on AIX uses strange locations for the executables
|
||||
JAVACMD="$JAVA_HOME/jre/sh/java"
|
||||
else
|
||||
JAVACMD="$JAVA_HOME/bin/java"
|
||||
fi
|
||||
if [ ! -x "$JAVACMD" ] ; then
|
||||
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
else
|
||||
JAVACMD="java"
|
||||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
|
||||
# Increase the maximum file descriptors if we can.
|
||||
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
|
||||
MAX_FD_LIMIT=`ulimit -H -n`
|
||||
if [ $? -eq 0 ] ; then
|
||||
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
|
||||
MAX_FD="$MAX_FD_LIMIT"
|
||||
fi
|
||||
ulimit -n $MAX_FD
|
||||
if [ $? -ne 0 ] ; then
|
||||
warn "Could not set maximum file descriptor limit: $MAX_FD"
|
||||
fi
|
||||
else
|
||||
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
|
||||
fi
|
||||
fi
|
||||
|
||||
# For Darwin, add options to specify how the application appears in the dock
|
||||
if $darwin; then
|
||||
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
|
||||
fi
|
||||
|
||||
# For Cygwin, switch paths to Windows format before running java
|
||||
if $cygwin ; then
|
||||
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
||||
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
||||
JAVACMD=`cygpath --unix "$JAVACMD"`
|
||||
|
||||
# We build the pattern for arguments to be converted via cygpath
|
||||
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
|
||||
SEP=""
|
||||
for dir in $ROOTDIRSRAW ; do
|
||||
ROOTDIRS="$ROOTDIRS$SEP$dir"
|
||||
SEP="|"
|
||||
done
|
||||
OURCYGPATTERN="(^($ROOTDIRS))"
|
||||
# Add a user-defined pattern to the cygpath arguments
|
||||
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
|
||||
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
|
||||
fi
|
||||
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||
i=0
|
||||
for arg in "$@" ; do
|
||||
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
|
||||
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
|
||||
|
||||
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
|
||||
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
|
||||
else
|
||||
eval `echo args$i`="\"$arg\""
|
||||
fi
|
||||
i=$((i+1))
|
||||
done
|
||||
case $i in
|
||||
(0) set -- ;;
|
||||
(1) set -- "$args0" ;;
|
||||
(2) set -- "$args0" "$args1" ;;
|
||||
(3) set -- "$args0" "$args1" "$args2" ;;
|
||||
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
||||
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
||||
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
||||
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
||||
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
||||
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# Escape application args
|
||||
save () {
|
||||
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
|
||||
echo " "
|
||||
}
|
||||
APP_ARGS=$(save "$@")
|
||||
|
||||
# Collect all arguments for the java command, following the shell quoting and substitution rules
|
||||
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
|
||||
|
||||
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
|
||||
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
|
||||
cd "$(dirname "$0")"
|
||||
fi
|
||||
|
||||
exec "$JAVACMD" "$@"
|
||||
84
GuessTheWordLiveData/gradlew.bat
vendored
Executable file
@ -0,0 +1,84 @@
|
||||
@if "%DEBUG%" == "" @echo off
|
||||
@rem ##########################################################################
|
||||
@rem
|
||||
@rem Gradle startup script for Windows
|
||||
@rem
|
||||
@rem ##########################################################################
|
||||
|
||||
@rem Set local scope for the variables with windows NT shell
|
||||
if "%OS%"=="Windows_NT" setlocal
|
||||
|
||||
set DIRNAME=%~dp0
|
||||
if "%DIRNAME%" == "" set DIRNAME=.
|
||||
set APP_BASE_NAME=%~n0
|
||||
set APP_HOME=%DIRNAME%
|
||||
|
||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
set DEFAULT_JVM_OPTS=
|
||||
|
||||
@rem Find java.exe
|
||||
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||
|
||||
set JAVA_EXE=java.exe
|
||||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if "%ERRORLEVEL%" == "0" goto init
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:findJavaFromJavaHome
|
||||
set JAVA_HOME=%JAVA_HOME:"=%
|
||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||
|
||||
if exist "%JAVA_EXE%" goto init
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:init
|
||||
@rem Get command-line arguments, handling Windows variants
|
||||
|
||||
if not "%OS%" == "Windows_NT" goto win9xME_args
|
||||
|
||||
:win9xME_args
|
||||
@rem Slurp the command line arguments.
|
||||
set CMD_LINE_ARGS=
|
||||
set _SKIP=2
|
||||
|
||||
:win9xME_args_slurp
|
||||
if "x%~1" == "x" goto execute
|
||||
|
||||
set CMD_LINE_ARGS=%*
|
||||
|
||||
:execute
|
||||
@rem Setup the command line
|
||||
|
||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||
|
||||
@rem Execute Gradle
|
||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
|
||||
|
||||
:end
|
||||
@rem End local scope for the variables with windows NT shell
|
||||
if "%ERRORLEVEL%"=="0" goto mainEnd
|
||||
|
||||
:fail
|
||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||
rem the _cmd.exe /c_ return code!
|
||||
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
||||
exit /b 1
|
||||
|
||||
:mainEnd
|
||||
if "%OS%"=="Windows_NT" endlocal
|
||||
|
||||
:omega
|
||||
17
GuessTheWordLiveData/settings.gradle
Executable file
@ -0,0 +1,17 @@
|
||||
/*
|
||||
* Copyright (C) 2019 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
include ':app'
|
||||
45
GuessTheWordTransformation/README.md
Normal file
@ -0,0 +1,45 @@
|
||||
LiveData - Solution Code
|
||||
==================================
|
||||
|
||||
Use as starter code for the LiveData and ViewModel codelab.
|
||||
|
||||
Introduction
|
||||
------------
|
||||
|
||||
This starter app is a two player game, GuessTheWord. It is a word guessing app you can play with one or more friends. To play, hold the device in landscape, facing away from you with your thumbs on the **Skip** and **Got It** buttons. Your friends can then give you clues to help you guess the word. If you get the word right, press **Got It**. If you're stuck, press **Skip** or you can use the **End** button to end the game.
|
||||
This code demostrates the Android Architecture components, LiveData and LiveData observer pattern.
|
||||
|
||||
Pre-requisites
|
||||
--------------
|
||||
|
||||
You need to know:
|
||||
- How to open, build, and run Android apps with Android Studio.
|
||||
- How to use the Navigation Architecture Component
|
||||
- Passing the data between navigation destinations.
|
||||
- Read the logs using the Logcat.
|
||||
|
||||
|
||||
Getting Started
|
||||
---------------
|
||||
|
||||
1. Download and run the app.
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
Copyright 2019 Google, Inc.
|
||||
|
||||
Licensed to the Apache Software Foundation (ASF) under one or more contributor
|
||||
license agreements. See the NOTICE file distributed with this work for
|
||||
additional information regarding copyright ownership. The ASF licenses this
|
||||
file to you under the Apache License, Version 2.0 (the "License"); you may not
|
||||
use this file except in compliance with the License. You may obtain a copy of
|
||||
the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
License for the specific language governing permissions and limitations under
|
||||
the License.
|
||||
1
GuessTheWordTransformation/app/.gitignore
vendored
Executable file
@ -0,0 +1 @@
|
||||
/build
|
||||
62
GuessTheWordTransformation/app/build.gradle
Executable file
@ -0,0 +1,62 @@
|
||||
/*
|
||||
* Copyright (C) 2019 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
apply plugin: 'com.android.application'
|
||||
apply plugin: 'kotlin-android'
|
||||
apply plugin: 'kotlin-kapt'
|
||||
apply plugin: 'kotlin-android-extensions'
|
||||
apply plugin: "androidx.navigation.safeargs"
|
||||
|
||||
android {
|
||||
compileSdkVersion 28
|
||||
defaultConfig {
|
||||
applicationId "com.example.android.guesstheword"
|
||||
minSdkVersion 19
|
||||
targetSdkVersion 28
|
||||
versionCode 1
|
||||
versionName "1.0"
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
buildTypes {
|
||||
release {
|
||||
minifyEnabled false
|
||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||
}
|
||||
}
|
||||
|
||||
dataBinding {
|
||||
enabled = true
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation fileTree(dir: 'libs', include: ['*.jar'])
|
||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
|
||||
implementation 'androidx.appcompat:appcompat:1.0.2'
|
||||
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
|
||||
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
|
||||
testImplementation 'junit:junit:4.12'
|
||||
|
||||
// KTX
|
||||
implementation 'androidx.core:core-ktx:1.0.1'
|
||||
|
||||
// Navigation
|
||||
implementation "android.arch.navigation:navigation-fragment-ktx:1.0.0"
|
||||
implementation "android.arch.navigation:navigation-ui-ktx:1.0.0"
|
||||
|
||||
//ViewModel and LiveData
|
||||
implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'
|
||||
}
|
||||
21
GuessTheWordTransformation/app/proguard-rules.pro
vendored
Executable file
@ -0,0 +1,21 @@
|
||||
# Add project specific ProGuard rules here.
|
||||
# You can control the set of applied configuration files using the
|
||||
# proguardFiles setting in build.gradle.
|
||||
#
|
||||
# For more details, see
|
||||
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||
|
||||
# If your project uses WebView with JS, uncomment the following
|
||||
# and specify the fully qualified class name to the JavaScript interface
|
||||
# class:
|
||||
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||
# public *;
|
||||
#}
|
||||
|
||||
# Uncomment this to preserve the line number information for
|
||||
# debugging stack traces.
|
||||
#-keepattributes SourceFile,LineNumberTable
|
||||
|
||||
# If you keep the line number information, uncomment this to
|
||||
# hide the original source file name.
|
||||
#-renamesourcefileattribute SourceFile
|
||||
@ -0,0 +1,39 @@
|
||||
/*
|
||||
* Copyright (C) 2019 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.android.guesstheword
|
||||
|
||||
import androidx.test.InstrumentationRegistry
|
||||
import androidx.test.runner.AndroidJUnit4
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
|
||||
/**
|
||||
* Instrumented test, which will execute on an Android device.
|
||||
*
|
||||
* See [testing documentation](http://d.android.com/tools/testing).
|
||||
*/
|
||||
@RunWith(AndroidJUnit4::class)
|
||||
class ExampleInstrumentedTest {
|
||||
|
||||
@Test
|
||||
fun useAppContext() {
|
||||
// Context of the app under test.
|
||||
val appContext = InstrumentationRegistry.getTargetContext()
|
||||
assertEquals("com.example.android.guesstheword", appContext.packageName)
|
||||
}
|
||||
}
|
||||
43
GuessTheWordTransformation/app/src/main/AndroidManifest.xml
Executable file
@ -0,0 +1,43 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!--
|
||||
~ Copyright (C) 2019 Google Inc.
|
||||
~
|
||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||
~ you may not use this file except in compliance with the License.
|
||||
~ You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
package="com.example.android.guesstheword">
|
||||
|
||||
<application
|
||||
android:allowBackup="true"
|
||||
android:icon="@mipmap/ic_guess_it"
|
||||
android:label="@string/app_name"
|
||||
android:roundIcon="@mipmap/ic_guess_it_round"
|
||||
android:supportsRtl="true"
|
||||
android:theme="@style/AppTheme"
|
||||
tools:ignore="GoogleAppIndexingWarning">
|
||||
|
||||
<!-- Screen locked to landscape for easier play -->
|
||||
<!-- configChanges attribute makes the following actions NOT cause a config change -->
|
||||
<!-- screenOrientation attribute sets the default animation-->
|
||||
<activity android:name=".MainActivity">
|
||||
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
BIN
GuessTheWordTransformation/app/src/main/ic_guess_it-web.png
Executable file
|
After Width: | Height: | Size: 19 KiB |
@ -0,0 +1,32 @@
|
||||
/*
|
||||
* Copyright (C) 2019 Google Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.example.android.guesstheword
|
||||
|
||||
import android.os.Bundle
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
|
||||
/**
|
||||
* Creates an Activity that hosts all of the fragments in the app
|
||||
*/
|
||||
class MainActivity : AppCompatActivity() {
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
setContentView(R.layout.main_activity)
|
||||
}
|
||||
|
||||
}
|
||||