Use editor string's spans only if main and widget theme are both light or dark
This commit is contained in:
parent
926909a62d
commit
25c83bac94
@ -34,6 +34,9 @@ import android.support.v4.app.DialogFragment;
|
|||||||
import android.support.v4.app.Fragment;
|
import android.support.v4.app.Fragment;
|
||||||
import android.support.v4.app.FragmentManager;
|
import android.support.v4.app.FragmentManager;
|
||||||
import android.support.v4.app.FragmentTransaction;
|
import android.support.v4.app.FragmentTransaction;
|
||||||
|
import android.text.Spannable;
|
||||||
|
import android.text.SpannableString;
|
||||||
|
import android.text.style.ForegroundColorSpan;
|
||||||
import org.solovyev.android.UiThreadExecutor;
|
import org.solovyev.android.UiThreadExecutor;
|
||||||
import org.solovyev.android.Views;
|
import org.solovyev.android.Views;
|
||||||
import org.solovyev.android.calculator.ga.Ga;
|
import org.solovyev.android.calculator.ga.Ga;
|
||||||
@ -298,4 +301,11 @@ public final class App {
|
|||||||
public static String toColorString(@ColorInt int color) {
|
public static String toColorString(@ColorInt int color) {
|
||||||
return Integer.toHexString(color).substring(2);
|
return Integer.toHexString(color).substring(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
public static SpannableString colorString(@Nonnull String s, int color) {
|
||||||
|
final SpannableString spannable = new SpannableString(s);
|
||||||
|
spannable.setSpan(new ForegroundColorSpan(color), 0, s.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
||||||
|
return spannable;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -160,7 +160,7 @@ public final class Preferences {
|
|||||||
@Nullable
|
@Nullable
|
||||||
private final Gui.Theme appTheme;
|
private final Gui.Theme appTheme;
|
||||||
|
|
||||||
private final boolean light;
|
public final boolean light;
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
private final Map<Gui.Theme, SimpleTheme> cache = new EnumMap<>(Gui.Theme.class);
|
private final Map<Gui.Theme, SimpleTheme> cache = new EnumMap<>(Gui.Theme.class);
|
||||||
@ -303,22 +303,28 @@ public final class Preferences {
|
|||||||
metro_purple_theme(R.style.cpp_metro_purple_theme),
|
metro_purple_theme(R.style.cpp_metro_purple_theme),
|
||||||
metro_green_theme(R.style.cpp_metro_green_theme),
|
metro_green_theme(R.style.cpp_metro_green_theme),
|
||||||
material_theme(R.style.Cpp_Theme_Material),
|
material_theme(R.style.Cpp_Theme_Material),
|
||||||
material_light_theme(R.style.Cpp_Theme_Material_Light, R.style.Cpp_Theme_Wizard_Light, R.style.Cpp_Theme_Dialog_Material_Light),;
|
material_light_theme(R.style.Cpp_Theme_Material_Light, R.style.Cpp_Theme_Wizard_Light, R.style.Cpp_Theme_Dialog_Material_Light, true),;
|
||||||
|
|
||||||
private static final SparseArray<TextColor> textColors = new SparseArray<>();
|
private static final SparseArray<TextColor> textColors = new SparseArray<>();
|
||||||
|
|
||||||
private final int themeId;
|
private final int themeId;
|
||||||
private final int wizardThemeId;
|
private final int wizardThemeId;
|
||||||
private final int dialogThemeId;
|
private final int dialogThemeId;
|
||||||
|
public final boolean light;
|
||||||
|
|
||||||
Theme(@StyleRes int themeId) {
|
Theme(@StyleRes int themeId) {
|
||||||
this(themeId, R.style.Cpp_Theme_Wizard, R.style.Cpp_Theme_Dialog_Material);
|
this(themeId, R.style.Cpp_Theme_Wizard, R.style.Cpp_Theme_Dialog_Material);
|
||||||
}
|
}
|
||||||
|
|
||||||
Theme(@StyleRes int themeId, @StyleRes int wizardThemeId, int dialogThemeId) {
|
Theme(@StyleRes int themeId, @StyleRes int wizardThemeId, int dialogThemeId) {
|
||||||
|
this(themeId, wizardThemeId, dialogThemeId, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
Theme(@StyleRes int themeId, @StyleRes int wizardThemeId, int dialogThemeId, boolean light) {
|
||||||
this.themeId = themeId;
|
this.themeId = themeId;
|
||||||
this.wizardThemeId = wizardThemeId;
|
this.wizardThemeId = wizardThemeId;
|
||||||
this.dialogThemeId = dialogThemeId;
|
this.dialogThemeId = dialogThemeId;
|
||||||
|
this.light = light;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getThemeId() {
|
public int getThemeId() {
|
||||||
@ -356,7 +362,7 @@ public final class Preferences {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static enum Layout {
|
public enum Layout {
|
||||||
main_calculator(R.layout.main_calculator, R.string.p_layout_calculator, true),
|
main_calculator(R.layout.main_calculator, R.string.p_layout_calculator, true),
|
||||||
main_calculator_mobile(R.layout.main_calculator_mobile, R.string.p_layout_calculator_mobile, false),
|
main_calculator_mobile(R.layout.main_calculator_mobile, R.string.p_layout_calculator_mobile, false),
|
||||||
|
|
||||||
|
@ -32,9 +32,9 @@ import android.content.Intent;
|
|||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.support.annotation.NonNull;
|
||||||
import android.support.v4.content.ContextCompat;
|
import android.support.v4.content.ContextCompat;
|
||||||
import android.text.*;
|
import android.text.*;
|
||||||
import android.text.style.ForegroundColorSpan;
|
|
||||||
import android.widget.RemoteViews;
|
import android.widget.RemoteViews;
|
||||||
import org.solovyev.android.Views;
|
import org.solovyev.android.Views;
|
||||||
import org.solovyev.android.calculator.*;
|
import org.solovyev.android.calculator.*;
|
||||||
@ -76,10 +76,7 @@ public class CalculatorWidget extends AppWidgetProvider {
|
|||||||
@Nonnull
|
@Nonnull
|
||||||
private SpannedString initCursorString(@Nonnull Context context) {
|
private SpannedString initCursorString(@Nonnull Context context) {
|
||||||
if (cursorString == null) {
|
if (cursorString == null) {
|
||||||
final SpannableString spannable = new SpannableString("|");
|
cursorString = new SpannedString(App.colorString("|", ContextCompat.getColor(context, R.color.cpp_widget_cursor)));
|
||||||
final int cursorColor = ContextCompat.getColor(context, R.color.cpp_widget_cursor);
|
|
||||||
spannable.setSpan(new ForegroundColorSpan(cursorColor), 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
|
|
||||||
cursorString = new SpannedString(spannable);
|
|
||||||
}
|
}
|
||||||
return cursorString;
|
return cursorString;
|
||||||
}
|
}
|
||||||
@ -124,7 +121,7 @@ public class CalculatorWidget extends AppWidgetProvider {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
updateEditorState(context, views, editorState);
|
updateEditorState(context, views, editorState, theme);
|
||||||
updateDisplayState(context, views, displayState, theme);
|
updateDisplayState(context, views, displayState, theme);
|
||||||
|
|
||||||
views.setTextViewText(R.id.cpp_button_multiplication, Locator.getInstance().getEngine().getMultiplicationSign());
|
views.setTextViewText(R.id.cpp_button_multiplication, Locator.getInstance().getEngine().getMultiplicationSign());
|
||||||
@ -198,20 +195,28 @@ public class CalculatorWidget extends AppWidgetProvider {
|
|||||||
views.setTextColor(R.id.calculator_display, ContextCompat.getColor(context, theme.getDisplayTextColor(error)));
|
views.setTextColor(R.id.calculator_display, ContextCompat.getColor(context, theme.getDisplayTextColor(error)));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateEditorState(@Nonnull Context context, @Nonnull RemoteViews views, @Nonnull CalculatorEditorViewState editorState) {
|
private void updateEditorState(@Nonnull Context context, @Nonnull RemoteViews views, @Nonnull CalculatorEditorViewState editorState, @Nonnull SimpleTheme theme) {
|
||||||
final CharSequence text = editorState.getTextAsCharSequence();
|
final CharSequence text = editorState.getTextAsCharSequence();
|
||||||
|
|
||||||
|
final boolean unspan = App.getTheme().light != theme.light;
|
||||||
CharSequence newText = text;
|
CharSequence newText = text;
|
||||||
int selection = editorState.getSelection();
|
int selection = editorState.getSelection();
|
||||||
if (selection >= 0 && selection <= text.length()) {
|
if (selection >= 0 && selection <= text.length()) {
|
||||||
// inject cursor
|
// inject cursor
|
||||||
final SpannableStringBuilder result = new SpannableStringBuilder();
|
final SpannableStringBuilder result = new SpannableStringBuilder();
|
||||||
result.append(text.subSequence(0, selection));
|
final CharSequence beforeCursor = text.subSequence(0, selection);
|
||||||
|
result.append(unspan ? unspan(beforeCursor) : beforeCursor);
|
||||||
result.append(getCursorString(context));
|
result.append(getCursorString(context));
|
||||||
result.append(text.subSequence(selection, text.length()));
|
final CharSequence afterCursor = text.subSequence(selection, text.length());
|
||||||
|
result.append(unspan ? unspan(afterCursor) : afterCursor);
|
||||||
newText = result;
|
newText = result;
|
||||||
}
|
}
|
||||||
Locator.getInstance().getNotifier().showDebugMessage(TAG, "New editor state: " + text);
|
Locator.getInstance().getNotifier().showDebugMessage(TAG, "New editor state: " + text);
|
||||||
views.setTextViewText(R.id.calculator_editor, newText);
|
views.setTextViewText(R.id.calculator_editor, newText);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
private String unspan(@Nonnull CharSequence spannable) {
|
||||||
|
return spannable.toString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user