package android.media;
import dalvik.system.CloseGuard;
import android.os.Handler;
import android.view.Surface;
public final class RemoteDisplay {
public static final int DISPLAY_FLAG_SECURE = 1 << 0;
public static final int DISPLAY_ERROR_UNKOWN = 1;
public static final int DISPLAY_ERROR_CONNECTION_DROPPED = 2;
private final CloseGuard mGuard = CloseGuard.get();
private final Listener mListener;
private final Handler mHandler;
private final String mOpPackageName;
private long mPtr;
private native long nativeListen(String iface, String opPackageName);
private native void nativeDispose(long ptr);
private native void nativePause(long ptr);
private native void nativeResume(long ptr);
private RemoteDisplay(Listener listener, Handler handler, String opPackageName) {
mListener = listener;
mHandler = handler;
mOpPackageName = opPackageName;
}
@Override
protected void finalize() throws Throwable {
try {
dispose(true);
} finally {
super.finalize();
}
}
public static RemoteDisplay listen(String iface, Listener listener, Handler handler,
String opPackageName) {
if (iface == null) {
throw new IllegalArgumentException("iface must not be null");
}
if (listener == null) {
throw new IllegalArgumentException("listener must not be null");
}
if (handler == null) {
throw new IllegalArgumentException("handler must not be null");
}
RemoteDisplay display = new RemoteDisplay(listener, handler, opPackageName);
display.startListening(iface);
return display;
}
public void dispose() {
dispose(false);
}
public void pause() {
nativePause(mPtr);
}
public void resume() {
nativeResume(mPtr);
}
private void dispose(boolean finalized) {
if (mPtr != 0) {
if (mGuard != null) {
if (finalized) {
mGuard.warnIfOpen();
} else {
mGuard.close();
}
}
nativeDispose(mPtr);
mPtr = 0;
}
}
private void startListening(String iface) {
mPtr = nativeListen(iface, mOpPackageName);
if (mPtr == 0) {
throw new IllegalStateException("Could not start listening for "
+ "remote display connection on \"" + iface + "\"");
}
mGuard.open("dispose");
}
private void notifyDisplayConnected(final Surface surface,
final int width, final int height, final int flags, final int session) {
mHandler.post(new Runnable() {
@Override
public void run() {
mListener.onDisplayConnected(surface, width, height, flags, session);
}
});
}
private void notifyDisplayDisconnected() {
mHandler.post(new Runnable() {
@Override
public void run() {
mListener.onDisplayDisconnected();
}
});
}
private void notifyDisplayError(final int error) {
mHandler.post(new Runnable() {
@Override
public void run() {
mListener.onDisplayError(error);
}
});
}
public interface Listener {
void onDisplayConnected(Surface surface,
int width, int height, int flags, int session);
void onDisplayDisconnected();
void onDisplayError(int error);
}
}