diff --git a/res/drawable/copy.png b/res/drawable/copy.png
deleted file mode 100644
index eb5e59c3..00000000
Binary files a/res/drawable/copy.png and /dev/null differ
diff --git a/res/drawable/down.png b/res/drawable/down.png
deleted file mode 100644
index 8550c498..00000000
Binary files a/res/drawable/down.png and /dev/null differ
diff --git a/res/drawable/heart.png b/res/drawable/heart.png
deleted file mode 100644
index 7ab281ec..00000000
Binary files a/res/drawable/heart.png and /dev/null differ
diff --git a/res/drawable/ic_delete.png b/res/drawable/ic_delete.png
deleted file mode 100644
index 0a0cb93b..00000000
Binary files a/res/drawable/ic_delete.png and /dev/null differ
diff --git a/res/drawable/ic_input_delete.png b/res/drawable/ic_input_delete.png
deleted file mode 100644
index f35f89f6..00000000
Binary files a/res/drawable/ic_input_delete.png and /dev/null differ
diff --git a/res/drawable/logo.png b/res/drawable/logo.png
deleted file mode 100644
index e7bd1e47..00000000
Binary files a/res/drawable/logo.png and /dev/null differ
diff --git a/res/drawable/not_ok.png b/res/drawable/not_ok.png
deleted file mode 100644
index 292b7d21..00000000
Binary files a/res/drawable/not_ok.png and /dev/null differ
diff --git a/res/drawable/ok.png b/res/drawable/ok.png
deleted file mode 100644
index c7c11172..00000000
Binary files a/res/drawable/ok.png and /dev/null differ
diff --git a/res/drawable/paste.png b/res/drawable/paste.png
deleted file mode 100644
index db3d9300..00000000
Binary files a/res/drawable/paste.png and /dev/null differ
diff --git a/res/drawable/seek_thumb_normal.png b/res/drawable/seek_thumb_normal.png
deleted file mode 100644
index 8df52103..00000000
Binary files a/res/drawable/seek_thumb_normal.png and /dev/null differ
diff --git a/res/drawable/seek_thumb_pressed.png b/res/drawable/seek_thumb_pressed.png
deleted file mode 100644
index 7b5d9480..00000000
Binary files a/res/drawable/seek_thumb_pressed.png and /dev/null differ
diff --git a/res/drawable/sym_keyboard_delete.png b/res/drawable/sym_keyboard_delete.png
deleted file mode 100644
index 4d3e9200..00000000
Binary files a/res/drawable/sym_keyboard_delete.png and /dev/null differ
diff --git a/res/drawable/timepicker_down_btn.xml b/res/drawable/timepicker_down_btn.xml
deleted file mode 100644
index b77375a8..00000000
--- a/res/drawable/timepicker_down_btn.xml
+++ /dev/null
@@ -1,50 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/res/drawable/timepicker_down_disabled.9.png b/res/drawable/timepicker_down_disabled.9.png
deleted file mode 100644
index 596294b6..00000000
Binary files a/res/drawable/timepicker_down_disabled.9.png and /dev/null differ
diff --git a/res/drawable/timepicker_down_disabled_focused.9.png b/res/drawable/timepicker_down_disabled_focused.9.png
deleted file mode 100644
index 662cffd1..00000000
Binary files a/res/drawable/timepicker_down_disabled_focused.9.png and /dev/null differ
diff --git a/res/drawable/timepicker_down_normal.9.png b/res/drawable/timepicker_down_normal.9.png
deleted file mode 100644
index f17e8f94..00000000
Binary files a/res/drawable/timepicker_down_normal.9.png and /dev/null differ
diff --git a/res/drawable/timepicker_down_pressed.9.png b/res/drawable/timepicker_down_pressed.9.png
deleted file mode 100644
index 777bcf5f..00000000
Binary files a/res/drawable/timepicker_down_pressed.9.png and /dev/null differ
diff --git a/res/drawable/timepicker_down_selected.9.png b/res/drawable/timepicker_down_selected.9.png
deleted file mode 100644
index b45db621..00000000
Binary files a/res/drawable/timepicker_down_selected.9.png and /dev/null differ
diff --git a/res/drawable/timepicker_input.xml b/res/drawable/timepicker_input.xml
deleted file mode 100644
index 355e9d76..00000000
--- a/res/drawable/timepicker_input.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/res/drawable/timepicker_input_disabled.9.png b/res/drawable/timepicker_input_disabled.9.png
deleted file mode 100644
index f73658e7..00000000
Binary files a/res/drawable/timepicker_input_disabled.9.png and /dev/null differ
diff --git a/res/drawable/timepicker_input_normal.9.png b/res/drawable/timepicker_input_normal.9.png
deleted file mode 100644
index 8032adac..00000000
Binary files a/res/drawable/timepicker_input_normal.9.png and /dev/null differ
diff --git a/res/drawable/timepicker_input_pressed.9.png b/res/drawable/timepicker_input_pressed.9.png
deleted file mode 100644
index 30d8d5fa..00000000
Binary files a/res/drawable/timepicker_input_pressed.9.png and /dev/null differ
diff --git a/res/drawable/timepicker_input_selected.9.png b/res/drawable/timepicker_input_selected.9.png
deleted file mode 100644
index 874f18f2..00000000
Binary files a/res/drawable/timepicker_input_selected.9.png and /dev/null differ
diff --git a/res/drawable/timepicker_up_btn.xml b/res/drawable/timepicker_up_btn.xml
deleted file mode 100644
index 22e32a3f..00000000
--- a/res/drawable/timepicker_up_btn.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/res/drawable/timepicker_up_disabled.9.png b/res/drawable/timepicker_up_disabled.9.png
deleted file mode 100644
index 327b0b5a..00000000
Binary files a/res/drawable/timepicker_up_disabled.9.png and /dev/null differ
diff --git a/res/drawable/timepicker_up_disabled_focused.9.png b/res/drawable/timepicker_up_disabled_focused.9.png
deleted file mode 100644
index 4c96680f..00000000
Binary files a/res/drawable/timepicker_up_disabled_focused.9.png and /dev/null differ
diff --git a/res/drawable/timepicker_up_normal.9.png b/res/drawable/timepicker_up_normal.9.png
deleted file mode 100644
index dcd26e01..00000000
Binary files a/res/drawable/timepicker_up_normal.9.png and /dev/null differ
diff --git a/res/drawable/timepicker_up_pressed.9.png b/res/drawable/timepicker_up_pressed.9.png
deleted file mode 100644
index 7dac7786..00000000
Binary files a/res/drawable/timepicker_up_pressed.9.png and /dev/null differ
diff --git a/res/drawable/timepicker_up_selected.9.png b/res/drawable/timepicker_up_selected.9.png
deleted file mode 100644
index 35dae8ef..00000000
Binary files a/res/drawable/timepicker_up_selected.9.png and /dev/null differ
diff --git a/res/drawable/up.png b/res/drawable/up.png
deleted file mode 100644
index 9d65c209..00000000
Binary files a/res/drawable/up.png and /dev/null differ
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index d685f2f7..8932dfe6 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -1,22 +1,5 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/main/java/org/solovyev/android/AndroidUtils.java b/src/main/java/org/solovyev/android/AndroidUtils.java
deleted file mode 100644
index a173da29..00000000
--- a/src/main/java/org/solovyev/android/AndroidUtils.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.android;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.os.Build;
-import android.util.Log;
-import android.view.Gravity;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.TabHost;
-import android.widget.TextView;
-import com.google.ads.AdRequest;
-import com.google.ads.AdSize;
-import com.google.ads.AdView;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import java.util.List;
-
-/**
- * User: serso
- * Date: 12/21/11
- * Time: 11:54 PM
- */
-public final class AndroidUtils {
-
- // not intended for instantiation
- private AndroidUtils() {
- throw new AssertionError();
- }
-
- public static void centerAndWrapTabsFor(@NotNull TabHost tabHost) {
- if (allowCenterAndWrappingTabs()) {
- int tabCount = tabHost.getTabWidget().getTabCount();
- for (int i = 0; i < tabCount; i++) {
- final View view = tabHost.getTabWidget().getChildTabViewAt(i);
- if (view != null) {
- if (view.getLayoutParams().height > 0) {
- // reduce height of the tab
- view.getLayoutParams().height *= 0.8;
- }
-
- // get title text view
- final View textView = view.findViewById(android.R.id.title);
- if (textView instanceof TextView) {
- // just in case check the type
-
- // center text
- ((TextView) textView).setGravity(Gravity.CENTER);
- // wrap text
- ((TextView) textView).setSingleLine(false);
-
- // explicitly set layout parameters
- textView.getLayoutParams().height = ViewGroup.LayoutParams.FILL_PARENT;
- textView.getLayoutParams().width = ViewGroup.LayoutParams.WRAP_CONTENT;
- }
- }
- }
- }
- }
-
- private static boolean allowCenterAndWrappingTabs() {
- boolean result = true;
-
- String deviceModel = Build.MODEL;
- if (deviceModel != null) {
- deviceModel = deviceModel.toUpperCase();
- if (deviceModel.contains("M1") || deviceModel.contains("MIONE") || deviceModel.contains("MI-ONE")) {
- // Xiaomi Phone MiOne => do not allow to center and wrap tabs
- result = false;
- Log.i(AndroidUtils.class.getName(), "Device model doesn't support center and wrap of tabs: " + Build.MODEL);
- }
- }
-
- if (result) {
- String buildId = Build.DISPLAY;
- if (buildId != null) {
- buildId = buildId.toUpperCase();
- if (buildId.contains("MIUI")) {
- // fix for MIUI ROM
- result = false;
- Log.i(AndroidUtils.class.getName(), "Device build doesn't support center and wrap of tabs: " + Build.DISPLAY);
- }
- }
- }
-
- return result;
- }
-
- public static void addTab(@NotNull Context context,
- @NotNull TabHost tabHost,
- @NotNull String tabId,
- int tabCaptionId,
- @NotNull Class extends Activity> activityClass) {
-
- TabHost.TabSpec spec;
-
- final Intent intent = new Intent().setClass(context, activityClass);
-
- // Initialize a TabSpec for each tab and add it to the TabHost
- spec = tabHost.newTabSpec(tabId).setIndicator(context.getString(tabCaptionId)).setContent(intent);
-
- tabHost.addTab(spec);
- }
-
-
- /**
- * @param context context
- * @param appPackageName - full name of the package of an app, 'com.example.app' for example.
- * @return version number we are currently in
- */
- public static int getAppVersionCode(@NotNull Context context, @NotNull String appPackageName) {
- try {
- return context.getPackageManager().getPackageInfo(appPackageName, 0).versionCode;
- } catch (PackageManager.NameNotFoundException e) {
- // App not installed!
- }
- return -1;
- }
-
- @NotNull
- public static AdView createAndInflateAdView(@NotNull Activity activity,
- @NotNull String admobAccountId,
- @Nullable ViewGroup parentView,
- int layoutId,
- @NotNull List keywords) {
- final ViewGroup layout = parentView != null ? parentView : (ViewGroup) activity.findViewById(layoutId);
-
- // Create the adView
- final AdView adView = new AdView(activity, AdSize.BANNER, admobAccountId);
-
- // Add the adView to it
- layout.addView(adView);
-
- // Initiate a generic request to load it with an ad
- final AdRequest adRequest = new AdRequest();
-
- // todo serso: revert - only for tests
- //adRequest.addTestDevice(AdRequest.TEST_EMULATOR);
- //adRequest.addTestDevice("DB3C2F605A1296971898F0E60224A927");
-
- for (String keyword : keywords) {
- adRequest.addKeyword(keyword);
- }
- adView.loadAd(adRequest);
-
- return adView;
- }
-
- public static void processViewsOfType(@NotNull View view, @NotNull Class clazz, @NotNull ViewProcessor viewProcessor) {
- processViewsOfType0(view, clazz, viewProcessor);
- }
-
- public static void processViews(@NotNull View view, @NotNull ViewProcessor viewProcessor) {
- processViewsOfType0(view, null, viewProcessor);
- }
-
- private static void processViewsOfType0(@NotNull View view, @Nullable Class clazz, @NotNull ViewProcessor viewProcessor) {
- if (view instanceof ViewGroup) {
- final ViewGroup viewGroup = (ViewGroup) view;
-
- if (clazz == null || ViewGroup.class.isAssignableFrom(clazz)) {
- //noinspection unchecked
- viewProcessor.process((T) viewGroup);
- }
-
- for (int index = 0; index < viewGroup.getChildCount(); index++) {
- processViewsOfType0(viewGroup.getChildAt(index), clazz, viewProcessor);
- }
- } else if (clazz == null || view.getClass().isAssignableFrom(clazz)) {
- //noinspection unchecked
- viewProcessor.process((T) view);
- }
- }
-
- public static interface ViewProcessor {
- void process(@NotNull V view);
- }
-
- public static void restartActivity(@NotNull Activity activity) {
- final Intent intent = activity.getIntent();
- /*
- for compatibility with android_1.6_compatibility
- overridePendingTransition(0, 0);
- intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);*/
-
- Log.d(activity.getClass().getName(), "Finishing current activity!");
- activity.finish();
-
- /*
- for compatibility with android_1.6_compatibility
-
- overridePendingTransition(0, 0);*/
- Log.d(activity.getClass().getName(), "Starting new activity!");
- activity.startActivity(intent);
- }
-
-}
-
diff --git a/src/main/java/org/solovyev/android/ResourceCache.java b/src/main/java/org/solovyev/android/ResourceCache.java
deleted file mode 100644
index 09dc56b6..00000000
--- a/src/main/java/org/solovyev/android/ResourceCache.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.android;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.res.Configuration;
-import android.content.res.Resources;
-import android.util.Log;
-import android.view.View;
-import android.widget.Button;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import org.solovyev.android.view.widgets.DragButton;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.*;
-
-/**
- * User: serso
- * Date: 11/25/11
- * Time: 1:52 PM
- */
-public enum ResourceCache {
-
- instance;
-
- @NotNull
- private static final Locale DEFAULT_LOCALE = Locale.ENGLISH;
-
- // ids of drag buttons in R.class
- private List dragButtonIds = null;
-
- // ids of buttons in R.class
- private List buttonIds = null;
-
- // first map: key: language id, value: map of captions and translations
- // second mal: key: caption id, value: translation
- private final Map> captions = new HashMap>();
-
- private Class> resourceClass;
-
- private Context context;
-
- @NotNull
- private final NameToIdCache nameToIdCache = new NameToIdCache();
-
- public List getDragButtonIds() {
- return dragButtonIds;
- }
-
- public List getButtonIds() {
- return buttonIds;
- }
-
- /**
- * Method load captions for default locale using android R class
- *
- * @param context STATIC CONTEXT
- * @param resourceClass class of captions in android (SUBCLASS of R class)
- */
- public void initCaptions(@NotNull Context context, @NotNull Class> resourceClass) {
- initCaptions(context, resourceClass, Locale.getDefault());
- }
-
- /**
- * Method load captions for specified locale using android R class
- *
- * @param context STATIC CONTEXT
- * @param resourceClass class of captions in android (SUBCLASS of R class)
- * @param locale language to be used for translation
- */
- public void initCaptions(@NotNull Context context, @NotNull Class> resourceClass, @NotNull Locale locale) {
- assert this.resourceClass == null || this.resourceClass.equals(resourceClass);
-
- this.context = context;
- this.resourceClass = resourceClass;
-
- if (!initialized(locale)) {
- final Map captionsByLanguage = new HashMap();
-
- final Locale defaultLocale = Locale.getDefault();
-
- try {
- if (!defaultLocale.getLanguage().equals(locale.getLanguage())) {
- updateConfiguration(context, locale);
- }
-
- for (Field field : resourceClass.getDeclaredFields()) {
- int modifiers = field.getModifiers();
- if (Modifier.isFinal(modifiers) && Modifier.isStatic(modifiers)) {
- try {
- int captionId = field.getInt(resourceClass);
- captionsByLanguage.put(field.getName(), context.getString(captionId));
- } catch (IllegalAccessException e) {
- Log.e(ResourceCache.class.getName(), e.getMessage());
- } catch (Resources.NotFoundException e) {
- Log.e(ResourceCache.class.getName(), "Caption with name " + field.getName() + " was not found for " + locale.getLanguage() + " language: " + e.getMessage());
- }
- }
- }
- } finally {
- if (!defaultLocale.getLanguage().equals(locale.getLanguage())) {
- updateConfiguration(context, defaultLocale);
- }
- }
-
- captions.put(locale.getLanguage(), captionsByLanguage);
- }
- }
-
- private static void updateConfiguration(@NotNull Context context, @NotNull Locale locale) {
- Locale.setDefault(locale);
- final Configuration config = new Configuration();
- config.locale = locale;
- context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
- }
-
- private boolean initialized(@NotNull Locale locale) {
- return captions.containsKey(locale.getLanguage());
- }
-
- /**
- * @param captionId id of caption to be translated
- * @return translation by caption id in default language, null if no translation in default language present
- */
- @Nullable
- public String getCaption(@NotNull String captionId) {
- return getCaption(captionId, Locale.getDefault());
- }
-
-
- /**
- * @param captionId id of caption to be translated
- * @param locale language to be used for translation
- * @return translation by caption id in specified language, null if no translation in specified language present
- */
- @Nullable
- public String getCaption(@NotNull String captionId, @NotNull final Locale locale) {
- Map captionsByLanguage = captions.get(locale.getLanguage());
- if (captionsByLanguage != null) {
- return getCaption(captionsByLanguage, captionId, locale);
- } else {
- assert resourceClass != null && context != null;
-
- initCaptions(context, resourceClass, locale);
-
- captionsByLanguage = captions.get(locale.getLanguage());
- if (captionsByLanguage != null) {
- return getCaption(captionsByLanguage, captionId, locale);
- }
- }
-
- return null;
- }
-
- @Nullable
- private String getCaption(@NotNull Map captionsByLanguage, @NotNull String captionId, @NotNull Locale locale) {
- String result = captionsByLanguage.get(captionId);
- if (result == null && !locale.getLanguage().equals(DEFAULT_LOCALE.getLanguage())) {
- result = getCaption(captionId, DEFAULT_LOCALE);
- }
- return result;
- }
-
- public void init(@NotNull Class> resourceClass, @NotNull Activity activity) {
- dragButtonIds = new ArrayList();
- buttonIds = new ArrayList();
-
- for (Field field : resourceClass.getDeclaredFields()) {
- int modifiers = field.getModifiers();
- if (Modifier.isFinal(modifiers) && Modifier.isStatic(modifiers)) {
- try {
- int viewId = field.getInt(resourceClass);
- final View view = activity.findViewById(viewId);
- if (view instanceof DragButton) {
- dragButtonIds.add(viewId);
- }
- if (view instanceof Button) {
- buttonIds.add(viewId);
- }
- } catch (IllegalAccessException e) {
- Log.e(ResourceCache.class.getName(), e.getMessage());
- }
- }
- }
- }
-
- @NotNull
- public Map getNameToIdCache(@NotNull Class> clazz) {
- return this.nameToIdCache.getCache(clazz);
- }
-
- private static class NameToIdCache {
-
- @NotNull
- private final Map, Map> caches = new HashMap, Map>(3);
-
- // not intended for instantiation
- private NameToIdCache() {
- }
-
- @NotNull
- public Map getCache(@NotNull Class> clazz) {
- Map result = caches.get(clazz);
-
- if (result == null) {
- result = new HashMap();
-
- for (Field field : clazz.getDeclaredFields()) {
- int modifiers = field.getModifiers();
- if (Modifier.isFinal(modifiers) && Modifier.isStatic(modifiers)) {
- try {
- result.put(field.getName(), field.getInt(clazz));
- } catch (IllegalAccessException e) {
- Log.e(ResourceCache.class.getName(), e.getMessage());
- }
- }
- }
-
- caches.put(clazz, result);
- }
-
- return result;
- }
- }
-
-}
diff --git a/src/main/java/org/solovyev/android/calculator/CalculatorApplication.java b/src/main/java/org/solovyev/android/calculator/CalculatorApplication.java
index 40fe143c..4b3118fe 100644
--- a/src/main/java/org/solovyev/android/calculator/CalculatorApplication.java
+++ b/src/main/java/org/solovyev/android/calculator/CalculatorApplication.java
@@ -1,17 +1,8 @@
package org.solovyev.android.calculator;
-import android.app.Activity;
-import android.content.Context;
-import android.util.Log;
-import android.view.ViewGroup;
-import com.google.ads.AdView;
import net.robotmedia.billing.BillingController;
import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import org.solovyev.android.AndroidUtils;
-
-import java.util.Collections;
-import java.util.List;
+import org.solovyev.android.ads.AdsController;
/**
* User: serso
@@ -37,53 +28,11 @@ public class CalculatorApplication extends android.app.Application {
return instance;
}
- private static boolean isAdFreePurchased(@NotNull Context context) {
- return BillingController.isPurchased(context.getApplicationContext(), AD_FREE_PRODUCT_ID);
- }
-
- private static boolean transactionsRestored = false;
-
- public static boolean isAdFree(@NotNull Context context) {
- // check if user already bought this product
- boolean purchased = isAdFreePurchased(context);
- if (!purchased && !transactionsRestored) {
- // we must to restore all transactions done by user to guarantee that product was purchased or not
- BillingController.restoreTransactions(context);
-
- transactionsRestored = true;
-
- // todo serso: may be call net.robotmedia.billing.BillingController.restoreTransactions() always before first check and get rid of second check
- // check the billing one more time
- purchased = isAdFreePurchased(context);
- }
- return purchased;
- }
-
- @Nullable
- public static AdView inflateAd(@NotNull Activity activity) {
- return inflateAd(activity, null, R.id.ad_parent_view);
- }
-
- @Nullable
- public static AdView inflateAd(@NotNull Activity activity, @Nullable ViewGroup parentView, int parentViewId) {
- AdView result = null;
- if ( !isAdFree(activity) ) {
- Log.d(activity.getClass().getName(), "Application is not ad free - inflating ad!");
- final List keywords = Collections.emptyList();
- result = AndroidUtils.createAndInflateAdView(activity, ADMOB_USER_ID, parentView, parentViewId, keywords);
- } else {
- Log.d(activity.getClass().getName(), "Application is ad free - no ads!");
- }
-
- return result;
- }
-
@Override
public void onCreate() {
super.onCreate();
- //BillingController.setDebug(true);
- BillingController.setConfiguration(new BillingController.IConfiguration() {
+ AdsController.getInstance().init(ADMOB_USER_ID, AD_FREE_PRODUCT_ID, new BillingController.IConfiguration() {
@Override
public byte[] getObfuscationSalt() {
diff --git a/src/main/java/org/solovyev/android/calculator/CalculatorDisplay.java b/src/main/java/org/solovyev/android/calculator/CalculatorDisplay.java
index 6a48dfeb..0d6b8ff2 100644
--- a/src/main/java/org/solovyev/android/calculator/CalculatorDisplay.java
+++ b/src/main/java/org/solovyev/android/calculator/CalculatorDisplay.java
@@ -19,7 +19,6 @@ import org.solovyev.android.calculator.jscl.JsclOperation;
import org.solovyev.android.calculator.model.CalculatorEngine;
import org.solovyev.android.calculator.model.CalculatorParseException;
import org.solovyev.android.calculator.model.TextProcessor;
-import org.solovyev.android.view.AMenuBuilder;
import org.solovyev.android.view.AMenuItem;
import org.solovyev.android.view.AutoResizeTextView;
diff --git a/src/main/java/org/solovyev/android/calculator/CalculatorPreferencesActivity.java b/src/main/java/org/solovyev/android/calculator/CalculatorPreferencesActivity.java
index 63034af4..15567564 100644
--- a/src/main/java/org/solovyev/android/calculator/CalculatorPreferencesActivity.java
+++ b/src/main/java/org/solovyev/android/calculator/CalculatorPreferencesActivity.java
@@ -18,6 +18,7 @@ import net.robotmedia.billing.BillingRequest;
import net.robotmedia.billing.IBillingObserver;
import net.robotmedia.billing.model.Transaction;
import org.solovyev.android.AndroidUtils;
+import org.solovyev.android.ads.AdsController;
import org.solovyev.android.calculator.model.CalculatorEngine;
import org.solovyev.android.view.widgets.VibratorContainer;
@@ -63,7 +64,7 @@ public class CalculatorPreferencesActivity extends PreferenceActivity implements
private void setAdFreeAction() {
final Preference adFreePreference = findPreference(CalculatorApplication.AD_FREE_P_KEY);
- if (!CalculatorApplication.isAdFree(this)) {
+ if (!AdsController.getInstance().isAdFree(this)) {
Log.d(CalculatorPreferencesActivity.class.getName(), "Ad free is not purchased - enable preference!");
adFreePreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@@ -76,7 +77,7 @@ public class CalculatorPreferencesActivity extends PreferenceActivity implements
new AlertDialog.Builder(CalculatorPreferencesActivity.this).setTitle(R.string.c_error).setMessage(R.string.c_billing_error).create().show();
} else {
Log.d(CalculatorPreferencesActivity.class.getName(), "Billing is supported - continue!");
- if (!CalculatorApplication.isAdFree(CalculatorPreferencesActivity.this)) {
+ if (!AdsController.getInstance().isAdFree(CalculatorPreferencesActivity.this)) {
Log.d(CalculatorPreferencesActivity.class.getName(), "Item not purchased - try to purchase!");
// not purchased => purchasing
diff --git a/src/main/java/org/solovyev/android/calculator/CalculatorSecurity.java b/src/main/java/org/solovyev/android/calculator/CalculatorSecurity.java
index b6786289..250dcef3 100644
--- a/src/main/java/org/solovyev/android/calculator/CalculatorSecurity.java
+++ b/src/main/java/org/solovyev/android/calculator/CalculatorSecurity.java
@@ -20,6 +20,16 @@ public final class CalculatorSecurity {
@NotNull
public static String getPK() {
- return "org.solovyev.android.calculator";
+ final StringBuilder result = new StringBuilder();
+
+ result.append("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A");
+ result.append("MIIBCgKCAQEAquP2a7dEhTaJEQeXtSyreH5dCmTDOd");
+ result.append("dElCfg0ijOeB8JTxBiJTXLWnLA0kMaT/sRXswUaYI61YCQOoik82");
+ result.append("qrFH7W4+OFtiLb8WGX+YPEpQQ/IBZu9qm3xzS9Nolu79EBff0/CLa1FuT9RtjO");
+ result.append("iTW8Q0VP9meQdJEkfqJEyVCgHain+MGoQaRXI45EzkYmkz8TBx6X6aJF5NBAXnAWeyD0wPX1");
+ result.append("uedHH7+LgLcjnPVw82YjyJSzYnaaD2GX0Y7PGoFe6J5K4yJGGX5mih45pe2HWcG5lAkQhu1uX2hCcCBdF3");
+ result.append("W7paRq9mJvCsbn+BNTh9gq8QKui0ltmiWpa5U+/9L+FQIDAQAB");
+
+ return result.toString();
}
}
diff --git a/src/main/java/org/solovyev/android/calculator/help/AbstractHelpActivity.java b/src/main/java/org/solovyev/android/calculator/help/AbstractHelpActivity.java
index c0ccd8ff..cab1ae6b 100644
--- a/src/main/java/org/solovyev/android/calculator/help/AbstractHelpActivity.java
+++ b/src/main/java/org/solovyev/android/calculator/help/AbstractHelpActivity.java
@@ -10,7 +10,7 @@ import android.app.Activity;
import android.os.Bundle;
import com.google.ads.AdView;
import org.jetbrains.annotations.Nullable;
-import org.solovyev.android.calculator.CalculatorApplication;
+import org.solovyev.android.ads.AdsController;
/**
* User: serso
@@ -35,7 +35,7 @@ public class AbstractHelpActivity extends Activity {
setContentView(layoutId);
// do not inflate ad in help (as some problems were encountered dut to ScrollView - no space for ad banner)
- adView = CalculatorApplication.inflateAd(this);
+ adView = AdsController.getInstance().inflateAd(this);
}
@Override
diff --git a/src/main/java/org/solovyev/android/calculator/history/AbstractHistoryActivity.java b/src/main/java/org/solovyev/android/calculator/history/AbstractHistoryActivity.java
index 62579004..2dbd9d3c 100644
--- a/src/main/java/org/solovyev/android/calculator/history/AbstractHistoryActivity.java
+++ b/src/main/java/org/solovyev/android/calculator/history/AbstractHistoryActivity.java
@@ -19,7 +19,7 @@ import android.widget.ListView;
import com.google.ads.AdView;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import org.solovyev.android.calculator.CalculatorApplication;
+import org.solovyev.android.ads.AdsController;
import org.solovyev.android.calculator.CalculatorModel;
import org.solovyev.android.calculator.R;
import org.solovyev.android.calculator.jscl.JsclOperation;
@@ -67,7 +67,7 @@ public abstract class AbstractHistoryActivity extends ListActivity {
setContentView(R.layout.history_activity);
- adView = CalculatorApplication.inflateAd(this);
+ adView = AdsController.getInstance().inflateAd(this);
adapter = new HistoryArrayAdapter(this, getLayoutId(), R.id.history_item, new ArrayList());
setListAdapter(adapter);
diff --git a/src/main/java/org/solovyev/android/calculator/math/edit/AbstractMathEntityListActivity.java b/src/main/java/org/solovyev/android/calculator/math/edit/AbstractMathEntityListActivity.java
index 0e5456a2..4cfa2973 100644
--- a/src/main/java/org/solovyev/android/calculator/math/edit/AbstractMathEntityListActivity.java
+++ b/src/main/java/org/solovyev/android/calculator/math/edit/AbstractMathEntityListActivity.java
@@ -18,7 +18,7 @@ import android.widget.*;
import com.google.ads.AdView;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import org.solovyev.android.calculator.CalculatorApplication;
+import org.solovyev.android.ads.AdsController;
import org.solovyev.android.calculator.CalculatorModel;
import org.solovyev.android.calculator.R;
import org.solovyev.android.calculator.model.AndroidMathRegistry;
@@ -90,7 +90,7 @@ public abstract class AbstractMathEntityListActivity exten
setContentView(getLayoutId());
- adView = CalculatorApplication.inflateAd(this);
+ adView = AdsController.getInstance().inflateAd(this);
final Intent intent = getIntent();
if ( intent != null ) {
diff --git a/src/main/java/org/solovyev/android/msg/AndroidMessage.java b/src/main/java/org/solovyev/android/msg/AndroidMessage.java
deleted file mode 100644
index a5a232ef..00000000
--- a/src/main/java/org/solovyev/android/msg/AndroidMessage.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.android.msg;
-
-import org.jetbrains.annotations.NotNull;
-import org.solovyev.android.ResourceCache;
-import org.solovyev.common.msg.AbstractMessage;
-import org.solovyev.common.msg.MessageType;
-
-import java.util.List;
-import java.util.Locale;
-
-/**
- * User: serso
- * Date: 10/18/11
- * Time: 11:57 PM
- */
-public class AndroidMessage extends AbstractMessage {
-
- public AndroidMessage(@NotNull String messageCode,
- @NotNull MessageType messageType,
- @org.jetbrains.annotations.Nullable Object... arguments) {
- super(messageCode, messageType, arguments);
- }
-
- public AndroidMessage(@NotNull String messageCode,
- @NotNull MessageType messageType,
- @NotNull List> arguments) {
- super(messageCode, messageType, arguments);
- }
-
- @Override
- protected String getMessagePattern(@NotNull Locale locale) {
- return ResourceCache.instance.getCaption(getMessageCode());
- }
-}
diff --git a/src/main/java/org/solovyev/android/view/AMenu.java b/src/main/java/org/solovyev/android/view/AMenu.java
deleted file mode 100644
index 9175cdcb..00000000
--- a/src/main/java/org/solovyev/android/view/AMenu.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.android.view;
-
-import android.content.Context;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-/**
- * User: serso
- * Date: 12/18/11
- * Time: 1:30 PM
- */
-public interface AMenu, D> {
- @Nullable
- T itemAt(int i);
-
- @NotNull
- CharSequence[] getMenuCaptions(@NotNull final Context context);
-}
diff --git a/src/main/java/org/solovyev/android/view/AMenuBuilder.java b/src/main/java/org/solovyev/android/view/AMenuBuilder.java
deleted file mode 100644
index 3a63cb81..00000000
--- a/src/main/java/org/solovyev/android/view/AMenuBuilder.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.solovyev.android.view;
-
-import android.app.AlertDialog;
-import android.content.Context;
-import android.content.DialogInterface;
-import org.jetbrains.annotations.NotNull;
-
-/**
- * User: serso
- * Date: 12/19/11
- * Time: 10:54 AM
- */
-public class AMenuBuilder, D>{
-
- @NotNull
- private final Context context;
-
- @NotNull
- private final AlertDialog.Builder menuBuilder;
-
- @NotNull
- private final AMenu menu;
-
- @NotNull
- public static , D> AMenuBuilder newInstance(@NotNull Context context, @NotNull Class enumClass) {
- return new AMenuBuilder(context, EnumMenu.newInstance(enumClass));
- }
-
- @NotNull
- public static , D> AMenuBuilder newInstance(@NotNull Context context, @NotNull AMenu menu) {
- return new AMenuBuilder(context, menu);
- }
-
- private AMenuBuilder(@NotNull Context context, @NotNull AMenu menu) {
- this.context = context;
- this.menuBuilder = new AlertDialog.Builder(context);
- this.menu = menu;
- }
-
- @NotNull
- public AlertDialog.Builder getMenuBuilder() {
- return menuBuilder;
- }
-
- @NotNull
- public AlertDialog create(@NotNull final D data) {
- menuBuilder.setItems(menu.getMenuCaptions(context), new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int item) {
- final AMenuItem menuItem = menu.itemAt(item);
- if (menuItem != null) {
- menuItem.doAction(data, context);
- }
- }
- });
-
- return menuBuilder.create();
- }
-
-
-}
diff --git a/src/main/java/org/solovyev/android/view/AMenuItem.java b/src/main/java/org/solovyev/android/view/AMenuItem.java
deleted file mode 100644
index 125e9f9b..00000000
--- a/src/main/java/org/solovyev/android/view/AMenuItem.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.android.view;
-
-import android.content.Context;
-import org.jetbrains.annotations.NotNull;
-
-/**
- * User: serso
- * Date: 12/18/11
- * Time: 1:29 PM
- */
-public interface AMenuItem {
-
- @NotNull
- String getCaption(@NotNull Context context);
-
- void doAction(@NotNull T data, @NotNull Context context);
-}
diff --git a/src/main/java/org/solovyev/android/view/AutoResizeTextView.java b/src/main/java/org/solovyev/android/view/AutoResizeTextView.java
deleted file mode 100644
index 1840209e..00000000
--- a/src/main/java/org/solovyev/android/view/AutoResizeTextView.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.android.view;
-
-import android.content.Context;
-import android.graphics.Canvas;
-import android.text.Editable;
-import android.text.Layout.Alignment;
-import android.text.StaticLayout;
-import android.text.TextPaint;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.widget.TextView;
-
-/**
- * Text view that auto adjusts text size to fit within the view.
- * If the text size equals the minimum text size and still does not
- * fit, append with an ellipsis.
- *
- * @author Chase Colburn
- * @since Apr 4, 2011
- */
-public class AutoResizeTextView extends TextView {
-
- // Minimum text size for this text view
- public static final float MIN_TEXT_SIZE = 20;
-
- private float initialTextSize = 100;
-
- // Interface for resize notifications
- public interface OnTextResizeListener {
- public void onTextResize(TextView textView, float oldSize, float newSize);
- }
-
- // Off screen canvas for text size rendering
- private static final Canvas textResizeCanvas = new Canvas();
-
- // Our ellipse string
- private static final String ellipsis = "...";
-
- // Registered resize listener
- private OnTextResizeListener textResizeListener;
-
- // Flag for text and/or size changes to force a resize
- private boolean needsResize = false;
-
- // Lower bounds for text size
- private float minTextSize = MIN_TEXT_SIZE;
-
- // Text view line spacing multiplier
- private float spacingMult = 1.0f;
-
- // Text view additional line spacing
- private float spacingAdd = 0.0f;
-
- // Add ellipsis to text that overflows at the smallest text size
- private boolean addEllipsis = true;
-
- // Default constructor override
- public AutoResizeTextView(Context context) {
- this(context, null);
- }
-
- // Default constructor when inflating from XML file
- public AutoResizeTextView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
-
- // Default constructor override
- public AutoResizeTextView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- }
-
- /**
- * When text changes, set the force resize flag to true and resetInterpreter the text size.
- */
- @Override
- protected void onTextChanged(final CharSequence text, final int start, final int before, final int after) {
- needsResize = true;
- // Since this view may be reused, it is good to resetInterpreter the text size
- }
-
- /**
- * If the text view size changed, set the force resize flag to true
- */
- @Override
- protected void onSizeChanged(int w, int h, int oldw, int oldh) {
- if (w != oldw || h != oldh) {
- needsResize = true;
- }
- }
-
- /**
- * Register listener to receive resize notifications
- *
- * @param listener
- */
- public void setOnResizeListener(OnTextResizeListener listener) {
- textResizeListener = listener;
- }
-
- /**
- * Override the set text size to update our internal reference values
- */
- @Override
- public void setTextSize(int unit, float size) {
- super.setTextSize(unit, size);
- }
-
- /**
- * Override the set line spacing to update our internal reference values
- */
- @Override
- public void setLineSpacing(float add, float mult) {
- super.setLineSpacing(add, mult);
- spacingMult = mult;
- spacingAdd = add;
- }
-
- /**
- * Set the lower text size limit and invalidate the view
- *
- * @param minTextSize
- */
- public void setMinTextSize(float minTextSize) {
- this.minTextSize = minTextSize;
- requestLayout();
- invalidate();
- }
-
- /**
- * Return lower text size limit
- *
- * @return
- */
- public float getMinTextSize() {
- return minTextSize;
- }
-
- /**
- * Set flag to add ellipsis to text that overflows at the smallest text size
- *
- * @param addEllipsis
- */
- public void setAddEllipsis(boolean addEllipsis) {
- this.addEllipsis = addEllipsis;
- }
-
- /**
- * Return flag to add ellipsis to text that overflows at the smallest text size
- *
- * @return
- */
- public boolean getAddEllipsis() {
- return addEllipsis;
- }
-
-
- /**
- * Resize text after measuring
- */
- @Override
- protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
- if (changed || needsResize) {
- int widthLimit = (right - left) - getCompoundPaddingLeft() - getCompoundPaddingRight();
- int heightLimit = (bottom - top) - getCompoundPaddingBottom() - getCompoundPaddingTop();
- resizeText(widthLimit, heightLimit, getText());
- }
- super.onLayout(changed, left, top, right, bottom);
- }
-
- /**
- * Resize the text size with default width and height
- */
- public void resizeText() {
- resizeText(getText());
- }
-
- private void resizeText(final CharSequence text) {
- int heightLimit = getHeight() - getPaddingBottom() - getPaddingTop();
- int widthLimit = getWidth() - getPaddingLeft() - getPaddingRight();
- resizeText(widthLimit, heightLimit, text);
- }
-
- /**
- * Resize the text size with specified width and height
- *
- * @param width
- * @param height
- * @param text
- */
- private void resizeText(int width, int height, CharSequence text) {
- Log.d(this.getClass().getName(), "Resizing: w=" + width + ", h=" + height + ", text='" + text + "'");
-
- // Do not resize if the view does not have dimensions or there is no text
- if (text == null || text.length() == 0 || height <= 0 || width <= 0) {
- return;
- }
-
- // Get the text view's paint object
- TextPaint textPaint = getPaint();
-
- // Store the current text size
- float oldTextSize = textPaint.getTextSize();
- Log.d(this.getClass().getName(), "Old text size: " + oldTextSize);
-
- // If there is a max text size set, use the lesser of that and the default text size
- // todo serso: +2 is a workaround => to be checked boundary constraints
- float newTextSize = initialTextSize + 2;
-
- int newTextHeight;
-
- if (text instanceof Editable) {
- ((Editable) text).append("|");
- }
-
- try {
-
- // Get the required text height
- newTextHeight = getTextRect(text, textPaint, width, newTextSize);
-
- logDimensions(newTextSize, newTextHeight);
- if (newTextHeight > height) {
- // Until we either fit within our text view or we had reached our min text size, incrementally try smaller sizes
- while (newTextHeight > height) {
- if (newTextSize <= minTextSize) {
- break;
- }
- newTextSize = Math.max(newTextSize - 1, minTextSize);
- newTextHeight = getTextRect(text, textPaint, width, newTextSize);
- logDimensions(newTextSize, newTextHeight);
- }
- } else {
- while (newTextHeight < height) {
- if (newTextSize <= minTextSize) {
- break;
- }
- newTextSize = Math.max(newTextSize + 1, minTextSize);
- newTextHeight = getTextRect(text, textPaint, width, newTextSize);
- logDimensions(newTextSize, newTextHeight);
- }
- }
- } finally {
- if (text instanceof Editable) {
- ((Editable) text).delete(text.length() - 1, text.length());
- }
- }
-
- initialTextSize = newTextSize;
-
- // If we had reached our minimum text size and still don't fit, append an ellipsis
- if (addEllipsis && newTextSize == minTextSize && newTextHeight > height) {
- // Draw using a static layout
- StaticLayout layout = new StaticLayout(text, textPaint, width, Alignment.ALIGN_NORMAL, spacingMult, spacingAdd, false);
- layout.draw(textResizeCanvas);
- int lastLine = layout.getLineForVertical(height) - 1;
- int start = layout.getLineStart(lastLine);
- int end = layout.getLineEnd(lastLine);
- float lineWidth = layout.getLineWidth(lastLine);
- float ellipseWidth = textPaint.measureText(ellipsis);
-
- // Trim characters off until we have enough room to draw the ellipsis
- while (width < lineWidth + ellipseWidth) {
- lineWidth = textPaint.measureText(text.subSequence(start, --end + 1).toString());
- }
- setText(text.subSequence(0, end) + ellipsis);
-
- }
-
- // Some devices try to auto adjust line spacing, so force default line spacing
- // and invalidate the layout as a side effect
- textPaint.setTextSize(newTextSize);
- setLineSpacing(spacingAdd, spacingMult);
-
- // Notify the listener if registered
- if (textResizeListener != null) {
- textResizeListener.onTextResize(this, oldTextSize, newTextSize);
- }
-
- // Reset force resize flag
- needsResize = false;
- }
-
- private void logDimensions(float newTextSize, int newTextHeight) {
- Log.d(this.getClass().getName(), "Nex text size: " + newTextSize + ", new text height: " + newTextHeight);
- }
-
- // Set the text size of the text paint object and use a static layout to render text off screen before measuring
- private int getTextRect(CharSequence source, TextPaint paint, int width, float textSize) {
- // Update the text paint object
- paint.setTextSize(textSize);
- // Draw using a static layout
- StaticLayout layout = new StaticLayout(source, paint, width, Alignment.ALIGN_NORMAL, spacingMult, spacingAdd, false);
- layout.draw(textResizeCanvas);
- return layout.getHeight();
- }
-}
diff --git a/src/main/java/org/solovyev/android/view/CursorControl.java b/src/main/java/org/solovyev/android/view/CursorControl.java
deleted file mode 100644
index 7091930f..00000000
--- a/src/main/java/org/solovyev/android/view/CursorControl.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- */
-
-package org.solovyev.android.view;
-
-/**
- * User: serso
- * Date: 9/13/11
- * Time: 12:08 AM
- */
-public interface CursorControl {
-
- public void setCursorOnStart();
-
- public void setCursorOnEnd();
-
- public void moveCursorLeft();
-
- public void moveCursorRight();
-}
diff --git a/src/main/java/org/solovyev/android/view/EnumMenu.java b/src/main/java/org/solovyev/android/view/EnumMenu.java
deleted file mode 100644
index e71da538..00000000
--- a/src/main/java/org/solovyev/android/view/EnumMenu.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.android.view;
-
-import android.content.Context;
-import org.jetbrains.annotations.NotNull;
-
-/**
- * User: serso
- * Date: 12/18/11
- * Time: 1:34 PM
- */
-public class EnumMenu, D> implements AMenu {
-
- @NotNull
- private final AMenu menu;
-
- @NotNull
- public static , D> AMenu newInstance(@NotNull Class enumClass) {
- return new EnumMenu(enumClass);
- }
-
- private EnumMenu(Class enumClass) {
- this.menu = MenuImpl.newInstance(enumClass.getEnumConstants());
- }
-
- @Override
- public T itemAt(int i) {
- return this.menu.itemAt(i);
- }
-
- @NotNull
- @Override
- public CharSequence[] getMenuCaptions(@NotNull final Context context) {
- return this.menu.getMenuCaptions(context);
- }
-}
diff --git a/src/main/java/org/solovyev/android/view/FontSizeAdjuster.java b/src/main/java/org/solovyev/android/view/FontSizeAdjuster.java
deleted file mode 100644
index 121651d9..00000000
--- a/src/main/java/org/solovyev/android/view/FontSizeAdjuster.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- */
-
-package org.solovyev.android.view;
-
-import android.widget.TextView;
-import org.jetbrains.annotations.NotNull;
-
-/**
- * User: serso
- * Date: 9/10/11
- * Time: 7:21 PM
- */
-public interface FontSizeAdjuster {
-
- void adjustFontSize(@NotNull TextView textView);
-}
diff --git a/src/main/java/org/solovyev/android/view/HistoryControl.java b/src/main/java/org/solovyev/android/view/HistoryControl.java
deleted file mode 100644
index 7d642e36..00000000
--- a/src/main/java/org/solovyev/android/view/HistoryControl.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- */
-
-package org.solovyev.android.view;
-
-import org.jetbrains.annotations.NotNull;
-import org.solovyev.common.utils.history.HistoryAction;
-
-/**
- * User: serso
- * Date: 9/16/11
- * Time: 11:42 PM
- */
-public interface HistoryControl {
-
- void doHistoryAction(@NotNull HistoryAction historyAction);
-
- void setCurrentHistoryState(@NotNull T editorHistoryState);
-
- @NotNull
- T getCurrentHistoryState();
-}
diff --git a/src/main/java/org/solovyev/android/view/LastTabSaver.java b/src/main/java/org/solovyev/android/view/LastTabSaver.java
deleted file mode 100644
index 5aad7ae3..00000000
--- a/src/main/java/org/solovyev/android/view/LastTabSaver.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (c) 2009-2012. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.android.view;
-
-import android.app.TabActivity;
-import android.preference.PreferenceManager;
-import android.widget.TabHost;
-import org.jetbrains.annotations.NotNull;
-import org.solovyev.android.view.prefs.StringPreference;
-
-/**
- * User: serso
- * Date: 1/9/12
- * Time: 6:17 PM
- */
-public class LastTabSaver implements TabHost.OnTabChangeListener {
-
- private static final String LAST_OPENED_TAB_P_KEY = "last_opened_tab_";
-
- @NotNull
- private final StringPreference preference;
-
- @NotNull
- private final TabActivity tabActivity;
-
- public LastTabSaver(@NotNull TabActivity tabActivity, @NotNull String defaultTabId) {
- this.tabActivity = tabActivity;
- this.preference = StringPreference.newInstance(getPreferenceKey(), defaultTabId);
-
- final TabHost tabHost = tabActivity.getTabHost();
- tabHost.setCurrentTabByTag(this.getLastOpenedTabId());
- tabHost.setOnTabChangedListener(this);
- }
-
- public void destroy() {
- final TabHost tabHost = tabActivity.getTabHost();
- tabHost.setOnTabChangedListener(null);
- }
-
- @Override
- public void onTabChanged(String tabId) {
- preference.putPreference(PreferenceManager.getDefaultSharedPreferences(tabActivity), tabId);
- }
-
- @NotNull
- public String getLastOpenedTabId() {
- return preference.getPreference(PreferenceManager.getDefaultSharedPreferences(tabActivity));
- }
-
- @NotNull
- private String getPreferenceKey() {
- return LAST_OPENED_TAB_P_KEY + tabActivity.getClass().getName();
- }
-}
diff --git a/src/main/java/org/solovyev/android/view/MenuImpl.java b/src/main/java/org/solovyev/android/view/MenuImpl.java
deleted file mode 100644
index da7b7440..00000000
--- a/src/main/java/org/solovyev/android/view/MenuImpl.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.android.view;
-
-import android.content.Context;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import org.solovyev.common.utils.CollectionsUtils;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
-* User: serso
-* Date: 12/18/11
-* Time: 1:31 PM
-*/
-public class MenuImpl, D> implements AMenu {
-
- private final List menuItems = new ArrayList();
-
- @NotNull
- public static , D> AMenu newInstance(T... menuItems) {
- return new MenuImpl(menuItems);
- }
-
- @NotNull
- public static , D> AMenu newInstance(@NotNull List menuItems) {
- return new MenuImpl(menuItems);
- }
-
- private MenuImpl(T... menuItems) {
- this(CollectionsUtils.asList(menuItems));
- }
-
- private MenuImpl(@NotNull List menuItems) {
- this.menuItems.addAll(menuItems);
- }
-
- @Override
- @Nullable
- public T itemAt(int i) {
- if (i >= 0 && i < menuItems.size()) {
- return menuItems.get(i);
- } else {
- return null;
- }
- }
-
- @Override
- @NotNull
- public CharSequence[] getMenuCaptions(@NotNull final Context context) {
- final CharSequence[] result = new CharSequence[this.menuItems.size()];
- for (int i = 0; i < this.menuItems.size(); i++) {
- result[i] = this.menuItems.get(i).getCaption(context);
- }
- return result;
- }
-}
diff --git a/src/main/java/org/solovyev/android/view/prefs/AbstractDialogPreference.java b/src/main/java/org/solovyev/android/view/prefs/AbstractDialogPreference.java
deleted file mode 100644
index e9adc999..00000000
--- a/src/main/java/org/solovyev/android/view/prefs/AbstractDialogPreference.java
+++ /dev/null
@@ -1,180 +0,0 @@
-package org.solovyev.android.view.prefs;
-
-import android.content.Context;
-import android.preference.DialogPreference;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.Gravity;
-import android.view.View;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import org.solovyev.common.utils.Mapper;
-
-/**
- * User: serso
- * Date: 9/19/11
- * Time: 3:17 PM
- */
-public abstract class AbstractDialogPreference extends DialogPreference {
-
- @NotNull
- protected final static String localNameSpace = "http://schemas.android.com/apk/res/org.solovyev.android.calculator";
-
- @NotNull
- protected final static String androidns = "http://schemas.android.com/apk/res/android";
-
- @Nullable
- protected TextView valueTextView;
-
- @Nullable
- protected String valueText;
-
- @NotNull
- protected final Context context;
-
- @Nullable
- protected String description;
-
- @Nullable
- protected T value;
-
- @Nullable
- private T defaultValue;
-
- @Nullable
- private final String defaultStringValue;
-
- private final boolean needValueText;
-
- public AbstractDialogPreference(Context context, AttributeSet attrs, @Nullable String defaultStringValue, boolean needValueText) {
- super(context, attrs);
- this.context = context;
- this.defaultStringValue = defaultStringValue;
- this.needValueText = needValueText;
-
- final String defaultValueFromAttrs = attrs.getAttributeValue(androidns, "defaultValue");
- if ( defaultValueFromAttrs != null ) {
- defaultValue = getMapper().parseValue(defaultValueFromAttrs);
- } else if (defaultStringValue != null) {
- defaultValue = getMapper().parseValue(defaultStringValue);
- } else {
- throw new IllegalArgumentException();
- }
-
- description = attrs.getAttributeValue(androidns, "dialogMessage");
- valueText = attrs.getAttributeValue(androidns, "text");
- }
-
- @Override
- @NotNull
- protected final LinearLayout onCreateDialogView() {
- if (shouldPersist()) {
- value = getPersistedValue();
- }
-
- final LinearLayout result = new LinearLayout(context);
- result.setOrientation(LinearLayout.VERTICAL);
- result.setPadding(6, 6, 6, 6);
-
- if (description != null) {
- final TextView splashText = new TextView(context);
- splashText.setText(description);
- result.addView(splashText);
- }
-
- if (needValueText) {
- valueTextView = new TextView(context);
- valueTextView.setGravity(Gravity.CENTER_HORIZONTAL);
- valueTextView.setTextSize(32);
-
- final LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
- LinearLayout.LayoutParams.FILL_PARENT,
- LinearLayout.LayoutParams.WRAP_CONTENT);
- result.addView(valueTextView, params);
- }
-
- final View v = createPreferenceView();
- initPreferenceView(v);
-
- final LinearLayout.LayoutParams params = getParams();
- if (params != null) {
- result.addView(v, params);
- } else {
- result.addView(v);
- }
-
- return result;
- }
-
- @Nullable
- protected abstract LinearLayout.LayoutParams getParams();
-
- @Override
- protected void onSetInitialValue(boolean restore, Object defaultValue) {
- super.onSetInitialValue(restore, defaultValue);
-
- if (restore) {
- if (shouldPersist()) {
- value = getPersistedValue();
- } else {
- value = this.defaultValue;
- }
- } else {
- value = (T) defaultValue;
- if (shouldPersist()) {
- persist(this.value);
- }
- }
- }
-
- @Override
- protected void onBindDialogView(View v) {
- super.onBindDialogView(v);
- initPreferenceView(null);
- }
-
- @NotNull
- protected abstract View createPreferenceView();
-
- protected abstract void initPreferenceView(@Nullable View v);
-
- @Nullable
- private T getPersistedValue() {
- String persistedString = getPersistedString(defaultStringValue);
- if ( persistedString == defaultStringValue ) {
- return defaultValue;
- } else {
- return getMapper().parseValue(persistedString);
- }
- }
-
- protected void persistValue(@Nullable T value) {
- Log.d(AbstractDialogPreference.class.getName(), "Trying to persist value: " + value);
- this.value = value;
-
- Log.d(AbstractDialogPreference.class.getName(), "android.preference.Preference.callChangeListener()");
- if (callChangeListener(value)) {
- Log.d(AbstractDialogPreference.class.getName(), "android.preference.Preference.shouldPersist()");
- if (shouldPersist()) {
- Log.d(AbstractDialogPreference.class.getName(), "org.solovyev.android.view.prefs.AbstractDialogPreference.persist()");
- persist(value);
- }
- }
- }
-
- private void persist(@Nullable T value) {
- if (value != null) {
- final String toBePersistedString = getMapper().formatValue(value);
- if (toBePersistedString != null) {
- if ( callChangeListener(toBePersistedString) ) {
- persistString(toBePersistedString);
- }
- }
- }
- }
-
- @NotNull
- protected abstract Mapper getMapper();
-}
diff --git a/src/main/java/org/solovyev/android/view/prefs/AbstractPreference.java b/src/main/java/org/solovyev/android/view/prefs/AbstractPreference.java
deleted file mode 100644
index bf2f16a9..00000000
--- a/src/main/java/org/solovyev/android/view/prefs/AbstractPreference.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.android.view.prefs;
-
-import android.content.SharedPreferences;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-/**
- * User: serso
- * Date: 12/25/11
- * Time: 12:23 PM
- */
-public abstract class AbstractPreference implements Preference {
-
- @NotNull
- private final String key;
-
- private final T defaultValue;
-
- protected AbstractPreference(@NotNull String key, @Nullable T defaultValue) {
- this.key = key;
- this.defaultValue = defaultValue;
- }
-
- @NotNull
- public String getKey() {
- return key;
- }
-
- public T getDefaultValue() {
- return defaultValue;
- }
-
- @Override
- public final T getPreference(@NotNull SharedPreferences preferences) {
- if ( preferences.contains(this.key) ) {
- return getPersistedValue(preferences);
- } else {
- return this.defaultValue;
- }
- }
-
- @Nullable
- protected abstract T getPersistedValue(@NotNull SharedPreferences preferences);
-
- @Override
- public void putDefault(@NotNull SharedPreferences preferences) {
- putPreference(preferences, this.defaultValue);
- }
-
- @Override
- public void putPreference(@NotNull SharedPreferences preferences, @Nullable T value) {
- if (value != null) {
- final SharedPreferences.Editor editor = preferences.edit();
- putPersistedValue(editor, value);
- editor.commit();
- }
- }
-
- protected abstract void putPersistedValue(@NotNull SharedPreferences.Editor editor, @NotNull T value);
-}
diff --git a/src/main/java/org/solovyev/android/view/prefs/AdViewPreference.java b/src/main/java/org/solovyev/android/view/prefs/AdViewPreference.java
deleted file mode 100644
index bb5ae999..00000000
--- a/src/main/java/org/solovyev/android/view/prefs/AdViewPreference.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2009-2012. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.android.view.prefs;
-
-import android.app.Activity;
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.View;
-import android.view.ViewGroup;
-import com.google.ads.AdView;
-import org.jetbrains.annotations.Nullable;
-import org.solovyev.android.calculator.CalculatorApplication;
-
-/**
- * User: serso
- * Date: 1/14/12
- * Time: 6:47 PM
- */
-public class AdViewPreference extends android.preference.Preference {
-
- @Nullable
- private AdView adView;
-
- public AdViewPreference(Context context) {
- super(context, null);
- }
-
- public AdViewPreference(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- @Override
- protected View onCreateView(ViewGroup parent) {
- // this will create the linear layout defined in ads_layout.xml
- View view = super.onCreateView(parent);
-
- if (view instanceof ViewGroup) {
- adView = CalculatorApplication.inflateAd((Activity) getContext(), ((ViewGroup) view), 0);
- }
-
- return view;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/org/solovyev/android/view/prefs/BooleanPreference.java b/src/main/java/org/solovyev/android/view/prefs/BooleanPreference.java
deleted file mode 100644
index fde4674d..00000000
--- a/src/main/java/org/solovyev/android/view/prefs/BooleanPreference.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.android.view.prefs;
-
-import android.content.SharedPreferences;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-/**
- * User: serso
- * Date: 12/25/11
- * Time: 1:06 PM
- */
-public class BooleanPreference extends AbstractPreference{
-
- public BooleanPreference(@NotNull String key, @Nullable Boolean defaultValue) {
- super(key, defaultValue);
- }
-
- @Override
- protected Boolean getPersistedValue(@NotNull SharedPreferences preferences) {
- return preferences.getBoolean(getKey(), false);
- }
-
- @Override
- protected void putPersistedValue(@NotNull SharedPreferences.Editor editor, @NotNull Boolean value) {
- editor.putBoolean(getKey(), value);
- }
-}
diff --git a/src/main/java/org/solovyev/android/view/prefs/EnumMapper.java b/src/main/java/org/solovyev/android/view/prefs/EnumMapper.java
deleted file mode 100644
index ece18e45..00000000
--- a/src/main/java/org/solovyev/android/view/prefs/EnumMapper.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.android.view.prefs;
-
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import org.solovyev.common.utils.Mapper;
-
-/**
- * User: serso
- * Date: 12/25/11
- * Time: 1:17 PM
- */
-public class EnumMapper implements Mapper{
-
- @NotNull
- private final Class enumClass;
-
- public EnumMapper(@NotNull Class enumClass) {
- this.enumClass = enumClass;
- }
-
- public static Mapper newInstance(@NotNull Class enumClass) {
- return new EnumMapper(enumClass);
- }
-
- @Override
- public String formatValue(@Nullable T value) throws IllegalArgumentException {
- return value == null ? null : value.name();
- }
-
- @Override
- public T parseValue(@Nullable String value) throws IllegalArgumentException {
- return value == null ? null : (T)Enum.valueOf(enumClass, value);
- }
-}
diff --git a/src/main/java/org/solovyev/android/view/prefs/FloatPreference.java b/src/main/java/org/solovyev/android/view/prefs/FloatPreference.java
deleted file mode 100644
index 9caf6ee6..00000000
--- a/src/main/java/org/solovyev/android/view/prefs/FloatPreference.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.android.view.prefs;
-
-import android.content.SharedPreferences;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-/**
- * User: serso
- * Date: 12/25/11
- * Time: 1:08 PM
- */
-public class FloatPreference extends AbstractPreference {
-
- protected FloatPreference(@NotNull String key, @Nullable Float defaultValue) {
- super(key, defaultValue);
- }
-
- @Override
- protected Float getPersistedValue(@NotNull SharedPreferences preferences) {
- return preferences.getFloat(getKey(), -1f);
- }
-
- @Override
- protected void putPersistedValue(@NotNull SharedPreferences.Editor editor, @NotNull Float value) {
- editor.putFloat(getKey(), value);
- }
-}
diff --git a/src/main/java/org/solovyev/android/view/prefs/FloatRangeSeekBarPreference.java b/src/main/java/org/solovyev/android/view/prefs/FloatRangeSeekBarPreference.java
deleted file mode 100644
index 91072fbb..00000000
--- a/src/main/java/org/solovyev/android/view/prefs/FloatRangeSeekBarPreference.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.android.view.prefs;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import org.jetbrains.annotations.NotNull;
-import org.solovyev.common.NumberIntervalMapper;
-import org.solovyev.common.utils.Interval;
-import org.solovyev.common.utils.Mapper;
-
-/**
- * User: serso
- * Date: 9/21/11
- * Time: 11:41 PM
- */
-public class FloatRangeSeekBarPreference extends RangeSeekBarPreference {
-
- public FloatRangeSeekBarPreference(@NotNull Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- @NotNull
- @Override
- protected Mapper> getMapper() {
- return new NumberIntervalMapper(Float.class);
- }
-}
diff --git a/src/main/java/org/solovyev/android/view/prefs/IntegerPreference.java b/src/main/java/org/solovyev/android/view/prefs/IntegerPreference.java
deleted file mode 100644
index 658776fe..00000000
--- a/src/main/java/org/solovyev/android/view/prefs/IntegerPreference.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.android.view.prefs;
-
-import android.content.SharedPreferences;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-/**
- * User: serso
- * Date: 12/25/11
- * Time: 12:47 PM
- */
-public class IntegerPreference extends AbstractPreference {
-
- public IntegerPreference(@NotNull String key, @Nullable Integer defaultValue) {
- super(key, defaultValue);
- }
-
- @Override
- protected Integer getPersistedValue(@NotNull SharedPreferences preferences) {
- return preferences.getInt(getKey(), -1);
- }
-
- @Override
- protected void putPersistedValue(@NotNull SharedPreferences.Editor editor, @NotNull Integer value) {
- editor.putInt(getKey(), value);
- }
-
-}
diff --git a/src/main/java/org/solovyev/android/view/prefs/IntegerRangeSeekBarPreference.java b/src/main/java/org/solovyev/android/view/prefs/IntegerRangeSeekBarPreference.java
deleted file mode 100644
index c24dd8fa..00000000
--- a/src/main/java/org/solovyev/android/view/prefs/IntegerRangeSeekBarPreference.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.android.view.prefs;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import org.jetbrains.annotations.NotNull;
-import org.solovyev.common.NumberIntervalMapper;
-import org.solovyev.common.utils.*;
-
-/**
- * User: serso
- * Date: 9/19/11
- * Time: 10:04 PM
- */
-public class IntegerRangeSeekBarPreference extends RangeSeekBarPreference {
-
- public IntegerRangeSeekBarPreference(@NotNull Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- @NotNull
- @Override
- protected Mapper> getMapper() {
- return new NumberIntervalMapper(Integer.class);
- }
-
-}
diff --git a/src/main/java/org/solovyev/android/view/prefs/LongPreference.java b/src/main/java/org/solovyev/android/view/prefs/LongPreference.java
deleted file mode 100644
index 29989775..00000000
--- a/src/main/java/org/solovyev/android/view/prefs/LongPreference.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.android.view.prefs;
-
-import android.content.SharedPreferences;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-/**
- * User: serso
- * Date: 12/25/11
- * Time: 1:07 PM
- */
-public class LongPreference extends AbstractPreference {
-
- protected LongPreference(@NotNull String key, @Nullable Long defaultValue) {
- super(key, defaultValue);
- }
-
- @Override
- protected Long getPersistedValue(@NotNull SharedPreferences preferences) {
- return preferences.getLong(getKey(), -1);
- }
-
- @Override
- protected void putPersistedValue(@NotNull SharedPreferences.Editor editor, @NotNull Long value) {
- editor.putLong(getKey(), value);
- }
-}
diff --git a/src/main/java/org/solovyev/android/view/prefs/NumberPickerDialogPreference.java b/src/main/java/org/solovyev/android/view/prefs/NumberPickerDialogPreference.java
deleted file mode 100644
index f45706c8..00000000
--- a/src/main/java/org/solovyev/android/view/prefs/NumberPickerDialogPreference.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.android.view.prefs;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.Gravity;
-import android.view.View;
-import android.widget.LinearLayout;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import org.solovyev.android.view.widgets.NumberPicker;
-import org.solovyev.common.NumberIntervalMapper;
-import org.solovyev.common.utils.Interval;
-import org.solovyev.common.utils.Mapper;
-
-/**
- * User: serso
- * Date: 9/26/11
- * Time: 10:31 PM
- */
-public class NumberPickerDialogPreference extends AbstractDialogPreference implements NumberPicker.OnChangedListener {
-
- private static final NumberIntervalMapper INTEGER_NUMBER_INTERVAL_MAPPER = new NumberIntervalMapper(Integer.class);
-
- @NotNull
- private NumberPicker numberPicker;
-
- @NotNull
- private final Interval boundaries;
-
- public NumberPickerDialogPreference(Context context, AttributeSet attrs) {
- super(context, attrs, null, false);
-
- //noinspection ConstantConditions
- boundaries = INTEGER_NUMBER_INTERVAL_MAPPER.parseValue(attrs.getAttributeValue(localNameSpace, "boundaries"));
-
- createPreferenceView();
- }
-
- @Override
- protected LinearLayout.LayoutParams getParams() {
- final LinearLayout.LayoutParams result = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
- result.gravity = Gravity.CENTER;
-
- return result;
- }
-
- @NotNull
- @Override
- protected View createPreferenceView() {
- this.numberPicker = new NumberPicker(context);
- this.numberPicker.setOnChangeListener(this);
-
- initPreferenceView(this.numberPicker);
-
- return numberPicker;
- }
-
- @Override
- protected void initPreferenceView(@Nullable View v) {
-
- if ( v == null ) {
- v = numberPicker;
- }
-
- if (value != null) {
- ((NumberPicker) v).setRange(boundaries.getLeftBorder(), boundaries.getRightBorder());
- ((NumberPicker) v).setCurrent(value);
- }
- }
-
- @NotNull
- @Override
- protected Mapper getMapper() {
- return INTEGER_NUMBER_INTERVAL_MAPPER.getMapper();
- }
-
- @Override
- public void onChanged(NumberPicker picker, int oldVal, int newVal) {
- persistValue(newVal);
- }
-}
diff --git a/src/main/java/org/solovyev/android/view/prefs/Preference.java b/src/main/java/org/solovyev/android/view/prefs/Preference.java
deleted file mode 100644
index b250b0a8..00000000
--- a/src/main/java/org/solovyev/android/view/prefs/Preference.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.android.view.prefs;
-
-import android.content.SharedPreferences;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-/**
- * User: serso
- * Date: 12/25/11
- * Time: 12:21 PM
- */
-
-public interface Preference {
-
- @NotNull
- String getKey();
-
- T getDefaultValue();
-
- T getPreference(@NotNull SharedPreferences preferences);
-
- void putPreference(@NotNull SharedPreferences preferences, @Nullable T value);
-
- void putDefault(@NotNull SharedPreferences preferences);
-
-}
diff --git a/src/main/java/org/solovyev/android/view/prefs/RangeSeekBarPreference.java b/src/main/java/org/solovyev/android/view/prefs/RangeSeekBarPreference.java
deleted file mode 100644
index 675d4315..00000000
--- a/src/main/java/org/solovyev/android/view/prefs/RangeSeekBarPreference.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package org.solovyev.android.view.prefs;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.LinearLayout;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import org.solovyev.android.view.widgets.AbstractRangeSeekBar;
-import org.solovyev.android.view.widgets.NumberRangeSeekBar;
-import org.solovyev.common.utils.Interval;
-import org.solovyev.common.utils.NumberInterval;
-
-/**
- * User: serso
- * Date: 9/19/11
- * Time: 12:27 PM
- */
-public abstract class RangeSeekBarPreference extends AbstractDialogPreference> implements AbstractRangeSeekBar.OnRangeSeekBarChangeListener {
-
- @NotNull
- private AbstractRangeSeekBar rangeSeekBar;
-
- @NotNull
- private final Interval boundaries;
-
- private Integer steps;
-
- public RangeSeekBarPreference(@NotNull Context context, AttributeSet attrs) {
- super(context, attrs, null, true);
-
- //noinspection ConstantConditions
- boundaries = getMapper().parseValue(attrs.getAttributeValue(localNameSpace, "boundaries"));
-
- steps = attrs.getAttributeIntValue(localNameSpace, "steps", -1);
- if ( steps.equals(-1) ) {
- steps = null;
- }
-
- assert steps == null || steps >= 2;
-
- createPreferenceView();
- }
-
- @NotNull
- protected View createPreferenceView() {
- this.rangeSeekBar = new NumberRangeSeekBar(boundaries, steps, context);
- this.rangeSeekBar.setNotifyWhileDragging(true);
- this.rangeSeekBar.setOnRangeSeekBarChangeListener(this);
-
- initPreferenceView(this.rangeSeekBar);
-
- return this.rangeSeekBar;
- }
-
- @Override
- protected LinearLayout.LayoutParams getParams() {
- return null;
- }
-
- @Override
- protected void initPreferenceView(@Nullable View v) {
- if ( v == null ) {
- v = rangeSeekBar;
- }
-
- if (value != null) {
- ((AbstractRangeSeekBar) v).setSelectedMinValue(value.getLeftBorder());
- ((AbstractRangeSeekBar) v).setSelectedMaxValue(value.getRightBorder());
- setValueText(value);
- }
- }
-
- @Override
- public void rangeSeekBarValuesChanged(T minValue, T maxValue, boolean changeComplete) {
- final Interval interval = new NumberInterval(minValue, maxValue);
-
- if (changeComplete) {
- persistValue(interval);
- }
-
- setValueText(interval);
- }
-
- private void setValueText(@NotNull Interval interval) {
- final String t = String.valueOf(interval);
- valueTextView.setText(valueText == null ? t : t.concat(valueText));
- }
-}
diff --git a/src/main/java/org/solovyev/android/view/prefs/SeekBarPreference.java b/src/main/java/org/solovyev/android/view/prefs/SeekBarPreference.java
deleted file mode 100644
index 869ea0e9..00000000
--- a/src/main/java/org/solovyev/android/view/prefs/SeekBarPreference.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.android.view.prefs;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.LinearLayout;
-import android.widget.SeekBar;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import org.solovyev.common.NumberMapper;
-import org.solovyev.common.utils.Mapper;
-
-
-/* The following code was written by Matthew Wiggins
- * and is released under the APACHE 2.0 license
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- */
-
-public class SeekBarPreference extends AbstractDialogPreference implements SeekBar.OnSeekBarChangeListener {
-
- @NotNull
- private SeekBar seekBar;
-
- private int max = 0;
-
- public SeekBarPreference(Context context, AttributeSet attrs) {
- super(context, attrs, "50", true);
-
- max = attrs.getAttributeIntValue(androidns, "max", 100);
- }
-
- @Override
- protected LinearLayout.LayoutParams getParams() {
- return new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
- }
-
- @NotNull
- @Override
- protected View createPreferenceView() {
- seekBar = new SeekBar(context);
- seekBar.setOnSeekBarChangeListener(this);
-
- return seekBar;
- }
-
- @Override
- protected void initPreferenceView(@Nullable View v ) {
- if ( v == null) {
- v = seekBar;
- }
-
- ((SeekBar) v).setMax(max);
- if (value != null) {
- ((SeekBar) v).setProgress(value);
- setValueText(value);
- }
- }
-
- @NotNull
- @Override
- protected Mapper getMapper() {
- return new NumberMapper(Integer.class);
- }
-
- public void onProgressChanged(SeekBar seek, int value, boolean fromTouch) {
- setValueText(value);
-
- persistValue(value);
- }
-
- private void setValueText(int value) {
- String t = String.valueOf(value);
- valueTextView.setText(valueText == null ? t : t.concat(valueText));
- }
-
- public void onStartTrackingTouch(SeekBar seek) {
- }
-
- public void onStopTrackingTouch(SeekBar seek) {
- }
-
- public void setMax(int max) {
- this.max = max;
- }
-
- public int getMax() {
- return max;
- }
-
- public void setProgress(int progress) {
- value = progress;
- seekBar.setProgress(progress);
- }
-
- public int getProgress() {
- return value;
- }
-}
-
diff --git a/src/main/java/org/solovyev/android/view/prefs/StringPreference.java b/src/main/java/org/solovyev/android/view/prefs/StringPreference.java
deleted file mode 100644
index 56ce5aca..00000000
--- a/src/main/java/org/solovyev/android/view/prefs/StringPreference.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.android.view.prefs;
-
-import android.content.SharedPreferences;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import org.solovyev.common.utils.Mapper;
-import org.solovyev.common.utils.StringMapper;
-
-/**
- * User: serso
- * Date: 12/25/11
- * Time: 12:37 PM
- */
-public class StringPreference extends AbstractPreference {
-
- @NotNull
- private final Mapper mapper;
-
- public StringPreference(@NotNull String id, @Nullable T defaultValue, @NotNull Mapper mapper) {
- super(id, defaultValue);
- this.mapper = mapper;
- }
-
- @NotNull
- public static StringPreference newInstance(@NotNull String id, @Nullable String defaultValue) {
- return new StringPreference(id, defaultValue, new StringMapper());
- }
-
- @NotNull
- public static StringPreference newInstance(@NotNull String id, @Nullable String defaultValue, @NotNull Mapper parser) {
- return new StringPreference(id, parser.parseValue(defaultValue), parser);
- }
-
- @NotNull
- public static StringPreference newInstance(@NotNull String id, @Nullable T defaultValue, @NotNull Class enumType) {
- return new StringPreference(id, defaultValue, new EnumMapper(enumType));
- }
-
- @Override
- protected T getPersistedValue(@NotNull SharedPreferences preferences) {
- return mapper.parseValue(preferences.getString(getKey(), null));
- }
-
- @Override
- protected void putPersistedValue(@NotNull SharedPreferences.Editor editor, @NotNull T value) {
- editor.putString(getKey(), mapper.formatValue(value));
- }
-}
diff --git a/src/main/java/org/solovyev/android/view/widgets/AbstractRangeSeekBar.java b/src/main/java/org/solovyev/android/view/widgets/AbstractRangeSeekBar.java
deleted file mode 100644
index 60f2beeb..00000000
--- a/src/main/java/org/solovyev/android/view/widgets/AbstractRangeSeekBar.java
+++ /dev/null
@@ -1,422 +0,0 @@
-package org.solovyev.android.view.widgets;
-
-/**
- * User: serso
- * Date: 9/19/11
- * Time: 3:30 PM
- */
-
-import android.content.Context;
-import android.graphics.*;
-import android.graphics.Paint.Style;
-import android.view.MotionEvent;
-import android.widget.ImageView;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import org.solovyev.android.calculator.R;
-import org.solovyev.common.math.LinearNormalizer;
-import org.solovyev.common.math.Normalizer;
-import org.solovyev.common.utils.Converter;
-
-/**
- * Widget that lets users select a minimum and maximum value on a given numerical range.
- * The range value types can be one of Long, Double, Integer, Float, Short, Byte or BigDecimal.
- *
- * @param The Number type of the range values. One of Long, Double, Integer, Float, Short, Byte or BigDecimal.
- * @author Stephan Tittel (stephan.tittel@kom.tu-darmstadt.de)
- */
-public abstract class AbstractRangeSeekBar extends ImageView {
-
- @NotNull
- private final Paint paint = new Paint();
-
- @NotNull
- private final ThumbContainer tc;
-
- @NotNull
- private final Converter toDoubleConverter;
-
- @NotNull
- private final Converter toTConverter;
-
- @NotNull
- private final T minValue, maxValue;
-
- @NotNull
- private final Normalizer fromValueNormalizer;
-
- @NotNull
- private final Normalizer fromScreenNormalizer;
-
- private double normalizedMinValue = 0d;
-
- private double normalizedMaxValue = 1d;
-
- private Thumb pressedThumb = null;
-
- private boolean notifyWhileDragging = false;
-
-
- @Nullable
- private OnRangeSeekBarChangeListener listener;
-
- /**
- * Creates a new RangeSeekBar.
- *
- * @param minValue The minimum value of the selectable range.
- * @param maxValue The maximum value of the selectable range.
- * @param steps number of steps to be used in range seek bar
- * @param context parent context
- * @throws IllegalArgumentException Will be thrown if min/max value types are not one of Long, Double, Integer, Float, Short, Byte or BigDecimal.
- */
- public AbstractRangeSeekBar(@NotNull T minValue, @NotNull T maxValue, @Nullable Integer steps, Context context) throws IllegalArgumentException {
- super(context);
-
- this.minValue = minValue;
- this.maxValue = maxValue;
-
- this.toDoubleConverter = getToDoubleConverter();
- this.toTConverter = getToTConverter();
-
- fromValueNormalizer = new LinearNormalizer(toDoubleConverter.convert(minValue), toDoubleConverter.convert(maxValue));
-
- tc = new ThumbContainer();
-
- fromScreenNormalizer = new Normalizer() {
- @Override
- public double normalize(double value) {
- int width = getWidth();
- if (width <= 2 * tc.padding) {
- // prevent division by zero, simply return 0.
- return 0d;
- } else {
- double result = (value - tc.padding) / (width - 2 * tc.padding);
- return Math.min(1d, Math.max(0d, result));
- }
- }
-
- @Override
- public double denormalize(double value) {
- return (float) (tc.padding + value * (getWidth() - 2 * tc.padding));
- }
- };
- }
-
- @NotNull
- protected abstract Converter getToTConverter();
-
- @NotNull
- protected abstract Converter getToDoubleConverter();
-
- public boolean isNotifyWhileDragging() {
- return notifyWhileDragging;
- }
-
- /**
- * Should the widget notify the listener callback while the user is still dragging a thumb? Default is false.
- *
- * @param flag
- */
- public void setNotifyWhileDragging(boolean flag) {
- this.notifyWhileDragging = flag;
- }
-
- /**
- * Returns the absolute minimum value of the range that has been set at construction time.
- *
- * @return The absolute minimum value of the range.
- */
- @NotNull
- public T getMinValue() {
- return minValue;
- }
-
- /**
- * Returns the absolute maximum value of the range that has been set at construction time.
- *
- * @return The absolute maximum value of the range.
- */
- @NotNull
- public T getMaxValue() {
- return maxValue;
- }
-
- /**
- * Returns the currently selected min value.
- *
- * @return The currently selected min value.
- */
- public T getSelectedMinValue() {
- return denormalizeValue(normalizedMinValue);
- }
-
- /**
- * Sets the currently selected minimum value. The widget will be invalidated and redrawn.
- *
- * @param value The Number value to set the minimum value to. Will be clamped to given absolute minimum/maximum range.
- */
- public void setSelectedMinValue(@NotNull T value) {
- setNormalizedMinValue(normalizeValue(value));
- }
-
- /**
- * Returns the currently selected max value.
- *
- * @return The currently selected max value.
- */
- public T getSelectedMaxValue() {
- return denormalizeValue(normalizedMaxValue);
- }
-
- /**
- * Sets the currently selected maximum value. The widget will be invalidated and redrawn.
- *
- * @param value The Number value to set the maximum value to. Will be clamped to given absolute minimum/maximum range.
- */
- public void setSelectedMaxValue(@NotNull T value) {
- setNormalizedMaxValue(normalizeValue(value));
- }
-
- /**
- * Registers given listener callback to notify about changed selected values.
- *
- * @param listener The listener to notify about changed selected values.
- */
- public void setOnRangeSeekBarChangeListener(OnRangeSeekBarChangeListener listener) {
- this.listener = listener;
- }
-
- /**
- * Handles thumb selection and movement. Notifies listener callback on certain events.
- */
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN:
- pressedThumb = evalPressedThumb(event.getX());
- invalidate();
- break;
- case MotionEvent.ACTION_MOVE:
- if (pressedThumb != null) {
-
- double value = convertToNormalizedValue(event.getX());
-
- if (Thumb.MIN.equals(pressedThumb)) {
- setNormalizedMinValue(value);
- } else if (Thumb.MAX.equals(pressedThumb)) {
- setNormalizedMaxValue(value);
- }
-
- if (notifyWhileDragging && listener != null) {
- listener.rangeSeekBarValuesChanged(getSelectedMinValue(), getSelectedMaxValue(), false);
- }
- }
- break;
- case MotionEvent.ACTION_UP:
- case MotionEvent.ACTION_CANCEL:
- pressedThumb = null;
- invalidate();
- if (listener != null) {
- listener.rangeSeekBarValuesChanged(getSelectedMinValue(), getSelectedMaxValue(), true);
- }
- break;
- }
- return true;
- }
-
- /**
- * Ensures correct size of the widget.
- */
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- int width = 200;
- if (MeasureSpec.UNSPECIFIED != MeasureSpec.getMode(widthMeasureSpec)) {
- width = MeasureSpec.getSize(widthMeasureSpec);
- }
-
- int height = tc.thumbImage.getHeight();
- if (MeasureSpec.UNSPECIFIED != MeasureSpec.getMode(heightMeasureSpec)) {
- height = Math.min(height, MeasureSpec.getSize(heightMeasureSpec));
- }
- setMeasuredDimension(width, height);
- }
-
- /**
- * Draws the widget on the given canvas.
- */
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- // draw seek bar background line
- final RectF rect = tc.getRect();
- paint.setStyle(Style.FILL);
- paint.setColor(Color.GRAY);
- canvas.drawRect(rect, paint);
- // draw seek bar active range line
- rect.left = convertToScreenValue(normalizedMinValue);
- rect.right = convertToScreenValue(normalizedMaxValue);
- // orange color
- paint.setColor(Color.rgb(255, 165, 0));
- canvas.drawRect(rect, paint);
-
- // draw minimum thumb
- drawThumb(convertToScreenValue(normalizedMinValue), Thumb.MIN == pressedThumb, canvas);
-
- // draw maximum thumb
- drawThumb(convertToScreenValue(normalizedMaxValue), Thumb.MAX == pressedThumb, canvas);
- }
-
- /**
- * Draws the "normal" resp. "pressed" thumb image on specified x-coordinate.
- *
- * @param normalizedToScreenValue The x-coordinate in screen space where to draw the image.
- * @param pressed Is the thumb currently in "pressed" state?
- * @param canvas The canvas to draw upon.
- */
- private void drawThumb(float normalizedToScreenValue, boolean pressed, Canvas canvas) {
- canvas.drawBitmap(tc.getImage(pressed), normalizedToScreenValue - tc.thumbHalfWidth, (float) ((0.5f * getHeight()) - tc.thumbHalfHeight), paint);
- }
-
- /**
- * Decides which (if any) thumb is touched by the given x-coordinate.
- *
- * @param touchX The x-coordinate of a touch event in screen space.
- * @return The pressed thumb or null if none has been touched.
- */
- private Thumb evalPressedThumb(float touchX) {
- Thumb result = null;
- boolean minThumbPressed = isInThumbRange(touchX, normalizedMinValue);
- boolean maxThumbPressed = isInThumbRange(touchX, normalizedMaxValue);
- if (minThumbPressed && maxThumbPressed) {
- // if both thumbs are pressed (they lie on top of each other), choose the one with more room to drag. this avoids "stalling" the thumbs in a corner, not being able to drag them apart anymore.
- result = (touchX / getWidth() > 0.5f) ? Thumb.MIN : Thumb.MAX;
- } else if (minThumbPressed) {
- result = Thumb.MIN;
- } else if (maxThumbPressed) {
- result = Thumb.MAX;
- }
- return result;
- }
-
- /**
- * Decides if given x-coordinate in screen space needs to be interpreted as "within" the normalized thumb x-coordinate.
- *
- * @param touchX The x-coordinate in screen space to check.
- * @param normalizedThumbValue The normalized x-coordinate of the thumb to check.
- * @return true if x-coordinate is in thumb range, false otherwise.
- */
- private boolean isInThumbRange(float touchX, double normalizedThumbValue) {
- return Math.abs(touchX - convertToScreenValue(normalizedThumbValue)) <= tc.thumbHalfWidth;
- }
-
- /**
- * Sets normalized min value to value so that 0 <= value <= normalized max value <= 1.
- * The View will get invalidated when calling this method.
- *
- * @param value The new normalized min value to set.
- */
- private void setNormalizedMinValue(double value) {
- normalizedMinValue = Math.max(0d, Math.min(1d, Math.min(value, normalizedMaxValue)));
- invalidate();
- }
-
- /**
- * Sets normalized max value to value so that 0 <= normalized min value <= value <= 1.
- * The View will get invalidated when calling this method.
- *
- * @param value The new normalized max value to set.
- */
- private void setNormalizedMaxValue(double value) {
- normalizedMaxValue = Math.max(0d, Math.min(1d, Math.max(value, normalizedMinValue)));
- invalidate();
- }
-
- /**
- * Converts a normalized value to a Number object in the value space between absolute minimum and maximum.
- *
- * @param normalized
- * @return
- */
- @SuppressWarnings("unchecked")
- private T denormalizeValue(double normalized) {
- return toTConverter.convert(fromValueNormalizer.denormalize(normalized));
- }
-
- /**
- * Converts the given Number value to a normalized double.
- *
- * @param value The Number value to normalize.
- * @return The normalized double.
- */
- private double normalizeValue(T value) {
- return fromValueNormalizer.normalize(toDoubleConverter.convert(value));
- }
-
- /**
- * Converts a normalized value into screen space.
- *
- * @param normalizedValue The normalized value to convert.
- * @return The converted value in screen space.
- */
- private float convertToScreenValue(double normalizedValue) {
- return (float)this.fromScreenNormalizer.denormalize(normalizedValue);
- }
-
- /**
- * Converts screen space x-coordinates into normalized values.
- *
- * @param screenValue The x-coordinate in screen space to convert.
- * @return The normalized value.
- */
- private double convertToNormalizedValue(float screenValue) {
- return this.fromScreenNormalizer.normalize(screenValue);
- }
-
- /**
- * Callback listener interface to notify about changed range values.
- *
- * @param The Number type the RangeSeekBar has been declared with.
- * @author Stephan Tittel (stephan.tittel@kom.tu-darmstadt.de)
- */
- public interface OnRangeSeekBarChangeListener {
-
- void rangeSeekBarValuesChanged(T minValue, T maxValue, boolean changeComplete);
-
- }
-
- /**
- * Thumb constants (min and max).
- *
- * @author Stephan Tittel (stephan.tittel@kom.tu-darmstadt.de)
- */
- private static enum Thumb {
- MIN, MAX
- }
-
- private class ThumbContainer {
- @NotNull
- private final Bitmap thumbImage = BitmapFactory.decodeResource(getResources(), R.drawable.seek_thumb_normal);
-
- @NotNull
- private final Bitmap thumbPressedImage = BitmapFactory.decodeResource(getResources(), R.drawable.seek_thumb_pressed);
-
- private final float thumbWidth = thumbImage.getWidth();
-
- private final float thumbHalfWidth = 0.5f * thumbWidth;
-
- private final float thumbHalfHeight = 0.5f * thumbImage.getHeight();
-
- private final float lineHeight = 0.3f * thumbHalfHeight;
-
- private final float padding = thumbHalfWidth;
-
- public RectF getRect() {
- return new RectF(padding, 0.5f * (getHeight() - lineHeight), getWidth() - padding, 0.5f * (getHeight() + lineHeight));
- }
-
- public Bitmap getImage(boolean pressed) {
- return pressed ? thumbPressedImage : thumbImage;
- }
- }
-
-}
diff --git a/src/main/java/org/solovyev/android/view/widgets/ColorButton.java b/src/main/java/org/solovyev/android/view/widgets/ColorButton.java
deleted file mode 100644
index 2c71b923..00000000
--- a/src/main/java/org/solovyev/android/view/widgets/ColorButton.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * 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.
- */
-
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- */
-
-package org.solovyev.android.view.widgets;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.Paint.Style;
-import android.graphics.drawable.Drawable;
-import android.os.Vibrator;
-import android.preference.PreferenceManager;
-import android.util.AttributeSet;
-import android.view.MotionEvent;
-import android.widget.Button;
-import org.jetbrains.annotations.NotNull;
-import org.solovyev.android.calculator.R;
-import org.solovyev.android.view.FontSizeAdjuster;
-import org.solovyev.common.utils.CollectionsUtils;
-import org.solovyev.common.utils.Point2d;
-import org.solovyev.common.utils.StringUtils;
-
-import java.util.Arrays;
-
-/**
- * NOTE: copied from com.android.calculator2.ColorButton
- */
-
-/**
- * Button with click-animation effect.
- */
-public class ColorButton extends Button {
-
- private int CLICK_FEEDBACK_COLOR;
- private static final int CLICK_FEEDBACK_INTERVAL = 10;
- private static final int CLICK_FEEDBACK_DURATION = 350;
-
- @NotNull
- private Point2d textPosition;
- private long animationStart;
- private Paint feedbackPaint;
-
- @NotNull
- private final OnClickListenerVibrator onClickListener;
-
- private static final float H_TEXT_POSITION_DEFAULT_VALUE = 0.5f;
-
- private float hTextPosition = H_TEXT_POSITION_DEFAULT_VALUE;
-
- public ColorButton(Context context, AttributeSet attrs) {
- this(context, attrs, true);
- }
-
- public ColorButton(Context context, AttributeSet attrs, boolean init) {
- super(context, attrs);
-
- TypedArray a = context.obtainStyledAttributes(attrs, org.solovyev.android.calculator.R.styleable.DragButton);
- final int N = a.getIndexCount();
- for (int i = 0; i < N; i++) {
- int attr = a.getIndex(i);
-
- final String attrValue = a.getString(attr);
-
- if (!StringUtils.isEmpty(attrValue)) {
- switch (attr) {
- case R.styleable.DragButton_hTextPosition:
- this.hTextPosition = Float.valueOf(attrValue);
- break;
- }
- }
- }
-
- if (init) {
- init(context);
- }
-
- this.onClickListener = new OnClickListenerVibrator((Vibrator)context.getSystemService(Context.VIBRATOR_SERVICE), PreferenceManager.getDefaultSharedPreferences(context));
- }
-
- protected void init(Context context) {
- final Resources resources = getResources();
-
- CLICK_FEEDBACK_COLOR = resources.getColor(org.solovyev.android.calculator.R.color.magic_flame);
- feedbackPaint = new Paint();
- feedbackPaint.setStyle(Style.STROKE);
- feedbackPaint.setStrokeWidth(2);
-
-
- if (CollectionsUtils.contains(getText().toString(), Arrays.asList("+", "-", "/", "×", "*", "∙"))) {
- getPaint().setColor(resources.getColor(R.color.button_operator_text_color));
- } else if (getText().toString().equals("C")) {
- getPaint().setColor(resources.getColor(R.color.button_ce_text_color));
- } else {
- getPaint().setColor(resources.getColor(R.color.button_text_color));
- }
-
- animationStart = -1;
-
- if (context instanceof FontSizeAdjuster) {
- ((FontSizeAdjuster) context).adjustFontSize(this);
- }
- }
-
-
- @Override
- public void onSizeChanged(int w, int h, int oldW, int oldH) {
- measureText();
- }
-
- protected void measureText() {
- Paint paint = getPaint();
-
- if (getText() != null) {
- textPosition = getTextPosition(paint, getText());
- }
- }
-
- private Point2d getTextPosition(@NotNull Paint paint, @NotNull CharSequence text) {
- final Point2d result = new Point2d();
-
- result.setX(hTextPosition * getWidth() - 0.5f * paint.measureText(text.toString()));
-
- float height = getHeight() - paint.ascent() - paint.descent();
-
- result.setY(height / 2);
-
- return result;
- }
-
- @Override
- protected void onTextChanged(CharSequence text, int start, int before, int after) {
- measureText();
- }
-
- public void drawMagicFlame(int duration, Canvas canvas) {
- int alpha = 255 - 255 * duration / CLICK_FEEDBACK_DURATION;
- int color = CLICK_FEEDBACK_COLOR | (alpha << 24);
-
- feedbackPaint.setColor(color);
- canvas.drawRect(1, 1, getWidth() - 1, getHeight() - 1, feedbackPaint);
- }
-
- @Override
- public void onDraw(Canvas canvas) {
- if (animationStart != -1) {
- int animDuration = (int) (System.currentTimeMillis() - animationStart);
-
- if (animDuration >= CLICK_FEEDBACK_DURATION) {
- animationStart = -1;
- } else {
- drawMagicFlame(animDuration, canvas);
- postInvalidateDelayed(CLICK_FEEDBACK_INTERVAL);
- }
- }
-
- CharSequence text = getText();
- if (!StringUtils.isEmpty(text) && textPosition != null) {
- canvas.drawText(text, 0, text.length(), textPosition.getX(), textPosition.getY(), getPaint());
- } else {
- drawDrawables(canvas);
- }
- }
-
- private void drawDrawables(Canvas canvas) {
- final int compoundPaddingLeft = getCompoundPaddingLeft();
- final int compoundPaddingTop = getCompoundPaddingTop();
- final int compoundPaddingRight = getCompoundPaddingRight();
- final int compoundPaddingBottom = getCompoundPaddingBottom();
-
- final int scrollX = getScrollX();
- final int scrollY = getScrollY();
-
- final int right = getRight();
- final int left = getLeft();
- final int bottom = getBottom();
- final int top = getTop();
-
- final Drawable[] drawables = getCompoundDrawables();
- if (drawables != null) {
-
- int vspace = bottom - top - compoundPaddingBottom - compoundPaddingTop;
- int hspace = right - left - compoundPaddingRight - compoundPaddingLeft;
-
- Drawable topDr = drawables[1];
- // IMPORTANT: The coordinates computed are also used in invalidateDrawable()
- // Make sure to update invalidateDrawable() when changing this code.
- if (topDr != null) {
- canvas.save();
- canvas.translate(scrollX + compoundPaddingLeft + (hspace - topDr.getBounds().width()) / 2,
- scrollY + getPaddingTop() + vspace / 2);
- topDr.draw(canvas);
- canvas.restore();
- }
- }
- }
-
- public void animateClickFeedback() {
- animationStart = System.currentTimeMillis();
- invalidate();
- }
-
- @Override
- public boolean performClick() {
- vibrate();
- return super.performClick();
- }
-
- @Override
- public boolean performLongClick() {
- vibrate();
- return super.performLongClick();
- }
-
- private void vibrate() {
- this.onClickListener.onClick(this);
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- boolean result = super.onTouchEvent(event);
-
- switch (event.getAction()) {
- case MotionEvent.ACTION_UP:
- animateClickFeedback();
- break;
- case MotionEvent.ACTION_DOWN:
- case MotionEvent.ACTION_CANCEL:
- invalidate();
- break;
- }
-
- return result;
- }
-}
diff --git a/src/main/java/org/solovyev/android/view/widgets/ColorPickerDialog.java b/src/main/java/org/solovyev/android/view/widgets/ColorPickerDialog.java
deleted file mode 100644
index a20b11fe..00000000
--- a/src/main/java/org/solovyev/android/view/widgets/ColorPickerDialog.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * 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.
- */
-
-package org.solovyev.android.view.widgets;
-
-import android.os.Bundle;
-import android.app.Dialog;
-import android.content.Context;
-import android.graphics.*;
-import android.view.MotionEvent;
-import android.view.View;
-
-public class ColorPickerDialog extends Dialog {
-
- public interface OnColorChangedListener {
- void colorChanged(int color);
- }
-
- private OnColorChangedListener mListener;
- private int mInitialColor;
-
- private static class ColorPickerView extends View {
- private Paint mPaint;
- private Paint mCenterPaint;
- private final int[] mColors;
- private OnColorChangedListener mListener;
-
- ColorPickerView(Context c, OnColorChangedListener l, int color) {
- super(c);
- mListener = l;
- mColors = new int[]{
- 0xFFFF0000, 0xFFFF00FF, 0xFF0000FF, 0xFF00FFFF, 0xFF00FF00,
- 0xFFFFFF00, 0xFFFF0000
- };
- Shader s = new SweepGradient(0, 0, mColors, null);
-
- mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
- mPaint.setShader(s);
- mPaint.setStyle(Paint.Style.STROKE);
- mPaint.setStrokeWidth(32);
-
- mCenterPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
- mCenterPaint.setColor(color);
- mCenterPaint.setStrokeWidth(5);
- }
-
- private boolean mTrackingCenter;
- private boolean mHighlightCenter;
-
- @Override
- protected void onDraw(Canvas canvas) {
- float r = CENTER_X - mPaint.getStrokeWidth() * 0.5f;
-
- canvas.translate(CENTER_X, CENTER_X);
-
- canvas.drawOval(new RectF(-r, -r, r, r), mPaint);
- canvas.drawCircle(0, 0, CENTER_RADIUS, mCenterPaint);
-
- if (mTrackingCenter) {
- int c = mCenterPaint.getColor();
- mCenterPaint.setStyle(Paint.Style.STROKE);
-
- if (mHighlightCenter) {
- mCenterPaint.setAlpha(0xFF);
- } else {
- mCenterPaint.setAlpha(0x80);
- }
- canvas.drawCircle(0, 0,
- CENTER_RADIUS + mCenterPaint.getStrokeWidth(),
- mCenterPaint);
-
- mCenterPaint.setStyle(Paint.Style.FILL);
- mCenterPaint.setColor(c);
- }
- }
-
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- setMeasuredDimension(CENTER_X * 2, CENTER_Y * 2);
- }
-
- private static final int CENTER_X = 100;
- private static final int CENTER_Y = 100;
- private static final int CENTER_RADIUS = 32;
-
- private int floatToByte(float x) {
- int n = java.lang.Math.round(x);
- return n;
- }
-
- private int pinToByte(int n) {
- if (n < 0) {
- n = 0;
- } else if (n > 255) {
- n = 255;
- }
- return n;
- }
-
- private int ave(int s, int d, float p) {
- return s + java.lang.Math.round(p * (d - s));
- }
-
- private int interpColor(int colors[], float unit) {
- if (unit <= 0) {
- return colors[0];
- }
- if (unit >= 1) {
- return colors[colors.length - 1];
- }
-
- float p = unit * (colors.length - 1);
- int i = (int) p;
- p -= i;
-
- // now p is just the fractional part [0...1) and i is the index
- int c0 = colors[i];
- int c1 = colors[i + 1];
- int a = ave(Color.alpha(c0), Color.alpha(c1), p);
- int r = ave(Color.red(c0), Color.red(c1), p);
- int g = ave(Color.green(c0), Color.green(c1), p);
- int b = ave(Color.blue(c0), Color.blue(c1), p);
-
- return Color.argb(a, r, g, b);
- }
-
- private int rotateColor(int color, float rad) {
- float deg = rad * 180 / 3.1415927f;
- int r = Color.red(color);
- int g = Color.green(color);
- int b = Color.blue(color);
-
- ColorMatrix cm = new ColorMatrix();
- ColorMatrix tmp = new ColorMatrix();
-
- cm.setRGB2YUV();
- tmp.setRotate(0, deg);
- cm.postConcat(tmp);
- tmp.setYUV2RGB();
- cm.postConcat(tmp);
-
- final float[] a = cm.getArray();
-
- int ir = floatToByte(a[0] * r + a[1] * g + a[2] * b);
- int ig = floatToByte(a[5] * r + a[6] * g + a[7] * b);
- int ib = floatToByte(a[10] * r + a[11] * g + a[12] * b);
-
- return Color.argb(Color.alpha(color), pinToByte(ir),
- pinToByte(ig), pinToByte(ib));
- }
-
- private static final float PI = 3.1415926f;
-
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- float x = event.getX() - CENTER_X;
- float y = event.getY() - CENTER_Y;
- boolean inCenter = java.lang.Math.sqrt(x * x + y * y) <= CENTER_RADIUS;
-
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN:
- mTrackingCenter = inCenter;
- if (inCenter) {
- mHighlightCenter = true;
- invalidate();
- break;
- }
- case MotionEvent.ACTION_MOVE:
- if (mTrackingCenter) {
- if (mHighlightCenter != inCenter) {
- mHighlightCenter = inCenter;
- invalidate();
- }
- } else {
- float angle = (float) java.lang.Math.atan2(y, x);
- // need to turn angle [-PI ... PI] into unit [0....1]
- float unit = angle / (2 * PI);
- if (unit < 0) {
- unit += 1;
- }
- mCenterPaint.setColor(interpColor(mColors, unit));
- invalidate();
- }
- break;
- case MotionEvent.ACTION_UP:
- if (mTrackingCenter) {
- if (inCenter) {
- mListener.colorChanged(mCenterPaint.getColor());
- }
- mTrackingCenter = false; // so we draw w/o halo
- invalidate();
- }
- break;
- }
- return true;
- }
- }
-
- public ColorPickerDialog(Context context,
- OnColorChangedListener listener,
- int initialColor) {
- super(context);
-
- mListener = listener;
- mInitialColor = initialColor;
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- OnColorChangedListener l = new OnColorChangedListener() {
- public void colorChanged(int color) {
- mListener.colorChanged(color);
- dismiss();
- }
- };
-
- setContentView(new ColorPickerView(getContext(), l, mInitialColor));
- setTitle("Pick a Color");
- }
-}
\ No newline at end of file
diff --git a/src/main/java/org/solovyev/android/view/widgets/DirectionDragButton.java b/src/main/java/org/solovyev/android/view/widgets/DirectionDragButton.java
deleted file mode 100644
index e4279f08..00000000
--- a/src/main/java/org/solovyev/android/view/widgets/DirectionDragButton.java
+++ /dev/null
@@ -1,395 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- */
-
-package org.solovyev.android.view.widgets;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.text.TextPaint;
-import android.util.AttributeSet;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import org.solovyev.android.calculator.R;
-import org.solovyev.common.NumberParser;
-import org.solovyev.common.utils.CollectionsUtils;
-import org.solovyev.common.utils.Point2d;
-import org.solovyev.common.utils.StringUtils;
-
-import java.util.EnumMap;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * User: serso
- * Date: 7/17/11
- * Time: 10:25 PM
- */
-public class DirectionDragButton extends DragButton {
-
- @NotNull
- private final static Float DEFAULT_DIRECTION_TEXT_SCALE_FLOAT = 0.33f;
-
- @NotNull
- private final static Integer DEFAULT_DIRECTION_TEXT_ALPHA = 140;
-
- @NotNull
- private final static String DEFAULT_DIRECTION_TEXT_SCALE = "0.33;0.33;0.33;0.33";
-
- protected static class DirectionTextData {
-
- @NotNull
- private final GuiDragDirection guiDragDirection;
-
- @NotNull
- private String text;
-
- @NotNull
- private Point2d position;
-
- @NotNull
- private TextPaint paint;
-
- @NotNull
- private Float textScale;
-
- private DirectionTextData(@NotNull GuiDragDirection guiDragDirection, @NotNull String text) {
- this.guiDragDirection = guiDragDirection;
- this.text = text;
- }
-
- @NotNull
- public GuiDragDirection getGuiDragDirection() {
- return guiDragDirection;
- }
-
- @NotNull
- public String getText() {
- return text;
- }
-
- public void setText(@NotNull String text) {
- this.text = text;
- }
-
- @NotNull
- public Point2d getPosition() {
- return position;
- }
-
- public void setPosition(@NotNull Point2d position) {
- this.position = position;
- }
-
- @NotNull
- public TextPaint getPaint() {
- return paint;
- }
-
- public void setPaint(@NotNull TextPaint paint) {
- this.paint = paint;
- }
-
- @NotNull
- public Float getTextScale() {
- return textScale;
- }
-
- public void setTextScale(@NotNull Float textScale) {
- this.textScale = textScale;
- }
- }
-
- protected static enum GuiDragDirection {
- up(DragDirection.up, 0) {
- @Override
- public int getAttributeId() {
- return R.styleable.DirectionDragButton_textUp;
- }
-
- @NotNull
- @Override
- public Point2d getTextPosition(@NotNull Paint paint, @NotNull Paint basePaint, @NotNull CharSequence text, CharSequence baseText, int w, int h) {
- return getUpDownTextPosition(paint, basePaint, text, baseText, 1, w, h);
- }
- },
- down(DragDirection.down, 2) {
- @Override
- public int getAttributeId() {
- return R.styleable.DirectionDragButton_textDown;
- }
-
- @NotNull
- @Override
- public Point2d getTextPosition(@NotNull Paint paint, @NotNull Paint basePaint, @NotNull CharSequence text, CharSequence baseText, int w, int h) {
- return getUpDownTextPosition(paint, basePaint, text, baseText, -1, w, h);
- }
- },
- left(DragDirection.left, 3) {
- @Override
- public int getAttributeId() {
- return R.styleable.DirectionDragButton_textLeft;
- }
-
- @NotNull
- @Override
- public Point2d getTextPosition(@NotNull Paint paint, @NotNull Paint basePaint, @NotNull CharSequence text, CharSequence baseText, int w, int h) {
- return getLeftRightTextPosition(paint, basePaint, text, baseText, w, h, true);
- }
- },
-
- right(DragDirection.right, 1) {
- @Override
- public int getAttributeId() {
- return R.styleable.DirectionDragButton_textRight;
- }
-
- @NotNull
- @Override
- public Point2d getTextPosition(@NotNull Paint paint, @NotNull Paint basePaint, @NotNull CharSequence text, CharSequence baseText, int w, int h) {
- return getLeftRightTextPosition(paint, basePaint, text, baseText, w, h, false);
- }
- };
-
- @NotNull
- private final DragDirection dragDirection;
-
- private final int attributePosition;
-
- GuiDragDirection(@NotNull DragDirection dragDirection, int attributePosition) {
- this.dragDirection = dragDirection;
- this.attributePosition = attributePosition;
- }
-
- public abstract int getAttributeId();
-
- public int getAttributePosition() {
- return attributePosition;
- }
-
- @NotNull
- public abstract Point2d getTextPosition(@NotNull Paint paint, @NotNull Paint basePaint, @NotNull CharSequence text, CharSequence baseText, int w, int h);
-
- @NotNull
- private static Point2d getLeftRightTextPosition(@NotNull Paint paint, @NotNull Paint basePaint, CharSequence text, @NotNull CharSequence baseText, int w, int h, boolean left) {
- final Point2d result = new Point2d();
-
- if (left) {
- float width = paint.measureText(" ");
- result.setX(width);
- } else {
- float width = paint.measureText(text.toString() + " ");
- result.setX(w - width);
- }
-
- float selfHeight = paint.ascent() + paint.descent();
-
- basePaint.measureText(StringUtils.getNotEmpty(baseText, "|"));
-
- result.setY(h / 2 - selfHeight / 2);
-
- return result;
- }
-
- @NotNull
- private static Point2d getUpDownTextPosition(@NotNull Paint paint, @NotNull Paint basePaint, @NotNull CharSequence text, CharSequence baseText, float direction, int w, int h) {
- final Point2d result = new Point2d();
-
- float width = paint.measureText(text.toString() + " ");
- result.setX(w - width);
-
- float selfHeight = paint.ascent() + paint.descent();
-
- basePaint.measureText(StringUtils.getNotEmpty(baseText, "|"));
-
- if (direction < 0) {
- result.setY(h / 2 + h / 3 - selfHeight / 2);
- } else {
- result.setY(h / 2 - h / 3 - selfHeight / 2);
- }
-
- return result;
- }
-
- @Nullable
- public static GuiDragDirection valueOf(@NotNull DragDirection dragDirection) {
- for (GuiDragDirection guiDragDirection : values()) {
- if (guiDragDirection.dragDirection == dragDirection) {
- return guiDragDirection;
- }
- }
- return null;
- }
- }
-
- @NotNull
- private final Map directionTextDataMap = new EnumMap(GuiDragDirection.class);
-
- @NotNull
- private String directionTextScale = DEFAULT_DIRECTION_TEXT_SCALE;
-
- @NotNull
- private Integer directionTextAlpha = DEFAULT_DIRECTION_TEXT_ALPHA;
-
- private boolean initialized = false;
-
- public DirectionDragButton(Context context, @NotNull AttributeSet attrs) {
- super(context, attrs, false);
- init(context, attrs);
- }
-
- private void init(@NotNull Context context, @NotNull AttributeSet attrs) {
-
- TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DirectionDragButton);
-
- final int N = a.getIndexCount();
- for (int i = 0; i < N; i++) {
- int attr = a.getIndex(i);
-
- final String attrValue = a.getString(attr);
-
- if (!StringUtils.isEmpty(attrValue)) {
- switch (attr) {
- case R.styleable.DirectionDragButton_directionTextScale:
- this.directionTextScale = attrValue;
- break;
- case R.styleable.DirectionDragButton_directionTextAlpha:
- this.directionTextAlpha = Integer.valueOf(attrValue);
- break;
- default:
- // try drag direction text
- for (GuiDragDirection guiDragDirection : GuiDragDirection.values()) {
- if (guiDragDirection.getAttributeId() == attr) {
- this.directionTextDataMap.put(guiDragDirection, new DirectionTextData(guiDragDirection, attrValue));
- break;
- }
- }
- break;
- }
- }
- }
-
- for (Map.Entry entry : getDirectionTextScales().entrySet()) {
- final DirectionTextData dtd = directionTextDataMap.get(entry.getKey());
- if (dtd != null) {
- dtd.setTextScale(entry.getValue());
- }
- }
-
- super.init(context);
- initialized = true;
- }
-
- @Override
- protected void measureText() {
- super.measureText();
-
- if (initialized) {
- final Paint basePaint = getPaint();
- final Resources resources = getResources();
-
- for (DirectionTextData directionTextData : directionTextDataMap.values()) {
- initDirectionTextPaint(basePaint, directionTextData, resources);
-
- final GuiDragDirection guiDragDirection = directionTextData.getGuiDragDirection();
- final String directionText = directionTextData.getText();
- final Paint directionPaint = directionTextData.getPaint();
-
- directionTextData.setPosition(guiDragDirection.getTextPosition(directionPaint, basePaint, directionText, getText(), getWidth(), getHeight()));
- }
- }
- }
-
-
- @Override
- public void onDraw(Canvas canvas) {
- super.onDraw(canvas);
-
- final TextPaint paint = getPaint();
- final Resources resources = getResources();
-
- for (DirectionTextData directionTextData : directionTextDataMap.values()) {
- initDirectionTextPaint(paint, directionTextData, resources);
- final String text = directionTextData.getText();
- final Point2d position = directionTextData.getPosition();
- canvas.drawText(text, 0, text.length(), position.getX(), position.getY(), directionTextData.getPaint());
- }
- }
-
- protected void initDirectionTextPaint(@NotNull Paint basePaint,
- @NotNull DirectionTextData directionTextData,
- @NotNull Resources resources) {
- final TextPaint directionTextPaint = new TextPaint(basePaint);
-
- directionTextPaint.setColor(resources.getColor(R.color.button_text_color));
- directionTextPaint.setAlpha(getDirectionTextAlpha());
- directionTextPaint.setTextSize(basePaint.getTextSize() * directionTextData.getTextScale());
-
- directionTextData.setPaint(directionTextPaint);
- }
-
- protected int getDirectionTextAlpha() {
- return directionTextAlpha;
- }
-
- @Nullable
- public String getTextUp() {
- return getText(GuiDragDirection.up);
- }
-
- @Nullable
- public String getTextDown() {
- return getText(GuiDragDirection.down);
- }
-
- @Nullable
- public String getText(@NotNull DragDirection direction) {
- final GuiDragDirection guiDragDirection = GuiDragDirection.valueOf(direction);
- return guiDragDirection == null ? null : getText(guiDragDirection);
- }
-
- @Nullable
- private String getText(@NotNull GuiDragDirection direction) {
- DirectionTextData directionTextData = this.directionTextDataMap.get(direction);
- return directionTextData == null ? null : directionTextData.getText();
- }
-
-
- @NotNull
- public String getDirectionTextScale() {
- return directionTextScale;
- }
-
- @NotNull
- private Map getDirectionTextScales() {
- final List scales = CollectionsUtils.split(getDirectionTextScale(), ";", new NumberParser(Float.class));
-
- final Map result = new HashMap();
- for (GuiDragDirection guiDragDirection : GuiDragDirection.values()) {
- result.put(guiDragDirection, DEFAULT_DIRECTION_TEXT_SCALE_FLOAT);
- }
-
- if (scales.size() == 1) {
- final Float scale = scales.get(0);
- for (Map.Entry entry : result.entrySet()) {
- entry.setValue(scale);
- }
- } else {
- for (int i = 0; i < scales.size(); i++) {
- for (GuiDragDirection guiDragDirection : GuiDragDirection.values()) {
- if (guiDragDirection.getAttributePosition() == i) {
- result.put(guiDragDirection, scales.get(i));
- }
- }
- }
- }
-
- return result;
- }
-
-}
diff --git a/src/main/java/org/solovyev/android/view/widgets/DragButton.java b/src/main/java/org/solovyev/android/view/widgets/DragButton.java
deleted file mode 100644
index 54d8622a..00000000
--- a/src/main/java/org/solovyev/android/view/widgets/DragButton.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- */
-
-package org.solovyev.android.view.widgets;
-
-import android.content.Context;
-import android.os.Handler;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.MotionEvent;
-import android.view.View;
-import android.widget.Button;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import org.solovyev.common.utils.Point2d;
-
-public class DragButton extends ColorButton {
-
- @Nullable
- private Point2d startPoint = null;
-
- @Nullable
- private org.solovyev.android.view.widgets.OnDragListener onDragListener;
-
- private final OnTouchListener onTouchListener = new OnTouchListenerImpl();
-
- public DragButton(Context context, @NotNull AttributeSet attrs) {
- this(context, attrs, true);
- }
-
- public DragButton(Context context, @NotNull AttributeSet attrs, boolean init) {
- super(context, attrs, false);
- setOnTouchListener(this.onTouchListener);
- if ( init ) {
- super.init(context);
- }
- }
-
- public void setOnDragListener(@Nullable org.solovyev.android.view.widgets.OnDragListener onDragListener) {
- this.onDragListener = onDragListener;
- }
-
- @Nullable
- public org.solovyev.android.view.widgets.OnDragListener getOnDragListener() {
- return onDragListener;
- }
-
- /**
- * OnTouchListener implementation that fires onDrag()
- *
- * @author serso
- *
- */
- private final class OnTouchListenerImpl implements OnTouchListener {
-
- @Override
- public boolean onTouch(@NotNull View v, @NotNull MotionEvent event) {
- // processing on touch event
-
- // in order to avoid possible NPEs
- final Point2d localStartPoint = startPoint;
- final org.solovyev.android.view.widgets.OnDragListener localOnDragListener = onDragListener;
-
- if (localOnDragListener != null) {
- // only if onDrag() listener specified
-
- Log.d(String.valueOf(getId()), "onTouch() for: " + getId() + " . Motion event: " + event);
-
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN:
- // start tracking: set start point
- startPoint = new Point2d(event.getX(), event.getY());
- break;
-
- case MotionEvent.ACTION_UP:
- // stop tracking
-
- if (localStartPoint != null && localOnDragListener.onDrag(DragButton.this, new DragEvent(localStartPoint, event))) {
- if (localOnDragListener.isSuppressOnClickEvent()) {
- // prevent on click action
- setPressed(false);
-
- // sometimes setPressed(false); doesn't work so to prevent onClick action button disables
- if (v instanceof Button) {
- final Button button = (Button) v;
-
- button.setEnabled(false);
-
- new Handler().postDelayed(new Runnable() {
- public void run() {
- button.setEnabled(true);
- }
- }, 200);
- }
- }
- }
-
- startPoint = null;
- break;
- }
- }
-
- return false;
- }
- }
-}
diff --git a/src/main/java/org/solovyev/android/view/widgets/DragDirection.java b/src/main/java/org/solovyev/android/view/widgets/DragDirection.java
deleted file mode 100644
index 6bc6c119..00000000
--- a/src/main/java/org/solovyev/android/view/widgets/DragDirection.java
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- */
-
-package org.solovyev.android.view.widgets;
-
-public enum DragDirection {
-
- up,
- down,
- left,
- right;
-}
diff --git a/src/main/java/org/solovyev/android/view/widgets/DragEvent.java b/src/main/java/org/solovyev/android/view/widgets/DragEvent.java
deleted file mode 100644
index 94cf00ba..00000000
--- a/src/main/java/org/solovyev/android/view/widgets/DragEvent.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- */
-
-package org.solovyev.android.view.widgets;
-
-import android.view.MotionEvent;
-import org.jetbrains.annotations.NotNull;
-import org.solovyev.common.utils.Point2d;
-
-public class DragEvent {
-
- @NotNull
- private final Point2d startPoint;
-
- @NotNull
- private final MotionEvent motionEvent;
-
- public DragEvent(@NotNull Point2d startPoint, @NotNull MotionEvent motionEvent) {
- this.startPoint = startPoint;
- this.motionEvent = motionEvent;
- }
-
- /**
- * @return motion event started at start point
- */
- @NotNull
- public MotionEvent getMotionEvent() {
- return motionEvent;
- }
-
- /**
- * @return start point of dragging
- */
- @NotNull
- public Point2d getStartPoint() {
- return startPoint;
- }
-
-
-}
diff --git a/src/main/java/org/solovyev/android/view/widgets/DragPreferencesChangeListener.java b/src/main/java/org/solovyev/android/view/widgets/DragPreferencesChangeListener.java
deleted file mode 100644
index a98a2836..00000000
--- a/src/main/java/org/solovyev/android/view/widgets/DragPreferencesChangeListener.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- */
-
-package org.solovyev.android.view.widgets;
-
-import org.jetbrains.annotations.NotNull;
-
-import java.util.EventListener;
-
-/**
- * User: serso
- * Date: 9/18/11
- * Time: 8:48 PM
- */
-public interface DragPreferencesChangeListener extends EventListener{
-
- void onDragPreferencesChange(@NotNull SimpleOnDragListener.Preferences preferences );
-}
diff --git a/src/main/java/org/solovyev/android/view/widgets/HistoryDragProcessor.java b/src/main/java/org/solovyev/android/view/widgets/HistoryDragProcessor.java
deleted file mode 100644
index 575095ab..00000000
--- a/src/main/java/org/solovyev/android/view/widgets/HistoryDragProcessor.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- */
-
-package org.solovyev.android.view.widgets;
-
-import android.util.Log;
-import android.view.MotionEvent;
-import org.jetbrains.annotations.NotNull;
-import org.solovyev.android.view.HistoryControl;
-import org.solovyev.common.utils.Point2d;
-import org.solovyev.common.utils.StringUtils;
-import org.solovyev.common.utils.history.HistoryAction;
-
-/**
-* User: serso
-* Date: 9/16/11
-* Time: 11:36 PM
-*/
-public class HistoryDragProcessor implements SimpleOnDragListener.DragProcessor {
-
- @NotNull
- private final HistoryControl historyControl;
-
- public HistoryDragProcessor(@NotNull HistoryControl historyControl) {
- this.historyControl = historyControl;
- }
-
- @Override
- public boolean processDragEvent(@NotNull DragDirection dragDirection, @NotNull DragButton dragButton, @NotNull Point2d startPoint2d, @NotNull MotionEvent motionEvent) {
- boolean result = false;
-
- Log.d(String.valueOf(dragButton.getId()), "History on drag event start: " + dragDirection);
-
- final HistoryAction historyAction;
- if ( dragDirection == DragDirection.up ) {
- historyAction = HistoryAction.undo;
- } else if ( dragDirection == DragDirection.down ) {
- historyAction = HistoryAction.redo;
- } else {
- historyAction = null;
- }
-
- if (historyAction != null) {
- result = true;
- historyControl.doHistoryAction(historyAction);
- }
-
- return result;
- }
-}
diff --git a/src/main/java/org/solovyev/android/view/widgets/NumberPicker.java b/src/main/java/org/solovyev/android/view/widgets/NumberPicker.java
deleted file mode 100644
index 728161a0..00000000
--- a/src/main/java/org/solovyev/android/view/widgets/NumberPicker.java
+++ /dev/null
@@ -1,538 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.android.view.widgets;
-
-/**
- * User: serso
- * Date: 9/18/11
- * Time: 10:03 PM
- */
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * 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.
- */
-
-
-import android.content.Context;
-import android.os.Handler;
-import android.text.InputFilter;
-import android.text.InputType;
-import android.text.Spanned;
-import android.text.method.NumberKeyListener;
-import android.util.AttributeSet;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.EditText;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-import org.solovyev.android.calculator.R;
-
-/**
- * A view for selecting a number
- *
- * For a dialog using this view, see {@link android.app.TimePickerDialog}.
- * @hide
- */
-public class NumberPicker extends LinearLayout {
-
- /**
- * The callback interface used to indicate the number value has been adjusted.
- */
- public interface OnChangedListener {
- /**
- * @param picker The NumberPicker associated with this listener.
- * @param oldVal The previous value.
- * @param newVal The new value.
- */
- void onChanged(NumberPicker picker, int oldVal, int newVal);
- }
-
- /**
- * Interface used to format the number into a string for presentation
- */
- public interface Formatter {
- String toString(int value);
- }
-
- /*
- * Use a custom NumberPicker formatting callback to use two-digit
- * minutes strings like "01". Keeping a static formatter etc. is the
- * most efficient way to do this; it avoids creating temporary objects
- * on every call to format().
- */
- public static final NumberPicker.Formatter TWO_DIGIT_FORMATTER =
- new NumberPicker.Formatter() {
- final StringBuilder mBuilder = new StringBuilder();
- final java.util.Formatter mFmt = new java.util.Formatter(
- mBuilder, java.util.Locale.US);
- final Object[] mArgs = new Object[1];
- public String toString(int value) {
- mArgs[0] = value;
- mBuilder.delete(0, mBuilder.length());
- mFmt.format("%02d", mArgs);
- return mFmt.toString();
- }
- };
-
- private final Handler mHandler;
- private final Runnable mRunnable = new Runnable() {
- public void run() {
- if (mIncrement) {
- changeCurrent(mCurrent + 1);
- mHandler.postDelayed(this, mSpeed);
- } else if (mDecrement) {
- changeCurrent(mCurrent - 1);
- mHandler.postDelayed(this, mSpeed);
- }
- }
- };
-
- private final EditText mText;
- private final InputFilter mNumberInputFilter;
-
- private String[] mDisplayedValues;
-
- /**
- * Lower value of the range of numbers allowed for the NumberPicker
- */
- private int mStart;
-
- /**
- * Upper value of the range of numbers allowed for the NumberPicker
- */
- private int mEnd;
-
- /**
- * Current value of this NumberPicker
- */
- private int mCurrent;
-
- /**
- * Previous value of this NumberPicker.
- */
- private int mPrevious;
- private OnChangedListener mListener;
- private Formatter mFormatter;
- private long mSpeed = 300;
-
- private boolean mIncrement;
- private boolean mDecrement;
-
- /**
- * Create a new number picker
- * @param context the application environment
- */
- public NumberPicker(Context context) {
- this(context, null);
- }
-
- /**
- * Create a new number picker
- * @param context the application environment
- * @param attrs a collection of attributes
- */
- public NumberPicker(Context context, AttributeSet attrs) {
- super(context, attrs);
- setOrientation(VERTICAL);
- LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- inflater.inflate(R.layout.number_picker, this, true);
- mHandler = new Handler();
-
- OnClickListener clickListener = new OnClickListener() {
- public void onClick(View v) {
- validateInput(mText);
- if (!mText.hasFocus()) mText.requestFocus();
-
- // now perform the increment/decrement
- if (R.id.increment == v.getId()) {
- changeCurrent(mCurrent + 1);
- } else if (R.id.decrement == v.getId()) {
- changeCurrent(mCurrent - 1);
- }
- }
- };
-
- OnFocusChangeListener focusListener = new OnFocusChangeListener() {
- public void onFocusChange(View v, boolean hasFocus) {
-
- /* When focus is lost check that the text field
- * has valid values.
- */
- if (!hasFocus) {
- validateInput(v);
- }
- }
- };
-
- OnLongClickListener longClickListener = new OnLongClickListener() {
- /**
- * We start the long click here but rely on the {@link NumberPickerButton}
- * to inform us when the long click has ended.
- */
- public boolean onLongClick(View v) {
- /* The text view may still have focus so clear it's focus which will
- * trigger the on focus changed and any typed values to be pulled.
- */
- mText.clearFocus();
-
- if (R.id.increment == v.getId()) {
- mIncrement = true;
- mHandler.post(mRunnable);
- } else if (R.id.decrement == v.getId()) {
- mDecrement = true;
- mHandler.post(mRunnable);
- }
- return true;
- }
- };
-
- InputFilter inputFilter = new NumberPickerInputFilter();
- mNumberInputFilter = new NumberRangeKeyListener();
- mIncrementButton = (NumberPickerButton) findViewById(R.id.increment);
- mIncrementButton.setOnClickListener(clickListener);
- mIncrementButton.setOnLongClickListener(longClickListener);
- mIncrementButton.setNumberPicker(this);
-
- mDecrementButton = (NumberPickerButton) findViewById(R.id.decrement);
- mDecrementButton.setOnClickListener(clickListener);
- mDecrementButton.setOnLongClickListener(longClickListener);
- mDecrementButton.setNumberPicker(this);
-
- mText = (EditText) findViewById(R.id.timepicker_input);
- mText.setOnFocusChangeListener(focusListener);
- mText.setFilters(new InputFilter[] {inputFilter});
- mText.setRawInputType(InputType.TYPE_CLASS_NUMBER);
-
- if (!isEnabled()) {
- setEnabled(false);
- }
- }
-
- /**
- * Set the enabled state of this view. The interpretation of the enabled
- * state varies by subclass.
- *
- * @param enabled True if this view is enabled, false otherwise.
- */
- @Override
- public void setEnabled(boolean enabled) {
- super.setEnabled(enabled);
- mIncrementButton.setEnabled(enabled);
- mDecrementButton.setEnabled(enabled);
- mText.setEnabled(enabled);
- }
-
- /**
- * Set the callback that indicates the number has been adjusted by the user.
- * @param listener the callback, should not be null.
- */
- public void setOnChangeListener(OnChangedListener listener) {
- mListener = listener;
- }
-
- /**
- * Set the formatter that will be used to format the number for presentation
- * @param formatter the formatter object. If formatter is null, String.valueOf()
- * will be used
- */
- public void setFormatter(Formatter formatter) {
- mFormatter = formatter;
- }
-
- /**
- * Set the range of numbers allowed for the number picker. The current
- * value will be automatically set to the start.
- *
- * @param start the start of the range (inclusive)
- * @param end the end of the range (inclusive)
- */
- public void setRange(int start, int end) {
- setRange(start, end, null/*displayedValues*/);
- }
-
- /**
- * Set the range of numbers allowed for the number picker. The current
- * value will be automatically set to the start. Also provide a mapping
- * for values used to display to the user.
- *
- * @param start the start of the range (inclusive)
- * @param end the end of the range (inclusive)
- * @param displayedValues the values displayed to the user.
- */
- public void setRange(int start, int end, String[] displayedValues) {
- mDisplayedValues = displayedValues;
- mStart = start;
- mEnd = end;
- mCurrent = start;
- updateView();
-
- if (displayedValues != null) {
- // Allow text entry rather than strictly numeric entry.
- mText.setRawInputType(InputType.TYPE_CLASS_TEXT/* |
- InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS*/);
- }
- }
-
- /**
- * Set the current value for the number picker.
- *
- * @param current the current value the start of the range (inclusive)
- * @throws IllegalArgumentException when current is not within the range
- * of of the number picker
- */
- public void setCurrent(int current) {
- if (current < mStart || current > mEnd) {
- throw new IllegalArgumentException(
- "current should be >= start and <= end");
- }
- mCurrent = current;
- updateView();
- }
-
- /**
- * Sets the speed at which the numbers will scroll when the +/-
- * buttons are longpressed
- *
- * @param speed The speed (in milliseconds) at which the numbers will scroll
- * default 300ms
- */
- public void setSpeed(long speed) {
- mSpeed = speed;
- }
-
- private String formatNumber(int value) {
- return (mFormatter != null)
- ? mFormatter.toString(value)
- : String.valueOf(value);
- }
-
- /**
- * Sets the current value of this NumberPicker, and sets mPrevious to the previous
- * value. If current is greater than mEnd less than mStart, the value of mCurrent
- * is wrapped around.
- *
- * Subclasses can override this to change the wrapping behavior
- *
- * @param current the new value of the NumberPicker
- */
- protected void changeCurrent(int current) {
- // Wrap around the values if we go past the start or end
- if (current > mEnd) {
- current = mStart;
- } else if (current < mStart) {
- current = mEnd;
- }
- mPrevious = mCurrent;
- mCurrent = current;
- notifyChange();
- updateView();
- }
-
- /**
- * Notifies the listener, if registered, of a change of the value of this
- * NumberPicker.
- */
- private void notifyChange() {
- if (mListener != null) {
- mListener.onChanged(this, mPrevious, mCurrent);
- }
- }
-
- /**
- * Updates the view of this NumberPicker. If displayValues were specified
- * in {@link #setRange}, the string corresponding to the index specified by
- * the current value will be returned. Otherwise, the formatter specified
- * in will be used to format the number.
- */
- private void updateView() {
- /* If we don't have displayed values then use the
- * current number else find the correct value in the
- * displayed values for the current number.
- */
- if (mDisplayedValues == null) {
- mText.setText(formatNumber(mCurrent));
- } else {
- mText.setText(mDisplayedValues[mCurrent - mStart]);
- }
- mText.setSelection(mText.getText().length());
- }
-
- private void validateCurrentView(CharSequence str) {
- int val = getSelectedPos(str.toString());
- if ((val >= mStart) && (val <= mEnd)) {
- if (mCurrent != val) {
- mPrevious = mCurrent;
- mCurrent = val;
- notifyChange();
- }
- }
- updateView();
- }
-
- private void validateInput(View v) {
- String str = String.valueOf(((TextView) v).getText());
- if ("".equals(str)) {
-
- // Restore to the old value as we don't allow empty values
- updateView();
- } else {
-
- // Check the new value and ensure it's in range
- validateCurrentView(str);
- }
- }
-
- /**
- * @hide
- */
- public void cancelIncrement() {
- mIncrement = false;
- }
-
- /**
- * @hide
- */
- public void cancelDecrement() {
- mDecrement = false;
- }
-
- private static final char[] DIGIT_CHARACTERS = new char[] {
- '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
- };
-
- private NumberPickerButton mIncrementButton;
- private NumberPickerButton mDecrementButton;
-
- private class NumberPickerInputFilter implements InputFilter {
- public CharSequence filter(CharSequence source, int start, int end,
- Spanned dest, int dstart, int dend) {
- if (mDisplayedValues == null) {
- return mNumberInputFilter.filter(source, start, end, dest, dstart, dend);
- }
- CharSequence filtered = String.valueOf(source.subSequence(start, end));
- String result = String.valueOf(dest.subSequence(0, dstart))
- + filtered
- + dest.subSequence(dend, dest.length());
- String str = String.valueOf(result).toLowerCase();
- for (String val : mDisplayedValues) {
- val = val.toLowerCase();
- if (val.startsWith(str)) {
- return filtered;
- }
- }
- return "";
- }
- }
-
- private class NumberRangeKeyListener extends NumberKeyListener {
-
- // XXX This doesn't allow for range limits when controlled by a
- // soft input method!
- public int getInputType() {
- return InputType.TYPE_CLASS_NUMBER;
- }
-
- @Override
- protected char[] getAcceptedChars() {
- return DIGIT_CHARACTERS;
- }
-
- @Override
- public CharSequence filter(CharSequence source, int start, int end,
- Spanned dest, int dstart, int dend) {
-
- CharSequence filtered = super.filter(source, start, end, dest, dstart, dend);
- if (filtered == null) {
- filtered = source.subSequence(start, end);
- }
-
- String result = String.valueOf(dest.subSequence(0, dstart))
- + filtered
- + dest.subSequence(dend, dest.length());
-
- if ("".equals(result)) {
- return result;
- }
- int val = getSelectedPos(result);
-
- /* Ensure the user can't type in a value greater
- * than the max allowed. We have to allow less than min
- * as the user might want to delete some numbers
- * and then type a new number.
- */
- if (val > mEnd) {
- return "";
- } else {
- return filtered;
- }
- }
- }
-
- private int getSelectedPos(String str) {
- if (mDisplayedValues == null) {
- try {
- return Integer.parseInt(str);
- } catch (NumberFormatException e) {
- /* Ignore as if it's not a number we don't care */
- }
- } else {
- for (int i = 0; i < mDisplayedValues.length; i++) {
- /* Don't force the user to type in jan when ja will do */
- str = str.toLowerCase();
- if (mDisplayedValues[i].toLowerCase().startsWith(str)) {
- return mStart + i;
- }
- }
-
- /* The user might have typed in a number into the month field i.e.
- * 10 instead of OCT so support that too.
- */
- try {
- return Integer.parseInt(str);
- } catch (NumberFormatException e) {
-
- /* Ignore as if it's not a number we don't care */
- }
- }
- return mStart;
- }
-
- /**
- * Returns the current value of the NumberPicker
- * @return the current value.
- */
- public int getCurrent() {
- return mCurrent;
- }
-
- /**
- * Returns the upper value of the range of the NumberPicker
- * @return the uppper number of the range.
- */
- protected int getEndRange() {
- return mEnd;
- }
-
- /**
- * Returns the lower value of the range of the NumberPicker
- * @return the lower number of the range.
- */
- protected int getBeginRange() {
- return mStart;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/org/solovyev/android/view/widgets/NumberPickerButton.java b/src/main/java/org/solovyev/android/view/widgets/NumberPickerButton.java
deleted file mode 100644
index b9213abe..00000000
--- a/src/main/java/org/solovyev/android/view/widgets/NumberPickerButton.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.android.view.widgets;
-
-/**
- * User: serso
- * Date: 9/18/11
- * Time: 10:04 PM
- */
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * 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.
- */
-
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.KeyEvent;
-import android.view.MotionEvent;
-import android.widget.ImageButton;
-import org.solovyev.android.calculator.R;
-
-/**
- * This class exists purely to cancel long click events, that got
- * started in NumberPicker
- */
-class NumberPickerButton extends ImageButton {
-
- private NumberPicker mNumberPicker;
-
- public NumberPickerButton(Context context, AttributeSet attrs,
- int defStyle) {
- super(context, attrs, defStyle);
- }
-
- public NumberPickerButton(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public NumberPickerButton(Context context) {
- super(context);
- }
-
- public void setNumberPicker(NumberPicker picker) {
- mNumberPicker = picker;
- }
-
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- cancelLongpressIfRequired(event);
- return super.onTouchEvent(event);
- }
-
- @Override
- public boolean onTrackballEvent(MotionEvent event) {
- cancelLongpressIfRequired(event);
- return super.onTrackballEvent(event);
- }
-
- @Override
- public boolean onKeyUp(int keyCode, KeyEvent event) {
- if ((keyCode == KeyEvent.KEYCODE_DPAD_CENTER)
- || (keyCode == KeyEvent.KEYCODE_ENTER)) {
- cancelLongpress();
- }
- return super.onKeyUp(keyCode, event);
- }
-
- private void cancelLongpressIfRequired(MotionEvent event) {
- if ((event.getAction() == MotionEvent.ACTION_CANCEL)
- || (event.getAction() == MotionEvent.ACTION_UP)) {
- cancelLongpress();
- }
- }
-
- private void cancelLongpress() {
- if (R.id.increment == getId()) {
- mNumberPicker.cancelIncrement();
- } else if (R.id.decrement == getId()) {
- mNumberPicker.cancelDecrement();
- }
- }
-
- public void onWindowFocusChanged(boolean hasWindowFocus) {
- super.onWindowFocusChanged(hasWindowFocus);
- if (!hasWindowFocus) {
- cancelLongpress();
- }
- }
-
-}
\ No newline at end of file
diff --git a/src/main/java/org/solovyev/android/view/widgets/NumberRangeSeekBar.java b/src/main/java/org/solovyev/android/view/widgets/NumberRangeSeekBar.java
deleted file mode 100644
index 2feac78c..00000000
--- a/src/main/java/org/solovyev/android/view/widgets/NumberRangeSeekBar.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.solovyev.android.view.widgets;
-
-import android.content.Context;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import org.solovyev.common.utils.Converter;
-import org.solovyev.common.utils.Interval;
-import org.solovyev.common.utils.NumberValuer;
-
-/**
- * User: serso
- * Date: 9/19/11
- * Time: 4:26 PM
- */
-public class NumberRangeSeekBar extends AbstractRangeSeekBar {
-
- @NotNull
- private final NumberType numberType;
-
-
- public NumberRangeSeekBar(@NotNull Interval boundaries, @Nullable Integer steps, Context context) throws IllegalArgumentException {
- this(boundaries.getLeftBorder(), boundaries.getRightBorder(), steps, context);
- }
-
- /**
- * Creates a new RangeSeekBar.
- *
- * @param minValue The minimum value of the selectable range.
- * @param maxValue The maximum value of the selectable range.
- * @param steps number of steps of range
- * @param context parent context
- * @throws IllegalArgumentException Will be thrown if min/max value types are not one of Long, Double, Integer, Float, Short, Byte or BigDecimal.
- */
- public NumberRangeSeekBar(@NotNull T minValue, @NotNull T maxValue, @Nullable Integer steps, Context context) throws IllegalArgumentException {
- super(minValue, maxValue, steps, context);
-
- numberType = NumberType.fromNumber(minValue);
-
- }
-
- @NotNull
- @Override
- protected Converter getToTConverter() {
- return new Converter() {
- @NotNull
- @Override
- public T convert(@NotNull Double value) {
- return (T) numberType.toNumber(value);
- }
- };
- }
-
- @NotNull
- @Override
- protected Converter getToDoubleConverter() {
- return new NumberValuer();
- }
-
-
-}
diff --git a/src/main/java/org/solovyev/android/view/widgets/NumberType.java b/src/main/java/org/solovyev/android/view/widgets/NumberType.java
deleted file mode 100644
index be4ead69..00000000
--- a/src/main/java/org/solovyev/android/view/widgets/NumberType.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.android.view.widgets;
-
-import org.jetbrains.annotations.NotNull;
-
-import java.math.BigDecimal;
-
-/**
- * Utility enumeration used to convert between Numbers and doubles.
- *
- * @author Stephan Tittel (stephan.tittel@kom.tu-darmstadt.de)
- */
-enum NumberType {
-
- LONG(Long.class),
- DOUBLE(Double.class),
- INTEGER(Integer.class),
- FLOAT(Float.class),
- SHORT(Short.class),
- BYTE(Byte.class),
- BIG_DECIMAL(BigDecimal.class);
-
- @NotNull
- private final Class underlyingClass;
-
- NumberType(@NotNull Class underlyingClass) {
- this.underlyingClass = underlyingClass;
- }
-
- @NotNull
- public static NumberType fromNumber(E value) throws IllegalArgumentException {
-
- for (NumberType numberType : NumberType.values()) {
- if (numberType.underlyingClass.isInstance(value)) {
- return numberType;
- }
- }
-
- throw new IllegalArgumentException("Number class '" + value.getClass().getName() + "' is not supported");
- }
-
- public T toNumber(double value) {
-
- switch (this) {
- case LONG:
- return (T)new Long((long) value);
- case DOUBLE:
- return (T)new Double(value);
- case INTEGER:
- return (T)new Integer((int) value);
- case FLOAT:
- return (T)new Float((float) value);
- case SHORT:
- return (T)new Short((short) value);
- case BYTE:
- return (T)new Byte((byte) value);
- case BIG_DECIMAL:
- return (T)new BigDecimal(value);
- }
-
- throw new InstantiationError("can't convert " + this + " to a Number object");
- }
-}
diff --git a/src/main/java/org/solovyev/android/view/widgets/OnClickListenerVibrator.java b/src/main/java/org/solovyev/android/view/widgets/OnClickListenerVibrator.java
deleted file mode 100644
index 78c01d64..00000000
--- a/src/main/java/org/solovyev/android/view/widgets/OnClickListenerVibrator.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.android.view.widgets;
-
-import android.content.SharedPreferences;
-import android.os.Vibrator;
-import android.view.View;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-/**
-* User: serso
-* Date: 10/26/11
-* Time: 11:25 PM
-*/
-public class OnClickListenerVibrator implements View.OnClickListener {
-
- private static final float VIBRATION_TIME_SCALE = 1.0f;
-
- @NotNull
- private VibratorContainer vibrator;
-
- public OnClickListenerVibrator(@Nullable Vibrator vibrator,
- @NotNull SharedPreferences preferences) {
- this.vibrator = new VibratorContainer(vibrator, preferences, VIBRATION_TIME_SCALE);
- }
-
- @Override
- public void onClick(View v) {
- vibrator.vibrate();
- }
-}
diff --git a/src/main/java/org/solovyev/android/view/widgets/OnClickListenerWrapper.java b/src/main/java/org/solovyev/android/view/widgets/OnClickListenerWrapper.java
deleted file mode 100644
index e68243f9..00000000
--- a/src/main/java/org/solovyev/android/view/widgets/OnClickListenerWrapper.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.android.view.widgets;
-
-import android.view.View;
-import org.jetbrains.annotations.NotNull;
-
-/**
- * User: serso
- * Date: 10/26/11
- * Time: 10:55 PM
- */
-public class OnClickListenerWrapper implements View.OnClickListener{
-
- @NotNull
- private final View.OnClickListener onClickListener;
-
- public OnClickListenerWrapper(@NotNull View.OnClickListener onClickListener) {
- this.onClickListener = onClickListener;
- }
-
- @Override
- public void onClick(View v) {
- this.onClick(v);
- }
-}
diff --git a/src/main/java/org/solovyev/android/view/widgets/OnDragListener.java b/src/main/java/org/solovyev/android/view/widgets/OnDragListener.java
deleted file mode 100644
index 574a8965..00000000
--- a/src/main/java/org/solovyev/android/view/widgets/OnDragListener.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- */
-
-package org.solovyev.android.view.widgets;
-
-import org.jetbrains.annotations.NotNull;
-import org.solovyev.android.view.widgets.DragButton;
-import org.solovyev.android.view.widgets.DragEvent;
-
-import java.util.EventListener;
-
-
-public interface OnDragListener extends EventListener{
-
- /**
- *
- * @return 'true': if drag event has taken place (i.e. onDrag() method returned true) then click action will be suppresed
- */
- boolean isSuppressOnClickEvent();
-
- /**
- * @param dragButton drag button object for which onDrag listener was set
- * @param event drag event
- *
- * @return 'true' if drag event occurred, 'false' otherwise
- */
- boolean onDrag(@NotNull DragButton dragButton, @NotNull DragEvent event);
-
-}
diff --git a/src/main/java/org/solovyev/android/view/widgets/OnDragListenerWrapper.java b/src/main/java/org/solovyev/android/view/widgets/OnDragListenerWrapper.java
deleted file mode 100644
index f88c8220..00000000
--- a/src/main/java/org/solovyev/android/view/widgets/OnDragListenerWrapper.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.android.view.widgets;
-
-import org.jetbrains.annotations.NotNull;
-
-/**
-* User: serso
-* Date: 10/26/11
-* Time: 10:37 PM
-*/
-public class OnDragListenerWrapper implements OnDragListener {
-
- @NotNull
- private final OnDragListener onDragListener;
-
- public OnDragListenerWrapper(@NotNull OnDragListener onDragListener) {
- this.onDragListener = onDragListener;
- }
-
- @Override
- public boolean isSuppressOnClickEvent() {
- return this.onDragListener.isSuppressOnClickEvent();
- }
-
- @Override
- public boolean onDrag(@NotNull DragButton dragButton, @NotNull DragEvent event) {
- return this.onDragListener.onDrag(dragButton, event);
- }
-}
diff --git a/src/main/java/org/solovyev/android/view/widgets/SimpleOnDragListener.java b/src/main/java/org/solovyev/android/view/widgets/SimpleOnDragListener.java
deleted file mode 100644
index 256adaf1..00000000
--- a/src/main/java/org/solovyev/android/view/widgets/SimpleOnDragListener.java
+++ /dev/null
@@ -1,305 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- */
-
-package org.solovyev.android.view.widgets;
-
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.util.Log;
-import android.view.MotionEvent;
-import org.jetbrains.annotations.NotNull;
-import org.solovyev.android.calculator.R;
-import org.solovyev.common.NumberIntervalMapper;
-import org.solovyev.common.utils.*;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class SimpleOnDragListener implements OnDragListener, DragPreferencesChangeListener {
-
- @NotNull
- public static final Point2d axis = new Point2d(0, 1);
-
- @NotNull
- private DragProcessor dragProcessor;
-
- @NotNull
- private Preferences preferences;
-
- public SimpleOnDragListener(@NotNull Preferences preferences) {
- this.preferences = preferences;
- }
-
- public SimpleOnDragListener(@NotNull DragProcessor dragProcessor, @NotNull Preferences preferences) {
- this.dragProcessor = dragProcessor;
- this.preferences = preferences;
- }
-
- @Override
- public boolean onDrag(@NotNull DragButton dragButton, @NotNull DragEvent event) {
- boolean result = false;
-
- logDragEvent(dragButton, event);
-
- final Point2d startPoint = event.getStartPoint();
- final MotionEvent motionEvent = event.getMotionEvent();
-
- // init end point
- final Point2d endPoint = new Point2d(motionEvent.getX(), motionEvent.getY());
-
- final float distance = MathUtils.getDistance(startPoint, endPoint);
-
- final MutableObject right = new MutableObject();
- final double angle = Math.toDegrees(MathUtils.getAngle(startPoint, MathUtils.sum(startPoint, axis), endPoint, right));
- Log.d(String.valueOf(dragButton.getId()), "Angle: " + angle);
- Log.d(String.valueOf(dragButton.getId()), "Is right?: " + right.getObject());
-
- final double duration = motionEvent.getEventTime() - motionEvent.getDownTime();
-
- final Preference distancePreferences = preferences.getPreferencesMap().get(PreferenceType.distance);
- final Preference anglePreferences = preferences.getPreferencesMap().get(PreferenceType.angle);
-
- DragDirection direction = null;
- for (Map.Entry directionEntry : distancePreferences.getDirectionPreferences().entrySet()) {
-
- Log.d(String.valueOf(dragButton.getId()), "Drag direction: " + directionEntry.getKey());
- Log.d(String.valueOf(dragButton.getId()), "Trying direction interval: " + directionEntry.getValue().getInterval());
-
- if (isInInterval(directionEntry.getValue().getInterval(), distance)) {
- final DragPreference anglePreference = anglePreferences.getDirectionPreferences().get(directionEntry.getKey());
-
- Log.d(String.valueOf(dragButton.getId()), "Trying angle interval: " + anglePreference.getInterval());
-
- if (directionEntry.getKey() == DragDirection.left && right.getObject()) {
- } else if (directionEntry.getKey() == DragDirection.right && !right.getObject()) {
- } else {
- if (isInInterval(anglePreference.getInterval(), (float) angle)) {
- direction = directionEntry.getKey();
- Log.d(String.valueOf(dragButton.getId()), "MATCH! Direction: " + direction);
- break;
- }
- }
- }
-
- }
-
- if (direction != null) {
- final Preference durationPreferences = preferences.getPreferencesMap().get(PreferenceType.duration);
-
- final DragPreference durationDragPreferences = durationPreferences.getDirectionPreferences().get(direction);
-
- Log.d(String.valueOf(dragButton.getId()), "Trying time interval: " + durationDragPreferences.getInterval());
- if (isInInterval(durationDragPreferences.getInterval(), (float) duration)) {
- Log.d(String.valueOf(dragButton.getId()), "MATCH!");
- result = dragProcessor.processDragEvent(direction, dragButton, startPoint, motionEvent);
- }
- }
-
- return result;
- }
-
- private boolean isInInterval(@NotNull Interval interval, float value) {
- return interval.getLeftBorder() - MathUtils.MIN_AMOUNT <= value && value <= interval.getRightBorder() + MathUtils.MIN_AMOUNT;
- }
-
- @Override
- public boolean isSuppressOnClickEvent() {
- return true;
- }
-
- private void logDragEvent(@NotNull DragButton dragButton, @NotNull DragEvent event) {
- final Point2d startPoint = event.getStartPoint();
- final MotionEvent motionEvent = event.getMotionEvent();
- final Point2d endPoint = new Point2d(motionEvent.getX(), motionEvent.getY());
-
- Log.d(String.valueOf(dragButton.getId()), "Start point: " + startPoint + ", End point: " + endPoint);
- Log.d(String.valueOf(dragButton.getId()), "Distance: " + MathUtils.getDistance(startPoint, endPoint));
- final MutableObject right = new MutableObject();
- Log.d(String.valueOf(dragButton.getId()), "Angle: " + Math.toDegrees(MathUtils.getAngle(startPoint, MathUtils.sum(startPoint, axis), endPoint, right)));
- Log.d(String.valueOf(dragButton.getId()), "Is right angle? " + right);
- Log.d(String.valueOf(dragButton.getId()), "Axis: " + axis + " Vector: " + MathUtils.subtract(endPoint, startPoint));
- Log.d(String.valueOf(dragButton.getId()), "Total time: " + (motionEvent.getEventTime() - motionEvent.getDownTime()) + " ms");
- }
-
- @NotNull
- public DragProcessor getDragProcessor() {
- return dragProcessor;
- }
-
- public void setDragProcessor(@NotNull DragProcessor dragProcessor) {
- this.dragProcessor = dragProcessor;
- }
-
- @Override
- public void onDragPreferencesChange(@NotNull Preferences preferences) {
- this.preferences = preferences;
- }
-
- public interface DragProcessor {
-
- boolean processDragEvent(@NotNull DragDirection dragDirection, @NotNull DragButton dragButton, @NotNull Point2d startPoint2d, @NotNull MotionEvent motionEvent);
- }
-
- // todo serso: currently we do not use direction
- public static String getPreferenceId(@NotNull PreferenceType preferenceType, @NotNull DragDirection direction) {
- return "org.solovyev.android.calculator.DragButtonCalibrationActivity" + "_" + preferenceType.name() /*+ "_" + direction.name()*/;
- }
-
- @NotNull
- public static Preferences getPreferences(@NotNull final SharedPreferences preferences, @NotNull Context context) {
-
- final Mapper> mapper = new NumberIntervalMapper(Float.class);
-
- final Preferences result = new Preferences();
-
- for (PreferenceType preferenceType : PreferenceType.values()) {
- for (DragDirection dragDirection : DragDirection.values()) {
-
- final String preferenceId = getPreferenceId(preferenceType, dragDirection);
-
- final String defaultValue;
- switch (preferenceType) {
- case angle:
- defaultValue = context.getResources().getString(R.string.p_drag_angle);
- break;
- case distance:
- defaultValue = context.getResources().getString(R.string.p_drag_distance);
- break;
- case duration:
- defaultValue = context.getResources().getString(R.string.p_drag_duration);
- break;
- default:
- defaultValue = null;
- Log.e(SimpleOnDragListener.class.getName(), "New preference type added: default preferences should be defined. Preference id: " + preferenceId);
- }
-
- final String value = preferences.getString(preferenceId, defaultValue);
-
- if (defaultValue != null) {
- final Interval intervalPref = mapper.parseValue(value);
- assert intervalPref != null;
-
- transformInterval(preferenceType, dragDirection, intervalPref);
-
- Log.d(SimpleOnDragListener.class.getName(), "Preference loaded for " + dragDirection +". Id: " + preferenceId + ", value: " + intervalPref.toString());
-
- final DragPreference directionPreference = new DragPreference(dragDirection, intervalPref);
-
- Preference preference = result.getPreferencesMap().get(preferenceType);
- if (preference == null) {
- preference = new Preference(preferenceType);
- result.getPreferencesMap().put(preferenceType, preference);
- }
-
- preference.getDirectionPreferences().put(dragDirection, directionPreference);
- }
- }
- }
-
- return result;
- }
-
- @NotNull
- public static Interval transformInterval(@NotNull PreferenceType preferenceType, @NotNull DragDirection dragDirection, @NotNull Interval interval) {
- if (preferenceType == PreferenceType.angle) {
- final Float leftBorder = interval.getLeftBorder();
- final Float rightBorder = interval.getRightBorder();
-
- if (dragDirection == DragDirection.up) {
- interval.setLeftBorder(180f - rightBorder);
- interval.setRightBorder(180f - leftBorder);
- } else if (dragDirection == DragDirection.left ) {
- interval.setLeftBorder(90f - rightBorder);
- interval.setRightBorder(90f + rightBorder);
- } else if ( dragDirection == DragDirection.right ) {
- interval.setLeftBorder(90f - rightBorder);
- interval.setRightBorder(90f + rightBorder);
- }
- }
-
- return interval;
- }
-
-
- public static enum PreferenceType {
- angle,
- distance,
- duration
- }
-
- public static class DragPreference {
-
- @NotNull
- private DragDirection direction;
-
- @NotNull
- private Interval interval;
-
-
- public DragPreference(@NotNull DragDirection direction, @NotNull Interval interval) {
- this.direction = direction;
- this.interval = interval;
- }
-
- @NotNull
- public DragDirection getDirection() {
- return direction;
- }
-
- public void setDirection(@NotNull DragDirection direction) {
- this.direction = direction;
- }
-
- @NotNull
- public Interval getInterval() {
- return interval;
- }
-
- public void setInterval(@NotNull Interval interval) {
- this.interval = interval;
- }
- }
-
- public static class Preference {
-
- @NotNull
- private PreferenceType preferenceType;
-
- @NotNull
- private Map directionPreferences = new HashMap();
-
-
- public Preference(@NotNull PreferenceType preferenceType) {
- this.preferenceType = preferenceType;
- }
-
- @NotNull
- public PreferenceType getPreferenceType() {
- return preferenceType;
- }
-
- public void setPreferenceType(@NotNull PreferenceType preferenceType) {
- this.preferenceType = preferenceType;
- }
-
- @NotNull
- public Map getDirectionPreferences() {
- return directionPreferences;
- }
-
- public void setDirectionPreferences(@NotNull Map directionPreferences) {
- this.directionPreferences = directionPreferences;
- }
- }
-
- public static class Preferences {
-
- private final Map preferencesMap = new HashMap();
-
- public Map getPreferencesMap() {
- return preferencesMap;
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/org/solovyev/android/view/widgets/VibratorContainer.java b/src/main/java/org/solovyev/android/view/widgets/VibratorContainer.java
deleted file mode 100644
index f7a3c177..00000000
--- a/src/main/java/org/solovyev/android/view/widgets/VibratorContainer.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.android.view.widgets;
-
-import android.content.SharedPreferences;
-import android.os.Vibrator;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import org.solovyev.common.NumberMapper;
-
-/**
- * User: serso
- * Date: 10/26/11
- * Time: 11:40 PM
- */
-public class VibratorContainer implements SharedPreferences.OnSharedPreferenceChangeListener {
-
- public static final String HAPTIC_FEEDBACK_P_KEY = "org.solovyev.android.calculator.CalculatorModel_haptic_feedback";
- public static final boolean HAPTIC_FEEDBACK_DEFAULT = false;
- public static final String HAPTIC_FEEDBACK_DURATION_P_KEY = "org.solovyev.android.calculator.CalculatorActivity_calc_haptic_feedback_duration_key";
-
- private final static NumberMapper mapper = new NumberMapper(Long.class);
-
- private static final long defaultVibrationTime = 100;
-
- private final float vibrationTimeScale;
-
- @Nullable
- private final Vibrator vibrator;
-
- private long time = 0;
-
- public VibratorContainer(@Nullable Vibrator vibrator, @NotNull SharedPreferences preferences, float vibrationTimeScale) {
- this.vibrator = vibrator;
- this.vibrationTimeScale = vibrationTimeScale;
-
- preferences.registerOnSharedPreferenceChangeListener(this);
- onSharedPreferenceChanged(preferences, null);
-
- }
-
- public void vibrate() {
- if (time > 0 && vibrator != null) {
- vibrator.vibrate(time);
- }
- }
-
- @Override
- public void onSharedPreferenceChanged(SharedPreferences preferences, @Nullable String key) {
- if (preferences.getBoolean(HAPTIC_FEEDBACK_P_KEY, VibratorContainer.HAPTIC_FEEDBACK_DEFAULT)) {
- //noinspection ConstantConditions
- this.time = getScaledValue(mapper.parseValue(preferences.getString(HAPTIC_FEEDBACK_DURATION_P_KEY, mapper.formatValue(getScaledValue(defaultVibrationTime)))));
- } else {
- this.time = 0;
- }
- }
-
- private long getScaledValue(long vibrationTime) {
- return (long) (vibrationTime * vibrationTimeScale);
- }
-}
diff --git a/src/main/java/org/solovyev/common/AbstractIntervalMapper.java b/src/main/java/org/solovyev/common/AbstractIntervalMapper.java
deleted file mode 100644
index 2b90eb50..00000000
--- a/src/main/java/org/solovyev/common/AbstractIntervalMapper.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.common;
-
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import org.solovyev.common.utils.*;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * User: serso
- * Date: 9/21/11
- * Time: 12:02 AM
- */
-public abstract class AbstractIntervalMapper implements Mapper> {
-
- @Override
- public String formatValue(@Nullable Interval interval) throws IllegalArgumentException {
- if (interval != null) {
- return CollectionsUtils.formatValue(Arrays.asList(interval.getLeftBorder(), interval.getRightBorder()), ";", getFormatter());
- } else {
- return null;
- }
- }
-
- @NotNull
- protected abstract Formatter getFormatter();
-
- @Override
- public Interval parseValue(@Nullable String s) throws IllegalArgumentException {
- //Log.d(AbstractIntervalMapper.class.getName(), "Parsing: " + s);
- final List list = CollectionsUtils.split(s, ";", getParser());
-
- assert list.size() == 2;
- return newInstance(list.get(0), list.get(1));
- }
-
- @NotNull
- protected abstract Interval newInstance(@Nullable T left, @Nullable T right);
-
- @NotNull
- protected abstract Parser getParser();
-}
diff --git a/src/main/java/org/solovyev/common/BooleanMapper.java b/src/main/java/org/solovyev/common/BooleanMapper.java
deleted file mode 100644
index fac16ace..00000000
--- a/src/main/java/org/solovyev/common/BooleanMapper.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.common;
-
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import org.solovyev.common.math.ValueOfFormatter;
-import org.solovyev.common.utils.Formatter;
-import org.solovyev.common.utils.Mapper;
-
-/**
- * User: serso
- * Date: 9/26/11
- * Time: 11:27 PM
- */
-public class BooleanMapper implements Mapper{
-
- @NotNull
- private final Formatter formatter = new ValueOfFormatter();
-
- @Override
- public String formatValue(@Nullable Boolean value) throws IllegalArgumentException {
- return formatter.formatValue(value);
- }
-
- @Override
- public Boolean parseValue(@Nullable String value) throws IllegalArgumentException {
- return value == null ? null : Boolean.valueOf(value);
- }
-}
diff --git a/src/main/java/org/solovyev/common/GenericIntervalMapper.java b/src/main/java/org/solovyev/common/GenericIntervalMapper.java
deleted file mode 100644
index e6468f47..00000000
--- a/src/main/java/org/solovyev/common/GenericIntervalMapper.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.common;
-
-import org.jetbrains.annotations.NotNull;
-import org.solovyev.common.utils.Formatter;
-import org.solovyev.common.utils.Mapper;
-import org.solovyev.common.utils.Parser;
-
-/**
- * User: serso
- * Date: 9/26/11
- * Time: 10:45 PM
- */
-public abstract class GenericIntervalMapper extends AbstractIntervalMapper {
-
- @NotNull
- private final Mapper mapper;
-
- public GenericIntervalMapper(@NotNull Mapper mapper) {
- this.mapper = mapper;
- }
-
- @NotNull
- @Override
- protected Formatter getFormatter() {
- return mapper;
- }
-
- @NotNull
- @Override
- protected Parser getParser() {
- return mapper;
- }
-
- @NotNull
- public Mapper getMapper() {
- return mapper;
- }
-}
diff --git a/src/main/java/org/solovyev/common/NumberIntervalMapper.java b/src/main/java/org/solovyev/common/NumberIntervalMapper.java
deleted file mode 100644
index 3e09cf95..00000000
--- a/src/main/java/org/solovyev/common/NumberIntervalMapper.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.common;
-
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import org.solovyev.common.utils.Interval;
-import org.solovyev.common.utils.NumberInterval;
-
-/**
-* User: serso
-* Date: 9/20/11
-* Time: 11:56 PM
-*/
-public class NumberIntervalMapper extends GenericIntervalMapper {
-
- public NumberIntervalMapper(@NotNull Class clazz) {
- super(new NumberMapper(clazz));
- }
-
- @NotNull
- @Override
- protected Interval newInstance(@Nullable T left, @Nullable T right) {
- return new NumberInterval(left, right);
- }
-}
diff --git a/src/main/java/org/solovyev/common/NumberMapper.java b/src/main/java/org/solovyev/common/NumberMapper.java
deleted file mode 100644
index 5814f124..00000000
--- a/src/main/java/org/solovyev/common/NumberMapper.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.common;
-
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import org.solovyev.common.math.ValueOfFormatter;
-import org.solovyev.common.utils.Formatter;
-import org.solovyev.common.utils.Mapper;
-import org.solovyev.common.utils.Parser;
-
-/**
- * User: serso
- * Date: 9/26/11
- * Time: 11:10 PM
- */
-public class NumberMapper implements Mapper{
-
- @NotNull
- private final Formatter formatter = new ValueOfFormatter();
-
- @NotNull
- private final Parser parser;
-
- public NumberMapper(@NotNull Class clazz) {
- this.parser = new NumberParser(clazz);
- }
-
- @Override
- public String formatValue(@Nullable T value) throws IllegalArgumentException {
- return formatter.formatValue(value);
- }
-
- @Override
- public T parseValue(@Nullable String value) throws IllegalArgumentException {
- return this.parser.parseValue(value);
- }
-}
diff --git a/src/main/java/org/solovyev/common/NumberParser.java b/src/main/java/org/solovyev/common/NumberParser.java
deleted file mode 100644
index 9cb7de97..00000000
--- a/src/main/java/org/solovyev/common/NumberParser.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.common;
-
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import org.solovyev.common.utils.Parser;
-
-/**
- * User: serso
- * Date: 9/26/11
- * Time: 11:07 PM
- */
-public class NumberParser implements Parser {
-
- @NotNull
- private final Class clazz;
-
- public NumberParser(@NotNull Class clazz) {
- this.clazz = clazz;
- }
-
- @Override
- public T parseValue(@Nullable String value) throws IllegalArgumentException {
- T result;
-
- if (value != null) {
- if (this.clazz.equals(Integer.class)) {
- result = (T) Integer.valueOf(value);
- } else if (this.clazz.equals(Float.class)) {
- result = (T) Float.valueOf(value);
- } else if (this.clazz.equals(Long.class)) {
- result = (T) Long.valueOf(value);
- } else {
- throw new UnsupportedOperationException(this.clazz + " is not supported!");
- }
- } else {
- result = null;
- }
-
- return result;
- }
-}
diff --git a/src/main/java/org/solovyev/common/SameEqualizer.java b/src/main/java/org/solovyev/common/SameEqualizer.java
deleted file mode 100644
index d0195423..00000000
--- a/src/main/java/org/solovyev/common/SameEqualizer.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.common;
-
-
-import org.jetbrains.annotations.Nullable;
-import org.solovyev.common.utils.Equalizer;
-
-/**
- * User: serso
- * Date: 12/17/11
- * Time: 11:11 PM
- */
-public enum SameEqualizer implements Equalizer {
-
- instance;
-
- private SameEqualizer() {
- }
-
- @Override
- public boolean equals(@Nullable Object first, @Nullable Object second) {
- return first == second;
- }
-}
diff --git a/src/main/java/org/solovyev/common/math/DiscreteNormalizer.java b/src/main/java/org/solovyev/common/math/DiscreteNormalizer.java
deleted file mode 100644
index 14ccf0fb..00000000
--- a/src/main/java/org/solovyev/common/math/DiscreteNormalizer.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package org.solovyev.common.math;
-
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-/**
- * User: serso
- * Date: 9/20/11
- * Time: 5:42 PM
- */
-public class DiscreteNormalizer implements Normalizer {
-
- @NotNull
- private final Normalizer normalizer;
-
- private final double min;
-
- private final double step;
-
- public DiscreteNormalizer(double min, double max, int steps) {
- this(min, max, steps, null);
- }
-
- public DiscreteNormalizer(double min, double max, int steps, @Nullable Normalizer normalizer) {
- assert min <= max;
- assert steps > 1;
-
- if (normalizer != null) {
- this.normalizer = normalizer;
- } else {
- this.normalizer = new LinearNormalizer(min, max);
- }
-
- this.step = this.normalizer.normalize((max - min) / (steps - 1));
- this.min = this.normalizer.normalize(min);
- }
-
- public DiscreteNormalizer(double min, double max, double step) {
- assert min <= max;
- assert step > 0;
-
- this.normalizer = new LinearNormalizer(min, max);
-
- this.step = normalizer.normalize(step);
- this.min = normalizer.normalize(min);
- }
-
- @Override
- public double normalize(double value) {
- double normalizedValue = normalizer.normalize(value);
-
- double result = min;
- while (true) {
- if ( result + step > normalizedValue ) {
- break;
- } else {
- result += step;
- }
- }
-
- return result;
- }
-
- @Override
- public double denormalize(double value) {
- return normalizer.denormalize(value);
- }
-}
diff --git a/src/main/java/org/solovyev/common/math/LinearNormalizer.java b/src/main/java/org/solovyev/common/math/LinearNormalizer.java
deleted file mode 100644
index 5e9a15ce..00000000
--- a/src/main/java/org/solovyev/common/math/LinearNormalizer.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.common.math;
-
-/**
-* User: serso
-* Date: 9/19/11
-* Time: 9:31 PM
-*/
-public class LinearNormalizer implements Normalizer {
-
- private final double min;
- private final double max;
-
- public LinearNormalizer(double min, double max) {
- this.min = min;
- this.max = max;
- }
-
- @Override
- public double normalize(double value){
- if ((max - min) != 0d) {
- return (value - min) / (max - min);
- } else {
- return 1d;
- }
- }
-
- @Override
- public double denormalize(double value){
- return min + value * (max - min);
- }
-
-}
diff --git a/src/main/java/org/solovyev/common/math/Normalizer.java b/src/main/java/org/solovyev/common/math/Normalizer.java
deleted file mode 100644
index a35d8335..00000000
--- a/src/main/java/org/solovyev/common/math/Normalizer.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package org.solovyev.common.math;
-
-/**
- * User: serso
- * Date: 9/20/11
- * Time: 5:30 PM
- */
-public interface Normalizer {
-
- double normalize(double value);
-
- double denormalize(double value);
-}
diff --git a/src/main/java/org/solovyev/common/math/ValueOfFormatter.java b/src/main/java/org/solovyev/common/math/ValueOfFormatter.java
deleted file mode 100644
index 03db764d..00000000
--- a/src/main/java/org/solovyev/common/math/ValueOfFormatter.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (c) 2009-2011. Created by serso aka se.solovyev.
- * For more information, please, contact se.solovyev@gmail.com
- * or visit http://se.solovyev.org
- */
-
-package org.solovyev.common.math;
-
-import org.jetbrains.annotations.Nullable;
-import org.solovyev.common.utils.Formatter;
-
-/**
- * User: serso
- * Date: 9/20/11
- * Time: 10:52 PM
- */
-public class ValueOfFormatter implements Formatter{
-
- private final boolean processNulls;
-
- public ValueOfFormatter() {
- this(false);
- }
-
- public ValueOfFormatter(boolean processNulls) {
- this.processNulls = processNulls;
- }
-
-
- @Override
- public String formatValue(@Nullable T t) throws IllegalArgumentException {
- return t == null ? (processNulls ? String.valueOf(t) : null) : String.valueOf(t);
- }
-}