Calculator Onscreen

This commit is contained in:
Sergey Solovyev
2012-11-23 17:39:58 +04:00
parent ddbb9b3bef
commit b71a21a05f
21 changed files with 320 additions and 112 deletions

View File

@@ -169,16 +169,23 @@ public class AndroidCalculatorDisplayView extends AutoResizeTextView implements
}
public synchronized void init(@NotNull Context context) {
if (!initialized) {
final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
final CalculatorPreferences.Gui.Layout layout = CalculatorPreferences.Gui.getLayout(preferences);
if ( layout == CalculatorPreferences.Gui.Layout.main_calculator_mobile ) {
setTextSize(TypedValue.COMPLEX_UNIT_SP, getResources().getDimension(R.dimen.cpp_display_text_size_mobile));
}
this.setOnClickListener(new CalculatorDisplayOnClickListener(context));
this.initialized = true;
}
this.init(context, true);
}
public synchronized void init(@NotNull Context context, boolean fromApp) {
if (!initialized) {
if (fromApp) {
final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
final CalculatorPreferences.Gui.Layout layout = CalculatorPreferences.Gui.getLayout(preferences);
if ( layout == CalculatorPreferences.Gui.Layout.main_calculator_mobile ) {
setTextSize(TypedValue.COMPLEX_UNIT_SP, getResources().getDimension(R.dimen.cpp_display_text_size_mobile));
}
this.setOnClickListener(new CalculatorDisplayOnClickListener(context));
}
this.initialized = true;
}
}
}

View File

@@ -3,15 +3,18 @@ package org.solovyev.android.calculator;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import org.solovyev.android.calculator.external.AndroidExternalListenersContainer;
import org.solovyev.android.calculator.onscreen.CalculatorOnscreenService;
public class CalculatorOnScreenStartActivity extends Activity {
public class CalculatorOnscreenStartActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
startService(new Intent(this, CalculatorOnscreenService.class));
final Intent intent = new Intent(AndroidExternalListenersContainer.INIT_ACTION);
intent.setClass(this, CalculatorOnscreenService.class);
startService(intent);
this.finish();
}

View File

@@ -0,0 +1,21 @@
package org.solovyev.android.calculator;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import org.solovyev.android.calculator.external.AndroidExternalListenersContainer;
import org.solovyev.android.calculator.onscreen.CalculatorOnscreenService;
public class CalculatorOnscreenStartActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final Intent intent = new Intent(AndroidExternalListenersContainer.INIT_ACTION);
intent.setClass(this, CalculatorOnscreenService.class);
startService(intent);
this.finish();
}
}

View File

@@ -39,9 +39,13 @@ public class AndroidExternalListenersContainer implements CalculatorExternalList
*/
public static final String EVENT_ID_EXTRA = "eventId";
public static final String EDITOR_STATE_CHANGED_ACTION = "org.solovyev.calculator.widget.EDITOR_STATE_CHANGED";
public static final String INIT_ACTION = "org.solovyev.android.calculator.INIT";
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.calculator.widget.DISPLAY_STATE_CHANGED";
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";

View File

@@ -4,9 +4,9 @@ import android.content.Context;
import android.content.Intent;
import android.os.Parcelable;
import org.jetbrains.annotations.NotNull;
import org.solovyev.android.calculator.Locator;
import org.solovyev.android.calculator.CalculatorDisplayViewState;
import org.solovyev.android.calculator.CalculatorEditorViewState;
import org.solovyev.android.calculator.Locator;
import org.solovyev.common.MutableObject;
/**
@@ -71,7 +71,9 @@ public class DefaultExternalCalculatorIntentHandler implements ExternalCalculato
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(@NotNull Context context,

View File

@@ -16,6 +16,7 @@ import org.solovyev.android.calculator.CalculatorDisplayViewState;
import org.solovyev.android.calculator.CalculatorEditorViewState;
import org.solovyev.android.calculator.Locator;
import org.solovyev.android.calculator.R;
import org.solovyev.android.calculator.external.AndroidExternalListenersContainer;
import org.solovyev.android.calculator.external.DefaultExternalCalculatorIntentHandler;
import org.solovyev.android.calculator.external.ExternalCalculatorIntentHandler;
import org.solovyev.android.calculator.external.ExternalCalculatorStateUpdater;
@@ -38,6 +39,8 @@ public class CalculatorOnscreenService extends Service implements ExternalCalcul
@NotNull
private CalculatorOnscreenView view;
private boolean compatibilityStart = true;
@Override
public IBinder onBind(Intent intent) {
return null;
@@ -51,14 +54,15 @@ public class CalculatorOnscreenService extends Service implements ExternalCalcul
final DisplayMetrics dm = getResources().getDisplayMetrics();
final int displayWidth0 = 2 * wm.getDefaultDisplay().getWidth() / 3;
final int displayHeight0 = 2 * wm.getDefaultDisplay().getHeight() / 3;
int twoThirdWidth = 2 * wm.getDefaultDisplay().getWidth() / 3;
int twoThirdHeight = 2 * wm.getDefaultDisplay().getHeight() / 3;
final int displayWidth = Math.min(displayWidth0, displayHeight0);
final int displayHeight = Math.max(displayWidth0, displayHeight0);
twoThirdWidth = Math.min(twoThirdWidth, twoThirdHeight);
twoThirdHeight = Math.max(twoThirdWidth, getHeight(twoThirdWidth));
final int width0 = Math.min(displayWidth, AndroidUtils.toPixels(dm, 300));
final int height0 = Math.min(displayHeight, AndroidUtils.toPixels(dm, 450));
final int baseWidth = AndroidUtils.toPixels(dm, 300);
final int width0 = Math.min(twoThirdWidth, baseWidth);
final int height0 = Math.min(twoThirdHeight, getHeight(baseWidth));
final int width = Math.min(width0, height0);
final int height = Math.max(width0, height0);
@@ -69,7 +73,11 @@ public class CalculatorOnscreenService extends Service implements ExternalCalcul
startCalculatorListening();
}
private void startCalculatorListening() {
private int getHeight(int width) {
return 4 * width / 3;
}
private void startCalculatorListening() {
Locator.getInstance().getExternalListenersContainer().addExternalListener(getIntentListenerClass());
}
@@ -106,23 +114,35 @@ public class CalculatorOnscreenService extends Service implements ExternalCalcul
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
}
if (this.compatibilityStart) {
handleStart(intent);
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
int result = super.onStartCommand(intent, flags, startId);
if ( intent != null ) {
intentHandler.onIntent(this, intent);
}
final int result;
try {
this.compatibilityStart = false;
result = super.onStartCommand(intent, flags, startId);
handleStart(intent);
} finally {
this.compatibilityStart = true;
}
hideNotification();
return result;
return result;
}
private void hideNotification() {
private void handleStart(@Nullable Intent intent) {
if ( intent != null ) {
intentHandler.onIntent(this, intent);
}
hideNotification();
}
private void hideNotification() {
final NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
nm.cancel(NOTIFICATION_ID);
}
@@ -144,7 +164,7 @@ public class CalculatorOnscreenService extends Service implements ExternalCalcul
builder.setContentTitle(getText(R.string.c_app_name));
builder.setContentText(getString(R.string.open_onscreen_calculator));
final Intent intent = new Intent();
final Intent intent = new Intent(AndroidExternalListenersContainer.INIT_ACTION);
intent.setClass(this, getIntentListenerClass());
builder.setContentIntent(PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT));

View File

@@ -2,13 +2,14 @@ package org.solovyev.android.calculator.onscreen;
import android.content.Context;
import android.graphics.PixelFormat;
import android.text.Html;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.TextView;
import android.widget.ImageView;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.solovyev.android.calculator.AndroidCalculatorDisplayView;
import org.solovyev.android.calculator.AndroidCalculatorEditorView;
import org.solovyev.android.calculator.CalculatorDisplayViewState;
import org.solovyev.android.calculator.CalculatorEditorViewState;
import org.solovyev.android.calculator.R;
@@ -44,7 +45,16 @@ public class CalculatorOnscreenView {
@NotNull
private View content;
@NotNull
@NotNull
private View header;
@NotNull
private AndroidCalculatorEditorView editorView;
@NotNull
private AndroidCalculatorDisplayView displayView;
@NotNull
private Context context;
private int width;
@@ -115,33 +125,12 @@ public class CalculatorOnscreenView {
public void updateDisplayState(@NotNull CalculatorDisplayViewState displayState) {
checkInit();
final TextView calculatorDisplayView = (TextView) root.findViewById(R.id.calculator_display);
if (calculatorDisplayView != null) {
if (displayState.isValid()) {
calculatorDisplayView.setText(displayState.getText());
calculatorDisplayView.setTextColor(context.getResources().getColor(R.color.cpp_default_text_color));
} else {
calculatorDisplayView.setTextColor(context.getResources().getColor(R.color.cpp_display_error_text_color));
}
}
displayView.setState(displayState);
}
public void updateEditorState(@NotNull CalculatorEditorViewState editorState) {
checkInit();
final TextView calculatorEditorView = (TextView) root.findViewById(R.id.calculator_editor);
if (calculatorEditorView != null) {
String text = editorState.getText();
CharSequence newText = text;
int selection = editorState.getSelection();
if (selection >= 0 && selection <= text.length()) {
// inject cursor
newText = Html.fromHtml(text.substring(0, selection) + "<font color=\"#" + cursorColor + "\">|</font>" + text.substring(selection));
}
calculatorEditorView.setText(newText);
}
editorView.setState(editorState);
}
private void setHeight(int height) {
@@ -176,13 +165,27 @@ public class CalculatorOnscreenView {
widgetButton.onClick(context);
}
});
button.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
widgetButton.onLongClick(context);
return true;
}
});
}
}
final WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
header = root.findViewById(R.id.onscreen_header);
content = root.findViewById(R.id.onscreen_content);
displayView = (AndroidCalculatorDisplayView) root.findViewById(R.id.calculator_display);
displayView.init(this.context, false);
editorView = (AndroidCalculatorEditorView) root.findViewById(R.id.calculator_editor);
editorView.init(this.context);
final View onscreenFoldButton = root.findViewById(R.id.onscreen_fold_button);
onscreenFoldButton.setOnClickListener(new View.OnClickListener() {
@Override
@@ -210,8 +213,8 @@ public class CalculatorOnscreenView {
}
});
final TextView onscreenTitleTextView = (TextView) root.findViewById(R.id.onscreen_title);
onscreenTitleTextView.setOnTouchListener(new WindowDragTouchListener(wm, root));
final ImageView onscreenTitleImageView = (ImageView) root.findViewById(R.id.onscreen_title);
onscreenTitleImageView.setOnTouchListener(new WindowDragTouchListener(wm, root));
initialized = true;
}
@@ -254,7 +257,7 @@ public class CalculatorOnscreenView {
if (!folded) {
final WindowManager.LayoutParams params = (WindowManager.LayoutParams) root.getLayoutParams();
unfoldedHeight = params.height;
int newHeight = root.findViewById(R.id.onscreen_close_button).getHeight();
int newHeight = header.getHeight();
content.setVisibility(View.GONE);
setHeight(newHeight);
folded = true;

View File

@@ -26,7 +26,7 @@ import org.solovyev.android.calculator.external.ExternalCalculatorStateUpdater;
abstract class AbstractCalculatorWidgetProvider extends AppWidgetProvider implements ExternalCalculatorStateUpdater {
static final String BUTTON_ID_EXTRA = "buttonId";
static final String BUTTON_PRESSED_ACTION = "org.solovyev.calculator.widget.BUTTON_PRESSED";
static final String BUTTON_PRESSED_ACTION = "org.solovyev.android.calculator.widget.BUTTON_PRESSED";
private static final String TAG = "Calculator++ Widget";

View File

@@ -53,7 +53,7 @@ public enum WidgetButton {
/*last column*/
clear(R.id.clearButton, CalculatorSpecialButton.clear),
erase(R.id.eraseButton, CalculatorSpecialButton.erase),
erase(R.id.eraseButton, CalculatorSpecialButton.erase, CalculatorSpecialButton.clear),
copy(R.id.copyButton, CalculatorSpecialButton.copy),
paste(R.id.pasteButton, CalculatorSpecialButton.paste),
@@ -64,23 +64,43 @@ public enum WidgetButton {
private final int buttonId;
@NotNull
private final String text;
private final String onClickText;
@Nullable
private final String onLongClickText;
@NotNull
private static Map<Integer, WidgetButton> buttonsByIds = new HashMap<Integer, WidgetButton>();
WidgetButton(int buttonId, @NotNull CalculatorSpecialButton button) {
this(buttonId, button.getActionCode());
WidgetButton(int buttonId, @NotNull CalculatorSpecialButton onClickButton, @Nullable CalculatorSpecialButton onLongClickButton) {
this(buttonId, onClickButton.getActionCode(), onLongClickButton == null ? null : onLongClickButton.getActionCode());
}
WidgetButton(int buttonId, @NotNull CalculatorSpecialButton onClickButton) {
this(buttonId, onClickButton, null);
}
WidgetButton(int buttonId, @NotNull String text) {
this.buttonId = buttonId;
this.text = text;
WidgetButton(int buttonId, @NotNull String onClickText, @Nullable String onLongClickText) {
this.buttonId = buttonId;
this.onClickText = onClickText;
this.onLongClickText = onLongClickText;
}
WidgetButton(int buttonId, @NotNull String onClickText) {
this(buttonId, onClickText, null);
}
public void onLongClick(@NotNull Context context) {
Locator.getInstance().getNotifier().showDebugMessage("Calculator++ Widget", "Button pressed: " + onLongClickText);
if (onLongClickText != null) {
Locator.getInstance().getKeyboard().buttonPressed(onLongClickText);
}
}
public void onClick(@NotNull Context context) {
Locator.getInstance().getNotifier().showDebugMessage("Calculator++ Widget", "Button pressed: " + text);
Locator.getInstance().getKeyboard().buttonPressed(text);
Locator.getInstance().getNotifier().showDebugMessage("Calculator++ Widget", "Button pressed: " + onClickText);
Locator.getInstance().getKeyboard().buttonPressed(onClickText);
}
@Nullable