diff --git a/app/build.gradle b/app/build.gradle
index 8075fb2..f4c8f3d 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -12,8 +12,8 @@ android {
applicationId "app.solocoin.solocoin"
minSdkVersion 21
targetSdkVersion 29
- versionCode 2
- versionName '1.0.1'
+ versionCode 11
+ versionName '1.1.2'
renderscriptTargetApi 29
renderscriptSupportModeEnabled true
}
@@ -22,8 +22,7 @@ android {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
- debuggable = true
- signingConfig signingConfigs.debug
+ debuggable = false
}
}
@@ -38,6 +37,7 @@ android {
}
dependencies {
+ implementation 'com.google.firebase:firebase-invites:17.0.0'
def coroutines_version = '1.3.5'
def appcompat_version = '1.1.0'
def legacy_support = '1.0.0'
@@ -105,7 +105,7 @@ dependencies {
implementation 'com.github.adityasonel:InkPageIndicator:1.0'
implementation 'com.bigbangbutton:editcodeview:1.0.6'
implementation 'de.hdodenhof:circleimageview:3.1.0'
- implementation 'com.github.joielechong:countrycodepicker:2.4.1'
+ implementation 'com.github.joielechong:countrycodepicker:2.4.2'
implementation 'com.karumi:dexter:6.1.2'
implementation 'com.github.instacart.truetime-android:library:3.4'
implementation 'androidx.appcompat:appcompat:1.1.0'
@@ -113,6 +113,7 @@ dependencies {
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation "com.squareup.picasso:picasso:$picasso_version"
implementation 'com.eightbitlab:blurview:1.6.3'
+ implementation 'com.github.mreram:showcaseview:1.1'
//Work Manager
implementation "android.arch.work:work-runtime-ktx:$work_version"
@@ -121,8 +122,13 @@ dependencies {
implementation 'com.scottyab:rootbeer-lib:0.0.8'
implementation 'androidx.fragment:fragment-ktx:1.2.4'
+ //Scratch Card
+ implementation 'com.github.AnupKumarPanwar:ScratchView:1.2'
+
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'
implementation 'io.reactivex.rxjava2:rxkotlin:2.4.0'
implementation "org.jetbrains.kotlin:kotlin-script-runtime:1.3.72"
}
+
+
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index b89ff21..4db3185 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -3,12 +3,6 @@
xmlns:tools="http://schemas.android.com/tools"
package="app.solocoin.solocoin">
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+ tools:ignore="LockedOrientationActivity" />
-
-
-
-
-
-
-
-
-
-
+
+ tools:ignore="LockedOrientationActivity">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
\ No newline at end of file
diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png
index 131aa90..b2247e4 100644
Binary files a/app/src/main/ic_launcher-playstore.png and b/app/src/main/ic_launcher-playstore.png differ
diff --git a/app/src/main/java/app/solocoin/solocoin/app/SharedPrefs.kt b/app/src/main/java/app/solocoin/solocoin/app/SharedPrefs.kt
index 99d738b..bf059bf 100644
--- a/app/src/main/java/app/solocoin/solocoin/app/SharedPrefs.kt
+++ b/app/src/main/java/app/solocoin/solocoin/app/SharedPrefs.kt
@@ -7,6 +7,7 @@ import app.solocoin.solocoin.model.Milestones
import app.solocoin.solocoin.model.Reward
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
+import java.util.*
/**
* Created by Aditya Sonel on 22/04/20.
@@ -35,6 +36,11 @@ class SharedPrefs(context: Context) {
get() = instance.getString(mobile_number, null)
set(value) = instance.edit().putString(mobile_number, value).apply()
+ private val my_avatar = "bluedude"
+ var avatar:String?
+ get() =instance.getString(my_avatar,"bluedude")
+ set(value) = instance.edit().putString(my_avatar,value).apply()
+
private val _name = "name"
var name: String?
get() = instance.getString(_name, null)
@@ -115,7 +121,7 @@ class SharedPrefs(context: Context) {
private val _recent_notif_time = "recent_notif_time"
var recentNotifTime: Long
- get() = instance.getLong(_recent_notif_time, 0)
+ get() = instance.getLong(_recent_notif_time, Calendar.getInstance().timeInMillis)
set(value) = instance.edit().putLong(_recent_notif_time, value).apply()
private val _recent_check_time = "recent_check_time"
@@ -128,10 +134,13 @@ class SharedPrefs(context: Context) {
get() = instance.getBoolean(_period_valid, false)
set(value) = instance.edit().putBoolean(_period_valid, value).apply()
- private val new_user = "new_user"
- var isNewUser: Boolean
- get() = instance.getBoolean(new_user, false)
- set(value) = instance.edit().putBoolean(new_user, value).apply()
+ private val _visited = "visited"
+ var visited: ArrayList?
+ get() = Gson().fromJson?>(
+ instance.getString(_visited, null),
+ object : TypeToken>() {}.type
+ )
+ set(value) = instance.edit().putString(_visited, Gson().toJson(value)).apply()
fun clearSession() {
instance.edit()
diff --git a/app/src/main/java/app/solocoin/solocoin/di/ViewModelModule.kt b/app/src/main/java/app/solocoin/solocoin/di/ViewModelModule.kt
index 538fd78..0512ae1 100644
--- a/app/src/main/java/app/solocoin/solocoin/di/ViewModelModule.kt
+++ b/app/src/main/java/app/solocoin/solocoin/di/ViewModelModule.kt
@@ -36,4 +36,10 @@ val viewModelModule = module {
viewModel {
RewardRedeemViewModel(repository = get())
}
+ viewModel {
+ AllScratchCardsViewModel(repository = get())
+ }
+ viewModel {
+ ProfileViewModel(repository = get())
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/app/solocoin/solocoin/model/Category.kt b/app/src/main/java/app/solocoin/solocoin/model/Category.kt
new file mode 100644
index 0000000..d9a4a70
--- /dev/null
+++ b/app/src/main/java/app/solocoin/solocoin/model/Category.kt
@@ -0,0 +1,13 @@
+package app.solocoin.solocoin.model
+
+import android.os.Parcelable
+import com.google.gson.annotations.SerializedName
+import kotlinx.android.parcel.Parcelize
+/**
+ * Created by Karandeep Singh on 04/07/2020
+ */
+@Parcelize
+data class Category (
+ @SerializedName("name")
+ var name:String
+):Parcelable
diff --git a/app/src/main/java/app/solocoin/solocoin/model/LeaderBoard.kt b/app/src/main/java/app/solocoin/solocoin/model/LeaderBoard.kt
new file mode 100644
index 0000000..386b5e0
--- /dev/null
+++ b/app/src/main/java/app/solocoin/solocoin/model/LeaderBoard.kt
@@ -0,0 +1,12 @@
+package app.solocoin.solocoin.model
+
+import com.google.gson.annotations.SerializedName
+/**
+* Created by Karandeep Singh on 07/07/2020
+ */
+
+data class LeaderBoard (
+ @SerializedName("top_users")
+ var topUsers: ArrayList,
+ val user: User
+)
diff --git a/app/src/main/java/app/solocoin/solocoin/model/Profile.kt b/app/src/main/java/app/solocoin/solocoin/model/Profile.kt
new file mode 100644
index 0000000..2916cad
--- /dev/null
+++ b/app/src/main/java/app/solocoin/solocoin/model/Profile.kt
@@ -0,0 +1,25 @@
+package app.solocoin.solocoin.model
+
+import android.os.Parcelable
+import com.google.gson.annotations.SerializedName
+import kotlinx.android.parcel.Parcelize
+/**
+ * Created by Karandeep Singh on 15/07/2020
+ */
+@Parcelize
+data class Profile(
+ @SerializedName("id")
+ var id:String,
+ @SerializedName("name")
+ var name:String,
+ @SerializedName("mobile")
+ var mobile:String,
+ @SerializedName("wallet_balance")
+ var wallet_balance:String,
+ @SerializedName("home_duration_in_seconds")
+ var home_duration_in_seconds:String,
+ @SerializedName("redeemed_rewards")
+ var redeemed_rewards: ArrayList,
+ @SerializedName("referral")
+ var referral: Referral
+):Parcelable
\ No newline at end of file
diff --git a/app/src/main/java/app/solocoin/solocoin/model/RedeemedRewards.kt b/app/src/main/java/app/solocoin/solocoin/model/RedeemedRewards.kt
new file mode 100644
index 0000000..195638a
--- /dev/null
+++ b/app/src/main/java/app/solocoin/solocoin/model/RedeemedRewards.kt
@@ -0,0 +1,17 @@
+package app.solocoin.solocoin.model
+
+import android.os.Parcelable
+import com.google.gson.annotations.SerializedName
+import kotlinx.android.parcel.Parcelize
+/**
+ * Created by Karandeep Singh on 15/07/2020
+ */
+@Parcelize
+data class RedeemedRewards (
+ @SerializedName("rewards_sponsor_id")
+ var rewards_sponsor_id:Int,
+ @SerializedName("coupon_code")
+ var coupon_code:String,
+ @SerializedName("offer_name")
+ var offer_name:String
+):Parcelable
\ No newline at end of file
diff --git a/app/src/main/java/app/solocoin/solocoin/model/Referral.kt b/app/src/main/java/app/solocoin/solocoin/model/Referral.kt
new file mode 100644
index 0000000..760d39b
--- /dev/null
+++ b/app/src/main/java/app/solocoin/solocoin/model/Referral.kt
@@ -0,0 +1,15 @@
+package app.solocoin.solocoin.model
+
+import android.os.Parcelable
+import com.google.gson.annotations.SerializedName
+import kotlinx.android.parcel.Parcelize
+/**
+ * Created by Karandeep Singh on 04/07/2020
+ */
+@Parcelize
+data class Referral (
+ @SerializedName("code")
+ var refercode:String,
+ @SerializedName("amount")
+ var amount:String
+): Parcelable
\ No newline at end of file
diff --git a/app/src/main/java/app/solocoin/solocoin/model/Reward.kt b/app/src/main/java/app/solocoin/solocoin/model/Reward.kt
index bb33187..34f24cd 100644
--- a/app/src/main/java/app/solocoin/solocoin/model/Reward.kt
+++ b/app/src/main/java/app/solocoin/solocoin/model/Reward.kt
@@ -9,8 +9,10 @@ import kotlinx.android.parcel.Parcelize
*/
@Parcelize
data class Reward(
+ @SerializedName("category")
+ var category:Category,
@SerializedName("id")
- var rewardId: String,
+ var rewardId: Int,
@SerializedName("offer_name")
var rewardName: String,
@SerializedName("company_name")
@@ -23,9 +25,15 @@ data class Reward(
var costRupees: String,
@SerializedName("coupon_code")
var couponCode: String,
- var companyLogoUrl: String? = null,
- var rewardImageUrl: String? = null,
+ @SerializedName("currency_type")
+ var currency:String,
+ @SerializedName("brand_logo_url")
+ var logo_url:String,
+// var companyLogoUr String? = null,
+//// var rewardImageUrl: l:String? = null,
var isClaimed: Boolean = false
+
+
) : Parcelable
//"id": 2,
diff --git a/app/src/main/java/app/solocoin/solocoin/model/User.kt b/app/src/main/java/app/solocoin/solocoin/model/User.kt
new file mode 100644
index 0000000..0b0ad4c
--- /dev/null
+++ b/app/src/main/java/app/solocoin/solocoin/model/User.kt
@@ -0,0 +1,30 @@
+package app.solocoin.solocoin.model
+
+import android.os.Parcelable
+import com.google.gson.annotations.SerializedName
+import kotlinx.android.parcel.Parcelize
+
+/**
+ * Created by Karandeep Singh on 04/07/2020
+ */
+@Parcelize
+data class User (
+ @SerializedName("id")
+ var id:String?,
+ @SerializedName("name")
+ var name: String?,
+ @SerializedName("country_code")
+ var countryCode:String?,
+ @SerializedName("wallet_balance")
+ var wallet_balance:String?,
+ @SerializedName("wb_rank")
+ var rank:String?
+): Parcelable
+
+//{
+// "id": 11,
+// "name": "Mishaal Testing",
+// "country_code": null,
+// "wallet_balance": "14682.0",
+// "wb_rank": 2
+//}
\ No newline at end of file
diff --git a/app/src/main/java/app/solocoin/solocoin/repo/ApiService.kt b/app/src/main/java/app/solocoin/solocoin/repo/ApiService.kt
index 407de8b..2ef754a 100644
--- a/app/src/main/java/app/solocoin/solocoin/repo/ApiService.kt
+++ b/app/src/main/java/app/solocoin/solocoin/repo/ApiService.kt
@@ -1,6 +1,8 @@
package app.solocoin.solocoin.repo
+import app.solocoin.solocoin.model.LeaderBoard
import app.solocoin.solocoin.model.Milestones
+import app.solocoin.solocoin.model.Profile
import app.solocoin.solocoin.model.Reward
import com.google.gson.JsonObject
import retrofit2.Response
@@ -40,11 +42,14 @@ interface ApiService {
@Headers("Content-Type: application/json")
@GET("user/profile")
- suspend fun getProfile(@Header("Authorization") authToken: String): Response
+ suspend fun getProfile(@Header("Authorization") authToken: String): Response
@GET("rewards_sponsors")
suspend fun getOffers(@Header("Authorization") authToken: String): Response>
+ @GET("rewards_sponsors/scratch_cards")
+ suspend fun getScratchCardOffers(@Header("Authorization") authToken: String):Response>
+
@Headers("Content-Type: application/json")
@POST("user/redeem_rewards")
suspend fun redeemRewards(
@@ -55,6 +60,8 @@ interface ApiService {
@GET("user/badges")
suspend fun getBadgesLevels(@Header("Authorization") authToken: String): Response
+ @GET("leaderboard")
+ suspend fun getleaderboard(@Header("Authorization")authToken: String): Response
@GET("questions/daily")
suspend fun getDailyQuiz(@Header("Authorization") authToken: String): Response
@@ -67,4 +74,19 @@ interface ApiService {
@Header("Authorization") authToken: String,
@Body body: JsonObject
): Response
+
+ @Headers("Content-Type: application/json")
+ @POST("coin_codes/redeem_coupon?coupon=")
+ suspend fun redeemCoupon(
+ @Query("coupon") promocode: String,
+ @Header("Authorization") authToken: String
+ ): Response
+
+ @Headers("Content-Type: application/json")
+ @POST("coin_codes/referral?referred_user_code=something&referral_coupon=")
+ suspend fun refer_and_earn(
+ @Query("referred_user_code") newusertoken: String,
+ @Query("referral_coupon") refercode:String,
+ @Header("Authorization") authToken: String
+ ): Response
}
\ No newline at end of file
diff --git a/app/src/main/java/app/solocoin/solocoin/repo/SolocoinRepository.kt b/app/src/main/java/app/solocoin/solocoin/repo/SolocoinRepository.kt
index ad7ae84..337115d 100644
--- a/app/src/main/java/app/solocoin/solocoin/repo/SolocoinRepository.kt
+++ b/app/src/main/java/app/solocoin/solocoin/repo/SolocoinRepository.kt
@@ -19,11 +19,17 @@ class SolocoinRepository(private val apiService: ApiService) {
suspend fun pingSession(body: JsonObject) =
apiService.pingSession(sharedPrefs?.authToken!!, body)
suspend fun getOffers() = apiService.getOffers(sharedPrefs?.authToken!!)
+ suspend fun getprofile() = apiService.getProfile(sharedPrefs?.authToken!!)
+ suspend fun getScratchCardOffers() = apiService.getScratchCardOffers(sharedPrefs?.authToken!!)
suspend fun redeemRewards(body: JsonObject) =
apiService.redeemRewards(sharedPrefs?.authToken!!, body)
suspend fun getDailyQuiz() = apiService.getDailyQuiz(sharedPrefs?.authToken!!)
suspend fun getWeeklyQuiz() = apiService.getWeeklyQuiz(sharedPrefs?.authToken!!)
suspend fun submitQuizAnswer(body: JsonObject) =
apiService.submitQuizAnswer(sharedPrefs?.authToken!!, body)
+ suspend fun redeemcoupon(promocode: String)=apiService.redeemCoupon(promocode, sharedPrefs?.authToken!!)
+ suspend fun refer_and_earn(newusertoken:String,refercode:String) =apiService.refer_and_earn(newusertoken,
+ refercode, sharedPrefs?.authToken!!)
suspend fun getBadgesLevels() = apiService.getBadgesLevels(sharedPrefs?.authToken!!)
+ suspend fun getleaderboard() =apiService.getleaderboard(sharedPrefs?.authToken!!)
}
\ No newline at end of file
diff --git a/app/src/main/java/app/solocoin/solocoin/ui/SplashActivity.kt b/app/src/main/java/app/solocoin/solocoin/ui/SplashActivity.kt
index 229f33e..929660e 100644
--- a/app/src/main/java/app/solocoin/solocoin/ui/SplashActivity.kt
+++ b/app/src/main/java/app/solocoin/solocoin/ui/SplashActivity.kt
@@ -1,8 +1,10 @@
package app.solocoin.solocoin.ui
import android.content.Intent
+import android.net.Uri
import android.os.Bundle
import android.os.Handler
+import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import app.solocoin.solocoin.R
import app.solocoin.solocoin.app.SolocoinApp.Companion.sharedPrefs
@@ -12,6 +14,7 @@ import app.solocoin.solocoin.ui.auth.OnboardActivity
import app.solocoin.solocoin.ui.home.HomeActivity
import app.solocoin.solocoin.util.GlobalUtils
import com.google.firebase.auth.FirebaseAuth
+import com.google.firebase.dynamiclinks.FirebaseDynamicLinks
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.InternalCoroutinesApi
@@ -23,6 +26,23 @@ class SplashActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_splash)
+ FirebaseDynamicLinks.getInstance()
+ .getDynamicLink(intent)
+ .addOnSuccessListener(this) { pendingDynamicLinkData ->
+ // Get deep link from result (may be null if no link is found)
+ var deepLink: Uri? = null
+ if (pendingDynamicLinkData != null) {
+ deepLink = pendingDynamicLinkData.link
+ val s = deepLink.toString().substring(getString(R.string.app_link).length)
+ Log.e("Tagkarandeep3", "old_user_id:"+s+"newuserid:"+ sharedPrefs?.mobileNumber)
+ }
+ // Handle the deep link. For example, open the linked
+ // content, or apply promotional credit to the user's
+ // account.
+ // ...
+ // ...
+ }
+ .addOnFailureListener(this) { e -> Log.w("TAG", "getDynamicLink:onFailure", e) }
Handler().postDelayed({
if (FirebaseAuth.getInstance().currentUser?.uid != null) {
@@ -40,7 +60,7 @@ class SplashActivity : AppCompatActivity() {
GlobalUtils.startActivityAsNewStack(Intent(this, OnboardActivity::class.java), this)
finish()
}
- }, 3000)
+ }, 500)
}
}
diff --git a/app/src/main/java/app/solocoin/solocoin/ui/adapter/AllRewardsAdapter.kt b/app/src/main/java/app/solocoin/solocoin/ui/adapter/AllRewardsAdapter.kt
new file mode 100644
index 0000000..ab6878e
--- /dev/null
+++ b/app/src/main/java/app/solocoin/solocoin/ui/adapter/AllRewardsAdapter.kt
@@ -0,0 +1,78 @@
+package app.solocoin.solocoin.ui.adapter
+
+import android.annotation.SuppressLint
+import android.app.Activity
+import android.content.Intent
+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 app.solocoin.solocoin.R
+import app.solocoin.solocoin.model.RedeemedRewards
+import app.solocoin.solocoin.model.Reward
+import app.solocoin.solocoin.ui.home.RewardRedeemActivity
+import app.solocoin.solocoin.util.GlobalUtils
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.InternalCoroutinesApi
+import java.util.*
+
+/**
+ * Created by Karandeep Singh on 15/07/2020
+ */
+@InternalCoroutinesApi
+@ExperimentalCoroutinesApi
+class AllRewardsAdapter(
+ private val context: Activity,
+ val rewardsArrayList: ArrayList
+) :
+ RecyclerView.Adapter() {
+
+ override fun onCreateViewHolder(
+ parent: ViewGroup,
+ viewType: Int
+ ): ViewHolder =
+ ViewHolder(LayoutInflater.from(context).inflate(R.layout.item_allrewards, parent, false))
+
+ override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+ holder.bindRewards(context, rewardsArrayList[position])
+ }
+
+ override fun getItemCount() = rewardsArrayList.size
+
+ class ViewHolder internal constructor(itemView: View) :
+ RecyclerView.ViewHolder(itemView),
+ View.OnClickListener {
+
+
+ private var offername: TextView
+ private var promocode: TextView
+
+
+ init {
+ offername = itemView.findViewById(R.id.offername)
+ promocode = itemView.findViewById(R.id.promocode)
+ itemView.setOnClickListener(this)
+ }
+
+ override fun onClick(view: View) {
+// mListener?.onClick(view, adapterPosition)
+ }
+
+ @SuppressLint("DefaultLocale")
+ fun bindRewards(context: Activity, reward: RedeemedRewards) {
+ reward.let {
+// updateImage(it)
+ offername.text = it.offer_name
+ promocode.text = "Promocode: "+it.coupon_code
+
+ }
+ }
+
+// private fun updateImage(reward: Reward) {
+// GlobalUtils.loadImageNetworkCacheVisibility(reward.companyLogoUrl, companyLogo)
+// }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/app/solocoin/solocoin/ui/adapter/LeaderBoardAdapter.kt b/app/src/main/java/app/solocoin/solocoin/ui/adapter/LeaderBoardAdapter.kt
new file mode 100644
index 0000000..73fa6fc
--- /dev/null
+++ b/app/src/main/java/app/solocoin/solocoin/ui/adapter/LeaderBoardAdapter.kt
@@ -0,0 +1,89 @@
+package app.solocoin.solocoin.ui.adapter
+
+import android.annotation.SuppressLint
+import android.content.Context
+import android.content.res.ColorStateList
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.cardview.widget.CardView
+import androidx.core.content.ContextCompat.getColor
+import androidx.recyclerview.widget.RecyclerView
+import app.solocoin.solocoin.R
+import app.solocoin.solocoin.model.User
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.InternalCoroutinesApi
+import kotlin.coroutines.coroutineContext
+
+/**
+ * Created by Karandeep Singh on 04/07/2020
+ */
+@InternalCoroutinesApi
+@ExperimentalCoroutinesApi
+class LeaderBoardAdapter(
+ private val context: Context,
+ private val leaderboardArrayList: ArrayList
+): RecyclerView.Adapter() {
+
+ override fun onCreateViewHolder(
+ parent: ViewGroup,
+ viewType: Int
+ ): ViewHolder =
+ ViewHolder(LayoutInflater.from(context).inflate(R.layout.item_rank_card, parent, false))
+
+ override fun getItemCount() = leaderboardArrayList.size
+
+ class ViewHolder(itemView: View) :
+ RecyclerView.ViewHolder(itemView) {
+ private var name: TextView? = null
+ private var country: TextView? = null
+ private var coincount: TextView? = null
+ private var rank: TextView? = null
+ private var dots:TextView?=null
+ private var cardview: CardView?=null
+ private var cardviewborder: LinearLayout?=null
+
+ init {
+ with(itemView) {
+ name = findViewById(R.id.name)
+ country = findViewById(R.id.country)
+ coincount = findViewById(R.id.coincount)
+ rank=findViewById(R.id.rank)
+ dots=findViewById(R.id.dots)
+ cardview=findViewById(R.id.rank_cv)
+ cardviewborder = findViewById(R.id.cardviewborder)
+
+ }
+ }
+ private lateinit var context: Context;
+
+ fun setUpView(context:Context, user: User?, position: Int) {
+ user?.let {
+ if(it.wallet_balance!=null){
+ coincount?.text=it.wallet_balance?.substring(0,it.wallet_balance!!.length-2)+" coins"
+ }
+ else{
+ coincount?.text=it.wallet_balance+" coins"
+ }
+ name?.text = it.name?.capitalize()!!
+ rank?.text = "#"+it.rank!!
+ country?.text=it.countryCode?.toUpperCase()
+ if(position==2) dots?.visibility=View.VISIBLE
+ if(position in 0..2){
+// cardview?.cardBackgroundColor(getColor(context,R.color.light))
+// cardview?.setCardBackgroundColor(getColor(context,R.color.grey_light))
+// rank?.setTextColor(getColor(context,R.color.colorPrimaryDark))
+// name?.setTextColor(getColor(context,R.color.colorAccent))
+// coincount?.setTextColor(getColor(context,R.color.colorAccent))
+// country?.setTextColor(getColor(context,R.color.colorPrimaryDark))
+ cardviewborder?.setBackgroundColor(getColor(context,R.color.white))
+ }
+ }
+ }
+ }
+ override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+ holder.setUpView( context,leaderboardArrayList[position],position)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/app/solocoin/solocoin/ui/adapter/MilestonesAdapter.kt b/app/src/main/java/app/solocoin/solocoin/ui/adapter/MilestonesAdapter.kt
index 0c86d86..5e1132e 100644
--- a/app/src/main/java/app/solocoin/solocoin/ui/adapter/MilestonesAdapter.kt
+++ b/app/src/main/java/app/solocoin/solocoin/ui/adapter/MilestonesAdapter.kt
@@ -1,5 +1,6 @@
package app.solocoin.solocoin.ui.adapter
+import android.animation.ObjectAnimator
import android.annotation.SuppressLint
import android.app.Activity
import android.content.Context
@@ -8,22 +9,32 @@ import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
+import android.view.animation.DecelerateInterpolator
import android.widget.*
+import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import app.solocoin.solocoin.R
import app.solocoin.solocoin.model.Milestones
+import app.solocoin.solocoin.model.User
import app.solocoin.solocoin.ui.home.ShareBadgeActivity
import app.solocoin.solocoin.util.GlobalUtils
import eightbitlab.com.blurview.BlurView
import eightbitlab.com.blurview.RenderScriptBlur
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.InternalCoroutinesApi
import kotlin.math.ceil
/**
* Created by Saurav Gupta on 22/05/2020
+ Updated by Karandeep Singh on 04/07/2020
*/
+@InternalCoroutinesApi
+@ExperimentalCoroutinesApi
class MilestonesAdapter(
private val context: Context,
- private val milestonesArrayList: ArrayList
+ private val milestonesArrayList: ArrayList,
+ private var topuserlist:ArrayList
+
) : RecyclerView.Adapter() {
override fun onCreateViewHolder(
@@ -36,11 +47,14 @@ class MilestonesAdapter(
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.bindBadges(context, milestonesArrayList[position])
+ holder.intializeLeaderBoard(context,topuserlist)
+
}
class ViewHolder(itemView: View) :
RecyclerView.ViewHolder(itemView) {
+ private lateinit var context: Context
private var levelFront: TextView
private var levelMid: TextView
private var levelRear: TextView
@@ -50,6 +64,10 @@ class MilestonesAdapter(
private var levelInfoTv2: TextView
private var progressBar: ProgressBar
private var badgesGridL: GridLayout
+ private lateinit var lAdapter: LeaderBoardAdapter
+ private var recyclerViewleader: RecyclerView
+
+
init {
with(itemView) {
@@ -62,11 +80,15 @@ class MilestonesAdapter(
levelInfoTv2 = findViewById(R.id.level_info_tv_2)
progressBar = findViewById(R.id.level_pb)
badgesGridL = findViewById(R.id.badges_gl)
+ recyclerViewleader=findViewById(R.id.leaderboardrview)
+ recyclerViewleader.layoutManager= LinearLayoutManager(context)
+
}
}
@SuppressLint("DefaultLocale")
fun bindBadges(context: Context, milestones: Milestones) {
+ this.context = context
var userBadgesCnt = 0
var userLevel = 0
val total = milestones.badgeLevel.size
@@ -130,7 +152,7 @@ class MilestonesAdapter(
userBadgesCnt++
} else {
it.has = false
- addBlurView(context, badgeCv)
+ addBlurView(badgeCv)
}
badgesGridL.addView(badgeCv)
col++
@@ -140,8 +162,15 @@ class MilestonesAdapter(
bindLevel(userLevel, milestones)
}
+ fun intializeLeaderBoard(context: Context,topuserlist:ArrayList){
+
+ lAdapter = LeaderBoardAdapter(context, topuserlist)
+ recyclerViewleader.adapter = lAdapter
+
+ }
+
- private fun addBlurView(context: Context, badgeCv: View) {
+ private fun addBlurView(badgeCv: View) {
val radius = 4f
val blurView = badgeCv.findViewById(R.id.blurView)
val decorView = (context as Activity).window.decorView
@@ -177,17 +206,17 @@ class MilestonesAdapter(
0 -> {
extraProgress *= (27.0 / (nextLevelPoints - currentLevelPoints))
extraProgress = ceil(extraProgress)
- progressBar.progress = 26 + extraProgress.toInt()
+ startAnimation(26 + extraProgress.toInt())
}
1 -> {
extraProgress *= (27.0 / (nextLevelPoints - currentLevelPoints))
extraProgress = ceil(extraProgress)
- progressBar.progress = 53 + extraProgress.toInt()
+ startAnimation(53 + extraProgress.toInt())
}
2 -> {
extraProgress *= (19.0 / (nextLevelPoints - currentLevelPoints))
extraProgress = ceil(extraProgress)
- progressBar.progress = 80 + extraProgress.toInt()
+ startAnimation(80 + extraProgress.toInt())
}
}
@@ -198,8 +227,16 @@ class MilestonesAdapter(
levelFront.text = ("Level ${(userLevel - 3)}")
levelMid.text = ("Level ${(userLevel - 2)}")
levelRear.text = ("Level ${(userLevel - 1)}")
- progressBar.progress = 99
+ startAnimation(99)
}
}
+
+ private fun startAnimation(progress: Int) {
+ val progressAnimator = ObjectAnimator.ofInt(progressBar, "progress", 0, progress)
+ progressAnimator.duration = 3000
+ progressAnimator.interpolator = DecelerateInterpolator()
+ progressAnimator.start()
+ }
+
}
}
diff --git a/app/src/main/java/app/solocoin/solocoin/ui/adapter/RewardRedeemAdapter.kt b/app/src/main/java/app/solocoin/solocoin/ui/adapter/RewardRedeemAdapter.kt
index b3486ab..565cf78 100644
--- a/app/src/main/java/app/solocoin/solocoin/ui/adapter/RewardRedeemAdapter.kt
+++ b/app/src/main/java/app/solocoin/solocoin/ui/adapter/RewardRedeemAdapter.kt
@@ -71,7 +71,7 @@ class RewardRedeemAdapter(
@SuppressLint("DefaultLocale")
fun setUpView(context: Activity, reward: Reward) {
reward.let {
- updateImage(it)
+ //updateImage(it)
coinsAmt.text = ("${it.costCoins} coins")
rewardName.text = it.rewardName.capitalize()
updateRewardTnc(it)
@@ -93,10 +93,10 @@ class RewardRedeemAdapter(
}
}
- private fun updateImage(reward: Reward) {
- GlobalUtils.loadImageNetworkCacheVisibility(reward.rewardImageUrl, rewardImage)
- GlobalUtils.loadImageNetworkCacheVisibility(reward.companyLogoUrl, companyLogo)
- }
+// private fun updateImage(reward: Reward) {
+// GlobalUtils.loadImageNetworkCacheVisibility(reward.rewardImageUrl, rewardImage)
+// GlobalUtils.loadImageNetworkCacheVisibility(reward.companyLogoUrl, companyLogo)
+// }
private fun updateRewardTnc(reward: Reward) {
reward.rewardTermsAndConditions?.let {
diff --git a/app/src/main/java/app/solocoin/solocoin/ui/adapter/RewardsListAdapter.kt b/app/src/main/java/app/solocoin/solocoin/ui/adapter/RewardsListAdapter.kt
index 8a9db92..2f3e093 100644
--- a/app/src/main/java/app/solocoin/solocoin/ui/adapter/RewardsListAdapter.kt
+++ b/app/src/main/java/app/solocoin/solocoin/ui/adapter/RewardsListAdapter.kt
@@ -3,16 +3,21 @@ package app.solocoin.solocoin.ui.adapter
import android.annotation.SuppressLint
import android.app.Activity
import android.content.Intent
+import android.content.res.Resources
+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.appcompat.content.res.AppCompatResources.getDrawable
import androidx.recyclerview.widget.RecyclerView
import app.solocoin.solocoin.R
import app.solocoin.solocoin.model.Reward
import app.solocoin.solocoin.ui.home.RewardRedeemActivity
import app.solocoin.solocoin.util.GlobalUtils
+import com.karumi.dexter.listener.multi.SnackbarOnAnyDeniedMultiplePermissionsListener.Builder.with
+import com.squareup.picasso.Picasso
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.InternalCoroutinesApi
import java.util.*
@@ -35,7 +40,8 @@ class RewardsListAdapter(
ViewHolder(LayoutInflater.from(context).inflate(R.layout.item_reward_card, parent, false))
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
- holder.bindRewards(context, rewardsArrayList[position])
+ val pos =holder.adapterPosition;
+ holder.bindRewards(context, rewardsArrayList[pos])
}
override fun getItemCount() = rewardsArrayList.size
@@ -45,9 +51,11 @@ class RewardsListAdapter(
View.OnClickListener {
private var companyLogo: ImageView
+ private var offername:TextView
private var costRupees: TextView
private var companyName: TextView
private var costCoins: TextView
+ private var currency:TextView
private var mListener: RecyclerViewClickListener? = null
init {
@@ -55,39 +63,49 @@ class RewardsListAdapter(
costRupees = itemView.findViewById(R.id.cost_rupees)
companyName = itemView.findViewById(R.id.company_name)
costCoins = itemView.findViewById(R.id.cost_coins)
+ currency = itemView.findViewById(R.id.currency)
+ offername = itemView.findViewById(R.id.offer_name)
itemView.setOnClickListener(this)
- companyLogo.visibility = View.GONE
+ companyLogo.visibility = View.VISIBLE
}
override fun onClick(view: View) {
mListener?.onClick(view, adapterPosition)
}
- @SuppressLint("DefaultLocale")
+ //@SuppressLint("DefaultLocale")
fun bindRewards(context: Activity, reward: Reward) {
reward.let {
- updateImage(it)
+// updateImage(it)
+ companyLogo.setImageDrawable(getDrawable(context,R.drawable.ic_discount))
companyName.text = it.companyName.capitalize()
- costCoins.text = ("${it.costCoins} coins")
- costRupees.text = it.costRupees
+ costCoins.text = ( "${it.costCoins}" )
+ costRupees.text = ( "${it.costRupees}" )
+ offername.text =it.rewardName
+ currency.text=it.currency
+ if(it.logo_url.isNotEmpty()) {
+ Picasso.get().load(it.logo_url).into(companyLogo)
+ }
mListener = object : RecyclerViewClickListener {
override fun onClick(view: View?, position: Int) {
val intent = Intent(
context,
RewardRedeemActivity::class.java
)
- intent.putExtra("EXTRA_INFO", it)
- intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)
- context.startActivity(intent)
+ if(it.category!=null) {
+ intent.putExtra("EXTRA_INFO", it)
+ intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)
+ context.startActivity(intent)
+ }
}
}
}
}
- private fun updateImage(reward: Reward) {
- GlobalUtils.loadImageNetworkCacheVisibility(reward.companyLogoUrl, companyLogo)
- }
+// private fun updateImage(reward: Reward) {
+// GlobalUtils.loadImageNetworkCacheVisibility(reward.companyLogoUrl, companyLogo)
+// }
}
}
\ No newline at end of file
diff --git a/app/src/main/java/app/solocoin/solocoin/ui/adapter/ScratchCardAdapter.kt b/app/src/main/java/app/solocoin/solocoin/ui/adapter/ScratchCardAdapter.kt
new file mode 100644
index 0000000..44b61d0
--- /dev/null
+++ b/app/src/main/java/app/solocoin/solocoin/ui/adapter/ScratchCardAdapter.kt
@@ -0,0 +1,112 @@
+package app.solocoin.solocoin.ui.adapter
+
+import android.app.Activity
+import android.app.Dialog
+import android.content.Context
+import android.content.Intent
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.view.Window
+import android.widget.TextView
+import android.widget.Toast
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.recyclerview.widget.RecyclerView
+import app.solocoin.solocoin.R
+import app.solocoin.solocoin.model.Reward
+import app.solocoin.solocoin.model.ScratchTicket
+import app.solocoin.solocoin.ui.home.AppGuideActivity
+import app.solocoin.solocoin.ui.home.RewardRedeemActivity
+import com.anupkumarpanwar.scratchview.ScratchView
+import kotlinx.android.synthetic.main.fragment_home.*
+import kotlinx.coroutines.InternalCoroutinesApi
+import java.util.*
+
+/**
+ * Created by Karandeep Singh on 14/07/2020
+ */
+class ScratchCardAdapter(
+ private val context: Activity,
+ private val scratchArrayList: ArrayList
+) :
+ RecyclerView.Adapter() {
+ override fun onCreateViewHolder(
+ parent: ViewGroup,
+ viewType: Int
+ ): ViewHolder =
+ ViewHolder(
+ LayoutInflater.from(context).inflate(R.layout.item_scratch_card, parent, false)
+ )
+
+ override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+ holder.setUpView(scratchArrayList[position])
+ }
+
+ override fun getItemCount() = scratchArrayList.size
+
+ class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+
+ private var offernametxt: String? = null
+ private var scratchitem: Reward?=null
+// private var scratchReward: TextView? = null
+// var scratchCardLayout: ConstraintLayout? = null
+
+ init {
+ with(itemView) {
+ itemView.setOnClickListener {
+ showDialog(context)
+ }
+// offername = findViewById(R.id.offername)
+// scratchReward = findViewById(R.id.scratch_reward)
+// scratchCardLayout = findViewById(R.id.scratch_constraint_layout)
+ }
+ }
+
+
+ @OptIn(InternalCoroutinesApi::class)
+ private fun showDialog(context:Context) {
+ val dialog = Dialog(context)
+ dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
+ dialog.setCancelable(true)
+ dialog.setContentView(R.layout.scratch_card)
+ val scratchView: ScratchView = dialog.findViewById(R.id.scratch_view)
+ var offername:TextView = dialog.findViewById(R.id.offername)
+ var moredetails:TextView=dialog.findViewById(R.id.moredetails)
+ moredetails.setOnClickListener {
+ val intent =Intent(context,RewardRedeemActivity::class.java)
+ intent.putExtra("EXTRA_INFO", scratchitem)
+ intent.putExtra("scratchcard",true)
+ intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)
+ context.startActivity(intent)
+ dialog.dismiss()
+ }
+ offername.setText(offernametxt)
+ scratchView.setRevealListener(object : ScratchView.IRevealListener {
+ override fun onRevealed(scratchView: ScratchView?) {
+ Toast.makeText(context,"Congratulations!!",Toast.LENGTH_LONG).show()
+ scratchView?.visibility=View.GONE
+ scratchitem
+// scratch_card_image.visibility=View.GONE
+ }
+
+ override fun onRevealPercentChangedListener(scratchView: ScratchView?, percent: Float) {
+ if(percent>0.5){
+// Toast.makeText(context, "Revealed!$percent",Toast.LENGTH_LONG).show()
+ }
+ }
+ })
+ dialog.show()
+ }
+
+ fun setUpView(scratchTicket: Reward?) {
+ scratchitem=scratchTicket
+ scratchTicket?.let {
+ offernametxt="You Won "+it.rewardName+"\nworth ₹ "+it.costRupees
+// offername?.text = "You won "+it.rewardName!!
+// scratchReward?.text = it.rewardRupees!!
+ }
+ }
+
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/app/solocoin/solocoin/ui/adapter/ScratchDetailsAdapter.kt b/app/src/main/java/app/solocoin/solocoin/ui/adapter/ScratchDetailsAdapter.kt
deleted file mode 100644
index a6206de..0000000
--- a/app/src/main/java/app/solocoin/solocoin/ui/adapter/ScratchDetailsAdapter.kt
+++ /dev/null
@@ -1,62 +0,0 @@
-package app.solocoin.solocoin.ui.adapter
-
-// Author: Vijay Daita
-
-import android.app.Activity
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.TextView
-import androidx.constraintlayout.widget.ConstraintLayout
-import androidx.recyclerview.widget.RecyclerView
-import app.solocoin.solocoin.R
-import app.solocoin.solocoin.model.ScratchTicket
-import java.util.*
-
-/**
- * Created by Vijay Daita
- */
-class ScratchDetailsAdapter(
- private val context: Activity,
- private val scratchArrayList: ArrayList
-) :
- RecyclerView.Adapter() {
- override fun onCreateViewHolder(
- parent: ViewGroup,
- viewType: Int
- ): ViewHolder =
- ViewHolder(
- LayoutInflater.from(context).inflate(R.layout.item_scratch_card, parent, false)
- )
-
- override fun onBindViewHolder(holder: ViewHolder, position: Int) {
- holder.setUpView(scratchArrayList[position])
- }
-
- override fun getItemCount() = scratchArrayList.size
-
- class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
-
- private var scratchCost: TextView? = null
- private var scratchReward: TextView? = null
- var scratchCardLayout: ConstraintLayout? = null
-
- init {
- with(itemView) {
- scratchCost = findViewById(R.id.scratch_cost)
- scratchReward = findViewById(R.id.scratch_reward)
- scratchCardLayout = findViewById(R.id.scratch_constraint_layout)
- }
- }
-
- fun setUpView(scratchTicket: ScratchTicket?) {
- scratchTicket?.let {
- scratchCost?.text = it.costRupees!!
- scratchReward?.text = it.rewardRupees!!
-// TODO: make network call when layout is clicked.
- }
- }
-
- }
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/app/solocoin/solocoin/ui/auth/CreateProfileActivity.kt b/app/src/main/java/app/solocoin/solocoin/ui/auth/CreateProfileActivity.kt
index e1b5fb6..28cd419 100644
--- a/app/src/main/java/app/solocoin/solocoin/ui/auth/CreateProfileActivity.kt
+++ b/app/src/main/java/app/solocoin/solocoin/ui/auth/CreateProfileActivity.kt
@@ -24,6 +24,7 @@ import app.solocoin.solocoin.util.enums.Status
import com.google.firebase.auth.FirebaseAuth
import com.google.gson.JsonObject
import kotlinx.android.synthetic.main.activity_create_profile.*
+import kotlinx.android.synthetic.main.activity_get_free_coins.*
import kotlinx.android.synthetic.main.activity_mark_location.btn_confirm
import kotlinx.android.synthetic.main.activity_mark_location.toolbar
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -88,15 +89,15 @@ class CreateProfileActivity : AppCompatActivity(), View.OnClickListener {
if (authToken != null) {
sharedPrefs?.authToken = authToken
sharedPrefs?.id = id
- sharedPrefs?.isNewUser = true
+
// Update user data at Api after successful SignUp
val _body = JsonObject()
- val user = JsonObject()
- user.addProperty("name", sharedPrefs?.name)
- user.addProperty("mobile", sharedPrefs?.mobileNumber)
- user.addProperty("lat", sharedPrefs?.userLat)
- user.addProperty("lng", sharedPrefs?.userLong)
- _body.add("user", user)
+ //val user = JsonObject()
+ _body.addProperty("name", sharedPrefs?.name)
+ _body.addProperty("mobile", sharedPrefs?.mobileNumber)
+ _body.addProperty("lat", sharedPrefs?.userLat)
+ _body.addProperty("lng", sharedPrefs?.userLong)
+ //_body.add("user", user)
doApiUserUpdate(_body)
} else {
@@ -123,18 +124,23 @@ class CreateProfileActivity : AppCompatActivity(), View.OnClickListener {
}
private fun doApiUserUpdate(body: JsonObject) {
+ Log.i("userupdate","body:"+body)
+ Log.i("userupdate","auth:"+ sharedPrefs?.authToken)
viewModel.userUpdate(body).observe(this@CreateProfileActivity, Observer { res ->
// Log.wtf(TAG + " User Update", "$res")
res?.let { resource ->
when (resource.status) {
Status.SUCCESS -> {
- GlobalUtils.startActivityAsNewStack(
+ sharedPrefs?.visited = arrayListOf(true, true, true)
+ credit_refer_bonus(refer_code.text.toString())
+ /*GlobalUtils.startActivityAsNewStack(
Intent(
this@CreateProfileActivity,
HomeActivity::class.java
), this@CreateProfileActivity
)
- finish()
+
+ finish()*/
}
Status.ERROR -> {
if (resource.exception is NoConnectivityException) {
@@ -157,7 +163,37 @@ class CreateProfileActivity : AppCompatActivity(), View.OnClickListener {
}
})
}
+ private fun credit_refer_bonus(refercode:String){
+ val newusertoken= sharedPrefs?.authToken!!.substring(7)
+ viewModel.refer_and_earn(newusertoken,refercode).observe(this, Observer { response ->
+ Log.d(TAG,"refercodetest:"+response)
+ Log.d(TAG,"refercodetest:"+response.status)
+
+ Log.d(TAG, "refercodetest:"+sharedPrefs?.authToken)
+ Log.d(TAG, "refercodetestx:"+newusertoken)
+ Log.d(TAG, "refercodetest:"+refercode)
+ when (response.status) {
+ Status.SUCCESS -> {
+ when(response.code){
+ 200->{
+ Toast.makeText(applicationContext,"Refer Code Redeemed successfully!",Toast.LENGTH_LONG).show()
+ }
+ }
+ GlobalUtils.startActivityAsNewStack(
+ Intent(
+ this@CreateProfileActivity,
+ HomeActivity::class.java
+ ), this@CreateProfileActivity
+ )
+ }
+ Status.ERROR -> {
+ }
+ Status.LOADING -> {
+ }
+ }
+ })
+ }
override fun onClick(p0: View?) {
val name = et_name.text.toString()
if (name.isEmpty()) {
@@ -169,13 +205,15 @@ class CreateProfileActivity : AppCompatActivity(), View.OnClickListener {
val user = JsonObject()
if (sharedPrefs?.authToken != null) {
- user.addProperty("name", sharedPrefs?.name)
- user.addProperty("mobile", sharedPrefs?.mobileNumber)
- user.addProperty("lat", sharedPrefs?.userLat)
- user.addProperty("lng", sharedPrefs?.userLong)
- body.add("user", user)
+ body.addProperty("name", sharedPrefs?.name)
+ body.addProperty("mobile", sharedPrefs?.mobileNumber)
+ body.addProperty("lat", sharedPrefs?.userLat)
+ body.addProperty("lng", sharedPrefs?.userLong)
+ // body.add("user", user)
+
doApiUserUpdate(body)
+
} else {
user.addProperty("name", sharedPrefs?.name)
user.addProperty("country_code", sharedPrefs?.countryCode)
diff --git a/app/src/main/java/app/solocoin/solocoin/ui/auth/CreateProfileViewModel.kt b/app/src/main/java/app/solocoin/solocoin/ui/auth/CreateProfileViewModel.kt
index 5ae6169..e55a9c1 100644
--- a/app/src/main/java/app/solocoin/solocoin/ui/auth/CreateProfileViewModel.kt
+++ b/app/src/main/java/app/solocoin/solocoin/ui/auth/CreateProfileViewModel.kt
@@ -42,5 +42,14 @@ class CreateProfileViewModel(private val repository: SolocoinRepository): ViewMo
}
}
}
-
+ fun refer_and_earn(newusertoken:String,refercode:String): LiveData> = liveData(Dispatchers.IO) {
+ emit(Resource.loading(data = null))
+ try {
+ repository.refer_and_earn(newusertoken,refercode).apply {
+ emit(Resource.success(data = body(), code = code()))
+ }
+ } catch (exception: Exception) {
+ emit(Resource.error(data = null, exception = exception))
+ }
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/app/solocoin/solocoin/ui/auth/LoginSignupActivity.kt b/app/src/main/java/app/solocoin/solocoin/ui/auth/LoginSignupActivity.kt
index 3455c16..7e9d36b 100644
--- a/app/src/main/java/app/solocoin/solocoin/ui/auth/LoginSignupActivity.kt
+++ b/app/src/main/java/app/solocoin/solocoin/ui/auth/LoginSignupActivity.kt
@@ -140,10 +140,12 @@ class LoginSignupActivity : AppCompatActivity(), View.OnClickListener, EditCodeL
countryCode = countryCodePicker.selectedCountryCodeWithPlus
mobileNumber = etMobileNumber.text.toString()
- if (mobileNumber.length < 10) {
- etMobileNumber.error = getString(R.string.error_mobile_no)
- return
- }
+ // TODO: Make it universal using library or regular expressions
+ // Currently valid for Indian crowds
+// if (mobileNumber.length < 10) {
+// etMobileNumber.error = getString(R.string.error_mobile_no)
+// return
+// }
val confirmDialog = AppDialog.instance("Send OTP",
"Verify the mobile number ${countryCode+mobileNumber} and confirm",
@@ -216,7 +218,7 @@ class LoginSignupActivity : AppCompatActivity(), View.OnClickListener, EditCodeL
// Log.wtf(TAG, "user-id: $uid")
task.result?.user?.getIdToken(true)?.addOnCompleteListener { task1 ->
- Log.wtf(TAG + " Firebase Authentication", "$task1")
+// Log.wtf(TAG + " Firebase Authentication", "$task1")
sharedPrefs?.idToken = task1.result?.token
sharedPrefs?.countryCode = countryCode
sharedPrefs?.mobileNumber = mobileNumber
@@ -229,25 +231,25 @@ class LoginSignupActivity : AppCompatActivity(), View.OnClickListener, EditCodeL
body.add("user", user)
viewModel.mobileLogin(body).observe(this, Observer {
- Log.wtf(TAG + " Mobile Login", "$it")
+// Log.wtf(TAG + " Mobile Login", "$it")
it?.let { resource ->
when (resource.status) {
Status.SUCCESS -> {
loadingDialog.dismiss()
// Log.d(TAG, "mobilelogin-rc: ${resource.code}, ${resource}")
-
+ Log.d("resourcecode",""+resource.code)
if (resource.code == 200) {
- Log.wtf(TAG, "Existing user fetching Info")
+// Log.wtf(TAG, "Existing user fetching Info")
//existing-user
sharedPrefs?.authToken =
GlobalUtils.parseJsonNullFieldValue(
resource.data!!.get("auth_token")
)?.asString
- Log.wtf(TAG, sharedPrefs?.authToken)
+ Log.wtf(TAG, "karandeepsingh"+sharedPrefs?.authToken)
//get-user-data
viewModel.userData().observe(this, Observer { res ->
- Log.wtf(TAG + " User Info", "$res")
+// Log.wtf(TAG + " User Info", "$res")
res?.let { resource ->
when (resource.status) {
Status.SUCCESS -> {
@@ -264,19 +266,37 @@ class LoginSignupActivity : AppCompatActivity(), View.OnClickListener, EditCodeL
GlobalUtils.parseJsonNullFieldValue(
resource.data?.get("name")
)?.asString
- Log.wtf(
- TAG,
- sharedPrefs?.userLong + " " + sharedPrefs?.userLat + " " + sharedPrefs?.name
- )
+// Log.wtf(
+// TAG,
+// sharedPrefs?.userLong + " " + sharedPrefs?.userLat + " " + sharedPrefs?.name
+// )
// Log.d(TAG, "blah ok $resource")
- GlobalUtils.startActivityAsNewStack(Intent(this, SplashActivity::class.java), this)
+ GlobalUtils.startActivityAsNewStack(
+ Intent(
+ this,
+ SplashActivity::class.java
+ ),
+ this
+ )
finish()
} else {
+
+ if (mFirebaseAuth.currentUser != null) {
+ sharedPrefs?.clearSession()
+ mFirebaseAuth.signOut()
+ }
+
// Log.d(TAG, "blah not ok $resource")
Toast.makeText(this, getString(R.string.error_msg), Toast.LENGTH_SHORT).show()
}
}
Status.ERROR -> {
+
+ if (mFirebaseAuth.currentUser != null) {
+ sharedPrefs?.clearSession()
+ mFirebaseAuth.signOut()
+ }
+
if (resource.exception is NoConnectivityException) {
Toast.makeText(this, resource.exception.message, Toast.LENGTH_SHORT).show()
} else {
@@ -302,6 +322,11 @@ class LoginSignupActivity : AppCompatActivity(), View.OnClickListener, EditCodeL
Status.ERROR -> {
loadingDialog.dismiss()
+ if (mFirebaseAuth.currentUser != null) {
+ sharedPrefs?.clearSession()
+ mFirebaseAuth.signOut()
+ }
+
if (resource.exception is NoConnectivityException) {
Toast.makeText(this, resource.exception.message, Toast.LENGTH_SHORT).show()
} else {
diff --git a/app/src/main/java/app/solocoin/solocoin/ui/auth/MarkLocationActivity.kt b/app/src/main/java/app/solocoin/solocoin/ui/auth/MarkLocationActivity.kt
index 4c10ff7..5a9cfe7 100644
--- a/app/src/main/java/app/solocoin/solocoin/ui/auth/MarkLocationActivity.kt
+++ b/app/src/main/java/app/solocoin/solocoin/ui/auth/MarkLocationActivity.kt
@@ -41,6 +41,7 @@ import kotlinx.coroutines.InternalCoroutinesApi
import org.koin.android.viewmodel.ext.android.viewModel
import java.io.IOException
import java.util.*
+import kotlin.collections.ArrayList
/**
* on-continue click, check for username
@@ -141,15 +142,16 @@ class MarkLocationActivity : AppCompatActivity(), PermissionListener, View.OnCli
try {
addresses = gc.getFromLocation(mLocation.latitude, mLocation.longitude, 1)
- val city: String = if (addresses[0].locality == null) "" else addresses[0].locality
- val state: String = if (addresses[0].adminArea == null) "" else addresses[0].adminArea
- val country: String =
- if (addresses[0].countryName == null) "" else addresses[0].countryName
- if (city == "" && state == "" && country == "") {
- et_location.setText("Unable to fetch location.")
- } else {
- et_location.setText(getString(R.string.current_address, city, state, country))
+ val city: String? = addresses[0].locality
+ val state: String? = addresses[0].adminArea
+ val country: String? = addresses[0].countryName
+ val address = ArrayList().apply {
+ add(city)
+ add(state)
+ add(country)
}
+ et_location.setText(address.filterNotNull().joinToString(separator = ","))
+
} catch (e: IOException) {}
}
diff --git a/app/src/main/java/app/solocoin/solocoin/ui/home/AllScratchCardsActivity.kt b/app/src/main/java/app/solocoin/solocoin/ui/home/AllScratchCardsActivity.kt
new file mode 100644
index 0000000..e6ec22f
--- /dev/null
+++ b/app/src/main/java/app/solocoin/solocoin/ui/home/AllScratchCardsActivity.kt
@@ -0,0 +1,189 @@
+package app.solocoin.solocoin.ui.home
+
+import android.annotation.SuppressLint
+import androidx.appcompat.app.AppCompatActivity
+import android.os.Bundle
+import android.util.Log
+import android.view.View
+import androidx.lifecycle.Observer
+import androidx.recyclerview.widget.GridLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
+import app.solocoin.solocoin.R
+import app.solocoin.solocoin.app.SolocoinApp
+import app.solocoin.solocoin.model.Profile
+import app.solocoin.solocoin.model.RedeemedRewards
+import app.solocoin.solocoin.model.Reward
+import app.solocoin.solocoin.ui.adapter.AllRewardsAdapter
+import app.solocoin.solocoin.ui.adapter.RewardRedeemAdapter
+import app.solocoin.solocoin.ui.adapter.RewardsListAdapter
+import app.solocoin.solocoin.ui.adapter.ScratchCardAdapter
+import app.solocoin.solocoin.util.GlobalUtils
+import app.solocoin.solocoin.util.enums.Status
+import com.google.gson.JsonObject
+import kotlinx.android.synthetic.main.activity_all_scratch_cards.*
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.InternalCoroutinesApi
+import org.koin.android.viewmodel.ext.android.viewModel
+import java.util.*
+import kotlin.collections.ArrayList
+
+/**
+ * Created by Karandeep Singh on 15/07/2020
+ */
+@InternalCoroutinesApi
+@ExperimentalCoroutinesApi
+class AllScratchCardsActivity : AppCompatActivity() {
+ private lateinit var context: AllScratchCardsActivity
+ private lateinit var recyclerView: RecyclerView
+ private lateinit var unscratched_recyclerView: RecyclerView
+ private lateinit var mAdapter: AllRewardsAdapter
+ private lateinit var mScratchCardAdapter: ScratchCardAdapter
+ private lateinit var swipe_to_refresh: SwipeRefreshLayout
+ private var TAG:String ="AllScratchCardsActivity/"
+ private lateinit var profile :Profile
+ private lateinit var offers: ArrayList
+ private lateinit var offersfiltered:ArrayList
+ private var redeemedRewards:ArrayList = ArrayList()
+ private lateinit var redeemed_offers_id: ArrayList
+ private val viewModel: AllScratchCardsViewModel by viewModel()
+ private var onlyredeemedrewards:Boolean=false
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_all_scratch_cards)
+ overridePendingTransition(R.anim.fade_in,R.anim.fade_out);
+ context = this
+ recyclerView = findViewById(R.id.allrewards_recycler_view)
+ recyclerView.layoutManager = GridLayoutManager(context, 2)
+ unscratched_recyclerView = findViewById(R.id.unsratched_recycler_view)
+ unscratched_recyclerView.layoutManager = GridLayoutManager(context, 2)
+ swipe_to_refresh=findViewById(R.id.swipe_to_refresh)
+ swipe_to_refresh.setColorSchemeResources(R.color.colorAccent)
+ val toolbar = findViewById(R.id.allrewards_toolbar)
+ setSupportActionBar(toolbar)
+// supportActionBar?.setDisplayHomeAsUpEnabled(true)
+// supportActionBar?.setDisplayShowHomeEnabled(true)
+ supportActionBar?.title = "Redeemed Rewards"
+// fetchScratchcardOffers()
+ onlyredeemedrewards=intent.getBooleanExtra("onlyredeemedrewards",false)
+ if(onlyredeemedrewards){
+ unscratched_recyclerView.visibility=View.GONE
+ scratchcardtitle.visibility=View.GONE
+ redeemed_rewards_title.visibility=View.GONE
+ parentActivityIntent
+ }
+ back_arrow.setOnClickListener {
+ finish()
+ }
+ redeemed_offers_id= ArrayList()
+ redeemed_offers_id.clear()
+ offersfiltered= ArrayList()
+ offersfiltered.clear()
+ fetchredeemrewards()
+ swipe_to_refresh.setOnRefreshListener {
+// fetchScratchcardOffers()
+ redeemed_offers_id.clear()
+ offersfiltered.clear()
+ fetchredeemrewards()
+ }
+ }
+
+ @SuppressLint("DefaultLocale")
+ private fun fetchredeemrewards() {
+ viewModel.getProfile().observe(this, Observer { response ->
+
+ when (response.status) {
+ Status.SUCCESS -> {
+ profile=response.data!!
+ Log.d(TAG,"receivedresponsenow"+response.data)
+ if(profile.redeemed_rewards.isEmpty()){
+ norewards.visibility= View.VISIBLE
+ swipe_to_refresh.isRefreshing=false
+ if(!onlyredeemedrewards) fetchScratchcardOffers()
+ }
+ else {
+ norewards.visibility= View.GONE
+ var i=profile.redeemed_rewards.size-1
+ while(i >=0){
+ redeemed_offers_id.add(profile.redeemed_rewards[i].rewards_sponsor_id)
+ i--
+ }
+ redeemedRewards=profile.redeemed_rewards
+ redeemedRewards.reverse()
+ if(!onlyredeemedrewards) fetchScratchcardOffers()
+ mAdapter = AllRewardsAdapter(context, redeemedRewards)
+ recyclerView.adapter = mAdapter
+ swipe_to_refresh.isRefreshing=false
+ }
+ }
+ Status.ERROR -> {
+
+ }
+ Status.LOADING -> {}
+ }
+ })
+ }
+ private fun fetchScratchcardOffers() {
+ Log.i(TAG,"outsidescratchcardviewmodel")
+ viewModel.getScratchCardOffers().observe(this, Observer { response ->
+ //Log.d(TAG, "$response")
+ Log.i(TAG,"insidescratchcardviewmodel")
+ when (response.status) {
+ Status.SUCCESS -> {
+ if (response.data != null) {
+ offers=response.data
+ if (offers.size == 0) {
+ Log.i(TAG,"offerssizeiszero")
+ noscratchcards.visibility=View.VISIBLE
+ }
+ else {
+ var j = offers.size - 1
+// var found: Boolean
+ while (j >= 0) {
+// found = false
+// var size = redeemed_offers_id.size - 1
+// while (size >= 0) {
+// Log.i(TAG, "redeemed_offers_idinsidewhile" + redeemed_offers_id[size])
+// Log.i(TAG, "offersjrewardIdinsidewhile" + offers[j].rewardId)
+// if (redeemed_offers_id[size] == offers[j].rewardId) {
+// found = true
+// Log.i(TAG, "bothareequalandfound=" + found)
+// break
+// }
+// size--
+// }
+// if (!found) offersfiltered.add(offers[j])
+// if(!redeemed_offers_id.contains(offers[j].rewardId)){
+// offersfiltered.add(offers[j])
+// Log.i(TAG,"offersfiltered:"+j)
+// }
+ if(offers[j].rewardId !in redeemed_offers_id){
+
+ offersfiltered.add(offers[j])
+ Log.i(TAG,"offersfiltered:"+j)
+ }
+ j--
+ }
+ if (offersfiltered.size > 0) {
+ Log.i(TAG, "offersfiltered:" + offersfiltered)
+ mScratchCardAdapter = ScratchCardAdapter(context, offersfiltered)
+ unscratched_recyclerView.adapter = mScratchCardAdapter
+
+ // Update shared prefs
+ SolocoinApp.sharedPrefs?.offers = offers
+ }
+ else noscratchcards.visibility=View.VISIBLE
+ }
+ }
+// else {
+//// fetchOffersSharedPrefs()
+// }
+ }
+ Status.ERROR -> {}
+ Status.LOADING -> {
+ }
+ }
+ })
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/app/solocoin/solocoin/ui/home/AllScratchCardsViewModel.kt b/app/src/main/java/app/solocoin/solocoin/ui/home/AllScratchCardsViewModel.kt
new file mode 100644
index 0000000..e39cd61
--- /dev/null
+++ b/app/src/main/java/app/solocoin/solocoin/ui/home/AllScratchCardsViewModel.kt
@@ -0,0 +1,40 @@
+package app.solocoin.solocoin.ui.home
+
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.liveData
+import app.solocoin.solocoin.model.Profile
+import app.solocoin.solocoin.model.Reward
+import app.solocoin.solocoin.repo.SolocoinRepository
+import app.solocoin.solocoin.util.Resource
+import com.google.gson.JsonObject
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.InternalCoroutinesApi
+/**
+ * Created by Karandeep Singh on 15/07/2020
+ */
+@InternalCoroutinesApi
+@ExperimentalCoroutinesApi
+class AllScratchCardsViewModel(val repository: SolocoinRepository) : ViewModel() {
+ fun getProfile(): LiveData> = liveData(Dispatchers.IO) {
+ emit(Resource.loading(data = null))
+ try {
+ repository.getprofile().apply {
+ emit(Resource.success(data = body(), code = code()))
+ }
+ } catch (exception: Exception) {
+ emit(Resource.error(data = null, exception = exception))
+ }
+ }
+ fun getScratchCardOffers(): LiveData?>> = liveData(Dispatchers.IO) {
+ emit(Resource.loading(data = null))
+ try {
+ repository.getScratchCardOffers().apply {
+ emit(Resource.success(data = body(), code = code()))
+ }
+ } catch (exception: Exception) {
+ emit(Resource.error(data = null, exception = exception))
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/app/solocoin/solocoin/ui/home/AppGuideActivity.kt b/app/src/main/java/app/solocoin/solocoin/ui/home/AppGuideActivity.kt
new file mode 100644
index 0000000..9ddcb04
--- /dev/null
+++ b/app/src/main/java/app/solocoin/solocoin/ui/home/AppGuideActivity.kt
@@ -0,0 +1,45 @@
+package app.solocoin.solocoin.ui.home
+
+import android.content.Intent
+import android.net.Uri
+import android.os.Bundle
+import android.view.KeyEvent
+import android.webkit.WebView
+import android.webkit.WebViewClient
+import androidx.appcompat.app.AppCompatActivity
+import app.solocoin.solocoin.R
+import kotlinx.android.synthetic.main.activity_app_guide.*
+/**
+ * Created by Karandeep Singh on 10/07/2020
+ */
+class AppGuideActivity: AppCompatActivity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_app_guide)
+
+ val intent = getIntent()
+ val link = intent.getStringExtra("link")
+ val webSettings = webview.getSettings()
+ webSettings.javaScriptEnabled = true
+ val webViewClient = MyWebViewClient()
+ webview.setWebViewClient(webViewClient)
+ webview.loadUrl(link)
+ }
+ inner class MyWebViewClient : WebViewClient() {
+ override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
+ if (url.indexOf("solocoin.app") > -1) return false
+ val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
+ startActivity(intent)
+ return true
+ }
+ }
+
+ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
+ if (keyCode == KeyEvent.KEYCODE_BACK && webview!!.canGoBack()) {
+ webview!!.goBack()
+ return true
+ }
+ return super.onKeyDown(keyCode, event)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/app/solocoin/solocoin/ui/home/GetFreeCoinsActivity.kt b/app/src/main/java/app/solocoin/solocoin/ui/home/GetFreeCoinsActivity.kt
new file mode 100644
index 0000000..95a68b7
--- /dev/null
+++ b/app/src/main/java/app/solocoin/solocoin/ui/home/GetFreeCoinsActivity.kt
@@ -0,0 +1,96 @@
+package app.solocoin.solocoin.ui.home
+
+import android.app.Dialog
+import androidx.appcompat.app.AppCompatActivity
+import android.os.Bundle
+import android.util.Log
+import android.view.View
+import android.view.Window
+import androidx.lifecycle.Observer
+import android.widget.TextView
+import android.widget.Toast
+import app.solocoin.solocoin.R
+import app.solocoin.solocoin.app.SolocoinApp
+import app.solocoin.solocoin.repo.NoConnectivityException
+import app.solocoin.solocoin.util.AppDialog
+import app.solocoin.solocoin.util.enums.Status
+import kotlinx.android.synthetic.main.activity_get_free_coins.*
+import kotlinx.android.synthetic.main.fragment_quiz.*
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.InternalCoroutinesApi
+import org.koin.android.viewmodel.ext.android.viewModel
+import java.util.*
+
+@ExperimentalCoroutinesApi
+@InternalCoroutinesApi
+
+class GetFreeCoinsActivity : AppCompatActivity() {
+ private lateinit var context: GetFreeCoinsActivity
+ private val TAG ="GetFreeCoinsActivity"
+ private val viewModel: ProfileViewModel by viewModel()
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_get_free_coins)
+ context=this
+ apply.setOnClickListener {
+ viewModel.redeemcoupon(coupon.text.toString()).observe(this, Observer { response ->
+ Log.d(TAG,"promocodetest:"+response)
+ Log.d(TAG,"promocodetest:"+response.status)
+ when (response.status) {
+ Status.SUCCESS -> {
+ when (response.code) {
+ 200->{
+ showDialog()
+ }
+ 422->{
+ coupon.setError("Invalid Coupon Code!")
+ }
+ }
+ Log.d(TAG,"promocodetest:"+response)
+ }
+ Status.ERROR -> {
+ coupon.setError("Invalid Coupon Code!")
+ }
+ Status.LOADING -> {
+ }
+ }
+ })
+ }
+
+
+// if(valid(coupon.text.toString())) {
+// showDialog()
+//// Toast.makeText(context, "Coupon Code Applied Successfully!!" +
+//// "\nReward coins will be credited in your wallet shortly",
+//// Toast.LENGTH_LONG).show()
+// }
+// else {
+// // Toast.makeText(context, "Coupon Code is Invalid!!", Toast.LENGTH_LONG).show()
+// coupon.setError("Invalid Coupon Code!")
+// }
+
+
+ back_arrow.setOnClickListener {
+ finish()
+ }
+ }
+
+ private fun showDialog() {
+ val dialog = Dialog(context)
+ dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
+ dialog.setCancelable(false)
+ dialog.setContentView(R.layout.dialog_coupon)
+ val okbtn:TextView=dialog.findViewById(R.id.okbtn)
+ okbtn.setOnClickListener {
+ finish()
+ }
+ dialog.show()
+ }
+
+ private fun valid(text: String?): Boolean {
+ //Check if the coupon is valid from backend
+ if(text?.length==6) return true
+ else return false
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/app/solocoin/solocoin/ui/home/HomeActivity.kt b/app/src/main/java/app/solocoin/solocoin/ui/home/HomeActivity.kt
index 51f9fd6..774cdc0 100644
--- a/app/src/main/java/app/solocoin/solocoin/ui/home/HomeActivity.kt
+++ b/app/src/main/java/app/solocoin/solocoin/ui/home/HomeActivity.kt
@@ -3,11 +3,14 @@ package app.solocoin.solocoin.ui.home
import android.app.*
import android.content.Context
import android.content.Intent
+import android.content.IntentSender
import android.content.pm.PackageManager
import android.os.Build
import android.os.Bundle
import android.os.SystemClock
import android.util.Log
+import android.widget.Toast
+import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
@@ -19,11 +22,24 @@ import androidx.work.WorkManager
import app.solocoin.solocoin.NotificationAlarmReceiver
import app.solocoin.solocoin.R
import app.solocoin.solocoin.app.SolocoinApp.Companion.sharedPrefs
+import app.solocoin.solocoin.model.Badge
import app.solocoin.solocoin.services.FusedLocationService
import app.solocoin.solocoin.util.GlobalUtils
import app.solocoin.solocoin.worker.NotificationPingWorker
import app.solocoin.solocoin.worker.SessionPingWorker
+import com.google.android.gms.common.api.ApiException
+import com.google.android.gms.common.api.ResolvableApiException
+import com.google.android.gms.location.*
+import com.google.android.gms.tasks.Task
import com.google.android.material.bottomnavigation.BottomNavigationView
+import com.google.firebase.messaging.FirebaseMessaging
+import com.karumi.dexter.Dexter
+import com.karumi.dexter.DexterBuilder
+import com.karumi.dexter.PermissionToken
+import com.karumi.dexter.listener.PermissionDeniedResponse
+import com.karumi.dexter.listener.PermissionGrantedResponse
+import com.karumi.dexter.listener.PermissionRequest
+import com.karumi.dexter.listener.single.PermissionListener
import kotlinx.android.synthetic.main.activity_home.*
import kotlinx.coroutines.*
import java.util.*
@@ -33,34 +49,24 @@ import java.util.concurrent.TimeUnit
@ExperimentalCoroutinesApi
@InternalCoroutinesApi
-class HomeActivity : AppCompatActivity() {
-
+@RequiresApi(Build.VERSION_CODES.M)
+class HomeActivity : AppCompatActivity(), PermissionListener {
private var alarmManager: AlarmManager? = null
-
+ private lateinit var dexterInstance: DexterBuilder
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_home)
-
setSupportActionBar(toolbar)
bottom_nav_view.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)
bottom_nav_view.selectedItemId = R.id.nav_home
-
- try {
- val fromNotif = intent!!.getBooleanExtra("from_checkin", false)
- if (fromNotif) {
- sharedPrefs?.let {
- // TODO: Change 5 to 30
- it.periodValid =
- it.recentNotifTime + 5 * 60 * 1000 >= Calendar.getInstance().get(
- Calendar.MILLISECOND
- ).toLong()
- it.recentCheckTime = Calendar.getInstance().get(
- Calendar.MILLISECOND
- ).toLong()
- }
+ overridePendingTransition(R.anim.fade_in,R.anim.slide_in_top);
+ sharedPrefs?.let {
+ if (it.recentCheckTime < it.recentNotifTime) {
+ it.periodValid =
+ it.recentNotifTime + 30 * 60 * 1000 >= Calendar.getInstance().timeInMillis
+// Log.v(TAG, "Period valid: " + it.periodValid);
+ it.recentCheckTime = Calendar.getInstance().timeInMillis
}
- } catch (e: Exception) {
- Log.wtf(TAG, "No intent available")
}
// First adding notification channels to notification manager
@@ -69,6 +75,8 @@ class HomeActivity : AppCompatActivity() {
// Starting fused location service
// TODO : Setup permission request for Fused Location service properly
checkPermissionForLocation()
+ //setupPermissionEngine()
+ showLocationPrompt()
// Starting Session Ping API worker
startSessionPingManager()
@@ -78,6 +86,22 @@ class HomeActivity : AppCompatActivity() {
alarmManager = getSystemService(Context.ALARM_SERVICE) as? AlarmManager
// Manage notification checking
+ val nm = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
+ nm.createNotificationChannel(
+ NotificationChannel(
+ "first", "default",
+ NotificationManager.IMPORTANCE_DEFAULT
+ )
+ )
+ FirebaseMessaging.getInstance().subscribeToTopic("general")
+ .addOnCompleteListener { task ->
+ var msg = "Successful!"
+ if (!task.isSuccessful) {
+ msg = "Failed!"
+ }
+// Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
+ }
}
@@ -225,19 +249,20 @@ class HomeActivity : AppCompatActivity() {
grantResults[0] == PackageManager.PERMISSION_GRANTED -> startFusedLocationService()
else -> {
// Log.d(TAG, "Permissions Denied by User")
- TODO("Show message when user denies location permissions or user interaction is cancelled")
+ Toast.makeText(this, "Please provide location permission.", Toast.LENGTH_SHORT);
+// TODO("Show message when user denies location permissions or user interaction is cancelled")
+ }
}
}
}
- }
private fun startFusedLocationService() {
if (!GlobalUtils.isServiceRunning(applicationContext, FusedLocationService.javaClass)) {
// Log.wtf(TAG, "Starting the fused location service.")
val intent = Intent(applicationContext, FusedLocationService::class.java)
- applicationScope.launch {
+// applicationScope.launch {
startService(intent)
- }
+// }
} else {
// Log.wtf(TAG, "Fused location service already running")
}
@@ -333,6 +358,12 @@ class HomeActivity : AppCompatActivity() {
super.onBackPressed()
}
}
+ private fun setupPermissionEngine() {
+ dexterInstance = Dexter.withContext(this)
+ .withPermission(android.Manifest.permission.ACCESS_FINE_LOCATION)
+ .withListener(this)
+ .onSameThread()
+ }
companion object {
private val TAG = HomeActivity::class.java.simpleName
@@ -342,4 +373,69 @@ class HomeActivity : AppCompatActivity() {
private const val NOTIFICATION_PING_REQUEST = "app.solocoin.solocoin.api.notification"
private val applicationScope = CoroutineScope(Dispatchers.Default)
}
+
+ override fun onPermissionGranted(p0: PermissionGrantedResponse?) {
+ TODO("Not yet implemented")
+ }
+
+ override fun onPermissionRationaleShouldBeShown(p0: PermissionRequest?, p1: PermissionToken?) {
+ TODO("Not yet implemented")
+ }
+
+ override fun onPermissionDenied(p0: PermissionDeniedResponse?) {
+ TODO("Not yet implemented")
+ }
+ private fun showLocationPrompt() {
+ val locationRequest = LocationRequest.create()
+ locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
+ val builder = LocationSettingsRequest.Builder().addLocationRequest(locationRequest)
+
+ val result: Task = LocationServices.getSettingsClient(this).checkLocationSettings(builder.build())
+
+ result.addOnCompleteListener { task ->
+ try {
+ val response = task.getResult(ApiException::class.java)
+ // All location settings are satisfied. The client can initialize location
+ // requests here.
+ } catch (exception: ApiException) {
+ when (exception.statusCode) {
+ LocationSettingsStatusCodes.RESOLUTION_REQUIRED -> {
+ try {
+ // Cast to a resolvable exception.
+ val resolvable: ResolvableApiException = exception as ResolvableApiException
+ // Show the dialog by calling startResolutionForResult(),
+ // and check the result in onActivityResult().
+ resolvable.startResolutionForResult(
+ this, LocationRequest.PRIORITY_HIGH_ACCURACY
+ )
+ } catch (e: IntentSender.SendIntentException) {
+ // Ignore the error.
+ } catch (e: ClassCastException) {
+ // Ignore, should be an impossible error.
+ }
+ }
+ LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE -> {
+ // Location settings are not satisfied. But could be fixed by showing the
+ // user a dialog.
+
+ // Location settings are not satisfied. However, we have no way to fix the
+ // settings so we won't show the dialog.
+ }
+ }
+ }
+ }
+ }
+ override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
+ super.onActivityResult(requestCode, resultCode, data)
+ when (requestCode) {
+ LocationRequest.PRIORITY_HIGH_ACCURACY -> {
+ if (resultCode == Activity.RESULT_OK) {
+ Log.e("Status: ","On")
+ } else {
+ showLocationPrompt()
+ Log.e("Status: ","Off")
+ }
+ }
+ }
+ }
}
diff --git a/app/src/main/java/app/solocoin/solocoin/ui/home/HomeFragment.kt b/app/src/main/java/app/solocoin/solocoin/ui/home/HomeFragment.kt
index 52275a7..51f8984 100644
--- a/app/src/main/java/app/solocoin/solocoin/ui/home/HomeFragment.kt
+++ b/app/src/main/java/app/solocoin/solocoin/ui/home/HomeFragment.kt
@@ -1,61 +1,118 @@
package app.solocoin.solocoin.ui.home
+import android.app.Activity
+import android.app.Dialog
+import android.content.Intent
+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.Window
+import android.widget.ImageButton
+import android.widget.ImageView
import android.widget.TextView
+import android.widget.Toast
+import androidx.annotation.RequiresApi
+import androidx.cardview.widget.CardView
import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
+import androidx.recyclerview.widget.GridLayoutManager
+import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager2.adapter.FragmentStateAdapter
import app.solocoin.solocoin.R
+import app.solocoin.solocoin.app.SolocoinApp
import app.solocoin.solocoin.app.SolocoinApp.Companion.sharedPrefs
+import app.solocoin.solocoin.model.Profile
+import app.solocoin.solocoin.model.Reward
+import app.solocoin.solocoin.ui.adapter.AllRewardsAdapter
+import app.solocoin.solocoin.ui.adapter.ScratchCardAdapter
import app.solocoin.solocoin.util.AppDialog
import app.solocoin.solocoin.util.GlobalUtils
import app.solocoin.solocoin.util.enums.Status
+import com.anupkumarpanwar.scratchview.ScratchView
+import com.anupkumarpanwar.scratchview.ScratchView.IRevealListener
+import com.google.android.material.card.MaterialCardView
import com.google.android.material.tabs.TabLayoutMediator
+import com.google.gson.JsonObject
+import kotlinx.android.synthetic.main.activity_all_scratch_cards.*
import kotlinx.android.synthetic.main.fragment_home.*
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.InternalCoroutinesApi
import org.koin.android.viewmodel.ext.android.viewModel
+
@InternalCoroutinesApi
@ExperimentalCoroutinesApi
+@RequiresApi(Build.VERSION_CODES.M)
class HomeFragment : Fragment() {
private val TAG = HomeFragment::class.simpleName
private val viewModel: HomeFragmentViewModel by viewModel()
-
+ private lateinit var rewardsRecyclerView: RecyclerView
private var tvHomeDuration: TextView? = null
-
- override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
+ private lateinit var mScratchCardAdapter: ScratchCardAdapter
+ private lateinit var context: Activity
+ private lateinit var profile : Profile
+ private lateinit var redeemed_offers_id: ArrayList
+ private lateinit var offersfiltered:ArrayList
+ private lateinit var offers: ArrayList
+ private lateinit var noscratchcards:TextView
+// private lateinit var share_earn_cv:MaterialCardView
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ context = requireActivity()
return inflater.inflate(R.layout.fragment_home, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
tvHomeDuration = view.findViewById(R.id.time)
-// sharedPrefs?.let {
-// it.loggedIn = true
-// }
-
- sharedPrefs?.isNewUser?.let {
- if (it) {
+ rewardsRecyclerView = view.findViewById(R.id.scratch_rewards_recycler_view)
+ rewardsRecyclerView.layoutManager = GridLayoutManager(context, 2)
+ noscratchcards = view.findViewById(R.id.noscratchcardshome)
+ redeemed_offers_id= ArrayList()
+ redeemed_offers_id.clear()
+ offersfiltered= ArrayList()
+ offersfiltered.clear()
+ sharedPrefs?.visited?.let {
+ if (it[0]) {
+ sharedPrefs?.visited = arrayListOf(false, it[1], it[2])
val infoDialog = AppDialog.instance(
"",
getString(R.string.new_user_intro),
object : AppDialog.AppDialogListener {
- override fun onClickConfirm() {}
-
- override fun onClickCancel() {}
+ override fun onClickConfirm() {
+ showIntro()
+ }
+ override fun onClickCancel() {
+ showIntro()
+ }
})
- sharedPrefs?.isNewUser = false
infoDialog.show(requireFragmentManager(), infoDialog.tag)
}
}
+ allscratchcards.setOnClickListener {
+ val intent =Intent(context,AllScratchCardsActivity::class.java)
+ startActivity(intent)
+ }
+// share_earn_cv.setOnClickListener {
+// val shareIntent = Intent(Intent.ACTION_SEND)
+// shareIntent.type = "text/plain"
+// shareIntent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.invite_subject))
+// shareIntent.putExtra(
+// Intent.EXTRA_TEXT,
+// getString(R.string.invite_message) + getString(R.string.app_link)
+// )
+// startActivity(Intent.createChooser(shareIntent, getString(R.string.invite_title)))
+// }
updateTime()
+ fetchredeemrewards()
quiz_viewpager.adapter = QuizFragmentAdapter(this)
@@ -64,10 +121,59 @@ class HomeFragment : Fragment() {
}.attach()
}
+ fun showDialog(){
+ val dialog = Dialog(context)
+ dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
+ dialog.setCancelable(true)
+ dialog.setContentView(R.layout.scratch_card)
+ val scratchView: ScratchView = dialog.findViewById(R.id.scratch_view)
+
+ scratchView.setRevealListener(object :IRevealListener{
+ override fun onRevealed(scratchView: ScratchView?) {
+ Toast.makeText(context,"Congratulations!!",Toast.LENGTH_LONG).show()
+ scratchView?.visibility=View.GONE
+// scratch_card_image.visibility=View.GONE
+ }
+
+ override fun onRevealPercentChangedListener(scratchView: ScratchView?, percent: Float) {
+ if(percent>0.5){
+// Toast.makeText(context, "Revealed!$percent",Toast.LENGTH_LONG).show()
+ }
+ }
+ })
+ dialog.show()
+
+ }
+ private fun fetchredeemrewards() {
+ viewModel.getProfile().observe(viewLifecycleOwner, Observer { response ->
+
+ when (response.status) {
+ Status.SUCCESS -> {
+ profile=response.data!!
+ Log.d(TAG,"receivedresponsenow"+response.data)
+ if(profile.redeemed_rewards.isEmpty()){
+ fetchScratchcardOffers()
+ }
+ else {
+ var i=profile.redeemed_rewards.size-1
+ while(i >=0){
+ redeemed_offers_id.add(profile.redeemed_rewards[i].rewards_sponsor_id)
+ i--
+ }
+ fetchScratchcardOffers()
+ }
+ }
+ Status.ERROR -> {
+
+ }
+ Status.LOADING -> {}
+ }
+ })
+ }
private fun updateTime() {
viewModel.userData().observe(viewLifecycleOwner, Observer { response ->
- Log.d(TAG + "After Login/SignUp", "$response")
- when(response.status) {
+// Log.d(TAG + "After Login/SignUp", "$response")
+ when (response.status) {
Status.SUCCESS -> {
val duration =
GlobalUtils.parseJsonNullFieldValue(response.data?.get("home_duration_in_seconds"))?.asLong
@@ -75,6 +181,7 @@ class HomeFragment : Fragment() {
tvHomeDuration?.text = GlobalUtils.formattedHomeDuration(duration)
sharedPrefs?.homeDuration = duration
}
+// fetchScratchcardOffers()
}
Status.ERROR -> {
if (sharedPrefs?.homeDuration != 0L) {
@@ -86,6 +193,81 @@ class HomeFragment : Fragment() {
})
}
+ private fun fetchScratchcardOffers() {
+ viewModel.getScratchCardOffers().observe(viewLifecycleOwner, Observer { response ->
+ //Log.d(TAG, "$response")
+ when (response.status) {
+ Status.SUCCESS -> {
+ if (response.data != null) {
+// val offers: ArrayList = response.data
+ offers=response.data
+ Log.d(TAG,"receivedscratchcardoffers: "+offers)
+ if (offers.size == 0) {
+ noscratchcards.visibility=View.VISIBLE
+// updateNFetchOffersSharedPrefs()
+ Log.d(TAG,"inifffff")
+ } else {
+ Log.d(TAG,"inelssssseee")
+ // Check which offers are claimed already n create adapter
+// offers.sortBy { it.rewardId.toInt() }
+// userProfile?.getAsJsonArray("redeemed_rewards")?.forEach { itr ->
+// val index =
+// offers.binarySearchBy(itr.asJsonObject.get("rewards_sponsor_id").asInt) { it.rewardId.toInt() }
+// offers[index].isClaimed = true
+// }
+ var j = offers.size - 1
+ while (j >= 0) {
+ if(offers[j].rewardId !in redeemed_offers_id){
+
+ offersfiltered.add(offers[j])
+ if(offersfiltered.size==4) break
+ Log.i(TAG,"offersfiltered:"+j)
+ }
+ j--
+ }
+ Log.d(TAG,"calling setadapter")
+ if(offersfiltered.size>0)
+ setOffersAdapter(offersfiltered)
+ else noscratchcards.visibility=View.VISIBLE
+
+ // Update shared prefs
+ SolocoinApp.sharedPrefs?.offers = offers
+ }
+ }
+// else {
+// fetchOffersSharedPrefs()
+// }
+ }
+ Status.ERROR -> {}
+ Status.LOADING -> {
+ }
+ }
+ })
+
+ }
+
+ private fun setOffersAdapter(offers: ArrayList) {
+ Log.d(TAG,"inside setadapter"+offers)
+ mScratchCardAdapter = ScratchCardAdapter(context, offers)
+ rewardsRecyclerView.adapter = mScratchCardAdapter
+ }
+
+ private fun showIntro() {
+ with(requireActivity()) {
+ val intro = findViewById(R.id.intro).apply {
+ setImageResource(R.drawable.intro_home)
+ visibility = View.VISIBLE
+ }
+ findViewById(R.id.close_bt).apply {
+ visibility = View.VISIBLE
+ setOnClickListener {
+ intro.visibility = View.GONE
+ it.visibility = View.GONE
+ }
+ }
+ }
+ }
+
companion object {
fun instance() = HomeFragment().apply {}
private const val TAB_COUNT = 2
diff --git a/app/src/main/java/app/solocoin/solocoin/ui/home/HomeFragmentViewModel.kt b/app/src/main/java/app/solocoin/solocoin/ui/home/HomeFragmentViewModel.kt
index 479324b..8b75e8b 100644
--- a/app/src/main/java/app/solocoin/solocoin/ui/home/HomeFragmentViewModel.kt
+++ b/app/src/main/java/app/solocoin/solocoin/ui/home/HomeFragmentViewModel.kt
@@ -3,6 +3,8 @@ package app.solocoin.solocoin.ui.home
import androidx.lifecycle.LiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.liveData
+import app.solocoin.solocoin.model.Profile
+import app.solocoin.solocoin.model.Reward
import app.solocoin.solocoin.repo.SolocoinRepository
import app.solocoin.solocoin.util.Resource
import com.google.gson.JsonObject
@@ -26,4 +28,24 @@ class HomeFragmentViewModel(private val repository: SolocoinRepository): ViewMod
emit(Resource.error(data = null, exception = exception))
}
}
+ fun getScratchCardOffers(): LiveData?>> = liveData(Dispatchers.IO) {
+ emit(Resource.loading(data = null))
+ try {
+ repository.getScratchCardOffers().apply {
+ emit(Resource.success(data = body(), code = code()))
+ }
+ } catch (exception: Exception) {
+ emit(Resource.error(data = null, exception = exception))
+ }
+ }
+ fun getProfile(): LiveData> = liveData(Dispatchers.IO) {
+ emit(Resource.loading(data = null))
+ try {
+ repository.getprofile().apply {
+ emit(Resource.success(data = body(), code = code()))
+ }
+ } catch (exception: Exception) {
+ emit(Resource.error(data = null, exception = exception))
+ }
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/app/solocoin/solocoin/ui/home/MilestonesFragment.kt b/app/src/main/java/app/solocoin/solocoin/ui/home/MilestonesFragment.kt
index 741ea61..2435999 100644
--- a/app/src/main/java/app/solocoin/solocoin/ui/home/MilestonesFragment.kt
+++ b/app/src/main/java/app/solocoin/solocoin/ui/home/MilestonesFragment.kt
@@ -2,9 +2,13 @@ package app.solocoin.solocoin.ui.home
import android.app.Activity
import android.os.Bundle
+import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
+import android.widget.ImageButton
+import android.widget.ImageView
+import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.LinearLayoutManager
@@ -13,7 +17,10 @@ import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import app.solocoin.solocoin.R
import app.solocoin.solocoin.app.SolocoinApp
import app.solocoin.solocoin.model.Badge
+import app.solocoin.solocoin.model.LeaderBoard
import app.solocoin.solocoin.model.Milestones
+import app.solocoin.solocoin.model.User
+import app.solocoin.solocoin.ui.adapter.LeaderBoardAdapter
import app.solocoin.solocoin.ui.adapter.MilestonesAdapter
import app.solocoin.solocoin.util.enums.Status
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -23,6 +30,7 @@ import org.koin.android.viewmodel.ext.android.viewModel
/**
* Created by Saurav Gupta on 22/05/2020
*/
+
@InternalCoroutinesApi
@ExperimentalCoroutinesApi
class MilestonesFragment : Fragment() {
@@ -31,6 +39,7 @@ class MilestonesFragment : Fragment() {
private lateinit var recyclerView: RecyclerView
private lateinit var swipeRefreshLayout: SwipeRefreshLayout
private lateinit var context: Activity
+ private var topuserlist:ArrayList = ArrayList() //arraylist for getting top users on leaderboard
private val viewModel: MilestonesFragmentViewModel by viewModel()
@@ -46,15 +55,21 @@ class MilestonesFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
recyclerView = view.findViewById(R.id.milestones_recycler_view)
swipeRefreshLayout = view.findViewById(R.id.milestones_sl)
-
recyclerView.layoutManager = LinearLayoutManager(context)
swipeRefreshLayout.setColorSchemeResources(R.color.colorAccent)
swipeRefreshLayout.setOnRefreshListener {
updateMilestones()
swipeRefreshLayout.isRefreshing = false
}
+ updateLeaderBoard()
+
- initializeMilestones()
+ SolocoinApp.sharedPrefs?.visited?.let {
+ if (it[2]) {
+ SolocoinApp.sharedPrefs?.visited = arrayListOf(it[0], it[1], false)
+ showIntro()
+ }
+ }
}
// initialize basic milestone section to avoid waiting for response
@@ -88,17 +103,20 @@ class MilestonesFragment : Fragment() {
)
)
})
- mAdapter = MilestonesAdapter(context, ArrayList().apply { add(milestones) })
+ mAdapter = MilestonesAdapter(context, ArrayList().apply { add(milestones) },topuserlist)
recyclerView.adapter = mAdapter
- // updating milestone through api or shared prefs
updateMilestones()
+
+ if (SolocoinApp.sharedPrefs?.visited?.get(2) != true) {
+ // updating milestone through api or shared prefs
+ }
}
private fun fetchMilestonesSharedPrefs() {
SolocoinApp.sharedPrefs?.milestones?.let {
if (it.badgeLevel.size > 3 && it.earnedPoints.toDouble() >= 0.0) {
- mAdapter = MilestonesAdapter(context, ArrayList().apply { add(it) })
+ mAdapter = MilestonesAdapter(context, ArrayList().apply { add(it) },topuserlist)
recyclerView.adapter = mAdapter
}
}
@@ -107,28 +125,66 @@ class MilestonesFragment : Fragment() {
private fun updateMilestones() {
viewModel.getBadgesLevels().observe(viewLifecycleOwner, Observer { response ->
//Log.d(TAG, "$response")
- when (response.status) {
- Status.SUCCESS -> {
- val milestones = response.data
- if ((milestones?.badgeLevel != null) && (milestones.badgeLevel.size > 3 && milestones.earnedPoints.toDouble() >= 0.0)) {
- mAdapter = MilestonesAdapter(context, ArrayList().apply {
- milestones.badgeLevel.sortBy { x -> x.level.toInt() }
- add(milestones)
- })
- recyclerView.adapter = mAdapter
- SolocoinApp.sharedPrefs?.milestones = milestones
- } else {
- fetchMilestonesSharedPrefs()
- }
- }
- Status.ERROR -> {
+ when (response.status) {
+ Status.SUCCESS -> {
+ val milestones = response.data
+ if ((milestones?.badgeLevel != null) && (milestones.badgeLevel.size > 3 && milestones.earnedPoints.toDouble() >= 0.0)) {
+ mAdapter = MilestonesAdapter(context, ArrayList().apply {
+ milestones.badgeLevel.sortBy { x -> x.level.toInt() }
+ add(milestones)
+ },topuserlist)
+ recyclerView.adapter = mAdapter
+ SolocoinApp.sharedPrefs?.milestones = milestones
+ } else {
fetchMilestonesSharedPrefs()
}
- Status.LOADING -> {
- }
}
+ Status.ERROR -> {
+ fetchMilestonesSharedPrefs()
+ }
+ Status.LOADING -> {
+ }
+ }
})
}
+private fun updateLeaderBoard(){
+ viewModel.getleaderboard().observe(viewLifecycleOwner, Observer { response->
+ when(response.status){
+ Status.SUCCESS->{
+ val leaderboard =response.data
+ Log.i(TAG,"receivedapidata"+leaderboard)
+ topuserlist.add(leaderboard?.topUsers!!.get(0))
+ topuserlist.add(leaderboard.topUsers.get(1))
+ topuserlist.add(leaderboard.topUsers.get(2))
+ topuserlist.add(leaderboard.user)
+ initializeMilestones()
+// lAdapter = LeaderBoardAdapter(context, topuserlist)
+// recyclerViewleader.adapter = lAdapter
+ }
+ Status.ERROR -> {
+ Toast.makeText(getContext(),"An Error Occured!",Toast.LENGTH_LONG).show()
+ }
+ Status.LOADING -> {
+ }
+ }
+ }
+ )
+}
+ private fun showIntro() {
+ with(requireActivity()) {
+ val intro = findViewById(R.id.intro).apply {
+ setImageResource(R.drawable.intro_milestone)
+ visibility = View.VISIBLE
+ }
+ findViewById(R.id.close_bt).apply {
+ visibility = View.VISIBLE
+ setOnClickListener {
+ intro.visibility = View.GONE
+ it.visibility = View.GONE
+ }
+ }
+ }
+ }
companion object {
fun instance() = MilestonesFragment().apply {}
diff --git a/app/src/main/java/app/solocoin/solocoin/ui/home/MilestonesFragmentViewModel.kt b/app/src/main/java/app/solocoin/solocoin/ui/home/MilestonesFragmentViewModel.kt
index f4fb72c..e58c1d0 100644
--- a/app/src/main/java/app/solocoin/solocoin/ui/home/MilestonesFragmentViewModel.kt
+++ b/app/src/main/java/app/solocoin/solocoin/ui/home/MilestonesFragmentViewModel.kt
@@ -3,6 +3,7 @@ package app.solocoin.solocoin.ui.home
import androidx.lifecycle.LiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.liveData
+import app.solocoin.solocoin.model.LeaderBoard
import app.solocoin.solocoin.model.Milestones
import app.solocoin.solocoin.repo.SolocoinRepository
import app.solocoin.solocoin.util.Resource
@@ -26,4 +27,14 @@ class MilestonesFragmentViewModel(private val repository: SolocoinRepository) :
emit(Resource.error(data = null, exception = exception))
}
}
+ fun getleaderboard(): LiveData> = liveData(Dispatchers.IO){
+ emit(Resource.loading(data = null))
+ try{
+ repository.getleaderboard().apply {
+ emit(Resource.success(data = body(), code = code()))
+ }
+ }catch (exception: Exception) {
+ emit(Resource.error(data = null, exception = exception))
+ }
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/app/solocoin/solocoin/ui/home/MyMessagingService.kt b/app/src/main/java/app/solocoin/solocoin/ui/home/MyMessagingService.kt
new file mode 100644
index 0000000..fe531e6
--- /dev/null
+++ b/app/src/main/java/app/solocoin/solocoin/ui/home/MyMessagingService.kt
@@ -0,0 +1,45 @@
+package app.solocoin.solocoin.ui.home
+
+import android.app.PendingIntent
+import android.content.Intent
+import androidx.cardview.widget.CardView
+import androidx.core.app.NotificationCompat
+import androidx.core.app.NotificationManagerCompat
+import app.solocoin.solocoin.R
+import com.google.firebase.messaging.FirebaseMessagingService
+import com.google.firebase.messaging.RemoteMessage
+import kotlinx.coroutines.InternalCoroutinesApi
+
+/**
+ * Created by Karandeep Singh on 08/07/2020
+ */
+
+class MyMessagingService : FirebaseMessagingService() {
+// val nm = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
+
+ @InternalCoroutinesApi
+ override fun onMessageReceived(remotemessage: RemoteMessage) {
+ super.onMessageReceived(remotemessage)
+ shownotification(remotemessage?.notification?.title.toString(),
+ remotemessage?.notification?.body.toString()
+ )
+ }
+
+ @InternalCoroutinesApi
+ fun shownotification(title:String, message:String) {
+
+ val i = Intent(this, HomeActivity::class.java)
+ val pi = PendingIntent.getActivity(this, 1, i, PendingIntent.FLAG_UPDATE_CURRENT)
+ val simplenotification = NotificationCompat.Builder(this, "first")
+ .setContentTitle(title)
+ .setContentText(message)
+ .setSmallIcon(R.drawable.app_icon)
+ .setPriority(NotificationCompat.PRIORITY_DEFAULT)
+ .setContentIntent(pi)
+ .setAutoCancel(true)
+ .build()
+ val manager = NotificationManagerCompat.from(this)
+ manager.notify(System.currentTimeMillis().toInt(), simplenotification)
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/app/solocoin/solocoin/ui/home/MyProfileActivity.kt b/app/src/main/java/app/solocoin/solocoin/ui/home/MyProfileActivity.kt
new file mode 100644
index 0000000..513344b
--- /dev/null
+++ b/app/src/main/java/app/solocoin/solocoin/ui/home/MyProfileActivity.kt
@@ -0,0 +1,133 @@
+package app.solocoin.solocoin.ui.home
+
+import android.annotation.SuppressLint
+import android.app.Dialog
+import android.content.Context
+import android.content.SharedPreferences
+import android.os.Bundle
+import android.view.Window
+import android.widget.ImageView
+import androidx.appcompat.app.AppCompatActivity
+import androidx.lifecycle.Observer
+import app.solocoin.solocoin.R
+import app.solocoin.solocoin.app.SolocoinApp.Companion.sharedPrefs
+import app.solocoin.solocoin.util.GlobalUtils
+import app.solocoin.solocoin.util.enums.Status
+import kotlinx.android.synthetic.main.activity_my_profile.*
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.InternalCoroutinesApi
+import org.koin.android.viewmodel.ext.android.viewModel
+
+@ExperimentalCoroutinesApi
+@InternalCoroutinesApi
+class MyProfileActivity : AppCompatActivity() {
+ private val viewModel: HomeFragmentViewModel by viewModel()
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_my_profile)
+
+ val my_avatar = sharedPrefs?.avatar
+ when(my_avatar){
+ "bluedude" ->{
+ avatar.setImageDrawable(getDrawable(R.drawable.bluedude))
+ }
+ "bluelady" ->{
+ avatar.setImageDrawable(getDrawable(R.drawable.bluelady))
+ }
+ "greendude" ->{
+ avatar.setImageDrawable(getDrawable(R.drawable.greendude))
+ }
+ "jacketdude" ->{
+ avatar.setImageDrawable(getDrawable(R.drawable.jacketdude))
+ }
+ "orangedude" ->{
+ avatar.setImageDrawable(getDrawable(R.drawable.orangedude))
+ }
+ "orangelady" ->{
+ avatar.setImageDrawable(getDrawable(R.drawable.orangelady))
+ }
+ "striped" ->{
+ avatar.setImageDrawable(getDrawable(R.drawable.striped))
+ }
+ "yellowlady" ->{
+ avatar.setImageDrawable(getDrawable(R.drawable.yellowlady))
+ }
+ }
+ viewModel.getProfile().observe(this, Observer { response ->
+ when (response.status) {
+ Status.SUCCESS -> {
+ name.text=response.data?.name
+ mobile.text=response.data?.mobile
+ coins.text=response.data?.wallet_balance
+ home_time.text= GlobalUtils.formattedHomeDuration(response.data?.home_duration_in_seconds?.toLong())
+ offers_redeemed.text=response.data?.redeemed_rewards?.size.toString()
+ refercode.text=response.data?.referral?.refercode
+ }
+ Status.ERROR -> {}
+ Status.LOADING -> {}
+ }
+ })
+ avatar.setOnClickListener {
+ showDialog()
+ }
+ back_arrow.setOnClickListener {
+ finish()
+ }
+ }
+ fun showDialog() {
+ val dialog = Dialog(this)
+ dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
+ dialog.setCancelable(true)
+ dialog.setContentView(R.layout.avatar_dialog)
+ val bluedude:ImageView=dialog.findViewById(R.id.bluedude)
+ val bluelady:ImageView=dialog.findViewById(R.id.bluelady)
+ val greendude:ImageView=dialog.findViewById(R.id.greendude)
+ val jacketdude:ImageView=dialog.findViewById(R.id.jacketdude)
+ val orangedude:ImageView=dialog.findViewById(R.id.orangedude)
+ val orangelady:ImageView=dialog.findViewById(R.id.orangelady)
+ val striped:ImageView=dialog.findViewById(R.id.striped)
+ val yellowlady:ImageView=dialog.findViewById(R.id.yellowlady)
+
+ bluedude.setOnClickListener {
+ sharedPrefs?.avatar = "bluedude"
+ avatar.setImageDrawable(getDrawable(R.drawable.bluedude))
+ dialog.dismiss()
+ }
+ bluelady.setOnClickListener {
+ sharedPrefs?.avatar = "bluelady"
+ avatar.setImageDrawable(getDrawable(R.drawable.bluelady))
+ dialog.dismiss()
+ }
+ greendude.setOnClickListener {
+ sharedPrefs?.avatar = "greendude"
+ avatar.setImageDrawable(getDrawable(R.drawable.greendude))
+ dialog.dismiss()
+ }
+ jacketdude.setOnClickListener {
+ sharedPrefs?.avatar = "jacketdude"
+ avatar.setImageDrawable(getDrawable(R.drawable.jacketdude))
+ dialog.dismiss()
+ }
+ orangedude.setOnClickListener {
+ sharedPrefs?.avatar = "orangedude"
+ avatar.setImageDrawable(getDrawable(R.drawable.orangedude))
+ dialog.dismiss()
+ }
+ orangelady.setOnClickListener {
+ sharedPrefs?.avatar = "orangelady"
+ avatar.setImageDrawable(getDrawable(R.drawable.orangelady))
+ dialog.dismiss()
+ }
+ striped.setOnClickListener {
+ sharedPrefs?.avatar = "striped"
+ avatar.setImageDrawable(getDrawable(R.drawable.striped))
+ dialog.dismiss()
+ }
+ yellowlady.setOnClickListener {
+ sharedPrefs?.avatar = "yellowlady"
+ avatar.setImageDrawable(getDrawable(R.drawable.yellowlady))
+ dialog.dismiss()
+ }
+ dialog.show()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/app/solocoin/solocoin/ui/home/ProfileFragment.kt b/app/src/main/java/app/solocoin/solocoin/ui/home/ProfileFragment.kt
index 00b1618..a710990 100644
--- a/app/src/main/java/app/solocoin/solocoin/ui/home/ProfileFragment.kt
+++ b/app/src/main/java/app/solocoin/solocoin/ui/home/ProfileFragment.kt
@@ -1,18 +1,29 @@
package app.solocoin.solocoin.ui.home
+import android.content.ContentValues.TAG
import android.content.Intent
import android.net.Uri
import android.os.Bundle
+import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.fragment.app.Fragment
+import androidx.lifecycle.Observer
import app.solocoin.solocoin.R
+import app.solocoin.solocoin.app.SolocoinApp
+import app.solocoin.solocoin.app.SolocoinApp.Companion.sharedPrefs
+import app.solocoin.solocoin.model.Profile
import app.solocoin.solocoin.repo.SolocoinRepository
+import app.solocoin.solocoin.util.AppDialog
+import app.solocoin.solocoin.util.GlobalUtils
+import app.solocoin.solocoin.util.enums.Status
+import com.google.firebase.dynamiclinks.DynamicLink
+import com.google.firebase.dynamiclinks.FirebaseDynamicLinks
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.InternalCoroutinesApi
-import org.koin.android.BuildConfig
+import org.koin.android.viewmodel.ext.android.viewModel
import org.koin.core.KoinComponent
import org.koin.core.inject
@@ -21,92 +32,168 @@ import org.koin.core.inject
class ProfileFragment : Fragment(), KoinComponent {
private val repository: SolocoinRepository by inject()
-
- override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
+ private val viewModel: AllScratchCardsViewModel by viewModel()
+ private val TAG="ProfileFragment"
+ private lateinit var profile : Profile
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
return inflater.inflate(R.layout.fragment_profile, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
-
+ view.findViewById(R.id.my_profile).setOnClickListener {
+ val intent=Intent(context,MyProfileActivity::class.java)
+ startActivity(intent)
+ }
//invite-btn
view.findViewById(R.id.tv_invite).setOnClickListener {
- val shareIntent = Intent(Intent.ACTION_SEND)
- shareIntent.type = "text/plain"
- shareIntent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.invite_subject))
- shareIntent.putExtra(Intent.EXTRA_TEXT, getString(R.string.invite_message, BuildConfig.APPLICATION_ID))
- startActivity(Intent.createChooser(shareIntent, getString(R.string.invite_title)))
+ //the below method will be used for invite & earn functionality
+// createlink()
+ var rewardline="fh"
+ viewModel.getProfile().observe(viewLifecycleOwner, Observer { response ->
+ //Log.d(TAG, "$response")
+ Log.d(TAG,"userprofile:"+response.data)
+ when (response.status) {
+ Status.SUCCESS -> {
+
+ profile=response.data!!
+ rewardline="\nEnter Promocode "+profile.referral.refercode+" to earn "+
+ profile.referral.amount +" Solocoins as Referral bonus!!"
+ val shareIntent = Intent(Intent.ACTION_SEND)
+ shareIntent.type = "text/plain"
+ shareIntent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.invite_subject))
+ shareIntent.putExtra(
+ Intent.EXTRA_TEXT,
+ getString(R.string.invite_message) + getString(R.string.app_link)+rewardline
+ )
+ startActivity(Intent.createChooser(shareIntent, getString(R.string.invite_title)))
+ }
+ Status.ERROR -> {
+ }
+ Status.LOADING -> {
+ }
+ }
+ })
+
}
//invite-btn
+ //Redeemed Rewards btn
+ view.findViewById(R.id.redeemed_rewards).setOnClickListener {
+ val intent=Intent(context,AllScratchCardsActivity::class.java)
+ intent.putExtra("onlyredeemedrewards",true)
+ startActivity(intent)
+ }
+ //end Redeemed Rewards btn
+ // get free coins
+ view.findViewById(R.id.free_coins).setOnClickListener {
+ val intent =Intent(context,GetFreeCoinsActivity::class.java)
+ startActivity(intent)
+ }
+
+
+ // end get free coins
+
//privacy-policy-btn
view.findViewById(R.id.tv_pp).setOnClickListener {
- startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.url_pp))))
+ val intent = Intent(context, AppGuideActivity::class.java)
+ intent.putExtra("link",getString(R.string.url_pp))
+ startActivity(intent)
+// startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.url_pp))))
}
//privacy-policy-btn
//terms-condition-btn
view.findViewById(R.id.tv_tnc).setOnClickListener {
- startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.url_tnc))))
+ val intent = Intent(context, AppGuideActivity::class.java)
+ intent.putExtra("link",getString(R.string.url_tnc))
+ startActivity(intent)
+// startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.url_tnc))))
+ }
+
+ view.findViewById(R.id.tv_guide).setOnClickListener {
+
+ val intent = Intent(context, AppGuideActivity::class.java)
+ intent.putExtra("link",getString(R.string.url_guide))
+ startActivity(intent)
+// startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.url_guide))))
}
//terms-condition-btn
//logout-btn
-// view.findViewById(R.id.tv_logout).setOnClickListener {
-// val logoutDialog = AppDialog.instance(
-// getString(R.string.confirm),
-// getString(R.string.tag_logout),
-// object : AppDialog.AppDialogListener {
-// override fun onClickConfirm() {
-// if (GlobalUtils.isNetworkAvailable(requireActivity())) {
-// // updating backend for user logout
-// val body: JsonObject =
-// JsonParser().parse(SessionPingRequest("away").toString()).asJsonObject
-// val call: Call = repository.pingSession(body)
-// call.enqueue(object : Callback {
-// override fun onResponse(
-// call: Call,
-// response: Response
-// ) {
-// Log.d("Logout", "Successful")
-// }
-//
-// override fun onFailure(call: Call, t: Throwable) {
-// Log.d("Logout", "Failure updating backend")
-// }
-//
-// })
-// GlobalUtils.logout(context!!, activity!!)
-//// SolocoinApp.sharedPrefs?.let{
-//// it.loggedIn = false
-//// }
-// activity?.finish()
-// } else {
-// val infoDialog = AppDialog.instance(
-// "Sorry",
-// getString(R.string.logout_issue), object: AppDialog.AppDialogListener{
-// override fun onClickConfirm() {
-// }
-//
-// override fun onClickCancel() {
-// }
-//
-// },getString(R.string.okay), getString(R.string.cancel))
-// onClickCancel()
-// infoDialog.show(requireFragmentManager(), infoDialog.tag)
-// }
-// }
-//
-// override fun onClickCancel() {}
-// },
-// getString(R.string.logout),
-// getString(R.string.cancel)
-// )
-// logoutDialog.show(childFragmentManager, logoutDialog.tag)
-// }
+ view.findViewById(R.id.tv_logout).setOnClickListener {
+ val logoutDialog = AppDialog.instance(
+ getString(R.string.confirm),
+ getString(R.string.tag_logout),
+ object : AppDialog.AppDialogListener {
+ override fun onClickConfirm() {
+ GlobalUtils.logout(context!!, activity!!)
+ activity?.finish()
+ }
+
+ override fun onClickCancel() {}
+ },
+ getString(R.string.logout),
+ getString(R.string.cancel)
+ )
+ logoutDialog.show(childFragmentManager, logoutDialog.tag)
+ }
//logout-btn
}
+ private fun createlink() {
+
+ val dynamicLink = FirebaseDynamicLinks.getInstance().createDynamicLink()
+ .setLink(Uri.parse(getString(R.string.app_link)+sharedPrefs?.mobileNumber))
+ .setDomainUriPrefix("https://solocoin.page.link") // Open links with this app on Android
+ .setAndroidParameters(DynamicLink.AndroidParameters.Builder().build()) // Open links with com.example.ios on iOS
+// .setIosParameters(IosParameters.Builder("com.example.ios").build())
+ .buildDynamicLink()
+ val dynamicLinkUri = dynamicLink.uri
+ Log.i("Tagkarandeep", "link:$dynamicLinkUri")
+ val intent = Intent()
+ intent.action = Intent.ACTION_SEND
+ intent.putExtra(Intent.EXTRA_TEXT, dynamicLinkUri.toString())
+ intent.type = "text/plain"
+ startActivity(intent)
+ //manual
+// val sharelinktext = "https://karandeep.page.link/?" +
+// "link=" + "https://www.solocoin.app/karadeepid=27" +
+// "&apn=" + getPackageName() +
+// "&st=" + "My refer link" +
+// "&sd=" + "Reward Coins 20" +
+// "&si=" + "https://www.solocoin.app/wp-content/uploads/2020/04/horizontal-logo1.png"
+
+
+// https://karandeep.page.link?apn=com.karandeep.referandearn&ibi=com.example.ios&link=https%3A%2F%2Fwww.solocoin.app%2F
+ //shorten the link
+
+// val shortLinkTask = FirebaseDynamicLinks.getInstance().createDynamicLink() // .setLongLink(dynamicLinkUri)
+// .setLongLink(Uri.parse(sharelinktext)) //manual
+// .buildShortDynamicLink()
+// .addOnCompleteListener(this, OnCompleteListener { task ->
+// if (task.isSuccessful) {
+// // Short link created
+// val shortLink = task.result!!.shortLink
+// val flowchartLink = task.result!!.previewLink
+// Log.i("Tagkarandeep2", "link: $shortLink")
+// val intent = Intent()
+// intent.action = Intent.ACTION_SEND
+// intent.putExtra(Intent.EXTRA_TEXT, shortLink.toString())
+// intent.type = "text/plain"
+// startActivity(intent)
+// } else {
+// // Error
+// // ...
+// Log.i("error", "error")
+// }
+// })
+ }
+
companion object {
fun instance() = ProfileFragment()
}
diff --git a/app/src/main/java/app/solocoin/solocoin/ui/home/ProfileViewModel.kt b/app/src/main/java/app/solocoin/solocoin/ui/home/ProfileViewModel.kt
new file mode 100644
index 0000000..199c761
--- /dev/null
+++ b/app/src/main/java/app/solocoin/solocoin/ui/home/ProfileViewModel.kt
@@ -0,0 +1,29 @@
+package app.solocoin.solocoin.ui.home
+
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.liveData
+import app.solocoin.solocoin.repo.SolocoinRepository
+import app.solocoin.solocoin.util.Resource
+import com.google.gson.JsonObject
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.InternalCoroutinesApi
+/**
+ * Created by Karandeep Singh on 23/08/2020
+ */
+@ExperimentalCoroutinesApi
+@InternalCoroutinesApi
+class ProfileViewModel( val repository: SolocoinRepository) : ViewModel() {
+ fun redeemcoupon(promocode:String): LiveData> = liveData(Dispatchers.IO) {
+ emit(Resource.loading(data = null))
+ try {
+ repository.redeemcoupon(promocode).apply {
+ emit(Resource.success(data = body(), code = code()))
+ }
+ } catch (exception: Exception) {
+ emit(Resource.error(data = null, exception = exception))
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/app/solocoin/solocoin/ui/home/QuizFragment.kt b/app/src/main/java/app/solocoin/solocoin/ui/home/QuizFragment.kt
index d28759e..94be076 100644
--- a/app/src/main/java/app/solocoin/solocoin/ui/home/QuizFragment.kt
+++ b/app/src/main/java/app/solocoin/solocoin/ui/home/QuizFragment.kt
@@ -1,6 +1,7 @@
package app.solocoin.solocoin.ui.home
import android.os.Bundle
+import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
@@ -10,6 +11,7 @@ import androidx.lifecycle.Observer
import app.solocoin.solocoin.R
import app.solocoin.solocoin.app.SolocoinApp.Companion.sharedPrefs
import app.solocoin.solocoin.repo.NoConnectivityException
+import app.solocoin.solocoin.util.AppDialog
import app.solocoin.solocoin.util.GlobalUtils
import app.solocoin.solocoin.util.enums.Status
import com.google.android.material.card.MaterialCardView
@@ -86,6 +88,8 @@ class QuizFragment(position: Int) : Fragment(), View.OnClickListener {
}
private fun verifyAnswer(optionCard: MaterialCardView, optionNumber: Int) {
+// optionCard.setBackgroundColor(resources.getColor(R.color.green_stroke_color));
+
optionCard.strokeColor =
ResourcesCompat.getColor(resources, R.color.green_stroke_color, null)
@@ -164,12 +168,17 @@ class QuizFragment(position: Int) : Fragment(), View.OnClickListener {
answers = resource.data!!.getAsJsonArray("answers")
question_id = resource.data.get("id").asInt
- question_textview.text = resource.data.get("name").toString()
-
- option1_textview.text = answers[0].asJsonObject.get("name").toString()
- option2_textview.text = answers[1].asJsonObject.get("name").toString()
- option3_textview.text = answers[2].asJsonObject.get("name").toString()
- option4_textview.text = answers[3].asJsonObject.get("name").toString()
+ val question=resource.data.get("name").toString().substring(1)
+ question_textview.text = question.substring(0,question.length-1)
+ val option1 ="A) "+answers[0].asJsonObject.get("name").toString().substring(1)
+ val option2 ="B) "+answers[1].asJsonObject.get("name").toString().substring(1)
+ val option3 ="C) "+answers[2].asJsonObject.get("name").toString().substring(1)
+ val option4 ="D) "+answers[3].asJsonObject.get("name").toString().substring(1)
+
+ option1_textview.text = option1.substring(0,option1.length-1)
+ option2_textview.text = option2.substring(0,option2.length-1)
+ option3_textview.text = option3.substring(0,option3.length-1)
+ option4_textview.text = option4.substring(0,option4.length-1)
}
}
@@ -205,11 +214,15 @@ class QuizFragment(position: Int) : Fragment(), View.OnClickListener {
answers = resource.data!!.getAsJsonArray("answers")
question_id = resource.data.get("id").asInt
question_textview.text = resource.data.get("name").toString()
-
- option1_textview.text = answers[0].asJsonObject.get("name").toString()
- option2_textview.text = answers[1].asJsonObject.get("name").toString()
- option3_textview.text = answers[2].asJsonObject.get("name").toString()
- option4_textview.text = answers[3].asJsonObject.get("name").toString()
+ val option1 ="A) "+answers[0].asJsonObject.get("name").toString().substring(1)
+ val option2 ="B) "+answers[1].asJsonObject.get("name").toString().substring(1)
+ val option3 ="C) "+answers[2].asJsonObject.get("name").toString().substring(1)
+ val option4 ="d) "+answers[3].asJsonObject.get("name").toString().substring(1)
+
+ option1_textview.text = option1.substring(0,option1.length-1)
+ option2_textview.text = option2.substring(0,option2.length-1)
+ option3_textview.text = option3.substring(0,option3.length-1)
+ option4_textview.text = option4.substring(0,option4.length-1)
}
}
@@ -233,23 +246,42 @@ class QuizFragment(position: Int) : Fragment(), View.OnClickListener {
val body = JsonObject()
body.addProperty("question_id", question_id)
body.addProperty("answer_id", answers[optionId].asJsonObject.get("id").asInt)
- quiz_container.visibility = View.GONE
- quiz_message.visibility = View.GONE
- quiz_placeholder.visibility = View.VISIBLE
-
+// quiz_container.visibility = View.GONE
+// quiz_message.visibility = View.GONE
+// quiz_placeholder.visibility = View.VISIBLE
+ val isCorrect = answers[optionId].asJsonObject.get("correct").asBoolean
+ Log.i("karan","jsonlookslikethis"+body);
viewModel.submitQuizAnswer(body).observe(this, Observer {
it?.let { resource ->
when (resource.status) {
Status.SUCCESS -> {
-// Log.d("Question submit SUCESS", question_id.toString())
- if (CURRENT_QUIZ == DAILY_QUIZ) {
- sharedPrefs?.dailyQuizTime = Calendar.getInstance().timeInMillis
- showFallbackText(AFTER_TWO_HOURS)
- } else if (CURRENT_QUIZ == WEEKLY_QUIZ) {
- var countAnswered = sharedPrefs!!.countAnsweredWeeklyQuiz
- countAnswered += 1
- sharedPrefs!!.countAnsweredWeeklyQuiz = countAnswered
- getWeeklyQuiz()
+ if (resource.code == 201) {
+ if (isCorrect) {
+ showInfoDialog(
+ "Correct Answer",
+ "You get 50 coins.\n\nPlease wait 2-3 minutes for wallet to update."
+ )
+ } else {
+ showInfoDialog(
+ "Wrong Answer",
+ "Better luck next time."
+ )
+ }
+// Log.d("Question submit SUCESS", question_id.toString())
+ if (CURRENT_QUIZ == DAILY_QUIZ) {
+ sharedPrefs?.dailyQuizTime = Calendar.getInstance().timeInMillis
+ showFallbackText(AFTER_TWO_HOURS)
+ } else if (CURRENT_QUIZ == WEEKLY_QUIZ) {
+ var countAnswered = sharedPrefs!!.countAnsweredWeeklyQuiz
+ countAnswered += 1
+ sharedPrefs!!.countAnsweredWeeklyQuiz = countAnswered
+ getWeeklyQuiz()
+ }
+ } else {
+ quiz_placeholder.visibility = View.GONE
+ quiz_container.visibility = View.GONE
+ quiz_message.visibility = View.VISIBLE
+ quiz_message_text.text = getString(R.string.error_msg)
}
}
@@ -272,6 +304,22 @@ class QuizFragment(position: Int) : Fragment(), View.OnClickListener {
})
}
+ val showInfoDialog: (String, String) -> Unit = { title: String, message: String ->
+ val infoDialog = AppDialog.instance(
+ title,
+ message,
+ object : AppDialog.AppDialogListener {
+ override fun onClickConfirm() {
+ onClickCancel()
+ }
+
+ override fun onClickCancel() {}
+ },
+ getString(R.string.okay)
+ )
+ infoDialog.show(requireFragmentManager(), infoDialog.tag)
+ }
+
private fun showFallbackText(category: Int) {
quiz_placeholder.visibility = View.GONE
quiz_container.visibility = View.GONE
diff --git a/app/src/main/java/app/solocoin/solocoin/ui/home/RewardRedeemActivity.kt b/app/src/main/java/app/solocoin/solocoin/ui/home/RewardRedeemActivity.kt
index be36eba..ceaadd8 100644
--- a/app/src/main/java/app/solocoin/solocoin/ui/home/RewardRedeemActivity.kt
+++ b/app/src/main/java/app/solocoin/solocoin/ui/home/RewardRedeemActivity.kt
@@ -37,7 +37,7 @@ class RewardRedeemActivity : AppCompatActivity() {
private lateinit var mAdapter: RewardRedeemAdapter
private lateinit var rewardArrayList: ArrayList
private val loadingDialog = AppDialog.instance()
-
+ private var rewardIsScratchCard:Boolean=false
private val viewModel: RewardRedeemViewModel by viewModel()
override fun onCreate(savedInstanceState: Bundle?) {
@@ -49,7 +49,7 @@ class RewardRedeemActivity : AppCompatActivity() {
rewardArrayList.add(
intent.extras?.getParcelable("EXTRA_INFO")!!
)
-
+ rewardIsScratchCard=intent.getBooleanExtra("scratchcard",false)
recyclerView = findViewById(R.id.reward_recycler_view)
mAdapter = RewardRedeemAdapter(context, rewardArrayList)
recyclerView.layoutManager = LinearLayoutManager(context)
@@ -90,6 +90,7 @@ class RewardRedeemActivity : AppCompatActivity() {
when (response.status) {
Status.SUCCESS -> {
when (response.code) {
+
200 -> {
// update this activity adapter to show coupon code
rewardArrayList[0].isClaimed = true
@@ -101,15 +102,16 @@ class RewardRedeemActivity : AppCompatActivity() {
} catch (e: Exception) {
EventBus.publish("null")
}
-
- // update shared prefs offers list
- val offers = SolocoinApp.sharedPrefs?.offers
- offers?.let { x ->
- val index =
- x.binarySearchBy(rewardArrayList[0].rewardId.toInt()) { it.rewardId.toInt() }
- x[index].isClaimed = true
- }
- SolocoinApp.sharedPrefs?.offers = offers
+// if (!rewardIsScratchCard) {
+// // update shared prefs offers list
+// val offers = SolocoinApp.sharedPrefs?.offers
+// offers?.let { x ->
+// val index =
+// x.binarySearchBy(rewardArrayList[0].rewardId.toInt()) { it.rewardId.toInt() }
+// x[index].isClaimed = true
+// }
+// SolocoinApp.sharedPrefs?.offers = offers
+// }
loadingDialog.dismiss()
showInfoDialog("Offer Claimed", getString(R.string.claim_success))
diff --git a/app/src/main/java/app/solocoin/solocoin/ui/home/WalletFragment.kt b/app/src/main/java/app/solocoin/solocoin/ui/home/WalletFragment.kt
index e08bf5b..34e454f 100644
--- a/app/src/main/java/app/solocoin/solocoin/ui/home/WalletFragment.kt
+++ b/app/src/main/java/app/solocoin/solocoin/ui/home/WalletFragment.kt
@@ -2,25 +2,22 @@ package app.solocoin.solocoin.ui.home
import android.annotation.SuppressLint
import android.app.Activity
+import android.app.Dialog
import android.os.Build
import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.ImageView
-import android.widget.TextView
+import android.view.*
+import android.widget.*
import androidx.annotation.RequiresApi
import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.GridLayoutManager
-import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import app.solocoin.solocoin.R
import app.solocoin.solocoin.app.SolocoinApp
import app.solocoin.solocoin.model.Reward
import app.solocoin.solocoin.ui.adapter.RewardsListAdapter
-import app.solocoin.solocoin.ui.adapter.ScratchDetailsAdapter
+import app.solocoin.solocoin.ui.adapter.ScratchCardAdapter
import app.solocoin.solocoin.util.EventBus
import app.solocoin.solocoin.util.GlobalUtils
import app.solocoin.solocoin.util.enums.Status
@@ -30,16 +27,19 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.InternalCoroutinesApi
import org.koin.android.viewmodel.ext.android.viewModel
+
/**
* Created by Saurav Gupta on 14/5/2020
+ * Updated by Karandeep Singh on 07/07/2020
*/
+
@InternalCoroutinesApi
@ExperimentalCoroutinesApi
@RequiresApi(Build.VERSION_CODES.N)
class WalletFragment : Fragment() {
private lateinit var mListAdapter: RewardsListAdapter
- private lateinit var mScratchTicketsAdapter: ScratchDetailsAdapter
+ private lateinit var mScratchCardAdapter: ScratchCardAdapter
private lateinit var rewardsRecyclerView: RecyclerView
private lateinit var scratchRecyclerView: RecyclerView
private lateinit var swipeRefreshLayout: SwipeRefreshLayout
@@ -52,15 +52,20 @@ class WalletFragment : Fragment() {
private var eventBusReward: Disposable? = null
private var eventBusString: Disposable? = null
private var show: Boolean = true
+ private lateinit var offers: ArrayList
+ private val categorylistarray=arrayOf("Entertainment","Health & Fitness","Gaming","Education",
+ "Lifestyle","Shopping","Food","Travel","Grocery","Software","IT Services","Legal & CA","Everything Else")
+ private var categorylist:ArrayList = ArrayList()
private val viewModel: WalletFragmentViewModel by viewModel()
-
+ private lateinit var menubutton:TextView
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
context = requireActivity()
+
return inflater.inflate(R.layout.fragment_wallet, container, false)
}
@@ -75,14 +80,13 @@ class WalletFragment : Fragment() {
scratchRecyclerView = view.findViewById(R.id.scratch_ticket_recycler_view)
swipeRefreshLayout = view.findViewById(R.id.wallet_sl)
walletUpdateInfoTv = view.findViewById(R.id.wallet_update_info)
-
+ menubutton =view.findViewById(R.id.menubutton)
errorLabel.visibility = View.GONE
errorTextView.visibility = View.GONE
refreshTextView.visibility = View.VISIBLE
rewardsRecyclerView.visibility = View.GONE
scratchRecyclerView.visibility = View.GONE
- walletUpdateInfoTv.visibility = View.INVISIBLE
- rewardsRecyclerView.layoutManager = LinearLayoutManager(context)
+ rewardsRecyclerView.layoutManager = GridLayoutManager(context,1)
scratchRecyclerView.layoutManager = GridLayoutManager(context, 2)
swipeRefreshLayout.setColorSchemeResources(R.color.colorAccent)
swipeRefreshLayout.setOnRefreshListener {
@@ -91,10 +95,160 @@ class WalletFragment : Fragment() {
swipeRefreshLayout.isRefreshing = false
}
+ menubutton.setOnClickListener {
+ showDialog()
+ }
+// spinner.setSelection(0,false)
+// spinner.setOnTouchListener(fun(v: View, event: MotionEvent): Boolean {
+//// println("Real touch felt.")
+//// touch = true
+//// return false
+//// })
+
+// spinner.onItemSelectedListener = object :AdapterView.OnItemSelectedListener {
+// override fun onNothingSelected(parent: AdapterView<*>?) {
+// println("error")
+// }
+//
+// override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
+// if (touch) {
+// val item: String = parent?.getItemAtPosition(position).toString()
+//
+//// if(item!="Select Category") {
+// setOffersAdapter(offers, item)
+// Toast.makeText(parent?.context, item + " selected!!", Toast.LENGTH_LONG).show()
+//// }
+// }
+// touch=false
+// }
+// }
updateWallet()
// updateScratch()
+
+ SolocoinApp.sharedPrefs?.visited?.let {
+ if (it[1]) {
+ SolocoinApp.sharedPrefs?.visited = arrayListOf(it[0], false, it[2])
+ showIntro()
+ }
+ }
+
}
+ fun showDialog(){
+ val dialog = Dialog(context)
+ dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
+ dialog.setCancelable(true)
+ dialog.setContentView(R.layout.dialog_menu)
+ val all: TextView = dialog.findViewById(R.id.all)
+ val entertainment:TextView = dialog.findViewById(R.id.entertainment)
+ val health:TextView = dialog.findViewById(R.id.health)
+ val gaming: TextView = dialog.findViewById(R.id.gaming)
+ val education: TextView = dialog.findViewById(R.id.education)
+ val shopping:TextView = dialog.findViewById(R.id.shopping)
+ val lifestyle:TextView = dialog.findViewById(R.id.lifestyle)
+ val food: TextView = dialog.findViewById(R.id.food)
+ val travel:TextView = dialog.findViewById(R.id.travel)
+ val grocery:TextView = dialog.findViewById(R.id.grocery)
+ val software:TextView = dialog.findViewById(R.id.software)
+ val it_services:TextView = dialog.findViewById(R.id.it_services)
+ val legal_and_CA:TextView = dialog.findViewById(R.id.legal)
+ val everythingelse:TextView =dialog.findViewById(R.id.everythingelse)
+ var i=0
+ while(i entertainment.visibility=View.VISIBLE
+ categorylistarray[1] -> health.visibility=View.VISIBLE
+ categorylistarray[2] -> gaming.visibility=View.VISIBLE
+ categorylistarray[3] -> education.visibility=View.VISIBLE
+ categorylistarray[4] -> lifestyle.visibility=View.VISIBLE
+ categorylistarray[5] -> shopping.visibility=View.VISIBLE
+ categorylistarray[6] -> food.visibility=View.VISIBLE
+ categorylistarray[7] -> travel.visibility=View.VISIBLE
+ categorylistarray[8] -> grocery.visibility=View.VISIBLE
+ categorylistarray[9] -> software.visibility=View.VISIBLE
+ categorylistarray[10] -> it_services.visibility=View.VISIBLE
+ categorylistarray[11] -> legal_and_CA.visibility=View.VISIBLE
+ categorylistarray[12] -> everythingelse.visibility=View.VISIBLE
+ }
+ }
+ i++
+ }
+ entertainment.setOnClickListener {
+ setOffersAdapter(offers,"Entertainment")
+ menubutton.text="Entertainment"
+ dialog.dismiss()
+ }
+ health.setOnClickListener {
+ setOffersAdapter(offers,"Health")
+ menubutton.text="Health"
+ dialog.dismiss()
+ }
+ gaming.setOnClickListener {
+ setOffersAdapter(offers,"Gaming")
+ menubutton.text="Gaming"
+ dialog.dismiss()
+ }
+ education.setOnClickListener {
+ setOffersAdapter(offers,"Education")
+ menubutton.text="Education"
+ dialog.dismiss()
+ }
+ lifestyle.setOnClickListener {
+ setOffersAdapter(offers,"Lifestyle")
+ menubutton.text="Lifestyle"
+ dialog.dismiss()
+ }
+ shopping.setOnClickListener {
+ setOffersAdapter(offers,"Shopping")
+ menubutton.text="Shopping"
+ dialog.dismiss()
+ }
+ food.setOnClickListener {
+ setOffersAdapter(offers,"Food")
+ menubutton.text="Food"
+ dialog.dismiss()
+ }
+ travel.setOnClickListener {
+ setOffersAdapter(offers,"Travel")
+ menubutton.text="Travel"
+ dialog.dismiss()
+ }
+ grocery.setOnClickListener {
+ setOffersAdapter(offers,"Grocery")
+ menubutton.text="Grocery"
+ dialog.dismiss()
+ }
+ software.setOnClickListener {
+ setOffersAdapter(offers,"Software")
+ menubutton.text="Software"
+ dialog.dismiss()
+ }
+ it_services.setOnClickListener {
+ setOffersAdapter(offers,"IT Services")
+ menubutton.text="IT Services"
+ dialog.dismiss()
+ }
+ legal_and_CA.setOnClickListener {
+ setOffersAdapter(offers,"Legal & CA")
+ menubutton.text="Legal & CA"
+ dialog.dismiss()
+ }
+ everythingelse.setOnClickListener {
+ setOffersAdapter(offers,"Everything Else")
+ menubutton.text="Everything Else"
+ dialog.dismiss()
+ }
+ all.setOnClickListener {
+ setOffersAdapter(offers,"All")
+ menubutton.text="All"
+ dialog.dismiss()
+ }
+
+ dialog.show()
+ }
override fun onDestroyView() {
removeEventBus()
super.onDestroyView()
@@ -126,7 +280,7 @@ class WalletFragment : Fragment() {
}
private fun updateWallet() {
- walletUpdateInfoTv.visibility = View.INVISIBLE
+// walletUpdateInfoTv.visibility = View.GONE
// Fetch wallet amount and offers already redeemed from user
viewModel.userData().observe(viewLifecycleOwner, Observer { response ->
//Log.d(TAG, "$response")
@@ -137,9 +291,11 @@ class WalletFragment : Fragment() {
if (balance != null) {
balanceTextView.text = balance
SolocoinApp.sharedPrefs?.walletBalance = balance
+ walletUpdateInfoTv.visibility = View.GONE
} else {
SolocoinApp.sharedPrefs?.walletBalance?.let {
balanceTextView.text = it
+ walletUpdateInfoTv.visibility = View.GONE
}
}
fetchOffers(response.data)
@@ -154,16 +310,44 @@ class WalletFragment : Fragment() {
})
}
- private fun setOffersAdapter(offers: ArrayList) {
+ private fun setOffersAdapter(offers: ArrayList,category: String) {
// Remove event bus if already present on this fragment
removeEventBus()
rewardsRecyclerView.visibility = View.VISIBLE
errorLabel.visibility = View.GONE
errorTextView.visibility = View.GONE
refreshTextView.visibility = View.GONE
- mListAdapter = RewardsListAdapter(context, offers)
- rewardsRecyclerView.adapter = mListAdapter
+// var i=0
+// while(i = ArrayList()
+ var j=0
+ while(j = ArrayAdapter(context, android.R.layout.simple_spinner_dropdown_item, categorylist)
+// spinner.adapter=categoryadapter
// Add event bus to listen to changes in RewardRedeemActivity for isClaimed variable
addEventBus()
}
@@ -171,7 +355,7 @@ class WalletFragment : Fragment() {
private fun fetchOffersSharedPrefs() {
val offers = SolocoinApp.sharedPrefs?.offers
if (offers != null) {
- setOffersAdapter(offers)
+ setOffersAdapter(offers,getString(R.string.General))
} else {
fetchIssue(1)
}
@@ -183,7 +367,7 @@ class WalletFragment : Fragment() {
removeIf { !it.isClaimed }
}
if (offers != null) {
- setOffersAdapter(offers)
+ setOffersAdapter(offers,getString(R.string.General))
// Update shared prefs
SolocoinApp.sharedPrefs?.offers = offers
} else {
@@ -204,7 +388,8 @@ class WalletFragment : Fragment() {
when (response.status) {
Status.SUCCESS -> {
if (response.data != null) {
- val offers: ArrayList = response.data
+// val offers: ArrayList = response.data
+ offers=response.data
if (offers.size == 0) {
updateNFetchOffersSharedPrefs()
} else {
@@ -215,7 +400,7 @@ class WalletFragment : Fragment() {
offers.binarySearchBy(itr.asJsonObject.get("rewards_sponsor_id").asInt) { it.rewardId.toInt() }
offers[index].isClaimed = true
}
- setOffersAdapter(offers)
+ setOffersAdapter(offers,getString(R.string.General))
// Update shared prefs
SolocoinApp.sharedPrefs?.offers = offers
@@ -268,6 +453,22 @@ class WalletFragment : Fragment() {
// scratchRecyclerView.adapter = mScratchTicketsAdapter
// }
+ private fun showIntro() {
+ with(requireActivity()) {
+ val intro = findViewById(R.id.intro).apply {
+ setImageResource(R.drawable.intro_wallet)
+ visibility = View.VISIBLE
+ }
+ findViewById(R.id.close_bt).apply {
+ visibility = View.VISIBLE
+ setOnClickListener {
+ intro.visibility = View.GONE
+ it.visibility = View.GONE
+ }
+ }
+ }
+ }
+
companion object {
fun instance() = WalletFragment().apply {}
private val TAG = WalletFragment::class.simpleName
diff --git a/app/src/main/java/app/solocoin/solocoin/util/GlobalUtils.kt b/app/src/main/java/app/solocoin/solocoin/util/GlobalUtils.kt
index 9d6aa14..3e750b6 100644
--- a/app/src/main/java/app/solocoin/solocoin/util/GlobalUtils.kt
+++ b/app/src/main/java/app/solocoin/solocoin/util/GlobalUtils.kt
@@ -247,6 +247,7 @@ class GlobalUtils {
Picasso.get()
.load(url)
.networkPolicy(NetworkPolicy.OFFLINE)
+ .fit()
.into(view, object : Callback {
override fun onSuccess() {
view.visibility = View.VISIBLE
@@ -255,6 +256,7 @@ class GlobalUtils {
override fun onError(e: Exception?) {
Picasso.get()
.load(url)
+ .fit()
.into(view, object : Callback {
override fun onSuccess() {
view.visibility = View.VISIBLE
@@ -274,6 +276,7 @@ class GlobalUtils {
Picasso.get()
.load(url)
.networkPolicy(NetworkPolicy.OFFLINE)
+ .fit()
.into(view, object : Callback {
override fun onSuccess() {
view.alpha = 1f
@@ -282,6 +285,7 @@ class GlobalUtils {
override fun onError(e: Exception?) {
Picasso.get()
.load(url)
+ .fit()
.into(view, object : Callback {
override fun onSuccess() {
view.alpha = 1f
diff --git a/app/src/main/java/app/solocoin/solocoin/worker/NotificationPingWorker.kt b/app/src/main/java/app/solocoin/solocoin/worker/NotificationPingWorker.kt
index 6c4aa57..6558787 100644
--- a/app/src/main/java/app/solocoin/solocoin/worker/NotificationPingWorker.kt
+++ b/app/src/main/java/app/solocoin/solocoin/worker/NotificationPingWorker.kt
@@ -5,7 +5,6 @@ import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.os.Build
-import android.util.Log
import androidx.annotation.RequiresApi
import androidx.work.CoroutineWorker
import androidx.work.WorkerParameters
@@ -29,14 +28,14 @@ class NotificationPingWorker(appContext: Context, workerParams: WorkerParameters
}
private fun generateNotification(): Result {
- Log.wtf(NOTIFY_CALL, "Creating Notification")
+// Log.wtf(NOTIFY_CALL, "Creating Notification")
val pendingIntent = PendingIntent.getActivity(
applicationContext,
notificationID,
Intent(applicationContext, HomeActivity::class.java).apply {
flags = Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK
- putExtra("from_checkin", true)
+// putExtra("from_checkin", true)
},
0
)
@@ -52,8 +51,7 @@ class NotificationPingWorker(appContext: Context, workerParams: WorkerParameters
)
sharedPrefs?.let {
- val time = Calendar.getInstance().get(Calendar.MILLISECOND)
- it.recentNotifTime = time.toLong()
+ it.recentNotifTime = Calendar.getInstance().timeInMillis
}
return Result.success()
diff --git a/app/src/main/java/app/solocoin/solocoin/worker/SessionPingWorker.kt b/app/src/main/java/app/solocoin/solocoin/worker/SessionPingWorker.kt
index 5ba9f36..9bbae0d 100644
--- a/app/src/main/java/app/solocoin/solocoin/worker/SessionPingWorker.kt
+++ b/app/src/main/java/app/solocoin/solocoin/worker/SessionPingWorker.kt
@@ -5,7 +5,6 @@ import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.os.Build
-import android.util.Log
import androidx.annotation.RequiresApi
import androidx.work.CoroutineWorker
import androidx.work.WorkerParameters
@@ -38,13 +37,11 @@ class SessionPingWorker(appContext: Context, workerParams: WorkerParameters) :
* in the SolocoinRespository class.
*/
override suspend fun doWork(): Result {
- Log.wtf(TAG, "Initiating the work")
+// Log.wtf(TAG, "Initiating the work")
// Checking if the period is valid
sharedPrefs?.let {
- if ((it.recentNotifTime + 5 * 60 * 1000 <= Calendar.getInstance().get(
- Calendar.MILLISECOND
- ).toLong()) && it.recentCheckTime < it.recentNotifTime
+ if ((it.recentNotifTime + 30 * 60 * 1000 < Calendar.getInstance().timeInMillis) && (it.recentCheckTime < it.recentNotifTime)
) {
it.periodValid = false
}
@@ -73,7 +70,7 @@ class SessionPingWorker(appContext: Context, workerParams: WorkerParameters) :
}
}
- Log.wtf(TAG, "Your session type is : $sessionType")
+// Log.wtf(TAG, "Your session type is : $sessionType")
sessionType?.let {
val body: JsonObject =
@@ -85,11 +82,11 @@ class SessionPingWorker(appContext: Context, workerParams: WorkerParameters) :
@RequiresApi(Build.VERSION_CODES.N)
private suspend fun doApiCall(body: JsonObject): Result {
- Log.wtf(API_CALL, "Calling api")
+// Log.wtf(API_CALL, "Calling api")
try {
val response = repository.pingSession(body)
- Log.wtf(TAG, "sending request")
+// Log.wtf(TAG, "sending request")
if (response.isSuccessful) {
response.body()?.let {
sharedPrefs?.status = it["status"]?.asString
@@ -112,7 +109,7 @@ class SessionPingWorker(appContext: Context, workerParams: WorkerParameters) :
pendingIntent,
NotificationManager.IMPORTANCE_HIGH,
"Internet Connectivity Issue",
- "Your network request was unable to be processed. Please check Internet settings."
+ "Your network request was unable to be processed. Please check Internet settings or Login again."
)
return Result.retry()
}
@@ -133,7 +130,7 @@ class SessionPingWorker(appContext: Context, workerParams: WorkerParameters) :
pendingIntent,
NotificationManager.IMPORTANCE_HIGH,
"Internet Connectivity Issue",
- "Your network request was unable to be processed. Please check Internet settings."
+ "Your network request was unable to be processed. Please check Internet settings or Login again."
)
return Result.retry()
}
diff --git a/app/src/main/res/anim/slide_from_top.xml b/app/src/main/res/anim/slide_from_top.xml
new file mode 100644
index 0000000..e54c8ca
--- /dev/null
+++ b/app/src/main/res/anim/slide_from_top.xml
@@ -0,0 +1,4 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/anim/slide_in_top.xml b/app/src/main/res/anim/slide_in_top.xml
new file mode 100644
index 0000000..6d04d5b
--- /dev/null
+++ b/app/src/main/res/anim/slide_in_top.xml
@@ -0,0 +1,4 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bluedude.jpg b/app/src/main/res/drawable/bluedude.jpg
new file mode 100644
index 0000000..3f4c7b9
Binary files /dev/null and b/app/src/main/res/drawable/bluedude.jpg differ
diff --git a/app/src/main/res/drawable/bluelady.jpg b/app/src/main/res/drawable/bluelady.jpg
new file mode 100644
index 0000000..fa0d95f
Binary files /dev/null and b/app/src/main/res/drawable/bluelady.jpg differ
diff --git a/app/src/main/res/drawable/close_button.png b/app/src/main/res/drawable/close_button.png
new file mode 100644
index 0000000..c079285
Binary files /dev/null and b/app/src/main/res/drawable/close_button.png differ
diff --git a/app/src/main/res/drawable/coins.jpg b/app/src/main/res/drawable/coins.jpg
new file mode 100644
index 0000000..98039f1
Binary files /dev/null and b/app/src/main/res/drawable/coins.jpg differ
diff --git a/app/src/main/res/drawable/dialog_bg.xml b/app/src/main/res/drawable/dialog_bg.xml
new file mode 100644
index 0000000..4b81f44
--- /dev/null
+++ b/app/src/main/res/drawable/dialog_bg.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/edit_text_border.xml b/app/src/main/res/drawable/edit_text_border.xml
new file mode 100644
index 0000000..30d9f3b
--- /dev/null
+++ b/app/src/main/res/drawable/edit_text_border.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/greendude.jpg b/app/src/main/res/drawable/greendude.jpg
new file mode 100644
index 0000000..df61e8a
Binary files /dev/null and b/app/src/main/res/drawable/greendude.jpg differ
diff --git a/app/src/main/res/drawable/ic_cash.xml b/app/src/main/res/drawable/ic_cash.xml
new file mode 100644
index 0000000..dad05a3
--- /dev/null
+++ b/app/src/main/res/drawable/ic_cash.xml
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_coin_new.xml b/app/src/main/res/drawable/ic_coin_new.xml
new file mode 100644
index 0000000..a6b83e1
--- /dev/null
+++ b/app/src/main/res/drawable/ic_coin_new.xml
@@ -0,0 +1,393 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_discount.xml b/app/src/main/res/drawable/ic_discount.xml
new file mode 100644
index 0000000..2cc549b
--- /dev/null
+++ b/app/src/main/res/drawable/ic_discount.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_down_arrow.xml b/app/src/main/res/drawable/ic_down_arrow.xml
new file mode 100644
index 0000000..7e49de9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_down_arrow.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_home.xml b/app/src/main/res/drawable/ic_home.xml
index 7a26b62..c461cd7 100644
--- a/app/src/main/res/drawable/ic_home.xml
+++ b/app/src/main/res/drawable/ic_home.xml
@@ -1,6 +1,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ xmlns:android="http://schemas.android.com/apk/res/android">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_menu.xml b/app/src/main/res/drawable/ic_menu.xml
new file mode 100644
index 0000000..0caa4fb
--- /dev/null
+++ b/app/src/main/res/drawable/ic_menu.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_phone.xml b/app/src/main/res/drawable/ic_phone.xml
new file mode 100644
index 0000000..e1d37c4
--- /dev/null
+++ b/app/src/main/res/drawable/ic_phone.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_profile.xml b/app/src/main/res/drawable/ic_profile.xml
index 35081be..587809b 100644
--- a/app/src/main/res/drawable/ic_profile.xml
+++ b/app/src/main/res/drawable/ic_profile.xml
@@ -1,12 +1,11 @@
-
-
-
-
+
+
+ -
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_profile_photo.xml b/app/src/main/res/drawable/ic_profile_photo.xml
new file mode 100644
index 0000000..0db3985
--- /dev/null
+++ b/app/src/main/res/drawable/ic_profile_photo.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_trophy_small.xml b/app/src/main/res/drawable/ic_trophy_small.xml
new file mode 100644
index 0000000..6cc21e0
--- /dev/null
+++ b/app/src/main/res/drawable/ic_trophy_small.xml
@@ -0,0 +1,12 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_wallet_small.xml b/app/src/main/res/drawable/ic_wallet_small.xml
new file mode 100644
index 0000000..d3145e0
--- /dev/null
+++ b/app/src/main/res/drawable/ic_wallet_small.xml
@@ -0,0 +1,12 @@
+
+
+
+
diff --git a/app/src/main/res/drawable/intro_home.png b/app/src/main/res/drawable/intro_home.png
new file mode 100644
index 0000000..1301ec9
Binary files /dev/null and b/app/src/main/res/drawable/intro_home.png differ
diff --git a/app/src/main/res/drawable/intro_milestone.png b/app/src/main/res/drawable/intro_milestone.png
new file mode 100644
index 0000000..24ba2ef
Binary files /dev/null and b/app/src/main/res/drawable/intro_milestone.png differ
diff --git a/app/src/main/res/drawable/intro_wallet.png b/app/src/main/res/drawable/intro_wallet.png
new file mode 100644
index 0000000..0ad2af3
Binary files /dev/null and b/app/src/main/res/drawable/intro_wallet.png differ
diff --git a/app/src/main/res/drawable/jacketdude.jpg b/app/src/main/res/drawable/jacketdude.jpg
new file mode 100644
index 0000000..5d5343c
Binary files /dev/null and b/app/src/main/res/drawable/jacketdude.jpg differ
diff --git a/app/src/main/res/drawable/newappicon.jpg b/app/src/main/res/drawable/newappicon.jpg
new file mode 100644
index 0000000..b7d91b0
Binary files /dev/null and b/app/src/main/res/drawable/newappicon.jpg differ
diff --git a/app/src/main/res/drawable/orangedude.jpg b/app/src/main/res/drawable/orangedude.jpg
new file mode 100644
index 0000000..7bca2b8
Binary files /dev/null and b/app/src/main/res/drawable/orangedude.jpg differ
diff --git a/app/src/main/res/drawable/orangelady.jpg b/app/src/main/res/drawable/orangelady.jpg
new file mode 100644
index 0000000..ec2900c
Binary files /dev/null and b/app/src/main/res/drawable/orangelady.jpg differ
diff --git a/app/src/main/res/drawable/progress_bar.xml b/app/src/main/res/drawable/progress_bar.xml
index 29d1de5..618e610 100644
--- a/app/src/main/res/drawable/progress_bar.xml
+++ b/app/src/main/res/drawable/progress_bar.xml
@@ -6,4 +6,4 @@
-
-
\ No newline at end of file
+
diff --git a/app/src/main/res/drawable/ripple_effect.xml b/app/src/main/res/drawable/ripple_effect.xml
new file mode 100644
index 0000000..93b2ce8
--- /dev/null
+++ b/app/src/main/res/drawable/ripple_effect.xml
@@ -0,0 +1,11 @@
+
+
+ -
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/scratch_image.jpeg b/app/src/main/res/drawable/scratch_image.jpeg
new file mode 100644
index 0000000..8dc66a9
Binary files /dev/null and b/app/src/main/res/drawable/scratch_image.jpeg differ
diff --git a/app/src/main/res/drawable/striped.jpg b/app/src/main/res/drawable/striped.jpg
new file mode 100644
index 0000000..58b12e3
Binary files /dev/null and b/app/src/main/res/drawable/striped.jpg differ
diff --git a/app/src/main/res/drawable/trophy.jpg b/app/src/main/res/drawable/trophy.jpg
new file mode 100644
index 0000000..d354114
Binary files /dev/null and b/app/src/main/res/drawable/trophy.jpg differ
diff --git a/app/src/main/res/drawable/yellowlady.jpg b/app/src/main/res/drawable/yellowlady.jpg
new file mode 100644
index 0000000..0b78ce3
Binary files /dev/null and b/app/src/main/res/drawable/yellowlady.jpg differ
diff --git a/app/src/main/res/layout/activity_all_scratch_cards.xml b/app/src/main/res/layout/activity_all_scratch_cards.xml
new file mode 100644
index 0000000..f829a34
--- /dev/null
+++ b/app/src/main/res/layout/activity_all_scratch_cards.xml
@@ -0,0 +1,107 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_app_guide.xml b/app/src/main/res/layout/activity_app_guide.xml
new file mode 100644
index 0000000..14cfbf7
--- /dev/null
+++ b/app/src/main/res/layout/activity_app_guide.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_create_profile.xml b/app/src/main/res/layout/activity_create_profile.xml
index 6477f0f..7b780d2 100644
--- a/app/src/main/res/layout/activity_create_profile.xml
+++ b/app/src/main/res/layout/activity_create_profile.xml
@@ -34,41 +34,78 @@
android:layout_width="120dp"
android:layout_height="120dp" />
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+ android:layout_height="70dp"
+ android:layout_margin="20dp"
+ android:background="@drawable/edit_text_border"
+ android:drawableStart="@drawable/ic_profile_photo"
+ android:drawablePadding="15dp"
+ android:drawableTint="@color/colorAccent"
+ android:hint="Enter your Name"
+ android:paddingLeft="20dp"
+ android:singleLine="true"
+ app:layout_constraintBottom_toTopOf="@+id/tv_tnc"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintHorizontal_bias="1.0"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@+id/iv_solocoin"
+ app:layout_constraintVertical_bias="0.141" />
+
+
+ app:layout_constraintTop_toBottomOf="@id/et_name"
+ tools:layout_editor_absoluteX="16dp" />
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml
index c80f81f..f295d85 100644
--- a/app/src/main/res/layout/activity_home.xml
+++ b/app/src/main/res/layout/activity_home.xml
@@ -4,6 +4,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:id="@+id/home_activity"
tools:context=".ui.home.HomeActivity">
+
+ android:layout_height="0dp"
+ app:layout_constraintBottom_toTopOf="@id/bottom_nav_view"
+ app:layout_constraintTop_toBottomOf="@id/app_bar" />
+
+
+
-
\ No newline at end of file
+ android:layout_height="match_parent"
+ android:clickable="true"
+ android:elevation="8dp"
+ android:focusable="true"
+ android:paddingTop="70dp"
+ android:scaleType="centerCrop"
+ android:src="@drawable/intro_home"
+ android:visibility="gone" />
+
+
+
diff --git a/app/src/main/res/layout/activity_login_signup.xml b/app/src/main/res/layout/activity_login_signup.xml
index 069fab4..96b0b4b 100644
--- a/app/src/main/res/layout/activity_login_signup.xml
+++ b/app/src/main/res/layout/activity_login_signup.xml
@@ -89,8 +89,6 @@
android:hint="@string/hint_number"
android:inputType="phone"
android:textSize="20sp"
- android:maxLength="10"
- android:maxLines="1"
android:digits="0123456789"
android:paddingStart="12dp"
android:paddingEnd="12dp"
diff --git a/app/src/main/res/layout/activity_my_profile.xml b/app/src/main/res/layout/activity_my_profile.xml
new file mode 100644
index 0000000..7aaca25
--- /dev/null
+++ b/app/src/main/res/layout/activity_my_profile.xml
@@ -0,0 +1,189 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/avatar_dialog.xml b/app/src/main/res/layout/avatar_dialog.xml
new file mode 100644
index 0000000..9f438cc
--- /dev/null
+++ b/app/src/main/res/layout/avatar_dialog.xml
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/dialog_coupon.xml b/app/src/main/res/layout/dialog_coupon.xml
new file mode 100644
index 0000000..3ecd966
--- /dev/null
+++ b/app/src/main/res/layout/dialog_coupon.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/dialog_menu.xml b/app/src/main/res/layout/dialog_menu.xml
new file mode 100644
index 0000000..46c1afd
--- /dev/null
+++ b/app/src/main/res/layout/dialog_menu.xml
@@ -0,0 +1,160 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
index 686b431..f2efa33 100644
--- a/app/src/main/res/layout/fragment_home.xml
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -5,12 +5,12 @@
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:scrollbars="none"
+ android:id="@+id/home_sv"
tools:context=".ui.home.HomeFragment">
-
@@ -30,8 +30,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
- android:layout_marginTop="30dp"
android:layout_marginEnd="12dp"
+ android:layout_marginTop="10dp"
android:fontFamily="@font/poppins_semibold"
android:text="@string/default_timer_text"
android:textAlignment="center"
@@ -65,30 +65,34 @@
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
- app:cardBackgroundColor="@color/grey_light"
+ app:cardBackgroundColor="@color/colorPrimary"
app:cardCornerRadius="8dp">
+ android:orientation="vertical"
+ >
+ android:background="@color/colorPrimary" />
@@ -103,7 +107,7 @@
android:layout_marginEnd="8dp"
app:cardBackgroundColor="@color/colorPrimaryDark"
app:cardCornerRadius="8dp"
- app:cardElevation="4dp">
+ app:cardElevation="12dp">
+
+
+
+
+
+
+
+
-
-
+
+
@@ -185,6 +240,7 @@
+
diff --git a/app/src/main/res/layout/fragment_milestones.xml b/app/src/main/res/layout/fragment_milestones.xml
index 2b9b12b..c88d8ba 100644
--- a/app/src/main/res/layout/fragment_milestones.xml
+++ b/app/src/main/res/layout/fragment_milestones.xml
@@ -13,12 +13,14 @@
android:overScrollMode="never">
+ android:id="@+id/milestones_recycler_view"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:animateLayoutChanges="false"
+ android:overScrollMode="never"
+ android:scrollbars="vertical"
+
+ />
diff --git a/app/src/main/res/layout/fragment_profile.xml b/app/src/main/res/layout/fragment_profile.xml
index f100197..b6eecaf 100644
--- a/app/src/main/res/layout/fragment_profile.xml
+++ b/app/src/main/res/layout/fragment_profile.xml
@@ -5,81 +5,168 @@
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".ui.home.ProfileFragment">
-
+
+
+
+
+
+
+
+
+
+ android:background="@color/colorAccent" />
+
+
+
+
+
+ android:background="@color/colorAccent" />
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_quiz.xml b/app/src/main/res/layout/fragment_quiz.xml
index e114604..93b947f 100644
--- a/app/src/main/res/layout/fragment_quiz.xml
+++ b/app/src/main/res/layout/fragment_quiz.xml
@@ -7,6 +7,7 @@
+ android:visibility="gone">
-
+ android:visibility="visible">
+
+
+
+
+
@@ -63,6 +93,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
+ android:textStyle="bold"
+ android:textColor="@color/black"
android:text="@string/option_a" />
@@ -72,7 +104,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
- app:cardCornerRadius="5dp"
+ app:cardCornerRadius="20dp"
app:strokeColor="@color/grey_light"
app:strokeWidth="1dp">
@@ -81,6 +113,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
+ android:textStyle="bold"
+ android:textColor="@color/black"
android:text="@string/option_b" />
@@ -90,7 +124,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
- app:cardCornerRadius="5dp"
+ app:cardCornerRadius="20dp"
app:strokeColor="@color/grey_light"
app:strokeWidth="1dp">
@@ -99,6 +133,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
+ android:textStyle="bold"
+ android:textColor="@color/black"
android:text="@string/option_c" />
@@ -108,7 +144,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
- app:cardCornerRadius="5dp"
+ app:cardCornerRadius="20dp"
app:strokeColor="@color/grey_light"
app:strokeWidth="1dp">
@@ -117,6 +153,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
+ android:textStyle="bold"
+ android:textColor="@color/black"
android:text="@string/option_d" />
@@ -129,7 +167,7 @@
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:orientation="vertical"
- android:visibility="gone">
+ android:visibility="visible">
+ android:src="@drawable/ic_coin_new" />
+ android:visibility="gone" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_milestones.xml b/app/src/main/res/layout/item_milestones.xml
index 053b4e4..34e7069 100644
--- a/app/src/main/res/layout/item_milestones.xml
+++ b/app/src/main/res/layout/item_milestones.xml
@@ -3,7 +3,6 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
- android:paddingTop="@dimen/app_padding"
android:orientation="vertical">
@@ -85,7 +83,7 @@
+ app:cardUseCompatPadding="true"
+ android:visibility="gone">
-
+
-
+
+
+
@@ -19,9 +36,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="2dp"
- android:layout_marginTop="2dp"
android:layout_marginEnd="4dp"
- android:layout_marginBottom="2dp"
android:gravity="center_vertical"
android:orientation="horizontal">
@@ -29,7 +44,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
- android:layout_weight="4"
android:gravity="center_vertical"
android:orientation="horizontal">
@@ -37,6 +51,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="2dp"
+ android:visibility="gone"
android:scaleType="centerCrop"
android:src="@drawable/ic_profile" />
@@ -47,34 +62,35 @@
android:paddingStart="2dp"
android:paddingEnd="2dp"
android:text="@string/user_rank"
+ android:id="@+id/rank"
android:textColor="@color/colorAccent"
- android:textSize="14sp" />
+ android:textSize="16sp" />
+ android:textSize="14sp" />
-
+
+
+
+
+
+
+
-
+
+
+
+
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_reward_card.xml b/app/src/main/res/layout/item_reward_card.xml
index 9d03d60..da4bb56 100644
--- a/app/src/main/res/layout/item_reward_card.xml
+++ b/app/src/main/res/layout/item_reward_card.xml
@@ -9,76 +9,137 @@
android:divider="@android:color/transparent"
android:dividerHeight="0.0px"
app:cardCornerRadius="8dp"
- app:cardElevation="10dp"
+ app:cardElevation="4dp"
app:cardPreventCornerOverlap="false"
app:cardUseCompatPadding="true">
-
-
+
+
-
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+
+
+
-
-
+
-
-
-
+ android:text="@string/Rs"
+ android:id="@+id/currency"
+ android:layout_marginLeft="5dp"
+
+ android:textAlignment="gravity"
+ android:textColor="@color/black"
+ android:textSize="18sp"
+ android:textStyle="bold" />
+ android:textSize="14sp"
+ android:layout_marginLeft="4dp"
+ android:id="@+id/cost_rupees"
+ android:textStyle="bold"
+ android:textColor="@color/black"
+ android:text="1000"/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
diff --git a/app/src/main/res/layout/item_reward_redeem.xml b/app/src/main/res/layout/item_reward_redeem.xml
index bbed10a..c1f614d 100644
--- a/app/src/main/res/layout/item_reward_redeem.xml
+++ b/app/src/main/res/layout/item_reward_redeem.xml
@@ -107,7 +107,7 @@
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:background="@drawable/primary_border"
- android:visibility="gone">
+ android:visibility="visible">
-
+ >
-
-
-
-
\ No newline at end of file
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/scratch_card.xml b/app/src/main/res/layout/scratch_card.xml
new file mode 100644
index 0000000..5732a15
--- /dev/null
+++ b/app/src/main/res/layout/scratch_card.xml
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/home_navigation.xml b/app/src/main/res/menu/home_navigation.xml
index 141800e..2100ac3 100644
--- a/app/src/main/res/menu/home_navigation.xml
+++ b/app/src/main/res/menu/home_navigation.xml
@@ -14,6 +14,6 @@
android:title="@string/milestones" />
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
index 036d09b..c4a603d 100644
--- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -1,5 +1,5 @@
-
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
index 036d09b..c4a603d 100644
--- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -1,5 +1,5 @@
-
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png
index d2814a9..b39abb1 100644
Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
index bca4b88..4407eb9 100644
Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png and b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
index f49df39..bb01741 100644
Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png
index 1e36c2e..b6eedcc 100644
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
index 4e1e491..f10bd35 100644
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png and b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
index 6a32f0c..867c8c6 100644
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png
index d031c89..6a0075e 100644
Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
index afd3e7a..28ed8ce 100644
Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
index 865cf9b..4471313 100644
Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
index b462471..48528d5 100644
Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
index 21bfcfd..83e5d55 100644
Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
index 43b7d8f..42a5ff1 100644
Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
index bb836ff..c8ef18c 100644
Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
index cd945f4..8bd614c 100644
Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
index f20caf6..eef25e0 100644
Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index d74678d..4b54819 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -5,6 +5,7 @@
#F7395A
#000000
#FFFFFF
+ #00000000
#00C2FF
#707070
#B9B9B9
@@ -20,5 +21,6 @@
#662D9CDB
#CC252525
+ #90000000
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 7d5288c..e4017b3 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,15 +1,8 @@
Solocoin
-
- - English
- - Spanish
- - Mandarin
- - Portuguese
- - Hindi
-
-
Right now, this app currently rewards you to stay at home only. We will expand multiple locations in the future. Until then, try to Stay Home. Stay Safe.
+
Application introduction image!
Location based Rewards
Redeem for exciting coupons
@@ -17,13 +10,13 @@
Get solocoins for grocery shopping, yoga at park, visiting a mall, staying at home
Redeem solocoins for exciting discount coupons and deals from internet
Invite and challenge your friends. Share milestones and badges
-
Get started
+
Next
Skip
Create account
-
Signup
+
Mobile number
Enter your mobile number\nwe will send you the OTP
9876543210
@@ -31,71 +24,72 @@
Resend OTP in 0:%d
Resend OTP?
Verify OTP
-
Okay
- Cancel
+ Cancel
Please enter mobile number, to continue!
+
Otp sent successfully
Otp sent failed!
-
Invalid OTP, please check again!
- Some error occurred, please try again!
-
+ Some error occurred, please try again!
Welcome to Solocoin
+
Home
+
Wallet
Milestones
Profile
-
- Invite
+ Invite and Earn
+ My Profile
Privacy policy
Terms & Conditions
Logout
-
Confirm
- Do you really want to logout?
-
+ Do you really want to logout?
Please connect to the Internet to logout. No changes will happen to your data.
+
https://www.solocoin.app/privacy-policy/
- https://www.solocoin.app/terms-and-conditions/
+ https://www.solocoin.app/terms-and-conditions/
My application name
- \nLet me recommend you this application\n\nhttps://play.google.com/store/apps/details?id=%s
- Select an option
+ \nI have started social-distancing with SoloCoin. I\'m changing the world. You can join me as well. Use this link and change the world.\n
+ Select an option
+ https://play.google.com/store/apps/details?id=app.solocoin.solocoin
Look at my new achievement!
+
I just got
on Solocoin! Stay home, stay safe. Get the app here: solocoin.app #Solocoin
-
Mark your location
- Do you want to clear current session?
+ Do you want to clear current session?
Please hold on 5–10 seconds for accurate location or mark location then confirm
+
Location
%s, %s, %s
Confirm location
Fetching location
-
Permission
+
Location permission is needed to application for working efficiently
Refreshing location, please wait…
-
Create profile
+
Name
By creating an account you agree to our Terms of Service and Privacy Policy
-
0h 0m 0s
Solocoin Notification Check-in
- Please click on the notification for us to ensure you are still here.
- //rewards + wallet section
+ Please click on the notification or open application for us to ensure you are still here.
CLAIM OFFER
+
+ //rewards + wallet section
Sorry, an error occurred. Please contact customer support.
Reward Details
0.0
@@ -115,10 +109,10 @@
Some error occurred.\n Please refresh.
No internet connectivity.
"No offers available."
+
//Quiz
-
- of Social Distancing
+ on Rewards Hotspot
A. Option 1
B. Option 2
C. Option 3
@@ -134,14 +128,14 @@
The quiz is currently unavailable, please try again after sometime
Invite your friends and Earn SoloCoins
Each Invite will earn you 50 coins
-
- //Milestones
+ General
Level 2
+ //Milestones
coins to move to next level!
2
Awards Unlocked
Coming Soon..
- Awards Achieved
+ Badges Earned
coins away.
trophy_icon
Badge Icon
@@ -151,7 +145,7 @@
Share
IND
You
- #12345
+ #12
Your Code
Copy
QAZWSXEDC
@@ -160,8 +154,17 @@
Compete globally with players, achieve milestones, collect badges and brag about it on social media.
Every Alpha Warrior was a trainee once
Unable to load your badge.
- Wallet will take 3–4 minutes to update
+ Wallet will take 2–3 minutes to update.
Loading your offers...
Please connect to internet to logout.
+ App Guide
+ https://www.solocoin.app/app-guide/
+
+ - English
+ - Spanish
+ - Mandarin
+ - Portuguese
+ - Hindi
+
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 949350c..2e39d4e 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -7,7 +7,8 @@