Membuat Aplikasi Desert Clicker
Burhanudin Rifa - 5025201191
PPB - D
Github: Link
Youtube: Link
/** Copyright (C) 2023 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.dessertclickerimport android.content.ActivityNotFoundExceptionimport android.content.Contextimport android.content.Intentimport android.os.Bundleimport android.util.Logimport android.widget.Toastimport androidx.activity.ComponentActivityimport androidx.activity.compose.setContentimport androidx.annotation.DrawableResimport androidx.compose.foundation.Imageimport androidx.compose.foundation.backgroundimport androidx.compose.foundation.clickableimport androidx.compose.foundation.layout.Arrangementimport androidx.compose.foundation.layout.Boximport androidx.compose.foundation.layout.Columnimport androidx.compose.foundation.layout.Rowimport androidx.compose.foundation.layout.fillMaxSizeimport androidx.compose.foundation.layout.fillMaxWidthimport androidx.compose.foundation.layout.heightimport androidx.compose.foundation.layout.paddingimport androidx.compose.foundation.layout.widthimport androidx.compose.material.icons.Iconsimport androidx.compose.material.icons.filled.Shareimport androidx.compose.material3.Scaffoldimport androidx.compose.material3.Iconimport androidx.compose.material3.IconButtonimport androidx.compose.material3.MaterialThemeimport androidx.compose.material3.Surfaceimport androidx.compose.material3.Textimport androidx.compose.runtime.Composableimport androidx.compose.runtime.collectAsStateimport androidx.compose.runtime.getValueimport androidx.compose.ui.Alignmentimport androidx.compose.ui.Modifierimport androidx.compose.ui.layout.ContentScaleimport androidx.compose.ui.platform.LocalContextimport androidx.compose.ui.res.dimensionResourceimport androidx.compose.ui.res.painterResourceimport androidx.compose.ui.res.stringResourceimport androidx.compose.ui.text.style.TextAlignimport androidx.compose.ui.tooling.preview.Previewimport androidx.core.content.ContextCompatimport androidx.lifecycle.viewmodel.compose.viewModelimport com.example.dessertclicker.data.DessertUiStateimport com.example.dessertclicker.model.Dessertimport com.example.dessertclicker.ui.DessertViewModelimport com.example.dessertclicker.ui.theme.DessertClickerTheme// Tag for loggingprivate const val TAG = "MainActivity"class MainActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)Log.d(TAG, "onCreate Called")setContent {DessertClickerTheme {DessertClickerApp()}}}override fun onStart() {super.onStart()Log.d(TAG, "onStart Called")}override fun onResume() {super.onResume()Log.d(TAG, "onResume Called")}override fun onRestart() {super.onRestart()Log.d(TAG, "onRestart Called")}override fun onPause() {super.onPause()Log.d(TAG, "onPause Called")}override fun onStop() {super.onStop()Log.d(TAG, "onStop Called")}override fun onDestroy() {super.onDestroy()Log.d(TAG, "onDestroy Called")}}@Composableprivate fun DessertClickerApp(viewModel: DessertViewModel = viewModel()) {val uiState by viewModel.dessertUiState.collectAsState()DessertClickerApp(uiState = uiState,onDessertClicked = viewModel::onDessertClicked)}/*** Share desserts sold information using ACTION_SEND intent*/private fun shareSoldDessertsInformation(intentContext: Context, dessertsSold: Int, revenue: Int) {val sendIntent = Intent().apply {action = Intent.ACTION_SENDputExtra(Intent.EXTRA_TEXT,intentContext.getString(R.string.share_text, dessertsSold, revenue))type = "text/plain"}val shareIntent = Intent.createChooser(sendIntent, null)try {ContextCompat.startActivity(intentContext, shareIntent, null)} catch (e: ActivityNotFoundException) {Toast.makeText(intentContext,intentContext.getString(R.string.sharing_not_available),Toast.LENGTH_LONG).show()}}@Composableprivate fun DessertClickerApp(uiState: DessertUiState,onDessertClicked: () -> Unit,modifier: Modifier = Modifier) {Scaffold(topBar = {val intentContext = LocalContext.currentDessertClickerAppBar(onShareButtonClicked = {shareSoldDessertsInformation(intentContext = intentContext,dessertsSold = uiState.dessertsSold,revenue = uiState.revenue)},modifier = Modifier.fillMaxWidth().background(MaterialTheme.colorScheme.primary))}) { contentPadding ->DessertClickerScreen(revenue = uiState.revenue,dessertsSold = uiState.dessertsSold,dessertImageId = uiState.currentDessertImageId,onDessertClicked = onDessertClicked,modifier = Modifier.padding(contentPadding))}}@Composableprivate fun DessertClickerAppBar(onShareButtonClicked: () -> Unit,modifier: Modifier = Modifier) {Row(modifier = modifier,horizontalArrangement = Arrangement.SpaceBetween,verticalAlignment = Alignment.CenterVertically,) {Text(text = stringResource(R.string.app_name),modifier = Modifier.padding(start = dimensionResource(R.dimen.padding_medium)),color = MaterialTheme.colorScheme.onPrimary,style = MaterialTheme.typography.titleLarge,)IconButton(onClick = onShareButtonClicked,modifier = Modifier.padding(end = dimensionResource(R.dimen.padding_medium)),) {Icon(imageVector = Icons.Filled.Share,contentDescription = stringResource(R.string.share),tint = MaterialTheme.colorScheme.onPrimary)}}}@Composablefun DessertClickerScreen(revenue: Int,dessertsSold: Int,@DrawableRes dessertImageId: Int,onDessertClicked: () -> Unit,modifier: Modifier = Modifier) {Box(modifier = modifier) {Image(painter = painterResource(R.drawable.bakery_back),contentDescription = null,contentScale = ContentScale.Crop)Column {Box(modifier = Modifier.weight(1f).fillMaxWidth(),) {Image(painter = painterResource(dessertImageId),contentDescription = null,modifier = Modifier.width(dimensionResource(R.dimen.image_size)).height(dimensionResource(R.dimen.image_size)).align(Alignment.Center).clickable { onDessertClicked() },contentScale = ContentScale.Crop,)}TransactionInfo(revenue = revenue,dessertsSold = dessertsSold,modifier = Modifier.background(MaterialTheme.colorScheme.secondaryContainer))}}}@Composableprivate fun TransactionInfo(revenue: Int,dessertsSold: Int,modifier: Modifier = Modifier) {Column(modifier = modifier) {DessertsSoldInfo(dessertsSold = dessertsSold,modifier = Modifier.fillMaxWidth().padding(dimensionResource(R.dimen.padding_medium)))RevenueInfo(revenue = revenue,modifier = Modifier.fillMaxWidth().padding(dimensionResource(R.dimen.padding_medium)))}}@Composableprivate fun RevenueInfo(revenue: Int, modifier: Modifier = Modifier) {Row(modifier = modifier,horizontalArrangement = Arrangement.SpaceBetween,) {Text(text = stringResource(R.string.total_revenue),style = MaterialTheme.typography.headlineMedium,color = MaterialTheme.colorScheme.onSecondaryContainer)Text(text = "$${revenue}",textAlign = TextAlign.Right,style = MaterialTheme.typography.headlineMedium,color = MaterialTheme.colorScheme.onSecondaryContainer)}}@Composableprivate fun DessertsSoldInfo(dessertsSold: Int, modifier: Modifier = Modifier) {Row(modifier = modifier,horizontalArrangement = Arrangement.SpaceBetween,) {Text(text = stringResource(R.string.dessert_sold),style = MaterialTheme.typography.titleLarge,color = MaterialTheme.colorScheme.onSecondaryContainer)Text(text = dessertsSold.toString(),style = MaterialTheme.typography.titleLarge,color = MaterialTheme.colorScheme.onSecondaryContainer)}}@Preview@Composablefun MyDessertClickerAppPreview() {DessertClickerTheme {DessertClickerApp(uiState = DessertUiState(),onDessertClicked = {})}}

Comments
Post a Comment