var types_ = validator_.Types;
var native_ = new xwalk.utils.NativeManager(extension);
-var callbackId = 0;
-var callbacks = {};
+function ListenerManager(native, listenerName) {
+ this.listener;
+ this.native = native;
+ this.listenerName = listenerName;
+}
-extension.setMessageListener(function(json) {
- var result = JSON.parse(json);
- var callback = callbacks[result['callbackId']];
- callback(result);
-});
+ListenerManager.prototype.onListenerCalled = function(msg) {
+ if(this.listener) {
+ this.listener(msg.prev_state, msg.new_state);
+ }
+};
-function nextCallbackId() {
- return callbackId++;
-}
+ListenerManager.prototype.addListener = function(callback) {
+ this.native.addListener(this.listenerName, this.onListenerCalled.bind(this));
+ this.listener = callback;
+};
+
+ListenerManager.prototype.removeListener = function() {
+ this.native.removeListener(this.listenerName);
+ delete this.listener;
+};
+
+var screenStateChangeListener = new ListenerManager(native_, "SCREEN_STATE_LISTENER");
function callNative(cmd, args) {
var json = {'cmd':cmd, 'args':args};
}
if (result['status'] == 'success') {
- if(result['result']) {
+ if('result' in result) {
return result['result'];
}
return true;
var nativeParam = {
};
-
if (args['resource']) {
nativeParam['resource'] = args.resource;
}
{name: 'listener', type: types_.FUNCTION}
]);
- native_.addListener("SCREEN_STATE_LISTENER", args.listener);
+ screenStateChangeListener.addListener(args.listener);
};
/**
* Unsets the screen state change callback and stop monitoring it.
*/
PowerManager.prototype.unsetScreenStateChangeListener = function() {
- native_.removeListener("SCREEN_STATE_LISTENER");
+ screenStateChangeListener.removeListener();
};
/**
REGISTER_SYNC("PowerManager_turnScreenOn", PowerManagerTurnscreenon);
REGISTER_SYNC("PowerManager_setScreenBrightness", PowerManagerSetscreenbrightness);
#undef REGISTER_SYNC
-
PowerManager::GetInstance()->AddListener(this);
}
PowerInstance::~PowerInstance() {
+ PowerManager::GetInstance()->RemoveListener(this);
}
enum PowerCallbacks {
picojson::value event = picojson::value(picojson::object());
picojson::object& obj = event.get<picojson::object>();
obj["cmd"] = picojson::value("ScreenStateChanged");
- obj["listenerId"] = picojson::value("ScreenStateChanged");
-
+ obj["listenerId"] = picojson::value("SCREEN_STATE_LISTENER");
for (auto it = kPowerStateMap.begin(); it != kPowerStateMap.end(); ++it) {
if (it->second == prev_state) {
obj["prev_state"] = picojson::value(it->first);
listeners_.push_back(listener);
}
+void PowerManager::RemoveListener(PowerManagerListener* listener) {
+ listeners_.remove(listener);
+}
+
PlatformResult PowerManager::Request(PowerResource resource, PowerState state) {
if (resource == POWER_RESOURCE_SCREEN && state == POWER_STATE_CPU_AWAKE)
return PlatformResult(ErrorCode::INVALID_VALUES_ERR, "invalid PowerState");
return result;
}
-void PowerManager::BroadcastScreenState(PowerState current){
+void PowerManager::BroadcastScreenState(PowerState current) {
if (current_state_ == current)
return;
class PowerManager {
public:
void AddListener(PowerManagerListener* listener);
+ void RemoveListener(PowerManagerListener* listener);
common::PlatformResult Request(PowerResource resource, PowerState state);
common::PlatformResult Release(PowerResource resource);
common::PlatformResult GetScreenBrightness(double* output);