Files
FairEmail/app/src/main/java/eu/faircode/email/TwoStateOwner.java

102 lines
2.8 KiB
Java
Raw Normal View History

2019-03-06 16:36:20 +00:00
package eu.faircode.email;
2019-03-30 16:09:06 +01:00
import android.os.Handler;
import android.os.Looper;
2019-03-06 16:36:20 +00:00
import androidx.annotation.NonNull;
import androidx.lifecycle.Lifecycle;
2019-03-17 20:31:24 +00:00
import androidx.lifecycle.LifecycleObserver;
2019-03-06 16:36:20 +00:00
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LifecycleRegistry;
2019-03-17 20:31:24 +00:00
import androidx.lifecycle.OnLifecycleEvent;
2019-03-06 16:36:20 +00:00
public class TwoStateOwner implements LifecycleOwner {
2019-03-27 13:24:58 +00:00
private String name;
2019-03-06 16:36:20 +00:00
private LifecycleRegistry registry;
2019-03-30 16:09:06 +01:00
private Handler handler;
2019-03-06 16:36:20 +00:00
2019-03-27 12:27:51 +00:00
// https://developer.android.com/topic/libraries/architecture/lifecycle#lc
2019-03-27 13:24:58 +00:00
TwoStateOwner(String aname) {
name = aname;
2019-03-30 16:09:06 +01:00
// Initialize
2019-03-06 16:36:20 +00:00
registry = new LifecycleRegistry(this);
2019-03-30 16:09:06 +01:00
handler = new Handler(Looper.getMainLooper());
transition(Lifecycle.State.CREATED);
2019-03-27 13:24:58 +00:00
// Logging
2019-03-27 13:24:58 +00:00
registry.addObserver(new LifecycleObserver() {
@OnLifecycleEvent(Lifecycle.Event.ON_ANY)
public void onAny() {
if (BuildConfig.DEBUG)
Log.i("LifeCycle " + name + " state=" + registry.getCurrentState());
}
});
2019-03-06 16:36:20 +00:00
}
2019-03-27 13:24:58 +00:00
TwoStateOwner(LifecycleOwner owner, String aname) {
this(aname);
// Destroy when parent destroyed
2019-03-17 20:31:24 +00:00
owner.getLifecycle().addObserver(new LifecycleObserver() {
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroyed() {
2019-03-27 13:24:58 +00:00
if (BuildConfig.DEBUG)
Log.i("LifeCycle " + name + " parent destroyed");
2019-03-25 19:20:23 +00:00
destroy();
2019-03-17 20:31:24 +00:00
}
});
}
2019-03-06 16:36:20 +00:00
void start() {
2019-03-30 16:09:06 +01:00
transition(Lifecycle.State.STARTED);
2019-03-06 16:36:20 +00:00
}
void stop() {
2019-03-30 16:09:06 +01:00
transition(Lifecycle.State.CREATED);
2019-03-06 16:36:20 +00:00
}
2019-03-17 20:31:24 +00:00
void restart() {
2019-03-25 19:20:23 +00:00
stop();
2019-03-17 20:31:24 +00:00
start();
}
2019-03-25 19:20:23 +00:00
void destroy() {
2019-03-30 16:09:06 +01:00
if (Looper.myLooper() == Looper.getMainLooper())
_destroy();
else
handler.post(new Runnable() {
@Override
public void run() {
_destroy();
}
});
}
void _destroy() {
Lifecycle.State state = registry.getCurrentState();
2019-03-30 16:09:06 +01:00
if (!state.equals(Lifecycle.State.CREATED))
registry.markState(Lifecycle.State.CREATED);
if (!state.equals(Lifecycle.State.DESTROYED))
2019-03-30 16:09:06 +01:00
registry.markState(Lifecycle.State.DESTROYED);
}
private void transition(final Lifecycle.State state) {
if (Looper.myLooper() == Looper.getMainLooper())
registry.markState(state);
else
handler.post(new Runnable() {
@Override
public void run() {
registry.markState(state);
}
});
2019-03-25 19:20:23 +00:00
}
2019-03-06 16:36:20 +00:00
@NonNull
@Override
public Lifecycle getLifecycle() {
return registry;
}
}