Skip to content
Permalink
90854b1d34
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time
209 lines (171 sloc) 6.6 KB
/*
* Copyright 2019, The Android Open Source Project
*
* 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.dessertclicker
import android.content.ActivityNotFoundException
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ShareCompat
import androidx.databinding.DataBindingUtil
import com.example.android.dessertclicker.databinding.ActivityMainBinding
import timber.log.Timber
const val KEY_REVENUE = "revenue_key"
const val KEY_DESSERT_SOLD = "dessert_sold_key"
const val KEY_TIMER_SECONDS = "timer_seconds_key"
class MainActivity : AppCompatActivity() {
private var revenue = 0
private var dessertsSold = 0
private lateinit var dessertTimer: DessertTimer
// Contains all the views
private lateinit var binding: ActivityMainBinding
/** Dessert Data **/
/**
* Simple data class that represents a dessert. Includes the resource id integer associated with
* the image, the price it's sold for, and the startProductionAmount, which determines when
* the dessert starts to be produced.
*/
data class Dessert(val imageId: Int, val price: Int, val startProductionAmount: Int)
// Create a list of all desserts, in order of when they start being produced
private val allDesserts = listOf(
Dessert(R.drawable.cupcake, 5, 0),
Dessert(R.drawable.donut, 10, 5),
Dessert(R.drawable.eclair, 15, 20),
Dessert(R.drawable.froyo, 30, 50),
Dessert(R.drawable.gingerbread, 50, 100),
Dessert(R.drawable.honeycomb, 100, 200),
Dessert(R.drawable.icecreamsandwich, 500, 500),
Dessert(R.drawable.jellybean, 1000, 1000),
Dessert(R.drawable.kitkat, 2000, 2000),
Dessert(R.drawable.lollipop, 3000, 4000),
Dessert(R.drawable.marshmallow, 4000, 8000),
Dessert(R.drawable.nougat, 5000, 16000),
Dessert(R.drawable.oreo, 6000, 20000)
)
private var currentDessert = allDesserts[0]
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Timber.i("onCreate Called")
// Use Data Binding to get reference to the views
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
binding.dessertButton.setOnClickListener {
onDessertClicked()
}
dessertTimer = DessertTimer(this.lifecycle)
if (savedInstanceState != null) {
revenue = savedInstanceState.getInt(KEY_REVENUE, 0)
dessertsSold = savedInstanceState.getInt(KEY_DESSERT_SOLD, 0)
dessertTimer.secondsCount =
savedInstanceState.getInt(KEY_TIMER_SECONDS, 0)
showCurrentDessert()
}
// Set the TextViews to the right values
binding.revenue = revenue
binding.amountSold = dessertsSold
// Make sure the correct dessert is showing
binding.dessertButton.setImageResource(currentDessert.imageId)
}
override fun onStart() {
super.onStart()
Timber.i("onStart Called")
}
override fun onResume() {
super.onResume()
Timber.i("onResume Called")
}
override fun onPause() {
super.onPause()
Timber.i("onPause Called")
}
override fun onStop() {
super.onStop()
Timber.i("onStop Called")
}
override fun onDestroy() {
super.onDestroy()
Timber.i("onDestroy Called")
}
override fun onRestart() {
super.onRestart()
Timber.i("onRestart Called")
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putInt(KEY_REVENUE, revenue)
outState.putInt(KEY_DESSERT_SOLD, dessertsSold)
outState.putInt(KEY_TIMER_SECONDS, dessertTimer.secondsCount)
Timber.i("onSaveInstanceState Called")
}
/**
* Updates the score when the dessert is clicked. Possibly shows a new dessert.
*/
private fun onDessertClicked() {
// Update the score
revenue += currentDessert.price
dessertsSold++
binding.revenue = revenue
binding.amountSold = dessertsSold
// Show the next dessert
showCurrentDessert()
}
/**
* Determine which dessert to show.
*/
private fun showCurrentDessert() {
var newDessert = allDesserts[0]
for (dessert in allDesserts) {
if (dessertsSold >= dessert.startProductionAmount) {
newDessert = dessert
}
// The list of desserts is sorted by startProductionAmount. As you sell more desserts,
// you'll start producing more expensive desserts as determined by startProductionAmount
// We know to break as soon as we see a dessert who's "startProductionAmount" is greater
// than the amount sold.
else break
}
// If the new dessert is actually different than the current dessert, update the image
if (newDessert != currentDessert) {
currentDessert = newDessert
binding.dessertButton.setImageResource(newDessert.imageId)
}
}
/**
* Menu methods
*/
private fun onShare() {
val shareIntent = ShareCompat.IntentBuilder.from(this)
.setText(getString(R.string.share_text, dessertsSold, revenue))
.setType("text/plain")
.intent
try {
startActivity(shareIntent)
} catch (ex: ActivityNotFoundException) {
Toast.makeText(this, getString(R.string.sharing_not_available),
Toast.LENGTH_LONG).show()
}
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.main_menu, menu)
return super.onCreateOptionsMenu(menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.shareMenuButton -> onShare()
}
return super.onOptionsItemSelected(item)
}
}