Remove ActivityUi

This commit is contained in:
serso 2016-03-01 11:57:48 +01:00
parent 6427c91953
commit a6bb109514
17 changed files with 338 additions and 396 deletions

View File

@ -1,301 +0,0 @@
/*
* Copyright 2013 serso aka se.solovyev
*
* 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.
*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Contact details
*
* Email: se.solovyev@gmail.com
* Site: http://se.solovyev.org
*/
package org.solovyev.android.calculator;
import static org.solovyev.android.calculator.App.cast;
import android.app.Activity;
import android.app.KeyguardManager;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.graphics.Color;
import android.graphics.Typeface;
import android.support.annotation.DrawableRes;
import android.support.annotation.LayoutRes;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import org.solovyev.android.Activities;
import org.solovyev.android.Check;
import org.solovyev.android.Views;
import org.solovyev.android.calculator.history.History;
import org.solovyev.android.calculator.language.Language;
import org.solovyev.android.calculator.language.Languages;
import org.solovyev.android.calculator.view.Tabs;
import butterknife.Bind;
import butterknife.ButterKnife;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.inject.Inject;
public class ActivityUi {
@Nonnull
private final AppCompatActivity activity;
private final int layoutId;
@Nonnull
private final Tabs tabs;
@Inject
SharedPreferences preferences;
@Inject
Editor editor;
@Inject
History history;
@Inject
Keyboard keyboard;
@Inject
Calculator calculator;
@Inject
Typeface typeface;
@Bind(R.id.main)
ViewGroup mainView;
@Nullable
@Bind(R.id.toolbar)
Toolbar toolbar;
@Nullable
@Bind(R.id.fab)
FloatingActionButton fab;
@Nonnull
private Preferences.Gui.Theme theme = Preferences.Gui.Theme.material_theme;
@Nonnull
private Preferences.Gui.Layout layout = Preferences.Gui.Layout.main_calculator;
@Nonnull
private Language language = Languages.SYSTEM_LANGUAGE;
public ActivityUi(@Nonnull AppCompatActivity activity, @LayoutRes int layoutId) {
this.activity = activity;
this.layoutId = layoutId;
tabs = new Tabs(activity);
}
public static boolean restartIfThemeChanged(@Nonnull Activity activity, @Nonnull Preferences.Gui.Theme oldTheme) {
final Preferences.Gui.Theme newTheme = Preferences.Gui.theme.getPreference(App.getPreferences());
final int themeId = oldTheme.getThemeFor(activity);
final int newThemeId = newTheme.getThemeFor(activity);
if (themeId != newThemeId) {
Activities.restartActivity(activity);
return true;
}
return false;
}
public static boolean restartIfLanguageChanged(@Nonnull Activity activity, @Nonnull Language oldLanguage) {
final Language current = App.getLanguages().getCurrent();
if (!current.equals(oldLanguage)) {
Activities.restartActivity(activity);
return true;
}
return false;
}
public static void reportActivityStop(@Nonnull Activity activity) {
App.getGa().getAnalytics().reportActivityStop(activity);
}
public static void reportActivityStart(@Nonnull Activity activity) {
App.getGa().getAnalytics().reportActivityStart(activity);
}
public static void setFont(@Nonnull TextView view, @Nonnull Typeface newTypeface) {
final Typeface oldTypeface = view.getTypeface();
if (oldTypeface == newTypeface) {
return;
}
final int style = oldTypeface != null ? oldTypeface.getStyle() : Typeface.NORMAL;
view.setTypeface(newTypeface, style);
}
public void onPreCreate(@Nonnull Activity activity) {
cast(activity.getApplication()).getComponent().inject(this);
theme = Preferences.Gui.getTheme(preferences);
activity.setTheme(theme.getThemeFor(activity));
layout = Preferences.Gui.getLayout(preferences);
language = App.getLanguages().getCurrent();
}
public void onCreate() {
// let's disable locking of screen for monkeyrunner
if (App.isMonkeyRunner(activity)) {
final KeyguardManager km = (KeyguardManager) activity.getSystemService(Context.KEYGUARD_SERVICE);
//noinspection deprecation
km.newKeyguardLock(activity.getClass().getName()).disableKeyguard();
}
App.getLanguages().updateContextLocale(activity, false);
activity.setContentView(layoutId);
ButterKnife.bind(this, activity);
fixFonts(mainView);
addHelpInfo(activity, mainView);
initToolbar();
}
private void initToolbar() {
if (toolbar == null) {
return;
}
if (activity instanceof CalculatorActivity) {
return;
}
activity.setSupportActionBar(toolbar);
final ActionBar actionBar = activity.getSupportActionBar();
Check.isNotNull(actionBar);
actionBar.setDisplayHomeAsUpEnabled(true);
}
public void onPause() {
tabs.onPause();
}
public void onDestroy() {
}
@Nonnull
public Language getLanguage() {
return language;
}
@Nonnull
public Preferences.Gui.Layout getLayout() {
return layout;
}
@Nonnull
public Preferences.Gui.Theme getTheme() {
return theme;
}
public void onResume() {
if (!restartIfThemeChanged(activity, theme)) {
restartIfLanguageChanged(activity, language);
}
}
private void addHelpInfo(@Nonnull Activity activity, @Nonnull View root) {
if (!App.isMonkeyRunner(activity)) {
return;
}
if (!(root instanceof ViewGroup)) {
return;
}
final TextView helperTextView = new TextView(activity);
final DisplayMetrics dm = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
helperTextView.setTextSize(15);
helperTextView.setTextColor(Color.WHITE);
final Configuration c = activity.getResources().getConfiguration();
final StringBuilder helpText = new StringBuilder();
helpText.append("Size: ");
if (Views.isLayoutSizeAtLeast(Configuration.SCREENLAYOUT_SIZE_XLARGE, c)) {
helpText.append("xlarge");
} else if (Views.isLayoutSizeAtLeast(Configuration.SCREENLAYOUT_SIZE_LARGE, c)) {
helpText.append("large");
} else if (Views.isLayoutSizeAtLeast(Configuration.SCREENLAYOUT_SIZE_NORMAL, c)) {
helpText.append("normal");
} else if (Views.isLayoutSizeAtLeast(Configuration.SCREENLAYOUT_SIZE_SMALL, c)) {
helpText.append("small");
} else {
helpText.append("unknown");
}
helpText.append(" (").append(dm.widthPixels).append("x").append(dm.heightPixels).append(")");
helpText.append(" Density: ");
switch (dm.densityDpi) {
case DisplayMetrics.DENSITY_LOW:
helpText.append("ldpi");
break;
case DisplayMetrics.DENSITY_MEDIUM:
helpText.append("mdpi");
break;
case DisplayMetrics.DENSITY_HIGH:
helpText.append("hdpi");
break;
case DisplayMetrics.DENSITY_XHIGH:
helpText.append("xhdpi");
break;
case DisplayMetrics.DENSITY_TV:
helpText.append("tv");
break;
}
helpText.append(" (").append(dm.densityDpi).append(")");
helperTextView.setText(helpText);
((ViewGroup) root).addView(helperTextView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
}
public void onStop(@Nonnull Activity activity) {
reportActivityStop(activity);
}
public void onStart(@Nonnull Activity activity) {
reportActivityStart(activity);
}
protected void fixFonts(@Nonnull View root) {
// some devices ship own fonts which causes issues with rendering. Let's use our own font for all text views
Views.processViewsOfType(root, TextView.class, new Views.ViewProcessor<TextView>() {
@Override
public void process(@Nonnull TextView view) {
setFont(view, typeface);
}
});
}
public void onPostCreate() {
tabs.onCreate();
}
@Nonnull
public Tabs getTabs() {
return tabs;
}
public void withFab(@DrawableRes int icon, @Nonnull View.OnClickListener listener) {
if (fab == null) {
Check.shouldNotHappen();
return;
}
fab.setVisibility(View.VISIBLE);
fab.setImageResource(icon);
fab.setOnClickListener(listener);
}
}

View File

@ -30,6 +30,7 @@ import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.graphics.Color;
import android.net.Uri; import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.IBinder; import android.os.IBinder;
@ -42,9 +43,12 @@ import android.support.v4.app.FragmentTransaction;
import android.text.Spannable; import android.text.Spannable;
import android.text.SpannableString; import android.text.SpannableString;
import android.text.style.ForegroundColorSpan; import android.text.style.ForegroundColorSpan;
import android.util.DisplayMetrics;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodManager;
import android.widget.TextView;
import com.squareup.otto.Bus; import com.squareup.otto.Bus;
@ -184,19 +188,6 @@ public final class App {
return languages; return languages;
} }
public static boolean isLg() {
if (lg == null) {
lg = "lge".equalsIgnoreCase(Build.BRAND) || "lge".equalsIgnoreCase(Build.MANUFACTURER);
}
return lg;
}
// see https://code.google.com/p/android/issues/detail?id=78154
// and http://developer.lge.com/community/forums/RetrieveForumContent.dev?detailContsId=FC29190703
public static boolean shouldOpenMenuManually() {
return isLg() && Build.VERSION.SDK_INT == Build.VERSION_CODES.JELLY_BEAN;
}
@Nonnull @Nonnull
public static ScreenMetrics getScreenMetrics() { public static ScreenMetrics getScreenMetrics() {
return screenMetrics; return screenMetrics;
@ -349,4 +340,63 @@ public final class App {
public static boolean isTablet(@NonNull Context context) { public static boolean isTablet(@NonNull Context context) {
return context.getResources().getBoolean(R.bool.cpp_tablet); return context.getResources().getBoolean(R.bool.cpp_tablet);
} }
static void addHelpInfo(@Nonnull Activity activity, @Nonnull View root) {
if (!isMonkeyRunner(activity)) {
return;
}
if (!(root instanceof ViewGroup)) {
return;
}
final TextView helperTextView = new TextView(activity);
final DisplayMetrics dm = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
helperTextView.setTextSize(15);
helperTextView.setTextColor(Color.WHITE);
final Configuration c = activity.getResources().getConfiguration();
final StringBuilder helpText = new StringBuilder();
helpText.append("Size: ");
if (Views.isLayoutSizeAtLeast(Configuration.SCREENLAYOUT_SIZE_XLARGE, c)) {
helpText.append("xlarge");
} else if (Views.isLayoutSizeAtLeast(Configuration.SCREENLAYOUT_SIZE_LARGE, c)) {
helpText.append("large");
} else if (Views.isLayoutSizeAtLeast(Configuration.SCREENLAYOUT_SIZE_NORMAL, c)) {
helpText.append("normal");
} else if (Views.isLayoutSizeAtLeast(Configuration.SCREENLAYOUT_SIZE_SMALL, c)) {
helpText.append("small");
} else {
helpText.append("unknown");
}
helpText.append(" (").append(dm.widthPixels).append("x").append(dm.heightPixels).append(")");
helpText.append(" Density: ");
switch (dm.densityDpi) {
case DisplayMetrics.DENSITY_LOW:
helpText.append("ldpi");
break;
case DisplayMetrics.DENSITY_MEDIUM:
helpText.append("mdpi");
break;
case DisplayMetrics.DENSITY_HIGH:
helpText.append("hdpi");
break;
case DisplayMetrics.DENSITY_XHIGH:
helpText.append("xhdpi");
break;
case DisplayMetrics.DENSITY_TV:
helpText.append("tv");
break;
}
helpText.append(" (").append(dm.densityDpi).append(")");
helperTextView.setText(helpText);
((ViewGroup) root).addView(helperTextView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
}
} }

View File

@ -23,17 +23,17 @@ import org.solovyev.android.calculator.variables.VariablesFragment;
import org.solovyev.android.calculator.view.Tabs; import org.solovyev.android.calculator.view.Tabs;
import org.solovyev.android.calculator.widget.CalculatorWidget; import org.solovyev.android.calculator.widget.CalculatorWidget;
import org.solovyev.android.calculator.wizard.DragButtonWizardStep; import org.solovyev.android.calculator.wizard.DragButtonWizardStep;
import org.solovyev.android.calculator.wizard.WizardActivity;
import dagger.Component;
import javax.inject.Singleton; import javax.inject.Singleton;
import dagger.Component;
@Singleton @Singleton
@Component(modules = AppModule.class) @Component(modules = AppModule.class)
public interface AppComponent { public interface AppComponent {
void inject(CalculatorApplication application); void inject(CalculatorApplication application);
void inject(EditorFragment fragment); void inject(EditorFragment fragment);
void inject(ActivityUi ui);
void inject(FloatingCalculatorService service); void inject(FloatingCalculatorService service);
void inject(BaseHistoryFragment fragment); void inject(BaseHistoryFragment fragment);
void inject(BaseDialogFragment fragment); void inject(BaseDialogFragment fragment);
@ -63,4 +63,6 @@ public interface AppComponent {
void inject(HistoryActivity activity); void inject(HistoryActivity activity);
void inject(Tabs tabs); void inject(Tabs tabs);
void inject(CalculatorWidget widget); void inject(CalculatorWidget widget);
void inject(WizardActivity activity);
void inject(BaseActivity activity);
} }

View File

@ -14,6 +14,7 @@ import com.squareup.otto.Bus;
import com.squareup.otto.GeneratedHandlerFinder; import com.squareup.otto.GeneratedHandlerFinder;
import org.solovyev.android.UiThreadExecutor; import org.solovyev.android.UiThreadExecutor;
import org.solovyev.android.calculator.language.Languages;
import org.solovyev.android.checkout.Billing; import org.solovyev.android.checkout.Billing;
import org.solovyev.android.checkout.Checkout; import org.solovyev.android.checkout.Checkout;
import org.solovyev.android.checkout.Inventory; import org.solovyev.android.checkout.Inventory;
@ -56,9 +57,12 @@ public class AppModule {
@NonNull @NonNull
private final Application application; private final Application application;
@NonNull
private final Languages languages;
public AppModule(@NonNull Application application) { public AppModule(@NonNull Application application, @NonNull Languages languages) {
this.application = application; this.application = application;
this.languages = languages;
} }
@Provides @Provides
@ -213,6 +217,13 @@ public class AppModule {
return Plot.newPlotter(application); return Plot.newPlotter(application);
} }
@Provides
@Singleton
@NonNull
public Languages provideLanguages() {
return languages;
}
@Nonnull @Nonnull
private File makeFilesDir() { private File makeFilesDir() {
final File filesDir = application.getFilesDir(); final File filesDir = application.getFilesDir();

View File

@ -1,43 +1,183 @@
package org.solovyev.android.calculator; package org.solovyev.android.calculator;
import static org.solovyev.android.calculator.App.cast; import android.app.Activity;
import android.app.KeyguardManager;
import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.Typeface;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.DrawableRes;
import android.support.annotation.LayoutRes; import android.support.annotation.LayoutRes;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import org.solovyev.android.Activities;
import org.solovyev.android.Check;
import org.solovyev.android.Views;
import org.solovyev.android.calculator.history.History;
import org.solovyev.android.calculator.language.Language;
import org.solovyev.android.calculator.language.Languages;
import org.solovyev.android.calculator.view.Tabs; import org.solovyev.android.calculator.view.Tabs;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.inject.Inject;
import butterknife.Bind;
import butterknife.ButterKnife;
import static org.solovyev.android.calculator.App.cast;
public class BaseActivity extends AppCompatActivity { public class BaseActivity extends AppCompatActivity {
@Nonnull @Nonnull
protected final ActivityUi ui; protected final Tabs tabs;
private final int layoutId;
@Inject
SharedPreferences preferences;
@Inject
Languages languages;
@Inject
Editor editor;
@Inject
History history;
@Inject
Keyboard keyboard;
@Inject
Calculator calculator;
@Inject
Typeface typeface;
@Bind(R.id.main)
ViewGroup mainView;
@Nullable
@Bind(R.id.toolbar)
Toolbar toolbar;
@Nullable
@Bind(R.id.fab)
FloatingActionButton fab;
@Nonnull
private Preferences.Gui.Theme theme = Preferences.Gui.Theme.material_theme;
@Nonnull
private Preferences.Gui.Layout layout = Preferences.Gui.Layout.main_calculator;
@Nonnull
private Language language = Languages.SYSTEM_LANGUAGE;
public BaseActivity() { public BaseActivity() {
this(R.layout.activity_tabs); this(R.layout.activity_tabs);
} }
public BaseActivity(@LayoutRes int layout) { public BaseActivity(@LayoutRes int layout) {
this.ui = new ActivityUi(this, layout); this.layoutId = layout;
this.tabs = new Tabs(this);
} }
@Nonnull public static void reportActivityStop(@Nonnull Activity activity) {
public ActivityUi getUi() { App.getGa().getAnalytics().reportActivityStop(activity);
return ui; }
public static void reportActivityStart(@Nonnull Activity activity) {
App.getGa().getAnalytics().reportActivityStart(activity);
}
public static void setFont(@Nonnull TextView view, @Nonnull Typeface newTypeface) {
final Typeface oldTypeface = view.getTypeface();
if (oldTypeface == newTypeface) {
return;
}
final int style = oldTypeface != null ? oldTypeface.getStyle() : Typeface.NORMAL;
view.setTypeface(newTypeface, style);
}
public boolean restartIfLayoutChanged() {
final Preferences.Gui.Layout newLayout = Preferences.Gui.layout.getPreference(preferences);
if (newLayout != layout) {
Activities.restartActivity(this);
return true;
}
return false;
}
public boolean restartIfThemeChanged() {
final Preferences.Gui.Theme newTheme = Preferences.Gui.theme.getPreferenceNoError(preferences);
final int themeId = theme.getThemeFor(this);
final int newThemeId = newTheme.getThemeFor(this);
if (themeId != newThemeId) {
Activities.restartActivity(this);
return true;
}
return false;
}
public boolean restartIfLanguageChanged() {
final Language current = languages.getCurrent();
if (!current.equals(language)) {
Activities.restartActivity(this);
return true;
}
return false;
} }
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
ui.onPreCreate(this); onPreCreate();
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
inject(cast(getApplication()).getComponent()); inject(cast(getApplication()).getComponent());
ui.onCreate();
populateTabs(ui.getTabs()); disableKeyguard();
ui.onPostCreate(); languages.updateContextLocale(this, false);
createView();
}
private void createView() {
setContentView(layoutId);
ButterKnife.bind(this, this);
fixFonts(mainView);
App.addHelpInfo(this, mainView);
initToolbar();
populateTabs(tabs);
tabs.onCreate();
}
private void initToolbar() {
if (toolbar == null) {
return;
}
if (this instanceof CalculatorActivity) {
return;
}
setSupportActionBar(toolbar);
final ActionBar actionBar = getSupportActionBar();
Check.isNotNull(actionBar);
actionBar.setDisplayHomeAsUpEnabled(true);
}
@SuppressWarnings({"ResourceType", "deprecation"})
private void disableKeyguard() {
if (App.isMonkeyRunner(this)) {
final KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
km.newKeyguardLock(getClass().getName()).disableKeyguard();
}
}
private void onPreCreate() {
cast(getApplication()).getComponent().inject(this);
theme = Preferences.Gui.getTheme(preferences);
setTheme(theme.getThemeFor(this));
layout = Preferences.Gui.getLayout(preferences);
language = App.getLanguages().getCurrent();
} }
protected void populateTabs(@Nonnull Tabs tabs) { protected void populateTabs(@Nonnull Tabs tabs) {
@ -49,42 +189,42 @@ public class BaseActivity extends AppCompatActivity {
@Override @Override
protected void onStart() { protected void onStart() {
super.onStart(); super.onStart();
ui.onStart(this); reportActivityStart(this);
} }
@Override @Override
protected void onStop() { protected void onStop() {
ui.onStop(this); reportActivityStop(this);
super.onStop(); super.onStop();
} }
@Override @Override
public boolean onKeyDown(int keyCode, KeyEvent event) { public boolean onKeyUp(int keyCode, KeyEvent event) {
if (App.shouldOpenMenuManually() && keyCode == KeyEvent.KEYCODE_MENU) { if (keyCode == KeyEvent.KEYCODE_MENU && event.getRepeatCount() == 0 && toolbar != null) {
openOptionsMenu(); if (toolbar.isOverflowMenuShowing()) {
toolbar.hideOverflowMenu();
} else {
toolbar.showOverflowMenu();
}
return true; return true;
} }
return super.onKeyDown(keyCode, event); return super.onKeyUp(keyCode, event);
} }
@Override @Override
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
ui.onResume(); if (!restartIfThemeChanged()) {
restartIfLanguageChanged();
}
} }
@Override @Override
protected void onPause() { protected void onPause() {
this.ui.onPause(); tabs.onPause();
super.onPause(); super.onPause();
} }
@Override
protected void onDestroy() {
super.onDestroy();
ui.onDestroy();
}
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) { switch (item.getItemId()) {
@ -94,4 +234,24 @@ public class BaseActivity extends AppCompatActivity {
} }
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }
public void withFab(@DrawableRes int icon, @Nonnull View.OnClickListener listener) {
if (fab == null) {
Check.shouldNotHappen();
return;
}
fab.setVisibility(View.VISIBLE);
fab.setImageResource(icon);
fab.setOnClickListener(listener);
}
protected void fixFonts(@Nonnull View root) {
// some devices ship own fonts which causes issues with rendering. Let's use our own font for all text views
Views.processViewsOfType(root, TextView.class, new Views.ViewProcessor<TextView>() {
@Override
public void process(@Nonnull TextView view) {
setFont(view, typeface);
}
});
}
} }

View File

@ -30,11 +30,13 @@ import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction; import android.support.v4.app.FragmentTransaction;
import android.support.v7.widget.CardView; import android.support.v7.widget.CardView;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
import android.view.*; import android.view.KeyEvent;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import butterknife.Bind;
import butterknife.ButterKnife;
import org.solovyev.android.Activities;
import org.solovyev.android.calculator.converter.ConverterFragment; import org.solovyev.android.calculator.converter.ConverterFragment;
import org.solovyev.android.calculator.history.History; import org.solovyev.android.calculator.history.History;
import org.solovyev.android.calculator.keyboard.PartialKeyboardUi; import org.solovyev.android.calculator.keyboard.PartialKeyboardUi;
@ -43,6 +45,9 @@ import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import javax.inject.Inject; import javax.inject.Inject;
import butterknife.Bind;
import butterknife.ButterKnife;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
import static android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; import static android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
@ -74,7 +79,7 @@ public class CalculatorActivity extends BaseActivity implements SharedPreference
@Nullable @Nullable
@Bind(R.id.card) @Bind(R.id.card)
CardView card; CardView card;
private boolean useBackAsPrev; private boolean useBackAsPrevious;
public CalculatorActivity() { public CalculatorActivity() {
super(R.layout.activity_main); super(R.layout.activity_main);
@ -102,7 +107,7 @@ public class CalculatorActivity extends BaseActivity implements SharedPreference
toolbar.inflateMenu(R.menu.main); toolbar.inflateMenu(R.menu.main);
toolbar.setOnMenuItemClickListener(this); toolbar.setOnMenuItemClickListener(this);
useBackAsPrev = Preferences.Gui.useBackAsPrevious.getPreference(preferences); useBackAsPrevious = Preferences.Gui.useBackAsPrevious.getPreference(preferences);
if (savedInstanceState == null) { if (savedInstanceState == null) {
startupHelper.onMainActivityOpened(this); startupHelper.onMainActivityOpened(this);
} }
@ -128,11 +133,9 @@ public class CalculatorActivity extends BaseActivity implements SharedPreference
@Override @Override
public boolean onKeyDown(int keyCode, KeyEvent event) { public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0 && useBackAsPrevious) {
if (useBackAsPrev) { history.undo();
history.undo(); return true;
return true;
}
} }
return super.onKeyDown(keyCode, event); return super.onKeyDown(keyCode, event);
} }
@ -140,12 +143,10 @@ public class CalculatorActivity extends BaseActivity implements SharedPreference
@Override @Override
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
launcher.setActivity(this); if (restartIfLayoutChanged()) {
return;
final Preferences.Gui.Layout newLayout = Preferences.Gui.layout.getPreference(preferences);
if (newLayout != ui.getLayout()) {
Activities.restartActivity(this);
} }
launcher.setActivity(this);
final Window window = getWindow(); final Window window = getWindow();
if (keepScreenOn.getPreference(preferences)) { if (keepScreenOn.getPreference(preferences)) {
@ -173,7 +174,7 @@ public class CalculatorActivity extends BaseActivity implements SharedPreference
@Override @Override
public void onSharedPreferenceChanged(SharedPreferences preferences, @Nullable String key) { public void onSharedPreferenceChanged(SharedPreferences preferences, @Nullable String key) {
if (Preferences.Gui.useBackAsPrevious.getKey().equals(key)) { if (Preferences.Gui.useBackAsPrevious.getKey().equals(key)) {
useBackAsPrev = Preferences.Gui.useBackAsPrevious.getPreference(preferences); useBackAsPrevious = Preferences.Gui.useBackAsPrevious.getPreference(preferences);
} }
if (Preferences.Gui.rotateScreen.getKey().equals(key)) { if (Preferences.Gui.rotateScreen.getKey().equals(key)) {

View File

@ -25,6 +25,7 @@ package org.solovyev.android.calculator;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.os.Handler; import android.os.Handler;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.support.annotation.NonNull;
import android.util.Log; import android.util.Log;
import android.util.TimingLogger; import android.util.TimingLogger;
@ -117,7 +118,7 @@ public class CalculatorApplication extends android.app.Application implements Sh
super.onCreate(); super.onCreate();
timer.addSplit("super.onCreate"); timer.addSplit("super.onCreate");
initDagger(); initDagger(languages);
timer.addSplit("initDagger"); timer.addSplit("initDagger");
onPostCreate(preferences, languages); onPostCreate(preferences, languages);
@ -125,9 +126,9 @@ public class CalculatorApplication extends android.app.Application implements Sh
timer.dumpToLog(); timer.dumpToLog();
} }
private void initDagger() { private void initDagger(@NonNull Languages languages) {
component = DaggerAppComponent.builder() component = DaggerAppComponent.builder()
.appModule(new AppModule(this)) .appModule(new AppModule(this, languages))
.build(); .build();
component.inject(this); component.inject(this);
editor.init(); editor.init();

View File

@ -357,7 +357,7 @@ public class FloatingCalculatorView {
BaseKeyboardUi.adjustButton(button); BaseKeyboardUi.adjustButton(button);
} }
if (button instanceof TextView) { if (button instanceof TextView) {
ActivityUi.setFont((TextView) button, typeface); BaseActivity.setFont((TextView) button, typeface);
} }
} }

View File

@ -57,7 +57,7 @@ public class FunctionsActivity extends BaseActivity {
} }
} }
ui.withFab(R.drawable.ic_add_white_36dp, new View.OnClickListener() { withFab(R.drawable.ic_add_white_36dp, new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
EditFunctionFragment.show(FunctionsActivity.this); EditFunctionFragment.show(FunctionsActivity.this);

View File

@ -55,10 +55,10 @@ public class HistoryActivity extends BaseActivity {
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
ui.withFab(R.drawable.ic_delete_white_36dp, new View.OnClickListener() { withFab(R.drawable.ic_delete_white_36dp, new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
final Fragment fragment = ui.getTabs().getCurrentFragment(); final Fragment fragment = tabs.getCurrentFragment();
showClearHistoryDialog(fragment instanceof RecentHistoryFragment); showClearHistoryDialog(fragment instanceof RecentHistoryFragment);
} }
}); });

View File

@ -116,7 +116,7 @@ public abstract class BaseKeyboardUi implements SharedPreferences.OnSharedPrefer
button.setVibrateOnDrag(keyboard.isVibrateOnKeypress()); button.setVibrateOnDrag(keyboard.isVibrateOnKeypress());
prepareButton((View) button); prepareButton((View) button);
button.setOnDragListener(listener); button.setOnDragListener(listener);
ActivityUi.setFont(button, typeface); BaseActivity.setFont(button, typeface);
button.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize); button.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
Adjuster.adjustText(button, textScale); Adjuster.adjustText(button, textScale);
} }

View File

@ -9,12 +9,12 @@ import android.support.annotation.StringRes;
import android.support.annotation.XmlRes; import android.support.annotation.XmlRes;
import android.util.SparseArray; import android.util.SparseArray;
import org.solovyev.android.calculator.ActivityUi;
import org.solovyev.android.calculator.App; import org.solovyev.android.calculator.App;
import org.solovyev.android.calculator.AppComponent; import org.solovyev.android.calculator.AppComponent;
import org.solovyev.android.calculator.BaseActivity; import org.solovyev.android.calculator.BaseActivity;
import org.solovyev.android.calculator.Preferences; import org.solovyev.android.calculator.Preferences;
import org.solovyev.android.calculator.R; import org.solovyev.android.calculator.R;
import org.solovyev.android.calculator.language.Languages;
import org.solovyev.android.checkout.ActivityCheckout; import org.solovyev.android.checkout.ActivityCheckout;
import org.solovyev.android.checkout.Billing; import org.solovyev.android.checkout.Billing;
import org.solovyev.android.checkout.Checkout; import org.solovyev.android.checkout.Checkout;
@ -29,20 +29,20 @@ public class PreferencesActivity extends BaseActivity implements SharedPreferenc
static final String EXTRA_PREFERENCE_TITLE = "preference-title"; static final String EXTRA_PREFERENCE_TITLE = "preference-title";
@Nonnull @Nonnull
private static final SparseArray<PrefDef> preferences = new SparseArray<>(); private static final SparseArray<PrefDef> preferenceDefs = new SparseArray<>();
public static Class<? extends PreferencesActivity> getClass(@NonNull Context context) { public static Class<? extends PreferencesActivity> getClass(@NonNull Context context) {
return App.isTablet(context) ? Dialog.class : PreferencesActivity.class; return App.isTablet(context) ? Dialog.class : PreferencesActivity.class;
} }
static { static {
preferences.append(R.xml.preferences, new PrefDef("screen-main", R.string.cpp_settings)); preferenceDefs.append(R.xml.preferences, new PrefDef("screen-main", R.string.cpp_settings));
preferences.append(R.xml.preferences_calculations, new PrefDef("screen-calculations", R.string.c_prefs_calculations_category)); preferenceDefs.append(R.xml.preferences_calculations, new PrefDef("screen-calculations", R.string.c_prefs_calculations_category));
preferences.append(R.xml.preferences_appearance, new PrefDef("screen-appearance", R.string.c_prefs_appearance_category)); preferenceDefs.append(R.xml.preferences_appearance, new PrefDef("screen-appearance", R.string.c_prefs_appearance_category));
preferences.append(R.xml.preferences_plot, new PrefDef("screen-plot", R.string.prefs_graph_screen_title)); preferenceDefs.append(R.xml.preferences_plot, new PrefDef("screen-plot", R.string.prefs_graph_screen_title));
preferences.append(R.xml.preferences_other, new PrefDef("screen-other", R.string.c_prefs_other_category)); preferenceDefs.append(R.xml.preferences_other, new PrefDef("screen-other", R.string.c_prefs_other_category));
preferences.append(R.xml.preferences_onscreen, new PrefDef("screen-onscreen", R.string.prefs_onscreen_title)); preferenceDefs.append(R.xml.preferences_onscreen, new PrefDef("screen-onscreen", R.string.prefs_onscreen_title));
preferences.append(R.xml.preferences_widget, new PrefDef("screen-widget", R.string.prefs_widget_title)); preferenceDefs.append(R.xml.preferences_widget, new PrefDef("screen-widget", R.string.prefs_widget_title));
} }
ActivityCheckout checkout; ActivityCheckout checkout;
@ -52,14 +52,18 @@ public class PreferencesActivity extends BaseActivity implements SharedPreferenc
Billing billing; Billing billing;
@Inject @Inject
Products products; Products products;
@Inject
SharedPreferences preferences;
@Inject
Languages languages;
public PreferencesActivity() { public PreferencesActivity() {
super(R.layout.activity_empty); super(R.layout.activity_empty);
} }
@Nonnull @Nonnull
static SparseArray<PrefDef> getPreferences() { static SparseArray<PrefDef> getPreferenceDefs() {
return preferences; return preferenceDefs;
} }
public static void showPlotPreferences(@Nonnull Context context) { public static void showPlotPreferences(@Nonnull Context context) {
@ -113,9 +117,9 @@ public class PreferencesActivity extends BaseActivity implements SharedPreferenc
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (!paused) { if (!paused) {
if (Preferences.Gui.theme.isSameKey(key)) { if (Preferences.Gui.theme.isSameKey(key)) {
ActivityUi.restartIfThemeChanged(this, ui.getTheme()); restartIfThemeChanged();
} else if (Preferences.Gui.language.isSameKey(key)) { } else if (Preferences.Gui.language.isSameKey(key)) {
ActivityUi.restartIfLanguageChanged(this, ui.getLanguage()); restartIfLanguageChanged();
} }
} }
} }

View File

@ -1,8 +1,5 @@
package org.solovyev.android.calculator.preferences; package org.solovyev.android.calculator.preferences;
import static org.solovyev.android.calculator.wizard.CalculatorWizards.DEFAULT_WIZARD_FLOW;
import static org.solovyev.android.wizard.WizardUi.startWizard;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.os.Build; import android.os.Build;
@ -31,6 +28,9 @@ import java.util.List;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import static org.solovyev.android.calculator.wizard.CalculatorWizards.DEFAULT_WIZARD_FLOW;
import static org.solovyev.android.wizard.WizardUi.startWizard;
public class PreferencesFragment extends org.solovyev.android.material.preferences.PreferencesFragment implements SharedPreferences.OnSharedPreferenceChangeListener { public class PreferencesFragment extends org.solovyev.android.material.preferences.PreferencesFragment implements SharedPreferences.OnSharedPreferenceChangeListener {
private static boolean SUPPORT_HEADERS = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB; private static boolean SUPPORT_HEADERS = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB;
@ -70,7 +70,7 @@ public class PreferencesFragment extends org.solovyev.android.material.preferenc
final int preference = getPreferencesResId(); final int preference = getPreferencesResId();
if (preference == R.xml.preferences) { if (preference == R.xml.preferences) {
final SparseArray<PreferencesActivity.PrefDef> preferences = PreferencesActivity.getPreferences(); final SparseArray<PreferencesActivity.PrefDef> preferences = PreferencesActivity.getPreferenceDefs();
for (int i = 0; i < preferences.size(); i++) { for (int i = 0; i < preferences.size(); i++) {
final int xml = preferences.keyAt(i); final int xml = preferences.keyAt(i);
final PreferencesActivity.PrefDef def = preferences.valueAt(i); final PreferencesActivity.PrefDef def = preferences.valueAt(i);

View File

@ -30,8 +30,9 @@ import android.support.annotation.NonNull;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import android.support.v7.app.AlertDialog; import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
import org.solovyev.android.calculator.ActivityUi;
import org.solovyev.android.calculator.App; import org.solovyev.android.calculator.App;
import org.solovyev.android.calculator.BaseActivity;
import org.solovyev.android.calculator.BaseDialogFragment; import org.solovyev.android.calculator.BaseDialogFragment;
import org.solovyev.android.calculator.R; import org.solovyev.android.calculator.R;
import org.solovyev.android.checkout.*; import org.solovyev.android.checkout.*;
@ -68,12 +69,12 @@ public class PurchaseDialogActivity extends AppCompatActivity implements Request
@Override @Override
protected void onStart() { protected void onStart() {
super.onStart(); super.onStart();
ActivityUi.reportActivityStart(this); BaseActivity.reportActivityStart(this);
} }
@Override @Override
protected void onStop() { protected void onStop() {
ActivityUi.reportActivityStop(this); BaseActivity.reportActivityStop(this);
super.onStop(); super.onStop();
} }

View File

@ -57,7 +57,7 @@ public class VariablesActivity extends BaseActivity {
} }
} }
ui.withFab(R.drawable.ic_add_white_36dp, new View.OnClickListener() { withFab(R.drawable.ic_add_white_36dp, new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
EditVariableFragment.showDialog(VariablesActivity.this); EditVariableFragment.showDialog(VariablesActivity.this);

View File

@ -31,7 +31,7 @@ import android.view.MotionEvent;
import android.view.View; import android.view.View;
import android.widget.TextView; import android.widget.TextView;
import org.solovyev.android.calculator.ActivityUi; import org.solovyev.android.calculator.BaseActivity;
import org.solovyev.android.calculator.R; import org.solovyev.android.calculator.R;
import org.solovyev.android.calculator.keyboard.BaseKeyboardUi; import org.solovyev.android.calculator.keyboard.BaseKeyboardUi;
import org.solovyev.android.views.Adjuster; import org.solovyev.android.views.Adjuster;
@ -77,7 +77,7 @@ public class DragButtonWizardStep extends WizardFragment {
dragButton.setOnClickListener(this); dragButton.setOnClickListener(this);
dragButton.setOnDragListener( dragButton.setOnDragListener(
new SimpleDragListener(new DragButtonProcessor(), getActivity())); new SimpleDragListener(new DragButtonProcessor(), getActivity()));
ActivityUi.setFont(dragButton, typeface); BaseActivity.setFont(dragButton, typeface);
Adjuster.adjustText(dragButton, BaseKeyboardUi.getTextScale(getActivity())); Adjuster.adjustText(dragButton, BaseKeyboardUi.getTextScale(getActivity()));
actionTextView = (TextView) root.findViewById(R.id.wizard_dragbutton_action_textview); actionTextView = (TextView) root.findViewById(R.id.wizard_dragbutton_action_textview);
if (savedInstanceState != null) { if (savedInstanceState != null) {

View File

@ -11,11 +11,12 @@ import android.support.v7.app.AlertDialog;
import com.viewpagerindicator.PageIndicator; import com.viewpagerindicator.PageIndicator;
import org.solovyev.android.calculator.ActivityUi;
import org.solovyev.android.calculator.App; import org.solovyev.android.calculator.App;
import org.solovyev.android.calculator.AppComponent;
import org.solovyev.android.calculator.BaseActivity; import org.solovyev.android.calculator.BaseActivity;
import org.solovyev.android.calculator.Preferences; import org.solovyev.android.calculator.Preferences;
import org.solovyev.android.calculator.R; import org.solovyev.android.calculator.R;
import org.solovyev.android.calculator.language.Languages;
import org.solovyev.android.wizard.ListWizardFlow; import org.solovyev.android.wizard.ListWizardFlow;
import org.solovyev.android.wizard.Wizard; import org.solovyev.android.wizard.Wizard;
import org.solovyev.android.wizard.WizardFlow; import org.solovyev.android.wizard.WizardFlow;
@ -26,6 +27,7 @@ import org.solovyev.android.wizard.WizardsAware;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import javax.inject.Inject;
public class WizardActivity extends BaseActivity implements WizardsAware, SharedPreferences.OnSharedPreferenceChangeListener { public class WizardActivity extends BaseActivity implements WizardsAware, SharedPreferences.OnSharedPreferenceChangeListener {
@Nonnull @Nonnull
@ -40,6 +42,11 @@ public class WizardActivity extends BaseActivity implements WizardsAware, Shared
private Wizards wizards = App.getWizards(); private Wizards wizards = App.getWizards();
@Nullable @Nullable
private AlertDialog dialog; private AlertDialog dialog;
@Inject
SharedPreferences preferences;
@Inject
Languages languages;
public WizardActivity() { public WizardActivity() {
super(R.layout.cpp_activity_wizard); super(R.layout.cpp_activity_wizard);
@ -76,7 +83,13 @@ public class WizardActivity extends BaseActivity implements WizardsAware, Shared
wizard.saveLastStep(wizardUi.getStep()); wizard.saveLastStep(wizardUi.getStep());
} }
App.getPreferences().registerOnSharedPreferenceChangeListener(this); preferences.registerOnSharedPreferenceChangeListener(this);
}
@Override
protected void inject(@Nonnull AppComponent component) {
super.inject(component);
component.inject(this);
} }
@Override @Override
@ -181,7 +194,7 @@ public class WizardActivity extends BaseActivity implements WizardsAware, Shared
@Override @Override
protected void onDestroy() { protected void onDestroy() {
App.getPreferences().unregisterOnSharedPreferenceChangeListener(this); preferences.unregisterOnSharedPreferenceChangeListener(this);
dismissDialog(); dismissDialog();
super.onDestroy(); super.onDestroy();
} }
@ -196,9 +209,9 @@ public class WizardActivity extends BaseActivity implements WizardsAware, Shared
@Override @Override
public void onSharedPreferenceChanged(SharedPreferences preferences, String key) { public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
if (Preferences.Gui.theme.isSameKey(key)) { if (Preferences.Gui.theme.isSameKey(key)) {
ActivityUi.restartIfThemeChanged(this, ui.getTheme()); restartIfThemeChanged();
} else if (Preferences.Gui.language.isSameKey(key)) { } else if (Preferences.Gui.language.isSameKey(key)) {
ActivityUi.restartIfLanguageChanged(this, ui.getLanguage()); restartIfLanguageChanged();
} }
} }