Giter Site home page Giter Site logo

hotchemi / android-rate Goto Github PK

View Code? Open in Web Editor NEW
724.0 29.0 216.0 692 KB

Android-Rate is a library to help you promote your android app by prompting users to rate the app after using it for a few days.

Home Page: http://hotchemi.github.io/Android-Rate

License: MIT License

Java 100.00%

android-rate's Introduction

Android-Rate

Build Status

Android-Rate is a library to help you promote your android app by prompting users to rate the app after using it for a few days.

screen shot

Install

You can download from maven central.

${latest.version} is Maven Badges

dependencies {
  compile 'com.github.hotchemi:android-rate:{latest.version}'
}

Usage

Configuration

Android-Rate provides methods to configure its behavior.

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  AppRate.with(this)
      .setInstallDays(0) // default 10, 0 means install day.
      .setLaunchTimes(3) // default 10
      .setRemindInterval(2) // default 1
      .setShowLaterButton(true) // default true
      .setDebug(false) // default false
      .setOnClickButtonListener(new OnClickButtonListener() { // callback listener.
          @Override
          public void onClickButton(int which) {
              Log.d(MainActivity.class.getName(), Integer.toString(which));
          }
      })
      .monitor();

  // Show a dialog if meets conditions
  AppRate.showRateDialogIfMeetsConditions(this);
}

The default conditions to show rate dialog is as below:

  1. App is launched more than 10 days later than installation. Change via AppRate#setInstallDays(int).
  2. App is launched more than 10 times. Change via AppRate#setLaunchTimes(int).
  3. App is launched more than 2 days after neutral button clicked. Change via AppRate#setRemindInterval(int).
  4. App shows neutral dialog(Remind me later) by default. Change via setShowLaterButton(boolean).
  5. To specify the callback when the button is pressed. The same value as the second argument of DialogInterface.OnClickListener#onClick will be passed in the argument of onClickButton.
  6. Setting AppRate#setDebug(boolean) will ensure that the rating request is shown each time the app is launched. This feature is only development!.

Clear show dialog flag

When you want to show the dialog again, call AppRate#clearAgreeShowDialog().

AppRate.with(this).clearAgreeShowDialog();

When the button presses on

call AppRate#showRateDialog(Activity).

AppRate.with(this).showRateDialog(this);

Set custom view

call AppRate#setView(View).

LayoutInflater inflater = (LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.custom_dialog, (ViewGroup)findViewById(R.id.layout_root));
AppRate.with(this).setView(view).monitor();

Custom dialog

If you want to use your own dialog labels, override string xml resources on your application.

<resources>
    <string name="rate_dialog_title">Rate this app</string>
    <string name="rate_dialog_message">If you enjoy playing this app, would you mind taking a moment to rate it? It won\'t take more than a minute. Thanks for your support!</string>
    <string name="rate_dialog_ok">Rate It Now</string>
    <string name="rate_dialog_cancel">Remind Me Later</string>
    <string name="rate_dialog_no">No, Thanks</string>
</resources>

Language

Android-Rate currently supports the following languages:

  • English
  • Czech
  • German
  • Spanish
  • Basque
  • Persian
  • French
  • Italy
  • Hebrew
  • Japanese
  • Korean
  • Polish
  • Portuguese
  • Russian
  • Turkish
  • Ukrainian
  • Vietnamese
  • Chinese

Support

Android-Rate supports API level 9 and up.

Sample

Please try to move the sample.

Contribute

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Added some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request

android-rate's People

Contributors

agap avatar amitkot avatar androhi avatar appersiano avatar bblia avatar bersh avatar bryant1410 avatar cafedeaqua avatar cinemarene avatar dyouyang avatar haijima avatar hassantafreshi avatar hoang8f avatar hotchemi avatar igzmartarodriguez avatar isso avatar itochan avatar joelbrito avatar leosimas avatar maarekj avatar mudar avatar nein37 avatar pkosiec avatar sandrocsimas avatar stgsottbauer avatar thanhbinh84 avatar tomasvalenta avatar urgas9 avatar w3z315 avatar xiprox 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

android-rate's Issues

Custom events requirements for launching rate dialog

I came across a use case while using the api in my app. Basically, I wanted the rate dialog to launch only after the user has done some thing (click a button, visit a screen, etc.) 'n' times.

Does the api have anything of this sort? Would you be willing to allow something like this in the api?

Something like

AppRate.with(this)
.setInstallDays(0) // default 10, 0 means install day.
.setLaunchTimes(3)
.setMinimumEventCount("buttonClick", 5) //"buttonClick" event has occured at lease 5 times
....

and a counter to increment the event count,

AppRate.incrementEventCount("buttonClick")

The developer could also add multiple events with different names this way to set non-trivial conditions.

Let me know if this sort of feature sounds useful to you. I can work on it for a weekend or 2 and raise a PR if you think it'll be valuable.

Crash when using your code

Dear hotchemi,

i am using your library, i used below mentioned gradle dependency.

compile 'com.github.hotchemi:android-rate:0.5.1'

& i have created a function in my activity like this :-

private void showRate(){
AppRate.with(this)
.setInstallDays(0) // default 10, 0 means install day.
.setLaunchTimes(10) // default 10 times.
.setRemindInterval(2) // default 1 day.
.setShowLaterButton(true) // default true.
.setDebug(true) // default false.
.setOnClickButtonListener(new OnClickButtonListener() { // callback listener.
@OverRide
public void onClickButton(int which) {
Log.d(WelcomeActivity.class.getName(), Integer.toString(which));
}
})
.setTitle(R.string.rate_dialog_title)
.setTextLater(R.string.rate_dialog_cancel)
.setTextNever(R.string.rate_dialog_no)
.setTextRateNow( R.string.rate_dialog_ok )
.monitor();

    AppRate.showRateDialogIfMeetsConditions(this);

}

& i am calling this function from my activity's onCreate method but when i run my activity it is giving me this exception --

java.lang.NullPointerException
at hotchemi.android.rate.DialogOptions.getView(DialogOptions.java:84)
at hotchemi.android.rate.DialogManager.create(DialogManager.java:25)
at hotchemi.android.rate.AppRate.showRateDialog(AppRate.java:161)
at hotchemi.android.rate.AppRate.showRateDialogIfMeetsConditions(AppRate.java:136)
at com.gootli.app.ui.DestinationsActivity.showRate(DestinationsActivity.java:151)

i am unable to figure out what is the problem, i have taken this code from your sample, pls help me asap.

Fix the GIF in the README

The key always clicks on "not now" and closes the example app. Can we show the rating dialog in the gif?

Runtime Exception: You need to use a Theme.AppCompat theme (or descendant) with this activity

The library crashes when attempting to show the rate dialog. The crash says:

Fatal Exception: java.lang.RuntimeException
Unable to start activity ComponentInfo{com.heartv/com.heartvApp.hearTVactivity}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.

Here's the crash report:

https://fabric.io/heartv/android/apps/com.heartv/issues/56fb1a58ffcdc042503e3436

Any ideas how I can resolve this? (My activity called hearTVactivity extends FragmentActivity.)

Use android.support.v7.app.AlertDialog instead of android.app.AlertDialog

Between honeycomb and lollipop, the AlertDialog will use the default theme instead of the AppCompat defined theme. It will basically fall back to Holo. It would be nice if the library was using android.support.v7.app.AlertDialog instead of android.app.AlertDialog and add a way to tweak the theme for all versions (it's currently locked for lollipop and above for some reason

return isLollipop() ? R.style.CustomLollipopDialogStyle : 0;
)

App Crash : in Lolipop

Hi Shintaro Katafuchi

you have done a superb work on displaying dialog, it perfectly work on lower version but when i am installing in my Phone (Asus Device : Android Lolipop v : 5.0.1) it will crash app so please help me to sort out this issue as possible as fast

the Error Log like this.

03-26 16:14:35.133: E/libEGL(26083): eglMakeCurrent start
03-26 16:14:35.228: E/libEGL(26083): eglMakeCurrent start
03-26 16:14:35.249: E/AndroidRuntime(26083): FATAL EXCEPTION: main
03-26 16:14:35.249: E/AndroidRuntime(26083): Process: com.appshub.contactsbackup.free, PID: 26083
03-26 16:14:35.249: E/AndroidRuntime(26083): java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Class java.lang.Object.getClass()' on a null object reference
03-26 16:14:35.249: E/AndroidRuntime(26083):    at android.support.v7.internal.app.WindowDecorActionBar.getDecorToolbar(WindowDecorActionBar.java:248)
03-26 16:14:35.249: E/AndroidRuntime(26083):    at android.support.v7.internal.app.WindowDecorActionBar.init(WindowDecorActionBar.java:201)
03-26 16:14:35.249: E/AndroidRuntime(26083):    at android.support.v7.internal.app.WindowDecorActionBar.<init>(WindowDecorActionBar.java:184)
03-26 16:14:35.249: E/AndroidRuntime(26083):    at android.support.v7.app.AppCompatDelegateImplV7.createSupportActionBar(AppCompatDelegateImplV7.java:176)
03-26 16:14:35.249: E/AndroidRuntime(26083):    at android.support.v7.app.AppCompatDelegateImplBase.getSupportActionBar(AppCompatDelegateImplBase.java:85)
03-26 16:14:35.249: E/AndroidRuntime(26083):    at android.support.v7.app.AppCompatDelegateImplV7.onStop(AppCompatDelegateImplV7.java:221)
03-26 16:14:35.249: E/AndroidRuntime(26083):    at android.support.v7.app.AppCompatDialog.onStop(AppCompatDialog.java:108)
03-26 16:14:35.249: E/AndroidRuntime(26083):    at android.app.Dialog.dismissDialog(Dialog.java:361)
03-26 16:14:35.249: E/AndroidRuntime(26083):    at android.app.Dialog.dismiss(Dialog.java:337)
03-26 16:14:35.249: E/AndroidRuntime(26083):    at android.support.v7.app.AlertController$ButtonHandler.handleMessage(AlertController.java:157)
03-26 16:14:35.249: E/AndroidRuntime(26083):    at android.os.Handler.dispatchMessage(Handler.java:111)
03-26 16:14:35.249: E/AndroidRuntime(26083):    at android.os.Looper.loop(Looper.java:194)
03-26 16:14:35.249: E/AndroidRuntime(26083):    at android.app.ActivityThread.main(ActivityThread.java:5631)
03-26 16:14:35.249: E/AndroidRuntime(26083):    at java.lang.reflect.Method.invoke(Native Method)
03-26 16:14:35.249: E/AndroidRuntime(26083):    at java.lang.reflect.Method.invoke(Method.java:372)
03-26 16:14:35.249: E/AndroidRuntime(26083):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)
03-26 16:14:35.249: E/AndroidRuntime(26083):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)

thanks.

Android 3未満でRateDialogを開こうとするとクラッシュする

AppRate.java

public static void showRateDialogIfMeetsConditions(Activity activity) {
    if (sIsDebug || shouldShowRateDialog()) showRateDialog(getActivityType(activity));
}

public static void passSignificantEvent(Activity activity) {
    if (sIsDebug || isOverEventsPass()) showRateDialog(getActivityType(activity));
}

public static void showRateDialog(FragmentActivity activity) {
    RateDialogSupportFragment fragment = newInstance(sIsShowNeutralButton);
    fragment.show(activity.getSupportFragmentManager(), TAG);
}

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static void showRateDialog(Activity activity) {
    RateDialogFragment fragment = RateDialogFragment.newInstance(sIsShowNeutralButton);
    fragment.show(activity.getFragmentManager(), TAG);
}

private static Activity getActivityType(Activity activity) {
    return activity instanceof FragmentActivity ? (FragmentActivity) activity : activity;
}

オーバーロードされているshowRateDialogメソッドを、getActivityTypeメソッドの戻り値によって呼び分けようとしているのだと思いますが、Javaではそれはできません。
オーバーロードの呼び分けは、静的に解決されるので、実行時にFragmentActivityであっても
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static void showRateDialog(Activity activity) {
が呼び出されてエラーになります。

Dialog button text color

For some reason dialog button text color is red and not primary color. If i remember correctly it used to work and text was colored by primary color.

Could you add an option to set buttons text color?

alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).setTextColor();
alertDialog.getButton(DialogInterface.BUTTON_NEUTRAL).setTextColor();
alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE).setTextColor();

How to know which decision user taken? I want to change the AppRate settings at runtime.

It will be nice if i can get to know what decision the user has taken.
I'm trying to do the follow:

  • Set the install days to 7;
  • When the rate dialog is displayed to user and he decided to rate later, i want to increase the remind interval to 15 days.

I think in something like this:

rateDialog = AppRate.with(this).setInstallDays(7).setCancelable(true);
if(rateDialog.isRemindLater()) {
  rateDialog.setRemindInterval(15);
} else {
  rateDialog.setRemindInterval(7);
}
// OR
if(rateDialog.getUserDecision().equals(UserDecision.REMIND_LATER)) {
  rateDialog.setRemindInterval(15);
} else {
  rateDialog.setRemindInterval(7);
}
rateDialog.monitor();

setOnClickButtonListener on all buttons

Hey,

How can I use setOnClickButtonListener on all of this feature buttons (ok, cancel)?
I want to know how many users eventually went to the store to rate the app and how many canceled.

Thanks,
Asaf

ActivityNotFoundException when "Rate" button clicked and Google Play Store isn't installed

Hi,

I found an error:
When I click on a button "Rate this app" on emulator, app crashes because of this error:

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=https://play.google.com/store/apps/details?id=... pkg=com.android.vending }

I think this kind of exception should be caught and this URL (https://play.google.com/store/apps/details?id=... ) loaded in web browser or at least user should see a toast error.

PS I found this library today, it's really neat! Thank you for creating it!

Can't change default texts

Hello. First of all, thank you very much for the library.
I'm having an issue trying to change the default texts. I override the "rate_dialog_message" but the dialog is still showing the default message. Do you know what can be happenning?
Thanks!
Maribel

Different dialog themes

First off great library! :)

I was wondering if you were going to change the style of the dialog to conform to the new Material Design dialogs. Or if you could give us a choice in the builder to choose between Holo and Material Design themes.

AppRate.with(this)
    .theme(AppRate.Theme_Holo_Dark) // or something similiar

File size increased

My App apk size was 1.38mb after using this library its became 5.4mb. Any way to reduce file size.

Buttons being shown in the vertical orientation on Marshmallow

Hi there. I'm using version 0.5.3.
It seems there is a bug with this library when using Marshmallow. The buttons for the dialog are being stacked, just like if they are in a linearlayout with the orientation set to horizontal.

Running your sample app.
device-2015-10-13-163807

onClickButton() callback may not happen always

I found that my callback for onClickButton() did not happen. I just followed what is recommended in README.

            AppRate.with(this)
                    .setDebug(BuildConfig.DEBUG)
                    .setInstallDays(5)
                    .setLaunchTimes(4)
                    .setRemindInterval(3)
                    .setShowLaterButton(true)
                    .setOnClickButtonListener(new OnClickButtonListener() {
                        @Override
                        public void onClickButton(int which) {
==>                         Log.d("Rate", "onClickButton: " + which);
                        }
                    })
                    .monitor();

「今すぐ評価する」を押したことがわかるcallbackがあると嬉しい

ソシャゲを例にすると「レビュー書いてくれたら有料アイテムをプレゼント!」とか割とあると思うので、その判断ができるような仕組みがあると嬉しいです!

実際に書いたかどうかは判断できないと思いますんで、そこは割り切ってます。ソシャゲでも「レビューする」ボタンを押せば実際に書かなくてもご褒美貰えるので。

setRemindInterval takes only time

Hi. I would like to implement method similar to setRemindInterval but it would take number of launches of the app instead of days. Name proposition is setRemindLaunchTimes. It would allow us to show the dialog again after for example next 5 launches. @hotchemi what do you think?

インスタンスはGetterを介してアクセスする

AndroidStudioのLintチェックで以下のようなWarnningが出ます。

2014-07-02 14 54 28

monitorメソッドに繋げるメソッドは、non-staticにした方がよかったのかもしれません。
ちょっと内容の割に影響範囲が広いので、「へーそうなんだ」くらいに見ていただければと思います。

Add support for custom dialog texts

Is there any possibility to add an option to set custom strings at runtime? I have translations on the server, so i cannot use strings.xml.

Thanks.

Change Theme

How can i change the theme of this dialog?

I need white background whit black title and body text. Please advise.

Add function to change dialog text

Hi, would you add a function to change the dialog details text? We can change all texts, except this one. I know i can change it using res, but i would have to create separated files (strings-pt, strings-us) just to change a single line.

Thanks in advance.

Crash reports

Hi hotchemi,

I've been receiving crash reports related to the AppRate library but for the likes of me I cannot reproduce it, nor can I figure out why it is happening, so I'm pasting below the information I have and maybe you have a recommendation.

All the information I have on the crash log:

Fatal Exception: java.lang.NullPointerException: Attempt to read from field 'boolean a.a.a.a.h' on a null object reference
       at hotchemi.android.rate.AppRate.with(Unknown Source)
       at com.app.myapp.myActivity$1$1.run(Unknown Source)
       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:5343)
       at java.lang.reflect.Method.invoke(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:372)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)

What I'm doing is, after a specific user action, I use a 1 second delay (like below) to then show the rate dialog:

Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
      // Show a dialog if meets conditions
      AppRate.showRateDialogIfMeetsConditions(myActivity.this);
    }
}, 1000);

「後でする」「いえ、結構です」しても、showRateDialogIfMeetsConditions(xxx)で、再度ダイアログが表示される

AppRate#

private static boolean isOverRemindDate() {
    return isOverDate(sRemindInterval, sRemindIntervalThreshold);
}

private static boolean shouldShowRateDialog() {
    return sIsAgreeShowDialog && isOverLaunchTimes() && isOverInstallDate() && isOverRemindDate();
}

DialogManagerでcancelもしくはnoしたときに、
PREF_KEY_REMIND_INTERVALとPREF_KEY_IS_AGREE_SHOW_DIALOGを
Preferenceに保存しているが、
その読込は起動時に呼び出すAppRate#monitor()でしかしてないので、
AppRateにPreferenceの変更が反映されていない。

もしかして、こまめにAppRate#monitor()を呼んだ方がいいのか?とも思ったんですけど、
launchTimesがインクリメントされてしまって、それは違うんだろうなと思うんで、
Preferenceの変更がAppRateに渡るようになるのが正しいのかな。

Leak memory found

I use leakcanary and see this leak:

11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: In com.my.app:1.3.1:19.
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: * com.my.app.MainActivity has leaked:
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: * GC ROOT static hotchemi.android.rate.AppRate.singleton
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: * references hotchemi.android.rate.AppRate.options
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: * references hotchemi.android.rate.DialogOptions.listener
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: * references com.my.app.MainActivity$3.this$0 (anonymous class implements hotchemi.android.rate.OnClickButtonListener)
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: * leaks com.my.app.MainActivity instance
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: * Reference Key: 75c07244-8e76-41d0-969b-c8fa9eb2558e
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: * Device: asus asus ASUS_T00J WW_a501cg
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: * Android Version: 4.4.2 API: 19 LeakCanary: 1.3.1
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: * Durations: watch=5024ms, gc=148ms, heap dump=1009ms, analysis=12724ms
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: * Details:
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: * Class hotchemi.android.rate.AppRate
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   static $staticOverhead = byte[] [id=0x43da10e1;length=24;size=40]
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   static singleton = hotchemi.android.rate.AppRate [id=0x43c25230]
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: * Instance of hotchemi.android.rate.AppRate
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   static $staticOverhead = byte[] [id=0x43da10e1;length=24;size=40]
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   static singleton = hotchemi.android.rate.AppRate [id=0x43c25230]
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   context = com.my.app.BLApplication [id=0x43a123f0]
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   options = hotchemi.android.rate.DialogOptions [id=0x43c07150]
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   installDate = 0
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   isDebug = true
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   launchTimes = 5
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   eventsTimes = -1
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   remindInterval = 5
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: * Instance of hotchemi.android.rate.DialogOptions
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   view = null
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   listener = com.my.app.MainActivity$3 [id=0x43bf6fe0]
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   messageResId = 2131099699
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   showNeutralButton = true
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   showTitle = true
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   textNegativeResId = 2131099700
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   textNeutralResId = 2131099698
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   textPositiveResId = 2131099701
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   titleResId = 2131099702
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   cancelable = false
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: * Instance of com.my.app.MainActivity$3
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   this$0 = com.my.app.MainActivity [id=0x43cd0130]
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: * Instance of com.my.app.MainActivity
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   static $staticOverhead = byte[] [id=0x440454e1;length=24;size=40]
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   static $assertionsDisabled = true
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   backButtonCallback = null
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   homeFragment = com.my.app.fragments.commons.HomeFragment [id=0x43fba7d0]
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   mSlidingMenu = com.jeremyfeinstein.slidingmenu.lib.SlidingMenu [id=0x43bed010]
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   uiHelper = com.facebook.UiLifecycleHelper [id=0x43d2f430]
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   TAG = java.lang.String [id=0x43e7c380]
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   actionbar = null
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   bundle = null
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   loadingDialog = com.my.app.abtracts.BLLoadingDialog [id=0x43d187c0]
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   numberLoadingDialog = java.util.concurrent.atomic.AtomicInteger [id=0x43f3dab0]
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   topicId = null
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   topicName = null
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   TAG = java.lang.String [id=0x43e75170]
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   activityCallback = null
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   mAllLoaderManagers = android.support.v4.util.SimpleArrayMap [id=0x43da3f60]
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   mLoaderManager = null
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   mContainer = android.support.v4.app.FragmentActivity$2 [id=0x43cc3150]
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   mHandler = android.support.v4.app.FragmentActivity$1 [id=0x43e75140]
11-29 00:20:00.645 19945-21301/com.my.app D/LeakCanary: |   mFragments = android.support.v4.app.FragmentManagerImpl [id=0x43e7c310]
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mCreated = true
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mCheckedForLoaderManager = true
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mLoadersStarted = false
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mOptionsMenuInvalidated = false
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mReallyStopped = true
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mResumed = false
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mRetaining = false
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mStopped = true
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mActionBar = null
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mActivityInfo = android.content.pm.ActivityInfo [id=0x43e51510]
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mAllLoaderManagers = android.util.ArrayMap [id=0x43d4a0e0]
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mApplication = com.my.app.BLApplication [id=0x43a123f0]
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mWindowManager = android.view.WindowManagerImpl [id=0x43da53e0]
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mWindow = com.android.internal.policy.impl.PhoneWindow [id=0x43ee0d80]
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mUiThread = java.lang.Thread [id=0x430f4340]
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mTranslucentCallback = null
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mComponent = android.content.ComponentName [id=0x439fe320]
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mToken = android.os.BinderProxy [id=0x439fe2c0]
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mContainer = android.app.Activity$1 [id=0x43e6f1e0]
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mCurrentConfig = android.content.res.Configuration [id=0x43edc8e0]
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mDecor = null
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mTitle = java.lang.String [id=0x43a53a00]
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mDefaultKeySsb = null
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mSearchManager = null
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mResultData = null
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mParent = null
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mEmbeddedID = null
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mMenuInflater = null
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mManagedDialogs = null
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mFragments = android.app.FragmentManagerImpl [id=0x43e75060]
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mHandler = android.os.Handler [id=0x43e75120]
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mManagedCursors = java.util.ArrayList [id=0x43e750d0]
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mInstanceTracker = android.os.StrictMode$InstanceTracker [id=0x43e16f60]
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mInstrumentation = android.app.Instrumentation [id=0x43a10c00]
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mIntent = android.content.Intent [id=0x43a07970]
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mLastNonConfigurationInstances = null
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mLoaderManager = null
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mMainThread = android.app.ActivityThread [id=0x43a0cf90]
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mLoadersStarted = false
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mIdent = 582202416
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mFinished = true
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mEnableDefaultActionBarUp = false
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mDoReportFullyDrawn = false
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mResultCode = 0
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mDisplayId = 0
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mResumed = false
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mDestroyed = true
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mStartedActivity = false
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mStopped = true
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mTemporaryPause = false
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mDefaultKeyMode = 0
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mTitleColor = 0
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mTitleReady = true
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mConfigChangeFlags = 0
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mCheckedForLoaderManager = true
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mChangingConfigurations = false
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mVisibleFromClient = true
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mVisibleFromServer = true
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mChangeCanvasToTranslucent = false
11-29 00:20:00.655 19945-21301/com.my.app D/LeakCanary: |   mWindowAdded = true
11-29 00:20:00.665 19945-21301/com.my.app D/LeakCanary: |   mCalled = true
11-29 00:20:00.665 19945-21301/com.my.app D/LeakCanary: |   mBase = android.app.ContextImpl [id=0x43e7c3a0]
11-29 00:20:00.665 19945-21301/com.my.app D/LeakCanary: |   mInflater = com.android.internal.policy.impl.PhoneLayoutInflater [id=0x43f1edb0]
11-29 00:20:00.665 19945-21301/com.my.app D/LeakCanary: |   mOverrideConfiguration = null
11-29 00:20:00.665 19945-21301/com.my.app D/LeakCanary: |   mResources = android.content.res.Resources [id=0x43a0fe40]
11-29 00:20:00.665 19945-21301/com.my.app D/LeakCanary: |   mTheme = android.content.res.Resources$Theme [id=0x43da5400]
11-29 00:20:00.665 19945-21301/com.my.app D/LeakCanary: |   mThemeResource = 2131230843
11-29 00:20:00.665 19945-21301/com.my.app D/LeakCanary: |   mBase = android.app.ContextImpl [id=0x43e7c3a0]

setDialogStyle shows "Cannot resolve symbol"

Hi,
I want a customized theme but the setDialogStyle is not working anymore? Is the feature removed now or something? If so then can you please tell me how I can have my customize theme.

Source:
#85

java.lang.NullPointerException: Attempt to invoke virtual method...

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object java.lang.ref.Reference.get()' on a null object reference

MainActivity

@Override
onCreate()...
{
...
        //RateApp
        AppRate.with(this)
                .setInstallDays(2) // default 10, 0 means install day.
                .setLaunchTimes(2)
                .setRemindInterval(2) // default 1
                .setShowLaterButton(true) // default true
                .setTitle(R.string.support_me)
                .setMessage(R.string.support_message)
                .setTextLater(R.string.support_later)
                .setTextNever(R.string.support_no)
                .setTextRateNow(R.string.support_now)
                .monitor();
}

@Override
onResume{
...
AppRate.showRateDialogIfMeetsConditions(this);
}

Exception's log

java.lang.RuntimeException: Unable to resume activity {com.r400.ultra.free.rwallpapers/com.r400.ultra.free.rwallpapers.activity.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object java.lang.ref.Reference.get()' on a null object reference
                                                                                   at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3050)
                                                                                   at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3081)
                                                                                   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2447)
                                                                                   at android.app.ActivityThread.access$800(ActivityThread.java:156)
                                                                                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1351)
                                                                                   at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                   at android.os.Looper.loop(Looper.java:211)
                                                                                   at android.app.ActivityThread.main(ActivityThread.java:5389)
                                                                                   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:1020)
                                                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)
                                                                                Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object java.lang.ref.Reference.get()' on a null object reference
                                                                                   at hotchemi.android.rate.DialogOptions.getListener(DialogOptions.java:136)
                                                                                   at hotchemi.android.rate.DialogManager.create(DialogManager.java:32)
                                                                                   at hotchemi.android.rate.AppRate.showRateDialog(AppRate.java:190)
                                                                                   at hotchemi.android.rate.AppRate.showRateDialogIfMeetsConditions(AppRate.java:51)
                                                                                   at com.r400.ultra.free.rwallpapers.activity.MainActivity.onResume(MainActivity.java:285)
                                                                                   at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1257)
                                                                                   at android.app.Activity.performResume(Activity.java:6076)
                                                                                   at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3039)
                                                                                   at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3081) 
                                                                                   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2447) 
                                                                                   at android.app.ActivityThread.access$800(ActivityThread.java:156) 
                                                                                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1351) 
                                                                                   at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                                   at android.os.Looper.loop(Looper.java:211) 
                                                                                   at android.app.ActivityThread.main(ActivityThread.java:5389) 
                                                                                   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:1020) 
                                                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815) 

Please, help

After Changing to BuildVersion and API23

after Changing to BuildVersion and API23
23.0.1

I get following error after compiling:
Error:(248, 17) error: cannot find symbol method setShowNeutralButton(boolean)

unbenannt

Using 2 RateMe dialogs at same time?

Hi, I wish to have one "Rate Me" dialog and one periodic "Update to Pro". The implementation uses a singleton so i'm not sure - is it possible??

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.