static void nativeSetTransparentRegionHint(JNIEnv* env, jclass clazz, jlong nativeObject, jobject regionObj) { SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject); SkRegion* region = android_graphics_Region_getSkRegion(env, regionObj); if (!region) { doThrowIAE(env); return; } const SkIRect& b(region->getBounds()); Region reg(Rect(b.fLeft, b.fTop, b.fRight, b.fBottom)); if (region->isComplex()) { SkRegion::Iterator it(*region); while (!it.done()) { const SkIRect& r(it.rect()); reg.addRectUnchecked(r.fLeft, r.fTop, r.fRight, r.fBottom); it.next(); } } status_t err = ctrl->setTransparentRegionHint(reg); if (err < 0 && err != NO_INIT) { doThrowIAE(env); } }
bool NativeInputWindowHandle::updateInfo() { JNIEnv* env = AndroidRuntime::getJNIEnv(); jobject obj = env->NewLocalRef(mObjWeak); if (!obj) { releaseInfo(); return false; } if (!mInfo) { mInfo = new InputWindowInfo(); } jobject inputChannelObj = env->GetObjectField(obj, gInputWindowHandleClassInfo.inputChannel); if (inputChannelObj) { mInfo->inputChannel = android_view_InputChannel_getInputChannel(env, inputChannelObj); env->DeleteLocalRef(inputChannelObj); } else { mInfo->inputChannel.clear(); } jstring nameObj = jstring(env->GetObjectField(obj, gInputWindowHandleClassInfo.name)); if (nameObj) { const char* nameStr = env->GetStringUTFChars(nameObj, NULL); mInfo->name.setTo(nameStr); env->ReleaseStringUTFChars(nameObj, nameStr); env->DeleteLocalRef(nameObj); } else { mInfo->name.setTo("<null>"); } mInfo->layoutParamsFlags = env->GetIntField(obj, gInputWindowHandleClassInfo.layoutParamsFlags); mInfo->layoutParamsPrivateFlags = env->GetIntField(obj, gInputWindowHandleClassInfo.layoutParamsPrivateFlags); mInfo->layoutParamsType = env->GetIntField(obj, gInputWindowHandleClassInfo.layoutParamsType); mInfo->dispatchingTimeout = env->GetLongField(obj, gInputWindowHandleClassInfo.dispatchingTimeoutNanos); mInfo->frameLeft = env->GetIntField(obj, gInputWindowHandleClassInfo.frameLeft); mInfo->frameTop = env->GetIntField(obj, gInputWindowHandleClassInfo.frameTop); mInfo->frameRight = env->GetIntField(obj, gInputWindowHandleClassInfo.frameRight); mInfo->frameBottom = env->GetIntField(obj, gInputWindowHandleClassInfo.frameBottom); mInfo->scaleFactor = env->GetFloatField(obj, gInputWindowHandleClassInfo.scaleFactor); jobject regionObj = env->GetObjectField(obj, gInputWindowHandleClassInfo.touchableRegion); if (regionObj) { SkRegion* region = android_graphics_Region_getSkRegion(env, regionObj); mInfo->touchableRegion.set(*region); env->DeleteLocalRef(regionObj); } else { mInfo->touchableRegion.setEmpty(); } mInfo->visible = env->GetBooleanField(obj, gInputWindowHandleClassInfo.visible); mInfo->canReceiveKeys = env->GetBooleanField(obj, gInputWindowHandleClassInfo.canReceiveKeys); mInfo->hasFocus = env->GetBooleanField(obj, gInputWindowHandleClassInfo.hasFocus); mInfo->hasWallpaper = env->GetBooleanField(obj, gInputWindowHandleClassInfo.hasWallpaper); mInfo->paused = env->GetBooleanField(obj, gInputWindowHandleClassInfo.paused); mInfo->layer = env->GetIntField(obj, gInputWindowHandleClassInfo.layer); mInfo->ownerPid = env->GetIntField(obj, gInputWindowHandleClassInfo.ownerPid); mInfo->ownerUid = env->GetIntField(obj, gInputWindowHandleClassInfo.ownerUid); mInfo->inputFeatures = env->GetIntField(obj, gInputWindowHandleClassInfo.inputFeatures); mInfo->displayId = env->GetIntField(obj, gInputWindowHandleClassInfo.displayId); env->DeleteLocalRef(obj); return true; }