diff --git a/app/build.gradle b/app/build.gradle index f6abaf19..b0e229b5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -67,6 +67,7 @@ dependencies { compile('ch.acra:acra:4.7.0') { exclude group: 'org.json' } + compile ':measure:' compile ':drag-button:1.1@aar' compile ':square-otto:1.3.9-SNAPSHOT' apt ':square-otto-compiler:1.3.9-SNAPSHOT' diff --git a/app/misc/libs/measure.jar b/app/misc/libs/measure.jar new file mode 100644 index 00000000..bc0dc6d9 Binary files /dev/null and b/app/misc/libs/measure.jar differ diff --git a/app/src/main/java/org/solovyev/android/calculator/Display.java b/app/src/main/java/org/solovyev/android/calculator/Display.java index 017170a4..9b414138 100644 --- a/app/src/main/java/org/solovyev/android/calculator/Display.java +++ b/app/src/main/java/org/solovyev/android/calculator/Display.java @@ -45,7 +45,6 @@ import org.solovyev.android.calculator.calculations.CalculationFailedEvent; import org.solovyev.android.calculator.calculations.CalculationFinishedEvent; import org.solovyev.android.calculator.errors.FixableErrorsActivity; import org.solovyev.android.calculator.jscl.JsclOperation; -import org.solovyev.android.calculator.view.NumeralBaseConverterDialog; import dagger.Lazy; import jscl.math.Generic; @@ -264,7 +263,8 @@ public class Display implements CalculatorEventListener, View.OnClickListener, V return true; case R.string.c_convert: if (result != null) { - new NumeralBaseConverterDialog(result.toString()).show(App.getApplication()); + // FIXME: 2016-02-10 + //new NumeralBaseConverterDialog(result.toString()).show(App.getApplication()); } return true; case R.string.c_plot: diff --git a/app/src/main/java/org/solovyev/android/calculator/EditorFragment.java b/app/src/main/java/org/solovyev/android/calculator/EditorFragment.java index 3f8225c1..89b94a57 100644 --- a/app/src/main/java/org/solovyev/android/calculator/EditorFragment.java +++ b/app/src/main/java/org/solovyev/android/calculator/EditorFragment.java @@ -24,10 +24,17 @@ package org.solovyev.android.calculator; import android.content.SharedPreferences; import android.os.Bundle; -import android.view.*; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; + +import org.solovyev.android.calculator.converter.ConverterFragment; + import butterknife.Bind; import butterknife.ButterKnife; -import org.solovyev.android.calculator.view.NumeralBaseConverterDialog; import javax.annotation.Nonnull; import javax.inject.Inject; @@ -99,7 +106,7 @@ public class EditorFragment extends BaseFragment { Locator.getInstance().getPlotter().plot(); return true; case R.id.menu_conversion_tool: - new NumeralBaseConverterDialog(null).show(getActivity()); + ConverterFragment.show(getActivity()); return true; case R.id.menu_about: launcher.showAbout(); diff --git a/app/src/main/java/org/solovyev/android/calculator/converter/ConverterFragment.java b/app/src/main/java/org/solovyev/android/calculator/converter/ConverterFragment.java new file mode 100644 index 00000000..70efdf1a --- /dev/null +++ b/app/src/main/java/org/solovyev/android/calculator/converter/ConverterFragment.java @@ -0,0 +1,252 @@ +package org.solovyev.android.calculator.converter; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.design.widget.TextInputLayout; +import android.support.v4.app.FragmentActivity; +import android.support.v7.app.AlertDialog; +import android.view.ContextMenu; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.EditText; +import android.widget.Spinner; + +import org.solovyev.android.Check; +import org.solovyev.android.calculator.App; +import org.solovyev.android.calculator.BaseDialogFragment; +import org.solovyev.android.calculator.R; + +import butterknife.Bind; +import butterknife.ButterKnife; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.annotation.Nonnull; +import javax.measure.unit.Dimension; +import javax.measure.unit.NonSI; +import javax.measure.unit.SI; +import javax.measure.unit.Unit; + +public class ConverterFragment extends BaseDialogFragment + implements AdapterView.OnItemSelectedListener, View.OnClickListener, + MenuItem.OnMenuItemClickListener { + + private static final Map>> units = new HashMap<>(); + + private enum MyDimension { + TIME(Dimension.TIME, "Time"), + AMOUNT_OF_SUBSTANCE(Dimension.AMOUNT_OF_SUBSTANCE, "Amount of substance"), + ELECTRIC_CURRENT(Dimension.ELECTRIC_CURRENT, "Electric current"), + LENGTH(Dimension.LENGTH, "Length"), + MASS(Dimension.MASS, "Mass"), + TEMPERATURE(Dimension.TEMPERATURE, "Temperature"); + + @NonNull + public final Dimension dimension; + @NonNull + public final String name; + + MyDimension(@NonNull Dimension dimension, @NonNull String name) { + this.dimension = dimension; + this.name = name; + } + + @Nullable + public static MyDimension getByDimension(@NonNull Unit unit) { + for (MyDimension myDimension : values()) { + if (myDimension.dimension.equals(unit.getDimension())) { + return myDimension; + } + } + return null; + } + + @Nullable + public static MyDimension getByGroup(int group) { + final int ordinal = group - Menu.FIRST; + final MyDimension[] values = values(); + if (ordinal >= 0 && ordinal < values.length) { + return values[ordinal]; + } + return null; + } + + public int group() { + return Menu.FIRST + ordinal(); + } + } + + @Bind(R.id.converter_spinner_from) + Button spinnerFrom; + @Bind(R.id.converter_label_from) + TextInputLayout labelFrom; + @Bind(R.id.converter_edittext_from) + EditText editTextFrom; + @Bind(R.id.converter_spinner_to) + Spinner spinnerTo; + @Bind(R.id.converter_label_to) + TextInputLayout labelTo; + @Bind(R.id.converter_edittext_to) + EditText editTextTo; + private ArrayAdapter> adapterTo; + + private static void addUnit(@NonNull Unit unit) { + final MyDimension dimension = MyDimension.getByDimension(unit); + if (dimension == null) { + return; + } + + List> unitsInDimension = units.get(dimension); + if (unitsInDimension == null) { + unitsInDimension = new ArrayList<>(); + units.put(dimension, unitsInDimension); + } + unitsInDimension.add(unit); + } + + public static void show(@Nonnull FragmentActivity activity) { + App.showDialog(new ConverterFragment(), "converter", + activity.getSupportFragmentManager()); + } + + @Override + protected void onPrepareDialog(@NonNull AlertDialog.Builder builder) { + + } + + @SuppressLint("InflateParams") + @Nullable + @Override + protected View onCreateDialogView(@NonNull Context context, @NonNull LayoutInflater inflater, + @Nullable Bundle savedInstanceState) { + final View view = inflater.inflate(R.layout.cpp_unit_converter, null); + ButterKnife.bind(this, view); + + adapterTo = makeAdapter(context); + spinnerTo.setAdapter(adapterTo); + + spinnerFrom.setOnClickListener(this); + + return view; + } + + @Nonnull + private static ArrayAdapter> makeAdapter(@NonNull Context context) { + final ArrayAdapter> adapter = + new ArrayAdapter<>(context, R.layout.support_simple_spinner_dropdown_item); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + return adapter; + } + + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + adapterTo.clear(); + /*final Unit unitFrom = adapterFrom.getItem(position); + final List> units = ConverterFragment.units.get(unitFrom.getDimension()); + for (Unit unitTo : units) { + if (!unitTo.equals(unitFrom)) { + adapterTo.add(unitTo); + } + }*/ + } + + @Override + public void onNothingSelected(AdapterView parent) { + + } + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.converter_spinner_from: + showDimensions(); + break; + } + } + + private void showDimensions() { + spinnerFrom.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() { + @Override + public void onCreateContextMenu(ContextMenu menu, View v, + ContextMenu.ContextMenuInfo menuInfo) { + Check.isTrue(v.getId() == R.id.converter_spinner_from); + menu.clear(); + // can't use sub-menus as AlertDialog doesn't support them + for (MyDimension dimension : units.keySet()) { + menu.add(Menu.NONE, dimension.group(), Menu.NONE, dimension.name) + .setOnMenuItemClickListener(ConverterFragment.this); + } + unregisterForContextMenu(spinnerFrom); + } + }); + spinnerFrom.showContextMenu(); + } + + @Override + public boolean onMenuItemClick(MenuItem item) { + if (item.getGroupId() == Menu.NONE) { + final MyDimension dimension = MyDimension.getByGroup(item.getItemId()); + if (dimension == null) { + return false; + } + spinnerFrom.post(new Runnable() { + @Override + public void run() { + showUnits(dimension); + } + }); + return true; + } + final MyDimension dimension = MyDimension.getByGroup(item.getGroupId()); + final List> unitsInDimension = units.get(dimension); + final Unit unit = unitsInDimension.get(item.getItemId()); + spinnerFrom.setText(unit.toString()); + adapterTo.clear(); + for (Unit unitInDimension : unitsInDimension) { + if (!unitInDimension.equals(unit)) { + adapterTo.add(unitInDimension); + } + } + return true; + } + + private void showUnits(@NonNull final MyDimension dimension) { + spinnerFrom.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() { + @Override + public void onCreateContextMenu(ContextMenu menu, View v, + ContextMenu.ContextMenuInfo menuInfo) { + Check.isTrue(v.getId() == R.id.converter_spinner_from); + menu.clear(); + final int group = dimension.group(); + final List> get = units.get(dimension); + for (int i = 0; i < get.size(); i++) { + final Unit unit = get.get(i); + menu.add(group, i, Menu.NONE, unit.toString()) + .setOnMenuItemClickListener(ConverterFragment.this); + } + unregisterForContextMenu(spinnerFrom); + } + }); + spinnerFrom.showContextMenu(); + } + + static { + for (Unit unit : SI.getInstance().getUnits()) { + addUnit(unit); + } + for (Unit unit : NonSI.getInstance().getUnits()) { + addUnit(unit); + } + } +} diff --git a/app/src/main/java/org/solovyev/android/calculator/view/NumeralBaseConverterDialog.java b/app/src/main/java/org/solovyev/android/calculator/view/NumeralBaseConverterDialog.java deleted file mode 100644 index c8baead1..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/view/NumeralBaseConverterDialog.java +++ /dev/null @@ -1,118 +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.view; - -import android.content.Context; -import android.support.v7.app.AlertDialog; -import android.view.View; -import android.view.WindowManager; - -import org.solovyev.android.calculator.App; -import org.solovyev.android.calculator.Locator; -import org.solovyev.android.calculator.ParseException; -import org.solovyev.android.calculator.R; -import org.solovyev.android.calculator.ToJsclTextProcessor; -import org.solovyev.android.calculator.units.CalculatorNumeralBase; -import org.solovyev.common.MutableObject; -import org.solovyev.common.text.Strings; -import org.solovyev.common.units.Unit; -import org.solovyev.common.units.UnitImpl; - -import java.util.Arrays; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -public class NumeralBaseConverterDialog { - - @Nullable - private String initialFromValue; - - public NumeralBaseConverterDialog(@Nullable String initialFromValue) { - this.initialFromValue = initialFromValue; - } - - public void show(@Nonnull Context context) { - final UnitConverterViewBuilder b = new UnitConverterViewBuilder(); - b.setFromUnitTypes(Arrays.asList(CalculatorNumeralBase.values())); - b.setToUnitTypes(Arrays.asList(CalculatorNumeralBase.values())); - - if (!Strings.isEmpty(initialFromValue)) { - String value = initialFromValue; - try { - value = ToJsclTextProcessor.getInstance().process(value).getValue(); - b.setFromValue(UnitImpl.newInstance(value, CalculatorNumeralBase.valueOf(Locator.getInstance().getEngine().getMathEngine().getNumeralBase()))); - } catch (ParseException e) { - b.setFromValue(UnitImpl.newInstance(value, CalculatorNumeralBase.valueOf(Locator.getInstance().getEngine().getMathEngine().getNumeralBase()))); - } - } else { - b.setFromValue(UnitImpl.newInstance("", CalculatorNumeralBase.valueOf(Locator.getInstance().getEngine().getMathEngine().getNumeralBase()))); - } - - b.setConverter(CalculatorNumeralBase.getConverter()); - - final MutableObject alertDialogHolder = new MutableObject(); - b.setOkButtonOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - final AlertDialog alertDialog = alertDialogHolder.getObject(); - if (alertDialog != null) { - alertDialog.dismiss(); - } - } - }); - - b.setCustomButtonData(new UnitConverterViewBuilder.CustomButtonData(context.getString(R.string.c_use_short), new UnitConverterViewBuilder.CustomButtonOnClickListener() { - @Override - public void onClick(@Nonnull Unit fromUnits, @Nonnull Unit toUnits) { - String toUnitsValue = toUnits.getValue(); - - if (!toUnits.getUnitType().equals(CalculatorNumeralBase.valueOf(Locator.getInstance().getEngine().getMathEngine().getNumeralBase()))) { - toUnitsValue = ((CalculatorNumeralBase) toUnits.getUnitType()).getNumeralBase().getJsclPrefix() + toUnitsValue; - } - - Locator.getInstance().getKeyboard().buttonPressed(toUnitsValue); - final AlertDialog alertDialog = alertDialogHolder.getObject(); - if (alertDialog != null) { - alertDialog.dismiss(); - } - } - })); - - final AlertDialog.Builder alertBuilder = new AlertDialog.Builder(context, App.getTheme().alertDialogTheme); - alertBuilder.setView(b.build(context)); - alertBuilder.setTitle(R.string.c_conversion_tool); - - final AlertDialog alertDialog = alertBuilder.create(); - - final WindowManager.LayoutParams lp = new WindowManager.LayoutParams(); - lp.copyFrom(alertDialog.getWindow().getAttributes()); - - lp.width = WindowManager.LayoutParams.FILL_PARENT; - lp.height = WindowManager.LayoutParams.WRAP_CONTENT; - - alertDialogHolder.setObject(alertDialog); - alertDialog.show(); - alertDialog.getWindow().setAttributes(lp); - } -} diff --git a/app/src/main/java/org/solovyev/android/calculator/view/UnitConverterViewBuilder.java b/app/src/main/java/org/solovyev/android/calculator/view/UnitConverterViewBuilder.java deleted file mode 100644 index aad83dbd..00000000 --- a/app/src/main/java/org/solovyev/android/calculator/view/UnitConverterViewBuilder.java +++ /dev/null @@ -1,253 +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.view; - -import android.app.Activity; -import android.content.Context; -import android.text.ClipboardManager; -import android.text.Editable; -import android.text.TextWatcher; -import android.view.View; -import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.ArrayAdapter; -import android.widget.Button; -import android.widget.EditText; -import android.widget.Spinner; -import android.widget.Toast; - -import org.solovyev.android.calculator.R; -import org.solovyev.android.view.ViewBuilder; -import org.solovyev.android.view.ViewFromLayoutBuilder; -import org.solovyev.common.units.ConversionException; -import org.solovyev.common.units.Conversions; -import org.solovyev.common.units.Unit; -import org.solovyev.common.units.UnitConverter; -import org.solovyev.common.units.UnitImpl; -import org.solovyev.common.units.UnitType; - -import java.util.Collections; -import java.util.List; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -/** - * User: serso - * Date: 4/20/12 - * Time: 4:50 PM - */ -public class UnitConverterViewBuilder implements ViewBuilder { - - @Nonnull - private List> fromUnitTypes = Collections.emptyList(); - - @Nonnull - private List> toUnitTypes = Collections.emptyList(); - - @Nullable - private Unit fromValue; - - @Nonnull - private UnitConverter converter = UnitConverter.Dummy.getInstance(); - - @Nullable - private View.OnClickListener okButtonOnClickListener; - - @Nullable - private CustomButtonData customButtonData; - - private static void doConversion(@Nonnull View main, @Nonnull Context context, @Nonnull UnitConverter converter) { - final EditText fromEditText = (EditText) main.findViewById(R.id.units_from); - - final EditText toEditText = (EditText) main.findViewById(R.id.units_to); - - final String from = fromEditText.getText().toString(); - try { - toEditText.setText(Conversions.doConversion(converter, from, getFromUnitType(main), getToUnitType(main))); - } catch (ConversionException e) { - toEditText.setText(context.getString(R.string.c_error)); - } - } - - @Nonnull - private static Unit getToUnit(@Nonnull View main) { - final EditText toUnits = (EditText) main.findViewById(R.id.units_to); - return UnitImpl.newInstance(toUnits.getText().toString(), getToUnitType(main)); - } - - @Nonnull - private static UnitType getToUnitType(@Nonnull View main) { - final Spinner toSpinner = (Spinner) main.findViewById(R.id.unit_types_to); - return (UnitType) toSpinner.getSelectedItem(); - } - - @Nonnull - private static Unit getFromUnit(@Nonnull View main) { - final EditText fromUnits = (EditText) main.findViewById(R.id.units_from); - return UnitImpl.newInstance(fromUnits.getText().toString(), getFromUnitType(main)); - } - - @Nonnull - private static UnitType getFromUnitType(@Nonnull View main) { - final Spinner fromSpinner = (Spinner) main.findViewById(R.id.unit_types_from); - return (UnitType) fromSpinner.getSelectedItem(); - } - - public void setFromUnitTypes(@Nonnull List> fromUnitTypes) { - this.fromUnitTypes = fromUnitTypes; - } - - public void setToUnitTypes(@Nonnull List> toUnitTypes) { - this.toUnitTypes = toUnitTypes; - } - - public void setFromValue(@Nullable Unit fromValue) { - this.fromValue = fromValue; - } - - public void setConverter(@Nonnull UnitConverter converter) { - this.converter = converter; - } - - public void setOkButtonOnClickListener(@Nullable View.OnClickListener okButtonOnClickListener) { - this.okButtonOnClickListener = okButtonOnClickListener; - } - - public void setCustomButtonData(@Nullable CustomButtonData customButtonData) { - this.customButtonData = customButtonData; - } - - @Nonnull - @Override - public View build(@Nonnull final Context context) { - final View main = ViewFromLayoutBuilder.newInstance(R.layout.cpp_unit_converter).build(context); - - final Spinner fromSpinner = (Spinner) main.findViewById(R.id.unit_types_from); - final EditText fromEditText = (EditText) main.findViewById(R.id.units_from); - fromEditText.addTextChangedListener(new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - } - - @Override - public void afterTextChanged(Editable s) { - doConversion(main, context, UnitConverterViewBuilder.this.converter); - } - }); - - fillSpinner(main, context, R.id.unit_types_from, fromUnitTypes); - fillSpinner(main, context, R.id.unit_types_to, toUnitTypes); - - if (fromValue != null) { - fromEditText.setText(fromValue.getValue()); - - int i = fromUnitTypes.indexOf(fromValue.getUnitType()); - if (i >= 0) { - fromSpinner.setSelection(i); - } - } - - final Button copyButton = (Button) main.findViewById(R.id.unit_converter_copy_button); - copyButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - final EditText toEditText = (EditText) main.findViewById(R.id.units_to); - - final ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Activity.CLIPBOARD_SERVICE); - clipboard.setText(toEditText.getText().toString()); - Toast.makeText(context, context.getText(R.string.c_result_copied), Toast.LENGTH_SHORT).show(); - } - }); - - final Button okButton = (Button) main.findViewById(R.id.unit_converter_ok_button); - if (okButtonOnClickListener == null) { - ((ViewGroup) okButton.getParent()).removeView(okButton); - } else { - okButton.setOnClickListener(this.okButtonOnClickListener); - } - - final Button customButton = (Button) main.findViewById(R.id.unit_converter_custom_button); - if (customButtonData == null) { - ((ViewGroup) customButton.getParent()).removeView(customButton); - } else { - customButton.setText(customButtonData.text); - customButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - customButtonData.clickListener.onClick(getFromUnit(main), getToUnit(main)); - } - }); - } - - - return main; - } - - private void fillSpinner(@Nonnull final View main, - @Nonnull final Context context, - final int spinnerId, - @Nonnull List> unitTypes) { - final Spinner spinner = (Spinner) main.findViewById(spinnerId); - - final ArrayAdapter> adapter = new ArrayAdapter>(context, R.layout.support_simple_spinner_dropdown_item); - adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - for (UnitType fromUnitType : unitTypes) { - adapter.add(fromUnitType); - } - spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - doConversion(main, context, UnitConverterViewBuilder.this.converter); - } - - @Override - public void onNothingSelected(AdapterView parent) { - } - }); - spinner.setAdapter(adapter); - } - - public interface CustomButtonOnClickListener { - void onClick(@Nonnull Unit fromUnits, @Nonnull Unit toUnits); - } - - public static class CustomButtonData { - - @Nonnull - private String text; - - @Nonnull - private CustomButtonOnClickListener clickListener; - - - public CustomButtonData(@Nonnull String text, @Nonnull CustomButtonOnClickListener clickListener) { - this.text = text; - this.clickListener = clickListener; - } - } -} diff --git a/app/src/main/res/layout/cpp_unit_converter.xml b/app/src/main/res/layout/cpp_unit_converter.xml index 4bc2bdc9..cfbf09e5 100644 --- a/app/src/main/res/layout/cpp_unit_converter.xml +++ b/app/src/main/res/layout/cpp_unit_converter.xml @@ -22,88 +22,63 @@ ~ Site: http://se.solovyev.org --> - + + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="horizontal" + android:paddingBottom="10dp"> - +