external listeners removed
This commit is contained in:
@@ -1,150 +0,0 @@
|
||||
/*
|
||||
* Copyright 2013 serso aka se.solovyev
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
* Contact details
|
||||
*
|
||||
* Email: se.solovyev@gmail.com
|
||||
* Site: http://se.solovyev.org
|
||||
*/
|
||||
|
||||
package org.solovyev.android.calculator.external;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Parcelable;
|
||||
|
||||
import org.solovyev.android.App;
|
||||
import org.solovyev.android.calculator.*;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* User: serso
|
||||
* Date: 10/19/12
|
||||
* Time: 11:11 PM
|
||||
*/
|
||||
public class AndroidExternalListenersContainer implements CalculatorExternalListenersContainer, CalculatorEventListener {
|
||||
|
||||
/*
|
||||
**********************************************************************
|
||||
*
|
||||
* CONSTANTS
|
||||
*
|
||||
**********************************************************************
|
||||
*/
|
||||
|
||||
public static final String EVENT_ID_EXTRA = "eventId";
|
||||
|
||||
public static final String INIT_ACTION = "org.solovyev.android.calculator.INIT";
|
||||
public static final String INIT_ACTION_CREATE_VIEW_EXTRA = "createView";
|
||||
|
||||
public static final String EDITOR_STATE_CHANGED_ACTION = "org.solovyev.android.calculator.EDITOR_STATE_CHANGED";
|
||||
public static final String EDITOR_STATE_EXTRA = "editorState";
|
||||
|
||||
public static final String DISPLAY_STATE_CHANGED_ACTION = "org.solovyev.android.calculator.DISPLAY_STATE_CHANGED";
|
||||
public static final String DISPLAY_STATE_EXTRA = "displayState";
|
||||
|
||||
private static final String TAG = "Calculator++ External Listener Helper";
|
||||
|
||||
@Nonnull
|
||||
private final Set<Class<?>> externalListeners = new HashSet<Class<?>>();
|
||||
|
||||
@Nonnull
|
||||
private final CalculatorEventHolder lastEvent = new CalculatorEventHolder(CalculatorUtils.createFirstEventDataId());
|
||||
|
||||
public AndroidExternalListenersContainer(@Nonnull Calculator calculator) {
|
||||
calculator.addCalculatorEventListener(this);
|
||||
}
|
||||
|
||||
public void onEditorStateChanged(@Nonnull Context context,
|
||||
@Nonnull CalculatorEventData calculatorEventData,
|
||||
@Nonnull CalculatorEditorViewState editorViewState) {
|
||||
|
||||
for (Class<?> externalListener : getExternalListenersSync()) {
|
||||
final Intent intent = new Intent(EDITOR_STATE_CHANGED_ACTION);
|
||||
intent.setClass(context, externalListener);
|
||||
intent.putExtra(EVENT_ID_EXTRA, calculatorEventData.getEventId());
|
||||
intent.putExtra(EDITOR_STATE_EXTRA, (Parcelable) new ParcelableCalculatorEditorViewState(editorViewState));
|
||||
context.sendBroadcast(intent);
|
||||
Locator.getInstance().getNotifier().showDebugMessage(TAG, "Editor state changed broadcast sent");
|
||||
}
|
||||
}
|
||||
|
||||
private void onDisplayStateChanged(@Nonnull Context context,
|
||||
@Nonnull CalculatorEventData calculatorEventData,
|
||||
@Nonnull CalculatorDisplayViewState displayViewState) {
|
||||
for (Class<?> externalListener : getExternalListenersSync()) {
|
||||
final Intent intent = new Intent(DISPLAY_STATE_CHANGED_ACTION);
|
||||
intent.setClass(context, externalListener);
|
||||
intent.putExtra(EVENT_ID_EXTRA, calculatorEventData.getEventId());
|
||||
intent.putExtra(DISPLAY_STATE_EXTRA, (Parcelable) new ParcelableCalculatorDisplayViewState(displayViewState));
|
||||
context.sendBroadcast(intent);
|
||||
Locator.getInstance().getNotifier().showDebugMessage(TAG, "Display state changed broadcast sent");
|
||||
}
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
private Set<Class<?>> getExternalListenersSync() {
|
||||
synchronized (externalListeners) {
|
||||
return new HashSet<Class<?>>(externalListeners);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addExternalListener(@Nonnull Class<?> externalCalculatorClass) {
|
||||
synchronized (externalListeners) {
|
||||
externalListeners.add(externalCalculatorClass);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean removeExternalListener(@Nonnull Class<?> externalCalculatorClass) {
|
||||
synchronized (externalListeners) {
|
||||
return externalListeners.remove(externalCalculatorClass);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCalculatorEvent(@Nonnull CalculatorEventData calculatorEventData, @Nonnull CalculatorEventType calculatorEventType, @Nullable Object data) {
|
||||
final CalculatorEventHolder.Result result = lastEvent.apply(calculatorEventData);
|
||||
if (result.isNewAfter()) {
|
||||
switch (calculatorEventType) {
|
||||
case editor_state_changed_light:
|
||||
case editor_state_changed:
|
||||
final CalculatorEditorChangeEventData editorChangeData = (CalculatorEditorChangeEventData) data;
|
||||
final CalculatorEditorViewState newEditorState = editorChangeData.getNewValue();
|
||||
|
||||
Locator.getInstance().getNotifier().showDebugMessage(TAG, "Editor state changed: " + newEditorState.getText());
|
||||
|
||||
onEditorStateChanged(App.getApplication(), calculatorEventData, newEditorState);
|
||||
break;
|
||||
|
||||
case display_state_changed:
|
||||
final CalculatorDisplayChangeEventData displayChangeData = (CalculatorDisplayChangeEventData) data;
|
||||
final CalculatorDisplayViewState newDisplayState = displayChangeData.getNewValue();
|
||||
|
||||
Locator.getInstance().getNotifier().showDebugMessage(TAG, "Display state changed: " + newDisplayState.getText());
|
||||
|
||||
onDisplayStateChanged(App.getApplication(), calculatorEventData, newDisplayState);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,116 +0,0 @@
|
||||
/*
|
||||
* Copyright 2013 serso aka se.solovyev
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
* Contact details
|
||||
*
|
||||
* Email: se.solovyev@gmail.com
|
||||
* Site: http://se.solovyev.org
|
||||
*/
|
||||
|
||||
package org.solovyev.android.calculator.external;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Parcelable;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import org.solovyev.android.calculator.CalculatorDisplayViewState;
|
||||
import org.solovyev.android.calculator.CalculatorEditorViewState;
|
||||
import org.solovyev.android.calculator.Locator;
|
||||
import org.solovyev.common.MutableObject;
|
||||
|
||||
/**
|
||||
* User: serso
|
||||
* Date: 11/20/12
|
||||
* Time: 10:34 PM
|
||||
*/
|
||||
public class DefaultExternalCalculatorIntentHandler implements ExternalCalculatorIntentHandler {
|
||||
|
||||
private static final String TAG = ExternalCalculatorIntentHandler.class.getSimpleName();
|
||||
|
||||
@Nonnull
|
||||
private final MutableObject<Long> lastDisplayEventId = new MutableObject<Long>(0L);
|
||||
|
||||
@Nonnull
|
||||
private final MutableObject<Long> lastEditorEventId = new MutableObject<Long>(0L);
|
||||
|
||||
@Nonnull
|
||||
private final ExternalCalculatorStateUpdater stateUpdater;
|
||||
|
||||
public DefaultExternalCalculatorIntentHandler(@Nonnull ExternalCalculatorStateUpdater stateUpdater) {
|
||||
this.stateUpdater = stateUpdater;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onIntent(@Nonnull Context context, @Nonnull Intent intent) {
|
||||
|
||||
if (AndroidExternalListenersContainer.EDITOR_STATE_CHANGED_ACTION.equals(intent.getAction())) {
|
||||
Locator.getInstance().getNotifier().showDebugMessage(TAG, "Editor state changed broadcast received!");
|
||||
|
||||
final Long eventId = intent.getLongExtra(AndroidExternalListenersContainer.EVENT_ID_EXTRA, 0L);
|
||||
|
||||
boolean updateEditor = false;
|
||||
synchronized (lastEditorEventId) {
|
||||
if (eventId > lastEditorEventId.getObject()) {
|
||||
lastEditorEventId.setObject(eventId);
|
||||
updateEditor = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (updateEditor) {
|
||||
final Parcelable object = intent.getParcelableExtra(AndroidExternalListenersContainer.EDITOR_STATE_EXTRA);
|
||||
if (object instanceof CalculatorEditorViewState) {
|
||||
onEditorStateChanged(context, (CalculatorEditorViewState) object);
|
||||
}
|
||||
}
|
||||
} else if (AndroidExternalListenersContainer.DISPLAY_STATE_CHANGED_ACTION.equals(intent.getAction())) {
|
||||
Locator.getInstance().getNotifier().showDebugMessage(TAG, "Display state changed broadcast received!");
|
||||
|
||||
final Long eventId = intent.getLongExtra(AndroidExternalListenersContainer.EVENT_ID_EXTRA, 0L);
|
||||
boolean updateDisplay = false;
|
||||
synchronized (lastDisplayEventId) {
|
||||
if (eventId > lastDisplayEventId.getObject()) {
|
||||
lastDisplayEventId.setObject(eventId);
|
||||
updateDisplay = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (updateDisplay) {
|
||||
final Parcelable object = intent.getParcelableExtra(AndroidExternalListenersContainer.DISPLAY_STATE_EXTRA);
|
||||
if (object instanceof CalculatorDisplayViewState) {
|
||||
onDisplayStateChanged(context, (CalculatorDisplayViewState) object);
|
||||
}
|
||||
}
|
||||
} else if (AndroidExternalListenersContainer.INIT_ACTION.equals(intent.getAction())) {
|
||||
updateState(context, Locator.getInstance().getEditor().getViewState(), Locator.getInstance().getDisplay().getViewState());
|
||||
}
|
||||
}
|
||||
|
||||
protected void updateState(@Nonnull Context context,
|
||||
@Nonnull CalculatorEditorViewState editorViewState,
|
||||
@Nonnull CalculatorDisplayViewState displayViewState) {
|
||||
stateUpdater.updateState(context, editorViewState, displayViewState);
|
||||
}
|
||||
|
||||
protected void onDisplayStateChanged(@Nonnull Context context, @Nonnull CalculatorDisplayViewState displayViewState) {
|
||||
updateState(context, Locator.getInstance().getEditor().getViewState(), displayViewState);
|
||||
}
|
||||
|
||||
protected void onEditorStateChanged(@Nonnull Context context, @Nonnull CalculatorEditorViewState editorViewState) {
|
||||
updateState(context, editorViewState, Locator.getInstance().getDisplay().getViewState());
|
||||
}
|
||||
}
|
@@ -1,42 +0,0 @@
|
||||
/*
|
||||
* Copyright 2013 serso aka se.solovyev
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
* Contact details
|
||||
*
|
||||
* Email: se.solovyev@gmail.com
|
||||
* Site: http://se.solovyev.org
|
||||
*/
|
||||
|
||||
package org.solovyev.android.calculator.external;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import org.solovyev.android.calculator.CalculatorDisplayViewState;
|
||||
import org.solovyev.android.calculator.CalculatorEditorViewState;
|
||||
|
||||
/**
|
||||
* User: serso
|
||||
* Date: 11/20/12
|
||||
* Time: 10:42 PM
|
||||
*/
|
||||
public interface ExternalCalculatorStateUpdater {
|
||||
|
||||
void updateState(@Nonnull Context context,
|
||||
@Nonnull CalculatorEditorViewState editorState,
|
||||
@Nonnull CalculatorDisplayViewState displayState);
|
||||
}
|
Reference in New Issue
Block a user