Repository: hetsuthar028/Farming-App
Branch: master
Commit: 53cf61fe4158
Files: 194
Total size: 582.6 KB
Directory structure:
gitextract_bp3c7p5n/
├── .gitignore
├── .idea/
│ ├── .name
│ ├── codeStyles/
│ │ ├── Project.xml
│ │ └── codeStyleConfig.xml
│ ├── compiler.xml
│ ├── gradle.xml
│ ├── jarRepositories.xml
│ ├── misc.xml
│ ├── render.experimental.xml
│ ├── runConfigurations.xml
│ ├── shelf/
│ │ ├── Uncommitted_changes_before_Checkout_at_25-01-2021_21_36_[Default_Changelist]/
│ │ │ └── shelved.patch
│ │ ├── Uncommitted_changes_before_Checkout_at_25-01-2021_21_36__Default_Changelist_.xml
│ │ ├── Uncommitted_changes_before_Update_at_30-12-2020_21_59_[Default_Changelist]/
│ │ │ └── shelved.patch
│ │ ├── Uncommitted_changes_before_Update_at_30-12-2020_21_59_[Default_Changelist]1/
│ │ │ └── shelved.patch
│ │ └── Uncommitted_changes_before_Update_at_30-12-2020_21_59__Default_Changelist_.xml
│ └── vcs.xml
├── LICENSE
├── README.md
├── app/
│ ├── .gitignore
│ ├── build.gradle
│ ├── google-services.json
│ ├── proguard-rules.pro
│ └── src/
│ ├── androidTest/
│ │ └── java/
│ │ └── com/
│ │ └── project/
│ │ └── farmingapp/
│ │ └── ExampleInstrumentedTest.kt
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── project/
│ │ │ └── farmingapp/
│ │ │ ├── PrePaymentFragment.kt
│ │ │ ├── adapter/
│ │ │ │ ├── ApmcAdapter.kt
│ │ │ │ ├── ArticleListAdapter.kt
│ │ │ │ ├── AttributesNormalAdapter.kt
│ │ │ │ ├── AttributesSelectionAdapter.kt
│ │ │ │ ├── CartItemsAdapter.kt
│ │ │ │ ├── CurrentWeatherAdapter.kt
│ │ │ │ ├── DashboardEcomItemAdapter.kt
│ │ │ │ ├── EcommerceAdapter.kt
│ │ │ │ ├── IntroAdapter.kt
│ │ │ │ ├── MyOrdersAdapter.kt
│ │ │ │ ├── PaginationListener.kt
│ │ │ │ ├── PostListUserProfileAdapter.kt
│ │ │ │ ├── SMPostListAdapter.kt
│ │ │ │ ├── WeatherAdapter.kt
│ │ │ │ └── YojnaAdapter.kt
│ │ │ ├── model/
│ │ │ │ ├── APMCApi.kt
│ │ │ │ ├── APMCRepository.kt
│ │ │ │ ├── ArticleRepository.kt
│ │ │ │ ├── AuthRepository.kt
│ │ │ │ ├── WeatherApi.kt
│ │ │ │ ├── WeatherRepository.kt
│ │ │ │ └── data/
│ │ │ │ ├── APMCCustomRecords.kt
│ │ │ │ ├── APMCMain.kt
│ │ │ │ ├── APMCRecords.kt
│ │ │ │ ├── CartItem.kt
│ │ │ │ ├── IntroData.kt
│ │ │ │ ├── Post.kt
│ │ │ │ ├── Weather.kt
│ │ │ │ ├── WeatherList.kt
│ │ │ │ ├── WeatherMain.kt
│ │ │ │ ├── WeatherRootList.kt
│ │ │ │ ├── WeatherWind.kt
│ │ │ │ └── orders.kt
│ │ │ ├── utilities/
│ │ │ │ ├── CartItemBuy.kt
│ │ │ │ ├── CellClickListener.kt
│ │ │ │ └── ViewUtils.kt
│ │ │ ├── view/
│ │ │ │ ├── apmc/
│ │ │ │ │ └── ApmcFragment.kt
│ │ │ │ ├── articles/
│ │ │ │ │ ├── ArticleListFragment.kt
│ │ │ │ │ ├── FruitsFragment.kt
│ │ │ │ │ └── MachineFragment.kt
│ │ │ │ ├── auth/
│ │ │ │ │ ├── LoginActivity.kt
│ │ │ │ │ └── SignupActivity.kt
│ │ │ │ ├── dashboard/
│ │ │ │ │ ├── DashboardActivity.kt
│ │ │ │ │ └── DashboardFragment.kt
│ │ │ │ ├── ecommerce/
│ │ │ │ │ ├── CartFragment.kt
│ │ │ │ │ ├── EcommerceFragment.kt
│ │ │ │ │ ├── EcommerceItemFragment.kt
│ │ │ │ │ ├── MyOrdersFragment.kt
│ │ │ │ │ ├── PaymentFragment.kt
│ │ │ │ │ └── RazorPayActivity.kt
│ │ │ │ ├── introscreen/
│ │ │ │ │ └── IntroActivity.kt
│ │ │ │ ├── socialmedia/
│ │ │ │ │ ├── SMCreatePostFragment.kt
│ │ │ │ │ └── SocialMediaPostsFragment.kt
│ │ │ │ ├── user/
│ │ │ │ │ └── UserFragment.kt
│ │ │ │ ├── weather/
│ │ │ │ │ └── WeatherFragment.kt
│ │ │ │ └── yojna/
│ │ │ │ ├── YojnaFragment.kt
│ │ │ │ └── YojnaListFragment.kt
│ │ │ └── viewmodel/
│ │ │ ├── ArticleListener.kt
│ │ │ ├── ArticleViewModel.kt
│ │ │ ├── AuthListener.kt
│ │ │ ├── AuthViewModel.kt
│ │ │ ├── EcommViewModel.kt
│ │ │ ├── SocialMediaViewModel.kt
│ │ │ ├── UserDataViewModel.kt
│ │ │ ├── UserProfilePostsViewModel.kt
│ │ │ ├── WeatherListener.kt
│ │ │ ├── WeatherViewModel.kt
│ │ │ └── YojnaViewModel.kt
│ │ └── res/
│ │ ├── anim/
│ │ │ ├── fade_scale.xml
│ │ │ ├── fade_transition.xml
│ │ │ └── fade_transition_opposite.xml
│ │ ├── color/
│ │ │ └── chip_bg_states.xml
│ │ ├── drawable/
│ │ │ ├── add_icon.xml
│ │ │ ├── all_buttons.xml
│ │ │ ├── apmc_card_bg.xml
│ │ │ ├── chip_back.xml
│ │ │ ├── dash_home.xml
│ │ │ ├── ecommbackground.xml
│ │ │ ├── ecommborder.xml
│ │ │ ├── edit_back.xml
│ │ │ ├── ic__keyboard_arrow_down.xml
│ │ │ ├── ic_baseline_check_24.xml
│ │ │ ├── ic_baseline_delete_forever_24.xml
│ │ │ ├── ic_baseline_edit_24.xml
│ │ │ ├── ic_baseline_local_shipping_24.xml
│ │ │ ├── ic_baseline_photo_camera_24.xml
│ │ │ ├── ic_baseline_shopping_cart_24.xml
│ │ │ ├── ic_baseline_trending_up_24.xml
│ │ │ ├── ic_high_temp.xml
│ │ │ ├── ic_humidity.xml
│ │ │ ├── ic_launcher_background.xml
│ │ │ ├── ic_low_temp.xml
│ │ │ ├── ic_user_profile.xml
│ │ │ ├── indicator_active.xml
│ │ │ ├── indicator_inactive.xml
│ │ │ ├── minus_icon.xml
│ │ │ ├── post_border.xml
│ │ │ ├── post_logo.xml
│ │ │ ├── progress_background.xml
│ │ │ ├── round_borderless_general.xml
│ │ │ ├── rounder_border_general.xml
│ │ │ ├── table_border.xml
│ │ │ ├── table_leftbottom_border.xml
│ │ │ ├── table_lefttop_border.xml
│ │ │ ├── table_rightbottom_border.xml
│ │ │ ├── table_righttop_border.xml
│ │ │ └── weather_rcyclr_bg.xml
│ │ ├── drawable-v24/
│ │ │ └── ic_launcher_foreground.xml
│ │ ├── font/
│ │ │ ├── lato.xml
│ │ │ ├── lato_bold.xml
│ │ │ └── lato_light.xml
│ │ ├── layout/
│ │ │ ├── activity_dashboard.xml
│ │ │ ├── activity_intro.xml
│ │ │ ├── activity_login.xml
│ │ │ ├── activity_razor_pay.xml
│ │ │ ├── activity_signup.xml
│ │ │ ├── apmc_single_list.xml
│ │ │ ├── app_bar_main.xml
│ │ │ ├── article_list_single.xml
│ │ │ ├── fragment_apmc.xml
│ │ │ ├── fragment_article_list.xml
│ │ │ ├── fragment_cart.xml
│ │ │ ├── fragment_dashboard.xml
│ │ │ ├── fragment_ecommerce.xml
│ │ │ ├── fragment_ecommerce_item.xml
│ │ │ ├── fragment_fruits.xml
│ │ │ ├── fragment_machine.xml
│ │ │ ├── fragment_my_orders.xml
│ │ │ ├── fragment_payment.xml
│ │ │ ├── fragment_pre_payment.xml
│ │ │ ├── fragment_s_m_create_post.xml
│ │ │ ├── fragment_social_media_posts.xml
│ │ │ ├── fragment_user.xml
│ │ │ ├── fragment_weather.xml
│ │ │ ├── fragment_yojna.xml
│ │ │ ├── fragment_yojna_list.xml
│ │ │ ├── item_loading.xml
│ │ │ ├── nav_header.xml
│ │ │ ├── post_with_image_sm.xml
│ │ │ ├── similarproductlist.xml
│ │ │ ├── single_cart_item.xml
│ │ │ ├── single_currentweather.xml
│ │ │ ├── single_dashboard_ecomm_item.xml
│ │ │ ├── single_ecomm_item.xml
│ │ │ ├── single_myorder_item.xml
│ │ │ ├── single_normal_attributes_ecomm.xml
│ │ │ ├── single_selection_attributes_ecomm.xml
│ │ │ ├── single_slider_screen.xml
│ │ │ ├── single_weather.xml
│ │ │ ├── single_yojna_list.xml
│ │ │ └── user_profile_posts_single.xml
│ │ ├── menu/
│ │ │ ├── cart_menu.xml
│ │ │ ├── dash_menu.xml
│ │ │ └── nav_drawer_menu.xml
│ │ ├── mipmap-anydpi-v26/
│ │ │ ├── ic_launcher.xml
│ │ │ └── ic_launcher_round.xml
│ │ └── values/
│ │ ├── colors.xml
│ │ ├── font_certs.xml
│ │ ├── preloaded_fonts.xml
│ │ ├── strings.xml
│ │ └── styles.xml
│ └── test/
│ └── java/
│ └── com/
│ └── project/
│ └── farmingapp/
│ └── ExampleUnitTest.kt
├── build.gradle
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
└── settings.gradle
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
================================================
FILE: .idea/.name
================================================
Farming App
================================================
FILE: .idea/codeStyles/Project.xml
================================================
.*:id
http://schemas.android.com/apk/res/android
.*:name
http://schemas.android.com/apk/res/android
.*
http://schemas.android.com/apk/res/android
ANDROID_ATTRIBUTE_ORDER
================================================
FILE: .idea/codeStyles/codeStyleConfig.xml
================================================
================================================
FILE: .idea/compiler.xml
================================================
================================================
FILE: .idea/gradle.xml
================================================
================================================
FILE: .idea/jarRepositories.xml
================================================
================================================
FILE: .idea/misc.xml
================================================
================================================
FILE: .idea/render.experimental.xml
================================================
================================================
FILE: .idea/runConfigurations.xml
================================================
================================================
FILE: .idea/shelf/Uncommitted_changes_before_Checkout_at_25-01-2021_21_36_[Default_Changelist]/shelved.patch
================================================
Index: .idea/misc.xml
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP
<+>\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- .idea/misc.xml (revision 10b3406bcaf78db23f771ddbc45bfbe5986f0031)
+++ .idea/misc.xml (date 1611590755469)
@@ -1,6 +1,6 @@
-
+
================================================
FILE: .idea/shelf/Uncommitted_changes_before_Checkout_at_25-01-2021_21_36__Default_Changelist_.xml
================================================
================================================
FILE: .idea/shelf/Uncommitted_changes_before_Update_at_30-12-2020_21_59_[Default_Changelist]/shelved.patch
================================================
Index: app/src/main/java/com/project/farmingapp/viewmodel/AuthViewModel.kt
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP
<+>package com.project.farmingapp.viewmodel\r\n\r\nimport android.view.View\r\nimport androidx.lifecycle.ViewModel\r\nimport com.project.farmingapp.model.AuthRepository\r\n\r\nclass AuthViewModel : ViewModel() {\r\n\r\n var name: String? = null\r\n var mobNo: String? = null\r\n var email: String? = null\r\n var city: String? = null\r\n var password: String? = null\r\n var confPassword: String? = null\r\n var userType:String? = \"normal\"\r\n var authListener: AuthListener? = null\r\n\r\n fun signupButtonClicked(view: View) {\r\n authListener!!.onStarted()\r\n if (name.isNullOrEmpty() || mobNo.toString().length != 10 || mobNo == null || password.isNullOrEmpty() || confPassword.isNullOrEmpty() || city.isNullOrEmpty()) {\r\n // Failure\r\n authListener!!.onFailure(\"Error Occurred\")\r\n return\r\n }\r\n // Success\r\n var data = hashMapOf(\r\n \"name\" to name,\r\n \"mobNo\" to mobNo,\r\n \"email\" to email,\r\n \"city\" to city,\r\n \"userType\" to userType\r\n )\r\n val authRepo = AuthRepository().signInWithEmail(email!!, password!!, data)\r\n\r\n authListener?.onSuccess(authRepo)\r\n\r\n }\r\n\r\n fun googleSignupButtonClicked(view: View) {\r\n //\r\n\r\n// val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)\r\n// .requestIdToken(getString(R.string.default_web_client_id))\r\n// .requestEmail()\r\n// .build()\r\n// googleSignInClient = GoogleSignIn.getClient(this, gso)\r\n\r\n\r\n }\r\n\r\n\r\n}
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- app/src/main/java/com/project/farmingapp/viewmodel/AuthViewModel.kt (revision d0dcb8b4662cad8592336090eac9f8e56ae7147e)
+++ app/src/main/java/com/project/farmingapp/viewmodel/AuthViewModel.kt (date 1609342945111)
@@ -15,6 +15,9 @@
var userType:String? = "normal"
var authListener: AuthListener? = null
+ var loginmail:String?=null
+ var loginpwd:String?=null
+
fun signupButtonClicked(view: View) {
authListener!!.onStarted()
if (name.isNullOrEmpty() || mobNo.toString().length != 10 || mobNo == null || password.isNullOrEmpty() || confPassword.isNullOrEmpty() || city.isNullOrEmpty()) {
@@ -48,5 +51,20 @@
}
+//bharat try new2
+
+ fun loginButtonClicked(view: View) {
+ authListener!!.onStarted()
+ if (loginmail.isNullOrEmpty() || loginpwd.isNullOrEmpty()) {
+ // Failure
+ authListener!!.onFailure("Error Occurred")
+ return
+ }
+ // Success
+ val authRepo = AuthRepository().loginWithEmail(loginmail!!, loginpwd!!)
+
+ authListener?.onSuccess(authRepo)
+
+ }
}
\ No newline at end of file
Index: app/src/main/AndroidManifest.xml
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP
<+>\r\n\r\n\r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- app/src/main/AndroidManifest.xml (revision d0dcb8b4662cad8592336090eac9f8e56ae7147e)
+++ app/src/main/AndroidManifest.xml (date 1609342664080)
@@ -11,13 +11,15 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
-
-
+
+
+
+
+
+
-
-
-
-
+
+
Index: app/src/main/java/com/project/farmingapp/view/auth/LoginActivity.kt
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP
<+>package com.project.farmingapp.view.auth\r\n\r\nimport android.content.Intent\r\nimport androidx.appcompat.app.AppCompatActivity\r\nimport android.os.Bundle\r\nimport com.project.farmingapp.R\r\nimport kotlinx.android.synthetic.main.activity_login.*\r\n\r\nclass LoginActivity : AppCompatActivity() {\r\n override fun onCreate(savedInstanceState: Bundle?) {\r\n super.onCreate(savedInstanceState)\r\n setContentView(R.layout.activity_login)\r\n\r\n createaccountText.setOnClickListener {\r\n Intent(this, SignupActivity::class.java).also {\r\n startActivity(it)\r\n }\r\n }\r\n\r\n }\r\n}
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- app/src/main/java/com/project/farmingapp/view/auth/LoginActivity.kt (revision d0dcb8b4662cad8592336090eac9f8e56ae7147e)
+++ app/src/main/java/com/project/farmingapp/view/auth/LoginActivity.kt (date 1609343274046)
@@ -3,13 +3,32 @@
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
+import androidx.databinding.DataBindingUtil
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.Observer
+import androidx.lifecycle.ViewModelProviders
import com.project.farmingapp.R
+import com.project.farmingapp.databinding.ActivityLoginBinding
+import com.project.farmingapp.databinding.ActivitySignupBinding
+import com.project.farmingapp.utilities.hide
+import com.project.farmingapp.utilities.show
+import com.project.farmingapp.utilities.toast
+import com.project.farmingapp.viewmodel.AuthListener
+import com.project.farmingapp.viewmodel.AuthViewModel
import kotlinx.android.synthetic.main.activity_login.*
+import kotlinx.android.synthetic.main.activity_signup.*
-class LoginActivity : AppCompatActivity() {
+class LoginActivity : AppCompatActivity(),AuthListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_login)
+
+
+ val binding: ActivityLoginBinding =
+ DataBindingUtil.setContentView(this, R.layout.activity_login)
+ val viewModel = ViewModelProviders.of(this).get(AuthViewModel::class.java)
+ binding.authViewModel = viewModel
+
+ viewModel.authListener = this
createaccountText.setOnClickListener {
Intent(this, SignupActivity::class.java).also {
@@ -18,4 +37,22 @@
}
}
+
+ override fun onStarted() {
+ progressLogin.show()
+ }
+
+ override fun onSuccess(authRepo: LiveData) {
+ authRepo.observe(this, Observer {
+ progressLogin.hide()
+ if (it.toString() == "Success") {
+ toast("Login successful")
+ }
+ })
+ }
+
+ override fun onFailure(message: String) {
+ progressLogin.hide()
+ toast("Failure")
+ }
}
\ No newline at end of file
Index: app/src/main/java/com/project/farmingapp/model/AuthRepository.kt
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP
<+>package com.project.farmingapp.model\r\n\r\nimport android.content.Intent\r\nimport android.util.Log\r\nimport android.widget.Toast\r\nimport androidx.lifecycle.LiveData\r\nimport androidx.lifecycle.MutableLiveData\r\nimport com.google.android.gms.auth.api.signin.GoogleSignInClient\r\nimport com.google.firebase.auth.FirebaseAuth\r\nimport com.google.firebase.firestore.FirebaseFirestore\r\n\r\nclass AuthRepository {\r\n\r\n lateinit var googleSignInClient: GoogleSignInClient\r\n val firebaseAuth = FirebaseAuth.getInstance()\r\n lateinit var firebaseDb: FirebaseFirestore\r\n fun signInWithEmail(email: String, password: String, otherData: HashMap): LiveData {\r\n\r\n firebaseDb = FirebaseFirestore.getInstance()\r\n val data = MutableLiveData()\r\n val data2 = MutableLiveData()\r\n firebaseAuth.createUserWithEmailAndPassword(email, password).addOnCompleteListener {\r\n if (it.isSuccessful) {\r\n\r\n// Log.d(\"AuthRepo\", it.result!!.additionalUserInfo.toString())\r\n// Log.d(\"AuthRepo2\", data.value)\r\n\r\n firebaseDb!!.collection(\"users\").document(\"${email}\")\r\n .set(otherData)\r\n .addOnSuccessListener {\r\n data.value = \"Success\"\r\n// Toast.makeText(this, \"Data added\", Toast.LENGTH_SHORT).show()\r\n// Intent(this, LoginActivity::class.java).also {\r\n// startActivity(it)\r\n// }\r\n// data2.value = \"Success\"\r\n }\r\n .addOnFailureListener { Exception ->\r\n {\r\n data.value = \"Failure\"\r\n// data2.value = \"Failure\"\r\n// Toast.makeText(this, \"Error: ${Exception}\", Toast.LENGTH_SHORT).show()\r\n }\r\n }\r\n\r\n } else if (it.isCanceled) {\r\n\r\n }\r\n\r\n }.addOnFailureListener {\r\n Log.d(\"AuthRepo\", it.message)\r\n data.value = it.message\r\n }\r\n\r\n return data\r\n }\r\n\r\n fun signInGoogle(){\r\n\r\n// val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)\r\n// .requestIdToken(getString(R.string.default_web_client_id))\r\n// .requestEmail()\r\n// .build()\r\n// googleSignInClient = GoogleSignIn.getClient(this, gso)\r\n\r\n }\r\n\r\n}
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- app/src/main/java/com/project/farmingapp/model/AuthRepository.kt (revision d0dcb8b4662cad8592336090eac9f8e56ae7147e)
+++ app/src/main/java/com/project/farmingapp/model/AuthRepository.kt (date 1609345661739)
@@ -65,4 +65,31 @@
}
+
+ //bharat try new code here
+ fun loginWithEmail(email: String, password: String): LiveData {
+
+ firebaseDb = FirebaseFirestore.getInstance()
+ val data = MutableLiveData()
+ firebaseAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener {
+ if (it.isSuccessful) {
+ data.value="Success"
+
+// Log.d("AuthRepo", it.result!!.additionalUserInfo.toString())
+// Log.d("AuthRepo2", data.value)
+
+
+ } else if (it.isCanceled) {
+
+ }
+
+ }.addOnFailureListener {
+ Log.d("AuthRepo", it.message)
+ data.value = it.message
+ }
+
+ return data
+ }
+
+
}
\ No newline at end of file
Index: app/src/main/res/layout/activity_login.xml
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP
<+>\r\n\r\n\r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n\r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n\r\n\r\n \r\n\r\n \r\n\r\n \r\n\r\n \r\n \" />\r\n\r\n \r\n \r\n \r\n\r\n
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- app/src/main/res/layout/activity_login.xml (revision d0dcb8b4662cad8592336090eac9f8e56ae7147e)
+++ app/src/main/res/layout/activity_login.xml (date 1609342862034)
@@ -69,6 +69,7 @@
app:layout_constraintVertical_bias="0.0">
-
+
\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- .idea/jarRepositories.xml (revision d0dcb8b4662cad8592336090eac9f8e56ae7147e)
+++ .idea/jarRepositories.xml (date 1609303744590)
@@ -21,5 +21,10 @@
+
+
+
+
+
\ No newline at end of file
Index: .idea/gradle.xml
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP
<+>\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- .idea/gradle.xml (revision d0dcb8b4662cad8592336090eac9f8e56ae7147e)
+++ .idea/gradle.xml (date 1609303744597)
@@ -15,6 +15,7 @@
+
Index: build.gradle
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP
<+>// Top-level build file where you can add configuration options common to all sub-projects/modules.\r\nbuildscript {\r\n ext.kotlin_version = \"1.3.72\"\r\n repositories {\r\n google()\r\n jcenter()\r\n }\r\n dependencies {\r\n\r\n classpath \"com.android.tools.build:gradle:4.0.1\"\r\n classpath \"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version\"\r\n\r\n // NOTE: Do not place your application dependencies here; they belong\r\n classpath 'com.google.gms:google-services:4.3.4'\r\n // in the individual module build.gradle files\r\n classpath \"androidx.navigation:navigation-safe-args-gradle-plugin:2.1.0-alpha05\"\r\n }\r\n}\r\n\r\nallprojects {\r\n repositories {\r\n google()\r\n jcenter()\r\n }\r\n}\r\n\r\ntask clean(type: Delete) {\r\n delete rootProject.buildDir\r\n}
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- build.gradle (revision d0dcb8b4662cad8592336090eac9f8e56ae7147e)
+++ build.gradle (date 1609303727423)
@@ -21,6 +21,7 @@
repositories {
google()
jcenter()
+
}
}
Index: .idea/misc.xml
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP
<+>\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- .idea/misc.xml (revision d0dcb8b4662cad8592336090eac9f8e56ae7147e)
+++ .idea/misc.xml (date 1609303801213)
@@ -1,6 +1,6 @@
-
+
Index: app/build.gradle
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP
<+>apply plugin: 'com.android.application'\r\napply plugin: 'kotlin-android'\r\napply plugin: 'kotlin-android-extensions'\r\napply plugin: 'kotlin-kapt'\r\napply plugin: \"androidx.navigation.safeargs\"\r\napply plugin: 'com.google.gms.google-services'\r\n\r\n\r\nandroid {\r\n compileSdkVersion 29\r\n buildToolsVersion \"29.0.2\"\r\n\r\n defaultConfig {\r\n applicationId \"com.project.farmingapp\"\r\n minSdkVersion 21\r\n targetSdkVersion 29\r\n versionCode 1\r\n versionName \"1.0\"\r\n\r\n testInstrumentationRunner \"androidx.test.runner.AndroidJUnitRunner\"\r\n }\r\n\r\n buildTypes {\r\n release {\r\n minifyEnabled false\r\n proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'\r\n }\r\n }\r\n dataBinding {\r\n enabled = true\r\n }\r\n}\r\n\r\ndependencies {\r\n\r\n\r\n implementation fileTree(dir: \"libs\", include: [\"*.jar\"])\r\n implementation \"org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version\"\r\n implementation 'androidx.core:core-ktx:1.3.2'\r\n implementation 'androidx.appcompat:appcompat:1.2.0'\r\n implementation 'androidx.constraintlayout:constraintlayout:2.0.4'\r\n implementation 'com.google.android.gms:play-services-auth:19.0.0'\r\n implementation 'com.google.firebase:firebase-auth:16.0.5'\r\n testImplementation 'junit:junit:4.12'\r\n androidTestImplementation 'androidx.test.ext:junit:1.1.2'\r\n androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'\r\n\r\n\r\n // retrofit and GSON\r\n implementation 'com.squareup.retrofit2:retrofit:2.6.0'\r\n implementation 'com.squareup.retrofit2:converter-gson:2.6.0'\r\n\r\n // Kotlin coroutines\r\n implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.1.1'\r\n implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.1'\r\n\r\n // ViewModel and LiveData\r\n implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'\r\n\r\n\r\n// New Material Design\r\n implementation 'com.google.android.material:material:1.1.0-alpha07'\r\n\r\n // Kodein Dependency Injection\r\n implementation 'org.kodein.di:kodein-di-generic-jvm:6.2.1'\r\n implementation 'org.kodein.di:kodein-di-framework-android-x:6.2.1'\r\n\r\n // Android Room\r\n implementation 'androidx.room:room-runtime:2.1.0-rc01'\r\n implementation 'androidx.room:room-ktx:2.1.0-rc01'\r\n kapt 'androidx.room:room-compiler:2.1.0-rc01'\r\n\r\n// Android Navigation Architecture\r\n implementation 'androidx.navigation:navigation-fragment-ktx:2.1.0-alpha05'\r\n implementation 'androidx.navigation:navigation-ui-ktx:2.1.0-alpha05'\r\n\r\n implementation platform('com.google.firebase:firebase-bom:26.2.0')\r\n implementation 'com.google.firebase:firebase-firestore:21.5.0'\r\n implementation 'com.google.firebase:firebase-storage:19.1.1'\r\n implementation 'com.google.android.gms:play-services-auth:19.0.0'\r\n}\r\n
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- app/build.gradle (revision d0dcb8b4662cad8592336090eac9f8e56ae7147e)
+++ app/build.gradle (date 1609327434558)
@@ -41,6 +41,7 @@
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'com.google.android.gms:play-services-auth:19.0.0'
implementation 'com.google.firebase:firebase-auth:16.0.5'
+ implementation 'com.google.firebase:firebase-firestore-ktx:22.0.1'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
================================================
FILE: .idea/shelf/Uncommitted_changes_before_Update_at_30-12-2020_21_59_[Default_Changelist]1/shelved.patch
================================================
================================================
FILE: .idea/shelf/Uncommitted_changes_before_Update_at_30-12-2020_21_59__Default_Changelist_.xml
================================================
================================================
FILE: .idea/vcs.xml
================================================
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2021 Het Suthar
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
# 👨🌾 Agri India - One stop application for Indian Farmers
✒️ This is an Android Application designed for our Indian farmers.
✒️ The technology has become a part and parcel of everyone's life and it is also helping us to make our daily tasks easy.
We identified that in the Agriculture sector, the farmers are still lacking the best technology use cases.
✒️ There are thousands of applications in the markets for farmers but they only provide the limited features.
✒️ The main reason for creating this application was to combine every possible feature into the single app. This will remove the burden of managing multiple account and apps for farmers.
The application is also designed in such a way that it will be easy to use.
## ✨ Features:
- Government Yojna Awareness
- E-commerce Platform
- Daily APMC Price Updates
- Community Network (Social Media)
- Reading articles based on categories
- Weather Forecasting
## 📱 Technologies / Tools used for building this app includes:
| Android Studio | Firebase | Kotlin | External APIs | Android OS |
| --- | --- | --- | --- | --- |
## 🤩 Designs:
## 😀 If you liked the app, Please give it a ⭐ and fork the repository. 🤚🏻
================================================
FILE: app/.gitignore
================================================
/build
================================================
FILE: app/build.gradle
================================================
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
apply plugin: "androidx.navigation.safeargs"
apply plugin: 'com.google.gms.google-services'
repositories {
mavenCentral()
flatDir {
dirs 'libs'
}
}
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
compileSdkVersion 29
buildToolsVersion "29.0.2"
defaultConfig {
applicationId "com.project.farmingapp"
minSdkVersion 21
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
dataBinding {
enabled = true
}
}
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.3.2'
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'com.google.android.gms:play-services-auth:19.0.0'
implementation 'com.google.firebase:firebase-auth:16.0.5'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
// retrofit and GSON
implementation 'com.squareup.retrofit2:retrofit:2.6.0'
implementation 'com.squareup.retrofit2:converter-gson:2.6.0'
// Kotlin coroutines
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.1.1'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.1'
// ViewModel and LiveData
implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'
//Location
implementation 'com.google.android.gms:play-services-location:18.0.0'
// New Material Design
implementation 'com.google.android.material:material:1.1.0-alpha07'
// Kodein Dependency Injection
implementation 'org.kodein.di:kodein-di-generic-jvm:6.2.1'
implementation 'org.kodein.di:kodein-di-framework-android-x:6.2.1'
// Android Room
implementation 'androidx.room:room-runtime:2.1.0-rc01'
implementation 'androidx.room:room-ktx:2.1.0-rc01'
kapt 'androidx.room:room-compiler:2.1.0-rc01'
// Android Navigation Architecture
implementation 'androidx.navigation:navigation-fragment-ktx:2.1.0-alpha05'
implementation 'androidx.navigation:navigation-ui-ktx:2.1.0-alpha05'
implementation platform('com.google.firebase:firebase-bom:26.2.0')
implementation 'com.google.firebase:firebase-firestore:21.5.0'
implementation 'com.google.firebase:firebase-storage:19.1.1'
implementation 'com.google.android.gms:play-services-auth:19.0.0'
//Picasso
implementation 'com.squareup.picasso:picasso:2.71828'
//Glide
implementation 'com.github.bumptech.glide:glide:4.11.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
implementation 'com.littlemango:stacklayoutmanager:1.0.5'
implementation 'com.azoft.carousellayoutmanager:carousel:1.4.4'
implementation "com.jakewharton:butterknife:10.1.0"
annotationProcessor "com.jakewharton:butterknife-compiler:10.1.0"
//carossal
implementation 'com.github.mohan-dev1248:PosterSlider:1.0.2'
//Realtime
implementation 'com.google.firebase:firebase-database-ktx'
//RazorPay
implementation 'com.razorpay:checkout:1.5.16'
}
================================================
FILE: app/google-services.json
================================================
{
"project_info": {
"project_number": "1089918384238",
"project_id": "farming-app-2fc2a",
"storage_bucket": "farming-app-2fc2a.appspot.com"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:1089918384238:android:4c17926368f206dcd48e7f",
"android_client_info": {
"package_name": "com.project.farmingapp"
}
},
"oauth_client": [
{
"client_id": "1089918384238-fiogt24o945tpa23267nhvapi7jic8jj.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyAm2wobnn3z6sp6QD5uMcmlQMm2MzXTLgE"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "1089918384238-fiogt24o945tpa23267nhvapi7jic8jj.apps.googleusercontent.com",
"client_type": 3
}
]
}
}
}
],
"configuration_version": "1"
}
================================================
FILE: app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
================================================
FILE: app/src/androidTest/java/com/project/farmingapp/ExampleInstrumentedTest.kt
================================================
package com.project.farmingapp
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.Assert.*
/**
* Instrumented test, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@Test
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("com.project.farmingapp", appContext.packageName)
}
}
================================================
FILE: app/src/main/AndroidManifest.xml
================================================
================================================
FILE: app/src/main/java/com/project/farmingapp/PrePaymentFragment.kt
================================================
package com.project.farmingapp
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import com.project.farmingapp.view.ecommerce.RazorPayActivity
import com.razorpay.Checkout
import com.razorpay.PaymentResultListener
import kotlinx.android.synthetic.main.fragment_pre_payment.*
import org.json.JSONObject
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"
/**
* A simple [Fragment] subclass.
* Use the [PrePaymentFragment.newInstance] factory method to
* create an instance of this fragment.
*/
class PrePaymentFragment : Fragment() {
// TODO: Rename and change types of parameters
private var param1: String? = null
private var param2: String? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
param1 = it.getString(ARG_PARAM1)
param2 = it.getString(ARG_PARAM2)
}
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_pre_payment, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
}
companion object {
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment PrePaymentFragment.
*/
// TODO: Rename and change types and number of parameters
@JvmStatic
fun newInstance(param1: String, param2: String) =
PrePaymentFragment().apply {
arguments = Bundle().apply {
putString(ARG_PARAM1, param1)
putString(ARG_PARAM2, param2)
}
}
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/adapter/ApmcAdapter.kt
================================================
package com.project.farmingapp.adapter
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.project.farmingapp.R
import com.project.farmingapp.model.data.APMCCustomRecords
import com.project.farmingapp.model.data.APMCMain
import com.project.farmingapp.model.data.APMCRecords
class ApmcAdapter(val context: Context, val data: List) :
RecyclerView.Adapter() {
class ApmcViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var market = itemView.findViewById(R.id.apmcNameValue)
var location = itemView.findViewById(R.id.apmcLocationValue)
var commodity = itemView.findViewById(R.id.comodityname)
var min = itemView.findViewById(R.id.minvalue)
var max = itemView.findViewById(R.id.maxvalue)
// var modal=itemView.findViewById(R.id.modalValueTextApmc)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ApmcViewHolder {
val view = LayoutInflater.from(context).inflate(R.layout.apmc_single_list, parent, false)
return ApmcViewHolder(view)
}
override fun getItemCount(): Int {
return data.size
}
override fun onBindViewHolder(holder: ApmcViewHolder, position: Int) {
val mainData = data[position]
holder.market.text = mainData.market
holder.location.text = mainData.district + " , " + mainData.state
for (i in mainData.commodity) {
holder.commodity.text = holder.commodity.text .toString()+ i + "\n"
}
holder.commodity.text = holder.commodity.text.toString().trimEnd()
for (i in mainData.min_price){
holder.min.text = holder.min.text.toString() + i + "\n"
}
holder.min.text = holder.min.text.toString().trimEnd()
for(i in mainData.max_price){
holder.max.text = holder.max.text.toString() + i + "\n"
}
holder.max.text = holder.max.text.toString().trimEnd()
// holder.modal.text=mainData.modal_price
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/adapter/ArticleListAdapter.kt
================================================
package com.project.farmingapp.adapter
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.AbsListView
import android.widget.AdapterView
import android.widget.ImageView
import android.widget.TextView
import androidx.cardview.widget.CardView
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.bumptech.glide.request.RequestOptions
import com.google.firebase.firestore.DocumentSnapshot
import com.project.farmingapp.R
import com.project.farmingapp.model.data.WeatherList
import com.project.farmingapp.utilities.CellClickListener
import org.kodein.di.android.androidCoreContextTranslators
import kotlin.math.round
class ArticleListAdapter(val context: Context, val articleListData: List, private val cellClickListener: CellClickListener): RecyclerView.Adapter() {
class ArticleListViewholder(itemView: View): RecyclerView.ViewHolder(itemView){
var articleName = itemView.findViewById(R.id.descTextxArticleListFrag)
var articleImage = itemView.findViewById(R.id.imageArticleListFrag)
var articleCard = itemView.findViewById(R.id.articleListCardArtListFrag)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ArticleListViewholder {
val view = LayoutInflater.from(context).inflate(R.layout.article_list_single, parent, false)
return ArticleListAdapter.ArticleListViewholder(view)
}
override fun getItemCount(): Int {
return articleListData.size
}
override fun onBindViewHolder(holder: ArticleListViewholder, position: Int) {
val singleArticle = articleListData[position]
holder.articleName.text = singleArticle.data!!.get("title").toString()
holder.articleCard.setOnClickListener {
cellClickListener.onCellClickListener(singleArticle.data!!.get("title").toString())
}
var list : List = singleArticle.data!!.get("images") as List
Glide.with(holder.itemView.context)
.load(list[0])
// .apply(RequestOptions.bitmapTransform(
// RoundedCorners(20)
// ))
.into(holder.articleImage)
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/adapter/AttributesNormalAdapter.kt
================================================
package com.project.farmingapp.adapter
import android.content.Context
import android.text.Layout
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.project.farmingapp.R
import kotlinx.android.synthetic.main.single_normal_attributes_ecomm.view.*
class AttributesNormalAdapter(val context: Context, val allData : List>): RecyclerView.Adapter() {
class AttributesNormalViewHolder(itemView: View): RecyclerView.ViewHolder(itemView){
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AttributesNormalViewHolder {
val view = LayoutInflater.from(context).inflate(R.layout.single_normal_attributes_ecomm, parent, false)
return AttributesNormalAdapter.AttributesNormalViewHolder(view)
}
override fun getItemCount(): Int {
return allData.size
}
override fun onBindViewHolder(holder: AttributesNormalViewHolder, position: Int) {
val currentData = allData[position]
for((key, value) in currentData){
holder.itemView.normalAttributeTitle.text = key.toString() + " - "
holder.itemView.normalAttributeValue.text = value.toString()
}
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/adapter/AttributesSelectionAdapter.kt
================================================
package com.project.farmingapp.adapter
import android.content.Context
import android.graphics.Color
import android.graphics.Typeface
import android.text.style.TypefaceSpan
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.recyclerview.widget.RecyclerView
import com.project.farmingapp.R
import com.project.farmingapp.utilities.CellClickListener
import kotlinx.android.synthetic.main.single_selection_attributes_ecomm.view.*
class AttributesSelectionAdapter(var context: Context, var allData: List>, private val cellClickListener: CellClickListener): RecyclerView.Adapter() {
class AttributesSelectionViewHolder(itemView: View): RecyclerView.ViewHolder(itemView){
}
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int
): AttributesSelectionViewHolder {
val view = LayoutInflater.from(context).inflate(R.layout.single_selection_attributes_ecomm, parent, false)
return AttributesSelectionAdapter.AttributesSelectionViewHolder(view)
}
override fun getItemCount(): Int {
return allData.size
}
override fun onBindViewHolder(holder: AttributesSelectionViewHolder, position: Int) {
val currentData = allData[position] as Map
for ((key, values) in currentData){
cellClickListener.onCellClickListener("1 ${key}")
holder.itemView.attributeTitle.text = key
var allValues = values as ArrayList
var currentValue = allValues[0].toString().split(" ")
holder.itemView.attribute1.text = currentValue[0].toString()
holder.itemView.attribute1Price.text = currentValue[1].toString()
currentValue = allValues[1].toString().split(" ")
holder.itemView.attribute2.text = currentValue[0].toString()
holder.itemView.attribute2Price.text = currentValue[1].toString()
currentValue = allValues[2].toString().split(" ")
holder.itemView.attribute3.text = currentValue[0].toString()
holder.itemView.attribute3Price.text = currentValue[1].toString()
// holder.itemView.attribute1.text = currentValue[0].toString()
// holder.itemView.attribute1Price.text = currentValue[1].toString()
holder.itemView.cardSize1.setOnClickListener {
cellClickListener.onCellClickListener("1 ${key}")
Toast.makeText(context, "You Clicked 1", Toast.LENGTH_SHORT).show()
holder.itemView.cardSize1.backgroundTintList = context.getResources().getColorStateList(R.color.colorPrimary)
holder.itemView.attribute1.setTextColor(Color.parseColor("#FFFFFF"))
holder.itemView.attribute1Price.setTextColor(Color.parseColor("#FFFFFF"))
holder.itemView.attribute1.setTypeface(null, Typeface.BOLD)
holder.itemView.attribute1Price.setTypeface(null, Typeface.BOLD)
holder.itemView.cardSize2.backgroundTintList = context.getResources().getColorStateList(R.color.secondary)
holder.itemView.attribute2.setTextColor(Color.parseColor("#FF404A3A"))
holder.itemView.attribute2Price.setTextColor(Color.parseColor("#FF404A3A"))
holder.itemView.attribute2.setTypeface(null, Typeface.NORMAL)
holder.itemView.attribute2Price.setTypeface(null, Typeface.NORMAL)
holder.itemView.cardSize3.backgroundTintList = context.getResources().getColorStateList(R.color.secondary)
holder.itemView.attribute3.setTextColor(Color.parseColor("#FF404A3A"))
holder.itemView.attribute3Price.setTextColor(Color.parseColor("#FF404A3A"))
holder.itemView.attribute3.setTypeface(null, Typeface.NORMAL)
holder.itemView.attribute3Price.setTypeface(null, Typeface.NORMAL)
}
holder.itemView.cardSize2.setOnClickListener {
cellClickListener.onCellClickListener("2 ${key}")
holder.itemView.cardSize2.backgroundTintList = context.getResources().getColorStateList(R.color.colorPrimary)
holder.itemView.attribute2.setTextColor(Color.parseColor("#FFFFFF"))
holder.itemView.attribute2Price.setTextColor(Color.parseColor("#FFFFFF"))
holder.itemView.attribute2.setTypeface(null, Typeface.BOLD)
holder.itemView.attribute2Price.setTypeface(null, Typeface.BOLD)
holder.itemView.cardSize3.backgroundTintList = context.getResources().getColorStateList(R.color.secondary)
holder.itemView.attribute3.setTextColor(Color.parseColor("#FF404A3A"))
holder.itemView.attribute3Price.setTextColor(Color.parseColor("#FF404A3A"))
holder.itemView.attribute3.setTypeface(null, Typeface.NORMAL)
holder.itemView.attribute3Price.setTypeface(null, Typeface.NORMAL)
holder.itemView.cardSize1.backgroundTintList = context.getResources().getColorStateList(R.color.secondary)
holder.itemView.attribute1.setTextColor(Color.parseColor("#FF404A3A"))
holder.itemView.attribute1Price.setTextColor(Color.parseColor("#FF404A3A"))
holder.itemView.attribute1.setTypeface(null, Typeface.NORMAL)
holder.itemView.attribute1Price.setTypeface(null, Typeface.NORMAL)
Toast.makeText(context, "You Clicked 2", Toast.LENGTH_SHORT).show()
}
holder.itemView.cardSize3.setOnClickListener {
cellClickListener.onCellClickListener("3 ${key}")
Toast.makeText(context, "You Clicked 3", Toast.LENGTH_SHORT).show()
holder.itemView.cardSize3.backgroundTintList = context.getResources().getColorStateList(R.color.colorPrimary)
holder.itemView.attribute3.setTextColor(Color.parseColor("#FFFFFF"))
holder.itemView.attribute3Price.setTextColor(Color.parseColor("#FFFFFF"))
holder.itemView.attribute3.setTypeface(null, Typeface.BOLD)
holder.itemView.attribute3Price.setTypeface(null, Typeface.BOLD)
holder.itemView.cardSize1.backgroundTintList = context.getResources().getColorStateList(R.color.secondary)
holder.itemView.attribute1.setTextColor(Color.parseColor("#FF404A3A"))
holder.itemView.attribute1Price.setTextColor(Color.parseColor("#FF404A3A"))
holder.itemView.attribute1.setTypeface(null, Typeface.NORMAL)
holder.itemView.attribute1Price.setTypeface(null, Typeface.NORMAL)
holder.itemView.cardSize2.backgroundTintList = context.getResources().getColorStateList(R.color.secondary)
holder.itemView.attribute2.setTextColor(Color.parseColor("#FF404A3A"))
holder.itemView.attribute2Price.setTextColor(Color.parseColor("#FF404A3A"))
holder.itemView.attribute2.setTypeface(null, Typeface.NORMAL)
holder.itemView.attribute2Price.setTypeface(null, Typeface.NORMAL)
}
}
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/adapter/CartItemsAdapter.kt
================================================
package com.project.farmingapp.adapter
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.database.FirebaseDatabase
import com.google.firebase.firestore.FirebaseFirestore
import com.project.farmingapp.R
import com.project.farmingapp.utilities.CartItemBuy
import com.project.farmingapp.view.ecommerce.CartFragment
import com.project.farmingapp.viewmodel.EcommViewModel
import kotlinx.android.synthetic.main.single_cart_item.view.*
class CartItemsAdapter(
val context: CartFragment,
val allData: HashMap,
val cartitembuy: CartItemBuy
) :
RecyclerView.Adapter() {
var itemCost = 0
var deliveryCharge = 0
var quantity = 0
class CartItemsViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CartItemsViewHolder {
val view = LayoutInflater.from(context.context).inflate(R.layout.single_cart_item, parent, false)
return CartItemsAdapter.CartItemsViewHolder(view)
}
override fun getItemCount(): Int {
return allData.size
}
override fun onBindViewHolder(holder: CartItemsViewHolder, position: Int) {
val currentData = allData.entries.toTypedArray()[position]
val firebaseFirestore = FirebaseFirestore.getInstance()
val firebaseDatabase = FirebaseDatabase.getInstance()
val firebaseAuth = FirebaseAuth.getInstance()
val itemQtyRef =
firebaseDatabase.getReference("${firebaseAuth.currentUser!!.uid}").child("cart")
.child("${currentData.key}").child("quantity")
val itemRef =
firebaseDatabase.getReference("${firebaseAuth.currentUser!!.uid}").child("cart")
.child("${currentData.key}")
holder.itemView.cartItemBuyBtn.setOnClickListener {
var qty = holder.itemView.quantityCountEcomm.text.toString().toInt()
var itemPrice =
holder.itemView.itemPriceCart.text.toString().split("₹") as ArrayList
var deliveryCharge = holder.itemView.deliveryChargeCart.text.toString().toInt()
Log.d("totalPrice", quantity.toString())
Log.d("totalPrice", itemCost.toString())
Log.d("totalPrice", deliveryCharge.toString())
cartitembuy.addToOrders("${currentData.key}", qty,itemPrice[1].toInt() , deliveryCharge)
}
holder.itemView.removeCartBtn.setOnClickListener {
itemRef.removeValue()
}
holder.itemView.increaseQtyBtn.setOnClickListener {
holder.itemView.quantityCountEcomm.text =
(holder.itemView.quantityCountEcomm.text.toString().toInt() + 1).toString()
itemQtyRef.setValue(holder.itemView.quantityCountEcomm.text.toString().toInt())
}
holder.itemView.decreaseQtyBtn.setOnClickListener {
if (holder.itemView.quantityCountEcomm.text.toString().toInt() != 1) {
holder.itemView.quantityCountEcomm.text =
(holder.itemView.quantityCountEcomm.text.toString().toInt() - 1).toString()
itemQtyRef.setValue(holder.itemView.quantityCountEcomm.text.toString().toInt())
}
}
val curr = currentData.value as Map
val ecommViewModel = EcommViewModel()
ecommViewModel.getSpecificItem("${currentData.key}").observe(context, Observer {
itemCost = it.get("price").toString().toInt()
deliveryCharge = it.get("delCharge").toString().toInt()
quantity = curr.get("quantity").toString().toInt()
holder.itemView.itemNameCart.text = it.getString("title").toString()
holder.itemView.itemPriceCart.text = "\u20B9" + itemCost.toString()
holder.itemView.quantityCountEcomm.text = quantity.toString()
holder.itemView.deliveryChargeCart.text = deliveryCharge.toString()
holder.itemView.cartItemFirm.text = it.get("retailer").toString()
holder.itemView.cartItemAvailability.text = it.get("availability").toString()
val allImages = it.get("imageUrl") as ArrayList
Glide.with(context).load(allImages[0].toString()).into(holder.itemView.cartItemImage)
holder.itemView.cartItemBuyBtn.text = "Buy Now: " + "\u20B9" + (itemCost!!*curr.get("quantity").toString().toInt() + deliveryCharge!!).toString()
})
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/adapter/CurrentWeatherAdapter.kt
================================================
package com.project.farmingapp.adapter
import android.content.Context
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.animation.AnimationUtils
import android.widget.ImageView
import android.widget.TextView
import android.widget.Toast
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.project.farmingapp.R
import com.project.farmingapp.model.data.WeatherList
import kotlinx.android.synthetic.main.post_with_image_sm.view.*
import kotlinx.android.synthetic.main.single_currentweather.view.*
class CurrentWeatherAdapter(val context: Context, val weatherrootdatas:List):
RecyclerView.Adapter() {
class CurrentWeatherViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {
var Ctemp=itemView.findViewById(R.id.temp)
var Cwedesc=itemView.findViewById(R.id.desc)
var Cwelogo=itemView.findViewById(R.id.icon)
var CminTemp=itemView.findViewById(R.id.minTemp)
var CmaxTemp=itemView.findViewById(R.id.maxTemp)
var Chumidity=itemView.findViewById(R.id.humidity)
var CtodayTitle=itemView.findViewById(R.id.todayTitle)
var continer = itemView.findViewById(R.id.currentWeatherContainer)
}
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int
): CurrentWeatherAdapter.CurrentWeatherViewHolder {
val view= LayoutInflater.from(context).inflate(R.layout.single_currentweather,parent,false)
return CurrentWeatherAdapter.CurrentWeatherViewHolder(view)
}
override fun getItemCount(): Int {
return weatherrootdatas.size
}
override fun onBindViewHolder(holder: CurrentWeatherAdapter.CurrentWeatherViewHolder, position: Int) {
val weathernew =weatherrootdatas[position]
holder.Ctemp.text = (weathernew.main.temp - 273.15).toInt().toString() + "\u2103"
holder.Cwedesc.text = weathernew.weather[0].description.toString().capitalize()
holder.CtodayTitle.text = "Today, " + weathernew.dt_txt.toString().slice(10..15)
Log.d("Something", weathernew.dt_txt.toString().slice(10..-1))
// var tempMin = ""
// for(a in weathernew.main.temp_min){
// }
var ss = weathernew.main.temp_min.length
holder.CminTemp.text = (weathernew.main.temp_min.toDouble() - 273.1).toInt().toString()+ "\u2103"
// holder.continer.animation = AnimationUtils.loadAnimation(context, R.anim.fade_scale)
// holder.itemView.setOnFocusChangeListener { view, b ->
//
// }
holder.itemView.currentWeatherContainer.animation = AnimationUtils.loadAnimation(context, R.anim.fade_scale)
holder.CmaxTemp.text = (weathernew.main.temp_max.toDouble() - 273.1).toInt().toString() + "\u2103"
holder.Chumidity.text = weathernew.main.humidity.toString() + "%"
var iconcode=weathernew.weather[0].icon.toString()
var iconurl = "https://openweathermap.org/img/w/" + iconcode + ".png";
Glide.with(holder.itemView.context)
.load(iconurl)
.into(holder.Cwelogo)
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/adapter/DashboardEcomItemAdapter.kt
================================================
package com.project.farmingapp.adapter
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.google.firebase.firestore.DocumentSnapshot
import com.project.farmingapp.R
import com.project.farmingapp.utilities.CellClickListener
import kotlinx.android.synthetic.main.single_dashboard_ecomm_item.view.*
class DashboardEcomItemAdapter(var context: Context,val allData: List, val itemsToShow: List, val cellClickListener: CellClickListener): RecyclerView.Adapter() {
class DashboardEcomItemViewHolder(itemView: View): RecyclerView.ViewHolder(itemView){
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DashboardEcomItemViewHolder {
val view = LayoutInflater.from(context).inflate(R.layout.single_dashboard_ecomm_item, parent, false)
return DashboardEcomItemViewHolder(view)
}
override fun getItemCount(): Int {
return itemsToShow.size
}
override fun onBindViewHolder(holder: DashboardEcomItemViewHolder, position: Int) {
val currentData = allData[itemsToShow[position]]
holder.itemView.itemTitle.text = currentData.get("title").toString()
holder.itemView.itemPrice.text = "\u20B9" + currentData.get("price").toString()
val allImages = currentData.get("imageUrl") as ArrayList
Glide.with(context).load(allImages[0]).into(holder.itemView.itemImage)
holder.itemView.setOnClickListener {
cellClickListener.onCellClickListener(currentData.id)
}
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/adapter/EcommerceAdapter.kt
================================================
package com.project.farmingapp.adapter
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.view.menu.MenuView
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.firestore.DocumentSnapshot
import com.google.firebase.firestore.FirebaseFirestore
import com.project.farmingapp.R
import com.project.farmingapp.utilities.CellClickListener
import kotlinx.android.synthetic.main.post_with_image_sm.view.*
import kotlinx.android.synthetic.main.single_ecomm_item.view.*
class EcommerceAdapter(val context: Context, val ecommtListData : List, private val cellClickListener: CellClickListener):RecyclerView.Adapter() {
lateinit var firebaseAuth: FirebaseAuth
lateinit var firebaseFirestore: FirebaseFirestore
class EcommercceViewModel(itemView: View):RecyclerView.ViewHolder(itemView) {
}
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int
): EcommerceAdapter.EcommercceViewModel {
val view = LayoutInflater.from(context).inflate(R.layout.single_ecomm_item, parent, false)
return EcommerceAdapter.EcommercceViewModel(view)
}
override fun getItemCount(): Int {
return ecommtListData.size
}
override fun onBindViewHolder(holder: EcommerceAdapter.EcommercceViewModel, position: Int) {
val currentList = ecommtListData[position]
holder.itemView.ecommtitle.text = currentList.get("title").toString()
holder.itemView.ecommPrice.text = "\u20B9 "+currentList.get("price").toString()
holder.itemView.ecommretailer.text = currentList.get("retailer").toString()
holder.itemView.ecommItemAvailability.text = currentList.get("availability").toString()
val allImages = currentList.get("imageUrl") as List
Glide.with(context).load(allImages[0].toString()).into(holder.itemView.ecommImage)
holder.itemView.ecommRating.rating = currentList.get("rating").toString().toFloat()
holder.itemView.setOnClickListener {
cellClickListener.onCellClickListener(currentList.id.toString())
}
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/adapter/IntroAdapter.kt
================================================
package com.project.farmingapp.adapter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.project.farmingapp.R
import com.project.farmingapp.model.data.IntroData
class IntroAdapter(private val introSlides: List): RecyclerView.Adapter() {
inner class IntroViewHolder(view: View) : RecyclerView.ViewHolder(view){
private val textTitle = view.findViewById(R.id.sliderTitle)
private val textDescription = view.findViewById(R.id.sliderDescription)
private val imageIcon = view.findViewById(R.id.imageSlider)
fun bind(introSlider: IntroData){
textTitle.text = introSlider.title
textDescription.text = introSlider.description
imageIcon.setImageResource(introSlider.image)
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): IntroViewHolder {
return IntroViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.single_slider_screen, parent, false)
)
}
override fun getItemCount(): Int {
return introSlides.size
}
override fun onBindViewHolder(holder: IntroViewHolder, position: Int) {
holder.bind(introSlides[position])
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/adapter/MyOrdersAdapter.kt
================================================
package com.project.farmingapp.adapter
import android.content.Intent
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.project.farmingapp.R
import com.project.farmingapp.utilities.CartItemBuy
import com.project.farmingapp.utilities.CellClickListener
import com.project.farmingapp.view.ecommerce.MyOrdersFragment
import com.project.farmingapp.view.ecommerce.RazorPayActivity
import com.project.farmingapp.viewmodel.EcommViewModel
import kotlinx.android.synthetic.main.single_myorder_item.view.*
import java.text.SimpleDateFormat
import java.time.LocalDate
import java.time.format.DateTimeFormatter
import java.util.*
import kotlin.collections.HashMap
class MyOrdersAdapter(
val context: MyOrdersFragment,
val allData: HashMap,
val cellClickListener: CellClickListener,
val cartItemBuy: CartItemBuy
) : RecyclerView.Adapter() {
class MyOrdersViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyOrdersViewHolder {
val view = LayoutInflater.from(context.context)
.inflate(R.layout.single_myorder_item, parent, false)
return MyOrdersViewHolder(view)
}
override fun getItemCount(): Int {
return allData.size
}
override fun onBindViewHolder(holder: MyOrdersViewHolder, position: Int) {
val myOrder = allData.entries.toTypedArray()[position].value as HashMap
val viewModel = EcommViewModel()
val currentItemAllData = viewModel.getSpecificItem("${myOrder.get("productId")}")
.observe(context, androidx.lifecycle.Observer {
Log.d("MyOrdersAdapter", it.toString())
holder.itemView.myOrderPinCode.text = myOrder.get("pincode").toString()
holder.itemView.myOrderItemName.text = it!!.getString("title")
holder.itemView.myOrderItemPrice.text =
"\u20B9" + (myOrder.get("quantity").toString()
.toInt() * myOrder.get("itemCost").toString()
.toInt() + myOrder.get("deliveryCost").toString().toInt()).toString()
holder.itemView.myOrderPinCode.text =
"Pin Code: " + myOrder.get("pincode").toString()
holder.itemView.myOderDeliveryCharge.text = myOrder.get("deliveryCost").toString()
holder.itemView.myOrderDeliveryStatus.text =
myOrder.get("deliveryStatus").toString()
val allImages = it.get("imageUrl") as List
Glide.with(context).load(allImages[0]).into(holder.itemView.myOderItemImage)
val date = myOrder.get("time").toString().split(" ") as List
holder.itemView.myOrderTimeStamp.text = date[0].toString()
})
holder.itemView.myOrderPurchaseAgain.setOnClickListener {
cartItemBuy.addToOrders(myOrder.get("productId").toString(), myOrder.get("quantity").toString().toInt(), myOrder.get("itemCost").toString().toInt(), myOrder.get("deliveryCost").toString().toInt())
}
holder.itemView.setOnClickListener {
cellClickListener.onCellClickListener("${myOrder.get("productId")}")
}
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/adapter/PaginationListener.kt
================================================
package com.project.farmingapp.adapter
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
public abstract class PaginationListener : RecyclerView.OnScrollListener() {
companion object{
public val PAGE_START = 1
}
private var layoutManager: LinearLayoutManager? = null
/**
* Set scrolling threshold here (for now i'm assuming 10 item in one page)
*/
private val PAGE_SIZE = 10
/**
* Supporting only LinearLayoutManager for now.
*/
open fun PaginationListener(layoutManager: LinearLayoutManager) {
this.layoutManager = layoutManager
}
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
val visibleItemCount = layoutManager!!.childCount
val totalItemCount = layoutManager!!.itemCount
val firstVisibleItemPosition = layoutManager!!.findFirstVisibleItemPosition()
if (!isLoading() && !isLastPage()) {
if (visibleItemCount + firstVisibleItemPosition >= totalItemCount && firstVisibleItemPosition >= 0 && totalItemCount >= PAGE_SIZE
) {
loadMoreItems()
}
}
}
protected abstract fun loadMoreItems()
abstract fun isLastPage(): Boolean
abstract fun isLoading(): Boolean
}
================================================
FILE: app/src/main/java/com/project/farmingapp/adapter/PostListUserProfileAdapter.kt
================================================
package com.project.farmingapp.adapter
import android.content.Context
import android.text.Layout
import android.text.format.DateUtils
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.google.firebase.firestore.DocumentSnapshot
import com.project.farmingapp.R
import com.project.farmingapp.utilities.CellClickListener
import kotlinx.android.synthetic.main.user_profile_posts_single.view.*
class PostListUserProfileAdapter(val context: Context, var listData: ArrayList, private val cellClickListener: CellClickListener) : RecyclerView.Adapter() {
class PostListUserProfileViewHolder(itemView: View): RecyclerView.ViewHolder(itemView){
}
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int
): PostListUserProfileViewHolder {
val view = LayoutInflater.from(context).inflate(R.layout.user_profile_posts_single, parent, false)
return PostListUserProfileAdapter.PostListUserProfileViewHolder(view)
}
override fun getItemCount(): Int {
return listData.size
}
override fun onBindViewHolder(holder: PostListUserProfileViewHolder, position: Int) {
val currentData = listData[position]
holder.itemView.userPostTitleUserProfileFrag.text = currentData.get("title").toString()
holder.itemView.userPostUploadTimeUserProfileFrag.text = DateUtils.getRelativeTimeSpanString(currentData.get("timeStamp") as Long)
holder.itemView.userPostProfileCard.setOnClickListener {
cellClickListener.onCellClickListener(currentData.id)
}
if (!currentData.get("imageUrl").toString().isNullOrEmpty()){
Glide.with(context).load(currentData.getString("imageUrl")).into(holder.itemView.userPostImageUserProfileFrag)
}
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/adapter/SMPostListAdapter.kt
================================================
package com.project.farmingapp.adapter
import android.content.Context
import android.text.format.DateUtils
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.animation.AnimationUtils
import android.webkit.WebSettings
import android.webkit.WebView
import android.webkit.WebViewClient
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.firestore.DocumentSnapshot
import com.google.firebase.firestore.FirebaseFirestore
import com.project.farmingapp.R
import kotlinx.android.synthetic.main.post_with_image_sm.view.*
class SMPostListAdapter(val context: Context, val postListData : List): RecyclerView.Adapter() {
lateinit var firebaseAuth: FirebaseAuth
lateinit var firebaseFirestore: FirebaseFirestore
class SMPostListViewModel(itemView: View): RecyclerView.ViewHolder(itemView){
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SMPostListViewModel {
val view = LayoutInflater.from(context).inflate(R.layout.post_with_image_sm, parent, false)
return SMPostListAdapter.SMPostListViewModel(view)
}
override fun getItemCount(): Int {
return postListData.size
}
override fun onBindViewHolder(holder: SMPostListViewModel, position: Int) {
val currentPost = postListData[position]
holder.itemView.userNamePostSM.text = currentPost.get("name").toString()
holder.itemView.userPostTitleValue.text = currentPost.get("title").toString()
holder.itemView.userPostDescValue.text = currentPost.get("description").toString()
holder.itemView.userPostUploadTime.text = DateUtils.getRelativeTimeSpanString(currentPost.get("timeStamp") as Long)
val imageUrl = currentPost.get("imageUrl")
Log.d("Post without Image1", imageUrl.toString())
val uploadType = currentPost.get("uploadType").toString()
if (uploadType == "video"){
// val mediaController: MediaController = MediaController(context.applicationContext)
//// val uri: Uri = Uri.parse()
// mediaController.setAnchorView(holder.itemView.postVideoSM)
//
// holder.itemView.postVideoSM.setZOrderMediaOverlay(true)
// holder.itemView.postVideoSM.setMediaController(mediaController)
//
// Log.d("Upload Type 1 ", uploadType)
// holder.itemView.postVideoSM.setVideoPath(currentPost.getString("imageUrl"))
//// videoView1.requestFocus()
// holder.itemView.postVideoSM.setOnPreparedListener {
//
// }
// holder.itemView.postVideoSM.start()
//
// holder.itemView.postImageSM.visibility = View.GONE
// holder.itemView.postVideoSM.visibility = View.VISIBLE
// Web View
val webSet: WebSettings = holder.itemView.postVideoSM.settings
webSet.javaScriptEnabled = true
webSet.loadWithOverviewMode = true
webSet.useWideViewPort = true
holder.itemView.postVideoSM.setWebViewClient(object : WebViewClient() {
// autoplay when finished loading via javascript injection
override fun onPageFinished(view: WebView, url: String) {
// holder.itemView.postVideoSM.loadUrl("javascript:(function() { document.getElementsByTagName('video')[0].play(); })()")
}
})
holder.itemView.postVideoSM.loadUrl(currentPost.get("imageUrl").toString())
// holder.itemView.postVideoSM.stopLoading()
holder.itemView.postImageSM.visibility = View.GONE
holder.itemView.postVideoSM.visibility = View.VISIBLE
} else if (uploadType == "image"){
Glide.with(context).load(currentPost.get("imageUrl")).into(holder.itemView.postImageSM)
holder.itemView.postVideoSM.visibility = View.GONE
holder.itemView.postImageSM.visibility = View.VISIBLE
Log.d("Upload Type 2 ", uploadType)
}else if (uploadType.isEmpty() ){
Log.d("Post without Image2", imageUrl.toString())
holder.itemView.postImageSM.visibility = View.GONE
holder.itemView.postVideoSM.visibility = View.GONE
Log.d("Upload Type 3 ", uploadType)
}
firebaseAuth = FirebaseAuth.getInstance()
holder.itemView.userProfileImageCard.animation = AnimationUtils.loadAnimation(context, R.anim.fade_transition)
holder.itemView.post_container.animation = AnimationUtils.loadAnimation(context, R.anim.fade_transition)
holder.itemView.post_container.animation = AnimationUtils.loadAnimation(context, R.anim.fade_transition)
// Glide.with(context).load(firebaseAuth.currentUser!!.photoUrl.toString()).into(holder.itemView.userProfileImagePost)
holder.itemView.userPostDescValue.setOnClickListener {
holder.itemView.userPostDescValue.maxLines = Int.MAX_VALUE
}
firebaseFirestore = FirebaseFirestore.getInstance()
firebaseFirestore.collection("users").document("${currentPost.get("userID")}").get()
.addOnSuccessListener {
val profileImage = it.get("profileImage").toString()
if (!profileImage.isNullOrEmpty()){
Glide.with(context).load(it.get("profileImage").toString()).into(holder.itemView.userProfileImagePost)
}
}
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/adapter/WeatherAdapter.kt
================================================
package com.project.farmingapp.adapter
import android.content.Context
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.project.farmingapp.R
import com.project.farmingapp.model.data.WeatherList
import java.text.SimpleDateFormat
import java.time.LocalDateTime
import java.util.*
class WeatherAdapter(val context: Context, val weatherrootdatas: List) :
RecyclerView.Adapter() {
class WeatherViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var wedate = itemView.findViewById(R.id.weatherDate)
var wedesc = itemView.findViewById(R.id.weatherDescription)
var wemain = itemView.findViewById(R.id.weatherTemperature)
var welogo = itemView.findViewById(R.id.weatherIcon)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): WeatherViewHolder {
val view = LayoutInflater.from(context).inflate(R.layout.single_weather, parent, false)
return WeatherViewHolder(view)
}
override fun getItemCount(): Int {
return weatherrootdatas.size
}
override fun onBindViewHolder(holder: WeatherAdapter.WeatherViewHolder, position: Int) {
val weathernew = weatherrootdatas[position]
val inputFormat = SimpleDateFormat("yyyy-MM-dd")
val outputFormat = SimpleDateFormat("dd/MM/yyyy")
val date: Date = inputFormat.parse(weathernew.dt_txt.slice(0..9))
val outputDate = outputFormat.format(date)
Log.d("New Date", outputDate.toString())
val we = weathernew.weather[0]
val we2 = weathernew.main
holder.wedate.text = outputDate
holder.wedesc.text = we.description.capitalize()
Log.d("weatherTemp", we2.temp.toString())
val Temp = we2.temp - 273.15
holder.wemain.text = Temp.toInt().toString() + "\u2103"
var iconcode = weathernew.weather[0].icon.toString()
var iconurl = "https://openweathermap.org/img/w/" + iconcode + ".png";
Log.d("weatherlogo", iconcode.toString())
Glide.with(holder.itemView.context)
.load(iconurl)
.into(holder.welogo)
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/adapter/YojnaAdapter.kt
================================================
package com.project.farmingapp.adapter
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.cardview.widget.CardView
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.google.firebase.firestore.DocumentSnapshot
import com.project.farmingapp.R
import com.project.farmingapp.utilities.CellClickListener
class YojnaAdapter(val context: Context, val yojnaData: List, private val cellClickListener: CellClickListener): RecyclerView.Adapter() {
class YojnaListviewHolder(itemview: View):RecyclerView.ViewHolder(itemview) {
var yojnaName = itemView.findViewById(R.id.yojnaTitleYojnaList)
var yojnaImage = itemView.findViewById(R.id.yojnaImageYojnaList)
var yojnaDate = itemView.findViewById(R.id.yojnaDateYojnaList)
var yojnaCard = itemView.findViewById(R.id.singlelistyojnacard)
var yojnaStatus = itemView.findViewById(R.id.yojnaStatusYojnaList)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): YojnaListviewHolder {
val view = LayoutInflater.from(context).inflate(R.layout.single_yojna_list, parent, false)
return YojnaAdapter.YojnaListviewHolder(view)
}
override fun getItemCount(): Int {
return yojnaData.size
}
override fun onBindViewHolder(holder: YojnaListviewHolder, position: Int) {
val singleYojna=yojnaData[position]
holder.yojnaName.text = singleYojna.data!!.get("title").toString()
holder.yojnaStatus.text = singleYojna.data!!.get("status").toString()
holder.yojnaDate.text = singleYojna.data!!.get("launch").toString()
val url = singleYojna.data!!.get("image").toString()
Glide.with(holder.itemView.context)
.load(url)
.into(holder.yojnaImage)
holder.yojnaCard.setOnClickListener {
cellClickListener.onCellClickListener(singleYojna.data!!.get("title").toString())
}
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/model/APMCApi.kt
================================================
package com.project.farmingapp.model
import com.project.farmingapp.model.data.APMCMain
import com.project.farmingapp.model.data.WeatherRootList
import retrofit2.Call
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.http.GET
import retrofit2.http.Query
//https://api.data.gov.in/resource/9ef84268-d588-465a-a308-a864a43d0070?api-key=579b464db66ec23bdd000001987c65666f9c49656f0f9ef4fa3650e7&format=json&offset=0&limit=400
const val BASE_URL2 ="https://api.data.gov.in/"
const val API_KEY2 ="579b464db66ec23bdd000001987c65666f9c49656f0f9ef4fa3650e7"
interface apmcInterface {
@GET("resource/9ef84268-d588-465a-a308-a864a43d0070?api-key=$API_KEY2&format=json&offset=0&limit=7000")
fun getapmc(@Query("limit")limit:Int): Call
@GET("resource/9ef84268-d588-465a-a308-a864a43d0070?api-key=$API_KEY2&format=json&offset=0&limit=7000")
fun getSomeData(@Query("filters[district]")filter:String):Call
}
object APMCApi {
val apmcInstances:apmcInterface
init {
val retrofit = Retrofit.Builder()
.baseUrl(BASE_URL2)
.addConverterFactory(GsonConverterFactory.create())
.build()
apmcInstances =retrofit.create(apmcInterface::class.java)
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/model/APMCRepository.kt
================================================
package com.project.farmingapp.model
class APMCRepository {
}
================================================
FILE: app/src/main/java/com/project/farmingapp/model/ArticleRepository.kt
================================================
package com.project.farmingapp.model
import android.util.Log
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.google.firebase.firestore.DocumentSnapshot
import com.google.firebase.firestore.FirebaseFirestore
import com.project.farmingapp.viewmodel.ArticleViewModel
import com.project.farmingapp.viewmodel.WeatherViewModel
class ArticleRepository {
lateinit var firebaseDb: FirebaseFirestore
var data = MutableLiveData>()
val data2 = MutableLiveData()
private lateinit var viewModel: ArticleViewModel
fun getSpecificFruitArticle(name: String): LiveData {
firebaseDb = FirebaseFirestore.getInstance()
Log.d("ArticleRepo1", "Ss")
firebaseDb.collection("article_fruits").document("${name}")
.get()
.addOnSuccessListener {
// var ss = it.data
viewModel = ArticleViewModel()
// data.value = it.data as HashMap?
viewModel.updateArticle(it.data as HashMap)
// data.value = it.data as HashMap?
data2.value = "Success"
Log.d("ArticleRepo2", data2.value.toString())
}
.addOnFailureListener {
Log.d("ArticleRepo3", "ss")
}
return data2
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/model/AuthRepository.kt
================================================
package com.project.farmingapp.model
import android.util.Log
import android.widget.Toast
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.google.android.gms.auth.api.signin.GoogleSignInClient
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.auth.GoogleAuthProvider
import com.google.firebase.firestore.FirebaseFirestore
import java.io.Serializable
class AuthRepository {
lateinit var googleSignInClient: GoogleSignInClient
val firebaseAuth = FirebaseAuth.getInstance()
lateinit var firebaseDb: FirebaseFirestore
val data = MutableLiveData()
fun signInWithEmail(
email: String,
password: String,
otherData: HashMap
): LiveData {
firebaseDb = FirebaseFirestore.getInstance()
val data2 = MutableLiveData()
firebaseAuth.createUserWithEmailAndPassword(email, password).addOnCompleteListener {
if (it.isSuccessful) {
firebaseDb!!.collection("users").document("${email}")
.set(otherData)
.addOnSuccessListener {
data.value = "Success"
}
.addOnFailureListener { Exception ->
{
data.value = "Failure"
}
}
} else if (it.isCanceled) {
data.value = "Failure"
}
}.addOnFailureListener {
Log.d("AuthRepo", it.message)
data.value = it.message
}
return data
}
fun signInToGoogle(
idToken: String,
email: String,
otherData: HashMap
): LiveData {
firebaseDb = FirebaseFirestore.getInstance()
val credential = GoogleAuthProvider.getCredential(idToken, null)
firebaseAuth!!.signInWithCredential(credential)
.addOnCompleteListener {
if (it.isSuccessful) {
val userDocRef = firebaseDb!!.collection("users").document("${email}")
userDocRef.get().addOnSuccessListener {
data.value = "Success"
if(it.exists()){
Log.d("User", "User Exists")
} else{
Log.d("User", "User Does not Exists")
firebaseDb!!.collection("users").document("${email}")
.set(otherData)
.addOnSuccessListener {
data.value = "Success"
}
.addOnFailureListener { Exception ->
{
data.value = "Failure"
}
}
}
}
val user = firebaseAuth!!.currentUser
} else {
data.value = "Failure"
}
}
return data
}
//login
fun logInWithEmail(
email: String,
password: String
): LiveData {
firebaseDb = FirebaseFirestore.getInstance()
val data = MutableLiveData()
firebaseAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener {
if (it.isSuccessful) {
data.value = "Success"
} else if (it.isCanceled) {
data.value = "Failure"
}
}.addOnFailureListener {
Log.d("AuthRepo", it.message)
data.value = it.message
}
return data
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/model/WeatherApi.kt
================================================
package com.project.farmingapp.model
import com.project.farmingapp.model.data.WeatherRootList
import retrofit2.Call
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.http.GET
import retrofit2.http.Query
const val BASE_URL ="https://api.openweathermap.org/"
const val API_KEY ="63259e8886cbe4d575c24358fb860b1b"
interface weatherInterface {
@GET("data/2.5/forecast?appid=$API_KEY")
fun getWeather(@Query("lat")lat:String, @Query("lon")lon:String): Call
}
object WeatherApi {
val weatherInstances:weatherInterface
init {
val retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
weatherInstances =retrofit.create(weatherInterface::class.java)
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/model/WeatherRepository.kt
================================================
package com.project.farmingapp.model
import android.util.Log
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.project.farmingapp.model.data.WeatherRootList
import com.project.farmingapp.viewmodel.WeatherListener
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
class WeatherRepository {
val data = MutableLiveData()
fun getWeather(): LiveData {
val response: Call =
WeatherApi.weatherInstances.getWeather("23.0225", "72.5714")
val weathRes = MutableLiveData()
response.enqueue(object : Callback {
override fun onFailure(call: Call, t: Throwable) {
Log.d("WeatherRepository", "Error Occured")
}
override fun onResponse(
call: Call,
response: Response
) {
if (response.isSuccessful) {
data.value = response.body()
weathRes.value = "DONE"
} else {
weathRes.value = "FAILED"
}
}
})
return weathRes
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/model/data/APMCCustomRecords.kt
================================================
package com.project.farmingapp.model.data
data class APMCCustomRecords(val state:String,val district:String,val market:String,val commodity:MutableList,val min_price:MutableList,val max_price:MutableList)
================================================
FILE: app/src/main/java/com/project/farmingapp/model/data/APMCMain.kt
================================================
package com.project.farmingapp.model.data
data class APMCMain(val updated_date: String, val records: List)
================================================
FILE: app/src/main/java/com/project/farmingapp/model/data/APMCRecords.kt
================================================
package com.project.farmingapp.model.data
data class APMCRecords(val state:String,val district:String,val market:String,val commodity:String,val min_price:String,val max_price:String,val modal_price:String)
================================================
FILE: app/src/main/java/com/project/farmingapp/model/data/CartItem.kt
================================================
package com.project.farmingapp.model.data
import java.sql.Timestamp
data class CartItem(var quantity: Int, val time: String)
================================================
FILE: app/src/main/java/com/project/farmingapp/model/data/IntroData.kt
================================================
package com.project.farmingapp.model.data
data class IntroData (
val title :String,
val description: String,
val image: Int
)
================================================
FILE: app/src/main/java/com/project/farmingapp/model/data/Post.kt
================================================
package com.project.farmingapp.model.data
data class Post(val timeStamp: Long, val imageID: String, val imageUrl:String)
================================================
FILE: app/src/main/java/com/project/farmingapp/model/data/Weather.kt
================================================
package com.project.farmingapp.model.data
data class Weather(val main:String =""
, val description:String =""
, val icon:String ="")
================================================
FILE: app/src/main/java/com/project/farmingapp/model/data/WeatherList.kt
================================================
package com.project.farmingapp.model.data
data class WeatherList(val main:WeatherMain,val weather:List,val dt_txt:String, val wind: WeatherWind)
================================================
FILE: app/src/main/java/com/project/farmingapp/model/data/WeatherMain.kt
================================================
package com.project.farmingapp.model.data
data class WeatherMain(val temp:Float,val humidity:String,val temp_min:String,val temp_max:String)
================================================
FILE: app/src/main/java/com/project/farmingapp/model/data/WeatherRootList.kt
================================================
package com.project.farmingapp.model.data
//data class WeatherRootList(val list:List) : List
data class WeatherRootList(val list: List)
================================================
FILE: app/src/main/java/com/project/farmingapp/model/data/WeatherWind.kt
================================================
package com.project.farmingapp.model.data
data class WeatherWind (val speed: Float)
================================================
FILE: app/src/main/java/com/project/farmingapp/model/data/orders.kt
================================================
package com.project.farmingapp.model.data
import kotlinx.android.synthetic.main.activity_razor_pay.*
import java.sql.Timestamp
data class orders(
var name: String,
var locality: String,
var city: String,
var state: String,
var pincode: String,
var mobile: String,
var time: String,
var productId: String,
var itemCost: Int,
var quantity: Int,
var deliveryCost: Int,
var deliveryStatus: String
)
================================================
FILE: app/src/main/java/com/project/farmingapp/utilities/CartItemBuy.kt
================================================
package com.project.farmingapp.utilities
interface CartItemBuy {
fun addToOrders(productId: String, quantity: Int, itemCost: Int, deliveryCost: Int)
}
================================================
FILE: app/src/main/java/com/project/farmingapp/utilities/CellClickListener.kt
================================================
package com.project.farmingapp.utilities
interface CellClickListener {
fun onCellClickListener(name: String)
}
================================================
FILE: app/src/main/java/com/project/farmingapp/utilities/ViewUtils.kt
================================================
package com.project.farmingapp.utilities
import android.content.Context
import android.view.View
import android.widget.ProgressBar
import android.widget.Toast
fun Context.toast(message: String){
Toast.makeText(this, message, Toast.LENGTH_LONG).show()
}
fun ProgressBar.show(){
visibility = View.VISIBLE
}
fun ProgressBar.hide(){
visibility = View.GONE
}
================================================
FILE: app/src/main/java/com/project/farmingapp/view/apmc/ApmcFragment.kt
================================================
package com.project.farmingapp.view.apmc
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.*
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import com.project.farmingapp.R
import com.project.farmingapp.adapter.ApmcAdapter
import com.project.farmingapp.model.APMCApi
import com.project.farmingapp.model.data.APMCCustomRecords
import com.project.farmingapp.model.data.APMCMain
import kotlinx.android.synthetic.main.activity_login.*
import kotlinx.android.synthetic.main.app_bar_main.*
import kotlinx.android.synthetic.main.fragment_apmc.*
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import java.lang.reflect.Field
import java.text.SimpleDateFormat
import java.time.OffsetDateTime
import java.util.*
import kotlin.collections.ArrayList
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"
/**
* A simple [Fragment] subclass.
* Use the [ApmcFragment.newInstance] factory method to
* create an instance of this fragment.
*/
class ApmcFragment : Fragment() {
// TODO: Rename and change types of parameters
private var param1: String? = null
private var param2: String? = null
lateinit var adapter: ApmcAdapter
var indexSpinner1: Int? = null
var indexSpinner2: Int? = null
var someMap: Map>? = null
var states: Array? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
param1 = it.getString(ARG_PARAM1)
param2 = it.getString(ARG_PARAM2)
}
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
// bottomNav.selectedItemId = R.id.bottomNavAPMC
// getApmc()
return inflater.inflate(R.layout.fragment_apmc, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
progress_apmc.visibility = View.GONE
loadingTextAPMC.visibility = View.GONE
setHasOptionsMenu(true)
(activity as AppCompatActivity).supportActionBar?.title = "APMC"
val sdf = SimpleDateFormat("dd/MM/yyyy")
dateValueTextApmc.text = sdf.format(Date()).toString()
states = arrayOf(
"None",
"Andhra Pradesh",
"Chandigarh",
"Chattisgarh",
"Gujarat",
"Hariyana",
"Himachal Pradesh",
"Jammu & Kashmir",
"Jharkhand",
"Karnataka",
"Kerala",
"Madhya Pradesh",
"Maharashtra",
"Odisha",
"Pudu Cherry",
"Punjab",
"Rajasthan",
"Tamil Nadu",
"Telangana",
"Uttar Pradesh",
"Uttarakhand",
"West Bengal"
)
var districtInGujarat: Array = arrayOf(
"None",
"Ahmedabad",
"Amreli",
"Anand",
"Aravalli",
"Banaskantha",
"Bharuch",
"Bhavnagar",
"Botad",
"Chhota Udepur",
"Dahod",
"Dangs",
"Devbhoomi Dwarka",
"Gandhinagar",
"Gir Somnath",
"Jamnagar",
"Junagadh",
"Kachchh",
"Kheda",
"Mahisagar",
"Mehsana",
"Morbi",
"Narmada",
"Navsari",
"Panchmahal",
"Patan",
"Porbandar",
"Rajkot",
"Sabarkantha",
"Surat",
"Surendranagar",
"Tapi",
"Vadodara",
"Valsad"
)
var districtInMaha: Array = arrayOf(
"None",
"Ahmednagar",
"Akola",
"Amravati",
"Aurangabad",
"Beed",
"Bhandara",
"Buldhana",
"Chandrapur",
"Dhule",
"Gadchiroli",
"Gondia",
"Hingoli",
"Jalgaon",
"Jalna",
"Kolhapur",
"Latur",
"Mumbai City",
"Mumbai Suburban",
"Nagpur",
"Nanded",
"Nandurbar",
"Nashik",
"Osmanabad",
"Palghar",
"Parbhani",
"Pune",
"Raigad",
"Ratnagiri",
"Sangli",
"Satara",
"Sindhudurg",
"Solapur",
"Thane",
"Wardha",
"Washim",
"Yavatmal"
)
var districtInRajasthan: Array = arrayOf(
"None",
"Ajmer",
"Alwar",
"Banswara",
"Baran",
"Barmer",
"Bharatpur",
"Bhilwara",
"Bikaner",
"Bundi",
"Chittorgarh",
"Churu",
"Dausa",
"Dholpur",
"Dungarpur",
"Hanumangarh",
"Jaipur",
"Jaisalmer",
"Jalore",
"Jhalawar",
"Jhunjhunu",
"Jodhpur",
"Karauli",
"Kota",
"Nagaur",
"Pali",
"Pratapgarh",
"Rajsamand",
"Sawai Madhopur",
"Sikar",
"Sirohi",
"Sri Ganganagar",
"Tonk",
"Udaipur"
)
var districtInUttarPradesh: Array = arrayOf(
"None",
"Agra",
"Aligarh",
"Allahabad",
"Ambedkar Nagar",
"Amethi",
"Amroha",
"Auraiya",
"Azamgarh",
"Baghpat",
"Bahraich",
"Ballia",
"Balrampur",
"Banda",
"Barabanki",
"Bareilly",
"Basti",
"Bhadohi",
"Bijnor",
"Budaun",
"Bulandshahr",
"Chandauli",
"Chitrakoot",
"Deoria",
"Etah",
"Etawah",
"Faizabad",
"Farrukhabad",
"Fatehpur",
"Firozabad",
"Gautam Buddha Nagar",
"Ghaziabad",
"Ghazipur",
"Gonda",
"Gorakhpur",
"Hamirpur",
"Hapur",
"Hardoi",
"Hathras",
"Jalaun",
"Jaunpur",
"Jhansi",
"Kannauj",
"Kanpur Dehat",
"Kanpur Nagar",
"Kanshiram Nagar",
"Kaushambi",
"Kushinagar",
"Lakhimpur - Kheri",
"Lalitpur",
"Lucknow",
"Maharajganj",
"Mahoba",
"Mainpuri",
"Mathura",
"Mau",
"Meerut",
"Mirzapur",
"Moradabad",
"Muzaffarnagar",
"Pilibhit",
"Pratapgarh",
"RaeBareli",
"Rampur",
"Saharanpur",
"Sambhal",
"Sant Kabir Nagar",
"Shahjahanpur",
"Shamali",
"Shravasti",
"Siddharth Nagar",
"Sitapur",
"Sonbhadra",
"Sultanpur",
"Unnao",
"Varanasi"
)
var districtInWestBengal: Array = arrayOf(
"None",
"Alipurduar",
"Bankura",
"Birbhum",
"Cooch Behar",
"Dakshin Dinajpur",
"Darjeeling",
"Hooghly",
"Howrah",
"Jalpaiguri",
"Jhargram",
"Kalimpong",
"Kolkata",
"Malda",
"Murshidabad",
"Nadia",
"North 24 Parganas",
"Paschim Medinipur",
"Paschim Burdwan",
"Purba Burdwan",
"Purba Medinipur",
"Purulia",
"South 24 Parganas",
"Uttar Dinajpur"
)
var districtInKerala: Array = arrayOf(
"None",
"Alappuzha",
"Ernakulam",
"Idukki",
"Kannur",
"Kasaragod",
"Kollam",
"Kottayam",
"Kozhikode",
"Malappuram",
"Palakkad",
"Pathanamthitta",
"Thiruvananthapuram",
"Thrissur",
"Wayanad"
)
var districtInAndhraPradesh: Array = arrayOf(
"None",
"Anantapur",
"Chittoor",
"East Godavari",
"Guntur",
"Krishna",
"Kurnool",
"Prakasam",
"Srikakulam",
"Sri Potti Sriramulu Nellore",
"Visakhapatnam",
"Vizianagaram",
"West Godavari",
"Kadapa"
)
var emptyDistricts : Array = arrayOf("None")
var aa = ArrayAdapter(
activity!!.applicationContext,
android.R.layout.simple_spinner_dropdown_item,
states!!
)
spinner1.adapter = aa
someMap = mapOf(
"Andhra Pradesh" to districtInAndhraPradesh,
"Gujarat" to districtInGujarat,
"Kerala" to districtInKerala,
"Maharashtra" to districtInMaha,
"Rajasthan" to districtInRajasthan,
"Uttar Pradesh" to districtInUttarPradesh,
"West Bengal" to districtInWestBengal,
"Chandigarh" to emptyDistricts,
"Chattisgarh" to emptyDistricts,
"Hariyana" to emptyDistricts,
"Himachal Pradesh" to emptyDistricts,
"Jammu & Kashmir" to emptyDistricts,
"Jharkhand" to emptyDistricts,
"Karnataka" to emptyDistricts,
"Madhya Pradesh" to emptyDistricts,
"Odisha" to emptyDistricts,
"Pudu Cherry" to emptyDistricts,
"Punjab" to emptyDistricts,
"Tamil Nadu" to emptyDistricts,
"Telangana" to emptyDistricts,
"Uttarakhand" to emptyDistricts
)
spinner1.onItemSelectedListener = object :
AdapterView.OnItemClickListener, AdapterView.OnItemSelectedListener {
override fun onNothingSelected(p0: AdapterView<*>?) {
TODO("Not yet implemented")
}
override fun onItemSelected(p0: AdapterView<*>?, p1: View?, p2: Int, p3: Long) {
if (p2 == 0) {
textAPMCWarning.text = "Please Select State and District"
recycleAPMC.visibility = View.GONE
textAPMCWarning.visibility = View.VISIBLE
} else {
var aa2 = ArrayAdapter(
activity!!.applicationContext,
android.R.layout.simple_spinner_dropdown_item,
someMap!![states!![p2]]!!
)
indexSpinner1 = p2
spinner2.adapter = aa2
aa2.notifyDataSetChanged()
}
}
override fun onItemClick(p0: AdapterView<*>?, p1: View?, p2: Int, p3: Long) {
}
}
spinner2.onItemSelectedListener = object :
AdapterView.OnItemClickListener, AdapterView.OnItemSelectedListener {
override fun onNothingSelected(p0: AdapterView<*>?) {
TODO("Not yet implemented")
}
override fun onItemSelected(p0: AdapterView<*>?, p1: View?, p2: Int, p3: Long) {
if (p2 == 0) {
textAPMCWarning.text = "Please Select District"
recycleAPMC.visibility = View.GONE
textAPMCWarning.visibility = View.VISIBLE
} else {
textAPMCWarning.visibility = View.GONE
if (p2 != 0) {
getApmc("${someMap!![states!![indexSpinner1!!]]!![p2]}")
}
indexSpinner2 = p2
progress_apmc.visibility = View.VISIBLE
loadingTextAPMC.visibility = View.VISIBLE
}
}
override fun onItemClick(p0: AdapterView<*>?, p1: View?, p2: Int, p3: Long) {
}
}
}
companion object {
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment ApmcFragment.
*/
// TODO: Rename and change types and number of parameters
@JvmStatic
fun newInstance(param1: String, param2: String) =
ApmcFragment().apply {
arguments = Bundle().apply {
putString(ARG_PARAM1, param1)
putString(ARG_PARAM2, param2)
}
}
}
private fun getApmc(district: String) {
val apmc1: Call = APMCApi.apmcInstances.getapmc(20)
var apmc2: Call? = null
if (indexSpinner2 != 0) {
apmc2 = APMCApi.apmcInstances.getSomeData(district)
Log.d("APMC District", district)
apmc2!!.enqueue(object : Callback {
override fun onFailure(call: Call, t: Throwable) {
Log.d("bharat222", "fail ho gya", t)
progress_apmc.visibility = View.GONE
loadingTextAPMC.visibility = View.GONE
}
override fun onResponse(
call: Call,
response: Response
) {
val apmcdata = response.body()
if (apmcdata != null) {
val updatedYear = apmcdata.updated_date.toString().slice(0..3)
val updatedMonth = apmcdata.updated_date.toString().slice(5..6)
val updatedDate = apmcdata.updated_date.toString().slice(8..9)
dateValueTextApmc.text = "$updatedDate/$updatedMonth/$updatedYear"
if (apmcdata.records.size == 0) {
progress_apmc.visibility = View.GONE
loadingTextAPMC.visibility = View.GONE
textAPMCWarning.visibility = View.VISIBLE
recycleAPMC.visibility = View.GONE
textAPMCWarning.text = "No records found!"
} else {
textAPMCWarning.visibility = View.GONE
recycleAPMC.visibility = View.VISIBLE
Log.d("APMCFrag", apmcdata.records.toString())
val totalRecords = apmcdata.records.size
var firstMarket = ""
if (!apmcdata.records[0].market.isNullOrEmpty()) {
firstMarket = apmcdata.records[0].market.toString()
}
val customRecords = ArrayList()
val list1 = mutableListOf()
val list2 = mutableListOf()
val list3 = mutableListOf()
list1.add(apmcdata.records[0].commodity)
list2.add(apmcdata.records[0].min_price)
list3.add(apmcdata.records[0].max_price)
var previousRecord = APMCCustomRecords(
apmcdata.records[0].state,
apmcdata.records[0].district,
apmcdata.records[0].market,
list1,
list2,
list3
)
val ss = apmcdata.records[0].market
Log.d("PreREc", previousRecord.toString())
if (totalRecords == 1) {
customRecords.add(previousRecord)
} else {
var count = 0
for (i in 1..totalRecords - 1) {
if (apmcdata.records[i].market == previousRecord.market) {
previousRecord.commodity.add(apmcdata.records[i].commodity)
previousRecord.min_price.add(apmcdata.records[i].min_price)
previousRecord.max_price.add(apmcdata.records[i].max_price)
count = 1
} else {
count = 0
customRecords.add(previousRecord)
list1.add(apmcdata.records[i].commodity)
list2.add(apmcdata.records[i].min_price)
list3.add(apmcdata.records[i].max_price)
previousRecord = APMCCustomRecords(
apmcdata.records[i].state,
apmcdata.records[i].district,
apmcdata.records[i].market,
list1,
list2,
list3
)
}
}
if (count == 1) {
Log.d("LastRec", "Yes")
customRecords.add(previousRecord)
}
}
Log.d("New APMC Data", customRecords.toString())
Log.d("Old APMC Data", apmcdata.toString())
adapter = ApmcAdapter(activity!!.applicationContext, customRecords)
recycleAPMC.adapter = adapter
recycleAPMC.layoutManager =
LinearLayoutManager(activity!!.applicationContext)
progress_apmc.visibility = View.GONE
loadingTextAPMC.visibility = View.GONE
Log.d("bharat222", apmcdata.toString())
}
}
}
})
}
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/view/articles/ArticleListFragment.kt
================================================
package com.project.farmingapp.view.articles
import android.R.attr.fragment
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentTransaction
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import androidx.recyclerview.widget.GridLayoutManager
import com.project.farmingapp.R
import com.project.farmingapp.adapter.ArticleListAdapter
import com.project.farmingapp.utilities.CellClickListener
import com.project.farmingapp.viewmodel.ArticleViewModel
import kotlinx.android.synthetic.main.fragment_article_list.*
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"
/**
* A simple [Fragment] subclass.
* Use the [ArticleListFragment.newInstance] factory method to
* create an instance of this fragment.
*/
class ArticleListFragment : Fragment(), CellClickListener {
// TODO: Rename and change types of parameters
private var param1: String? = null
private var param2: String? = null
private lateinit var viewModel: ArticleViewModel
lateinit var Adapter: ArticleListAdapter
lateinit var fruitFragment: FruitsFragment
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
param1 = it.getString(ARG_PARAM1)
param2 = it.getString(ARG_PARAM2)
}
viewModel = ViewModelProviders.of(requireActivity())
.get(ArticleViewModel::class.java)
viewModel.getAllArticles("article_fruits")
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
viewModel.message3.observe(viewLifecycleOwner, Observer {
Log.d("Art All Data", it[0].data.toString())
Adapter = ArticleListAdapter(activity!!.applicationContext, it, this)
recyclerArticleListFrag.adapter = Adapter
recyclerArticleListFrag.layoutManager = GridLayoutManager(activity!!.applicationContext, 2)
})
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_article_list, container, false)
}
companion object {
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment ArticleListFragment.
*/
// TODO: Rename and change types and number of parameters
@JvmStatic
fun newInstance(param1: String, param2: String) =
ArticleListFragment().apply {
arguments = Bundle().apply {
putString(ARG_PARAM1, param1)
putString(ARG_PARAM2, param2)
}
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setHasOptionsMenu(true)
(activity as AppCompatActivity).supportActionBar?.title = "Articles"
}
override fun onCellClickListener(name: String) {
fruitFragment = FruitsFragment()
val bundle = Bundle()
bundle.putString("name", name)
fruitFragment.setArguments(bundle)
val transaction = activity!!.supportFragmentManager
.beginTransaction()
.replace(R.id.frame_layout, fruitFragment, name)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.setReorderingAllowed(true)
.addToBackStack("name")
.commit()
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/view/articles/FruitsFragment.kt
================================================
package com.project.farmingapp.view.articles
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.animation.RotateAnimation
import android.widget.ProgressBar
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.lifecycle.LiveData
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import com.bumptech.glide.Glide
import com.project.farmingapp.R
import com.project.farmingapp.utilities.hide
import com.project.farmingapp.utilities.show
import com.project.farmingapp.viewmodel.ArticleListener
import com.project.farmingapp.viewmodel.ArticleViewModel
import kotlinx.android.synthetic.main.fragment_fruits.*
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"
/**
* A simple [Fragment] subclass.
* Use the [FruitsFragment.newInstance] factory method to
* create an instance of this fragment.
*/
class FruitsFragment : Fragment(), ArticleListener {
// TODO: Rename and change types of parameters
private var param1: String? = null
private lateinit var viewModel: ArticleViewModel
private var param2: String? = null
private var param3: String? = null
val desc = ""
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
param1 = it.getString(ARG_PARAM1)
param2 = it.getString(ARG_PARAM2)
param3 = it.getString("name")
}
viewModel = ViewModelProviders.of(requireActivity())
.get(ArticleViewModel::class.java)
// viewModel.getAllArticles(tag!!)
val tag = this.tag.toString()
Log.d("I'm called 2", viewModel.message3.value.toString())
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
viewModel.message1.observe(viewLifecycleOwner, Observer {
progressArticle.show()
val attributes: Map = it.get("attributes") as Map
val desc = it.get("description").toString()
Log.d("I'm Called", "Yes")
val diseases: List = it.get("diseases") as List
Log.d("Diseases2", it.get("diseases").toString())
tempTextFruitFragArt.text = attributes.get("Temperature").toString()
monthTextFruitFragArt.text = attributes.get("Time").toString()
titleTextFruitFragArt.text = it.get("title").toString()
descTextValueFruitFragArt.text = desc
processTextValueFruitFragArt.text = it.get("process").toString()
soilTextValueFruitFragArt.text = it.get("soil").toString()
stateTextValueFruitFragArt.text = it.get("state").toString()
val images: List = it.get("images") as List
Glide.with(this)
.load(images[0])
.into(imageFruitFragArt)
attr1ValueFruitFragArt.text = attributes.get("Weight").toString()
attr2ValueFruitFragArt.text = attributes.get("Vitamins").toString()
attr3ValueFruitFragArt.text = attributes.get("Tree Height").toString()
attr4ValueFruitFragArt.text = attributes.get("growthTime").toString()
diseaseTextValueFruitFragArt.text = ""
for (i in 0..diseases.size - 1) {
diseaseTextValueFruitFragArt.text =
diseaseTextValueFruitFragArt.text.toString() +
(i + 1).toString() + ". " + diseases[i].toString() + "\n"
}
progressArticle.hide()
})
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_fruits, container, false)
}
companion object {
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment FruitsFragment.
*/
// TODO: Rename and change types and number of parameters
@JvmStatic
fun newInstance(param1: String, param2: String) =
FruitsFragment().apply {
arguments = Bundle().apply {
putString(ARG_PARAM1, param1)
putString(ARG_PARAM2, param2)
}
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setHasOptionsMenu(true)
(activity as AppCompatActivity).supportActionBar?.title = "Articles"
val params = descTextTitleFruitFragArt.layoutParams
var toggle = 0
descToggleBtnFruitFragArt.setOnClickListener {
if (toggle == 0) {
descTextValueFruitFragArt.maxLines = Integer.MAX_VALUE
toggle = 1
val rotateAnim = RotateAnimation(
0.0f, 180f,
RotateAnimation.RELATIVE_TO_SELF, 0.5f,
RotateAnimation.RELATIVE_TO_SELF, 0.5f
)
rotateAnim.duration = 2
rotateAnim.fillAfter = true
descToggleBtnFruitFragArt.startAnimation(rotateAnim)
} else if (toggle == 1) {
descTextValueFruitFragArt.maxLines = 3
toggle = 0
val rotateAnim = RotateAnimation(
180f, 0f,
RotateAnimation.RELATIVE_TO_SELF, 0.5f,
RotateAnimation.RELATIVE_TO_SELF, 0.5f
)
rotateAnim.duration = 2
rotateAnim.fillAfter = true
descToggleBtnFruitFragArt.startAnimation(rotateAnim)
}
}
// New
val newData = viewModel.message3.value
Log.d("New data length", newData!!.size.toString())
val newDataLength = newData!!.size
for (a in 0 until newDataLength) {
if (newData[a].data!!.get("title") == this.tag) {
var data = newData[a].data
val attributes: Map =
data!!.get("attributes") as Map
val desc = data!!.get("description").toString()
val diseases: List = data!!.get("diseases") as List
Log.d("I'm Called3", attributes.get("Temperature").toString())
Log.d("I'm Called", "Yes")
Log.d("Diseases2", data!!.get("diseases").toString())
tempTextFruitFragArt.text = attributes.get("Temperature").toString()
monthTextFruitFragArt.text = attributes.get("Time").toString()
titleTextFruitFragArt.text = data!!.get("title").toString()
descTextValueFruitFragArt.text = desc
processTextValueFruitFragArt.text = data!!.get("process").toString()
soilTextValueFruitFragArt.text = data!!.get("soil").toString()
stateTextValueFruitFragArt.text = data!!.get("state").toString()
val images: List = data!!.get("images") as List
Glide.with(this)
.load(images[0])
.into(imageFruitFragArt)
attr1ValueFruitFragArt.text = attributes.get("Weight").toString()
attr2ValueFruitFragArt.text = attributes.get("Vitamins").toString()
attr3ValueFruitFragArt.text = attributes.get("Tree Height").toString()
attr4ValueFruitFragArt.text = attributes.get("growthTime").toString()
diseaseTextValueFruitFragArt.text = ""
for (i in 0..diseases.size - 1) {
diseaseTextValueFruitFragArt.text =
diseaseTextValueFruitFragArt.text.toString() +
(i + 1).toString() + ". " + diseases[i].toString() + "\n"
}
progressArticle.hide()
}
}
}
override fun onStarted() {
TODO("Not yet implemented")
}
override fun onSuccess(authRepo: LiveData) {
authRepo.observe(viewLifecycleOwner, Observer {
Log.d("Fruit", "Success")
})
}
override fun onFailure(message: String) {
TODO("Not yet implemented")
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/view/articles/MachineFragment.kt
================================================
package com.project.farmingapp.view.articles
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.project.farmingapp.R
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"
/**
* A simple [Fragment] subclass.
* Use the [MachineFragment.newInstance] factory method to
* create an instance of this fragment.
*/
class MachineFragment : Fragment() {
// TODO: Rename and change types of parameters
private var param1: String? = null
private var param2: String? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
param1 = it.getString(ARG_PARAM1)
param2 = it.getString(ARG_PARAM2)
}
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_machine, container, false)
}
companion object {
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment MachineFragment.
*/
// TODO: Rename and change types and number of parameters
@JvmStatic
fun newInstance(param1: String, param2: String) =
MachineFragment().apply {
arguments = Bundle().apply {
putString(ARG_PARAM1, param1)
putString(ARG_PARAM2, param2)
}
}
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/view/auth/LoginActivity.kt
================================================
package com.project.farmingapp.view.auth
import android.content.Intent
import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.LiveData
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import com.google.android.gms.auth.api.signin.GoogleSignIn
import com.google.android.gms.auth.api.signin.GoogleSignInClient
import com.google.android.gms.auth.api.signin.GoogleSignInOptions
import com.google.firebase.auth.FirebaseAuth
import com.project.farmingapp.R
import com.project.farmingapp.databinding.ActivityLoginBinding
import com.project.farmingapp.utilities.hide
import com.project.farmingapp.utilities.show
import com.project.farmingapp.utilities.toast
import com.project.farmingapp.view.dashboard.DashboardActivity
import com.project.farmingapp.viewmodel.AuthListener
import com.project.farmingapp.viewmodel.AuthViewModel
import kotlinx.android.synthetic.main.activity_login.*
class LoginActivity : AppCompatActivity(), AuthListener {
lateinit var googleSignInClient: GoogleSignInClient
val firebaseAuth = FirebaseAuth.getInstance()
lateinit var viewModel: AuthViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding: ActivityLoginBinding =
DataBindingUtil.setContentView(this, R.layout.activity_login)
viewModel = ViewModelProviders.of(this).get(AuthViewModel::class.java)
binding.authViewModel = viewModel
viewModel.authListener = this
if (firebaseAuth.currentUser != null) {
Intent(this, DashboardActivity::class.java).also {
startActivity(it)
}
}
createaccountText.setOnClickListener {
Intent(this, SignupActivity::class.java).also {
startActivity(it)
}
}
signGoogleBtnLogin.setOnClickListener {
signIn()
}
forgotPasswdTextLogin.setOnClickListener {
val userEmail = emailEditLogin.text.toString()
if (userEmail.isNullOrEmpty()) {
Toast.makeText(this, "Please enter your Email", Toast.LENGTH_SHORT).show()
} else {
// Toast.makeText(this, "Please enter your Email", Toast.LENGTH_SHORT).show()
firebaseAuth.sendPasswordResetEmail(userEmail)
.addOnCompleteListener {
if (it.isSuccessful) {
Toast.makeText(this, "Email Sent", Toast.LENGTH_LONG).show()
}
}
.addOnFailureListener {
Toast.makeText(this, it.message, Toast.LENGTH_SHORT).show()
}
}
}
}
//googlesignIn
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
viewModel.returnActivityResult(requestCode, resultCode, data)
}
fun signIn() {
val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build()
googleSignInClient = GoogleSignIn.getClient(this, gso)
val signInIntent = googleSignInClient.signInIntent
startActivityForResult(signInIntent, RC_SIGN_IN)
}
override fun onBackPressed() {
super.onBackPressed()
val a = Intent(Intent.ACTION_MAIN)
a.addCategory(Intent.CATEGORY_HOME)
a.flags = Intent.FLAG_ACTIVITY_NEW_TASK
startActivity(a)
}
companion object {
private const val TAG = "GoogleActivity"
private const val RC_SIGN_IN = 9001
}
override fun onStarted() {
progressLogin.show()
}
override fun onSuccess(authRepo: LiveData) {
authRepo.observe(this, Observer {
progressLogin.hide()
if (it.toString() == "Success") {
toast("Logged In")
Toast.makeText(this, it.toString(), Toast.LENGTH_LONG).show()
Intent(this, DashboardActivity::class.java).also {
startActivity(it)
}
}
})
}
override fun onFailure(message: String) {
progressLogin.hide()
toast("Failure")
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/view/auth/SignupActivity.kt
================================================
package com.project.farmingapp.view.auth
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.LiveData
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import com.google.android.gms.auth.api.signin.GoogleSignIn
import com.google.android.gms.auth.api.signin.GoogleSignInClient
import com.google.android.gms.auth.api.signin.GoogleSignInOptions
import com.google.android.gms.common.api.ApiException
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.auth.GoogleAuthProvider
import com.project.farmingapp.R
import com.project.farmingapp.databinding.ActivitySignupBinding
import com.project.farmingapp.utilities.hide
import com.project.farmingapp.utilities.show
import com.project.farmingapp.utilities.toast
import com.project.farmingapp.view.dashboard.DashboardActivity
import com.project.farmingapp.viewmodel.AuthListener
import com.project.farmingapp.viewmodel.AuthViewModel
import kotlinx.android.synthetic.main.activity_signup.*
class SignupActivity : AppCompatActivity(), AuthListener {
lateinit var googleSignInClient: GoogleSignInClient
val firebaseAuth = FirebaseAuth.getInstance()
lateinit var viewModel: AuthViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding: ActivitySignupBinding =
DataBindingUtil.setContentView(this, R.layout.activity_signup)
viewModel = ViewModelProviders.of(this).get(AuthViewModel::class.java)
binding.authViewModel = viewModel
viewModel.authListener = this
loginRedirectTextSignup.setOnClickListener {
Intent(this, LoginActivity::class.java).also {
startActivity(it)
}
}
signGoogleBtnSignup.setOnClickListener {
signIn()
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
viewModel.returnActivityResult(requestCode, resultCode, data)
}
fun signIn() {
val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build()
googleSignInClient = GoogleSignIn.getClient(this, gso)
val signInIntent = googleSignInClient.signInIntent
startActivityForResult(signInIntent, RC_SIGN_IN)
}
companion object {
private const val TAG = "GoogleActivity"
private const val RC_SIGN_IN = 9001
}
override fun onStarted() {
progressSignup.show()
}
override fun onSuccess(authRepo: LiveData) {
authRepo.observe(this, Observer {
progressSignup.hide()
if (it.toString() == "Success") {
toast("Account Created")
Intent(this, DashboardActivity::class.java).also {
startActivity(it)
}
}
})
}
override fun onFailure(message: String) {
progressSignup.hide()
toast("Failure")
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/view/dashboard/DashboardActivity.kt
================================================
package com.project.farmingapp.view.dashboard
import android.Manifest
import android.annotation.SuppressLint
import android.content.Context
import android.content.DialogInterface
import android.content.Intent
import android.content.SharedPreferences
import android.content.pm.PackageManager
import android.location.Address
import android.location.Geocoder
import android.location.Location
import android.location.LocationManager
import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.Handler
import android.os.PersistableBundle
import android.provider.Settings
import android.service.autofill.UserData
import android.util.AttributeSet
import android.util.Log
import android.view.Gravity
import android.view.MenuItem
import android.view.View
import android.widget.TextView
import android.widget.Toast
import android.widget.Toolbar
import androidx.appcompat.app.ActionBarDrawerToggle
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatDelegate
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.core.view.GravityCompat
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentTransaction
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.ViewModelProviders
import androidx.navigation.NavController
import androidx.recyclerview.widget.LinearLayoutManager
import com.bumptech.glide.Glide
import com.bumptech.glide.Glide.with
import com.google.android.gms.common.api.GoogleApiClient
import com.google.android.gms.location.LocationRequest
import com.google.android.gms.location.LocationServices
import com.google.android.material.navigation.NavigationView
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.firestore.DocumentSnapshot
import com.google.firebase.firestore.FirebaseFirestore
import com.project.farmingapp.R
import com.project.farmingapp.adapter.CurrentWeatherAdapter
import com.project.farmingapp.adapter.WeatherAdapter
import com.project.farmingapp.databinding.ActivityDashboardBinding
import com.project.farmingapp.model.WeatherApi
import com.project.farmingapp.model.data.Weather
import com.project.farmingapp.model.data.WeatherList
import com.project.farmingapp.model.data.WeatherRootList
import com.project.farmingapp.view.apmc.ApmcFragment
import com.project.farmingapp.view.articles.ArticleListFragment
import com.project.farmingapp.view.articles.FruitsFragment
import com.project.farmingapp.view.auth.LoginActivity
import com.project.farmingapp.view.ecommerce.*
import com.project.farmingapp.view.introscreen.IntroActivity
import com.project.farmingapp.view.socialmedia.SMCreatePostFragment
import com.project.farmingapp.view.socialmedia.SocialMediaPostsFragment
import com.project.farmingapp.view.user.UserFragment
import com.project.farmingapp.view.weather.WeatherFragment
import com.project.farmingapp.viewmodel.UserDataViewModel
import com.project.farmingapp.viewmodel.UserProfilePostsViewModel
import com.project.farmingapp.viewmodel.WeatherViewModel
import com.squareup.picasso.Picasso
import com.squareup.picasso.PicassoProvider
import kotlinx.android.synthetic.main.activity_dashboard.*
import kotlinx.android.synthetic.main.app_bar_main.*
import kotlinx.android.synthetic.main.fragment_weather.*
import kotlinx.android.synthetic.main.nav_header.*
import kotlinx.android.synthetic.main.nav_header.view.*
import org.w3c.dom.Document
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import retrofit2.Retrofit
import java.util.*
import kotlin.collections.ArrayList
class DashboardActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener, View.OnClickListener, com.google.android.gms.location.LocationListener {
lateinit var cartFragment: CartFragment
lateinit var ecommerceItemFragment: EcommerceItemFragment
lateinit var paymentFragment: PaymentFragment
lateinit var dashboardFragment: dashboardFragment
lateinit var ecommerceFragment: EcommerceFragment
lateinit var weatherFragment: WeatherFragment
lateinit var navController: NavController
lateinit var toggle: ActionBarDrawerToggle
lateinit var blankFragment1: WeatherFragment
lateinit var apmcFragment: ApmcFragment
lateinit var articleListFragment: ArticleListFragment
lateinit var myOrdersFragment: MyOrdersFragment
lateinit var userFragment: UserFragment
lateinit var socialMediaPostFragment: SocialMediaPostsFragment
lateinit var smCreatePostFragment: SMCreatePostFragment
private lateinit var viewModel: UserDataViewModel
private lateinit var viewModel2: UserProfilePostsViewModel
private lateinit var weatherViewModel: WeatherViewModel
lateinit var sharedPreferences: SharedPreferences
val firebaseFireStore = FirebaseFirestore.getInstance()
val firebaseAuth = FirebaseAuth.getInstance()
var userName = ""
var data: WeatherRootList? = null
var firstTime: Boolean? = null
private var REQUEST_LOCATION_CODE = 101
private var mGoogleApiClient: GoogleApiClient? = null
private var mLocation: Location? = null
private var mLocationRequest: LocationRequest? = null
private val UPDATE_INTERVAL = (2 * 1000).toLong() /* 10 secs */
private val FASTEST_INTERVAL: Long = 2000 /* 2 sec */
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_dashboard)
val binding: ActivityDashboardBinding = DataBindingUtil.setContentView(this, R.layout.activity_dashboard)
viewModel = ViewModelProviders.of(this).get(UserDataViewModel::class.java)
binding.userDataViewModel = viewModel
toggle = ActionBarDrawerToggle(this, drawerLayout, R.string.open, R.string.close)
drawerLayout.addDrawerListener(toggle)
toggle.syncState()
weatherViewModel = ViewModelProviders.of(this)
.get(WeatherViewModel::class.java)
viewModel2 = ViewModelProviders.of(this)
.get(UserProfilePostsViewModel::class.java)
// viewModel2.getAllPosts(firebaseAuth.currentUser!!.email.toString())
mGoogleApiClient = GoogleApiClient.Builder(this)
.addApi(LocationServices.API)
.build()
mGoogleApiClient!!.connect()
buildGoogleApiClient()
val currentUser = firebaseAuth.currentUser
sharedPreferences = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE)
firstTime =sharedPreferences.getBoolean("firstTime", true);
if(firstTime!!){
Intent(this, IntroActivity::class.java).also {
startActivity(it)
}
// val editor = sharedPreferences.edit()
// firstTime = false;
// editor.putBoolean("firstTime", firstTime!!)
// editor.apply()
finish()
return
} else{
if(currentUser == null){
Intent(this, LoginActivity::class.java).also {
startActivity(it)
}
finish()
return
} else{
}
}
viewModel.getUserData(firebaseAuth.currentUser!!.email as String)
navView.setNavigationItemSelectedListener(this)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.title = "Farming App"
ecommerceItemFragment=EcommerceItemFragment()
dashboardFragment = dashboardFragment()
weatherFragment = WeatherFragment()
supportFragmentManager
.beginTransaction()
.replace(R.id.frame_layout, dashboardFragment, "dashFrag")
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.setReorderingAllowed(true)
.commit()
bottomNav.selectedItemId = R.id.bottomNavHome
val something = navView.getHeaderView(0);
if (dashboardFragment.isVisible) {
bottomNav.selectedItemId = R.id.bottomNavHome
}
something.setOnClickListener {
Toast.makeText(this, "You Clicked Slider", Toast.LENGTH_LONG).show()
if (drawerLayout.isDrawerOpen(GravityCompat.START)) {
drawerLayout.closeDrawer(GravityCompat.START)
} else {
super.onBackPressed()
}
userFragment = UserFragment()
supportFragmentManager.beginTransaction().apply {
replace(R.id.frame_layout, userFragment, "userFrag")
setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
setReorderingAllowed(true)
addToBackStack("userFrag")
commit()
}
}
apmcFragment = ApmcFragment()
socialMediaPostFragment = SocialMediaPostsFragment()
ecommerceFragment=EcommerceFragment()
paymentFragment = PaymentFragment()
cartFragment= CartFragment()
myOrdersFragment=MyOrdersFragment()
bottomNav.setOnNavigationItemSelectedListener {
when (it.itemId) {
R.id.bottomNavAPMC -> {
supportFragmentManager.beginTransaction().apply {
replace(R.id.frame_layout, apmcFragment, "apmcFrag")
setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
setReorderingAllowed(true)
addToBackStack("apmcFrag")
commit()
}
}
R.id.bottomNavHome -> {
supportFragmentManager.beginTransaction().apply {
replace(R.id.frame_layout, dashboardFragment, "dashFrag")
setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
setReorderingAllowed(true)
addToBackStack("dashFrag")
commit()
}
}
R.id.bottomNavEcomm -> {
ecommerceFragment = EcommerceFragment()
supportFragmentManager.beginTransaction().apply {
replace(R.id.frame_layout, ecommerceFragment, "ecommItemFrag")
setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
setReorderingAllowed(true)
addToBackStack("ecommItemFrag")
commit()
}
}
R.id.bottomNavPost -> {
socialMediaPostFragment = SocialMediaPostsFragment()
supportFragmentManager.beginTransaction().apply {
replace(R.id.frame_layout, socialMediaPostFragment, "socialFrag")
setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
setReorderingAllowed(true)
addToBackStack("socialFrag")
commit()
}
}
}
true
}
viewModel.userliveData.observe(this, Observer {
val something = navView.getHeaderView(0);
val posts = it.get("posts") as List
val city = it.get("city")
userName = it.get("name").toString()
// val allPosts = viewModel2.liveData3.value as ArrayList
if(city == null){
something.cityTextNavHeader.text ="City: "
} else{
something.cityTextNavHeader.text ="City: " + it.get("city").toString()
}
something.navbarUserName.text = userName
something.navbarUserEmail.text = firebaseAuth.currentUser!!.email
Glide.with(this).load(it.get("profileImage")).into(something.navbarUserImage)
Log.d("User Data from VM", it.getString("name"))
something.navBarUserPostCount.text = "Posts Count: " + posts.size.toString()
})
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (toggle.onOptionsItemSelected(item)) {
return true
}
return super.onOptionsItemSelected(item)
}
private fun setCurrentFragment(fragment: Fragment) {
supportFragmentManager.beginTransaction().apply {
replace(R.id.frame_layout, fragment)
setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
setReorderingAllowed(true)
addToBackStack("name")
commit()
}
}
override fun onPostCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
super.onPostCreate(savedInstanceState, persistentState)
toggle.syncState()
}
override fun onNavigationItemSelected(item: MenuItem): Boolean {
bottomNav.selectedItemId = R.id.bottomNavHome
when (item.itemId) {
R.id.miItem1 -> {
ecommerceFragment = EcommerceFragment()
supportFragmentManager
.beginTransaction()
.replace(R.id.frame_layout, ecommerceFragment, "ecommListFrag")
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.setReorderingAllowed(true)
.addToBackStack("ecommListFrag")
.commit()
}
R.id.miItem2 -> {
apmcFragment = ApmcFragment()
supportFragmentManager
.beginTransaction()
.replace(R.id.frame_layout, apmcFragment, "apmcFrag")
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.setReorderingAllowed(true)
.addToBackStack("apmcFrag")
.commit()
}
R.id.miItem3 ->{
smCreatePostFragment = SMCreatePostFragment()
supportFragmentManager
.beginTransaction()
.replace(R.id.frame_layout, smCreatePostFragment, "createPostFrag")
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.setReorderingAllowed(true)
.addToBackStack("createPostFrag")
.commit()
}
R.id.miItem4 -> {
socialMediaPostFragment = SocialMediaPostsFragment()
supportFragmentManager
.beginTransaction()
.replace(R.id.frame_layout, socialMediaPostFragment, "socialFrag")
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.setReorderingAllowed(true)
.addToBackStack("socialFrag")
.commit()
}
R.id.miItem5 -> {
weatherFragment = WeatherFragment()
supportFragmentManager
.beginTransaction()
.replace(R.id.frame_layout, weatherFragment, "weatherFrag")
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.setReorderingAllowed(true)
.addToBackStack("weatherFrag")
.commit()
}
R.id.miItem6 -> {
articleListFragment = ArticleListFragment()
supportFragmentManager
.beginTransaction()
.replace(R.id.frame_layout, articleListFragment, "articleListFrag")
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.setReorderingAllowed(true)
.addToBackStack("articleListFrag")
.commit()
}
R.id.miItem7 -> {
supportFragmentManager
.beginTransaction()
.replace(R.id.frame_layout, myOrdersFragment, "myOrdersFrag")
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.setReorderingAllowed(true)
.addToBackStack("myOrdersFrag")
.commit()
}
R.id.miItem8 -> {
val builder = AlertDialog.Builder(this)
builder.setTitle("Log Out")
.setMessage("Do you want to logout?")
.setPositiveButton("Yes") { dialogInterface, i ->
firebaseAuth.signOut()
Toast.makeText(this, "Logged Out", Toast.LENGTH_LONG).show()
Intent(this, LoginActivity::class.java).also {
startActivity(it)
}
}
.setNegativeButton("No") { dialogInterface, i ->
}
.show()
}
}
drawerLayout.closeDrawer(GravityCompat.START)
return true
}
override fun onBackPressed() {
super.onBackPressed()
if (dashboardFragment.isVisible) {
if (drawerLayout.isDrawerOpen(GravityCompat.START)) {
drawerLayout.closeDrawer(GravityCompat.START)
} else {
}
}
}
fun automatedClick(){
if (!checkGPSEnabled()) {
return
}
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
//Location Permission already granted
getLocation();
} else {
//Request Location Permission
checkLocationPermission()
}
} else {
getLocation();
// buildGoogleApiClient()
}
}
override fun onClick(v: View?) {
if (!checkGPSEnabled()) {
return
}
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
//Location Permission already granted
getLocation();
} else {
//Request Location Permission
checkLocationPermission()
}
} else {
getLocation();
}
}
@SuppressLint("MissingPermission")
private fun getLocation() {
mLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
if (mLocation == null) {
startLocationUpdates();
}
if (mLocation != null) {
Toast.makeText(this, "Lat: " + mLocation!!.latitude.toString(), Toast.LENGTH_SHORT).show()
Toast.makeText(this, "Long: " + mLocation!!.longitude.toString(), Toast.LENGTH_SHORT).show()
val coords = mutableListOf()
val geocoder = Geocoder(this, Locale.getDefault())
val addresses: List = geocoder.getFromLocation(mLocation!!.latitude, mLocation!!.longitude, 1)
coords.add(mLocation!!.latitude.toString())
coords.add(mLocation!!.longitude.toString())
coords.add(addresses[0].locality.toString())
weatherViewModel.updateCoordinates(coords)
} else {
Toast.makeText(this, "Location not Detected", Toast.LENGTH_SHORT).show();
}
}
private fun startLocationUpdates() {
// Create the location request
mLocationRequest = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setInterval(UPDATE_INTERVAL)
.setFastestInterval(FASTEST_INTERVAL)
// Request location updates
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return
}
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this)
}
override fun onLocationChanged(p0: Location?) {
// automatedClick()
}
@Synchronized
private fun buildGoogleApiClient() {
mGoogleApiClient = GoogleApiClient.Builder(this)
.addApi(LocationServices.API)
.build()
mGoogleApiClient!!.connect()
// automatedClick()
}
private fun checkGPSEnabled(): Boolean {
if (!isLocationEnabled())
showAlert()
return isLocationEnabled()
}
private fun showAlert() {
val dialog = android.app.AlertDialog.Builder(this)
dialog.setTitle("Enable Location")
.setMessage("Your Locations Settings is set to 'Off'.\nPlease Enable Location to use this app!")
.setPositiveButton("Location Settings") { paramDialogInterface, paramInt ->
val myIntent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)
startActivity(myIntent)
}
.setNegativeButton("Cancel") { paramDialogInterface, paramInt -> }
dialog.show()
}
private fun isLocationEnabled(): Boolean {
var locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager
return locationManager!!.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager!!.isProviderEnabled(
LocationManager.NETWORK_PROVIDER)
}
private fun checkLocationPermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) {
android.app.AlertDialog.Builder(this)
.setTitle("Location Permission Needed")
.setMessage("This app needs the Location Permissions!\nPlease accept to use location functionality.")
.setPositiveButton("OK", DialogInterface.OnClickListener { dialog, which ->
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), REQUEST_LOCATION_CODE)
})
.create()
.show()
} else ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), REQUEST_LOCATION_CODE)
}
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) {
when (requestCode) {
REQUEST_LOCATION_CODE -> {
// If request is cancelled, the result arrays are empty.
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the location-related task you need to do.
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "Permission Granted", Toast.LENGTH_LONG).show()
automatedClick()
}
} else {
// permission denied, boo! Disable the functionality that depends on this permission.
Toast.makeText(this, "Permission Denied", Toast.LENGTH_LONG).show()
}
return
}
}
}
override fun onStart() {
super.onStart()
mGoogleApiClient?.connect()
Handler().postDelayed({
automatedClick()
}, 1000)
}
override fun onStop() {
super.onStop()
if (mGoogleApiClient!!.isConnected()) {
mGoogleApiClient!!.disconnect()
}
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/view/dashboard/DashboardFragment.kt
================================================
package com.project.farmingapp.view.dashboard
import android.content.Context
import android.content.SharedPreferences
import android.os.Bundle
import android.preference.PreferenceManager
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.GridLayout
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentTransaction
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import androidx.recyclerview.widget.GridLayoutManager
import com.bumptech.glide.Glide
import com.google.gson.JsonObject
import com.project.farmingapp.R
import com.project.farmingapp.adapter.DashboardEcomItemAdapter
import com.project.farmingapp.model.WeatherApi
import com.project.farmingapp.model.data.WeatherRootList
import com.project.farmingapp.utilities.CellClickListener
import com.project.farmingapp.view.articles.ArticleListFragment
import com.project.farmingapp.view.articles.FruitsFragment
import com.project.farmingapp.view.ecommerce.EcommerceItemFragment
import com.project.farmingapp.view.weather.WeatherFragment
import com.project.farmingapp.view.yojna.YojnaListFragment
import com.project.farmingapp.viewmodel.ArticleViewModel
import com.project.farmingapp.viewmodel.EcommViewModel
import com.project.farmingapp.viewmodel.WeatherViewModel
import kotlinx.android.synthetic.main.fragment_dashboard.*
import org.json.JSONObject
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import kotlin.random.Random
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"
/**
* A simple [Fragment] subclass.
* Use the [dashboardFragment.newInstance] factory method to
* create an instance of this fragment.
*/
class dashboardFragment : Fragment(), CellClickListener {
// TODO: Rename and change types of parameters
private var param1: String? = null
private var param2: String? = null
lateinit var weatherFragment: WeatherFragment
lateinit var fruitsFragment: FruitsFragment
lateinit var yojnaListFragment: YojnaListFragment
lateinit var articleListFragment: ArticleListFragment
private lateinit var viewModel: WeatherViewModel
private lateinit var viewModel2: EcommViewModel
var data: WeatherRootList? = null
lateinit var sharedPreferences: SharedPreferences
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
param1 = it.getString(ARG_PARAM1)
param2 = it.getString(ARG_PARAM2)
}
viewModel = ViewModelProviders.of(requireActivity())
.get(WeatherViewModel::class.java)
viewModel2 = ViewModelProviders.of(requireActivity())
.get(EcommViewModel::class.java)
viewModel2.loadAllEcommItems()
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
viewModel.getCoordinates().observe(viewLifecycleOwner, Observer {
Log.d("DashFrag", it.toString())
viewModel.updateNewData()
val city = it.get(2) as String
viewModel.newDataTrial.observe(viewLifecycleOwner, Observer {
Log.d("Observed Here", "Yes")
weathTempTextWeathFrag.text =
(it.list[0].main.temp - 273).toInt().toString() + "\u2103"
humidityTextWeathFrag.text =
"Humidity: " + it!!.list[0].main.humidity.toString() + " %"
windTextWeathFrag.text = "Wind: " + it!!.list[0].wind.speed.toString() + " km/hr"
weatherCityTitle.text = city.toString()
var iconcode = it!!.list[0].weather[0].icon
var iconurl = "https://openweathermap.org/img/w/" + iconcode + ".png";
Glide.with(activity!!.applicationContext).load(iconurl)
.into(weathIconImageWeathFrag)
})
})
viewModel2.ecommLiveData.observe(viewLifecycleOwner, Observer {
var itemsToShow = (0..it.size - 1).shuffled().take(4) as List
val adapterEcomm =
DashboardEcomItemAdapter(activity!!.applicationContext, it, itemsToShow, this)
dashboardEcommRecycler.adapter = adapterEcomm
dashboardEcommRecycler.layoutManager =
GridLayoutManager(activity!!.applicationContext, 2)
})
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_dashboard, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setHasOptionsMenu(true)
(activity as AppCompatActivity).supportActionBar?.title = "Agri India"
weatherCard.setOnClickListener {
weatherFragment = WeatherFragment()
val transaction = activity!!.supportFragmentManager
.beginTransaction()
.replace(R.id.frame_layout, weatherFragment, "name2")
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.setReorderingAllowed(true)
.addToBackStack("name")
.commit()
data?.let { it1 -> viewModel.messageToB(it1) }
}
viewModel = ViewModelProviders.of(requireActivity())
.get(WeatherViewModel::class.java)
viewModel.getMessageA()
.observe(viewLifecycleOwner, object : Observer {
override fun onChanged(t: WeatherRootList?) {
Log.d("DashFrag Data Changed A", "B")
}
})
cat4.setOnClickListener {
yojnaListFragment = YojnaListFragment()
val transaction = activity!!.supportFragmentManager
.beginTransaction()
.replace(R.id.frame_layout, yojnaListFragment, "yojnaListFrag")
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.setReorderingAllowed(true)
.addToBackStack("yojnaListFrag")
.commit()
}
cat5.setOnClickListener {
articleListFragment = ArticleListFragment()
val transaction = activity!!.supportFragmentManager
.beginTransaction()
.replace(R.id.frame_layout, articleListFragment, "articlesListFrag")
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.setReorderingAllowed(true)
.addToBackStack("articlesListFrag")
.commit()
}
}
companion object {
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment dashboardFragment.
*/
// TODO: Rename and change types and number of parameters
@JvmStatic
fun newInstance(param1: String, param2: String) =
dashboardFragment().apply {
arguments = Bundle().apply {
putString(ARG_PARAM1, param1)
putString(ARG_PARAM2, param2)
}
}
}
override fun onStop() {
super.onStop()
}
override fun onCellClickListener(name: String) {
val ecommerceItemFragment = EcommerceItemFragment()
val transaction = activity!!.supportFragmentManager
.beginTransaction()
.replace(R.id.frame_layout, ecommerceItemFragment, name)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.setReorderingAllowed(true)
.addToBackStack("name")
.commit()
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/view/ecommerce/CartFragment.kt
================================================
package com.project.farmingapp.view.ecommerce
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.*
import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.database.DataSnapshot
import com.google.firebase.database.DatabaseError
import com.google.firebase.database.FirebaseDatabase
import com.google.firebase.database.ValueEventListener
import com.project.farmingapp.PrePaymentFragment
import com.project.farmingapp.R
import com.project.farmingapp.adapter.CartItemsAdapter
import com.project.farmingapp.utilities.CartItemBuy
import com.project.farmingapp.viewmodel.EcommViewModel
import kotlinx.android.synthetic.main.fragment_cart.*
import kotlin.collections.HashMap
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"
/**
* A simple [Fragment] subclass.
* Use the [CartFragment.newInstance] factory method to
* create an instance of this fragment.
*/
class CartFragment : Fragment(), CartItemBuy {
private var param1: String? = null
private var param2: String? = null
var isOpened: Boolean = false
var totalCount = 0
var totalPrice = 0
var items = HashMap()
lateinit var ecommViewModel: EcommViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
param1 = it.getString(ARG_PARAM1)
param2 = it.getString(ARG_PARAM2)
}
ecommViewModel = EcommViewModel()
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
setHasOptionsMenu(true)
return inflater.inflate(R.layout.fragment_cart, container, false)
}
companion object {
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment CartFragment.
*/
// TODO: Rename and change types and number of parameters
@JvmStatic
fun newInstance(param1: String, param2: String) =
CartFragment().apply {
arguments = Bundle().apply {
putString(ARG_PARAM1, param1)
putString(ARG_PARAM2, param2)
}
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val firebaseDatabase = FirebaseDatabase.getInstance()
val firebaseAuth = FirebaseAuth.getInstance()
val cartRef =
firebaseDatabase.getReference("${firebaseAuth.currentUser!!.uid}").child("cart")
(activity as AppCompatActivity).supportActionBar?.title = "Cart"
isOpened = true
val postListener = object : ValueEventListener {
override fun onCancelled(error: DatabaseError) {
TODO("Not yet implemented")
}
override fun onDataChange(dataSnapshot: DataSnapshot) {
if (dataSnapshot.exists()) {
items = dataSnapshot.value as HashMap
var totalCartPrice = 0
for ((key, value) in items) {
val currVal = value as Map
Log.d("Total Items", key.toString())
Log.d("Total Items", value.toString())
ecommViewModel.getSpecificItem("${key}")
.observe(viewLifecycleOwner, Observer {
totalCartPrice += currVal.get("quantity").toString()
.toInt() * it.get("price").toString().toInt() + it.get("delCharge").toString().toInt()
Log.d("Total Price", currVal.get("quantity").toString())
Log.d("Total Price", it.get("price").toString())
Log.d("Total Price - 2", (currVal.get("quantity").toString().toInt()*it.get("price").toString().toInt()).toString())
totalItemsValue.text = items.size.toString()
totalCostValue.text = "\u20B9" + totalCartPrice.toString()
})
Log.d("Total Price - 3", key.toString())
}
if (isOpened == true) {
totalItemsValue.text = items.size.toString()
totalCostValue.text = "\u20B9" + totalCartPrice.toString()
}
val adapter =
CartItemsAdapter(this@CartFragment, items, this@CartFragment)
recyclerCart.adapter = adapter
recyclerCart.layoutManager = LinearLayoutManager(activity!!.applicationContext)
progress_cart.visibility = View.GONE
loadingTitleText.visibility = View.GONE
} else {
Toast.makeText(
activity!!.applicationContext,
"Item Not Exist",
Toast.LENGTH_SHORT
).show()
progress_cart.visibility = View.GONE
loadingTitleText.visibility = View.GONE
}
}
}
cartRef.addValueEventListener(postListener)
buyAllBtn.setOnClickListener {
// prePaymentfragment = PrePaymentFragment()
// val bundle = Bundle()
//
// val transaction = activity!!.supportFragmentManager
// .beginTransaction()
// .replace(R.id.frame_layout, prePaymentfragment)
// .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
// .setReorderingAllowed(true)
// .addToBackStack("name")
// .commit()
//val TotalPrice=totalCostValue.text.toString()
//var products_id:ArrayList
// products_id.add()
// Intent (activity!!.applicationContext, RazorPayActivity::class.java).also {
// it.putExtra("tp",totalPrice)
// it.putExtra()
// startActivity(it)
// }
}
}
override fun addToOrders(productId: String, quantity: Int, itemCost: Int, deliveryCost: Int) {
Intent(activity!!.applicationContext, RazorPayActivity::class.java).also {
// it.putExtra("tp", "123")
it.putExtra("productId", productId)
it.putExtra("itemCost", itemCost.toString())
it.putExtra("quantity", quantity.toString())
it.putExtra("deliveryCost", deliveryCost.toString())
startActivity(it)
}
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/view/ecommerce/EcommerceFragment.kt
================================================
package com.project.farmingapp.view.ecommerce
import android.os.Bundle
import android.util.Log
import android.view.*
import androidx.fragment.app.Fragment
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.FragmentTransaction
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.chip.ChipGroup
import com.google.firebase.firestore.FirebaseFirestore
import com.google.firebase.firestore.Query
import com.project.farmingapp.R
import com.project.farmingapp.adapter.EcommerceAdapter
import com.project.farmingapp.utilities.CellClickListener
import com.project.farmingapp.viewmodel.EcommViewModel
import kotlinx.android.synthetic.main.fragment_ecommerce.*
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"
/**
* A simple [Fragment] subclass.
* Use the [EcommerceFragment.newInstance] factory method to
* create an instance of this fragment.
*/
class EcommerceFragment : Fragment(), CellClickListener {
private lateinit var viewmodel: EcommViewModel
private var adapter: EcommerceAdapter? = null
lateinit var ecommerceItemFragment: EcommerceItemFragment
// TODO: Rename and change types of parameters
private var param1: String? = null
private var param2: String? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
param1 = it.getString(ARG_PARAM1)
param2 = it.getString(ARG_PARAM2)
viewmodel = ViewModelProviders.of(requireActivity())
.get(EcommViewModel::class.java)
// viewmodel = ViewModelProviders.of(requireActivity())
// .get(EcommViewModel::class.java)
viewmodel.loadAllEcommItems()
}
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
viewmodel = ViewModelProviders.of(requireActivity())
.get(EcommViewModel::class.java)
viewmodel.ecommLiveData.observe(viewLifecycleOwner, Observer {
adapter = EcommerceAdapter(activity!!.applicationContext, it, this)
ecommrcyclr.adapter = adapter
ecommrcyclr.layoutManager = LinearLayoutManager(activity!!.applicationContext)
})
return inflater.inflate(R.layout.fragment_ecommerce, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setHasOptionsMenu(true)
(activity as AppCompatActivity).supportActionBar?.title = "E-Commerce"
chipgrp.check(R.id.chip1)
viewmodel.loadAllEcommItems()
chipgrp.setOnCheckedChangeListener { group, checkedId ->
when (checkedId) {
R.id.chip1 -> {
viewmodel.loadAllEcommItems().observe(viewLifecycleOwner, Observer {
ecommrcyclr.adapter =
EcommerceAdapter(activity!!.applicationContext, it, this)
})
}
R.id.chip2 -> {
viewmodel.getSpecificCategoryItems("fertilizer")
.observe(viewLifecycleOwner, Observer {
ecommrcyclr.adapter =
EcommerceAdapter(activity!!.applicationContext, it, this)
})
}
R.id.chip3 -> {
viewmodel.getSpecificCategoryItems("pestiside")
.observe(viewLifecycleOwner, Observer {
ecommrcyclr.adapter =
EcommerceAdapter(activity!!.applicationContext, it, this)
})
}
R.id.chip4 -> {
viewmodel.getSpecificCategoryItems("machine")
.observe(viewLifecycleOwner, Observer {
ecommrcyclr.adapter =
EcommerceAdapter(activity!!.applicationContext, it, this)
})
}
}
}
}
companion object {
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment EcommerceFragment.
*/
// TODO: Rename and change types and number of parameters
@JvmStatic
fun newInstance(param1: String, param2: String) =
EcommerceFragment().apply {
arguments = Bundle().apply {
putString(ARG_PARAM1, param1)
putString(ARG_PARAM2, param2)
}
}
}
override fun onCellClickListener(name: String) {
ecommerceItemFragment = EcommerceItemFragment()
val bundle = Bundle()
bundle.putString("name", name)
ecommerceItemFragment.setArguments(bundle)
val transaction = activity!!.supportFragmentManager
.beginTransaction()
.replace(R.id.frame_layout, ecommerceItemFragment, name)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.setReorderingAllowed(true)
.addToBackStack("ecommItem")
.commit()
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
super.onCreateOptionsMenu(menu, inflater)
inflater.inflate(R.menu.cart_menu, menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.cart_item -> {
val cartFragment = CartFragment()
val transaction = activity!!.supportFragmentManager
.beginTransaction()
.replace(R.id.frame_layout, cartFragment)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.setReorderingAllowed(true)
.addToBackStack("cart")
.commit()
}
}
return super.onOptionsItemSelected(item)
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/view/ecommerce/EcommerceItemFragment.kt
================================================
package com.project.farmingapp.view.ecommerce
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.text.Html
import android.util.Log
import android.view.*
import androidx.fragment.app.Fragment
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.FragmentTransaction
import androidx.lifecycle.ViewModelProviders
import androidx.recyclerview.widget.LinearLayoutManager
import com.asura.library.posters.Poster
import com.asura.library.posters.RawVideo
import com.asura.library.posters.RemoteImage
import com.asura.library.posters.RemoteVideo
import com.asura.library.views.PosterSlider
import com.google.common.base.MoreObjects
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.database.FirebaseDatabase
import com.google.firebase.ktx.Firebase
import com.project.farmingapp.R
import com.project.farmingapp.adapter.AttributesNormalAdapter
import com.project.farmingapp.adapter.AttributesSelectionAdapter
import com.project.farmingapp.model.data.CartItem
import com.project.farmingapp.utilities.CellClickListener
import com.project.farmingapp.viewmodel.EcommViewModel
import kotlinx.android.synthetic.main.fragment_ecommerce_item.*
import java.text.SimpleDateFormat
import java.util.*
import kotlin.collections.ArrayList
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"
/**
* A simple [Fragment] subclass.
* Use the [EcommItemFragment.newInstance] factory method to
* create an instance of this fragment.
*/
class EcommerceItemFragment : Fragment(), CellClickListener {
// TODO: Rename and change types of parameters
private var param1: String? = null
private lateinit var viewmodel: EcommViewModel
private var param2: String? = null
private var selectionAttribute = mutableMapOf()
private var currentItemId: Any?= null
lateinit var realtimeDatabase: FirebaseDatabase
lateinit var firebaseAuth: FirebaseAuth
val sdf = SimpleDateFormat("dd/M/yyyy hh:mm:ss")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
param1 = it.getString(ARG_PARAM1)
param2 = it.getString(ARG_PARAM2)
}
viewmodel = ViewModelProviders.of(requireActivity())
.get(EcommViewModel::class.java)
Toast.makeText(activity!!.applicationContext, "Something" + tag, Toast.LENGTH_SHORT).show()
realtimeDatabase = FirebaseDatabase.getInstance()
firebaseAuth = FirebaseAuth.getInstance()
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_ecommerce_item, container, false)
}
companion object {
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment EcommItemFragment.
*/
// TODO: Rename and change types and number of parameters
@JvmStatic
fun newInstance(param1: String, param2: String) =
EcommerceItemFragment().apply {
arguments = Bundle().apply {
putString(ARG_PARAM1, param1)
putString(ARG_PARAM2, param2)
}
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setHasOptionsMenu(true)
(activity as AppCompatActivity).supportActionBar?.title = "E-Commerce"
loadingText.text = "Loading..."
val color1Params = color1.layoutParams
val color2Params = color2.layoutParams
val color3Params = color3.layoutParams
val color4Params = color4.layoutParams
val density = resources.displayMetrics.density
color1Params.width = (density * 40).toInt()
color1Params.height = (density * 35).toInt()
color1.layoutParams = color1Params
color1.setOnClickListener {
color1Params.width = (density * 40).toInt()
color1Params.height = (density * 35).toInt()
color1.layoutParams = color1Params
color3Params.width = (density * 30).toInt()
color3Params.height = (density * 25).toInt()
color3.layoutParams = color3Params
color4Params.width = (density * 30).toInt()
color4Params.height = (density * 25).toInt()
color4.layoutParams = color4Params
color2Params.width = (density * 30).toInt()
color2Params.height = (density * 25).toInt()
color2.layoutParams = color2Params
}
color2.setOnClickListener {
color1Params.width = (density * 30).toInt()
color1Params.height = (density * 25).toInt()
color1.layoutParams = color1Params
color3Params.width = (density * 30).toInt()
color3Params.height = (density * 25).toInt()
color3.layoutParams = color3Params
color4Params.width = (density * 30).toInt()
color4Params.height = (density * 25).toInt()
color4.layoutParams = color4Params
color2Params.width = (density * 40).toInt()
color2Params.height = (density * 35).toInt()
color2.layoutParams = color2Params
}
increaseQtyBtn.setOnClickListener {
quantityCountEcomm.text = (quantityCountEcomm.text.toString().toInt() + 1).toString()
}
decreaseQtyBtn.setOnClickListener {
if(quantityCountEcomm.text.toString().toInt() != 1){
quantityCountEcomm.text = (quantityCountEcomm.text.toString().toInt() - 1).toString()
}
}
var posters: ArrayList = ArrayList()
val allData = viewmodel.ecommLiveData.value
val allDataLength = allData!!.size
for (a in 0 until allDataLength){
if(allData[a].id == this.tag){
val specificData = allData[a]
currentItemId = specificData.id!!
productTitle.text = specificData.getString("title")
productShortDescription.text = specificData.getString("shortDesc")
productPrice.text = "₹" + specificData.getString("price")
productLongDesc.text = specificData.getString("longDesc")
howToUseText.text = specificData.getString("howtouse")
deliverycost.text = specificData.getString("delCharge")
Rating.rating = specificData.get("rating").toString().toFloat()
var attributes = specificData.get("attributes") as Map
if(attributes.contains("Color")){
colorLinear.visibility = View.VISIBLE
colorTitle.visibility = View.VISIBLE
} else{
colorLinear.visibility = View.GONE
colorTitle.visibility = View.GONE
}
var allSelectionAttributes = mutableListOf>()
var allNormalAttributes = mutableListOf>()
for((key, value) in attributes){
var selectionMap = mutableMapOf()
var normalMap = mutableMapOf()
if(value is ArrayList<*> && key.toString()!="Color"){
selectionMap.put(key, value)
allSelectionAttributes.add(selectionMap)
}
if(value is String){
normalMap.put(key, value)
allNormalAttributes.add(normalMap)
}
}
val adapter = AttributesSelectionAdapter(activity!!.applicationContext, allSelectionAttributes, this)
recyclerSelectionAttributes.adapter = adapter
recyclerSelectionAttributes.layoutManager = LinearLayoutManager(activity!!.applicationContext)
val adapter2 = AttributesNormalAdapter(activity!!.applicationContext, allNormalAttributes)
recyclerNormalAttributes.adapter = adapter2
recyclerNormalAttributes.layoutManager = LinearLayoutManager(activity!!.applicationContext)
progress_ecommItem.visibility = View.GONE
loadingText.visibility = View.GONE
val allImages = specificData.get("imageUrl") as List
for (a in allImages){
posters.add(RemoteImage("${a}"))
}
poster_slider.setPosters(posters)
}
else{
}
}
addToCart.setOnClickListener {
addToCart.isClickable = false
progress_ecommItem.visibility = View.VISIBLE
loadingText.text = "Adding to Cart..."
loadingText.visibility = View.GONE
val realtimeRef = realtimeDatabase.getReference("${firebaseAuth.currentUser!!.uid}").child("cart").child("${currentItemId}")
// selectionAttribute!!.put("quantity", quantityCountEcomm.text.toString().toInt())
// selectionAttribute.put("basePrice", productPrice.text.toString().toInt())
// selectionAttribute.put("delCharge", deliverycost.text.toString().toInt())
val currentDateTime = sdf.format(Date())
realtimeRef.setValue(CartItem(quantityCountEcomm.text.toString().toInt(), currentDateTime.toString()))
.addOnCompleteListener {
Toast.makeText(activity!!.applicationContext, "Item Added", Toast.LENGTH_SHORT).show()
progress_ecommItem.visibility = View.GONE
loadingText.visibility = View.GONE
addToCart.isClickable = true
}.addOnFailureListener {
Toast.makeText(activity!!.applicationContext, "Please Try Again!", Toast.LENGTH_SHORT).show()
progress_ecommItem.visibility = View.GONE
loadingText.visibility = View.GONE
addToCart.isClickable = true
}
}
buynow.setOnClickListener {
// var product_id = ArrayList()
// var item_cost=ArrayList()
// var item_qty=ArrayList()
val productPrice = productPrice.text.toString().split("₹") as ArrayList
// var totalPrice = quantityCountEcomm.text.toString().toInt()*productPrice[1].toString().toInt() + deliverycost.text.toString().toInt()
// product_id.add(currentItemId as String)
// item_cost.add(totalPrice)
// item_qty.add(quantityCountEcomm.text.toString().toInt())
Intent(activity!!.applicationContext, RazorPayActivity::class.java).also {
it.putExtra("productId",currentItemId.toString())
it.putExtra("itemCost",productPrice[1].toString())
it.putExtra("quantity", quantityCountEcomm.text.toString())
it.putExtra("deliveryCost", deliverycost.text.toString())
startActivity(it)
}
}
}
override fun onCellClickListener(name: String) {
val selectionAttributeAllData = name.split(" ") as List
Log.d("EcommItem", selectionAttributeAllData[0].toString())
Log.d("EcommItem", selectionAttributeAllData[1].toString())
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
super.onCreateOptionsMenu(menu, inflater)
inflater.inflate(R.menu.cart_menu, menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId){
R.id.cart_item -> {
val cartFragment = CartFragment()
val transaction = activity!!.supportFragmentManager
.beginTransaction()
.replace(R.id.frame_layout, cartFragment)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.setReorderingAllowed(true)
.addToBackStack("cart")
.commit()
}
}
return super.onOptionsItemSelected(item)
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/view/ecommerce/MyOrdersFragment.kt
================================================
package com.project.farmingapp.view.ecommerce
import android.content.Intent
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.FragmentTransaction
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.database.DataSnapshot
import com.google.firebase.database.DatabaseError
import com.google.firebase.database.FirebaseDatabase
import com.google.firebase.database.ValueEventListener
import com.google.firebase.firestore.FirebaseFirestore
import com.project.farmingapp.R
import com.project.farmingapp.adapter.MyOrdersAdapter
import com.project.farmingapp.utilities.CartItemBuy
import com.project.farmingapp.utilities.CellClickListener
import kotlinx.android.synthetic.main.fragment_my_orders.*
import kotlin.collections.HashMap
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"
/**
* A simple [Fragment] subclass.
* Use the [MyOrdersFragment.newInstance] factory method to
* create an instance of this fragment.
*/
class MyOrdersFragment : Fragment(), CellClickListener, CartItemBuy {
// TODO: Rename and change types of parameters
private var param1: String? = null
private var param2: String? = null
lateinit var firebaseDatabase: FirebaseDatabase
lateinit var firebaseAuth: FirebaseAuth
lateinit var firebaseFirestore: FirebaseFirestore
var orders = HashMap()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
param1 = it.getString(ARG_PARAM1)
param2 = it.getString(ARG_PARAM2)
}
firebaseDatabase = FirebaseDatabase.getInstance()
firebaseAuth = FirebaseAuth.getInstance()
firebaseFirestore = FirebaseFirestore.getInstance()
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_my_orders, container, false)
}
companion object {
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment MyOrdersFragment.
*/
// TODO: Rename and change types and number of parameters
@JvmStatic
fun newInstance(param1: String, param2: String) =
MyOrdersFragment().apply {
arguments = Bundle().apply {
putString(ARG_PARAM1, param1)
putString(ARG_PARAM2, param2)
}
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val orderRef = firebaseDatabase.getReference("${firebaseAuth.currentUser!!.uid}").child("orders")
(activity as AppCompatActivity).supportActionBar?.title = "My Orders"
val orderListener = object : ValueEventListener{
override fun onCancelled(error: DatabaseError) {
TODO("Not yet implemented")
}
override fun onDataChange(snapshot: DataSnapshot) {
if(snapshot.exists()){
orders = snapshot.value as HashMap
var myOrdersAdapter = MyOrdersAdapter(this@MyOrdersFragment, orders, this@MyOrdersFragment, this@MyOrdersFragment)
myOrderRecycler.adapter = myOrdersAdapter
myOrderRecycler.layoutManager = LinearLayoutManager(activity!!.applicationContext)
}
}
}
orderRef.addValueEventListener(orderListener)
}
override fun onCellClickListener(name: String) {
val ecommerceItemFragment = EcommerceItemFragment()
val transaction = activity!!.supportFragmentManager
.beginTransaction()
.replace(R.id.frame_layout, ecommerceItemFragment, name)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.setReorderingAllowed(true)
.addToBackStack("ecommItem")
.commit()
}
override fun addToOrders(productId: String, quantity: Int, itemCost: Int, deliveryCost: Int) {
Intent(activity!!.applicationContext, RazorPayActivity::class.java).also {
it.putExtra("productId", productId)
it.putExtra("itemCost", itemCost.toString())
it.putExtra("quantity", quantity.toString())
it.putExtra("deliveryCost", deliveryCost.toString())
startActivity(it)
}
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/view/ecommerce/PaymentFragment.kt
================================================
package com.project.farmingapp.view.ecommerce
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.project.farmingapp.R
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"
/**
* A simple [Fragment] subclass.
* Use the [EcommercePaymentFragment.newInstance] factory method to
* create an instance of this fragment.
*/
class PaymentFragment : Fragment() {
// TODO: Rename and change types of parameters
private var param1: String? = null
private var param2: String? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
param1 = it.getString(ARG_PARAM1)
param2 = it.getString(ARG_PARAM2)
}
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_payment, container, false)
}
companion object {
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment EcommercePaymentFragment.
*/
// TODO: Rename and change types and number of parameters
@JvmStatic
fun newInstance(param1: String, param2: String) =
PaymentFragment().apply {
arguments = Bundle().apply {
putString(ARG_PARAM1, param1)
putString(ARG_PARAM2, param2)
}
}
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/view/ecommerce/RazorPayActivity.kt
================================================
package com.project.farmingapp.view.ecommerce
import android.app.Activity
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import androidx.fragment.app.FragmentTransaction
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.database.FirebaseDatabase
import com.project.farmingapp.R
import com.project.farmingapp.model.data.orders
import com.razorpay.Checkout
import com.razorpay.PaymentResultListener
import kotlinx.android.synthetic.main.activity_razor_pay.*
import kotlinx.android.synthetic.main.fragment_ecommerce_item.*
import org.json.JSONObject
import java.text.SimpleDateFormat
import java.util.*
import kotlin.collections.ArrayList
class RazorPayActivity : AppCompatActivity(), PaymentResultListener {
lateinit var firebaseAuth: FirebaseAuth
val sdf = SimpleDateFormat("dd/M/yyyy hh:mm:ss")
var postId: UUID? = null
var name: String = ""
var locality: String = ""
var city: String = ""
var state: String = ""
var pincode: String = ""
var mobile: String = ""
var currentDate = sdf.format(Date())
lateinit var realtimeDatabase: FirebaseDatabase
var productId: String? = null
var totalPrice = 0
var itemCost: Int? = null
var quantity: Int? = null
var deliveryCost: Int? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_razor_pay)
postId = UUID.randomUUID()
//val totalCost=intent.getStringExtra("tp")
firebaseAuth = FirebaseAuth.getInstance()
productId = intent.getStringExtra("productId")
itemCost = intent.getStringExtra("itemCost")!!.toString().toInt()
quantity = intent.getStringExtra("quantity")!!.toString().toInt()
deliveryCost = intent.getStringExtra("deliveryCost")!!.toString().toInt()
Log.d("tp", productId.toString())
Log.d("tp", itemCost.toString())
Log.d("tp", quantity.toString())
Log.d("tp", deliveryCost.toString())
// Toast.makeText(this,abc,Toast.LENGTH_LONG).show()
//Log.d("tp",abc.toString())
orderNowBtn.setOnClickListener {
name = fullNamePrePay.text.toString()
locality = localityPrePay.text.toString()
city = cityPrePay.text.toString()
state = statePrePay.text.toString()
pincode = pincodePrePay.text.toString()
mobile = mobileNumberPrePay.text.toString()
if (name.isNullOrEmpty() ||
locality.isNullOrEmpty() ||
city.isNullOrEmpty() ||
state.isNullOrEmpty() ||
pincode.isNullOrEmpty() ||
mobile.isNullOrEmpty()
) {
Toast.makeText(this, "Please Add all Fields", Toast.LENGTH_LONG).show()
}
//add inputfield validation
else {
//add inputfield validation
Toast.makeText(this, "Done", Toast.LENGTH_LONG).show()
startPayment()
}
}
netValue.text =
"Net Value: ₹ " + (itemCost.toString().toInt() * quantity!! + deliveryCost!!).toString()
}
private fun startPayment() {
/*
* You need to pass current activity in order to let Razorpay create CheckoutActivity
* */
val activity: Activity = this
val co = Checkout()
try {
val options = JSONObject()
options.put("name", "FarmingApp")
options.put("description", "Demoing Charges")
//You can omit the image option to fetch the image from dashboard
options.put("image", "https://s3.amazonaws.com/rzp-mobile/images/rzp.png")
options.put("currency", "INR")
totalPrice = itemCost!! * quantity!! + deliveryCost!!
options.put("amount", "${totalPrice!! * 100}")
val prefill = JSONObject()
prefill.put("email", "${firebaseAuth.currentUser!!.email}")
prefill.put("contact", "${mobile}")
options.put("prefill", prefill)
co.open(activity, options)
} catch (e: Exception) {
Toast.makeText(activity, "Error in payment: " + e.message, Toast.LENGTH_LONG).show()
e.printStackTrace()
}
}
override fun onPaymentError(p0: Int, p1: String?) {
try {
Toast.makeText(this, "Payment Failed", Toast.LENGTH_LONG).show()
} catch (e: Exception) {
Log.e("failed", "Exception in onPaymentSuccess", e)
}
}
override fun onPaymentSuccess(p0: String?) {
try {
firebaseAuth = FirebaseAuth.getInstance()
realtimeDatabase = FirebaseDatabase.getInstance()
var orderRef =
realtimeDatabase.getReference("${firebaseAuth.currentUser!!.uid}").child("orders")
.child("${postId}")
val currDate = System.currentTimeMillis()
var date1 = Date()
val calendar = Calendar.getInstance()
calendar.time = date1
var randomDay = (0..12).shuffled().take(1) as List
val sdf = SimpleDateFormat("dd/MM/yyyy")
calendar.add(Calendar.DATE, randomDay[0])
date1 = calendar.time
// calendar.timeInMillis
// Toast.makeText(this, randomDay[0].toString(), Toast.LENGTH_LONG).show()
// Toast.makeText(this, calendar.timeInMillis.toString(), Toast.LENGTH_LONG).show()
orderRef.setValue(
orders(
name!!,
locality!!,
city!!,
state!!,
pincode!!,
mobile!!,
currentDate,
productId!!,
itemCost!!,
quantity!!,
deliveryCost!!,
"Arriving By: " + sdf.format(date1).toString()
)
).addOnCompleteListener {
Toast.makeText(this, "Payment Successful", Toast.LENGTH_LONG).show()
finish()
}.addOnFailureListener {
Toast.makeText(this, "Payment Failed", Toast.LENGTH_LONG).show()
Toast.makeText(this, "Please Try Again", Toast.LENGTH_LONG).show()
finish()
}
} catch (e: Exception) {
Log.e("success", "Exception in onPaymentSuccess", e)
}
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/view/introscreen/IntroActivity.kt
================================================
package com.project.farmingapp.view.introscreen
import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.preference.PreferenceManager
import android.util.Log
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.Toast
import androidx.core.content.ContextCompat
import androidx.core.view.get
import androidx.viewpager2.widget.ViewPager2
import com.project.farmingapp.R
import com.project.farmingapp.adapter.IntroAdapter
import com.project.farmingapp.model.data.IntroData
import com.project.farmingapp.view.auth.LoginActivity
import kotlinx.android.synthetic.main.activity_intro.*
class IntroActivity : AppCompatActivity() {
private val introSliderAdapter = IntroAdapter(
listOf(
IntroData(
"Welcome to the\n\bFarming App\b",
"Best Guide and Helper for any Farmer. Provides various features at one place!",
R.drawable.intro_first
),
IntroData(
"Read Articles",
"Read Online articles related to Farming Concepts, Technologies and other useful knowledge.",
R.drawable.intro_read
),
IntroData(
"Share Knowledge",
"Social Media let's you share knowledge with other farmers!\nCreate your own posts using Image/Video/Texts.",
R.drawable.intro_share
),
IntroData(
"E-Commerce",
"Buy / Sell Agriculture related products & Manage your Cart Online",
R.drawable.intro_ecomm
),
IntroData(
"Weather Forecast",
"Get Notified for Daily Weather Conditions. 24x7 Data",
R.drawable.intro_weather
),
IntroData(
"APMC Statistics",
"Get updates APMC Pricing and Commidity details everyday.",
R.drawable.intro_statistics
),
IntroData(
"Let's Grow Together",
"- Farming App",
R.drawable.intro_help
)
)
)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_intro)
sliderViewPager.adapter = introSliderAdapter
setupIndicators()
setCurrentIndicator(0)
sliderViewPager.registerOnPageChangeCallback(object :
ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
super.onPageSelected(position)
setCurrentIndicator(position)
}
})
if(sliderViewPager.currentItem + 1 == introSliderAdapter.itemCount){
Log.d("IntroActivity", sliderViewPager.currentItem.toString())
Log.d("IntroActivity", introSliderAdapter.itemCount.toString())
nextBtn.text = "Get Started"
} else{
nextBtn.text = "Next"
}
nextBtn.setOnClickListener {
if (sliderViewPager.currentItem + 1 < introSliderAdapter.itemCount) {
sliderViewPager.currentItem += 1
// Toast.makeText(this, "Current: ${sliderViewPager.currentItem}", Toast.LENGTH_SHORT).show()
nextBtn.text = "Next"
if(sliderViewPager.currentItem + 1 == introSliderAdapter.itemCount){
Log.d("IntroActivity", sliderViewPager.currentItem.toString())
Log.d("IntroActivity", introSliderAdapter.itemCount.toString())
nextBtn.text = "Get Started"
}
} else {
Intent(this, LoginActivity::class.java).also {
startActivity(it)
}
val sharedPreferences = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE)
val editor = sharedPreferences.edit()
editor.putBoolean("firstTime", false)
editor.apply()
finish()
}
}
skipIntro.setOnClickListener {
Intent(this, LoginActivity::class.java).also {
startActivity(it)
}
val sharedPreferences = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE)
val editor = sharedPreferences.edit()
editor.putBoolean("firstTime", false)
editor.apply()
finish()
}
}
private fun setupIndicators() {
val indicators = arrayOfNulls(introSliderAdapter.itemCount)
val layoutParams: LinearLayout.LayoutParams =
LinearLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
layoutParams.setMargins(8, 0, 8, 0)
for (i in indicators.indices) {
indicators[i] = ImageView(applicationContext)
indicators[i].apply {
this?.setImageDrawable(
ContextCompat.getDrawable(
applicationContext,
R.drawable.indicator_inactive
)
)
this?.layoutParams = layoutParams
}
sliderballs_container.addView(indicators[i])
}
}
private fun setCurrentIndicator(index: Int) {
val childCount = sliderballs_container.childCount
for (i in 0 until childCount) {
val imageView = sliderballs_container.get(i) as ImageView
if (i == index) {
imageView.setImageDrawable(
ContextCompat.getDrawable(
applicationContext,
R.drawable.indicator_active
)
)
} else {
imageView.setImageDrawable(
ContextCompat.getDrawable(
applicationContext,
R.drawable.indicator_inactive
)
)
}
}
if(index == introSliderAdapter.itemCount - 1){
nextBtn.text = "Get Started"
} else{
nextBtn.text = "Next"
}
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/view/socialmedia/SMCreatePostFragment.kt
================================================
package com.project.farmingapp.view.socialmedia
import android.app.Activity
import android.content.Intent
import android.graphics.Bitmap
import android.net.Uri
import android.os.Bundle
import android.provider.MediaStore
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.FragmentTransaction
import androidx.lifecycle.ViewModelProviders
import com.google.android.gms.tasks.Continuation
import com.google.android.gms.tasks.Task
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.firestore.FieldValue
import com.google.firebase.firestore.FirebaseFirestore
import com.google.firebase.storage.FirebaseStorage
import com.google.firebase.storage.StorageReference
import com.google.firebase.storage.UploadTask
import com.project.farmingapp.R
import com.project.farmingapp.viewmodel.UserDataViewModel
import com.project.farmingapp.viewmodel.UserProfilePostsViewModel
import kotlinx.android.synthetic.main.fragment_s_m_create_post.*
import kotlinx.android.synthetic.main.nav_header.view.*
import java.io.IOException
import java.util.*
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"
/**
* A simple [Fragment] subclass.
* Use the [SMCreatePostFragment.newInstance] factory method to
* create an instance of this fragment.
*/
class SMCreatePostFragment : Fragment() {
// TODO: Rename and change types of parameters
private var param1: String? = null
private var param2: String? = null
private val PICK_IMAGE_REQUEST = 71
private var filePath: Uri? = null
private var firebaseStore: FirebaseStorage? = null
private var storageReference: StorageReference? = null
private var authUser: FirebaseAuth? = null
private var postID: UUID? = null
private var bitmap: Bitmap? = null
lateinit var socialMediaPostsFragment: SocialMediaPostsFragment
lateinit var userDataViewModel : UserDataViewModel
val db = FirebaseFirestore.getInstance()
val data2 = HashMap()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
param1 = it.getString(ARG_PARAM1)
param2 = it.getString(ARG_PARAM2)
}
storageReference = FirebaseStorage.getInstance().reference
authUser = FirebaseAuth.getInstance()
firebaseStore = FirebaseStorage.getInstance()
userDataViewModel = ViewModelProviders.of(requireActivity())
.get(UserDataViewModel::class.java)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_s_m_create_post, container, false)
}
companion object {
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment SMCreatePostFragment.
*/
// TODO: Rename and change types and number of parameters
@JvmStatic
fun newInstance(param1: String, param2: String) =
SMCreatePostFragment().apply {
arguments = Bundle().apply {
putString(ARG_PARAM1, param1)
putString(ARG_PARAM2, param2)
}
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setHasOptionsMenu(true)
(activity as AppCompatActivity).supportActionBar?.title = "Social Media"
progress_create_post.visibility = View.GONE
progressTitle.visibility = View.GONE
data2["uploadType"] = ""
uploadImagePreview.setOnClickListener {
val intent = Intent()
intent.type = "image/* video/*"
intent.action = Intent.ACTION_PICK
startActivityForResult(
Intent.createChooser(intent, "Select Picture"),
PICK_IMAGE_REQUEST
)
}
val googleLoggedUser = authUser!!.currentUser!!.displayName
if (googleLoggedUser.isNullOrEmpty()) {
db.collection("users").document(authUser!!.currentUser!!.email!!)
.get()
.addOnCompleteListener {
val data = it.result
data2["name"] = data!!.getString("name").toString()
Log.d("Google User", data!!.getString("name"))
}
} else {
data2["name"] = googleLoggedUser.toString()
Log.d("Normal User", googleLoggedUser)
}
createPostBtnSM.setOnClickListener {
if (postTitleSM.text.toString().isNullOrEmpty()) {
Toast.makeText(
activity!!.applicationContext,
"Please enter title",
Toast.LENGTH_SHORT
).show()
} else {
uploadImage().setImageBitmap(bitmap)
}
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == PICK_IMAGE_REQUEST && resultCode == Activity.RESULT_OK) {
if (data == null || data.data == null) {
return
}
filePath = data.data
uploadImagePreview.setImageURI(filePath)
try {
val lastIndex = filePath.toString().length - 1
val type =
filePath.toString().slice((filePath.toString().lastIndexOf(".") + 1)..lastIndex)
Log.d("File Type", filePath.toString())
if (filePath.toString().contains("png") || filePath.toString().contains("jpg") || filePath.toString().contains("jpeg") || filePath.toString().contains("image") || filePath.toString().contains("images")){
data2["uploadType"] = "image"
} else if(filePath.toString().contains("videos") || filePath.toString().contains("video") || filePath.toString().contains("mp4")){
data2["uploadType"] = "video"
}
Log.d("File Type 3", data2["uploadType"].toString())
bitmap = MediaStore.Images.Media.getBitmap(activity!!.contentResolver, filePath)
// uploadImage().setImageBitmap(bitmap)
} catch (e: IOException) {
e.printStackTrace()
}
}
}
private fun uploadImage() {
progress_create_post.visibility = View.VISIBLE
progressTitle.visibility = View.VISIBLE
if (filePath != null) {
postID = UUID.randomUUID()
val ref = storageReference?.child("posts/" + postID.toString())
val uploadTask = ref?.putFile(filePath!!)
val urlTask =
uploadTask?.continueWithTask(Continuation> { task ->
if (!task.isSuccessful) {
task.exception?.let {
throw it
progress_create_post.visibility = View.GONE
progressTitle.visibility = View.GONE
}
}
return@Continuation ref.downloadUrl
})?.addOnCompleteListener { task ->
if (task.isSuccessful) {
val downloadUri = task.result
addUploadRecordWithImageToDb(downloadUri.toString(), postID!!)
// progress_create_post.visibility = View.GONE
// progressTitle.visibility = View.GONE
} else {
// Handle failures
progress_create_post.visibility = View.GONE
progressTitle.visibility = View.GONE
}
}?.addOnFailureListener {
progress_create_post.visibility = View.GONE
progressTitle.visibility = View.GONE
Toast.makeText(activity!!.applicationContext, it.message, Toast.LENGTH_LONG).show()
}
} else {
data2["uploadType"] = ""
addUploadRecordWithImageToDb(null, null)
Log.d("File Type 2", "Null")
}
}
private fun addUploadRecordWithTextToDb() {
addUploadRecordWithImageToDb(null, null)
}
private fun addUploadRecordWithImageToDb(uri: String?, postID: UUID?) {
if (!uri.isNullOrEmpty()) {
data2["imageUrl"] = uri.toString()
data2["imageID"] = postID.toString()
}
val data3 = HashMap()
val postTimeStamp = System.currentTimeMillis()
data2["userID"] = authUser!!.currentUser?.email.toString()
data2["timeStamp"] = postTimeStamp
data2["title"] = postTitleSM.text.toString()
data2["description"] = descPostSM.text.toString()
db.collection("posts")
.add(data2)
.addOnSuccessListener { documentReference ->
val data = HashMap()
val posts = arrayListOf()
val postRecordID = documentReference.id.toString()
posts.add(postRecordID)
data["posts"] = posts
db.collection("users")
.document("${authUser!!.currentUser?.email.toString()}")
.update("posts", FieldValue.arrayUnion(postRecordID))
.addOnSuccessListener { documentReference ->
Toast.makeText(
activity!!.applicationContext,
"Post Created",
Toast.LENGTH_LONG
).show()
progress_create_post.visibility = View.GONE
progressTitle.visibility = View.GONE
userDataViewModel.getUserData(authUser!!.currentUser?.email.toString())
socialMediaPostsFragment = SocialMediaPostsFragment()
val transaction = activity!!.supportFragmentManager
.beginTransaction()
.replace(R.id.frame_layout, socialMediaPostsFragment, "smPostList")
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.setReorderingAllowed(true)
.addToBackStack("smPostList")
.commit()
}
.addOnFailureListener { e ->
Toast.makeText(
activity!!.applicationContext,
"Error saving to DB",
Toast.LENGTH_LONG
).show()
progress_create_post.visibility = View.GONE
progressTitle.visibility = View.GONE
}
}
.addOnFailureListener { e ->
Toast.makeText(
activity!!.applicationContext,
"Error saving to DB",
Toast.LENGTH_LONG
).show()
progress_create_post.visibility = View.GONE
progressTitle.visibility = View.GONE
}
}
}
private fun Any.setImageBitmap(bitmap: Bitmap?) {
}
================================================
FILE: app/src/main/java/com/project/farmingapp/view/socialmedia/SocialMediaPostsFragment.kt
================================================
package com.project.farmingapp.view.socialmedia
import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.FragmentTransaction
import androidx.lifecycle.ViewModelProviders
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.google.android.material.behavior.SwipeDismissBehavior
import com.google.firebase.firestore.FirebaseFirestore
import com.google.firebase.firestore.Query
import com.project.farmingapp.R
import com.project.farmingapp.adapter.CurrentWeatherAdapter
import com.project.farmingapp.adapter.SMPostListAdapter
import com.project.farmingapp.viewmodel.ArticleViewModel
import com.project.farmingapp.viewmodel.SocialMediaViewModel
import kotlinx.android.synthetic.main.fragment_social_media_posts.*
import kotlinx.android.synthetic.main.fragment_weather.*
import com.project.farmingapp.adapter.PaginationListener.Companion.PAGE_START
import kotlin.coroutines.EmptyCoroutineContext
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"
private lateinit var viewModel: SocialMediaViewModel
/**
* A simple [Fragment] subclass.
* Use the [SocialMediaPostsFragment.newInstance] factory method to
* create an instance of this fragment.
*/
class SocialMediaPostsFragment : Fragment() {
// TODO: Rename and change types of parameters
private var param1: String? = null
private var param2: String? = null
lateinit var smCreatePostFragment: SMCreatePostFragment
private var adapter : SMPostListAdapter? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
param1 = it.getString(ARG_PARAM1)
param2 = it.getString(ARG_PARAM2)
}
viewModel = ViewModelProviders.of(requireActivity())
.get(SocialMediaViewModel::class.java)
// viewModel.loadPosts()
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_social_media_posts, container, false)
}
companion object {
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment SocialMediaPostsFragment.
*/
// TODO: Rename and change types and number of parameters
@JvmStatic
fun newInstance(param1: String, param2: String) =
SocialMediaPostsFragment().apply {
arguments = Bundle().apply {
putString(ARG_PARAM1, param1)
putString(ARG_PARAM2, param2)
}
}
}
fun getData() {
val firebaseFirestore: FirebaseFirestore = FirebaseFirestore.getInstance()
firebaseFirestore.collection("posts").orderBy("timeStamp", Query.Direction.DESCENDING).get()
.addOnSuccessListener {
Log.d("Posts data", it.documents.toString())
adapter = SMPostListAdapter(activity!!.applicationContext, it.documents)
postsRecycler.adapter = adapter
postsRecycler.layoutManager = LinearLayoutManager(activity!!.applicationContext)
}
.addOnFailureListener {
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setHasOptionsMenu(true)
(activity as AppCompatActivity).supportActionBar?.title = "Social Media"
getData()
smCreatePostFragment = SMCreatePostFragment()
createPostFloating.setOnClickListener {
val transaction = activity!!.supportFragmentManager
.beginTransaction()
.replace(R.id.frame_layout, smCreatePostFragment, "smCreate")
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.setReorderingAllowed(true)
.addToBackStack("smCreate")
.commit()
}
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/view/user/UserFragment.kt
================================================
package com.project.farmingapp.view.user
import android.app.Activity
import android.app.AlertDialog
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.Color
import android.graphics.Paint
import android.net.Uri
import android.os.Bundle
import android.provider.MediaStore
import android.service.autofill.UserData
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import android.widget.Toast
import androidx.core.graphics.toColorInt
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import androidx.recyclerview.widget.LinearLayoutManager
import com.bumptech.glide.Glide
import com.google.android.gms.tasks.Continuation
import com.google.android.gms.tasks.Task
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.firestore.DocumentSnapshot
import com.google.firebase.firestore.FirebaseFirestore
import com.google.firebase.storage.FirebaseStorage
import com.google.firebase.storage.StorageReference
import com.google.firebase.storage.UploadTask
import com.project.farmingapp.R
import com.project.farmingapp.adapter.PostListUserProfileAdapter
import com.project.farmingapp.utilities.CellClickListener
import com.project.farmingapp.view.user.setImageBitmap
import com.project.farmingapp.viewmodel.ArticleViewModel
import com.project.farmingapp.viewmodel.UserDataViewModel
import com.project.farmingapp.viewmodel.UserProfilePostsViewModel
import kotlinx.android.synthetic.main.fragment_user.*
import java.io.IOException
import java.util.*
import kotlin.collections.ArrayList
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"
private lateinit var viewModel: UserProfilePostsViewModel
private lateinit var userDataViewModel: UserDataViewModel
/**
* A simple [Fragment] subclass.
* Use the [UserFragment.newInstance] factory method to
* create an instance of this fragment.
*/
class UserFragment : Fragment(), CellClickListener {
// TODO: Rename and change types of parameters
private var param1: String? = null
private var param2: String? = null
private val PICK_IMAGE_REQUEST = 71
private var filePath: Uri? = null
private var postID: UUID? = null
private var storageReference: StorageReference? = null
private var bitmap: Bitmap? = null
private var uploadProfOrBack: Int? = null
val firebaseFirestore = FirebaseFirestore.getInstance()
val firebaseAuth = FirebaseAuth.getInstance()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
param1 = it.getString(ARG_PARAM1)
param2 = it.getString(ARG_PARAM2)
}
viewModel = ViewModelProviders.of(requireActivity())
.get(UserProfilePostsViewModel::class.java)
userDataViewModel = ViewModelProviders.of(requireActivity())
.get(UserDataViewModel::class.java)
storageReference = FirebaseStorage.getInstance().reference
viewModel.getAllPosts(firebaseAuth.currentUser!!.email)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
viewModel.liveData1.observe(viewLifecycleOwner, Observer {
if (it != null) {
viewModel.getAllPostsOfUser(it)
}
})
viewModel.liveData2.observe(viewLifecycleOwner, Observer {
if (it != null) {
Log.d("Live Data In Frag", it.toString())
}
})
viewModel.userProfilePostsLiveData2.observe(viewLifecycleOwner, Observer {
Log.d("Some Part 2", it.toString())
})
return inflater.inflate(R.layout.fragment_user, container, false)
}
companion object {
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment UserFragment.
*/
// TODO: Rename and change types and number of parameters
@JvmStatic
fun newInstance(param1: String, param2: String) =
UserFragment().apply {
arguments = Bundle().apply {
putString(ARG_PARAM1, param1)
putString(ARG_PARAM2, param2)
}
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setHasOptionsMenu(true)
(activity as AppCompatActivity).supportActionBar?.title = "Profile"
// addAboutTextUserFrag.paintFlags = Paint.UNDERLINE_TEXT_FLAG
cityEditUserProfile.visibility = View.GONE
viewModel.userProfilePostsLiveData.observe(viewLifecycleOwner, Observer {
Log.d("Some Part", it.toString())
})
userDataViewModel.userliveData.observe(viewLifecycleOwner, Observer {
Log.d("User Fragment", it.data.toString())
})
// aboutValueUserProfileFrag.setOnClickListener {
// aboutValueEditUserProfileFrag.visibility = View.VISIBLE
// addAboutTextUserFrag.visibility = View.GONE
// aboutValueEditUserProfileFrag.setText(aboutValueUserProfileFrag.text.toString())
// aboutValueUserProfileFrag.visibility = View.GONE
// saveBtnAboutUserProfileFrag.visibility = View.VISIBLE
// }
// addAboutTextUserFrag.setOnClickListener {
// aboutValueEditUserProfileFrag.visibility = View.VISIBLE
// saveBtnAboutUserProfileFrag.visibility = View.VISIBLE
// }
// saveBtnAboutUserProfileFrag.setOnClickListener {
// aboutValueUserProfileFrag.visibility = View.VISIBLE
// aboutValueUserProfileFrag.text = aboutValueEditUserProfileFrag.text
// saveBtnAboutUserProfileFrag.visibility = View.GONE
// userDataViewModel.updateUserField(activity!!.applicationContext, firebaseAuth.currentUser!!.email.toString() as String, aboutValueEditUserProfileFrag.text.toString() as String, null)
// aboutValueEditUserProfileFrag.visibility = View.GONE
// }
uploadProgressBarProfile.visibility = View.GONE
uploadBackProgressProfile.visibility = View.GONE
uploadUserBackgroundImage.setOnClickListener {
val intent = Intent()
intent.type = "image/* video/*"
intent.action = Intent.ACTION_PICK
startActivityForResult(
Intent.createChooser(intent, "Select Picture"),
PICK_IMAGE_REQUEST
)
uploadProfOrBack = 1
Toast.makeText(activity!!.applicationContext, "Uploading Background Image", Toast.LENGTH_SHORT).show()
}
uploadProfilePictureImage.setOnClickListener {
val intent = Intent()
intent.type = "image/* video/*"
intent.action = Intent.ACTION_PICK
startActivityForResult(
Intent.createChooser(intent, "Select Picture"),
PICK_IMAGE_REQUEST
)
uploadProfOrBack = 0
Toast.makeText(activity!!.applicationContext, "Uploading your Image", Toast.LENGTH_SHORT).show()
}
userDataViewModel.userliveData.observe(viewLifecycleOwner, Observer {
Log.d("User Data in VM Frag", it.get("name").toString())
Log.d("Data in User", it.toString())
userNameUserProfileFrag.text = it!!.getString("name")
val city = it?.getString("city")
if(city == null){
userCityUserProfileFrag.text = "City: "
} else{
userCityUserProfileFrag.text = "City: " + it.getString("city")
}
if(it?.get("profileImage") == null || it?.getString("profileImage").isNullOrBlank()){
uploadProfilePictureImage.visibility = View.VISIBLE
} else{
uploadProfilePictureImage.visibility = View.GONE
Glide.with(activity!!.applicationContext).load(it?.get("profileImage"))
.into(userImageUserFrag)
}
if(it?.get("backImage") == null || it?.getString("backImage").isNullOrBlank()){
uploadUserBackgroundImage.visibility = View.VISIBLE
} else{
uploadUserBackgroundImage.visibility = View.GONE
Glide.with(activity!!.applicationContext).load(it?.getString("backImage"))
.into(userBackgroundImage)
}
val posts = it.get("posts") as List
userPostsCountUserProfileFrag.text = "Posts: " + posts.size.toString()
userEmailUserProfileFrag.text = firebaseAuth.currentUser!!.email
val about = it?.getString("about")
if (about == null || about == "") {
aboutValueUserProfileFrag.visibility = View.GONE
aboutValueEditUserProfileFrag.visibility = View.GONE
saveBtnAboutUserProfileFrag.visibility = View.GONE
} else {
aboutValueUserProfileFrag.visibility = View.VISIBLE
aboutValueEditUserProfileFrag.visibility = View.GONE
saveBtnAboutUserProfileFrag.visibility = View.GONE
aboutValueUserProfileFrag.text = about
}
})
imageEdit.setOnClickListener {
uploadProfilePictureImage.visibility = View.VISIBLE
uploadUserBackgroundImage.visibility = View.VISIBLE
imageChecked.visibility = View.VISIBLE
imageEdit.visibility = View.GONE
cityEditUserProfile.setText(userCityUserProfileFrag!!.text.toString().removePrefix("City: "))
cityEditUserProfile.visibility = View.VISIBLE
aboutValueEditUserProfileFrag.visibility = View.VISIBLE
aboutValueEditUserProfileFrag.setText(aboutValueUserProfileFrag.text.toString())
aboutValueUserProfileFrag.visibility = View.GONE
}
imageChecked.setOnClickListener {
uploadProfilePictureImage.visibility = View.GONE
uploadUserBackgroundImage.visibility = View.GONE
imageEdit.visibility = View.VISIBLE
cityEditUserProfile.visibility = View.GONE
imageChecked.visibility = View.GONE
userDataViewModel.updateUserField(activity!!.applicationContext, firebaseAuth.currentUser!!.email.toString() as String, aboutValueEditUserProfileFrag.text.toString(), cityEditUserProfile.text.toString())
userDataViewModel.getUserData(firebaseAuth.currentUser!!.email.toString())
aboutValueEditUserProfileFrag.visibility = View.GONE
aboutValueUserProfileFrag.visibility = View.VISIBLE
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == PICK_IMAGE_REQUEST && resultCode == Activity.RESULT_OK) {
if (data == null || data.data == null) {
return
}
filePath = data.data
try {
bitmap = MediaStore.Images.Media.getBitmap(activity!!.contentResolver, filePath)
if(bitmap!=null){
Log.d("UserFragment", bitmap.toString())
if(uploadProfOrBack == 0){
uploadProgressBarProfile.visibility = View.VISIBLE
uploadProfilePictureImage.visibility = View.GONE
} else if(uploadProfOrBack == 1){
uploadBackProgressProfile.visibility = View.VISIBLE
uploadUserBackgroundImage.visibility = View.GONE
}
uploadImage2().setImageBitmap(bitmap)
}
} catch (e: IOException) {
e.printStackTrace()
}
}
}
private fun uploadImage2() {
if (filePath != null) {
postID = UUID.randomUUID()
val ref = storageReference?.child("users/" + postID.toString())
val uploadTask = ref?.putFile(filePath!!)
Log.d("UserFragment", filePath.toString())
val urlTask =
uploadTask?.continueWithTask(Continuation> { task ->
if (!task.isSuccessful) {
Toast.makeText(activity!!.applicationContext, "Error in Uploading", Toast.LENGTH_SHORT).show()
task.exception?.let {
throw it
}
}
return@Continuation ref.downloadUrl
})?.addOnCompleteListener { task ->
if (task.isSuccessful) {
val downloadUri = task.result
Toast.makeText(activity!!.applicationContext, "Uploading...", Toast.LENGTH_SHORT).show()
uploadUserPhotos(downloadUri.toString(), postID!!)
} else {
// Handle failures
Toast.makeText(activity!!.applicationContext, "Error", Toast.LENGTH_SHORT).show()
uploadProgressBarProfile.visibility = View.GONE
uploadBackProgressProfile.visibility = View.GONE
uploadUserBackgroundImage.visibility = View.VISIBLE
uploadProfilePictureImage.visibility = View.VISIBLE
}
}?.addOnFailureListener {
Toast.makeText(activity!!.applicationContext, "Error2", Toast.LENGTH_SHORT).show()
uploadProgressBarProfile.visibility = View.GONE
uploadBackProgressProfile.visibility = View.GONE
uploadUserBackgroundImage.visibility = View.VISIBLE
uploadProfilePictureImage.visibility = View.VISIBLE
}
} else {
}
}
fun uploadUserPhotos(uri: String?, postID: UUID?){
if(uploadProfOrBack == 0){
firebaseFirestore.collection("users").document(firebaseAuth.currentUser!!.email!!)
.update(mapOf(
"profileImage" to uri
))
.addOnSuccessListener {
Toast.makeText(activity!!.applicationContext, "Profile Updated", Toast.LENGTH_SHORT).show()
uploadProgressBarProfile.visibility = View.GONE
imageEdit.visibility = View.VISIBLE
imageChecked.visibility = View.GONE
userImageUserFrag.setImageBitmap(bitmap)
userDataViewModel.getUserData(firebaseAuth!!.currentUser!!.email.toString())
}
.addOnFailureListener {
uploadProgressBarProfile.visibility = View.GONE
userImageUserFrag.visibility = View.VISIBLE
Toast.makeText(activity!!.applicationContext, "Failed to Update Profile", Toast.LENGTH_SHORT).show()
}
}
else if(uploadProfOrBack == 1){
firebaseFirestore.collection("users").document(firebaseAuth.currentUser!!.email!!)
.update(mapOf(
"backImage" to uri
))
.addOnSuccessListener {
Toast.makeText(activity!!.applicationContext, "Profile Updated 2", Toast.LENGTH_SHORT).show()
uploadBackProgressProfile.visibility = View.GONE
userBackgroundImage.setImageBitmap(bitmap)
imageEdit.visibility = View.VISIBLE
imageChecked.visibility = View.GONE
userDataViewModel.getUserData(firebaseAuth!!.currentUser!!.email.toString())
}
.addOnFailureListener {
uploadBackProgressProfile.visibility = View.GONE
userBackgroundImage.setImageBitmap(bitmap)
Toast.makeText(activity!!.applicationContext, "Failed to Update Profile", Toast.LENGTH_SHORT).show()
}
}
}
override fun onCellClickListener(name: String) {
val dialog = AlertDialog.Builder(activity)
dialog.setTitle("Your Post")
.setMessage("Do you want to edit your post?")
.setPositiveButton("View") { dialogInterface, i ->
}
.setNegativeButton("Delete") { dialogInterface, i ->
userDataViewModel.deleteUserPost(firebaseAuth.currentUser!!.email!!, name)
userDataViewModel.getUserData(firebaseAuth.currentUser!!.email.toString())
viewModel.getAllPosts(firebaseAuth.currentUser!!.email)
}
.setNeutralButton("Cancel"){
dialogInterface, i ->
}
.show()
Toast.makeText(activity!!.applicationContext, "You Clicked" + name.toString(), Toast.LENGTH_SHORT).show()
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel.liveData3.observe(this, Observer {
Log.d("All Posts", it.toString())
val adapter = PostListUserProfileAdapter(activity!!.applicationContext, it, this)
userProfilePostsRecycler.adapter = adapter
userProfilePostsRecycler.layoutManager =
LinearLayoutManager(activity!!.applicationContext)
adapter.notifyDataSetChanged()
})
}
}
private fun Any.setImageBitmap(bitmap: Bitmap?) {
}
================================================
FILE: app/src/main/java/com/project/farmingapp/view/weather/WeatherFragment.kt
================================================
package com.project.farmingapp.view.weather
import android.os.Build
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.animation.AnimationUtils
import android.widget.Toast
import androidx.annotation.Nullable
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.project.farmingapp.R
import com.project.farmingapp.adapter.CurrentWeatherAdapter
import com.project.farmingapp.adapter.WeatherAdapter
import com.project.farmingapp.databinding.FragmentWeatherBinding
import com.project.farmingapp.model.WeatherApi
import com.project.farmingapp.databinding.FragmentWeatherBindingImpl
import com.project.farmingapp.model.data.Weather
import com.project.farmingapp.model.data.WeatherList
import com.project.farmingapp.model.data.WeatherRootList
import com.project.farmingapp.viewmodel.WeatherListener
import com.project.farmingapp.viewmodel.WeatherViewModel
import kotlinx.android.synthetic.main.fragment_weather.*
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"
/**
* A simple [Fragment] subclass.
* Use the [WeatherFragment.newInstance] factory method to
* create an instance of this fragment.
*/
class WeatherFragment : Fragment(), WeatherListener {
// TODO: Rename and change types of parameters
private var param1: String? = null
private var param2: String? = null
lateinit var Adapter: WeatherAdapter
lateinit var Adapter2: CurrentWeatherAdapter
private lateinit var viewModel: WeatherViewModel
private var fragmentWeatherBinding: FragmentWeatherBinding? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
param1 = it.getString(ARG_PARAM1)
param2 = it.getString(ARG_PARAM2)
}
// init ViewModel
viewModel = ViewModelProviders.of(requireActivity())
.get(WeatherViewModel::class.java)
val bundle = this.arguments
if (bundle != null) {
Log.d("WeatherFrag Bundle", bundle.getString("key"))
}
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_weather, container, false)
}
@RequiresApi(Build.VERSION_CODES.M)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setHasOptionsMenu(true)
(activity as AppCompatActivity).supportActionBar?.title = "Weather Forecast"
val city = viewModel.getCoordinates().value
weatherCity.text = city!!.get(2).toString()
val newWeatherData = viewModel.newDataTrial.value
Log.d("New Data Weather Trial", newWeatherData.toString())
var firstDate = newWeatherData!!.list[0].dt_txt.slice(8..9)
var otherDates = firstDate
var i = 1
var data2 = mutableListOf()
while (otherDates == firstDate) {
data2!!.add(newWeatherData.list[i - 1])
otherDates = newWeatherData.list[i].dt_txt.slice(8..9)
i += 1
}
var data3 = mutableListOf()
for (a in i - 1..39) {
if (newWeatherData.list[a].dt_txt.slice(11..12) == "12") {
Log.d("Something date", newWeatherData.list[a].dt_txt)
data3.add(newWeatherData.list[a])
}
}
Adapter = WeatherAdapter(activity!!.applicationContext, data3)
Adapter2 = CurrentWeatherAdapter(activity!!.applicationContext, data2)
rcylr_weather.adapter = Adapter
rcylr_weather.layoutManager = LinearLayoutManager(activity!!.applicationContext)
currentWeather_rcycl.adapter = Adapter2
currentWeather_rcycl.layoutManager = LinearLayoutManager(activity!!.applicationContext, LinearLayoutManager.HORIZONTAL, false)
}
companion object {
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment WeatherFragment.
*/
// TODO: Rename and change types and number of parameters
@JvmStatic
fun newInstance(param1: String, param2: String) =
WeatherFragment().apply {
arguments = Bundle().apply {
putString(ARG_PARAM1, param1)
putString(ARG_PARAM2, param2)
}
}
}
override fun onSuccess(authRepo: LiveData) {
authRepo.observe(this, Observer {
Log.d("Frag", authRepo.value.toString())
})
// Toast.makeText(this.context, "SS", Toast.LENGTH_LONG).show()
}
}
private fun RecyclerView.hasFixedSize(b: Boolean) {
}
================================================
FILE: app/src/main/java/com/project/farmingapp/view/yojna/YojnaFragment.kt
================================================
package com.project.farmingapp.view.yojna
import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import com.bumptech.glide.Glide
import com.project.farmingapp.R
import com.project.farmingapp.viewmodel.YojnaViewModel
import kotlinx.android.synthetic.main.fragment_yojna.*
import kotlinx.coroutines.GlobalScope
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"
/**
* A simple [Fragment] subclass.
* Use the [YojnaFragment.newInstance] factory method to
* create an instance of this fragment.
*/
class YojnaFragment : Fragment() {
// TODO: Rename and change types of parameters
private var param1: String? = null
private var param2: String? = null
lateinit var yojnaViewModel: YojnaViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
param1 = it.getString(ARG_PARAM1)
param2 = it.getString(ARG_PARAM2)
}
val tag = this.tag.toString()
Log.d("YojnaFragment", this.tag.toString())
yojnaViewModel =
ViewModelProviders.of(requireActivity()).get(YojnaViewModel::class.java)
yojnaViewModel.getYojna(this.tag.toString())
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_yojna, container, false)
}
companion object {
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment YojnaFragment.
*/
// TODO: Rename and change types and number of parameters
@JvmStatic
fun newInstance(param1: String, param2: String) =
YojnaFragment().apply {
arguments = Bundle().apply {
putString(ARG_PARAM1, param1)
putString(ARG_PARAM2, param2)
}
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setHasOptionsMenu(true)
(activity as AppCompatActivity).supportActionBar?.title = "Krishi Yojna"
progressYojna.visibility = View.VISIBLE
yojnaViewModel.msg.observe(viewLifecycleOwner, Observer {
yojnaTitle.text = it.get("title").toString()
yojnaDesc.text = it.get("description").toString()
yojnaDate.text = it.get("launch").toString()
yojnaLaunchedBy.text = it.get("headedBy").toString()
yojnaBudget.text = it.get("budget").toString()
val eligibility: ArrayList = it.get("eligibility") as ArrayList
val documents: ArrayList = it.get("documents") as ArrayList
val objectives: ArrayList = it.get("objective") as ArrayList
yojnaEligibility.text = ""
yojnaDocumentsRequired.text = ""
yojnaObjectives.text = ""
for (i in 0..(eligibility.size - 1)) {
yojnaEligibility.text =
yojnaEligibility.text.toString() + (i + 1).toString() + ". " + eligibility[i].toString() + "\n"
}
for (i in 0..(documents.size - 1)) {
yojnaDocumentsRequired.text =
yojnaDocumentsRequired.text.toString() + (i + 1).toString() + ". " + documents[i].toString() + "\n"
}
for (i in 0..(objectives.size - 1)) {
yojnaObjectives.text =
yojnaObjectives.text.toString() + (i + 1).toString() + ". " + objectives[i].toString() + "\n"
}
yojnaWebsite.text = it.get("website").toString()
Glide.with(this).load(it.get("image").toString()).into(yojnaImage)
progressYojna.visibility = View.GONE
})
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/view/yojna/YojnaListFragment.kt
================================================
package com.project.farmingapp.view.yojna
import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Adapter
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.FragmentTransaction
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProviders
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import com.project.farmingapp.R
import com.project.farmingapp.adapter.ArticleListAdapter
import com.project.farmingapp.adapter.YojnaAdapter
import com.project.farmingapp.utilities.CellClickListener
import com.project.farmingapp.view.articles.FruitsFragment
import com.project.farmingapp.viewmodel.ArticleViewModel
import com.project.farmingapp.viewmodel.YojnaViewModel
import kotlinx.android.synthetic.main.fragment_yojna_list.*
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"
/**
* A simple [Fragment] subclass.
* Use the [YojnaListFragment.newInstance] factory method to
* create an instance of this fragment.
*/
class YojnaListFragment : Fragment(), CellClickListener {
// TODO: Rename and change types of parameters
private var param1: String? = null
private var param2: String? = null
private lateinit var viewModel: YojnaViewModel
lateinit var Adapter: YojnaAdapter
lateinit var yojnaFragment: YojnaFragment
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
param1 = it.getString(ARG_PARAM1)
param2 = it.getString(ARG_PARAM2)
}
viewModel = ViewModelProviders.of(requireActivity())
.get(YojnaViewModel::class.java)
viewModel.getAllYojna("yojnas")
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
viewModel.message3.observe(viewLifecycleOwner, Observer {
Log.d("Art All Data", it[0].data.toString())
Adapter = YojnaAdapter(activity!!.applicationContext, it, this)
rcyclr_yojnaList.adapter = Adapter
rcyclr_yojnaList.layoutManager = LinearLayoutManager(activity!!.applicationContext)
})
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_yojna_list, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setHasOptionsMenu(true)
(activity as AppCompatActivity).supportActionBar?.title = "Krishi Yojna"
}
companion object {
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment YojnaListFragment.
*/
// TODO: Rename and change types and number of parameters
@JvmStatic
fun newInstance(param1: String, param2: String) =
YojnaListFragment().apply {
arguments = Bundle().apply {
putString(ARG_PARAM1, param1)
putString(ARG_PARAM2, param2)
}
}
}
override fun onCellClickListener(name: String) {
yojnaFragment = YojnaFragment()
val bundle = Bundle()
bundle.putString("name", name)
yojnaFragment.setArguments(bundle)
val transaction = activity!!.supportFragmentManager
.beginTransaction()
.replace(R.id.frame_layout, yojnaFragment, name)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.setReorderingAllowed(true)
.addToBackStack("yojnaListFrag")
.commit()
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/viewmodel/ArticleListener.kt
================================================
package com.project.farmingapp.viewmodel
import androidx.lifecycle.LiveData
interface ArticleListener {
fun onStarted()
fun onSuccess(authRepo: LiveData)
fun onFailure(message: String)
}
================================================
FILE: app/src/main/java/com/project/farmingapp/viewmodel/ArticleViewModel.kt
================================================
package com.project.farmingapp.viewmodel
import android.util.Log
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.google.android.gms.tasks.OnFailureListener
import com.google.android.gms.tasks.OnSuccessListener
import com.google.firebase.firestore.DocumentSnapshot
import com.google.firebase.firestore.FirebaseFirestore
import com.google.firebase.firestore.QuerySnapshot
import com.google.firebase.storage.FileDownloadTask
import com.google.firebase.storage.FirebaseStorage
import java.io.File
class ArticleViewModel : ViewModel() {
var message1 = MutableLiveData>()
var message2 = MutableLiveData()
var message3 = MutableLiveData>()
var articleListener: ArticleListener? = null
private var todoLiveData: LiveData>? = null
lateinit var firebaseDb: FirebaseFirestore
lateinit var firebaseStorage: FirebaseStorage
fun getArticle(): MutableLiveData> {
Log.d("ArticleViewModelGet", message1.value.toString())
return message1
}
fun getMyArticle(name: String) {
firebaseStorage = FirebaseStorage.getInstance()
firebaseDb = FirebaseFirestore.getInstance()
Log.d("ArticleRepo1", "Ss")
firebaseDb.collection("article_fruits").document("${name}")
.get()
.addOnSuccessListener {
message1.value = it.data as HashMap?
Log.d("ArticleViewModelDirect", message1.value.toString())
}
.addOnFailureListener {
Log.d("ArticleRepo3", "ss")
}
}
fun getAllArticles(name: String){
if (message3.value.isNullOrEmpty()){
firebaseDb = FirebaseFirestore.getInstance()
firebaseDb.collection(name).get().addOnSuccessListener {
// var message3 = MutableLiveData()
message3.value = it.documents
Log.d("I'm called4", "Yes")
// Log.d("All articles", it.documents[1].data.toString())
}
}
}
fun updateArticle(data: HashMap) {
Log.d("ArticleViewModel", data.toString())
message1.value = data
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/viewmodel/AuthListener.kt
================================================
package com.project.farmingapp.viewmodel
import androidx.lifecycle.LiveData
interface AuthListener {
fun onStarted()
fun onSuccess(authRepo: LiveData)
fun onFailure(message: String)
}
================================================
FILE: app/src/main/java/com/project/farmingapp/viewmodel/AuthViewModel.kt
================================================
package com.project.farmingapp.viewmodel
import android.content.Intent
import android.util.Log
import android.view.View
import androidx.lifecycle.ViewModel
import com.google.android.gms.auth.api.signin.GoogleSignIn
import com.google.android.gms.auth.api.signin.GoogleSignInClient
import com.google.android.gms.common.api.ApiException
import com.project.farmingapp.model.AuthRepository
class AuthViewModel : ViewModel() {
var name: String? = null
var mobNo: String? = null
var email: String? = null
var city: String? = null
var password: String? = null
var confPassword: String? = null
var userType: String? = "normal"
var authListener: AuthListener? = null
//login
var loginmail:String?=null
var loginpwd:String?=null
lateinit var authRepository: AuthRepository
lateinit var googleSignInClient: GoogleSignInClient
companion object {
private const val TAG = "GoogleActivity"
private const val RC_SIGN_IN = 9001
}
val userPosts = arrayListOf()
fun signupButtonClicked(view: View) {
authListener!!.onStarted()
if (name.isNullOrEmpty() || mobNo.toString().length != 10 || mobNo == null || password.isNullOrEmpty() || confPassword.isNullOrEmpty() || city.isNullOrEmpty()) {
// Failure
authListener!!.onFailure("Error Occurred")
return
}
// Success
var data = hashMapOf(
"name" to name,
"mobNo" to mobNo,
"email" to email,
"city" to city,
"userType" to userType,
"posts" to userPosts,
"profileImage" to ""
)
val authRepo = AuthRepository().signInWithEmail(email!!, password!!, data)
authListener?.onSuccess(authRepo)
}
fun returnActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
authListener!!.onStarted()
if (requestCode == RC_SIGN_IN) {
val task = GoogleSignIn.getSignedInAccountFromIntent(data)
val exception = task.exception
if (task.isSuccessful) {
try {
val account = task.getResult(ApiException::class.java)!!
var data2 = hashMapOf(
"userType" to userType,
"posts" to userPosts,
"name" to account.displayName.toString(),
"profileImage" to account.photoUrl.toString()
)
authRepository = AuthRepository()
var returned = authRepository.signInToGoogle(
account.idToken!!,
account.email.toString(),
data2
)
Log.d("AuthView", returned.value.toString())
authListener?.onSuccess(returned)
} catch (e: ApiException) {
authListener!!.onFailure(e.message.toString())
}
} else {
}
}
}
//login btn function
fun loginButtonClicked(view: View) {
authListener!!.onStarted()
if (loginmail.isNullOrEmpty() || loginpwd.isNullOrEmpty()) {
// Failure
authListener!!.onFailure("Error Occurred")
return
}
// Success
val authRepo = AuthRepository().logInWithEmail(loginmail!!, loginpwd!!)
authListener?.onSuccess(authRepo)
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/viewmodel/EcommViewModel.kt
================================================
package com.project.farmingapp.viewmodel
import android.util.Log
import android.widget.Toast
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.firestore.DocumentSnapshot
import com.google.firebase.firestore.FirebaseFirestore
import com.google.firebase.storage.FirebaseStorage
import com.google.firebase.storage.StorageReference
import com.project.farmingapp.adapter.EcommerceAdapter
import kotlinx.android.synthetic.main.fragment_ecommerce.*
class EcommViewModel : ViewModel() {
private var firebaseAuth: FirebaseAuth? = null
private var firebaseFireStore: FirebaseFirestore = FirebaseFirestore.getInstance()
private var firebaseStore: FirebaseStorage? = null
private var storageReference: StorageReference? = null
var ecommLiveData = MutableLiveData>()
var specificCategoryItems = MutableLiveData>()
var specificItem = MutableLiveData()
fun loadAllEcommItems(): MutableLiveData> {
firebaseAuth = FirebaseAuth.getInstance()
firebaseFireStore = FirebaseFirestore.getInstance()
firebaseFireStore!!.collection("products").get()
.addOnSuccessListener {
Log.d("ecommviewmodel", it.documents[0].getString("title").toString())
ecommLiveData.value = it.documents
Log.d("ecommviewmodel", it.documents.toString())
}
.addOnFailureListener {
Log.d("ecommviewmodel", it.message)
}
return ecommLiveData
}
fun loadSpecificTypeEcomItem(itemType: String) {
firebaseFireStore = FirebaseFirestore.getInstance()
firebaseFireStore!!.collection("products")
.whereEqualTo("type", itemType)
.get()
.addOnSuccessListener {
Log.d("ecommviewmodel", it.documents[0].getString("title").toString())
ecommLiveData.value = it.documents
Log.d("ecommviewmodel", it.documents.toString())
}
.addOnFailureListener {
Log.d("ecommviewmodel", it.message)
}
}
fun getSpecificCategoryItems(itemType: String): MutableLiveData> {
firebaseFireStore.collection("products")
.whereEqualTo("type", itemType)
.get()
.addOnCompleteListener {
if (it.isSuccessful) {
specificCategoryItems.value = it.result!!.documents
Log.d("EcommViewModel", it.result!!.documents.toString())
}
}
.addOnFailureListener {
Log.e("EcommViewModel", "Error Loading Specific Category Items")
}
return specificCategoryItems
}
fun getSpecificItem(itemID: String): MutableLiveData {
firebaseFireStore.collection("products")
.document(itemID)
.get()
.addOnCompleteListener {
if (it.isSuccessful) {
Log.d("EcommViewModel", it.result!!.data.toString())
specificItem.value = it.result
} else {
Log.e("EcommViewModel", "Failed Getting Data")
}
}.addOnFailureListener {
Log.e("EcommViewModel", "Failed Getting Data")
}
return specificItem
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/viewmodel/SocialMediaViewModel.kt
================================================
package com.project.farmingapp.viewmodel
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.firestore.DocumentSnapshot
import com.google.firebase.firestore.FirebaseFirestore
import com.google.firebase.storage.FirebaseStorage
import com.google.firebase.storage.StorageReference
class SocialMediaViewModel: ViewModel() {
private var firebaseAuth: FirebaseAuth? = null
private var firebaseFireStore: FirebaseFirestore? = null
private var firebaseStore: FirebaseStorage? = null
private var storageReference: StorageReference? = null
var postLiveData = MutableLiveData>()
fun loadPosts(){
firebaseAuth = FirebaseAuth.getInstance()
firebaseFireStore = FirebaseFirestore.getInstance()
firebaseFireStore!!.collection("posts").get()
.addOnSuccessListener {
// postLiveData.value = it.documents[0].data.get("")
}
.addOnFailureListener {
}
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/viewmodel/UserDataViewModel.kt
================================================
package com.project.farmingapp.viewmodel
import android.content.Context
import android.util.Log
import android.widget.Toast
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.google.firebase.firestore.DocumentSnapshot
import com.google.firebase.firestore.FieldValue
import com.google.firebase.firestore.FirebaseFirestore
import com.project.farmingapp.R
import com.project.farmingapp.view.user.UserFragment
import kotlinx.android.synthetic.main.fragment_user.*
import kotlinx.android.synthetic.main.nav_header.view.*
import kotlinx.coroutines.channels.consumesAll
class UserDataViewModel : ViewModel() {
var userliveData = MutableLiveData()
fun getUserData(userId: String) {
val firebaseFireStore = FirebaseFirestore.getInstance()
firebaseFireStore.collection("users").document(userId)
.get()
.addOnCompleteListener {
userliveData.value = it.result
}
}
fun updateUserField(context: Context, userID: String, about: String?, city: String?) {
if (about !=null) {
val firebaseFireStore = FirebaseFirestore.getInstance()
firebaseFireStore.collection("users").document("${userID}")
.update(
mapOf(
"about" to about
)
)
.addOnSuccessListener {
Log.d("UserDataViewModel", "User About Data Updated")
getUserData(userID)
}
.addOnFailureListener {
Log.d("UserDataViewModel", "Failed to Update About User Data")
Toast.makeText(context, "Failed to Update About. Try Again!", Toast.LENGTH_SHORT).show()
}
}
if (city !=null) {
val firebaseFireStore = FirebaseFirestore.getInstance()
firebaseFireStore.collection("users").document("${userID}")
.update(
mapOf(
"city" to city
)
)
.addOnSuccessListener {
Log.d("UserDataViewModel", "User City Data Updated")
getUserData(userID)
}
.addOnFailureListener {
Log.d("UserDataViewModel", "Failed to Update City User Data")
Toast.makeText(context, "Failed to Update City Try Again!", Toast.LENGTH_SHORT).show()
}
}
Toast.makeText(context, "Profile Updated", Toast.LENGTH_SHORT).show()
}
fun deleteUserPost(userId: String, postId: String){
val firebaseFirestore = FirebaseFirestore.getInstance()
firebaseFirestore.collection("posts").document(postId)
.delete()
.addOnSuccessListener {
Log.d("User Data View Model", "Post Deleted")
UserProfilePostsViewModel().getAllPosts(userId)
firebaseFirestore.collection("users").document(userId).update("posts", FieldValue.arrayRemove("${postId}"))
.addOnSuccessListener {
Log.d("UserDataViewModel", "Successfully Deleted User Doc Post")
getUserData(userId)
}
.addOnFailureListener{
Log.e("UserDataViewModel", "Failed to delete post from User Doc")
}
}
.addOnFailureListener {
Log.d("User Data View Model", "Failed to delete post")
}
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/viewmodel/UserProfilePostsViewModel.kt
================================================
package com.project.farmingapp.viewmodel
import android.util.Log
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.google.firebase.firestore.DocumentSnapshot
import com.google.firebase.firestore.FirebaseFirestore
import com.project.farmingapp.model.data.Post
lateinit var userProfilePostsLiveData : MutableLiveData>
class UserProfilePostsViewModel : ViewModel() {
val userProfilePostsLiveData = MutableLiveData>>()
val userProfilePostsLiveData2 = MutableLiveData>()
val liveData1 = MutableLiveData>()
val liveData2 = MutableLiveData>()
val liveData3 = MutableLiveData>()
fun getUserPosts(userID: String?) {
val firebaseFirestore = FirebaseFirestore.getInstance()
val firebaseFirestore2 = FirebaseFirestore.getInstance()
firebaseFirestore.collection("users").document("${userID}")
.get()
.addOnSuccessListener {
val allPostsIDs: List? = it.get("posts") as List
userProfilePostsLiveData2.value = allPostsIDs
Log.d("User All Posts 3", userProfilePostsLiveData2.value.toString())
var localPostList : ArrayList>?= null
for (i in allPostsIDs!!) {
firebaseFirestore2.collection("posts").document(i)
.get()
.addOnSuccessListener {
Log.d("User All Posts", it.data.toString())
// localPostList?.add(it)
// var localData = it.data
val someData = it.data as HashMap
localPostList?.add(someData)
if(localPostList!=null){
Log.d("User All Posts 2", localPostList.toString())
}
Log.d("User All Posts 4", localPostList?.size.toString())
userProfilePostsLiveData.value?.add(it.data as HashMap)
}
.addOnFailureListener {
Log.d("User All Posts", "Some Failure Occured while fetching user posts")
}
}
// Log.d("User All Posts 2", localPostList.toString())
}.addOnFailureListener {
Log.d("User All Posts 2", "Some Failure Occured while fetching user posts")
}
}
fun getUserPostsIDs(userID: String?){
val firebaseFirestore = FirebaseFirestore.getInstance()
firebaseFirestore.collection("users").document(userID!!)
.get()
.addOnSuccessListener {
liveData1.value = it.get("posts") as List
}
}
fun getAllPostsOfUser(listOfIDs : List){
val firebaseFirestore = FirebaseFirestore.getInstance()
var someList = ArrayList()
var i = 0
var j = listOfIDs.size
for (i in 0..j-1){
firebaseFirestore.collection("posts").document(listOfIDs[i])
.get()
.addOnSuccessListener {
someList.add(it)
Log.d("LiveData2 - 2", it.toString())
Log.d("LiveData2 - 2", someList.toString())
// liveData2.value?.add(it!!)
}
}
if (i == j){
liveData2.value = someList
Log.d("LiveData2 - 1", liveData2.value.toString())
}
// if(!someList.isNullOrEmpty()){
//// liveData2.value = someList
// Log.d("LiveData2", someList.toString())
//
// }
}
fun getAllPosts(userId: String?){
val firebaseFirestore = FirebaseFirestore.getInstance()
firebaseFirestore.collection("posts").whereEqualTo("userID", userId)
.get()
.addOnSuccessListener {
liveData3.value = it.documents as ArrayList
Log.d("UserPrlPostsViewModel", "Updated data")
}
.addOnFailureListener {
Log.d("Error", "Error in all docs")
}
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/viewmodel/WeatherListener.kt
================================================
package com.project.farmingapp.viewmodel
import androidx.lifecycle.LiveData
interface WeatherListener {
fun onSuccess(authRepo: LiveData)
}
================================================
FILE: app/src/main/java/com/project/farmingapp/viewmodel/WeatherViewModel.kt
================================================
package com.project.farmingapp.viewmodel
import android.util.Log
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.google.firebase.firestore.DocumentSnapshot
import com.project.farmingapp.adapter.WeatherAdapter
import com.project.farmingapp.model.WeatherApi
import com.project.farmingapp.model.WeatherRepository
import com.project.farmingapp.model.data.Weather
import com.project.farmingapp.model.data.WeatherRootList
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import kotlin.coroutines.coroutineContext
class WeatherViewModel : ViewModel() {
lateinit var Adapter: WeatherAdapter
lateinit var rootData: MutableLiveData
var weatherListener: WeatherListener? = null
private var message1 = MutableLiveData()
private var message2 = MutableLiveData()
private var coordinates = MutableLiveData>()
val _rootData1 = MutableLiveData()
val rootData2: LiveData = _rootData1
var newDataTrial = MutableLiveData()
fun messageToB(msg: WeatherRootList){
message2.value = msg
}
fun messageToA(msg: WeatherRootList){
message1.value = msg
}
fun getMessageA(): MutableLiveData {
return message1
}
fun getMessageB(): MutableLiveData{
return message2
}
fun callWeatherRepository() {
val response = WeatherRepository().getWeather()
// val ss = response.value!!.list[0].dt_txt
// Log.d("ViewModel", ss)
weatherListener?.onSuccess(response)
}
fun updateCoordinates(coords: List){
coordinates.value = coords
Log.d("WeatherView", coordinates.value.toString())
}
fun getCoordinates(): MutableLiveData> {
return coordinates
}
fun updateNewData(){
val response: Call =
WeatherApi.weatherInstances.getWeather("${coordinates.value?.get(0)}", "${coordinates.value?.get(1)}")
Log.d("New Weather Updated", "Yes")
Log.d("Weather Lat", "${coordinates.value?.get(0)}")
Log.d("Weather Long", "${coordinates.value?.get(1)}")
Log.d("Weather City", "${coordinates.value?.get(2)}")
if (newDataTrial.value == null) {
response.enqueue(object : Callback {
override fun onFailure(call: Call, t: Throwable) {
Log.d("WeatherRepository", "Error Occured")
}
override fun onResponse(
call: Call,
response: Response
) {
if (response.isSuccessful) {
newDataTrial.value = response.body()
}
}
}
)
}
}
}
================================================
FILE: app/src/main/java/com/project/farmingapp/viewmodel/YojnaViewModel.kt
================================================
package com.project.farmingapp.viewmodel
import android.util.Log
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.google.firebase.firestore.DocumentSnapshot
import com.google.firebase.firestore.FirebaseFirestore
import com.google.firebase.storage.FirebaseStorage
class YojnaViewModel: ViewModel() {
lateinit var firebaseDb: FirebaseFirestore
lateinit var firebaseStorage: FirebaseStorage
var msg = MutableLiveData