// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.ui.base;
import android.view.View;
import org.chromium.base.JNINamespace;
/**
* From the Chromium architecture point of view, ViewAndroid and its native counterpart
* serve purpose of representing Android view where Chrome expects to have a cross platform
* handle to the system view type. As Views are Java object on Android, this ViewAndroid
* and its native counterpart provide the expected abstractions on the C++ side and allow
* it to be flexibly glued to an actual Android Java View at runtime.
*
* It should only be used where access to Android Views is needed from the C++ code.
*/
@JNINamespace("ui")
public class ViewAndroid {
// Native pointer to the c++ ViewAndroid object.
private long mNativeViewAndroid = 0;
private final ViewAndroidDelegate mViewAndroidDelegate;
private final WindowAndroid mWindowAndroid;
private int mKeepScreenOnCount;
private View mKeepScreenOnView;
/**
* Constructs a View object.
*/
public ViewAndroid(WindowAndroid nativeWindow, ViewAndroidDelegate viewAndroidDelegate) {
mWindowAndroid = nativeWindow;
mViewAndroidDelegate = viewAndroidDelegate;
mNativeViewAndroid = nativeInit(mWindowAndroid.getNativePointer());
}
public ViewAndroidDelegate getViewAndroidDelegate() {
return mViewAndroidDelegate;
}
/**
* Destroys the c++ ViewAndroid object if one has been created.
*/
public void destroy() {
if (mNativeViewAndroid != 0) {
nativeDestroy(mNativeViewAndroid);
mNativeViewAndroid = 0;
}
}
/**
* Returns a pointer to the c++ AndroidWindow object.
* @return A pointer to the c++ AndroidWindow.
*/
public long getNativePointer() {
return mNativeViewAndroid;
}
/**
* Set KeepScreenOn flag. If the flag already set, increase mKeepScreenOnCount.
*/
public void incrementKeepScreenOnCount() {
mKeepScreenOnCount++;
if (mKeepScreenOnCount == 1) {
mKeepScreenOnView = mViewAndroidDelegate.acquireAnchorView();
mKeepScreenOnView.setKeepScreenOn(true);
}
}
/**
* Decrease mKeepScreenOnCount, if it is decreased to 0, remove the flag.
*/
public void decrementKeepScreenOnCount() {
assert mKeepScreenOnCount > 0;
mKeepScreenOnCount--;
if (mKeepScreenOnCount == 0) {
mViewAndroidDelegate.releaseAnchorView(mKeepScreenOnView);
mKeepScreenOnView = null;
}
}
private native long nativeInit(long windowPtr);
private native void nativeDestroy(long nativeViewAndroid);
}