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 @@