package cm.android.framework.server;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import java.lang.reflect.Constructor;
import java.util.concurrent.atomic.AtomicBoolean;
import cm.android.framework.client.core.LogUtil;
import cm.android.framework.component.IBinderServer;
import cm.java.util.Utils;
public final class BinderServerAgent {
private IBinderServer binderServer;
private static final IBinderServer defServer = new IBinderServer() {
@Override
public void onCreate(Context context) {
LogUtil.getLogger().error("BinderServerAgent:defServer.onCreate");
}
@Override
public void onDestroy() {
LogUtil.getLogger().error("BinderServerAgent:defServer.onDestroy");
}
@Override
public boolean isActive(Context context) {
LogUtil.getLogger().error("BinderServerAgent:defServer.isActive:context = {}", context);
return false;
}
};
private final AtomicBoolean create = new AtomicBoolean(false);
private String serverName;
private final Bundle bundle = new Bundle();
public void attach(String serverName) {
this.serverName = serverName;
}
public synchronized IBinderServer getServer() {
if (binderServer == null) {
binderServer = createBinderServer(serverName);
}
if (binderServer == null) {
return defServer;
} else {
return binderServer;
}
}
private IBinderServer createBinderServer(String serverName) {
LogUtil.getLogger().info("serverName = {},binderServer = {}", serverName, binderServer);
if (Utils.isEmpty(serverName)) {
return null;
}
try {
Class klass = Class.forName(serverName);
Constructor constructor = klass.getDeclaredConstructor();
constructor.setAccessible(true);
IBinderServer server = (IBinderServer) constructor.newInstance();
LogUtil.getLogger().info("constructor:binderServer = {}", server);
return server;
} catch (Exception e) {
LogUtil.getLogger().error(e.getMessage());
return null;
}
}
public synchronized void create(Context context) {
LogUtil.getLogger().info("create:create = {},binderServer = {}", create.get(), binderServer);
if (create.get()) {
return;
}
try {
getServer().onCreate(context);
LogUtil.getLogger().info("getServer().onCreate():success");
} finally {
create.set(true);
}
}
public synchronized void destroy() {
LogUtil.getLogger().info("destroy:create = {},binderServer = {}", create.get(), binderServer);
if (!create.get()) {
return;
}
try {
getServer().onDestroy();
LogUtil.getLogger().info("getServer().onDestroy():success");
} finally {
create.set(false);
}
}
public synchronized boolean isActive(Context context) {
boolean createBoolean = create.get();
boolean isActive = getServer().isActive(context);
LogUtil.getLogger().info("createBoolean = {},isActive = {}", createBoolean, isActive);
return createBoolean && isActive;
}
public synchronized Bundle getBundle(String key) {
return bundle.getBundle(key);
}
public synchronized void putBundle(String key, Bundle bundle) {
this.bundle.putBundle(key, bundle);
}
public synchronized void restore(final Context context) {
if (getServer().isActive(context)) {
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
create(context);
}
});
}
}
}