Coder Social home page Coder Social logo

suddenh4x / awesome-app-rating Goto Github PK

View Code? Open in Web Editor NEW
230.0 7.0 39.0 3.29 MB

An Android library providing a dialog, which asks the user to rate the app or give feedback. You can also use the library to show the Google in-app review easily under certain conditions.

License: Apache License 2.0

Kotlin 100.00%
android rating dialog rating-dialog feedback feedback-dialog rate user-rating kotlin kotlin-android

awesome-app-rating's People

Contributors

danramirez avatar starsep avatar suddenh4x avatar vittoridavide avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

awesome-app-rating's Issues

Crash when app is onPause

Please help, this error appears when app is onPause(), i using 2.2.1 release version

java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.suddenh4x.ratingdialog.dialog.DialogOptions)
at android.os.Parcel.writeSerializable(Parcel.java:1394)
at android.os.Parcel.writeValue(Parcel.java:1341)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:644)
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1313)
at android.os.Bundle.writeToParcel(Bundle.java:1034)
at android.os.Parcel.writeBundle(Parcel.java:669)
at androidx.fragment.app.FragmentState.writeToParcel(FragmentState.java:167)
at android.os.Parcel.writeTypedList(Parcel.java:1112)
at androidx.fragment.app.FragmentManagerState.writeToParcel(FragmentManagerState.java:51)
at android.os.Parcel.writeParcelable(Parcel.java:1363)
at android.os.Parcel.writeValue(Parcel.java:1268)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:644)
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1313)
at android.os.Bundle.writeToParcel(Bundle.java:1034)
at android.os.Parcel.writeBundle(Parcel.java:669)
at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:2919)
at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3296)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Caused by: java.io.NotSerializableException: com.constant.blackpink.ActivityMain
at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1344)
at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1651)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1497)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1461)
at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:959)
at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:360)
at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1054)
at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1384)
at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1651)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1497)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1461)
at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:959)
at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:360)
at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1054)
at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1384)
at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1651)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1497)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1461)
at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:959)
at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:360)
at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1054)
at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1384)
at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1651)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1497)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1461)
at android.os.Parcel.writeSerializable(Parcel.java:1389)
at android.os.Parcel.writeValue(Parcel.java:1341) 
at android.os.Parcel.writeArrayMapInternal(Parcel.java:644) 
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1313) 
at android.os.Bundle.writeToParcel(Bundle.java:1034) 
at android.os.Parcel.writeBundle(Parcel.java:669) 
at androidx.fragment.app.FragmentState.writeToParcel(FragmentState.java:167) 
at android.os.Parcel.writeTypedList(Parcel.java:1112) 
at androidx.fragment.app.FragmentManagerState.writeToParcel(FragmentManagerState.java:51) 
at android.os.Parcel.writeParcelable(Parcel.java:1363) 
at android.os.Parcel.writeValue(Parcel.java:1268) 
at android.os.Parcel.writeArrayMapInternal(Parcel.java:644) 
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1313) 
at android.os.Bundle.writeToParcel(Bundle.java:1034) 
at android.os.Parcel.writeBundle(Parcel.java:669) 
at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:2919) 
at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3296) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:135) 
at android.app.ActivityThread.main(ActivityThread.java:5254) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

Customize labels and text

Hello. Please add additional functions to customize button labels and titles with help simple string. I have different localization API (libgdx). I found only function with resourses ids and there is the problem. Thanks for help.

Need more customization

Hello. I want to immedeatly go to google play if rates, for example, more than 3, skiping "rate now" dialog, add this opportunity please. On the other hand if i check the rates customly i can't call "for ask for email feedback" dialog, so maybe you olso can add it? Becouse in my situation i am link in deadlock with my case.

setCustomCondition() and setCustomConditionToShowAgain() is not working

Hi, I have tried setCustomCondition() and setCustomConditionToShowAgain(), but none of them worked.

Here is my testing code:

...

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        AppRating.Builder(this)
                        .setCustomCondition {
                            true
                        }
                        .setCustomConditionToShowAgain {
                            true
                        }
                        .showIfMeetsConditions()
}

...

And in the Logcat can see the Custom condition result is true but the next log shows the Conditions not met

2021-04-20 15:28:10.285 1348-1348/net.hikingbook.hikingbook D/awesome_app_rating: Custom condition set. This condition will be removed next time you call the Builder constructor.
2021-04-20 15:28:10.285 1348-1348/net.hikingbook.hikingbook D/awesome_app_rating: Custom condition to show again set. This condition willbe removed next time you call the Builder constructor.
2021-04-20 15:28:10.285 1348-1348/net.hikingbook.hikingbook D/awesome_app_rating: App launch will be counted: countAppLaunch is true.
2021-04-20 15:28:10.292 1348-1348/net.hikingbook.hikingbook V/awesome_app_rating: Increased launch times by 1. It's now 7.
2021-04-20 15:28:10.293 1348-1348/net.hikingbook.hikingbook I/awesome_app_rating: Checking conditions.
2021-04-20 15:28:10.293 1348-1348/net.hikingbook.hikingbook V/awesome_app_rating: Is dialog agreed: false.
2021-04-20 15:28:10.293 1348-1348/net.hikingbook.hikingbook V/awesome_app_rating: Do not show again: false.
2021-04-20 15:28:10.293 1348-1348/net.hikingbook.hikingbook D/awesome_app_rating: Show later button has already been clicked.
2021-04-20 15:28:10.293 1348-1348/net.hikingbook.hikingbook V/awesome_app_rating: Days between later button click and now: 0.
2021-04-20 15:28:10.293 1348-1348/net.hikingbook.hikingbook I/awesome_app_rating: Custom condition to show again found. Condition result is: true.
2021-04-20 15:28:10.293 1348-1348/net.hikingbook.hikingbook I/awesome_app_rating: Don't show rating dialog: Conditions not met.

And in-depth study shouldShowDialog() of ConditionsChecker object. The result of checkCustomCondition() is true, but I didn't set the days, so the minimumDays check in return is false.
So the dialog will not display.

ConditionsChecker.kt

    fun shouldShowDialog(context: Context, dialogOptions: DialogOptions): Boolean {

        ...

        if (!checkCustomCondition(dialogOptions)) return false

        RatingLogger.verbose("Days between first app start and now: $daysBetween.")
        RatingLogger.debug("Show later button hasn't been clicked until now.")
        return (!isDialogAgreed &&
            !isDoNotShowAgain &&
            daysBetween >= PreferenceUtil.getMinimumDays(context) &&
            (PreferenceUtil.getLaunchTimes(context) >= PreferenceUtil.getMinimumLaunchTimes(context)))
    }

Use Google in-app review if conditions are met

If I use .useGoogleInAppReview() the Google in-app review is shown straight away.
I like to show dialog with star rating upfront, if threshold is met show "we like to get 5 stars from you" and on rate button click not open the Google Play Store listing but open the Google in-app review.

A flow like this:
image

Google in app review not working using via java code

Hey, I upgrade the library version as
implementation 'com.suddenh4x.ratingdialog:awesome-app-rating:2.2.0'

I am using this library in an android java project, the previous version works fine, but I am trying to use in google in-app review, but it does nothing, I tried most of the possibilities, below is one of the possibility. I am executing this code in AppCompatActivity class.

new AppRating.Builder(this) .setDebug(true).useGoogleInAppReview().showNow();

I am testing the code on Samsung m30, Android 10.

Waiting for the reply, Thanks in advance

Duplicate dialogs.

The problem is if we rotate the screen - dialog will appear one more time upon the old one.

JVM target error

Hi, when i add the library and i try to compile my project, i get many of output lines (from gradle) that throws this error:

Cannot inline bytecode built with JVM target 1.8 into bytecode that is being built with JVM target 1.6. Please specify proper '-jvm-target' option

Perhaps the library's gradle file is missing this piece of code?

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }

Obviously in my project this configuration is present, but as far as i can see, the library hasn't it. And the issue only happens if i add the library in the project's gradle file, otherwise i don't get this error.

I tried some suggestions mentioned here but nothing seems to resolve it.

Full stars not half stars

For me it makes no sense to have a half star rating. Full stars only.
Can you make this customizable?

JAVA project

Can I use this library in the Java project? I added but nothing show.

Crashes when trying to launch activity in ConfirmButtonClickListener

Hi again

I'm trying to launch the play store activity if the user rated 4+ (skipping the second dialog, I don't think it's necessary)
Here is my code:

    fun rate() : Boolean {
        return AppRating.Builder(activity)
            ...  
            .setConfirmButtonClickListener { userRating ->
                if (userRating >= 4)
                    OpenLinksUtils.openPlayStoreURL(activity)
            }
            ...
            .showIfMeetsConditions()
    }
            ...
    fun openWebAddress(context: Context, address: String) {
            val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(address))
            browserIntent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
            context.startActivity(browserIntent)
     }

   fun openPlayStoreURL(context: Context) {
            openWebAddress(context, Consts.APP_PAGE)
      }

When I tap the confirm button, my app crashes with the dialog, this is the error

    java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.suddenh4x.ratingdialog.dialog.DialogOptions)

This is the full stack trace

    java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.suddenh4x.ratingdialog.dialog.DialogOptions)
        at android.os.Parcel.writeSerializable(Parcel.java:2125)
        at android.os.Parcel.writeValue(Parcel.java:1895)
        at android.os.Parcel.writeArrayMapInternal(Parcel.java:987)
        at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1620)
        at android.os.Bundle.writeToParcel(Bundle.java:1303)
        at android.os.Parcel.writeBundle(Parcel.java:1056)
        at androidx.fragment.app.FragmentState.writeToParcel(FragmentState.java:125)
        at android.os.Parcel.writeTypedObject(Parcel.java:1749)
        at android.os.Parcel.writeTypedList(Parcel.java:1628)
        at android.os.Parcel.writeTypedList(Parcel.java:1585)
        at androidx.fragment.app.FragmentManagerState.writeToParcel(FragmentManagerState.java:51)
        at android.os.Parcel.writeParcelable(Parcel.java:1916)
        at android.os.Parcel.writeValue(Parcel.java:1822)
        at android.os.Parcel.writeArrayMapInternal(Parcel.java:987)
        at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1620)
        at android.os.Bundle.writeToParcel(Bundle.java:1303)
        at android.app.IActivityTaskManager$Stub$Proxy.activityStopped(IActivityTaskManager.java:4918)
        at android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:145)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:246)
        at android.app.ActivityThread.main(ActivityThread.java:8425)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:596)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
     Caused by: java.io.NotSerializableException: io.rosenpin.dmme.activities.root.Rate
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1240)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1604)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1565)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1488)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1234)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1604)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1565)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1488)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1234)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1604)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1565)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1488)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1234)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:354)
        at android.os.Parcel.writeSerializable(Parcel.java:2120)
        at android.os.Parcel.writeValue(Parcel.java:1895) 
        at android.os.Parcel.writeArrayMapInternal(Parcel.java:987) 
        at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1620) 
        at android.os.Bundle.writeToParcel(Bundle.java:1303) 
        at android.os.Parcel.writeBundle(Parcel.java:1056) 
        at androidx.fragment.app.FragmentState.writeToParcel(FragmentState.java:125) 
        at android.os.Parcel.writeTypedObject(Parcel.java:1749) 
        at android.os.Parcel.writeTypedList(Parcel.java:1628) 
        at android.os.Parcel.writeTypedList(Parcel.java:1585) 
        at androidx.fragment.app.FragmentManagerState.writeToParcel(FragmentManagerState.java:51) 
        at android.os.Parcel.writeParcelable(Parcel.java:1916) 
        at android.os.Parcel.writeValue(Parcel.java:1822) 
        at android.os.Parcel.writeArrayMapInternal(Parcel.java:987) 
        at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1620) 
        at android.os.Bundle.writeToParcel(Bundle.java:1303) 
        at android.app.IActivityTaskManager$Stub$Proxy.activityStopped(IActivityTaskManager.java:4918) 
        at android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:145) 
        at android.os.Handler.handleCallback(Handler.java:938) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loop(Looper.java:246) 
        at android.app.ActivityThread.main(ActivityThread.java:8425) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:596) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)

Parcelable encountered IOException writing serializable object (name = com.suddenh4x.ratingdialog.dialog.DialogOptions)

Fatal Exception: java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.suddenh4x.ratingdialog.dialog.DialogOptions)
       at android.os.Parcel.writeSerializable(Parcel.java:1836)
       at android.os.Parcel.writeValue(Parcel.java:1783)
       at android.os.Parcel.writeArrayMapInternal(Parcel.java:931)
       at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1593)
       at android.os.Bundle.writeToParcel(Bundle.java:1253)
       at android.os.Parcel.writeBundle(Parcel.java:1000)
       at androidx.fragment.app.FragmentState.writeToParcel(FragmentState.java:125)
       at android.os.Parcel.writeTypedObject(Parcel.java:1637)
       at android.os.Parcel.writeTypedList(Parcel.java:1516)
       at android.os.Parcel.writeTypedList(Parcel.java:1473)
       at androidx.fragment.app.FragmentManagerState.writeToParcel(FragmentManagerState.java:58)
       at android.os.Parcel.writeParcelable(Parcel.java:1804)
       at android.os.Parcel.writeValue(Parcel.java:1710)
       at android.os.Parcel.writeArrayMapInternal(Parcel.java:931)
       at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1593)
       at android.os.Bundle.writeToParcel(Bundle.java:1253)
       at android.os.Parcel.writeBundle(Parcel.java:1000)
       at android.os.Parcel.writeValue(Parcel.java:1701)
       at android.os.Parcel.writeArrayMapInternal(Parcel.java:931)
       at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1593)
       at android.os.Bundle.writeToParcel(Bundle.java:1253)
       at android.os.Parcel.writeBundle(Parcel.java:1000)
       at android.os.Parcel.writeValue(Parcel.java:1701)
       at android.os.Parcel.writeArrayMapInternal(Parcel.java:931)
       at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1593)
       at android.os.Bundle.writeToParcel(Bundle.java:1253)
       at android.app.IActivityTaskManager$Stub$Proxy.activityStopped(IActivityTaskManager.java:4627)
       at android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:145)
       at android.os.Handler.handleCallback(Handler.java:883)
       at android.os.Handler.dispatchMessage(Handler.java:100)
       at android.os.Looper.loop(Looper.java:224)
       at android.app.ActivityThread.main(ActivityThread.java:7590)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
       

Caused by java.io.NotSerializableException: com.example.example.example.MainContainerActivity
       at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1240)
       at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1604)
       at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1565)
       at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1488)
       at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1234)
       at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1604)
       at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1565)
       at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1488)
       at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1234)
       at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1604)
       at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1565)
       at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1488)
       at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1234)
       at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:354)
       at android.os.Parcel.writeSerializable(Parcel.java:1831)
       at android.os.Parcel.writeValue(Parcel.java:1783)
       at android.os.Parcel.writeArrayMapInternal(Parcel.java:931)
       at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1593)
       at android.os.Bundle.writeToParcel(Bundle.java:1253)
       at android.os.Parcel.writeBundle(Parcel.java:1000)
       at androidx.fragment.app.FragmentState.writeToParcel(FragmentState.java:125)
       at android.os.Parcel.writeTypedObject(Parcel.java:1637)
       at android.os.Parcel.writeTypedList(Parcel.java:1516)
       at android.os.Parcel.writeTypedList(Parcel.java:1473)
       at androidx.fragment.app.FragmentManagerState.writeToParcel(FragmentManagerState.java:58)
       at android.os.Parcel.writeParcelable(Parcel.java:1804)
       at android.os.Parcel.writeValue(Parcel.java:1710)
       at android.os.Parcel.writeArrayMapInternal(Parcel.java:931)
       at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1593)
       at android.os.Bundle.writeToParcel(Bundle.java:1253)
       at android.os.Parcel.writeBundle(Parcel.java:1000)
       at android.os.Parcel.writeValue(Parcel.java:1701)
       at android.os.Parcel.writeArrayMapInternal(Parcel.java:931)
       at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1593)
       at android.os.Bundle.writeToParcel(Bundle.java:1253)
       at android.os.Parcel.writeBundle(Parcel.java:1000)
       at android.os.Parcel.writeValue(Parcel.java:1701)
       at android.os.Parcel.writeArrayMapInternal(Parcel.java:931)
       at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1593)
       at android.os.Bundle.writeToParcel(Bundle.java:1253)
       at android.app.IActivityTaskManager$Stub$Proxy.activityStopped(IActivityTaskManager.java:4627)
       at android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:145)
       at android.os.Handler.handleCallback(Handler.java:883)
       at android.os.Handler.dispatchMessage(Handler.java:100)
       at android.os.Looper.loop(Looper.java:224)
       at android.app.ActivityThread.main(ActivityThread.java:7590)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
  I am using 2.3.0 and still get this issue 

2.5.0 build problem

Building with 2.5.0 results in duplicate class error. Version 2.4.0 has no issues.

Duplicate class com.google.android.play.core.common.IntentSenderForResultStarter found in modules jetified-core-1.10.3-runtime (com.google.android.play:core:1.10.3) and jetified-core-common-2.0.0-runtime (com.google.android.play:core-common:2.0.0)

Add discreet rate option

Instead of showing a dialog that blocks user interactions with the app, I think in some cases it would be a lot better to show a Snackbar instead.

It could look like

        AppRating.Builder(activity)
            .discreet()
            .setMinimumLaunchTimes(5)
            .setMinimumDays(2)
            .setMinimumLaunchTimesToShowAgain(8)
            .setMinimumDaysToShowAgain(4)
            .showIfMeetsConditions()

In which case, instead of showing a dialog with starts and everything, it will only show a snackbar with a short message and a "rate now" button

This will also allow compliance with Google's in app rate library, which requires that you don't ask the user how much they would like to rate the app before showing the rate dialog (source)

This will let us show the user the rate request more often, as it's less intrusive
And I believe users will get less pissed off about a dialog blocking their app when they want to use it

No methods to set rating dialog mail Title's and cancel button's text

Hello, currently playing with your library and so far, so good. Only thing missing, that was probably forgotten but easy to fix, is the two methods here to change the title and cancel button text in the rating dialog with mail feedback, so that I don't have to create my own.
image

Crash on moving an app to background

Hi,
There is an issue with DialogOptions. It's serializable, but some of fields such as RateButton, ConfirmButton, CustomFeedbackButton, MailSettings are not. As result, if the user moves an app to background it crashes:

2020-10-06 13:14:10.506 24556-24556/com.suddenh4x.ratingdialog.exampleapp E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.suddenh4x.ratingdialog.exampleapp, PID: 24556
    java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.suddenh4x.ratingdialog.dialog.DialogOptions)
        at android.os.Parcel.writeSerializable(Parcel.java:1833)
        at android.os.Parcel.writeValue(Parcel.java:1780)
        at android.os.Parcel.writeArrayMapInternal(Parcel.java:928)
        at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1588)
        at android.os.Bundle.writeToParcel(Bundle.java:1253)
        at android.os.Parcel.writeBundle(Parcel.java:997)
        at androidx.fragment.app.FragmentState.writeToParcel(FragmentState.java:167)
        at android.os.Parcel.writeTypedObject(Parcel.java:1634)
        at android.os.Parcel.writeTypedList(Parcel.java:1513)
        at android.os.Parcel.writeTypedList(Parcel.java:1470)
        at androidx.fragment.app.FragmentManagerState.writeToParcel(FragmentManagerState.java:51)
        at android.os.Parcel.writeParcelable(Parcel.java:1801)
        at android.os.Parcel.writeValue(Parcel.java:1707)
        at android.os.Parcel.writeArrayMapInternal(Parcel.java:928)
        at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1588)
        at android.os.Bundle.writeToParcel(Bundle.java:1253)
        at android.app.IActivityTaskManager$Stub$Proxy.activityStopped(IActivityTaskManager.java:4542)
        at android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:145)
        at android.os.Handler.handleCallback(Handler.java:888)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:213)
        at android.app.ActivityThread.main(ActivityThread.java:8178)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)
     Caused by: java.io.NotSerializableException: com.suddenh4x.ratingdialog.buttons.ConfirmButton
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1240)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1604)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1565)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1488)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1234)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:354)
        at android.os.Parcel.writeSerializable(Parcel.java:1828)
        at android.os.Parcel.writeValue(Parcel.java:1780) 
        at android.os.Parcel.writeArrayMapInternal(Parcel.java:928) 
        at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1588) 
        at android.os.Bundle.writeToParcel(Bundle.java:1253) 
        at android.os.Parcel.writeBundle(Parcel.java:997) 
        at androidx.fragment.app.FragmentState.writeToParcel(FragmentState.java:167) 
        at android.os.Parcel.writeTypedObject(Parcel.java:1634) 
        at android.os.Parcel.writeTypedList(Parcel.java:1513) 
        at android.os.Parcel.writeTypedList(Parcel.java:1470) 
        at androidx.fragment.app.FragmentManagerState.writeToParcel(FragmentManagerState.java:51) 
        at android.os.Parcel.writeParcelable(Parcel.java:1801) 
        at android.os.Parcel.writeValue(Parcel.java:1707) 
        at android.os.Parcel.writeArrayMapInternal(Parcel.java:928) 
        at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1588) 
        at android.os.Bundle.writeToParcel(Bundle.java:1253) 
        at android.app.IActivityTaskManager$Stub$Proxy.activityStopped(IActivityTaskManager.java:4542) 
        at android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:145) 
        at android.os.Handler.handleCallback(Handler.java:888) 
        at android.os.Handler.dispatchMessage(Handler.java:100) 
        at android.os.Looper.loop(Looper.java:213) 
        at android.app.ActivityThread.main(ActivityThread.java:8178) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101) 

Google InAppRatingDialog with LibraryDialog

Hello, I like your lib, as it makes my life much easier.
I thought it would be so cool, if you could combine the original Library Dialog with the Google Inapp review dialog,
something like:
.combineOriginalandGoogleDialog
The Process would be almost same as the Library Dialog, but when the user selects the Stars or chooses "yes, i want to rate", it would open the Google Dialog to rate.

This would enhance the user experience, as it firstly asks you if you even want to rate.
.
Thank you for stating your point of view.

jan

incomplete with the new app core version

when trying to add the library with
androidx-core-play-inAppUpdateCore = { group = "com.google.android.play", name = "app-update", version.ref = "corePlayInAppUpate" }
androidx-core-play-inAppUpdateKotlin = { group = "com.google.android.play", name = "app-update-ktx", version.ref = "corePlayInAppUpate" }

I get this error
Duplicate class com.google.android.play.core.appupdate.AppUpdateInfo found in modules app-update-2.1.0.aar -> app-update-2.1.0-runtime (com.google.android.play:app-update:2.1.0) and core-1.10.0.aar -> core-1.10.0-runtime (com.google.android.play:core:1.10.0) Duplicate class com.google.android.play.core.appupdate.AppUpdateManager found in modules app-update-2.1.0.aar -> app-update-2.1.0-runtime (com.google.android.play:app-update:2.1.0) and core-1.10.0.aar -> core-1.10.0-runtime (com.google.android.play:core:1.10.0) Duplicate class com.google.android.play.core.appupdate.AppUpdateManagerFactory found in modules app-update-2.1.0.aar -> app-update-2.1.0-runtime (com.google.android.play:app-update:2.1.0) and core-1.10.0.aar -> core-1.10.0-runtime (com.google.android.play:core:1.10.0) Duplicate class com.google.android.play.core.appupdate.AppUpdateOptions found in modules app-update-2.1.0.aar -> app-update-2.1.0-runtime (com.google.android.play:app-update:2.1.0) and core-1.10.0.aar -> core-1.10.0-runtime (com.google.android.play:core:1.10.0) Duplicate class com.google.android.play.core.appupdate.AppUpdateOptions$Builder found in modules app-update-2.1.0.aar -> app-update-2.1.0-runtime (com.google.android.play:app-update:2.1.0) and core-1.10.0.aar -> core-1.10.0-runtime (com.google.android.play:core:1.10.0) Duplicate class com.google.android.play.core.appupdate.testing.FakeAppUpdateManager found in modules app-update-2.1.0.aar -> app-update-2.1.0-runtime (com.google.android.play:app-update:2.1.0) and core-1.10.0.aar -> core-1.10.0-runtime (com.google.android.play:core:1.10.0) Duplicate class com.google.android.play.core.common.IntentSenderForResultStarter found in modules core-1.10.0.aar -> core-1.10.0-runtime (com.google.android.play:core:1.10.0) and core-common-2.0.3.aar -> core-common-2.0.3-runtime (com.google.android.play:core-common:2.0.3) Duplicate class com.google.android.play.core.common.LocalTestingException found in modules core-1.10.0.aar -> core-1.10.0-runtime (com.google.android.play:core:1.10.0) and core-common-2.0.3.aar -> core-common-2.0.3-runtime (com.google.android.play:core-common:2.0.3) Duplicate class com.google.android.play.core.common.PlayCoreDialogWrapperActivity found in modules core-1.10.0.aar -> core-1.10.0-runtime (com.google.android.play:core:1.10.0) and core-common-2.0.3.aar -> core-common-2.0.3-runtime (com.google.android.play:core-common:2.0.3) Duplicate class com.google.android.play.core.install.InstallException found in modules app-update-2.1.0.aar -> app-update-2.1.0-runtime (com.google.android.play:app-update:2.1.0) and core-1.10.0.aar -> core-1.10.0-runtime (com.google.android.play:core:1.10.0) Duplicate class com.google.android.play.core.install.InstallState found in modules app-update-2.1.0.aar -> app-update-2.1.0-runtime (com.google.android.play:app-update:2.1.0) and core-1.10.0.aar -> core-1.10.0-runtime (com.google.android.play:core:1.10.0) Duplicate class com.google.android.play.core.install.InstallStateUpdatedListener found in modules app-update-2.1.0.aar -> app-update-2.1.0-runtime (com.google.android.play:app-update:2.1.0) and core-1.10.0.aar -> core-1.10.0-runtime (com.google.android.play:core:1.10.0) Duplicate class com.google.android.play.core.install.NativeInstallStateUpdateListener found in modules app-update-2.1.0.aar -> app-update-2.1.0-runtime (com.google.android.play:app-update:2.1.0) and core-1.10.0.aar -> core-1.10.0-runtime (com.google.android.play:core:1.10.0) Duplicate class com.google.android.play.core.install.model.ActivityResult found in modules app-update-2.1.0.aar -> app-update-2.1.0-runtime (com.google.android.play:app-update:2.1.0) and core-1.10.0.aar -> core-1.10.0-runtime (com.google.android.play:core:1.10.0) Duplicate class com.google.android.play.core.install.model.AppUpdateType found in modules app-update-2.1.0.aar -> app-update-2.1.0-runtime (com.google.android.play:app-update:2.1.0) and core-1.10.0.aar -> core-1.10.0-runtime (com.google.android.play:core:1.10.0) Duplicate class com.google.android.play.core.install.model.InstallErrorCode found in modules app-update-2.1.0.aar -> app-update-2.1.0-runtime (com.google.android.play:app-update:2.1.0) and core-1.10.0.aar -> core-1.10.0-runtime (com.google.android.play:core:1.10.0) Duplicate class com.google.android.play.core.install.model.InstallStatus found in modules app-update-2.1.0.aar -> app-update-2.1.0-runtime (com.google.android.play:app-update:2.1.0) and core-1.10.0.aar -> core-1.10.0-runtime (com.google.android.play:core:1.10.0) Duplicate class com.google.android.play.core.install.model.UpdateAvailability found in modules app-update-2.1.0.aar -> app-update-2.1.0-runtime (com.google.android.play:app-update:2.1.0) and core-1.10.0.aar -> core-1.10.0-runtime (com.google.android.play:core:1.10.0) Duplicate class com.google.android.play.core.ktx.AppUpdateManagerKtxKt found in modules app-update-ktx-2.1.0.aar -> app-update-ktx-2.1.0-runtime (com.google.android.play:app-update-ktx:2.1.0) and core-ktx-1.8.1.aar -> core-ktx-1.8.1-runtime (com.google.android.play:core-ktx:1.8.1) Duplicate class com.google.android.play.core.ktx.AppUpdateManagerKtxKt$requestAppUpdateInfo$1 found in modules app-update-ktx-2.1.0.aar -> app-update-ktx-2.1.0-runtime (com.google.android.play:app-update-ktx:2.1.0) and core-ktx-1.8.1.aar -> core-ktx-1.8.1-runtime (com.google.android.play:core-ktx:1.8.1) Duplicate class com.google.android.play.core.ktx.AppUpdateManagerKtxKt$requestUpdateFlow$1 found in modules app-update-ktx-2.1.0.aar -> app-update-ktx-2.1.0-runtime (com.google.android.play:app-update-ktx:2.1.0) and core-ktx-1.8.1.aar -> core-ktx-1.8.1-runtime (com.google.android.play:core-ktx:1.8.1) Duplicate class com.google.android.play.core.ktx.AppUpdateManagerKtxKt$requestUpdateFlow$1$1 found in modules app-update-ktx-2.1.0.aar -> app-update-ktx-2.1.0-runtime (com.google.android.play:app-update-ktx:2.1.0) and core-ktx-1.8.1.aar -> core-ktx-1.8.1-runtime (com.google.android.play:core-ktx:1.8.1) Duplicate class com.google.android.play.core.ktx.AppUpdateManagerKtxKt$requestUpdateFlow$1$2 found in modules app-update-ktx-2.1.0.aar -> app-update-ktx-2.1.0-runtime (com.google.android.play:app-update-ktx:2.1.0) and core-ktx-1.8.1.aar -> core-ktx-1.8.1-runtime (com.google.android.play:core-ktx:1.8.1) Duplicate class com.google.android.play.core.ktx.AppUpdateManagerKtxKt$requestUpdateFlow$1$3 found in modules app-update-ktx-2.1.0.aar -> app-update-ktx-2.1.0-runtime (com.google.android.play:app-update-ktx:2.1.0) and core-ktx-1.8.1.aar -> core-ktx-1.8.1-runtime (com.google.android.play:core-ktx:1.8.1) Duplicate class com.google.android.play.core.ktx.AppUpdateManagerKtxKt$requestUpdateFlow$1$globalUpdateListener$1 found in modules app-update-ktx-2.1.0.aar -> app-update-ktx-2.1.0-runtime (com.google.android.play:app-update-ktx:2.1.0) and core-ktx-1.8.1.aar -> core-ktx-1.8.1-runtime (com.google.android.play:core-ktx:1.8.1) Duplicate class com.google.android.play.core.ktx.AppUpdateManagerKtxKt$requestUpdateFlow$1$globalUpdateListener$2 found in modules app-update-ktx-2.1.0.aar -> app-update-ktx-2.1.0-runtime (com.google.android.play:app-update-ktx:2.1.0) and core-ktx-1.8.1.aar -> core-ktx-1.8.1-runtime (com.google.android.play:core-ktx:1.8.1) Duplicate class com.google.android.play.core.ktx.AppUpdateManagerKtxKt$startUpdateFlowForResult$1 found in modules app-update-ktx-2.1.0.aar -> app-update-ktx-2.1.0-runtime (com.google.android.play:app-update-ktx:2.1.0) and core-ktx-1.8.1.aar -> core-ktx-1.8.1-runtime (com.google.android.play:core-ktx:1.8.1) Duplicate class com.google.android.play.core.ktx.AppUpdatePassthroughListener found in modules app-update-ktx-2.1.0.aar -> app-update-ktx-2.1.0-runtime (com.google.android.play:app-update-ktx:2.1.0) and core-ktx-1.8.1.aar -> core-ktx-1.8.1-runtime (com.google.android.play:core-ktx:1.8.1) Duplicate class com.google.android.play.core.ktx.AppUpdateResult found in modules app-update-ktx-2.1.0.aar -> app-update-ktx-2.1.0-runtime (com.google.android.play:app-update-ktx:2.1.0) and core-ktx-1.8.1.aar -> core-ktx-1.8.1-runtime (com.google.android.play:core-ktx:1.8.1) Duplicate class com.google.android.play.core.ktx.AppUpdateResult$Available found in modules app-update-ktx-2.1.0.aar -> app-update-ktx-2.1.0-runtime (com.google.android.play:app-update-ktx:2.1.0) and core-ktx-1.8.1.aar -> core-ktx-1.8.1-runtime (com.google.android.play:core-ktx:1.8.1) Duplicate class com.google.android.play.core.ktx.AppUpdateResult$Downloaded found in modules app-update-ktx-2.1.0.aar -> app-update-ktx-2.1.0-runtime (com.google.android.play:app-update-ktx:2.1.0) and core-ktx-1.8.1.aar -> core-ktx-1.8.1-runtime (com.google.android.play:core-ktx:1.8.1) Duplicate class com.google.android.play.core.ktx.AppUpdateResult$InProgress found in modules app-update-ktx-2.1.0.aar -> app-update-ktx-2.1.0-runtime (com.google.android.play:app-update-ktx:2.1.0) and core-ktx-1.8.1.aar -> core-ktx-1.8.1-runtime (com.google.android.play:core-ktx:1.8.1) Duplicate class com.google.android.play.core.ktx.AppUpdateResult$NotAvailable found in modules app-update-ktx-2.1.0.aar -> app-update-ktx-2.1.0-runtime (com.google.android.play:app-update-ktx:2.1.0) and core-ktx-1.8.1.aar -> core-ktx-1.8.1-runtime (com.google.android.play:core-ktx:1.8.1) Duplicate class com.google.android.play.core.listener.StateUpdatedListener found in modules core-1.10.0.aar -> core-1.10.0-runtime (com.google.android.play:core:1.10.0) and core-common-2.0.3.aar -> core-common-2.0.3-runtime (com.google.android.play:core-common:2.0.3)

java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.suddenh4x.ratingdialog.dialog.DialogOptions)

Caused by java.io.NotSerializableException: com.suddenh4x.ratingdialog.buttons.ConfirmButton
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1240)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1604)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1565)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1488)

Fatal exception

After I start using this library in my app, I'm getting this exception in Firebase crash reports:
Fatal Exception: java.lang.RuntimeException
Parcelable encountered IOException writing serializable object (name = com.suddenh4x.ratingdialog.dialog.DialogOptions)

But I don't know how it affects on user experience.

Subject and text does not work

Hi

I try to use your library, but when I try to send mail feedback the subject and the text didn't populate.

It happens when I select the Gmail app, when I select the Email App it works fine

image

Compile time error

I am using Billy in my project. Maybe this is occurring this error :

Duplicate class com.google.android.play.core.common.IntentSenderForResultStarter found in modules core-1.10.3-runtime (com.google.android.play:core:1.10.3) and core-common-2.0.2-runtime (com.google.android.play:core-common:2.0.2)
Duplicate class com.google.android.play.core.common.LocalTestingException found in modules core-1.10.3-runtime (com.google.android.play:core:1.10.3) and core-common-2.0.2-runtime (com.google.android.play:core-common:2.0.2)
Duplicate class com.google.android.play.core.common.PlayCoreDialogWrapperActivity found in modules core-1.10.3-runtime (com.google.android.play:core:1.10.3) and core-common-2.0.2-runtime (com.google.android.play:core-common:2.0.2)
Duplicate class com.google.android.play.core.ktx.ReviewManagerKtxKt found in modules core-ktx-1.8.1-runtime (com.google.android.play:core-ktx:1.8.1) and review-ktx-2.0.1-runtime (com.google.android.play:review-ktx:2.0.1)
Duplicate class com.google.android.play.core.ktx.ReviewManagerKtxKt$requestReview$1 found in modules core-ktx-1.8.1-runtime (com.google.android.play:core-ktx:1.8.1) and review-ktx-2.0.1-runtime (com.google.android.play:review-ktx:2.0.1)
Duplicate class com.google.android.play.core.listener.StateUpdatedListener found in modules core-1.10.3-runtime (com.google.android.play:core:1.10.3) and core-common-2.0.2-runtime (com.google.android.play:core-common:2.0.2)
Duplicate class com.google.android.play.core.review.ReviewException found in modules core-1.10.3-runtime (com.google.android.play:core:1.10.3) and review-2.0.1-runtime (com.google.android.play:review:2.0.1)
Duplicate class com.google.android.play.core.review.ReviewInfo found in modules core-1.10.3-runtime (com.google.android.play:core:1.10.3) and review-2.0.1-runtime (com.google.android.play:review:2.0.1)
Duplicate class com.google.android.play.core.review.ReviewManager found in modules core-1.10.3-runtime (com.google.android.play:core:1.10.3) and review-2.0.1-runtime (com.google.android.play:review:2.0.1)
Duplicate class com.google.android.play.core.review.ReviewManagerFactory found in modules core-1.10.3-runtime (com.google.android.play:core:1.10.3) and review-2.0.1-runtime (com.google.android.play:review:2.0.1)
Duplicate class com.google.android.play.core.review.model.ReviewErrorCode found in modules core-1.10.3-runtime (com.google.android.play:core:1.10.3) and review-2.0.1-runtime (com.google.android.play:review:2.0.1)
Duplicate class com.google.android.play.core.review.model.zza found in modules core-1.10.3-runtime (com.google.android.play:core:1.10.3) and review-2.0.1-runtime (com.google.android.play:review:2.0.1)
Duplicate class com.google.android.play.core.review.testing.FakeReviewManager found in modules core-1.10.3-runtime (com.google.android.play:core:1.10.3) and review-2.0.1-runtime (com.google.android.play:review:2.0.1)
Duplicate class com.google.android.play.core.review.zza found in modules core-1.10.3-runtime (com.google.android.play:core:1.10.3) and review-2.0.1-runtime (com.google.android.play:review:2.0.1)
Duplicate class com.google.android.play.core.review.zzb found in modules core-1.10.3-runtime (com.google.android.play:core:1.10.3) and review-2.0.1-runtime (com.google.android.play:review:2.0.1)
Duplicate class com.google.android.play.core.review.zzc found in modules core-1.10.3-runtime (com.google.android.play:core:1.10.3) and review-2.0.1-runtime (com.google.android.play:review:2.0.1)
Duplicate class com.google.android.play.core.review.zzd found in modules core-1.10.3-runtime (com.google.android.play:core:1.10.3) and review-2.0.1-runtime (com.google.android.play:review:2.0.1)
Duplicate class com.google.android.play.core.review.zze found in modules core-1.10.3-runtime (com.google.android.play:core:1.10.3) and review-2.0.1-runtime (com.google.android.play:review:2.0.1)
Duplicate class com.google.android.play.core.review.zzf found in modules core-1.10.3-runtime (com.google.android.play:core:1.10.3) and review-2.0.1-runtime (com.google.android.play:review:2.0.1)
Duplicate class com.google.android.play.core.review.zzg found in modules core-1.10.3-runtime (com.google.android.play:core:1.10.3) and review-2.0.1-runtime (com.google.android.play:review:2.0.1)
Duplicate class com.google.android.play.core.review.zzh found in modules core-1.10.3-runtime (com.google.android.play:core:1.10.3) and review-2.0.1-runtime (com.google.android.play:review:2.0.1)
Duplicate class com.google.android.play.core.review.zzi found in modules core-1.10.3-runtime (com.google.android.play:core:1.10.3) and review-2.0.1-runtime (com.google.android.play:review:2.0.1)

Go to the documentation to learn how to Fix dependency resolution errors.

Any workaround? 🙂

Null extracted folder for artifact: ResolvedArtifact

I am facing the following error -

Null extracted folder for artifact: ResolvedArtifact(componentIdentifier=com.suddenh4x.ratingdialog:awesome-app-rating:2.7.0, variantName=null, artifactFile=/home/zarar/.gradle/caches/modules-2/files-2.1/com.suddenh4x.ratingdialog/awesome-app-rating/2.7.0/34c9671e194997ba0aaa29ec7c52c2aab47f837d/awesome-app-rating-2.7.0.aar, extractedFolder=null, dependencyType=ANDROID, isWrappedModule=false, buildMapping={current_build=/home/zarar/StudioProjects/WFD_Customer_Android}, mavenCoordinatesCache=com.android.build.gradle.internal.ide.dependencies.MavenCoordinatesCacheBuildService$Inject@3b5ad97d)

after upgrading the version from 2.2.1 to 2.7.0

Two issues

Hello

I have two issues.

  1. When I open "Give feedback" dialog and then submit - nothing happens.

  2. Height of those dialogs are much to long I mean button are located properly but bottom of dialogs is long below those buttons.

Please give me a solución because I like this project :)

Regards
Jakub

Google In App review dialog never show.

Hey, I've been trying to use Google In app review feature from awesome-app-rating but everytime I'm getting Toast "Google In-App review completed success: true" and dialog never shown. my app is already published on play store. I've tried in multiple OS across multiple device.

Add compose support

The README currently falsely claims that this library has jetpack compose support.
You also mention later in the README that to use this library with jetpack compose users should use an AppCompatActivity instead of a ComponentActivity, but the latter is required to use compose.
To add proper compose support we should create a dialog view specifically for compose

Good news from Google.

For In App Reviews:
Status: Won't Fix (Intended Behavior)
We have looked into the issue you have reported and would like to inform that this is working as intended, it is showing only once in prod due to the quota.

This means that if google play increases your app's quota, it will show more users voting dialog.

And I would like to know if In App Review still works properly in this library.

Add method to check if the rating popup is going to appear

Sometimes at the app startup, you show a user some random pop ups, like permission request, a warning, a deal etc.

It would be good if this library will provide a function that returns a boolean value letting us know if it's going to pop up, in which case we can choose not to show all other pop ups (many pop ups will confuse the user and will most likely cause in ignoring the app rating pop up)

I would like to suggest 2 approaches:

  1. showIfMeetsConditions will return a boolean value, true for showing, false for not showing (doesn't meet conditions)
  2.      AppRating.Builder(activity)
             .setDebug(true)
             .setMinimumLaunchTimes(5)
             .setMinimumDays(2)
             .setMinimumLaunchTimesToShowAgain(8)
             .setMinimumDaysToShowAgain(4)
            .setOnShouldShow({ shouldShow->
                    // handle a situation where the dialog is shown/not shown
             })
             .showIfMeetsConditions()

Cancelable

I think setCancelable is missing some logic. In my opinions it should works (or have logic) like button "later"

IllegalStateException

On my crash analytics I get this crash report:
Fatal Exception: java.lang.IllegalStateException Can not perform this action after onSaveInstanceState

androidx.fragment.app.FragmentManager.checkStateLoss (FragmentManager.java:1844)
androidx.fragment.app.DialogFragment.show (DialogFragment.java:260)
com.suddenh4x.ratingdialog.AppRating$Builder.showNow (AppRating.java:309)
com.suddenh4x.ratingdialog.AppRating$Builder.showIfMeetsConditions (AppRating.java:328)
com.inidamleader.ovtracker.reviewer.AppRatingReviewer.launchReviewFlow (AppRatingReviewer.java:63)
com.inidamleader.ovtracker.reviewer.ReviewerImpl.launchReviewFlowIfPossible (ReviewerImpl.java:40)
com.inidamleader.ovtracker.activity.MainActivity$onCreate$initReviewers$1.invokeSuspend (MainActivity.java:209)
kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith (BaseContinuationImpl.java:33)
kotlinx.coroutines.DispatchedTaskKt.resume (DispatchedTaskKt.java:227)
kotlinx.coroutines.DispatchedTaskKt.dispatch (DispatchedTaskKt.java:166)
kotlinx.coroutines.CancellableContinuationImpl.dispatchResume (CancellableContinuationImpl.java:362)
kotlinx.coroutines.CancellableContinuationImpl.resumeImpl (CancellableContinuationImpl.java:396)
kotlinx.coroutines.CancellableContinuationImpl.resumeImpl$default (CancellableContinuationImpl.java:388)
kotlinx.coroutines.CancellableContinuationImpl.resumeUndispatched (CancellableContinuationImpl.java:484)
kotlinx.coroutines.android.HandlerContext$scheduleResumeAfterDelay$$inlined$Runnable$1.run (HandlerContext.java:19)

Can we change rating overview title after creating the dialog?

We have a requirement wherein we need to insert the user's name in the review overview's title, like so "Hey , how was your experience with this app?". Considering the text comes from the string resource during compilation time, is it possible to change it after creating the dialog with the create() method?

Unable to find the AppRating class

I use Android Studio and Java, I want to use your library but I can't find the AppRating class. I've successfully implemented the git repository
Is because the library is in kotlin? It don't work with java projects?

Use asynchronous checks for launch rate dialog

Hi.

You have a great library and I use it for a long time. Also with .useGoogleInAppReview()

I found out that all check is made in the main thread that is kind of problem.

Also there is no possibility to check if dialog was shown so I would write it to my DataStore and have no needs to check it again.

Why this is a problem?
I want to display rate dialog after the successful action. But there is many such action and moreover they come along with animation. So I don't want to busy main thread by many checks.

Is there any solutions to this problem?

Incrementing launchTimes when Orientation Change

I think there is a solution for this:
Use a static field (or companion object field in kotlin) "instanceNbr" in the class that invoke increaseLaunchTimes() function
This field must be incremented at each RateApp.builder instanciation, and then use it as a condition to call increaseLaunchTimes() function:

data class Builder(var activity: AppCompatActivity) {
    ...
    init {
        // By using instanceNbr the launchTimes will be incremented just at start of the application
        // Recreate activity without killing the process will not call increment SharePref LaunchTimes
        if (++instanceNbr == 1)
            activity.increaseLaunchTimes()
    }
    ...
    companion object {
        private var instanceNbr = 0
        ...
    }
    ...
}

Failed to send email when targeting Android 11

Hello,

Thank you for your awesome library!

I found that sending email feedback always fail due to Android 11 restriction illustrated in below link:

Package visibility in Android 11

To resolve this issue, we have to add query to mainfaist file like this:

<queries>
        <!-- Sending Emails   -->
        <intent>
            <action android:name="android.intent.action.SENDTO" />
            <data android:scheme="mailto" />
        </intent>
</queries>

Thank you

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.