diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png index 04cf3736bf296794d87563fec5814763e44c9ab6..275fb47ca826da64be2f8a9dc7bd8ecd9f9d2ed5 100644 Binary files a/app/src/main/ic_launcher-playstore.png and b/app/src/main/ic_launcher-playstore.png differ diff --git a/app/src/main/java/com/atm/bondowowo/BondowowoApp.kt b/app/src/main/java/com/atm/bondowowo/BondowowoApp.kt index 5dc20acc2da7fd59529eb391d63e88e20917ae91..15fcfded4d996a54321db6633a6961aa6fae2fff 100644 --- a/app/src/main/java/com/atm/bondowowo/BondowowoApp.kt +++ b/app/src/main/java/com/atm/bondowowo/BondowowoApp.kt @@ -4,42 +4,56 @@ import android.app.Activity import android.app.Application import android.content.Context import android.content.Intent +import android.content.IntentFilter +import android.os.Build +import android.widget.Toast +import androidx.annotation.RequiresApi import com.atm.bondowowo.ui.login.LoginActivity import com.atm.bondowowo.utils.BackgroundJWTChecker +import com.atm.bondowowo.utils.RandomInputBroadcastReceiver import com.atm.bondowowo.utils.UserPreferencesUtil +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.SupervisorJob class BondowowoApp : Application() { + private val applicationScope = CoroutineScope(SupervisorJob()) private var jwtChecker: BackgroundJWTChecker? = null + @RequiresApi(Build.VERSION_CODES.TIRAMISU) override fun onCreate() { super.onCreate() - initBackgroundJWTChecker(this) + val myApplication = applicationContext as BondowowoApp + val appScope = myApplication.getApplicationScope() + initBackgroundJWTChecker(this, appScope, myApplication) } - private fun initBackgroundJWTChecker(context: Context) { + + private fun initBackgroundJWTChecker(context: Context, scope: CoroutineScope, app: BondowowoApp) { jwtChecker = BackgroundJWTChecker() - jwtChecker?.startChecking(context, object : BackgroundJWTChecker.Callback { + jwtChecker?.startChecking(scope, context, object : BackgroundJWTChecker.Callback { override fun onTokenVerified() { // Continu app } override fun onTokenInvalid() { +// Toast.makeText(context, "Your session has ended", Toast.LENGTH_SHORT).show() UserPreferencesUtil.removeJWT(context) UserPreferencesUtil.removeEmail(context) val intent = Intent(context, LoginActivity::class.java) intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK context.startActivity(intent) - if (context is Activity) { - context.finish() - } + (context as? Activity)?.finish() } override fun onNetworkError() { - // Harusnya ini coba cek isi JWT pake library +// Toast.makeText(context, "Re-login to use full feature", Toast.LENGTH_SHORT).show() } }) } + private fun getApplicationScope(): CoroutineScope { + return applicationScope + } } diff --git a/app/src/main/java/com/atm/bondowowo/MainActivity.kt b/app/src/main/java/com/atm/bondowowo/MainActivity.kt index f916c79933f5a4bd88624d866e566e20a05f3ed4..31745c3543aab5be84268d9e85bf04ddba893b18 100644 --- a/app/src/main/java/com/atm/bondowowo/MainActivity.kt +++ b/app/src/main/java/com/atm/bondowowo/MainActivity.kt @@ -1,8 +1,11 @@ package com.atm.bondowowo import android.content.Intent +import android.content.IntentFilter +import android.os.Build import android.os.Bundle import android.widget.Toast +import androidx.annotation.RequiresApi import androidx.appcompat.app.AppCompatActivity import androidx.navigation.findNavController import androidx.navigation.fragment.NavHostFragment @@ -12,6 +15,7 @@ import com.atm.bondowowo.ui.login.LoginActivity import com.atm.bondowowo.utils.DialogHelper import com.atm.bondowowo.utils.NetworkStateLiveData import com.atm.bondowowo.utils.NetworkUtils +import com.atm.bondowowo.utils.RandomInputBroadcastReceiver import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -19,7 +23,10 @@ import kotlinx.coroutines.launch class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding + lateinit var navHostFragment: NavHostFragment +// private val randomInputReceiver = RandomInputBroadcastReceiver(this) + @RequiresApi(Build.VERSION_CODES.TIRAMISU) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) @@ -36,7 +43,7 @@ class MainActivity : AppCompatActivity() { if (!isUserAuthenticated()) { navigateToLoginActivity() } else { - val navHostFragment = + navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment val navController = navHostFragment.navController binding.bottomNavLayout.bottomNavigation.setupWithNavController(navController) @@ -62,8 +69,6 @@ class MainActivity : AppCompatActivity() { } private suspend fun isTokenValid(token: String): Boolean { - // Lagi malas login juga -// return true return try { val response = NetworkUtils.apiService.verifyToken("Bearer $token") if (response.isSuccessful) { @@ -87,4 +92,5 @@ class MainActivity : AppCompatActivity() { false } } + } diff --git a/app/src/main/java/com/atm/bondowowo/ui/graph/ChartView.kt b/app/src/main/java/com/atm/bondowowo/ui/graph/ChartView.kt index 7e150c1255d6f2239d27ddc2a896b7369443c8bc..7189ac604e4a3ea608a1d0cd6e58d47b70403930 100644 --- a/app/src/main/java/com/atm/bondowowo/ui/graph/ChartView.kt +++ b/app/src/main/java/com/atm/bondowowo/ui/graph/ChartView.kt @@ -4,6 +4,7 @@ import android.content.Context import android.graphics.Color import android.view.View import android.widget.TextView +import androidx.core.content.ContextCompat import androidx.lifecycle.LiveData import com.atm.bondowowo.R import com.atm.bondowowo.data.model.Transaction @@ -52,19 +53,19 @@ class ChartView(context: Context) : View(context) { pieChart.holeRadius = 40f val pieDataSet = PieDataSet(entries, "") - pieDataSet.colors = listOf(Color.RED, Color.GREEN, Color.BLUE) + pieDataSet.colors = + listOf(ContextCompat.getColor(context, R.color.primary1), ContextCompat.getColor(context, R.color.primary3)) pieDataSet.valueTextSize = 24f pieDataSet.valueTextColor = Color.WHITE - pieDataSet.valueFormatter = PercentFormatter() pieDataSet.sliceSpace = 3f pieDataSet.selectionShift = 15f pieChart.legend.isEnabled = true - pieChart.legend.orientation = Legend.LegendOrientation.VERTICAL - pieChart.legend.horizontalAlignment = Legend.LegendHorizontalAlignment.RIGHT - pieChart.legend.verticalAlignment = Legend.LegendVerticalAlignment.BOTTOM - pieChart.legend.textSize = 32f - pieChart.legend.textColor = Color.BLACK + pieChart.legend.orientation = Legend.LegendOrientation.HORIZONTAL + pieChart.legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + pieChart.legend.verticalAlignment = Legend.LegendVerticalAlignment.TOP + pieChart.legend.formSize = 24f + pieChart.legend.textSize = 16f pieChart.animateY(1500, Easing.EaseInOutQuad) pieChart.animateX(1500, Easing.EaseInOutQuad) pieChart.isHighlightPerTapEnabled = true diff --git a/app/src/main/java/com/atm/bondowowo/ui/settings/SettingsFragment.kt b/app/src/main/java/com/atm/bondowowo/ui/settings/SettingsFragment.kt index 0289894aedb596ab4bf2296e51c889908463cc69..903c05baf06602f1faed69d07359b82dc76cf4e2 100644 --- a/app/src/main/java/com/atm/bondowowo/ui/settings/SettingsFragment.kt +++ b/app/src/main/java/com/atm/bondowowo/ui/settings/SettingsFragment.kt @@ -23,6 +23,7 @@ class SettingsFragment : Fragment() { private lateinit var btn_export: Button private lateinit var btn_send_email: Button private lateinit var btn_logout: Button + private lateinit var btn_random: Button private lateinit var database: AppDatabase override fun onCreateView( @@ -35,13 +36,12 @@ class SettingsFragment : Fragment() { btn_export = view.findViewById(R.id.button_export_to_file) btn_send_email = view.findViewById(R.id.button_send_via_email) btn_logout = view.findViewById(R.id.button_logout_settings) + btn_random = view.findViewById(R.id.button_randomize_input) val context = requireActivity().applicationContext database = AppDatabase.getInstance(context) btn_export.setOnClickListener { -// val listOfTransactions = database.transactionDao().getAll() -// ExportToFileUtil.exportDataToFile(requireContext(), listOfTransactions) showExportFileDialog() } @@ -63,17 +63,16 @@ class SettingsFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - val randButton = view.findViewById<Button>(R.id.button_randomize_input) - randButton.setOnClickListener { - val randNum = (0..1000).random().toString() - sendInputValueBroadcast(randNum) + btn_random.setOnClickListener { + sendRandomInputBroadcast() } } - private fun sendInputValueBroadcast(inputValue: String) { + private fun sendRandomInputBroadcast() { + val randomInput = (0..100).random().toString() val intent = Intent("com.atm.bondowowo.RANDOM_INPUT_TRANSACTION") - intent.putExtra("input_value", inputValue) - requireContext().sendBroadcast(intent) + intent.putExtra("input_value", randomInput) + context?.sendBroadcast(intent) } private fun showExportFileDialog() { diff --git a/app/src/main/java/com/atm/bondowowo/ui/transaction/TransactionActivity.kt b/app/src/main/java/com/atm/bondowowo/ui/transaction/TransactionActivity.kt index 8e66387ad7c1ef88ca05ea0ce03bc22c958c22ec..22932edfb0979644155c739539432638d76655a1 100644 --- a/app/src/main/java/com/atm/bondowowo/ui/transaction/TransactionActivity.kt +++ b/app/src/main/java/com/atm/bondowowo/ui/transaction/TransactionActivity.kt @@ -28,6 +28,8 @@ class TransactionActivity : AppCompatActivity(), TransactionInputFragment.Transa // Get the id passed from the intent val id = intent.getIntExtra("id", -1) + // Get random number if exist + val randomNumber = intent.getStringExtra("randomNumber") if (id != -1) { // Pass the id to the fragment if id found from intent @@ -37,6 +39,13 @@ class TransactionActivity : AppCompatActivity(), TransactionInputFragment.Transa transactionInputFragment.arguments = args } + if (randomNumber != null && id == -1) { + val args = Bundle().apply { + putString("randomNumber", randomNumber) + } + transactionInputFragment.arguments = args + } + transactionInputFragment.setListener(this) supportFragmentManager.beginTransaction() diff --git a/app/src/main/java/com/atm/bondowowo/ui/transaction/TransactionFragment.kt b/app/src/main/java/com/atm/bondowowo/ui/transaction/TransactionFragment.kt index 9296f9cd2821322dd76636f4103c2cb60d8b8c11..137d94266e7c6d909837d99e27a45022a832bf30 100644 --- a/app/src/main/java/com/atm/bondowowo/ui/transaction/TransactionFragment.kt +++ b/app/src/main/java/com/atm/bondowowo/ui/transaction/TransactionFragment.kt @@ -1,14 +1,19 @@ package com.atm.bondowowo.ui.transaction import android.app.AlertDialog -import android.content.BroadcastReceiver -import android.content.Context import android.content.Intent +import android.content.IntentFilter +import android.os.Build import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.annotation.RequiresApi +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat +import androidx.core.content.ContextCompat.registerReceiver import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -16,7 +21,11 @@ import com.atm.bondowowo.R import com.atm.bondowowo.adapter.TransactionAdapter import com.atm.bondowowo.data.local.database.AppDatabase import com.atm.bondowowo.data.local.entity.TransactionEntity +import com.atm.bondowowo.data.repository.TransactionRepository +import com.atm.bondowowo.ui.graph.GraphViewModel +import com.atm.bondowowo.ui.graph.GraphViewModelFactory import com.atm.bondowowo.utils.GoogleMapsUtil +import com.atm.bondowowo.utils.RandomInputBroadcastReceiver import com.google.android.material.floatingactionbutton.FloatingActionButton @@ -27,14 +36,12 @@ class TransactionFragment : Fragment() { private var list = mutableListOf<TransactionEntity>() private lateinit var adapter: TransactionAdapter private lateinit var database: AppDatabase - private lateinit var listener: TransactionInteractionListener + private lateinit var transactionViewModel: TransactionViewModel - interface TransactionInteractionListener { - fun onTransactionItemClick(transactionId: Int?) - fun onAddTransactionButtonClick() - } + private lateinit var randomInputReceiver: RandomInputBroadcastReceiver + @RequiresApi(Build.VERSION_CODES.TIRAMISU) override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -44,8 +51,13 @@ class TransactionFragment : Fragment() { recyclerView = view.findViewById(R.id.cart_list) fab = view.findViewById(R.id.fab) + database = AppDatabase.getInstance(requireContext()) + val transactionRepository = TransactionRepository(database) + val transactionViewModelFactory = TransactionViewModelFactory(transactionRepository) + transactionViewModel = + ViewModelProvider(this, transactionViewModelFactory)[TransactionViewModel::class.java] + val context = requireActivity().applicationContext - database = AppDatabase.getInstance(context) adapter = TransactionAdapter(list) adapter.setDialog(object : TransactionAdapter.Dialog { @@ -61,8 +73,6 @@ class TransactionFragment : Fragment() { intent.putExtra("id", list[position].id) startActivity(intent) } else if (which == 1) { -// database.transactionDao().delete(list[position]) -// getData() showDeleteConfirmationDialog(position) } else if (which == 2) { list[position].id?.let { @@ -87,12 +97,25 @@ class TransactionFragment : Fragment() { ) fab.setOnClickListener { - startActivity(Intent(requireContext(), TransactionActivity::class.java)) + val intent = + Intent(requireContext(), TransactionActivity::class.java) + if (transactionViewModel.randomNumber != "") { + intent.putExtra("randomNumber", transactionViewModel.randomNumber) + transactionViewModel.randomNumber = "" + } + startActivity(intent) } return view } + @RequiresApi(Build.VERSION_CODES.TIRAMISU) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + randomInputReceiver = RandomInputBroadcastReceiver(requireContext(), this) + registerRandomInputReceiver() + } + override fun onResume() { super.onResume() getData() @@ -104,6 +127,10 @@ class TransactionFragment : Fragment() { adapter.notifyDataSetChanged() } + fun setRandomNumber(num: String) { + transactionViewModel.randomNumber = num + } + private fun showDeleteConfirmationDialog(position: Int) { val builder = AlertDialog.Builder(requireContext()) builder.setTitle("Delete Transaction") @@ -122,4 +149,18 @@ class TransactionFragment : Fragment() { database.transactionDao().delete(list[position]) getData() } + + @RequiresApi(Build.VERSION_CODES.TIRAMISU) + private fun registerRandomInputReceiver() { + registerReceiver( + requireContext(), + randomInputReceiver, + IntentFilter("com.atm.bondowowo.RANDOM_INPUT_TRANSACTION"), + ContextCompat.RECEIVER_EXPORTED + ) + } + +// private fun unregisterRandomInputReceiver() { +// unregisterReceiver(randomInputReceiver) +// } } diff --git a/app/src/main/java/com/atm/bondowowo/ui/transaction/TransactionInputFragment.kt b/app/src/main/java/com/atm/bondowowo/ui/transaction/TransactionInputFragment.kt index 98897c01c7a65bbf3e4376fd834fc20742b8b169..8f638464bda8d1052192a68ed2ffdbaf03446449 100644 --- a/app/src/main/java/com/atm/bondowowo/ui/transaction/TransactionInputFragment.kt +++ b/app/src/main/java/com/atm/bondowowo/ui/transaction/TransactionInputFragment.kt @@ -27,6 +27,7 @@ import androidx.fragment.app.Fragment import com.atm.bondowowo.R import com.atm.bondowowo.data.local.database.AppDatabase import com.atm.bondowowo.data.local.entity.TransactionEntity +import com.atm.bondowowo.utils.RandomInputBroadcastReceiver import java.time.LocalDateTime class TransactionInputFragment : Fragment() { @@ -59,45 +60,50 @@ class TransactionInputFragment : Fragment() { database = AppDatabase.getInstance(requireContext()) val categories = arrayOf("pemasukan", "pengeluaran") - val adapter = ArrayAdapter(requireContext(), android.R.layout.simple_spinner_item, categories) + val adapter = + ArrayAdapter(requireContext(), android.R.layout.simple_spinner_item, categories) adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) kategori_transaksi.adapter = adapter val args = arguments - if (args != null) { - val id = args.getInt("id", 0) + if (args != null && args.getInt("id", -1) != -1) { + val id = args.getInt("id", -1) val transaction = database.transactionDao().get(id) nama_transaksi.setText(transaction.nama) nominal_transaksi.setText(transaction.nominal.toString()) kategori_transaksi.setSelection(categories.indexOf(transaction.kategori)) lokasi_transaksi.setText(transaction.lokasi) + } else if (args?.getString("randomNumber") != null) { + setNominal(args.getString("randomNumber")!!) } btnSave.setOnClickListener { if (nama_transaksi.text.isNotEmpty() && nominal_transaksi.text.isNotEmpty() && lokasi_transaksi.text.isNotEmpty()) { val category = kategori_transaksi.selectedItem.toString() - val transactionEntity = if (args != null) { - TransactionEntity( - args.getInt("id", 0), - LocalDateTime.now(), - nama_transaksi.text.toString(), - category, - nominal_transaksi.text.toString().toDouble(), - lokasi_transaksi.text.toString() - ) - } else { - TransactionEntity( - null, - LocalDateTime.now(), - nama_transaksi.text.toString(), - category, - nominal_transaksi.text.toString().toDouble(), - lokasi_transaksi.text.toString() - ) - } - - if (args != null) { + val transactionEntity = + if (args?.getInt("id", -1) != -1 && args?.getInt("id", -1) != null) { + TransactionEntity( + args?.getInt("id", 0), + LocalDateTime.now(), + nama_transaksi.text.toString(), + category, + nominal_transaksi.text.toString().toDouble(), + lokasi_transaksi.text.toString() + ) + } else { + TransactionEntity( + null, + LocalDateTime.now(), + nama_transaksi.text.toString(), + category, + nominal_transaksi.text.toString().toDouble(), + lokasi_transaksi.text.toString() + ) + } + + val id = args?.getInt("id", -1) + if (id != -1 && id != null) { database.transactionDao().update(transactionEntity) } else { database.transactionDao().insertAll(transactionEntity) @@ -116,21 +122,22 @@ class TransactionInputFragment : Fragment() { @RequiresApi(Build.VERSION_CODES.TIRAMISU) override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - requireContext().registerReceiver( - inputValueReceiver, - IntentFilter("com.atm.bondowowo.RANDOM_INPUT_TRANSACTION"), - Context.RECEIVER_NOT_EXPORTED - ) if (checkLocationPermission()) { - locationManager = requireActivity().getSystemService(Context.LOCATION_SERVICE) as LocationManager - locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0f, locationListener) + locationManager = + requireActivity().getSystemService(Context.LOCATION_SERVICE) as LocationManager + locationManager.requestLocationUpdates( + LocationManager.GPS_PROVIDER, + 0, + 0f, + locationListener + ) } } override fun onDestroyView() { super.onDestroyView() - requireContext().unregisterReceiver(inputValueReceiver) +// requireContext().unregisterReceiver(inputValueReceiver) if (this::locationManager.isInitialized) { locationManager.removeUpdates(locationListener) } @@ -140,15 +147,9 @@ class TransactionInputFragment : Fragment() { this.listener = listener } - - // Failed still broadcast reciever - private val inputValueReceiver = object : BroadcastReceiver() { - override fun onReceive(context: Context, intent: Intent) { - if (intent.action == "com.atm.bondowowo.RANDOM_INPUT_TRANSACTION") { - val inputValue = intent.getStringExtra("input_value") - nominal_transaksi.setText(inputValue) - } - } + + fun setNominal(nominal: String) { + nominal_transaksi.setText(nominal) } private lateinit var locationManager: LocationManager @@ -167,7 +168,8 @@ class TransactionInputFragment : Fragment() { } @Deprecated("Deprecated in Java") - override fun onStatusChanged(provider: String?, status: Int, extras: Bundle?) {} + override fun onStatusChanged(provider: String?, status: Int, extras: Bundle?) { + } override fun onProviderEnabled(provider: String) {} @@ -199,7 +201,12 @@ class TransactionInputFragment : Fragment() { Manifest.permission.ACCESS_FINE_LOCATION ) == PackageManager.PERMISSION_GRANTED ) { - locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0f, locationListener) + locationManager.requestLocationUpdates( + LocationManager.GPS_PROVIDER, + 0, + 0f, + locationListener + ) } } else { Toast.makeText( diff --git a/app/src/main/java/com/atm/bondowowo/ui/transaction/TransactionViewModel.kt b/app/src/main/java/com/atm/bondowowo/ui/transaction/TransactionViewModel.kt new file mode 100644 index 0000000000000000000000000000000000000000..171bfa4b6adb4cfaf9193c6767c7c740b9187717 --- /dev/null +++ b/app/src/main/java/com/atm/bondowowo/ui/transaction/TransactionViewModel.kt @@ -0,0 +1,10 @@ +package com.atm.bondowowo.ui.transaction + +import androidx.lifecycle.ViewModel +import com.atm.bondowowo.data.repository.TransactionRepository + +class TransactionViewModel( + private val transactionRepository: TransactionRepository +) : ViewModel() { + var randomNumber: String = "" +} \ No newline at end of file diff --git a/app/src/main/java/com/atm/bondowowo/ui/transaction/TransactionViewModelFactory.kt b/app/src/main/java/com/atm/bondowowo/ui/transaction/TransactionViewModelFactory.kt new file mode 100644 index 0000000000000000000000000000000000000000..bbcb0183c788cb5129b99f008ac8f250df5486ce --- /dev/null +++ b/app/src/main/java/com/atm/bondowowo/ui/transaction/TransactionViewModelFactory.kt @@ -0,0 +1,18 @@ +package com.atm.bondowowo.ui.transaction + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import com.atm.bondowowo.data.repository.TransactionRepository + +class TransactionViewModelFactory( + private val transactionRepository: TransactionRepository +) : ViewModelProvider.Factory { + + override fun <T : ViewModel> create(modelClass: Class<T>): T { + if (modelClass.isAssignableFrom(TransactionViewModel::class.java)) { + @Suppress("UNCHECKED_CAST") + return TransactionViewModel(transactionRepository) as T + } + throw IllegalArgumentException("Unknown ViewModel class") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/atm/bondowowo/utils/BackgroundJWTCheckerUtil.kt b/app/src/main/java/com/atm/bondowowo/utils/BackgroundJWTCheckerUtil.kt index 047a89ebdcd3177f83426485c28e808518820b7b..28a39419682846c49c24e02fa4e5cd25d8db197b 100644 --- a/app/src/main/java/com/atm/bondowowo/utils/BackgroundJWTCheckerUtil.kt +++ b/app/src/main/java/com/atm/bondowowo/utils/BackgroundJWTCheckerUtil.kt @@ -1,6 +1,7 @@ package com.atm.bondowowo.utils import android.content.Context +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope @@ -19,17 +20,17 @@ class BackgroundJWTChecker { fun onNetworkError() } - @OptIn(DelicateCoroutinesApi::class) - fun startChecking(context: Context, callback: Callback) { - job = GlobalScope.launch(Dispatchers.IO) { + fun startChecking(scope: CoroutineScope, context: Context, callback: Callback) { + job = scope.launch(Dispatchers.IO) { while (isActive) { + // 2,5 Menit + delay(2 * 60 * 1000 + 40 * 1000) val token = UserPreferencesUtil.getJWT(context) if (token != null) { verifyToken(token, callback) } else { callback.onTokenInvalid() } - delay(3 * 60 * 1000) } } } diff --git a/app/src/main/java/com/atm/bondowowo/utils/NetworkUtils.kt b/app/src/main/java/com/atm/bondowowo/utils/NetworkUtils.kt index 41395daa2d346845ad92f488fb7330dd953b3a4e..708de6aa74b4d3bf40587f02df070846151cb617 100644 --- a/app/src/main/java/com/atm/bondowowo/utils/NetworkUtils.kt +++ b/app/src/main/java/com/atm/bondowowo/utils/NetworkUtils.kt @@ -1,7 +1,5 @@ package com.atm.bondowowo.utils -// NetworkUtils.kt - import com.atm.bondowowo.data.remote.ApiService import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory diff --git a/app/src/main/java/com/atm/bondowowo/utils/RandomInputBroadcastReciever.kt b/app/src/main/java/com/atm/bondowowo/utils/RandomInputBroadcastReciever.kt new file mode 100644 index 0000000000000000000000000000000000000000..bcdea73c8faf129bb71dbaab819394f0cf030d2b --- /dev/null +++ b/app/src/main/java/com/atm/bondowowo/utils/RandomInputBroadcastReciever.kt @@ -0,0 +1,29 @@ +package com.atm.bondowowo.utils + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import androidx.fragment.app.FragmentActivity +import androidx.lifecycle.ViewModelProvider +import com.atm.bondowowo.MainActivity +import com.atm.bondowowo.R +import com.atm.bondowowo.ui.transaction.TransactionFragment +import com.atm.bondowowo.ui.transaction.TransactionInputFragment +import com.atm.bondowowo.ui.transaction.TransactionViewModel + +class RandomInputBroadcastReceiver(private val context: Context, private val fragment: TransactionFragment) : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + if (intent.action == "com.atm.bondowowo.RANDOM_INPUT_TRANSACTION") { + val inputValue = intent.getStringExtra("input_value") + updateTransactionInputField(inputValue) + } + } + + private fun updateTransactionInputField(inputValue: String?) { + + if (inputValue != null) { + fragment.setRandomNumber(inputValue) + } + } + +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml index 07d5da9cbf141911847041df5d7b87f0dd5ef9d4..ca3826a46ce070f906d0d3fbe6987df882134381 100644 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -1,170 +1,74 @@ <?xml version="1.0" encoding="utf-8"?> -<vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="108dp" +<vector android:height="108dp" + android:width="108dp" + android:viewportHeight="108" android:viewportWidth="108" - android:viewportHeight="108"> - <path - android:fillColor="#3DDC84" - android:pathData="M0,0h108v108h-108z" /> - <path - android:fillColor="#00000000" - android:pathData="M9,0L9,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M19,0L19,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M29,0L29,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M39,0L39,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M49,0L49,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M59,0L59,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M69,0L69,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M79,0L79,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M89,0L89,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M99,0L99,108" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,9L108,9" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,19L108,19" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,29L108,29" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,39L108,39" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,49L108,49" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,59L108,59" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,69L108,69" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,79L108,79" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,89L108,89" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M0,99L108,99" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M19,29L89,29" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M19,39L89,39" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M19,49L89,49" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M19,59L89,59" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M19,69L89,69" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M19,79L89,79" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M29,19L29,89" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M39,19L39,89" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M49,19L49,89" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M59,19L59,89" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M69,19L69,89" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> - <path - android:fillColor="#00000000" - android:pathData="M79,19L79,89" - android:strokeWidth="0.8" - android:strokeColor="#33FFFFFF" /> + xmlns:android="http://schemas.android.com/apk/res/android"> + <path android:fillColor="#3DDC84" + android:pathData="M0,0h108v108h-108z"/> + <path android:fillColor="#00000000" android:pathData="M9,0L9,108" + android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/> + <path android:fillColor="#00000000" android:pathData="M19,0L19,108" + android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/> + <path android:fillColor="#00000000" android:pathData="M29,0L29,108" + android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/> + <path android:fillColor="#00000000" android:pathData="M39,0L39,108" + android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/> + <path android:fillColor="#00000000" android:pathData="M49,0L49,108" + android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/> + <path android:fillColor="#00000000" android:pathData="M59,0L59,108" + android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/> + <path android:fillColor="#00000000" android:pathData="M69,0L69,108" + android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/> + <path android:fillColor="#00000000" android:pathData="M79,0L79,108" + android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/> + <path android:fillColor="#00000000" android:pathData="M89,0L89,108" + android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/> + <path android:fillColor="#00000000" android:pathData="M99,0L99,108" + android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/> + <path android:fillColor="#00000000" android:pathData="M0,9L108,9" + android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/> + <path android:fillColor="#00000000" android:pathData="M0,19L108,19" + android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/> + <path android:fillColor="#00000000" android:pathData="M0,29L108,29" + android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/> + <path android:fillColor="#00000000" android:pathData="M0,39L108,39" + android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/> + <path android:fillColor="#00000000" android:pathData="M0,49L108,49" + android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/> + <path android:fillColor="#00000000" android:pathData="M0,59L108,59" + android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/> + <path android:fillColor="#00000000" android:pathData="M0,69L108,69" + android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/> + <path android:fillColor="#00000000" android:pathData="M0,79L108,79" + android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/> + <path android:fillColor="#00000000" android:pathData="M0,89L108,89" + android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/> + <path android:fillColor="#00000000" android:pathData="M0,99L108,99" + android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/> + <path android:fillColor="#00000000" android:pathData="M19,29L89,29" + android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/> + <path android:fillColor="#00000000" android:pathData="M19,39L89,39" + android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/> + <path android:fillColor="#00000000" android:pathData="M19,49L89,49" + android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/> + <path android:fillColor="#00000000" android:pathData="M19,59L89,59" + android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/> + <path android:fillColor="#00000000" android:pathData="M19,69L89,69" + android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/> + <path android:fillColor="#00000000" android:pathData="M19,79L89,79" + android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/> + <path android:fillColor="#00000000" android:pathData="M29,19L29,89" + android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/> + <path android:fillColor="#00000000" android:pathData="M39,19L39,89" + android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/> + <path android:fillColor="#00000000" android:pathData="M49,19L49,89" + android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/> + <path android:fillColor="#00000000" android:pathData="M59,19L59,89" + android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/> + <path android:fillColor="#00000000" android:pathData="M69,19L69,89" + android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/> + <path android:fillColor="#00000000" android:pathData="M79,19L79,89" + android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/> </vector> diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index 036d09bc5fd523323794379703c4a111d1e28a04..c4a603d4cce78b2fbd8094bd0224d4778bc8c976 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> - <background android:drawable="@color/ic_launcher_background"/> + <background android:drawable="@drawable/ic_launcher_background"/> <foreground android:drawable="@mipmap/ic_launcher_foreground"/> </adaptive-icon> \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index 036d09bc5fd523323794379703c4a111d1e28a04..c4a603d4cce78b2fbd8094bd0224d4778bc8c976 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> - <background android:drawable="@color/ic_launcher_background"/> + <background android:drawable="@drawable/ic_launcher_background"/> <foreground android:drawable="@mipmap/ic_launcher_foreground"/> </adaptive-icon> \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp index dec7aebad45b5fbe61008a87ed50e08f07a63831..d66ed28e6489131eba008d4391832674f242dc48 100644 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.webp and b/app/src/main/res/mipmap-hdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp index ec29dabd8761f8af9cd283634dfd7ca4e4b0d637..f3fa9a51c88fc403d596cefd87ee4f56928e8110 100644 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp and b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp index 30ff81021b07213271e55672f5d79eb12f89bcb0..bf01cd613d5c681ca30a409887f4418f038d8594 100644 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp index c16ef8661a5881ace0313e958de7d01aa6b61c46..862283f41b7cd8c5ca269843199e018973fe0b1b 100644 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.webp and b/app/src/main/res/mipmap-mdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp index 156618bc52df7922c6acd4da98c182f5dad32ada..bde09f0be6143812719c26d469f64632b1e38327 100644 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp and b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp index 9bfb65dbcfe71b9a7ed6a88a28d379982d0085a6..a3a1b0c0c5786610a704ac239ce85ae3b3b7253b 100644 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp index 6c98e61e8f03469e7a14f87f837a31f17f26f2b0..1c2d3553040f9b4cac203cbb8850ee53e43e0d30 100644 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp and b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp index 66401883babd174e2192d5975b3747f0a91624f4..78599232450782cc564ab1a6005e80f20b547def 100644 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp and b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp index 45c4a802d9f74e7729e033bc56ddeab3183385eb..8f71a6bc1e5875ba788e40e4d560052b77749fa5 100644 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp index d8d7c177e417ca4a4d0b9e92c0945ae9a3d636fc..d936744796b71b651eebff74c5791c7bd15963d9 100644 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp index 247c97387e5f28e659e9e6b2ca562dcf91dcfd4c..52af2763c50261775a77723ad1c5825cdf622e07 100644 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp index eb87021db0340fef07817856b4b55614d8afe466..96e600b53101a9afd8f1b62e2a3cdecd7de53ad7 100644 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp index 57e414a1b7c2997944b519a96be82064afdb9ab7..fcf16a142e36e66ba0c96f28622e7f46830742b2 100644 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp index f04334257392175386e080d4a90c089f09853a31..5d121125b7c122bd416e42a3c38f0ec8933414b9 100644 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp index a5ecb0535041f2b00934b6f62be51face721c79e..fad321b46e8d7c64eb5c4bf298dbd4117c19c9ed 100644 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml index 6019c4af464918d581bd04835109170ad7e7aa1a..8a81311c7c9c112c8d984dad306fb51701a88c3b 100644 --- a/app/src/main/res/navigation/nav_graph.xml +++ b/app/src/main/res/navigation/nav_graph.xml @@ -39,7 +39,7 @@ android:id="@+id/transactionInputFragment" android:name="com.atm.bondowowo.ui.transaction.TransactionInputFragment" android:label="fragment_transaction_input" - tools:layout="@layout/fragment_transaction_input" > + tools:layout="@layout/fragment_transaction_input"> <action android:id="@+id/action_transactionInputFragment_to_transactionFragment" app:destination="@id/transactionFragment" />