package jp.co.cyberagent.stf.query;
import android.content.Context;
import android.hardware.display.DisplayManager;
import android.os.Build;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.Surface;
import com.google.protobuf.GeneratedMessageLite;
import com.google.protobuf.InvalidProtocolBufferException;
import jp.co.cyberagent.stf.proto.Wire;
public class GetDisplayResponder extends AbstractResponder {
public GetDisplayResponder(Context context) {
super(context);
}
@Override
public GeneratedMessageLite respond(Wire.Envelope envelope) throws InvalidProtocolBufferException {
Wire.GetDisplayRequest request =
Wire.GetDisplayRequest.parseFrom(envelope.getMessage());
if (Build.VERSION.SDK_INT >= 17) {
DisplayManager dm = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
Display display = dm.getDisplay(request.getId());
DisplayMetrics real = new DisplayMetrics();
display.getRealMetrics(real);
// DisplayMetrics is adjusted for rotation, so we have to swap it back if
// necessary.
int rotation = display.getRotation();
if (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270)
{
return Wire.Envelope.newBuilder()
.setId(envelope.getId())
.setType(Wire.MessageType.GET_DISPLAY)
.setMessage(Wire.GetDisplayResponse.newBuilder()
.setSuccess(true)
.setWidth(real.heightPixels)
.setHeight(real.widthPixels)
.setXdpi(real.ydpi)
.setYdpi(real.xdpi)
.setFps(display.getRefreshRate())
.setDensity(real.density)
.setRotation(rotationToDegrees(rotation))
.setSecure((display.getFlags() & Display.FLAG_SECURE) == Display.FLAG_SECURE)
.build()
.toByteString())
.build();
}
else {
return Wire.Envelope.newBuilder()
.setId(envelope.getId())
.setType(Wire.MessageType.GET_DISPLAY)
.setMessage(Wire.GetDisplayResponse.newBuilder()
.setSuccess(true)
.setWidth(real.widthPixels)
.setHeight(real.heightPixels)
.setXdpi(real.xdpi)
.setYdpi(real.ydpi)
.setFps(display.getRefreshRate())
.setDensity(real.density)
.setRotation(rotationToDegrees(rotation))
.setSecure((display.getFlags() & Display.FLAG_SECURE) == Display.FLAG_SECURE)
.build()
.toByteString())
.build();
}
}
else {
return Wire.Envelope.newBuilder()
.setId(envelope.getId())
.setType(Wire.MessageType.GET_DISPLAY)
.setMessage(Wire.GetDisplayResponse.newBuilder()
.setSuccess(false)
.build()
.toByteString())
.build();
}
}
private int rotationToDegrees(int rotation) {
switch (rotation) {
case Surface.ROTATION_0:
return 0;
case Surface.ROTATION_90:
return 90;
case Surface.ROTATION_180:
return 180;
case Surface.ROTATION_270:
return 270;
default:
return -1;
}
}
@Override
public void cleanup() {
// No-op
}
}