diff --git a/lib/src/main/java/com/tbruyelle/rxpermissions/EnsureSameProcessActivity.java b/lib/src/main/java/com/tbruyelle/rxpermissions/EnsureSameProcessActivity.java new file mode 100644 index 0000000..75caf1a --- /dev/null +++ b/lib/src/main/java/com/tbruyelle/rxpermissions/EnsureSameProcessActivity.java @@ -0,0 +1,43 @@ +package com.tbruyelle.rxpermissions; + +import android.app.Activity; +import android.os.Bundle; +import android.os.Process; + +/** + * In case of restore, ensures it's done by the same process, if not, kill self. + *

+ * The goal is to prevent a crash when the activity is restored during a permission request + * but by another process. In that specific case the library is not able to restore the observable + * chain. This is a hack to prevent the crash, not a fix. + *

+ * See https://github.com/tbruyelle/RxPermissions/issues/46. + */ +public abstract class EnsureSameProcessActivity extends Activity { + private static final String KEY_ORIGINAL_PID = "key_original_pid"; + + private int mOriginalProcessId; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (savedInstanceState == null) { + mOriginalProcessId = Process.myPid(); + } else { + mOriginalProcessId = savedInstanceState.getInt(KEY_ORIGINAL_PID, mOriginalProcessId); + + boolean restoredInAnotherProcess = mOriginalProcessId != Process.myPid(); + + if (restoredInAnotherProcess) { + finish(); + } + } + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + + outState.putInt(KEY_ORIGINAL_PID, mOriginalProcessId); + } +} diff --git a/lib/src/main/java/com/tbruyelle/rxpermissions/ShadowActivity.java b/lib/src/main/java/com/tbruyelle/rxpermissions/ShadowActivity.java index f7e976b..f1c8253 100644 --- a/lib/src/main/java/com/tbruyelle/rxpermissions/ShadowActivity.java +++ b/lib/src/main/java/com/tbruyelle/rxpermissions/ShadowActivity.java @@ -8,26 +8,12 @@ import android.os.Process; @TargetApi(Build.VERSION_CODES.M) -public class ShadowActivity extends Activity { - private static final String KEY_ORIGINAL_PID = "key_original_pid"; - - private int mOriginalProcessId; - +public class ShadowActivity extends EnsureSameProcessActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState == null) { handleIntent(getIntent()); - - mOriginalProcessId = Process.myPid(); - } else { - mOriginalProcessId = savedInstanceState.getInt(KEY_ORIGINAL_PID, mOriginalProcessId); - - boolean restoredInAnotherProcess = mOriginalProcessId != Process.myPid(); - - if(restoredInAnotherProcess) { - finish(); - } } } @@ -46,11 +32,4 @@ public void onRequestPermissionsResult(int requestCode, String[] permissions, in RxPermissions.getInstance(this).onRequestPermissionsResult(requestCode, permissions, grantResults); finish(); } - - @Override - protected void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - - outState.putInt(KEY_ORIGINAL_PID, mOriginalProcessId); - } }