diff --git a/app/src/main/java/org/solovyev/android/calculator/ActivityLauncher.java b/app/src/main/java/org/solovyev/android/calculator/ActivityLauncher.java
index d6b17f67..e66864be 100644
--- a/app/src/main/java/org/solovyev/android/calculator/ActivityLauncher.java
+++ b/app/src/main/java/org/solovyev/android/calculator/ActivityLauncher.java
@@ -88,15 +88,10 @@ public final class ActivityLauncher {
context.startActivity(intent);
}
- @Nonnull
- private static Notifier getNotifier() {
- return ((CalculatorApplication) App.getApplication()).notifier;
- }
-
public void plotDisplayedExpression() {
final DisplayState state = display.get().getState();
if (!state.valid) {
- getNotifier().showMessage(R.string.not_valid_result, MessageType.error);
+ notifier.showMessage(R.string.not_valid_result, MessageType.error);
return;
}
plot(state.getResult());
diff --git a/app/src/main/java/org/solovyev/android/calculator/App.java b/app/src/main/java/org/solovyev/android/calculator/App.java
index a1af5ae6..64477c1e 100644
--- a/app/src/main/java/org/solovyev/android/calculator/App.java
+++ b/app/src/main/java/org/solovyev/android/calculator/App.java
@@ -41,114 +41,51 @@ import android.support.v7.view.ContextThemeWrapper;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ForegroundColorSpan;
-import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.TypedValue;
import android.view.View;
-import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
-import com.squareup.otto.Bus;
import org.solovyev.android.Check;
import org.solovyev.android.calculator.floating.FloatingCalculatorService;
-import org.solovyev.android.calculator.ga.Ga;
-import org.solovyev.android.calculator.language.Languages;
-import org.solovyev.android.calculator.view.ScreenMetrics;
-import org.solovyev.android.calculator.wizard.CalculatorWizards;
-import org.solovyev.android.wizard.Wizards;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
-/**
- * This class aggregates several useful in any Android application interfaces and provides access to {@link android.app.Application} object from a static context.
- * NOTE: use this class only if you don't use and dependency injection library (if you use any you can directly set interfaces through it).
- *
- * Before first usage this class must be initialized by calling {@link App#init(android.app.Application)} method (for example, from {@link android.app.Application#onCreate()})
- */
public final class App {
public static final String TAG = "C++";
-
@Nonnull
- private static Languages languages;
- @Nonnull
- private static volatile Application application;
+ private static Application application;
@Nonnull
private static SharedPreferences preferences;
- @Nonnull
- private static volatile Ga ga;
- @Nonnull
- private static volatile ScreenMetrics screenMetrics;
- @Nonnull
- private static Wizards wizards;
- @Nonnull
- private static Editor editor;
- @Nonnull
- private static Bus bus;
- @Nonnull
- private static Display display;
private App() {
throw new AssertionError();
}
- public static void init(@Nonnull CalculatorApplication application,
- @Nonnull Languages languages) {
+ public static void init(@Nonnull CalculatorApplication application) {
App.application = application;
App.preferences = PreferenceManager.getDefaultSharedPreferences(application);
- App.ga = new Ga(application, preferences);
- App.screenMetrics = new ScreenMetrics(application);
- App.languages = languages;
- App.languages.init();
- App.wizards = new CalculatorWizards(application);
- App.editor = application.editor;
- App.display = application.display;
- App.bus = application.bus;
- }
-
- /**
- * @param real type of application
- * @return application instance which was provided in {@link App#init} method
- */
- @SuppressWarnings("unchecked")
- @Nonnull
- public static A getApplication() {
- return (A) application;
- }
-
- @Nonnull
- public static Wizards getWizards() {
- return wizards;
- }
-
- @Nonnull
- public static Ga getGa() {
- return ga;
- }
-
- @Nonnull
- public static SharedPreferences getPreferences() {
- return preferences;
}
@Nonnull
public static Preferences.Gui.Theme getTheme() {
- return Preferences.Gui.getTheme(getPreferences());
+ return Preferences.Gui.getTheme(preferences);
}
@Nonnull
public static Preferences.SimpleTheme getWidgetTheme() {
- return Preferences.Widget.getTheme(getPreferences());
+ return Preferences.Widget.getTheme(preferences);
}
@Nonnull
public static Preferences.Gui.Theme getThemeFor(@Nonnull Context context) {
if (isFloatingCalculator(context)) {
- final SharedPreferences p = getPreferences();
+ final SharedPreferences p = preferences;
final Preferences.SimpleTheme onscreenTheme = Preferences.Onscreen.getTheme(p);
final Preferences.Gui.Theme appTheme = Preferences.Gui.getTheme(p);
return onscreenTheme.resolveThemeFor(appTheme).getAppTheme();
@@ -165,16 +102,6 @@ public final class App {
return context;
}
- @Nonnull
- public static Languages getLanguages() {
- return languages;
- }
-
- @Nonnull
- public static ScreenMetrics getScreenMetrics() {
- return screenMetrics;
- }
-
public static void showDialog(@Nonnull DialogFragment dialogFragment,
@Nonnull String fragmentTag,
@Nonnull FragmentManager fm) {
@@ -201,21 +128,6 @@ public final class App {
return spannable.toString();
}
- @Nonnull
- public static Editor getEditor() {
- return editor;
- }
-
- @Nonnull
- public static Display getDisplay() {
- return display;
- }
-
- @Nonnull
- public static Bus getBus() {
- return bus;
- }
-
private static final AtomicInteger sNextViewId = new AtomicInteger(1);
public static int generateViewId() {
@@ -391,14 +303,6 @@ public final class App {
pm.setComponentEnabledSetting(new ComponentName(context, componentClass), componentState, PackageManager.DONT_KILL_APP);
}
- public static boolean isComponentEnabled(@Nonnull Context context,
- @Nonnull Class extends Context> componentClass) {
- final PackageManager pm = context.getPackageManager();
-
- int componentEnabledSetting = pm.getComponentEnabledSetting(new ComponentName(context, componentClass));
- return componentEnabledSetting == PackageManager.COMPONENT_ENABLED_STATE_ENABLED || componentEnabledSetting == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
- }
-
public static int toPixels(@Nonnull DisplayMetrics dm, float dps) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dps, dm);
}
diff --git a/app/src/main/java/org/solovyev/android/calculator/AppComponent.java b/app/src/main/java/org/solovyev/android/calculator/AppComponent.java
index e4cb2a67..20d23489 100644
--- a/app/src/main/java/org/solovyev/android/calculator/AppComponent.java
+++ b/app/src/main/java/org/solovyev/android/calculator/AppComponent.java
@@ -1,8 +1,10 @@
package org.solovyev.android.calculator;
+import dagger.Component;
import org.solovyev.android.calculator.converter.ConverterFragment;
import org.solovyev.android.calculator.errors.FixableErrorFragment;
import org.solovyev.android.calculator.errors.FixableErrorsActivity;
+import org.solovyev.android.calculator.floating.FloatingCalculatorBroadcastReceiver;
import org.solovyev.android.calculator.floating.FloatingCalculatorService;
import org.solovyev.android.calculator.floating.FloatingCalculatorView;
import org.solovyev.android.calculator.functions.BaseFunctionFragment;
@@ -17,6 +19,7 @@ import org.solovyev.android.calculator.plot.PlotDimensionsFragment;
import org.solovyev.android.calculator.plot.PlotEditFunctionFragment;
import org.solovyev.android.calculator.plot.PlotFunctionsFragment;
import org.solovyev.android.calculator.preferences.PreferencesActivity;
+import org.solovyev.android.calculator.preferences.PreferencesFragment;
import org.solovyev.android.calculator.preferences.PurchaseDialogActivity;
import org.solovyev.android.calculator.variables.EditVariableFragment;
import org.solovyev.android.calculator.variables.VariablesFragment;
@@ -24,11 +27,10 @@ import org.solovyev.android.calculator.view.Tabs;
import org.solovyev.android.calculator.widget.CalculatorWidget;
import org.solovyev.android.calculator.wizard.DragButtonWizardStep;
import org.solovyev.android.calculator.wizard.WizardActivity;
+import org.solovyev.android.calculator.wizard.WizardFragment;
import javax.inject.Singleton;
-import dagger.Component;
-
@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
@@ -65,4 +67,7 @@ public interface AppComponent {
void inject(CalculatorWidget widget);
void inject(WizardActivity activity);
void inject(BaseActivity activity);
+ void inject(PreferencesFragment fragment);
+ void inject(WizardFragment fragment);
+ void inject(FloatingCalculatorBroadcastReceiver receiver);
}
diff --git a/app/src/main/java/org/solovyev/android/calculator/AppModule.java b/app/src/main/java/org/solovyev/android/calculator/AppModule.java
index d157cdfb..c65aeb9b 100644
--- a/app/src/main/java/org/solovyev/android/calculator/AppModule.java
+++ b/app/src/main/java/org/solovyev/android/calculator/AppModule.java
@@ -15,9 +15,11 @@ import dagger.Module;
import dagger.Provides;
import jscl.JsclMathEngine;
import org.solovyev.android.calculator.language.Languages;
+import org.solovyev.android.calculator.wizard.CalculatorWizards;
import org.solovyev.android.checkout.*;
import org.solovyev.android.plotter.Plot;
import org.solovyev.android.plotter.Plotter;
+import org.solovyev.android.wizard.Wizards;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
@@ -137,6 +139,12 @@ public class AppModule {
return new AcraErrorReporter();
}
+ @Provides
+ @Singleton
+ Wizards provideWizards(@Nonnull Application application) {
+ return new CalculatorWizards(application);
+ }
+
@Provides
@Singleton
@Named(THREAD_UI)
diff --git a/app/src/main/java/org/solovyev/android/calculator/BaseActivity.java b/app/src/main/java/org/solovyev/android/calculator/BaseActivity.java
index c631cb9b..3ff1902a 100644
--- a/app/src/main/java/org/solovyev/android/calculator/BaseActivity.java
+++ b/app/src/main/java/org/solovyev/android/calculator/BaseActivity.java
@@ -1,8 +1,6 @@
package org.solovyev.android.calculator;
import android.app.Activity;
-import android.app.KeyguardManager;
-import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.Typeface;
import android.os.Bundle;
@@ -21,6 +19,7 @@ import android.widget.TextView;
import butterknife.Bind;
import butterknife.ButterKnife;
import org.solovyev.android.Check;
+import org.solovyev.android.calculator.ga.Ga;
import org.solovyev.android.calculator.history.History;
import org.solovyev.android.calculator.language.Language;
import org.solovyev.android.calculator.language.Languages;
@@ -51,6 +50,8 @@ public class BaseActivity extends AppCompatActivity {
@Inject
Calculator calculator;
@Inject
+ Ga ga;
+ @Inject
Typeface typeface;
@Bind(R.id.main)
ViewGroup mainView;
@@ -77,12 +78,12 @@ public class BaseActivity extends AppCompatActivity {
this.tabs = new Tabs(this);
}
- public static void reportActivityStop(@Nonnull Activity activity) {
- App.getGa().getAnalytics().reportActivityStop(activity);
+ public void reportActivityStop(@Nonnull Activity activity) {
+ ga.getAnalytics().reportActivityStop(activity);
}
- public static void reportActivityStart(@Nonnull Activity activity) {
- App.getGa().getAnalytics().reportActivityStart(activity);
+ public void reportActivityStart(@Nonnull Activity activity) {
+ ga.getAnalytics().reportActivityStart(activity);
}
public static void setFont(@Nonnull TextView view, @Nonnull Typeface newTypeface) {
diff --git a/app/src/main/java/org/solovyev/android/calculator/CalculatorApplication.java b/app/src/main/java/org/solovyev/android/calculator/CalculatorApplication.java
index 50ebc520..b4143908 100644
--- a/app/src/main/java/org/solovyev/android/calculator/CalculatorApplication.java
+++ b/app/src/main/java/org/solovyev/android/calculator/CalculatorApplication.java
@@ -34,6 +34,7 @@ import org.acra.ACRA;
import org.acra.ACRAConfiguration;
import org.acra.sender.HttpSender;
import org.solovyev.android.calculator.floating.FloatingCalculatorActivity;
+import org.solovyev.android.calculator.ga.Ga;
import org.solovyev.android.calculator.history.History;
import org.solovyev.android.calculator.language.Language;
import org.solovyev.android.calculator.language.Languages;
@@ -96,6 +97,9 @@ public class CalculatorApplication extends android.app.Application implements Sh
@Inject
ActivityLauncher launcher;
+ @Inject
+ Ga ga;
+
@Nonnull
private final TimingLogger timer = new TimingLogger("App", "onCreate");
@@ -104,7 +108,7 @@ public class CalculatorApplication extends android.app.Application implements Sh
timer.reset();
final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
- final Languages languages = new Languages(preferences);
+ final Languages languages = new Languages(this, preferences);
timer.addSplit("languages");
onPreCreate(preferences, languages);
@@ -131,11 +135,12 @@ public class CalculatorApplication extends android.app.Application implements Sh
}
private void onPostCreate(@Nonnull SharedPreferences preferences, @Nonnull Languages languages) {
- App.init(this, languages);
+ App.init(this);
+ languages.init();
preferences.registerOnSharedPreferenceChangeListener(this);
languages.updateContextLocale(this, true);
- App.getGa().reportInitially(preferences);
+ ga.reportInitially(preferences);
calculator.init(initThread);
diff --git a/app/src/main/java/org/solovyev/android/calculator/Editor.java b/app/src/main/java/org/solovyev/android/calculator/Editor.java
index 6015d6e7..c24dc3c8 100644
--- a/app/src/main/java/org/solovyev/android/calculator/Editor.java
+++ b/app/src/main/java/org/solovyev/android/calculator/Editor.java
@@ -22,6 +22,7 @@
package org.solovyev.android.calculator;
+import android.app.Application;
import android.content.SharedPreferences;
import android.text.TextUtils;
@@ -54,8 +55,8 @@ public class Editor {
Bus bus;
@Inject
- public Editor(@Nonnull SharedPreferences preferences, @Nonnull Engine engine) {
- textProcessor = new EditorTextProcessor(preferences, engine);
+ public Editor(@Nonnull Application application, @Nonnull SharedPreferences preferences, @Nonnull Engine engine) {
+ textProcessor = new EditorTextProcessor(application, preferences, engine);
}
public void init() {
diff --git a/app/src/main/java/org/solovyev/android/calculator/Keyboard.java b/app/src/main/java/org/solovyev/android/calculator/Keyboard.java
index 193c38a0..f4889ab8 100644
--- a/app/src/main/java/org/solovyev/android/calculator/Keyboard.java
+++ b/app/src/main/java/org/solovyev/android/calculator/Keyboard.java
@@ -29,6 +29,7 @@ import com.squareup.otto.Bus;
import dagger.Lazy;
import org.solovyev.android.Check;
import org.solovyev.android.calculator.buttons.CppSpecialButton;
+import org.solovyev.android.calculator.ga.Ga;
import org.solovyev.android.calculator.math.MathType;
import javax.annotation.Nonnull;
@@ -51,6 +52,8 @@ public class Keyboard implements SharedPreferences.OnSharedPreferenceChangeListe
@Inject
Engine engine;
@Inject
+ Ga ga;
+ @Inject
Lazy clipboard;
@Inject
Lazy bus;
@@ -72,7 +75,7 @@ public class Keyboard implements SharedPreferences.OnSharedPreferenceChangeListe
if (TextUtils.isEmpty(text)) {
return false;
}
- App.getGa().onButtonPressed(text);
+ ga.onButtonPressed(text);
if (!processSpecialAction(text)) {
processText(prepareText(text));
}
diff --git a/app/src/main/java/org/solovyev/android/calculator/StartupHelper.java b/app/src/main/java/org/solovyev/android/calculator/StartupHelper.java
index 9a8d20fa..d66b8974 100644
--- a/app/src/main/java/org/solovyev/android/calculator/StartupHelper.java
+++ b/app/src/main/java/org/solovyev/android/calculator/StartupHelper.java
@@ -28,6 +28,8 @@ public class StartupHelper {
SharedPreferences uiPreferences;
@Inject
SharedPreferences preferences;
+ @Inject
+ Wizards wizards;
@Inject
public StartupHelper() {
@@ -44,7 +46,6 @@ public class StartupHelper {
private void handleOnMainActivityOpened(@NonNull final AppCompatActivity activity, @NonNull SharedPreferences.Editor editor, int opened) {
final int currentVersion = App.getAppVersionCode(activity);
- final Wizards wizards = App.getWizards();
final Wizard wizard = wizards.getWizard(CalculatorWizards.FIRST_TIME_WIZARD);
if (wizard.isStarted() && !wizard.isFinished()) {
continueWizard(wizards, wizard.getName(), activity);
diff --git a/app/src/main/java/org/solovyev/android/calculator/entities/BaseEntitiesRegistry.java b/app/src/main/java/org/solovyev/android/calculator/entities/BaseEntitiesRegistry.java
index 8756fc6a..50566be2 100644
--- a/app/src/main/java/org/solovyev/android/calculator/entities/BaseEntitiesRegistry.java
+++ b/app/src/main/java/org/solovyev/android/calculator/entities/BaseEntitiesRegistry.java
@@ -107,7 +107,7 @@ public abstract class BaseEntitiesRegistry implements Enti
stringName = prefix + substitute;
}
- return getDescription(App.getApplication(), stringName);
+ return getDescription(application, stringName);
}
@Override
diff --git a/app/src/main/java/org/solovyev/android/calculator/floating/FloatingCalculatorBroadcastReceiver.java b/app/src/main/java/org/solovyev/android/calculator/floating/FloatingCalculatorBroadcastReceiver.java
index 99891c38..f1012594 100644
--- a/app/src/main/java/org/solovyev/android/calculator/floating/FloatingCalculatorBroadcastReceiver.java
+++ b/app/src/main/java/org/solovyev/android/calculator/floating/FloatingCalculatorBroadcastReceiver.java
@@ -27,14 +27,21 @@ import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
-
-import org.solovyev.android.calculator.App;
import org.solovyev.android.calculator.Preferences;
+import org.solovyev.android.calculator.ga.Ga;
import javax.annotation.Nonnull;
+import javax.inject.Inject;
+
+import static org.solovyev.android.calculator.App.cast;
public final class FloatingCalculatorBroadcastReceiver extends BroadcastReceiver {
+ @Inject
+ SharedPreferences preferences;
+ @Inject
+ Ga ga;
+
public FloatingCalculatorBroadcastReceiver() {
}
@@ -42,10 +49,10 @@ public final class FloatingCalculatorBroadcastReceiver extends BroadcastReceiver
public void onReceive(@Nonnull Context context,
@Nonnull Intent intent) {
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
- final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
+ cast(context).getComponent().inject(this);
if (Preferences.Onscreen.startOnBoot.getPreferenceNoError(preferences)) {
FloatingCalculatorService.showNotification(context);
- App.getGa().onBootStart();
+ ga.onBootStart();
}
} else {
final Intent newIntent = new Intent(intent);
diff --git a/app/src/main/java/org/solovyev/android/calculator/floating/FloatingCalculatorService.java b/app/src/main/java/org/solovyev/android/calculator/floating/FloatingCalculatorService.java
index d19bd611..c0930a05 100644
--- a/app/src/main/java/org/solovyev/android/calculator/floating/FloatingCalculatorService.java
+++ b/app/src/main/java/org/solovyev/android/calculator/floating/FloatingCalculatorService.java
@@ -32,16 +32,11 @@ import android.os.IBinder;
import android.support.v4.app.NotificationCompat;
import android.util.DisplayMetrics;
import android.view.WindowManager;
-
import com.squareup.otto.Bus;
import com.squareup.otto.Subscribe;
-
import org.solovyev.android.Check;
-import org.solovyev.android.calculator.App;
-import org.solovyev.android.calculator.Display;
-import org.solovyev.android.calculator.Editor;
-import org.solovyev.android.calculator.Preferences;
-import org.solovyev.android.calculator.R;
+import org.solovyev.android.calculator.*;
+import org.solovyev.android.calculator.ga.Ga;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
@@ -64,6 +59,8 @@ public class FloatingCalculatorService extends Service implements FloatingViewLi
@Inject
Display display;
@Inject
+ Ga ga;
+ @Inject
SharedPreferences preferences;
public static void showNotification(@Nonnull Context context) {
@@ -148,7 +145,7 @@ public class FloatingCalculatorService extends Service implements FloatingViewLi
if (isShowWindowIntent(intent)) {
hideNotification();
createView();
- App.getGa().onFloatingCalculatorOpened();
+ ga.onFloatingCalculatorOpened();
} else if (isShowNotificationIntent(intent)) {
showNotification();
}
diff --git a/app/src/main/java/org/solovyev/android/calculator/ga/Ga.java b/app/src/main/java/org/solovyev/android/calculator/ga/Ga.java
index a37829c9..3d5671b1 100644
--- a/app/src/main/java/org/solovyev/android/calculator/ga/Ga.java
+++ b/app/src/main/java/org/solovyev/android/calculator/ga/Ga.java
@@ -1,23 +1,20 @@
package org.solovyev.android.calculator.ga;
-import android.content.Context;
+import android.app.Application;
import android.content.SharedPreferences;
import android.text.TextUtils;
-import android.util.Log;
-
import com.google.android.gms.analytics.GoogleAnalytics;
import com.google.android.gms.analytics.HitBuilders;
import com.google.android.gms.analytics.Tracker;
-
import org.solovyev.android.calculator.Preferences;
import org.solovyev.android.calculator.R;
-import java.io.ByteArrayOutputStream;
-import java.io.PrintStream;
-
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
+import javax.inject.Inject;
+import javax.inject.Singleton;
+@Singleton
public final class Ga implements SharedPreferences.OnSharedPreferenceChangeListener {
private static final int LAYOUT = 1;
@@ -29,24 +26,13 @@ public final class Ga implements SharedPreferences.OnSharedPreferenceChangeListe
@Nonnull
private final Tracker tracker;
- public Ga(@Nonnull Context context, @Nonnull SharedPreferences preferences) {
- analytics = GoogleAnalytics.getInstance(context);
+ @Inject
+ public Ga(@Nonnull Application application, @Nonnull SharedPreferences preferences) {
+ analytics = GoogleAnalytics.getInstance(application);
tracker = analytics.newTracker(R.xml.ga);
preferences.registerOnSharedPreferenceChangeListener(this);
}
- @Nonnull
- private String getStackTrace(@Nonnull Exception e) {
- try {
- final ByteArrayOutputStream out = new ByteArrayOutputStream();
- e.printStackTrace(new PrintStream(out));
- return new String(out.toByteArray());
- } catch (Exception e1) {
- Log.e("Ga", e1.getMessage(), e1);
- }
- return "";
- }
-
private void reportLayout(@Nonnull Preferences.Gui.Layout layout) {
tracker.send(new HitBuilders.EventBuilder().setCustomDimension(LAYOUT, layout.name()).build());
}
@@ -60,11 +46,6 @@ public final class Ga implements SharedPreferences.OnSharedPreferenceChangeListe
return analytics;
}
- @Nonnull
- public Tracker getTracker() {
- return tracker;
- }
-
public void onButtonPressed(@Nullable String text) {
if (TextUtils.isEmpty(text)) {
return;
diff --git a/app/src/main/java/org/solovyev/android/calculator/keyboard/BaseKeyboardUi.java b/app/src/main/java/org/solovyev/android/calculator/keyboard/BaseKeyboardUi.java
index f8ea7496..024ecbd3 100644
--- a/app/src/main/java/org/solovyev/android/calculator/keyboard/BaseKeyboardUi.java
+++ b/app/src/main/java/org/solovyev/android/calculator/keyboard/BaseKeyboardUi.java
@@ -4,17 +4,16 @@ import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.content.SharedPreferences;
-import android.content.res.Configuration;
import android.graphics.Typeface;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
+import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import org.solovyev.android.calculator.*;
import org.solovyev.android.calculator.buttons.CppSpecialButton;
-import org.solovyev.android.calculator.view.ScreenMetrics;
import org.solovyev.android.views.Adjuster;
import org.solovyev.android.views.dragbutton.DirectionDragButton;
import org.solovyev.android.views.dragbutton.DragButton;
@@ -26,9 +25,9 @@ import javax.inject.Inject;
import java.util.ArrayList;
import java.util.List;
+import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
import static android.view.HapticFeedbackConstants.*;
import static org.solovyev.android.calculator.App.cast;
-import static org.solovyev.android.calculator.App.getScreenMetrics;
import static org.solovyev.android.calculator.Preferences.Gui.Layout.simple;
import static org.solovyev.android.calculator.Preferences.Gui.Layout.simple_mobile;
@@ -59,7 +58,7 @@ public abstract class BaseKeyboardUi implements SharedPreferences.OnSharedPrefer
ActivityLauncher launcher;
@Inject
PreferredPreferences preferredPreferences;
- protected int orientation = Configuration.ORIENTATION_PORTRAIT;
+ protected int orientation = ORIENTATION_PORTRAIT;
private int textSize;
private Preferences.Gui.Layout layout;
private final float textScale;
@@ -83,7 +82,7 @@ public abstract class BaseKeyboardUi implements SharedPreferences.OnSharedPrefer
orientation = App.getScreenOrientation(activity);
layout = Preferences.Gui.layout.getPreferenceNoError(preferences);
- textSize = calculateTextSize();
+ textSize = calculateTextSize(activity);
}
protected final void prepareButton(@Nullable ImageView button) {
@@ -141,12 +140,13 @@ public abstract class BaseKeyboardUi implements SharedPreferences.OnSharedPrefer
preferences.unregisterOnSharedPreferenceChangeListener(this);
}
- public static int calculateTextSize() {
- final ScreenMetrics metrics = getScreenMetrics();
- final boolean portrait = metrics.isInPortraitMode();
+ public static int calculateTextSize(@Nonnull Activity activity) {
+ final boolean portrait = App.getScreenOrientation(activity) == ORIENTATION_PORTRAIT;
+ final DisplayMetrics metrics = new DisplayMetrics();
+ activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
final int buttonsCount = portrait ? 5 : 4;
final int buttonsWeight = portrait ? (2 + 1 + buttonsCount) : (2 + buttonsCount);
- final int buttonSize = metrics.getHeightPxs() / buttonsWeight;
+ final int buttonSize = metrics.heightPixels / buttonsWeight;
return 5 * buttonSize / 12;
}
diff --git a/app/src/main/java/org/solovyev/android/calculator/language/Languages.java b/app/src/main/java/org/solovyev/android/calculator/language/Languages.java
index 8b9a240f..8fdb0389 100644
--- a/app/src/main/java/org/solovyev/android/calculator/language/Languages.java
+++ b/app/src/main/java/org/solovyev/android/calculator/language/Languages.java
@@ -1,5 +1,6 @@
package org.solovyev.android.calculator.language;
+import android.app.Application;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Configuration;
@@ -8,7 +9,6 @@ import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.util.Log;
import org.solovyev.android.Check;
-import org.solovyev.android.calculator.App;
import org.solovyev.android.calculator.Preferences;
import javax.annotation.Nonnull;
@@ -26,9 +26,12 @@ public final class Languages implements SharedPreferences.OnSharedPreferenceChan
@Nonnull
private final List list = new ArrayList<>();
@Nonnull
+ private final Application application;
+ @Nonnull
private final SharedPreferences preferences;
- public Languages(@Nonnull SharedPreferences preferences) {
+ public Languages(@Nonnull Application application, @Nonnull SharedPreferences preferences) {
+ this.application = application;
this.preferences = preferences;
}
@@ -160,7 +163,7 @@ public final class Languages implements SharedPreferences.OnSharedPreferenceChan
@Override
public void onSharedPreferenceChanged(@Nonnull SharedPreferences p, String key) {
if (Preferences.Gui.language.isSameKey(key)) {
- updateContextLocale(App.getApplication(), false);
+ updateContextLocale(application, false);
}
}
diff --git a/app/src/main/java/org/solovyev/android/calculator/preferences/PreferencesActivity.java b/app/src/main/java/org/solovyev/android/calculator/preferences/PreferencesActivity.java
index bb66b057..78f85c4b 100644
--- a/app/src/main/java/org/solovyev/android/calculator/preferences/PreferencesActivity.java
+++ b/app/src/main/java/org/solovyev/android/calculator/preferences/PreferencesActivity.java
@@ -88,7 +88,7 @@ public class PreferencesActivity extends BaseActivity implements SharedPreferenc
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- App.getPreferences().registerOnSharedPreferenceChangeListener(this);
+ preferences.registerOnSharedPreferenceChangeListener(this);
final Intent intent = getIntent();
final int preferenceTitle = intent.getIntExtra(EXTRA_PREFERENCE_TITLE, 0);
@@ -139,7 +139,7 @@ public class PreferencesActivity extends BaseActivity implements SharedPreferenc
@Override
protected void onDestroy() {
checkout.stop();
- App.getPreferences().unregisterOnSharedPreferenceChangeListener(this);
+ preferences.unregisterOnSharedPreferenceChangeListener(this);
super.onDestroy();
}
diff --git a/app/src/main/java/org/solovyev/android/calculator/preferences/PreferencesFragment.java b/app/src/main/java/org/solovyev/android/calculator/preferences/PreferencesFragment.java
index eba148ac..555d7ad5 100644
--- a/app/src/main/java/org/solovyev/android/calculator/preferences/PreferencesFragment.java
+++ b/app/src/main/java/org/solovyev/android/calculator/preferences/PreferencesFragment.java
@@ -10,9 +10,7 @@ import android.support.v4.app.FragmentActivity;
import android.util.SparseArray;
import android.view.View;
import android.widget.ListView;
-
import org.solovyev.android.calculator.AdView;
-import org.solovyev.android.calculator.App;
import org.solovyev.android.calculator.Engine;
import org.solovyev.android.calculator.Preferences;
import org.solovyev.android.calculator.R;
@@ -22,12 +20,14 @@ import org.solovyev.android.checkout.BillingRequests;
import org.solovyev.android.checkout.Checkout;
import org.solovyev.android.checkout.ProductTypes;
import org.solovyev.android.checkout.RequestListener;
-
-import java.util.List;
+import org.solovyev.android.wizard.Wizards;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
+import javax.inject.Inject;
+import java.util.List;
+import static org.solovyev.android.calculator.App.cast;
import static org.solovyev.android.calculator.wizard.CalculatorWizards.DEFAULT_WIZARD_FLOW;
import static org.solovyev.android.wizard.WizardUi.startWizard;
@@ -38,6 +38,12 @@ public class PreferencesFragment extends org.solovyev.android.material.preferenc
private Preference buyPremiumPreference;
@Nullable
private AdView adView;
+ @Inject
+ SharedPreferences preferences;
+ @Inject
+ Languages languages;
+ @Inject
+ Wizards wizards;
@Nonnull
public static PreferencesFragment create(int preferencesResId, int layoutResId) {
@@ -49,8 +55,9 @@ public class PreferencesFragment extends org.solovyev.android.material.preferenc
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ cast(this).getComponent().inject(this);
- App.getPreferences().registerOnSharedPreferenceChangeListener(this);
+ preferences.registerOnSharedPreferenceChangeListener(this);
}
private void setPreferenceIntent(int xml, @Nonnull PreferencesActivity.PrefDef def) {
@@ -80,7 +87,7 @@ public class PreferencesFragment extends org.solovyev.android.material.preferenc
restartWizardPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
- startWizard(App.getWizards(), DEFAULT_WIZARD_FLOW, getActivity());
+ startWizard(wizards, DEFAULT_WIZARD_FLOW, getActivity());
return true;
}
});
@@ -122,7 +129,6 @@ public class PreferencesFragment extends org.solovyev.android.material.preferenc
}
});
- final SharedPreferences preferences = App.getPreferences();
onSharedPreferenceChanged(preferences, Engine.Preferences.Output.round.getKey());
}
@@ -132,7 +138,6 @@ public class PreferencesFragment extends org.solovyev.android.material.preferenc
}
final ListPreference language = (ListPreference) preferenceManager.findPreference(Preferences.Gui.language.getKey());
- final Languages languages = App.getLanguages();
final List languagesList = languages.getList();
final CharSequence[] entries = new CharSequence[languagesList.size()];
final CharSequence[] entryValues = new CharSequence[languagesList.size()];
@@ -195,7 +200,7 @@ public class PreferencesFragment extends org.solovyev.android.material.preferenc
@Override
public void onDestroy() {
- App.getPreferences().unregisterOnSharedPreferenceChangeListener(this);
+ preferences.unregisterOnSharedPreferenceChangeListener(this);
super.onDestroy();
}
diff --git a/app/src/main/java/org/solovyev/android/calculator/preferences/PurchaseDialogActivity.java b/app/src/main/java/org/solovyev/android/calculator/preferences/PurchaseDialogActivity.java
index bfe9ce65..801f5eab 100644
--- a/app/src/main/java/org/solovyev/android/calculator/preferences/PurchaseDialogActivity.java
+++ b/app/src/main/java/org/solovyev/android/calculator/preferences/PurchaseDialogActivity.java
@@ -30,11 +30,10 @@ import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
-
import org.solovyev.android.calculator.App;
-import org.solovyev.android.calculator.BaseActivity;
import org.solovyev.android.calculator.BaseDialogFragment;
import org.solovyev.android.calculator.R;
+import org.solovyev.android.calculator.ga.Ga;
import org.solovyev.android.checkout.*;
import javax.annotation.Nonnull;
@@ -49,6 +48,8 @@ public class PurchaseDialogActivity extends AppCompatActivity implements Request
Billing billing;
@Inject
Products products;
+ @Inject
+ Ga ga;
ActivityCheckout checkout;
@Override
@@ -69,12 +70,12 @@ public class PurchaseDialogActivity extends AppCompatActivity implements Request
@Override
protected void onStart() {
super.onStart();
- BaseActivity.reportActivityStart(this);
+ ga.getAnalytics().reportActivityStart(this);
}
@Override
protected void onStop() {
- BaseActivity.reportActivityStop(this);
+ ga.getAnalytics().reportActivityStop(this);
super.onStop();
}
diff --git a/app/src/main/java/org/solovyev/android/calculator/view/EditorTextProcessor.java b/app/src/main/java/org/solovyev/android/calculator/view/EditorTextProcessor.java
index c2c47911..b863f05f 100644
--- a/app/src/main/java/org/solovyev/android/calculator/view/EditorTextProcessor.java
+++ b/app/src/main/java/org/solovyev/android/calculator/view/EditorTextProcessor.java
@@ -2,8 +2,6 @@ package org.solovyev.android.calculator.view;
import android.app.Application;
import android.content.SharedPreferences;
-
-import org.solovyev.android.calculator.App;
import org.solovyev.android.calculator.Engine;
import org.solovyev.android.calculator.Preferences;
import org.solovyev.android.calculator.text.TextProcessor;
@@ -21,11 +19,14 @@ public final class EditorTextProcessor implements TextProcessor= 79.0
- || metrics.densityDpi - metrics.ydpi >= 79.0
- || Math.abs(metrics.ydpi - metrics.xdpi) > 40.0) {
- xDpi = yDpi = metrics.densityDpi;
- } else {
- xDpi = metrics.xdpi;
- yDpi = metrics.ydpi;
- }
- }
-
- private void initDimensions() {
- final float w = getWidthPxs() / xDpi;
- final float h = getHeightPxs() / yDpi;
- diagonalIns = (float) Math.sqrt(w * w + h * h);
- widthIns = w;
- heightIns = h;
- }
-
- public boolean isInPortraitMode() {
- return getWidthPxs() < getHeightPxs();
- }
-
- @SuppressWarnings("deprecation")
- public int getWidthPxs() {
- return display.getWidth();
- }
-
- @SuppressWarnings("deprecation")
- public int getHeightPxs() {
- return display.getHeight();
- }
-
- public float getWidthIns() {
- return widthIns;
- }
-
- public float getHeightIns() {
- return heightIns;
- }
-
- public int getDensityDpi() {
- return metrics.densityDpi;
- }
-
- public float getDensity() {
- return metrics.density;
- }
-
- public float getXDpi() {
- return xDpi;
- }
-
- public float getYDpi() {
- return yDpi;
- }
-
- public float getDiagonalIns() {
- return diagonalIns;
- }
-
- public int getLayout() {
- return layout;
- }
-}
diff --git a/app/src/main/java/org/solovyev/android/calculator/wizard/ChooseModeWizardStep.java b/app/src/main/java/org/solovyev/android/calculator/wizard/ChooseModeWizardStep.java
index 56b1ba30..e8e506e6 100644
--- a/app/src/main/java/org/solovyev/android/calculator/wizard/ChooseModeWizardStep.java
+++ b/app/src/main/java/org/solovyev/android/calculator/wizard/ChooseModeWizardStep.java
@@ -27,7 +27,6 @@ import android.view.View;
import android.widget.AdapterView;
import android.widget.Spinner;
import android.widget.TextView;
-import org.solovyev.android.calculator.App;
import org.solovyev.android.calculator.Preferences;
import org.solovyev.android.calculator.R;
import org.solovyev.android.views.dragbutton.DirectionDragButton;
@@ -52,7 +51,7 @@ public class ChooseModeWizardStep extends WizardFragment implements AdapterView.
public void onViewCreated(View root, Bundle savedInstanceState) {
super.onViewCreated(root, savedInstanceState);
- final CalculatorMode mode = CalculatorMode.fromGuiLayout(Preferences.Gui.layout.getPreference(App.getPreferences()));
+ final CalculatorMode mode = CalculatorMode.fromGuiLayout(Preferences.Gui.layout.getPreference(preferences));
final Spinner spinner = (Spinner) root.findViewById(R.id.wizard_mode_spinner);
spinner.setAdapter(WizardArrayAdapter.create(getActivity(), R.array.cpp_modes));
spinner.setSelection(mode == simple ? 0 : 1);
@@ -80,7 +79,7 @@ public class ChooseModeWizardStep extends WizardFragment implements AdapterView.
@Override
public void onItemSelected(AdapterView> parent, View view, int position, long id) {
final CalculatorMode mode = position == 0 ? simple : engineer;
- mode.apply(App.getPreferences());
+ mode.apply(preferences);
updateDescription(mode);
}
diff --git a/app/src/main/java/org/solovyev/android/calculator/wizard/ChooseThemeWizardStep.java b/app/src/main/java/org/solovyev/android/calculator/wizard/ChooseThemeWizardStep.java
index 6143739e..f29670a8 100644
--- a/app/src/main/java/org/solovyev/android/calculator/wizard/ChooseThemeWizardStep.java
+++ b/app/src/main/java/org/solovyev/android/calculator/wizard/ChooseThemeWizardStep.java
@@ -55,7 +55,7 @@ public class ChooseThemeWizardStep extends WizardFragment implements AdapterView
public void onViewCreated(View root, Bundle savedInstanceState) {
super.onViewCreated(root, savedInstanceState);
- final Preferences.Gui.Theme theme = Preferences.Gui.getTheme(App.getPreferences());
+ final Preferences.Gui.Theme theme = Preferences.Gui.getTheme(preferences);
final Spinner spinner = (Spinner) root.findViewById(R.id.wizard_theme_spinner);
themes.clear();
themes.add(new ThemeUi(Preferences.Gui.Theme.material_theme, R.string.cpp_theme_dark));
@@ -97,7 +97,7 @@ public class ChooseThemeWizardStep extends WizardFragment implements AdapterView
@Override
public void onItemSelected(AdapterView> parent, View view, int position, long id) {
final ThemeUi theme = adapter.getItem(position);
- Preferences.Gui.theme.putPreference(App.getPreferences(), theme.theme);
+ Preferences.Gui.theme.putPreference(preferences, theme.theme);
updateImage(theme.theme);
}
diff --git a/app/src/main/java/org/solovyev/android/calculator/wizard/OnScreenCalculatorWizardStep.java b/app/src/main/java/org/solovyev/android/calculator/wizard/OnScreenCalculatorWizardStep.java
index 264d873a..1b52329b 100644
--- a/app/src/main/java/org/solovyev/android/calculator/wizard/OnScreenCalculatorWizardStep.java
+++ b/app/src/main/java/org/solovyev/android/calculator/wizard/OnScreenCalculatorWizardStep.java
@@ -49,7 +49,7 @@ public class OnScreenCalculatorWizardStep extends WizardFragment implements Comp
public void onViewCreated(View root, Bundle savedInstanceState) {
super.onViewCreated(root, savedInstanceState);
- final Boolean enabled = Preferences.Onscreen.showAppIcon.getPreference(App.getPreferences());
+ final Boolean enabled = Preferences.Onscreen.showAppIcon.getPreference(preferences);
checkbox = (CheckBox) root.findViewById(R.id.wizard_onscreen_app_enabled_checkbox);
checkbox.setChecked(enabled);
checkbox.setOnCheckedChangeListener(this);
@@ -67,7 +67,7 @@ public class OnScreenCalculatorWizardStep extends WizardFragment implements Comp
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean checked) {
- Preferences.Onscreen.showAppIcon.putPreference(App.getPreferences(), checked);
+ Preferences.Onscreen.showAppIcon.putPreference(preferences, checked);
}
}
diff --git a/app/src/main/java/org/solovyev/android/calculator/wizard/WizardActivity.java b/app/src/main/java/org/solovyev/android/calculator/wizard/WizardActivity.java
index cc40ee7c..b001532a 100644
--- a/app/src/main/java/org/solovyev/android/calculator/wizard/WizardActivity.java
+++ b/app/src/main/java/org/solovyev/android/calculator/wizard/WizardActivity.java
@@ -38,8 +38,6 @@ public class WizardActivity extends BaseActivity implements WizardsAware, Shared
private ViewPager pager;
@Nonnull
private WizardPagerAdapter pagerAdapter;
- @Nonnull
- private Wizards wizards = App.getWizards();
@Nullable
private AlertDialog dialog;
@@ -47,6 +45,8 @@ public class WizardActivity extends BaseActivity implements WizardsAware, Shared
SharedPreferences preferences;
@Inject
Languages languages;
+ @Inject
+ Wizards wizards;
public WizardActivity() {
super(R.layout.cpp_activity_wizard, 0);
diff --git a/app/src/main/java/org/solovyev/android/calculator/wizard/WizardFragment.java b/app/src/main/java/org/solovyev/android/calculator/wizard/WizardFragment.java
index 278b566b..bb9c32b4 100644
--- a/app/src/main/java/org/solovyev/android/calculator/wizard/WizardFragment.java
+++ b/app/src/main/java/org/solovyev/android/calculator/wizard/WizardFragment.java
@@ -1,5 +1,6 @@
package org.solovyev.android.calculator.wizard;
+import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.annotation.LayoutRes;
import android.support.v4.app.Fragment;
@@ -8,6 +9,7 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
+import org.solovyev.android.calculator.AppComponent;
import org.solovyev.android.calculator.R;
import org.solovyev.android.calculator.release.ChooseThemeReleaseNoteFragment;
import org.solovyev.android.calculator.release.ChooseThemeReleaseNoteStep;
@@ -20,7 +22,9 @@ import org.solovyev.android.wizard.WizardStep;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
+import javax.inject.Inject;
+import static org.solovyev.android.calculator.App.cast;
import static org.solovyev.android.calculator.App.toPixels;
public abstract class WizardFragment extends Fragment implements View.OnClickListener {
@@ -30,16 +34,22 @@ public abstract class WizardFragment extends Fragment implements View.OnClickLis
@Nullable
protected TextView prevButton;
-
+ @Inject
+ SharedPreferences preferences;
private WizardStep step;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ inject(cast(this).getComponent());
step = findStepByClassName();
}
+ protected void inject(@Nonnull AppComponent component) {
+ component.inject(this);
+ }
+
@Nonnull
private WizardStep findStepByClassName() {
if (this instanceof ReleaseNoteFragment) {