package org.solovyev.android.calculator;
import android.app.Application;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Handler;
import com.squareup.otto.Bus;
import com.squareup.otto.Subscribe;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Nonnull;
import javax.inject.Inject;
import javax.inject.Singleton;
@Singleton
public class Broadcaster implements SharedPreferences.OnSharedPreferenceChangeListener {
public static final String ACTION_INIT = "org.solovyev.android.calculator.INIT";
public static final String ACTION_EDITOR_STATE_CHANGED = "org.solovyev.android.calculator.EDITOR_STATE_CHANGED";
public static final String ACTION_DISPLAY_STATE_CHANGED = "org.solovyev.android.calculator.DISPLAY_STATE_CHANGED";
public static final String ACTION_THEME_CHANGED = "org.solovyev.android.calculator.THEME_CHANGED";
@Nonnull
private final Context context;
@Nonnull
private final Intents intents = new Intents();
@Inject
public Broadcaster(@Nonnull Application application, @Nonnull SharedPreferences preferences, @Nonnull Bus bus, @Nonnull Handler handler) {
this.context = application;
preferences.registerOnSharedPreferenceChangeListener(this);
bus.register(this);
handler.postDelayed(new Runnable() {
@Override
public void run() {
// we must update the widget when app starts
sendInitIntent();
}
}, 100);
}
@Subscribe
public void onEditorChanged(@Nonnull Editor.ChangedEvent e) {
sendBroadcastIntent(ACTION_EDITOR_STATE_CHANGED);
}
@Subscribe
public void onDisplayChanged(@Nonnull Display.ChangedEvent e) {
sendBroadcastIntent(ACTION_DISPLAY_STATE_CHANGED);
}
@Subscribe
public void onCursorMoved(@Nonnull Editor.CursorMovedEvent e) {
sendBroadcastIntent(ACTION_EDITOR_STATE_CHANGED);
}
public void sendInitIntent() {
sendBroadcastIntent(ACTION_INIT);
}
public void sendBroadcastIntent(@Nonnull String action) {
context.sendBroadcast(intents.get(action));
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (Preferences.Gui.theme.isSameKey(key) || Preferences.Widget.theme.isSameKey(key)) {
sendBroadcastIntent(ACTION_THEME_CHANGED);
}
}
private static final class Intents {
@Nonnull
private Map<String, Intent> map = new HashMap<>();
@Nonnull
Intent get(@Nonnull String action) {
Intent intent = map.get(action);
if (intent != null) {
return intent;
}
intent = new Intent(action);
map.put(action, intent);
return intent;
}
}
}