2019-07-01 14:27:22 +00:00
|
|
|
package eu.faircode.email;
|
|
|
|
|
2019-10-05 14:09:52 +00:00
|
|
|
import android.content.ActivityNotFoundException;
|
2019-07-01 14:27:22 +00:00
|
|
|
import android.content.DialogInterface;
|
|
|
|
import android.content.Intent;
|
2019-08-21 12:01:00 +00:00
|
|
|
import android.os.Bundle;
|
2019-10-05 14:09:52 +00:00
|
|
|
import android.widget.Toast;
|
2019-07-01 14:27:22 +00:00
|
|
|
|
|
|
|
import androidx.annotation.NonNull;
|
2019-08-04 07:37:46 +00:00
|
|
|
import androidx.annotation.Nullable;
|
2019-07-01 14:27:22 +00:00
|
|
|
import androidx.fragment.app.DialogFragment;
|
|
|
|
import androidx.fragment.app.Fragment;
|
2019-08-04 07:37:46 +00:00
|
|
|
import androidx.fragment.app.FragmentManager;
|
2019-08-21 12:01:00 +00:00
|
|
|
import androidx.lifecycle.Lifecycle;
|
|
|
|
import androidx.lifecycle.LifecycleObserver;
|
2019-09-11 12:03:59 +00:00
|
|
|
import androidx.lifecycle.LifecycleOwner;
|
|
|
|
import androidx.lifecycle.LifecycleRegistry;
|
2019-08-21 12:01:00 +00:00
|
|
|
import androidx.lifecycle.OnLifecycleEvent;
|
2019-07-01 14:27:22 +00:00
|
|
|
|
|
|
|
import static android.app.Activity.RESULT_CANCELED;
|
|
|
|
|
2019-09-11 19:43:27 +00:00
|
|
|
public class FragmentDialogBase extends DialogFragment {
|
2019-07-01 14:46:40 +00:00
|
|
|
private boolean once = false;
|
2019-09-11 12:03:59 +00:00
|
|
|
private LifecycleOwner owner;
|
|
|
|
private LifecycleRegistry registry;
|
2019-07-01 14:46:40 +00:00
|
|
|
|
2019-08-21 12:01:00 +00:00
|
|
|
@Override
|
|
|
|
public void onCreate(@Nullable Bundle savedInstanceState) {
|
|
|
|
super.onCreate(savedInstanceState);
|
2019-09-11 12:03:59 +00:00
|
|
|
owner = new LifecycleOwner() {
|
|
|
|
@NonNull
|
|
|
|
@Override
|
|
|
|
public Lifecycle getLifecycle() {
|
|
|
|
return registry;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
registry = new LifecycleRegistry(owner);
|
|
|
|
registry.setCurrentState(Lifecycle.State.CREATED);
|
2019-08-21 12:01:00 +00:00
|
|
|
Log.i("Create " + this);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onResume() {
|
2019-09-11 12:03:59 +00:00
|
|
|
registry.setCurrentState(Lifecycle.State.RESUMED);
|
2019-08-21 12:01:00 +00:00
|
|
|
super.onResume();
|
|
|
|
Log.i("Resume " + this);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onPause() {
|
2019-09-11 12:03:59 +00:00
|
|
|
registry.setCurrentState(Lifecycle.State.STARTED);
|
2019-08-21 12:01:00 +00:00
|
|
|
super.onPause();
|
|
|
|
Log.i("Pause " + this);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onDestroy() {
|
2019-09-11 12:03:59 +00:00
|
|
|
registry.setCurrentState(Lifecycle.State.DESTROYED);
|
2019-08-21 12:01:00 +00:00
|
|
|
super.onDestroy();
|
|
|
|
Log.i("Destroy " + this);
|
|
|
|
}
|
|
|
|
|
2019-07-05 18:54:07 +00:00
|
|
|
@Override
|
|
|
|
public void onStart() {
|
2019-09-11 12:03:59 +00:00
|
|
|
registry.setCurrentState(Lifecycle.State.STARTED);
|
2019-07-05 18:54:07 +00:00
|
|
|
try {
|
|
|
|
super.onStart();
|
|
|
|
} catch (Throwable ex) {
|
|
|
|
Log.e(ex);
|
|
|
|
}
|
2019-09-11 12:03:59 +00:00
|
|
|
Log.i("Start " + this);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onStop() {
|
|
|
|
registry.setCurrentState(Lifecycle.State.CREATED);
|
|
|
|
super.onStop();
|
|
|
|
Log.i("Stop " + this);
|
|
|
|
}
|
|
|
|
|
2019-09-11 17:32:17 +00:00
|
|
|
@Override
|
|
|
|
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
|
2019-10-08 08:48:31 +00:00
|
|
|
String action = (data == null ? null : data.getAction());
|
2019-09-11 17:32:17 +00:00
|
|
|
Log.i("Result class=" + this.getClass().getSimpleName() +
|
2019-10-08 08:48:31 +00:00
|
|
|
" action=" + action + " request=" + requestCode + " result=" + resultCode);
|
2019-09-11 17:32:17 +00:00
|
|
|
Log.logExtras(data);
|
|
|
|
super.onActivityResult(requestCode, resultCode, data);
|
|
|
|
}
|
|
|
|
|
2019-09-11 12:03:59 +00:00
|
|
|
@NonNull
|
|
|
|
@Override
|
|
|
|
public LifecycleOwner getViewLifecycleOwner() {
|
|
|
|
return owner;
|
2019-07-05 18:54:07 +00:00
|
|
|
}
|
|
|
|
|
2019-08-04 07:37:46 +00:00
|
|
|
@Override
|
|
|
|
public void show(@NonNull FragmentManager manager, @Nullable String tag) {
|
|
|
|
try {
|
|
|
|
super.show(manager, tag);
|
2019-08-04 18:00:20 +00:00
|
|
|
} catch (Throwable ex) {
|
|
|
|
// IllegalStateException Can not perform this action after onSaveInstanceState
|
2019-08-04 07:37:46 +00:00
|
|
|
// Should not happen, but still happened in AdapterMessage.onOpenLink
|
2019-08-04 18:00:20 +00:00
|
|
|
Log.e(ex);
|
2019-08-04 07:37:46 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-07-01 14:27:22 +00:00
|
|
|
@Override
|
|
|
|
public void onDismiss(@NonNull DialogInterface dialog) {
|
|
|
|
sendResult(RESULT_CANCELED);
|
2019-07-01 19:22:57 +00:00
|
|
|
super.onDismiss(dialog);
|
2019-07-01 14:27:22 +00:00
|
|
|
}
|
|
|
|
|
2019-08-21 12:01:00 +00:00
|
|
|
@Override
|
|
|
|
public void setTargetFragment(@Nullable Fragment fragment, int requestCode) {
|
|
|
|
super.setTargetFragment(fragment, requestCode);
|
|
|
|
Log.i("Set target " + this + " " + fragment);
|
|
|
|
|
2019-09-11 12:03:59 +00:00
|
|
|
fragment.getViewLifecycleOwner().getLifecycle().addObserver(new LifecycleObserver() {
|
|
|
|
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
|
|
|
|
public void onDestroy() {
|
2019-09-11 19:43:27 +00:00
|
|
|
Log.i("Reset target " + FragmentDialogBase.this);
|
|
|
|
FragmentDialogBase.super.setTargetFragment(null, requestCode);
|
2019-09-11 12:03:59 +00:00
|
|
|
}
|
|
|
|
});
|
2019-08-21 12:01:00 +00:00
|
|
|
}
|
|
|
|
|
2019-07-01 14:27:22 +00:00
|
|
|
protected void sendResult(int result) {
|
2019-07-01 14:46:40 +00:00
|
|
|
if (!once) {
|
|
|
|
once = true;
|
|
|
|
Fragment target = getTargetFragment();
|
|
|
|
Log.i("Dialog target=" + target + " result=" + result);
|
|
|
|
if (target != null) {
|
|
|
|
Intent data = new Intent();
|
|
|
|
data.putExtra("args", getArguments());
|
|
|
|
target.onActivityResult(getTargetRequestCode(), result, data);
|
|
|
|
}
|
2019-07-01 14:27:22 +00:00
|
|
|
}
|
|
|
|
}
|
2019-07-11 05:41:20 +00:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public void startActivity(Intent intent) {
|
2019-10-05 14:09:52 +00:00
|
|
|
try {
|
|
|
|
super.startActivity(intent);
|
|
|
|
} catch (ActivityNotFoundException ex) {
|
|
|
|
Log.e(ex);
|
|
|
|
ToastEx.makeText(getContext(), getString(R.string.title_no_viewer, intent.getAction()), Toast.LENGTH_LONG).show();
|
|
|
|
}
|
2019-07-11 05:41:20 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void startActivityForResult(Intent intent, int requestCode) {
|
2019-10-05 14:09:52 +00:00
|
|
|
try {
|
|
|
|
super.startActivityForResult(intent, requestCode);
|
|
|
|
} catch (ActivityNotFoundException ex) {
|
|
|
|
Log.e(ex);
|
|
|
|
ToastEx.makeText(getContext(), getString(R.string.title_no_viewer, intent.getAction()), Toast.LENGTH_LONG).show();
|
|
|
|
}
|
2019-07-11 05:41:20 +00:00
|
|
|
}
|
2019-07-01 14:27:22 +00:00
|
|
|
}
|