Permalink
Cannot retrieve contributors at this time
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?
dessertClicker/app/src/main/java/com/example/android/dessertclicker/MainActivity.kt
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
209 lines (171 sloc)
6.6 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* 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) | |
} | |
} |