diff --git a/.idea/misc.xml b/.idea/misc.xml index e25e9e6..5014ce6 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -22,16 +22,20 @@ + + + + diff --git a/app/build.gradle b/app/build.gradle index 8ef0b93..45554c7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -50,6 +50,9 @@ dependencies { implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.4.0' implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0' + // Settings + implementation "androidx.preference:preference-ktx:1.1.1" + // DataStore implementation "androidx.datastore:datastore:1.0.0" diff --git a/app/src/main/java/com/dzeio/openhealth/MainActivity.kt b/app/src/main/java/com/dzeio/openhealth/MainActivity.kt index 053ec3a..977af20 100644 --- a/app/src/main/java/com/dzeio/openhealth/MainActivity.kt +++ b/app/src/main/java/com/dzeio/openhealth/MainActivity.kt @@ -9,8 +9,12 @@ import android.os.Bundle import android.util.Log import android.view.LayoutInflater import android.view.Menu +import android.view.MenuItem +import androidx.core.content.ContextCompat +import androidx.lifecycle.lifecycleScope import androidx.navigation.NavController import androidx.navigation.fragment.NavHostFragment +import androidx.navigation.fragment.findNavController import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.navigateUp import androidx.navigation.ui.setupActionBarWithNavController @@ -20,6 +24,8 @@ import com.dzeio.openhealth.core.BaseActivity import com.dzeio.openhealth.databinding.ActivityMainBinding import com.dzeio.openhealth.interfaces.NotificationChannels import com.dzeio.openhealth.services.WaterReminderService +import com.dzeio.openhealth.ui.home.HomeFragmentDirections +import com.google.android.material.dialog.MaterialAlertDialogBuilder import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint @@ -40,12 +46,11 @@ class MainActivity : BaseActivity() { val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment navController = navHostFragment.navController - binding.navView.setupWithNavController(navController) appBarConfiguration = AppBarConfiguration( setOf( R.id.nav_home - ), binding.drawerLayout + ) ) setupActionBarWithNavController(navController, appBarConfiguration) @@ -109,4 +114,23 @@ class MainActivity : BaseActivity() { } } + override fun onOptionsItemSelected(item: MenuItem): Boolean { + return when (item.itemId) { + R.id.action_settings -> { + navController.navigate( + HomeFragmentDirections.actionNavHomeToNavSettings() + ) + true + } + R.id.action_extensions -> { + navController.navigate( + HomeFragmentDirections.actionNavHomeToNavExtensions() + ) + true + } + else -> super.onOptionsItemSelected(item) + } + + } + } \ No newline at end of file diff --git a/app/src/main/java/com/dzeio/openhealth/ui/imports/ImportFragment.kt b/app/src/main/java/com/dzeio/openhealth/ui/extensions/ExtensionsFragment.kt similarity index 92% rename from app/src/main/java/com/dzeio/openhealth/ui/imports/ImportFragment.kt rename to app/src/main/java/com/dzeio/openhealth/ui/extensions/ExtensionsFragment.kt index 7b4c8bd..9cdd70b 100644 --- a/app/src/main/java/com/dzeio/openhealth/ui/imports/ImportFragment.kt +++ b/app/src/main/java/com/dzeio/openhealth/ui/extensions/ExtensionsFragment.kt @@ -1,4 +1,4 @@ -package com.dzeio.openhealth.ui.imports +package com.dzeio.openhealth.ui.extensions import android.app.ProgressDialog import android.content.Intent @@ -16,17 +16,19 @@ import com.dzeio.openhealth.extensions.GoogleFit //import com.dzeio.openhealth.connectors.GoogleFit import com.dzeio.openhealth.extensions.samsunghealth.SamsungHealth import com.dzeio.openhealth.core.BaseFragment -import com.dzeio.openhealth.databinding.FragmentImportBinding +import com.dzeio.openhealth.databinding.FragmentExtensionsBinding import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint -class ImportFragment : BaseFragment(ImportViewModel::class.java) { +class ExtensionsFragment : + BaseFragment(ExtensionsViewModel::class.java) { companion object { const val TAG = "ImportFragment" } - override val bindingInflater: (LayoutInflater, ViewGroup?, Boolean) -> FragmentImportBinding = FragmentImportBinding::inflate + override val bindingInflater: (LayoutInflater, ViewGroup?, Boolean) -> FragmentExtensionsBinding = + FragmentExtensionsBinding::inflate private lateinit var progressDialog: ProgressDialog @@ -111,8 +113,10 @@ class ImportFragment : BaseFragment(Impo } @RequiresApi(Build.VERSION_CODES.O) - override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, - grantResults: IntArray) { + override fun onRequestPermissionsResult( + requestCode: Int, permissions: Array, + grantResults: IntArray + ) { when { grantResults.isEmpty() -> { // If user interaction was interrupted, the permission request diff --git a/app/src/main/java/com/dzeio/openhealth/ui/imports/ImportViewModel.kt b/app/src/main/java/com/dzeio/openhealth/ui/extensions/ExtensionsViewModel.kt similarity index 90% rename from app/src/main/java/com/dzeio/openhealth/ui/imports/ImportViewModel.kt rename to app/src/main/java/com/dzeio/openhealth/ui/extensions/ExtensionsViewModel.kt index 86796f6..ec14b23 100644 --- a/app/src/main/java/com/dzeio/openhealth/ui/imports/ImportViewModel.kt +++ b/app/src/main/java/com/dzeio/openhealth/ui/extensions/ExtensionsViewModel.kt @@ -1,4 +1,4 @@ -package com.dzeio.openhealth.ui.imports +package com.dzeio.openhealth.ui.extensions import androidx.lifecycle.MutableLiveData import com.dzeio.openhealth.core.BaseViewModel @@ -9,7 +9,7 @@ import javax.inject.Inject @HiltViewModel -class ImportViewModel @Inject internal constructor( +class ExtensionsViewModel @Inject internal constructor( private val weightRepository: WeightRepository ) : BaseViewModel() { diff --git a/app/src/main/java/com/dzeio/openhealth/ui/home/HomeFragment.kt b/app/src/main/java/com/dzeio/openhealth/ui/home/HomeFragment.kt index edb6a79..1b8ff51 100644 --- a/app/src/main/java/com/dzeio/openhealth/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/dzeio/openhealth/ui/home/HomeFragment.kt @@ -11,6 +11,7 @@ import android.view.View import android.view.ViewGroup import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController +import androidx.preference.PreferenceManager import com.dzeio.openhealth.Application import com.dzeio.openhealth.R import com.dzeio.openhealth.core.BaseFragment @@ -35,6 +36,7 @@ import java.text.DateFormat import java.text.SimpleDateFormat import java.util.* import kotlin.math.min +import kotlin.properties.Delegates @AndroidEntryPoint class HomeFragment : BaseFragment(HomeViewModel::class.java) { @@ -46,6 +48,8 @@ class HomeFragment : BaseFragment(HomeViewMo override val bindingInflater: (LayoutInflater, ViewGroup?, Boolean) -> FragmentHomeBinding get() = FragmentHomeBinding::inflate + private var intake by Delegates.notNull() + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -70,6 +74,11 @@ class HomeFragment : BaseFragment(HomeViewMo } } + intake = PreferenceManager.getDefaultSharedPreferences(requireContext()) + .getString("water_intake", "1200")?.toFloat() ?: 1200f + + binding.fragmentHomeWaterTotal.text = "${intake.toInt()}ml" + binding.fragmentHomeWaterRemove.setOnClickListener { _ -> val water = viewModel.water.value @@ -131,8 +140,9 @@ class HomeFragment : BaseFragment(HomeViewMo description = Description().apply { isEnabled = false } isScaleXEnabled = true setPinchZoom(false) - axisLeft.setLabelCount(0, true) + setDrawGridBackground(false) setDrawBorders(false) + axisLeft.setLabelCount(0, true) xAxis.apply { valueFormatter = object : ValueFormatter() { @@ -196,14 +206,14 @@ class HomeFragment : BaseFragment(HomeViewMo ) graph?.let { btmp -> - ValueAnimator.ofFloat(min(oldValue.toFloat(), 1200f), min(water.toFloat(), 1200f)) + ValueAnimator.ofFloat(min(oldValue.toFloat(), intake), min(water.toFloat(), intake)) .apply { duration = 300 addUpdateListener { val canvas = Canvas(btmp) DrawUtils.drawArc( canvas, - 100 * it.animatedValue as Float / 1200f, + 100 * it.animatedValue as Float / intake, MaterialColors.getColor( requireView(), com.google.android.material.R.attr.colorPrimary diff --git a/app/src/main/java/com/dzeio/openhealth/ui/home/HomeViewModel.kt b/app/src/main/java/com/dzeio/openhealth/ui/home/HomeViewModel.kt index 024ccfa..3c07b95 100644 --- a/app/src/main/java/com/dzeio/openhealth/ui/home/HomeViewModel.kt +++ b/app/src/main/java/com/dzeio/openhealth/ui/home/HomeViewModel.kt @@ -1,6 +1,5 @@ package com.dzeio.openhealth.ui.home -import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope import com.dzeio.openhealth.core.BaseViewModel @@ -9,9 +8,7 @@ import com.dzeio.openhealth.data.water.WaterRepository import com.dzeio.openhealth.data.weight.Weight import com.dzeio.openhealth.data.weight.WeightRepository import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.collectLatest -import kotlinx.coroutines.flow.flow import kotlinx.coroutines.launch import javax.inject.Inject @@ -48,6 +45,7 @@ class HomeViewModel @Inject internal constructor( waterRepository.addWater(water) } } + fun deleteWater(item: Water) { viewModelScope.launch { waterRepository.deleteWater(item) diff --git a/app/src/main/java/com/dzeio/openhealth/ui/settings/SettingsFragment.kt b/app/src/main/java/com/dzeio/openhealth/ui/settings/SettingsFragment.kt new file mode 100644 index 0000000..e2c44d0 --- /dev/null +++ b/app/src/main/java/com/dzeio/openhealth/ui/settings/SettingsFragment.kt @@ -0,0 +1,11 @@ +package com.dzeio.openhealth.ui.settings + +import android.os.Bundle +import androidx.preference.PreferenceFragmentCompat +import com.dzeio.openhealth.R + +class SettingsFragment : PreferenceFragmentCompat() { + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + setPreferencesFromResource(R.xml.preferences, rootKey) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/dzeio/openhealth/ui/water/EditWaterDialog.kt b/app/src/main/java/com/dzeio/openhealth/ui/water/EditWaterDialog.kt new file mode 100644 index 0000000..6b02880 --- /dev/null +++ b/app/src/main/java/com/dzeio/openhealth/ui/water/EditWaterDialog.kt @@ -0,0 +1,92 @@ +package com.dzeio.openhealth.ui.water + +import android.app.Dialog +import android.os.Bundle +import android.view.LayoutInflater +import android.view.MenuItem +import android.view.Window +import androidx.core.content.ContextCompat +import androidx.core.widget.doOnTextChanged +import androidx.lifecycle.lifecycleScope +import androidx.navigation.fragment.findNavController +import androidx.navigation.fragment.navArgs +import com.dzeio.openhealth.R +import com.dzeio.openhealth.core.BaseFullscreenDialog +import com.dzeio.openhealth.databinding.DialogWaterEditWaterBinding +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import dagger.hilt.android.AndroidEntryPoint + +@AndroidEntryPoint +class EditWaterDialog : + BaseFullscreenDialog(EditWaterViewModel::class.java) { + + override val bindingInflater: (LayoutInflater) -> DialogWaterEditWaterBinding = + DialogWaterEditWaterBinding::inflate + + private val args: EditWaterDialogArgs by navArgs() + + override val isFullscreenLayout = true + + var newValue: Int = 0 + + override fun onDialogInit(dialog: Dialog) { + super.onDialogInit(dialog) + + dialog.requestWindowFeature(Window.FEATURE_NO_TITLE) + } + + override fun onCreated(savedInstanceState: Bundle?) { + super.onCreated(savedInstanceState) + + viewModel.water.observe(viewLifecycleOwner) { + binding.editTextNumber.setText(it.value.toString()) + } + binding.editTextNumber.doOnTextChanged { text, start, before, count -> + newValue = text.toString().toInt() + } + + viewModel.init(args.id) + + } + + private fun save() { + val water = viewModel.water.value + water?.let { + it.value = newValue + viewModel.save(it) + } + + findNavController().popBackStack() + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + return when (item.itemId) { + R.id.menu_fullscreen_dialog_save -> { + save() + true + } + R.id.menu_fullscreen_dialog_delete -> { + MaterialAlertDialogBuilder(requireContext()) + .setTitle("Delete Water Intake?") + .setMessage("Are you sure you want to delete this water intake?") + .setPositiveButton("Yes") { _, _ -> + lifecycleScope.launchWhenStarted { + viewModel.delete() + findNavController().popBackStack() + } + } + .setIcon( + ContextCompat.getDrawable( + requireContext(), + R.drawable.ic_outline_delete_24 + ) + ) + .setNegativeButton("No") { _, _ -> } + .show() + true + } + else -> super.onOptionsItemSelected(item) + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/dzeio/openhealth/ui/water/EditWaterViewModel.kt b/app/src/main/java/com/dzeio/openhealth/ui/water/EditWaterViewModel.kt new file mode 100644 index 0000000..06630ba --- /dev/null +++ b/app/src/main/java/com/dzeio/openhealth/ui/water/EditWaterViewModel.kt @@ -0,0 +1,39 @@ +package com.dzeio.openhealth.ui.water + +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.viewModelScope +import com.dzeio.openhealth.core.BaseViewModel +import com.dzeio.openhealth.data.water.Water +import com.dzeio.openhealth.data.water.WaterRepository +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class EditWaterViewModel @Inject internal constructor( + private val waterRepository: WaterRepository +) : BaseViewModel() { + + val water: MutableLiveData = MutableLiveData() + + fun init(id: Long) { + viewModelScope.launch { + waterRepository.getWater(id).collectLatest { + water.postValue(it) + } + } + } + + fun delete() { + viewModelScope.launch { + water.value?.let { waterRepository.deleteWater(it) } + } + } + + fun save(water: Water) { + viewModelScope.launch { + waterRepository.addWater(water) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/dzeio/openhealth/ui/water/WaterHomeFragment.kt b/app/src/main/java/com/dzeio/openhealth/ui/water/WaterHomeFragment.kt index 7375c32..bd9d61b 100644 --- a/app/src/main/java/com/dzeio/openhealth/ui/water/WaterHomeFragment.kt +++ b/app/src/main/java/com/dzeio/openhealth/ui/water/WaterHomeFragment.kt @@ -1,5 +1,6 @@ package com.dzeio.openhealth.ui.water +import android.graphics.Color import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -14,8 +15,17 @@ import com.dzeio.openhealth.databinding.FragmentListWeightBinding import com.dzeio.openhealth.databinding.FragmentMainWaterHomeBinding import com.dzeio.openhealth.ui.home.HomeViewModel import com.dzeio.openhealth.ui.weight.ListWeightFragmentDirections +import com.dzeio.openhealth.utils.GraphUtils +import com.github.mikephil.charting.data.BarData +import com.github.mikephil.charting.data.BarDataSet +import com.github.mikephil.charting.data.BarEntry +import com.github.mikephil.charting.data.Entry +import com.google.android.material.color.MaterialColors import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.collectLatest +import java.time.Instant +import java.time.temporal.ChronoUnit +import java.util.* @AndroidEntryPoint class WaterHomeFragment : @@ -37,16 +47,41 @@ class WaterHomeFragment : val adapter = WaterAdapter() adapter.onItemClick = { findNavController().navigate( - ListWeightFragmentDirections.actionNavListWeightToNavEditWeight( + WaterHomeFragmentDirections.actionNavWaterHomeToNavWaterEdit( it.id ) ) - //EditWeightDialog().show(requireActivity().supportFragmentManager, "dialog") } recycler.adapter = adapter - viewModel.items.observe(viewLifecycleOwner) { - adapter.set(it) + val chart = binding.chart + + GraphUtils.barChartSetup( + chart, MaterialColors.getColor( + requireView(), + com.google.android.material.R.attr.colorPrimary + ) + ) + + + viewModel.items.observe(viewLifecycleOwner) { list -> + adapter.set(list) + + val dataset = BarDataSet( + list.map { + val epoch = Calendar.getInstance(TimeZone.getTimeZone("UTC")) + epoch.time = Date(0) + epoch.add(Calendar.MILLISECOND, it.timestamp.toInt()) + return@map BarEntry( + epoch.get(Calendar.DATE).toFloat(), + it.value.toFloat() + ) + }, + "" + ) + + chart.data = BarData(dataset) + chart.invalidate() } } } \ No newline at end of file diff --git a/app/src/main/java/com/dzeio/openhealth/ui/weight/EditWeightDialog.kt b/app/src/main/java/com/dzeio/openhealth/ui/weight/EditWeightDialog.kt index c0a6c7b..de59f88 100644 --- a/app/src/main/java/com/dzeio/openhealth/ui/weight/EditWeightDialog.kt +++ b/app/src/main/java/com/dzeio/openhealth/ui/weight/EditWeightDialog.kt @@ -36,22 +36,6 @@ class EditWeightDialog : lateinit var weight: Weight -// override fun onBuilderInit(builder: AlertDialog.Builder) { -// super.onBuilderInit(builder) -// -// builder.apply { -// setTitle("Add your weight (kg)") -// setIcon(activity?.let { ContextCompat.getDrawable(it, R.drawable.ic_outline_timeline_24) }) -// setPositiveButton("Validate") { dialog, _ -> -// save() -// } -// setNegativeButton("Cancel") { dialog, _ -> -// dialog.cancel() -// } -// -// } -// } - override fun onDialogInit(dialog: Dialog) { super.onDialogInit(dialog) diff --git a/app/src/main/java/com/dzeio/openhealth/utils/GraphUtils.kt b/app/src/main/java/com/dzeio/openhealth/utils/GraphUtils.kt new file mode 100644 index 0000000..c80c759 --- /dev/null +++ b/app/src/main/java/com/dzeio/openhealth/utils/GraphUtils.kt @@ -0,0 +1,77 @@ +package com.dzeio.openhealth.utils + +import android.graphics.Color +import com.github.mikephil.charting.charts.BarChart +import com.github.mikephil.charting.charts.BarLineChartBase +import com.github.mikephil.charting.charts.Chart +import com.github.mikephil.charting.charts.LineChart +import com.github.mikephil.charting.components.AxisBase +import com.github.mikephil.charting.components.Description +import com.github.mikephil.charting.components.XAxis +import com.github.mikephil.charting.data.BarLineScatterCandleBubbleData +import com.github.mikephil.charting.data.ChartData +import com.github.mikephil.charting.data.Entry +import com.github.mikephil.charting.data.LineData +import com.github.mikephil.charting.formatter.ValueFormatter +import com.github.mikephil.charting.interfaces.datasets.IBarLineScatterCandleBubbleDataSet +import com.github.mikephil.charting.interfaces.datasets.IDataSet +import com.google.android.material.color.MaterialColors +import java.text.SimpleDateFormat +import java.util.* + +object GraphUtils { + + fun lineChartSetup(chart: LineChart, mainColor: Int) { + barLineChartSetup(chart, mainColor) + } + + fun barChartSetup(chart: BarChart, mainColor: Int) { + barLineChartSetup(chart, mainColor) + } + + fun >?> barLineChartSetup(chart: BarLineChartBase, mainColor: Int) { + chart.apply { + + // Setup + legend.isEnabled = false + description = Description().apply { isEnabled = false } + + xAxis.apply { + valueFormatter = object : ValueFormatter() { + override fun getAxisLabel(value: Float, axis: AxisBase?): String { + return SimpleDateFormat( + "yyyy-MM-dd", + Locale.getDefault() + ).format(Date(value.toLong())) + //return super.getAxisLabel(value, axis) + } + } + position = XAxis.XAxisPosition.BOTTOM + setDrawGridLines(false) + setLabelCount(3, true) + textColor = Color.WHITE + } + + axisLeft.apply { + axisLineColor = mainColor + textColor = Color.WHITE + setLabelCount(0, true) + } + axisRight.apply { + textColor = Color.WHITE + } + setNoDataTextColor(Color.WHITE) + + + isAutoScaleMinMaxEnabled = true + legend.isEnabled = false + isDragEnabled = true + isScaleYEnabled = false + description = Description().apply { isEnabled = false } + isScaleXEnabled = true + setPinchZoom(false) + //setDrawGridBackground(false) + //setDrawBorders(false) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_baseline_extension_24.xml b/app/src/main/res/drawable/ic_baseline_extension_24.xml new file mode 100644 index 0000000..94055ba --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_extension_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_settings_24.xml b/app/src/main/res/drawable/ic_baseline_settings_24.xml new file mode 100644 index 0000000..41a82ed --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_settings_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_logo_fit.xml b/app/src/main/res/drawable/ic_logo_fit.xml new file mode 100644 index 0000000..1d5a524 --- /dev/null +++ b/app/src/main/res/drawable/ic_logo_fit.xml @@ -0,0 +1,25 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/logo_shealth.png b/app/src/main/res/drawable/logo_shealth.png new file mode 100644 index 0000000..2d85c18 Binary files /dev/null and b/app/src/main/res/drawable/logo_shealth.png differ diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 340c80d..d72280b 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -15,11 +15,14 @@ @@ -49,11 +52,4 @@ - \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_water_edit_water.xml b/app/src/main/res/layout/dialog_water_edit_water.xml new file mode 100644 index 0000000..6862567 --- /dev/null +++ b/app/src/main/res/layout/dialog_water_edit_water.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_extensions.xml b/app/src/main/res/layout/fragment_extensions.xml new file mode 100644 index 0000000..1db13a2 --- /dev/null +++ b/app/src/main/res/layout/fragment_extensions.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_import.xml b/app/src/main/res/layout/fragment_import.xml deleted file mode 100644 index f3587a8..0000000 --- a/app/src/main/res/layout/fragment_import.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - -