package org.solovyev.android.calculator; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Vibrator; import android.support.annotation.NonNull; import android.text.TextUtils; import org.solovyev.android.calculator.buttons.CppButton; import org.solovyev.android.calculator.history.History; import javax.annotation.Nonnull; import javax.inject.Inject; import static org.solovyev.android.calculator.App.cast; public final class WidgetReceiver extends BroadcastReceiver { public static final String ACTION_BUTTON_ID_EXTRA = "buttonId"; public static final String ACTION_BUTTON_PRESSED = "org.solovyev.android.calculator.BUTTON_PRESSED"; @Inject Keyboard keyboard; @Inject History history; @Nonnull public static Intent newButtonClickedIntent(@Nonnull Context context, @Nonnull CppButton button) { final Intent intent = new Intent(context, WidgetReceiver.class); intent.setAction(ACTION_BUTTON_PRESSED); intent.putExtra(ACTION_BUTTON_ID_EXTRA, button.id); return intent; } @Override public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); if (!TextUtils.equals(action, ACTION_BUTTON_PRESSED)) { return; } cast(context).getComponent().inject(this); final int buttonId = intent.getIntExtra(ACTION_BUTTON_ID_EXTRA, 0); final CppButton button = CppButton.getById(buttonId); if (button == null) { return; } if (history.isLoaded()) { if (!keyboard.buttonPressed(button.action)) { // prevent vibrate return; } } else { // if app has been killed we need first to restore the state and only after doing this // to apply actions. Otherwise, we will apply actions on the empty editor history.runWhenLoaded(new MyRunnable(keyboard, button.action)); } vibrate(context); } private void vibrate(@NonNull Context context) { if (!keyboard.isVibrateOnKeypress()) { return; } final Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); if (vibrator == null) { return; } vibrator.vibrate(10); } private static class MyRunnable implements Runnable { @NonNull private final Keyboard keyboard; @NonNull private final String action; public MyRunnable(@NonNull Keyboard keyboard, @NonNull String action) { this.keyboard = keyboard; this.action = action; } @Override public void run() { keyboard.buttonPressed(action); } } }