From fc9228d3fff02a59824a96ff11c32baf34b8b24e Mon Sep 17 00:00:00 2001 From: mohamedkaif356 Date: Mon, 7 Aug 2023 12:02:35 +0530 Subject: [PATCH] Added Adapter and Service --- app/build.gradle.kts | 7 +- app/src/main/AndroidManifest.xml | 6 +- .../sminnovations/homocube/data/Repository.kt | 29 +++++++ .../homocube/data/api/FirebaseAPI.kt | 23 ++++++ .../homocube/data/constant/Constant.kt | 6 ++ .../data/constant/HemoCubeCommands.kt | 8 ++ .../homocube/data/dao/MyDatabase.kt | 10 +++ .../homocube/data/dao/TestDao.kt | 20 +++++ .../homocube/data/model/Response.kt | 7 ++ .../homocube/data/model/TestData.kt | 10 +++ .../homocube/data/model/UserData.kt | 5 ++ .../domain/InternetConnectionLiveData.kt | 58 ++++++++++++++ .../homocube/presentation/di/AppModule.kt | 45 +++++++++++ .../presentation/services/USBService.kt | 75 +++++++++++++++++++ .../services/UsbServiceListener.kt | 6 ++ .../{ => presentation}/ui/MainActivity.kt | 2 +- .../ui/adapter/UserListAdapter.kt | 4 + .../presentation/ui/fragment/BaseFragment.kt | 23 ++++++ .../ui/fragment/KitInformationFragment.kt | 28 +++++++ .../presentation/ui/fragment/LoginFragment.kt | 31 ++++++++ .../ui/fragment/ResultFragment.kt | 31 ++++++++ .../ui/fragment/SelectTestFragment.kt | 27 +++++++ .../presentation/ui/fragment/TestFragment.kt | 32 ++++++++ .../ui/fragment/UserListFragment.kt | 43 +++++++++++ .../ui/viewmodels/MainViewModel.kt | 45 +++++++++++ app/src/main/res/layout/activity_main.xml | 2 +- .../res/layout/fragment_kit_information.xml | 14 ++++ app/src/main/res/layout/fragment_login.xml | 14 ++++ app/src/main/res/layout/fragment_result.xml | 14 ++++ .../main/res/layout/fragment_select_test.xml | 14 ++++ app/src/main/res/layout/fragment_test.xml | 14 ++++ .../main/res/layout/fragment_user_list.xml | 14 ++++ app/src/main/res/values/strings.xml | 2 + gradle/wrapper/gradle-wrapper.properties | 4 +- settings.gradle.kts | 2 +- 35 files changed, 667 insertions(+), 8 deletions(-) create mode 100644 app/src/main/java/in/sminnovations/homocube/data/Repository.kt create mode 100644 app/src/main/java/in/sminnovations/homocube/data/api/FirebaseAPI.kt create mode 100644 app/src/main/java/in/sminnovations/homocube/data/constant/Constant.kt create mode 100644 app/src/main/java/in/sminnovations/homocube/data/constant/HemoCubeCommands.kt create mode 100644 app/src/main/java/in/sminnovations/homocube/data/dao/MyDatabase.kt create mode 100644 app/src/main/java/in/sminnovations/homocube/data/dao/TestDao.kt create mode 100644 app/src/main/java/in/sminnovations/homocube/data/model/Response.kt create mode 100644 app/src/main/java/in/sminnovations/homocube/data/model/TestData.kt create mode 100644 app/src/main/java/in/sminnovations/homocube/data/model/UserData.kt create mode 100644 app/src/main/java/in/sminnovations/homocube/domain/InternetConnectionLiveData.kt create mode 100644 app/src/main/java/in/sminnovations/homocube/presentation/di/AppModule.kt create mode 100644 app/src/main/java/in/sminnovations/homocube/presentation/services/USBService.kt create mode 100644 app/src/main/java/in/sminnovations/homocube/presentation/services/UsbServiceListener.kt rename app/src/main/java/in/sminnovations/homocube/{ => presentation}/ui/MainActivity.kt (85%) create mode 100644 app/src/main/java/in/sminnovations/homocube/presentation/ui/adapter/UserListAdapter.kt create mode 100644 app/src/main/java/in/sminnovations/homocube/presentation/ui/fragment/BaseFragment.kt create mode 100644 app/src/main/java/in/sminnovations/homocube/presentation/ui/fragment/KitInformationFragment.kt create mode 100644 app/src/main/java/in/sminnovations/homocube/presentation/ui/fragment/LoginFragment.kt create mode 100644 app/src/main/java/in/sminnovations/homocube/presentation/ui/fragment/ResultFragment.kt create mode 100644 app/src/main/java/in/sminnovations/homocube/presentation/ui/fragment/SelectTestFragment.kt create mode 100644 app/src/main/java/in/sminnovations/homocube/presentation/ui/fragment/TestFragment.kt create mode 100644 app/src/main/java/in/sminnovations/homocube/presentation/ui/fragment/UserListFragment.kt create mode 100644 app/src/main/java/in/sminnovations/homocube/presentation/ui/viewmodels/MainViewModel.kt create mode 100644 app/src/main/res/layout/fragment_kit_information.xml create mode 100644 app/src/main/res/layout/fragment_login.xml create mode 100644 app/src/main/res/layout/fragment_result.xml create mode 100644 app/src/main/res/layout/fragment_select_test.xml create mode 100644 app/src/main/res/layout/fragment_test.xml create mode 100644 app/src/main/res/layout/fragment_user_list.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 31ff158..9da154a 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -9,12 +9,12 @@ plugins { android { namespace = "in.sminnovations.homocube" - compileSdk = 33 + compileSdk = 34 defaultConfig { applicationId = "in.sminnovations.homocube" minSdk = 24 - targetSdk = 33 + targetSdk = 34 versionCode = 1 versionName = "1.0" @@ -94,5 +94,8 @@ dependencies { // Barcode scanner implementation("com.journeyapps:zxing-android-embedded:4.3.0") + //USB + implementation("com.github.mik3y:usb-serial-for-android:3.5.1") + } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a12e7dc..dcda3ce 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,8 +13,12 @@ android:supportsRtl="true" android:theme="@style/Theme.HomoCube" tools:targetApi="31"> + diff --git a/app/src/main/java/in/sminnovations/homocube/data/Repository.kt b/app/src/main/java/in/sminnovations/homocube/data/Repository.kt new file mode 100644 index 0000000..d0994e4 --- /dev/null +++ b/app/src/main/java/in/sminnovations/homocube/data/Repository.kt @@ -0,0 +1,29 @@ +package `in`.sminnovations.homocube.data + +import androidx.lifecycle.LiveData +import `in`.sminnovations.homocube.data.api.FirebaseAPI +import `in`.sminnovations.homocube.data.dao.TestDao +import `in`.sminnovations.homocube.data.model.Response +import `in`.sminnovations.homocube.data.model.TestData +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class Repository @Inject constructor( + private val testDao: TestDao, + private val firebaseAPI: FirebaseAPI +) { + + val testData: LiveData> = testDao.getTestData() + suspend fun insertTestData(testData: TestData) { + testDao.insertTestData(testData) + } + + suspend fun deleteTestDataByID(id: String) { + testDao.deleteTestDataByID(id) + } + + suspend fun addTestDetails(testData: TestData): Response { + return firebaseAPI.addTestDetails(testData) + } +} \ No newline at end of file diff --git a/app/src/main/java/in/sminnovations/homocube/data/api/FirebaseAPI.kt b/app/src/main/java/in/sminnovations/homocube/data/api/FirebaseAPI.kt new file mode 100644 index 0000000..b43fc61 --- /dev/null +++ b/app/src/main/java/in/sminnovations/homocube/data/api/FirebaseAPI.kt @@ -0,0 +1,23 @@ +package `in`.sminnovations.homocube.data.api + +import com.google.firebase.firestore.ktx.firestore +import com.google.firebase.ktx.Firebase +import `in`.sminnovations.homocube.data.model.Response +import `in`.sminnovations.homocube.data.model.TestData +import kotlinx.coroutines.tasks.await + +class FirebaseAPI { + + private val patientCollection = Firebase.firestore.collection("patientData") + + suspend fun addTestDetails(testData: TestData): Response { + return try { + val documentReference = patientCollection.document() + documentReference.set(testData).await() + + Response.Success(documentReference.id) + } catch (e: Exception) { + Response.Error(e) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/in/sminnovations/homocube/data/constant/Constant.kt b/app/src/main/java/in/sminnovations/homocube/data/constant/Constant.kt new file mode 100644 index 0000000..acd4b48 --- /dev/null +++ b/app/src/main/java/in/sminnovations/homocube/data/constant/Constant.kt @@ -0,0 +1,6 @@ +package `in`.sminnovations.homocube.data.constant + +object Constant { + + const val WRITE_TIMEOUT_MILLIS = 30000 +} \ No newline at end of file diff --git a/app/src/main/java/in/sminnovations/homocube/data/constant/HemoCubeCommands.kt b/app/src/main/java/in/sminnovations/homocube/data/constant/HemoCubeCommands.kt new file mode 100644 index 0000000..c2065b9 --- /dev/null +++ b/app/src/main/java/in/sminnovations/homocube/data/constant/HemoCubeCommands.kt @@ -0,0 +1,8 @@ +package `in`.sminnovations.homocube.data.constant + +enum class HemoCubeCommands(val command: String) { + startBuffer("B\r"), + getBuffer("Q\r"), + startSample("S\r"), + getSample("R\r"), +} \ No newline at end of file diff --git a/app/src/main/java/in/sminnovations/homocube/data/dao/MyDatabase.kt b/app/src/main/java/in/sminnovations/homocube/data/dao/MyDatabase.kt new file mode 100644 index 0000000..6489ec6 --- /dev/null +++ b/app/src/main/java/in/sminnovations/homocube/data/dao/MyDatabase.kt @@ -0,0 +1,10 @@ +package `in`.sminnovations.homocube.data.dao + +import androidx.room.Database +import androidx.room.RoomDatabase +import `in`.sminnovations.homocube.data.model.TestData + +@Database(entities = [TestData::class], version = 1, exportSchema = false) +abstract class MyDatabase : RoomDatabase() { + abstract fun userDao(): TestDao +} \ No newline at end of file diff --git a/app/src/main/java/in/sminnovations/homocube/data/dao/TestDao.kt b/app/src/main/java/in/sminnovations/homocube/data/dao/TestDao.kt new file mode 100644 index 0000000..c8d6b49 --- /dev/null +++ b/app/src/main/java/in/sminnovations/homocube/data/dao/TestDao.kt @@ -0,0 +1,20 @@ +package `in`.sminnovations.homocube.data.dao + +import androidx.lifecycle.LiveData +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import `in`.sminnovations.homocube.data.model.TestData + +@Dao +interface TestDao { + @Query("SELECT * from test_table") + fun getTestData(): LiveData> + + @Insert(onConflict = OnConflictStrategy.REPLACE) + suspend fun insertTestData(testData: TestData) + + @Query("DELETE FROM test_table WHERE _id = :id") + suspend fun deleteTestDataByID(id: String) +} \ No newline at end of file diff --git a/app/src/main/java/in/sminnovations/homocube/data/model/Response.kt b/app/src/main/java/in/sminnovations/homocube/data/model/Response.kt new file mode 100644 index 0000000..b037777 --- /dev/null +++ b/app/src/main/java/in/sminnovations/homocube/data/model/Response.kt @@ -0,0 +1,7 @@ +package `in`.sminnovations.homocube.data.model + +sealed class Response { + data class Success(val data: T) : Response() + data class Error(val exception: Exception) : Response() + class Loading : Response() +} \ No newline at end of file diff --git a/app/src/main/java/in/sminnovations/homocube/data/model/TestData.kt b/app/src/main/java/in/sminnovations/homocube/data/model/TestData.kt new file mode 100644 index 0000000..ed5daf0 --- /dev/null +++ b/app/src/main/java/in/sminnovations/homocube/data/model/TestData.kt @@ -0,0 +1,10 @@ +package `in`.sminnovations.homocube.data.model + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity(tableName = "test_table") +data class TestData( + @PrimaryKey + val _id: String = "" +) diff --git a/app/src/main/java/in/sminnovations/homocube/data/model/UserData.kt b/app/src/main/java/in/sminnovations/homocube/data/model/UserData.kt new file mode 100644 index 0000000..5e76a64 --- /dev/null +++ b/app/src/main/java/in/sminnovations/homocube/data/model/UserData.kt @@ -0,0 +1,5 @@ +package `in`.sminnovations.homocube.data.model + +data class UserData ( + val _id: String = "" +) \ No newline at end of file diff --git a/app/src/main/java/in/sminnovations/homocube/domain/InternetConnectionLiveData.kt b/app/src/main/java/in/sminnovations/homocube/domain/InternetConnectionLiveData.kt new file mode 100644 index 0000000..861c770 --- /dev/null +++ b/app/src/main/java/in/sminnovations/homocube/domain/InternetConnectionLiveData.kt @@ -0,0 +1,58 @@ +package `in`.sminnovations.homocube.domain + + +import android.content.Context +import android.net.ConnectivityManager +import android.net.Network +import android.net.NetworkCapabilities +import android.net.NetworkRequest +import androidx.lifecycle.LiveData + +class NetworkStatusLiveData(context: Context) : LiveData() { + + private val connectivityManager: ConnectivityManager = + context.applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + + private val networkCallback = object : ConnectivityManager.NetworkCallback() { + override fun onAvailable(network: Network) { + postValue(true) + } + + override fun onLost(network: Network) { + postValue(false) + } + } + + override fun onActive() { + super.onActive() + postValue(isNetworkAvailable()) + registerNetworkCallback() + } + + override fun onInactive() { + super.onInactive() + unregisterNetworkCallback() + } + + private fun registerNetworkCallback() { + val networkRequest = NetworkRequest.Builder() + .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR) + .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) + .addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET) + .build() + + connectivityManager.registerNetworkCallback(networkRequest, networkCallback) + } + + private fun unregisterNetworkCallback() { + connectivityManager.unregisterNetworkCallback(networkCallback) + } + + private fun isNetworkAvailable(): Boolean { + val network = connectivityManager.activeNetwork + val networkCapabilities = connectivityManager.getNetworkCapabilities(network) + return networkCapabilities != null && + networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && + networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) + } +} \ No newline at end of file diff --git a/app/src/main/java/in/sminnovations/homocube/presentation/di/AppModule.kt b/app/src/main/java/in/sminnovations/homocube/presentation/di/AppModule.kt new file mode 100644 index 0000000..c2a3786 --- /dev/null +++ b/app/src/main/java/in/sminnovations/homocube/presentation/di/AppModule.kt @@ -0,0 +1,45 @@ +package `in`.sminnovations.homocube.presentation.di + +import android.app.Application +import android.content.Context +import androidx.room.Room +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.qualifiers.ApplicationContext +import dagger.hilt.components.SingletonComponent +import `in`.sminnovations.homocube.data.api.FirebaseAPI +import `in`.sminnovations.homocube.data.dao.MyDatabase +import `in`.sminnovations.homocube.data.dao.TestDao +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object AppModule { + + @Provides + @Singleton + fun provideMyDatabase(@ApplicationContext context: Context): MyDatabase { + return Room.databaseBuilder( + context, MyDatabase::class.java, "my_database" + ).build() + } + + @Provides + @Singleton + fun provideMyDao(myDatabase: MyDatabase): TestDao { + return myDatabase.userDao() + } + + @Provides + @Singleton + fun provideFirebaseAPI(): FirebaseAPI { + return FirebaseAPI() + } + + @Provides + @Singleton + fun provideContext(application: Application): Context { + return application.applicationContext + } +} \ No newline at end of file diff --git a/app/src/main/java/in/sminnovations/homocube/presentation/services/USBService.kt b/app/src/main/java/in/sminnovations/homocube/presentation/services/USBService.kt new file mode 100644 index 0000000..672ccd6 --- /dev/null +++ b/app/src/main/java/in/sminnovations/homocube/presentation/services/USBService.kt @@ -0,0 +1,75 @@ +package `in`.sminnovations.homocube.presentation.services + +import android.app.Service +import android.content.Intent +import android.hardware.usb.UsbDeviceConnection +import android.os.Binder +import android.os.IBinder +import com.hoho.android.usbserial.driver.UsbSerialDriver +import com.hoho.android.usbserial.driver.UsbSerialPort +import com.hoho.android.usbserial.util.SerialInputOutputManager +import `in`.sminnovations.homocube.data.constant.Constant +import `in`.sminnovations.homocube.data.constant.HemoCubeCommands +import java.io.IOException + +class USBService : Service() { + private val binder = UsbServiceBinder() + private lateinit var mPort: UsbSerialPort + private var isUsbConnected = false + + inner class UsbServiceBinder : Binder() { + fun getService(): USBService = this@USBService + } + + override fun onBind(intent: Intent): IBinder { + return binder + } + + var listener: UsbServiceListener? = null + private var bus: UsbServiceListener? = null + + fun connect(driver: UsbSerialDriver, connection: UsbDeviceConnection) { + mPort = driver.ports[0] // Most devices have just one port (port 0) + mPort.open(connection) + mPort.setParameters(115200, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE) + isUsbConnected = true + + val usbIoManager = SerialInputOutputManager(mPort, + object : SerialInputOutputManager.Listener { + override fun onNewData(data: ByteArray?) { + listener?.onUsbRead(data) + } + + override fun onRunError(e: Exception?) { + listener?.onUsbError(e) + } + + }) + usbIoManager.start() + } + + fun disconnect() { + if (isUsbConnected) { + mPort.close() + isUsbConnected = false + } + } + + fun listenToHemoCube(listener: UsbServiceListener) { + this.listener = listener + try { + + } catch (e: IOException) { + listener.onUsbError(e) + } + } + + fun sendAndListenToHemoCube(command: HemoCubeCommands, listener: UsbServiceListener) { + try { + this.bus = listener + mPort.write(command.command.toByteArray(), Constant.WRITE_TIMEOUT_MILLIS) + } catch (e: IOException) { + listener.onUsbError(e) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/in/sminnovations/homocube/presentation/services/UsbServiceListener.kt b/app/src/main/java/in/sminnovations/homocube/presentation/services/UsbServiceListener.kt new file mode 100644 index 0000000..7d9e92c --- /dev/null +++ b/app/src/main/java/in/sminnovations/homocube/presentation/services/UsbServiceListener.kt @@ -0,0 +1,6 @@ +package `in`.sminnovations.homocube.presentation.services + +interface UsbServiceListener { + fun onUsbRead(data: ByteArray?) + fun onUsbError(e: Exception?) +} \ No newline at end of file diff --git a/app/src/main/java/in/sminnovations/homocube/ui/MainActivity.kt b/app/src/main/java/in/sminnovations/homocube/presentation/ui/MainActivity.kt similarity index 85% rename from app/src/main/java/in/sminnovations/homocube/ui/MainActivity.kt rename to app/src/main/java/in/sminnovations/homocube/presentation/ui/MainActivity.kt index 077f23c..94eda22 100644 --- a/app/src/main/java/in/sminnovations/homocube/ui/MainActivity.kt +++ b/app/src/main/java/in/sminnovations/homocube/presentation/ui/MainActivity.kt @@ -1,4 +1,4 @@ -package `in`.sminnovations.homocube.ui +package `in`.sminnovations.homocube.presentation.ui import androidx.appcompat.app.AppCompatActivity import android.os.Bundle diff --git a/app/src/main/java/in/sminnovations/homocube/presentation/ui/adapter/UserListAdapter.kt b/app/src/main/java/in/sminnovations/homocube/presentation/ui/adapter/UserListAdapter.kt new file mode 100644 index 0000000..048568d --- /dev/null +++ b/app/src/main/java/in/sminnovations/homocube/presentation/ui/adapter/UserListAdapter.kt @@ -0,0 +1,4 @@ +package `in`.sminnovations.homocube.presentation.ui.adapter + +class UserListAdapter() { +} \ No newline at end of file diff --git a/app/src/main/java/in/sminnovations/homocube/presentation/ui/fragment/BaseFragment.kt b/app/src/main/java/in/sminnovations/homocube/presentation/ui/fragment/BaseFragment.kt new file mode 100644 index 0000000..525cc67 --- /dev/null +++ b/app/src/main/java/in/sminnovations/homocube/presentation/ui/fragment/BaseFragment.kt @@ -0,0 +1,23 @@ +package `in`.sminnovations.homocube.presentation.ui.fragment + +import android.view.View +import android.widget.Button +import androidx.fragment.app.Fragment + +open class BaseFragment: Fragment() { + fun hideProgressBar(view: View) { + view.visibility = View.GONE + } + + fun showProgressBar(view: View) { + view.visibility = View.VISIBLE + } + + fun markButtonDisable(button: Button) { + button.isEnabled = false + } + + fun markButtonEnable(button: Button) { + button.isEnabled = true + } +} \ No newline at end of file diff --git a/app/src/main/java/in/sminnovations/homocube/presentation/ui/fragment/KitInformationFragment.kt b/app/src/main/java/in/sminnovations/homocube/presentation/ui/fragment/KitInformationFragment.kt new file mode 100644 index 0000000..fe5b399 --- /dev/null +++ b/app/src/main/java/in/sminnovations/homocube/presentation/ui/fragment/KitInformationFragment.kt @@ -0,0 +1,28 @@ +package `in`.sminnovations.homocube.presentation.ui.fragment + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import `in`.sminnovations.homocube.databinding.FragmentUserListBinding + + +class KitInformationFragment : Fragment() { + + private var _binding: FragmentUserListBinding? = null + private val binding get() = _binding!! + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentUserListBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} \ No newline at end of file diff --git a/app/src/main/java/in/sminnovations/homocube/presentation/ui/fragment/LoginFragment.kt b/app/src/main/java/in/sminnovations/homocube/presentation/ui/fragment/LoginFragment.kt new file mode 100644 index 0000000..ad9c680 --- /dev/null +++ b/app/src/main/java/in/sminnovations/homocube/presentation/ui/fragment/LoginFragment.kt @@ -0,0 +1,31 @@ +package `in`.sminnovations.homocube.presentation.ui.fragment + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import `in`.sminnovations.homocube.databinding.FragmentLoginBinding + +class LoginFragment : Fragment() { + + private var _binding: FragmentLoginBinding? = null + private val binding get() = _binding!! + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentLoginBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} \ No newline at end of file diff --git a/app/src/main/java/in/sminnovations/homocube/presentation/ui/fragment/ResultFragment.kt b/app/src/main/java/in/sminnovations/homocube/presentation/ui/fragment/ResultFragment.kt new file mode 100644 index 0000000..42dfa9e --- /dev/null +++ b/app/src/main/java/in/sminnovations/homocube/presentation/ui/fragment/ResultFragment.kt @@ -0,0 +1,31 @@ +package `in`.sminnovations.homocube.presentation.ui.fragment + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import `in`.sminnovations.homocube.databinding.FragmentResultBinding + +class ResultFragment : Fragment() { + + private var _binding: FragmentResultBinding? = null + private val binding get() = _binding!! + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentResultBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} \ No newline at end of file diff --git a/app/src/main/java/in/sminnovations/homocube/presentation/ui/fragment/SelectTestFragment.kt b/app/src/main/java/in/sminnovations/homocube/presentation/ui/fragment/SelectTestFragment.kt new file mode 100644 index 0000000..db71c62 --- /dev/null +++ b/app/src/main/java/in/sminnovations/homocube/presentation/ui/fragment/SelectTestFragment.kt @@ -0,0 +1,27 @@ +package `in`.sminnovations.homocube.presentation.ui.fragment + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import `in`.sminnovations.homocube.databinding.FragmentSelectTestBinding + +class SelectTestFragment : Fragment() { + + private var _binding: FragmentSelectTestBinding? = null + private val binding get() = _binding!! + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentSelectTestBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} \ No newline at end of file diff --git a/app/src/main/java/in/sminnovations/homocube/presentation/ui/fragment/TestFragment.kt b/app/src/main/java/in/sminnovations/homocube/presentation/ui/fragment/TestFragment.kt new file mode 100644 index 0000000..d7b67c1 --- /dev/null +++ b/app/src/main/java/in/sminnovations/homocube/presentation/ui/fragment/TestFragment.kt @@ -0,0 +1,32 @@ +package `in`.sminnovations.homocube.presentation.ui.fragment + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import `in`.sminnovations.homocube.databinding.FragmentTestBinding + +class TestFragment : Fragment() { + + private var _binding: FragmentTestBinding? = null + private val binding get() = _binding!! + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentTestBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + +} \ No newline at end of file diff --git a/app/src/main/java/in/sminnovations/homocube/presentation/ui/fragment/UserListFragment.kt b/app/src/main/java/in/sminnovations/homocube/presentation/ui/fragment/UserListFragment.kt new file mode 100644 index 0000000..6eecebb --- /dev/null +++ b/app/src/main/java/in/sminnovations/homocube/presentation/ui/fragment/UserListFragment.kt @@ -0,0 +1,43 @@ +package `in`.sminnovations.homocube.presentation.ui.fragment + +import android.content.Context +import android.content.SharedPreferences +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import `in`.sminnovations.homocube.databinding.FragmentUserListBinding +import `in`.sminnovations.homocube.presentation.ui.adapter.UserListAdapter + +class UserListFragment : BaseFragment() { + + private var _binding: FragmentUserListBinding? = null + private val binding get() = _binding!! + + private lateinit var sharedPreference: SharedPreferences + + private val adapter = UserListAdapter() + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentUserListBinding.inflate(inflater, container, false) + sharedPreference = requireContext().getSharedPreferences("PREFERENCE_NAME", Context.MODE_PRIVATE) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + init() + } + + private fun init() { + + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} \ No newline at end of file diff --git a/app/src/main/java/in/sminnovations/homocube/presentation/ui/viewmodels/MainViewModel.kt b/app/src/main/java/in/sminnovations/homocube/presentation/ui/viewmodels/MainViewModel.kt new file mode 100644 index 0000000..a5a4ed1 --- /dev/null +++ b/app/src/main/java/in/sminnovations/homocube/presentation/ui/viewmodels/MainViewModel.kt @@ -0,0 +1,45 @@ +package `in`.sminnovations.homocube.presentation.ui.viewmodels + +import android.content.Context +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import dagger.hilt.android.lifecycle.HiltViewModel +import `in`.sminnovations.homocube.data.Repository +import `in`.sminnovations.homocube.data.model.Response +import `in`.sminnovations.homocube.data.model.TestData +import `in`.sminnovations.homocube.domain.NetworkStatusLiveData +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class MainViewModel @Inject constructor( + private val repository: Repository, + context: Context +) : ViewModel(){ + + val fireBaseUpload = MutableLiveData>() + + val allUserData = repository.testData + + fun addDataToFirebase(testData: TestData) = viewModelScope.launch { + fireBaseUpload.postValue(Response.Loading()) + repository.addTestDetails(testData).let { + fireBaseUpload.postValue(it) + } + } + + fun insertTestData(testData: TestData) = viewModelScope.launch { + repository.insertTestData(testData) + } + + fun deleteTestDataByID(userId: String) = viewModelScope.launch { + repository.deleteTestDataByID(id = userId) + } + + private val _networkStatusLiveData = NetworkStatusLiveData(context) + val networkStatusLiveData: LiveData + get() = _networkStatusLiveData + +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 14211f4..a508f7c 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".ui.MainActivity"> + tools:context=".presentation.ui.MainActivity"> + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_login.xml b/app/src/main/res/layout/fragment_login.xml new file mode 100644 index 0000000..49cb0c5 --- /dev/null +++ b/app/src/main/res/layout/fragment_login.xml @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_result.xml b/app/src/main/res/layout/fragment_result.xml new file mode 100644 index 0000000..2cc16e9 --- /dev/null +++ b/app/src/main/res/layout/fragment_result.xml @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_select_test.xml b/app/src/main/res/layout/fragment_select_test.xml new file mode 100644 index 0000000..cc7c8ed --- /dev/null +++ b/app/src/main/res/layout/fragment_select_test.xml @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_test.xml b/app/src/main/res/layout/fragment_test.xml new file mode 100644 index 0000000..7a909b7 --- /dev/null +++ b/app/src/main/res/layout/fragment_test.xml @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_user_list.xml b/app/src/main/res/layout/fragment_user_list.xml new file mode 100644 index 0000000..3e9239f --- /dev/null +++ b/app/src/main/res/layout/fragment_user_list.xml @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f26c0ec..fc99b2e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,5 @@ HomoCube + + Hello blank fragment \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index efc4d0b..a24d3ba 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Jul 31 21:35:38 IST 2023 +#Mon Aug 07 11:32:44 IST 2023 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/settings.gradle.kts b/settings.gradle.kts index d6d7165..490ea1c 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -10,9 +10,9 @@ dependencyResolutionManagement { repositories { google() mavenCentral() + maven("https://jitpack.io") } } rootProject.name = "HomoCube" include(":app") - \ No newline at end of file