mirror of
https://github.com/FatttSnake/OxygenToolbox.git
synced 2026-04-06 07:11:26 +08:00
Add tool Base Converter.
This commit is contained in:
6
.idea/dbnavigator.xml
generated
6
.idea/dbnavigator.xml
generated
@@ -2,7 +2,7 @@
|
|||||||
<project version="4">
|
<project version="4">
|
||||||
<component name="DBNavigator.Project.DataEditorManager">
|
<component name="DBNavigator.Project.DataEditorManager">
|
||||||
<record-view-column-sorting-type value="BY_INDEX" />
|
<record-view-column-sorting-type value="BY_INDEX" />
|
||||||
<value-preview-text-wrapping value="true" />
|
<value-preview-text-wrapping value="false" />
|
||||||
<value-preview-pinned value="false" />
|
<value-preview-pinned value="false" />
|
||||||
</component>
|
</component>
|
||||||
<component name="DBNavigator.Project.DataExportManager">
|
<component name="DBNavigator.Project.DataExportManager">
|
||||||
@@ -27,6 +27,9 @@
|
|||||||
<show-object-properties value="true" />
|
<show-object-properties value="true" />
|
||||||
<loaded-nodes />
|
<loaded-nodes />
|
||||||
</component>
|
</component>
|
||||||
|
<component name="DBNavigator.Project.DatabaseEditorStateManager">
|
||||||
|
<last-used-providers />
|
||||||
|
</component>
|
||||||
<component name="DBNavigator.Project.DatabaseFileManager">
|
<component name="DBNavigator.Project.DatabaseFileManager">
|
||||||
<open-files />
|
<open-files />
|
||||||
</component>
|
</component>
|
||||||
@@ -99,6 +102,7 @@
|
|||||||
<object-type name="FUNCTION" sorting-type="NAME" />
|
<object-type name="FUNCTION" sorting-type="NAME" />
|
||||||
<object-type name="PROCEDURE" sorting-type="NAME" />
|
<object-type name="PROCEDURE" sorting-type="NAME" />
|
||||||
<object-type name="ARGUMENT" sorting-type="POSITION" />
|
<object-type name="ARGUMENT" sorting-type="POSITION" />
|
||||||
|
<object-type name="TYPE ATTRIBUTE" sorting-type="POSITION" />
|
||||||
</sorting>
|
</sorting>
|
||||||
<default-editors>
|
<default-editors>
|
||||||
<object-type name="VIEW" editor-type="SELECTION" />
|
<object-type name="VIEW" editor-type="SELECTION" />
|
||||||
|
|||||||
17
.idea/deploymentTargetDropDown.xml
generated
17
.idea/deploymentTargetDropDown.xml
generated
@@ -1,17 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="deploymentTargetDropDown">
|
|
||||||
<targetSelectedWithDropDown>
|
|
||||||
<Target>
|
|
||||||
<type value="QUICK_BOOT_TARGET" />
|
|
||||||
<deviceKey>
|
|
||||||
<Key>
|
|
||||||
<type value="VIRTUAL_DEVICE_PATH" />
|
|
||||||
<value value="G:\Android\Avd\Pixel_4_API_31.avd" />
|
|
||||||
</Key>
|
|
||||||
</deviceKey>
|
|
||||||
</Target>
|
|
||||||
</targetSelectedWithDropDown>
|
|
||||||
<timeTargetWasSelectedWithDropDown value="2022-09-14T07:53:33.671044700Z" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
1
.idea/gradle.xml
generated
1
.idea/gradle.xml
generated
@@ -7,6 +7,7 @@
|
|||||||
<option name="testRunner" value="GRADLE" />
|
<option name="testRunner" value="GRADLE" />
|
||||||
<option name="distributionType" value="DEFAULT_WRAPPED" />
|
<option name="distributionType" value="DEFAULT_WRAPPED" />
|
||||||
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||||
|
<option name="gradleJvm" value="Embedded JDK" />
|
||||||
<option name="modules">
|
<option name="modules">
|
||||||
<set>
|
<set>
|
||||||
<option value="$PROJECT_DIR$" />
|
<option value="$PROJECT_DIR$" />
|
||||||
|
|||||||
2
.idea/misc.xml
generated
2
.idea/misc.xml
generated
@@ -119,7 +119,7 @@
|
|||||||
</map>
|
</map>
|
||||||
</option>
|
</option>
|
||||||
</component>
|
</component>
|
||||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" project-jdk-name="1.8" project-jdk-type="JavaSDK">
|
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="11" project-jdk-type="JavaSDK">
|
||||||
<output url="file://$PROJECT_DIR$/build/classes" />
|
<output url="file://$PROJECT_DIR$/build/classes" />
|
||||||
</component>
|
</component>
|
||||||
<component name="ProjectType">
|
<component name="ProjectType">
|
||||||
|
|||||||
@@ -67,6 +67,16 @@
|
|||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="oxygentoolbox.ip" />
|
<action android:name="oxygentoolbox.ip" />
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
<activity
|
||||||
|
android:name=".tools.converter.MainActivity"
|
||||||
|
android:exported="false"
|
||||||
|
android:theme="@style/Theme.OxygenToolbox.Default">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="oxygentoolbox.converter" />
|
||||||
|
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|||||||
@@ -36,6 +36,13 @@
|
|||||||
"en": "IP Query"
|
"en": "IP Query"
|
||||||
},
|
},
|
||||||
"activity": "com.fatapp.oxygentoolbox.tools.ip.MainActivity"
|
"activity": "com.fatapp.oxygentoolbox.tools.ip.MainActivity"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": {
|
||||||
|
"cn": "\u8fdb\u5236\u8f6c\u6362",
|
||||||
|
"en": "Base Converter"
|
||||||
|
},
|
||||||
|
"activity": "com.fatapp.oxygentoolbox.tools.converter.MainActivity"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,161 @@
|
|||||||
|
package com.fatapp.oxygentoolbox.tools.converter;
|
||||||
|
|
||||||
|
import android.graphics.drawable.AnimatedVectorDrawable;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.text.Editable;
|
||||||
|
import android.text.TextWatcher;
|
||||||
|
import android.view.inputmethod.InputMethodManager;
|
||||||
|
import android.widget.EditText;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
import com.fatapp.oxygentoolbox.R;
|
||||||
|
import com.fatapp.oxygentoolbox.util.HexConversionUtils;
|
||||||
|
import com.fatapp.oxygentoolbox.util.ResourceUtil;
|
||||||
|
import com.fatapp.oxygentoolbox.util.tool.BaseActivityNormal;
|
||||||
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
|
import com.google.android.material.snackbar.Snackbar;
|
||||||
|
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
public class MainActivity extends BaseActivityNormal {
|
||||||
|
|
||||||
|
private final String[] BASE_ITEMS = new String[35];
|
||||||
|
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 35; i++) {
|
||||||
|
switch (i + 2) {
|
||||||
|
case 2:
|
||||||
|
BASE_ITEMS[i] = ResourceUtil.getString(R.string.tool_converter_base_2);
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
BASE_ITEMS[i] = ResourceUtil.getString(R.string.tool_converter_base_8);
|
||||||
|
break;
|
||||||
|
case 10:
|
||||||
|
BASE_ITEMS[i] = ResourceUtil.getString(R.string.tool_converter_base_10);
|
||||||
|
break;
|
||||||
|
case 16:
|
||||||
|
BASE_ITEMS[i] = ResourceUtil.getString(R.string.tool_converter_base_16);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
BASE_ITEMS[i] = String.valueOf(i + 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int baseFrom = 10;
|
||||||
|
private int baseTo = 2;
|
||||||
|
|
||||||
|
private TextView textViewBaseFrom;
|
||||||
|
private ImageView imageViewSwap;
|
||||||
|
private TextView textViewBaseTo;
|
||||||
|
private EditText editTextFrom;
|
||||||
|
private TextView textViewTo;
|
||||||
|
private ImageView imageViewConvert;
|
||||||
|
|
||||||
|
private void initView() {
|
||||||
|
textViewBaseFrom = findViewById(R.id.text_view_base_from);
|
||||||
|
imageViewSwap = findViewById(R.id.image_view_swap);
|
||||||
|
textViewBaseTo = findViewById(R.id.text_view_base_to);
|
||||||
|
editTextFrom = findViewById(R.id.edit_text_from);
|
||||||
|
textViewTo = findViewById(R.id.text_view_to);
|
||||||
|
imageViewConvert = findViewById(R.id.image_view_convert);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
super.loadView(this, R.layout.activity_tool_converter);
|
||||||
|
|
||||||
|
initView();
|
||||||
|
initBaseChoose();
|
||||||
|
initConverter();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initBaseChoose() {
|
||||||
|
textViewBaseFrom.setOnClickListener(view -> new MaterialAlertDialogBuilder(this)
|
||||||
|
.setTitle(ResourceUtil.getString(R.string.tool_converter_choose_base))
|
||||||
|
.setItems(BASE_ITEMS, (dialogInterface, i) -> {
|
||||||
|
textViewBaseFrom.setText(BASE_ITEMS[i]);
|
||||||
|
baseFrom = i + 2;
|
||||||
|
editTextFrom.setText(null);
|
||||||
|
textViewTo.setText(null);
|
||||||
|
})
|
||||||
|
.show());
|
||||||
|
|
||||||
|
textViewBaseTo.setOnClickListener(view -> new MaterialAlertDialogBuilder(this)
|
||||||
|
.setTitle(ResourceUtil.getString(R.string.tool_converter_choose_base))
|
||||||
|
.setItems(BASE_ITEMS, (dialogInterface, i) -> {
|
||||||
|
textViewBaseTo.setText(BASE_ITEMS[i]);
|
||||||
|
baseTo = i + 2;
|
||||||
|
if (textViewTo.getText().length() > 0) {
|
||||||
|
convert();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.show());
|
||||||
|
|
||||||
|
imageViewSwap.setOnClickListener(view -> {
|
||||||
|
AnimatedVectorDrawable animatedVectorDrawable = (AnimatedVectorDrawable) imageViewSwap.getDrawable();
|
||||||
|
animatedVectorDrawable.start();
|
||||||
|
{
|
||||||
|
int temp = baseFrom;
|
||||||
|
baseFrom = baseTo;
|
||||||
|
baseTo = temp;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
String temp = textViewBaseFrom.getText().toString();
|
||||||
|
textViewBaseFrom.setText(textViewBaseTo.getText());
|
||||||
|
textViewBaseTo.setText(temp);
|
||||||
|
}
|
||||||
|
editTextFrom.setText(null);
|
||||||
|
textViewTo.setText(null);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initConverter() {
|
||||||
|
StringBuffer beforeText = new StringBuffer();
|
||||||
|
editTextFrom.addTextChangedListener(new TextWatcher() {
|
||||||
|
@Override
|
||||||
|
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
|
||||||
|
beforeText.delete(0, beforeText.length());
|
||||||
|
beforeText.append(charSequence);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
|
||||||
|
imageViewConvert.setEnabled(charSequence.length() != 0);
|
||||||
|
if (!Pattern.compile(HexConversionUtils.getRegExp(baseFrom)).matcher(charSequence).matches()) {
|
||||||
|
editTextFrom.setText(beforeText.toString());
|
||||||
|
editTextFrom.setSelection(beforeText.toString().length() - 1);
|
||||||
|
} else {
|
||||||
|
textViewTo.setText(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void afterTextChanged(Editable editable) {
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
textViewTo.setOnFocusChangeListener((view, b) -> ((InputMethodManager) getSystemService(INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(editTextFrom.getWindowToken(), 0));
|
||||||
|
|
||||||
|
imageViewConvert.setEnabled(false);
|
||||||
|
imageViewConvert.setOnClickListener(view -> convert());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void convert() {
|
||||||
|
((InputMethodManager) getSystemService(INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(editTextFrom.getWindowToken(), 0);
|
||||||
|
if (baseFrom == baseTo) {
|
||||||
|
textViewTo.setText(editTextFrom.getText());
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
String result = HexConversionUtils.decimalToBase(HexConversionUtils.baseToDecimal(editTextFrom.getText().toString(), baseFrom), baseTo);
|
||||||
|
textViewTo.setText(result);
|
||||||
|
} catch (Exception e) {
|
||||||
|
textViewTo.setText(ResourceUtil.getString(R.string.base_nan));
|
||||||
|
Snackbar.make(getConstraintLayoutRoot(), ResourceUtil.getString(R.string.tool_converter_illegal_number), Snackbar.LENGTH_LONG).show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,151 @@
|
|||||||
|
package com.fatapp.oxygentoolbox.util;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
public class HexConversionUtils {
|
||||||
|
private static int handleLetter(String letter) {
|
||||||
|
return Integer.parseInt(letter, 36);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String handleNumber(int number) {
|
||||||
|
return Integer.toString(number, 36);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getRegExp(int base) {
|
||||||
|
String regExp;
|
||||||
|
if (base <= 10) {
|
||||||
|
regExp = "^[+\\-]?[0-" + (base - 1) + "]*(?:[0-" + (base - 1) + "][.][0-" + (base - 1) + "]*)?";
|
||||||
|
} else {
|
||||||
|
String letter = Integer.toString(base - 1, 36);
|
||||||
|
regExp = "^[+\\-]?[0-9a-" + letter + "]*(?:[0-9a-" + letter + "][.][0-9a-" + letter + "]*)?";
|
||||||
|
}
|
||||||
|
return regExp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getStrictRegExp(int base) {
|
||||||
|
String regExp;
|
||||||
|
if (base <= 10) {
|
||||||
|
regExp = "^[+\\-]?[0-" + (base - 1) + "]+(?:[.][0-" + (base - 1) + "]+)?$";
|
||||||
|
} else {
|
||||||
|
String letter = Integer.toString(base - 1, 36);
|
||||||
|
regExp = "^[+\\-]?[0-9a-" + letter + "]+(?:[.][0-9a-" + letter + "]+)?$";
|
||||||
|
}
|
||||||
|
return regExp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean checkNumber(String number, int base) {
|
||||||
|
return Pattern.matches(getStrictRegExp(base), number);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String baseToDecimal_(String number, int base) {
|
||||||
|
if (base == 10) {
|
||||||
|
return number;
|
||||||
|
}
|
||||||
|
BigDecimal result = new BigDecimal(0);
|
||||||
|
String[] data = new StringBuilder(number).reverse().toString().split("");
|
||||||
|
for (int i = 0; i < data.length; i++) {
|
||||||
|
result = result.add(BigDecimal.valueOf(handleLetter(data[i]) * Math.pow(base, i)));
|
||||||
|
}
|
||||||
|
return result.toString().split("\\.")[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String decimalToBase_(String decimal, int base) {
|
||||||
|
if (base == 10) {
|
||||||
|
return decimal;
|
||||||
|
}
|
||||||
|
StringBuilder result = new StringBuilder();
|
||||||
|
BigDecimal quotient = new BigDecimal(decimal);
|
||||||
|
while (quotient.compareTo(new BigDecimal(base)) > -1) {
|
||||||
|
BigDecimal[] divideAndRemainder = quotient.divideAndRemainder(new BigDecimal(base));
|
||||||
|
quotient = divideAndRemainder[0];
|
||||||
|
BigDecimal remainder = divideAndRemainder[1];
|
||||||
|
result.insert(0, handleNumber(remainder.intValue()));
|
||||||
|
}
|
||||||
|
result.insert(0, handleNumber(quotient.intValue()));
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String _baseToDecimal(String number, int base) {
|
||||||
|
if (base == 10) {
|
||||||
|
return number;
|
||||||
|
}
|
||||||
|
BigDecimal result = new BigDecimal(0);
|
||||||
|
String[] data = number.split("");
|
||||||
|
for (int i = 0; i < data.length; i++) {
|
||||||
|
result = result.add(BigDecimal.valueOf(handleLetter(data[i]) * Math.pow(base, -1 * (i + 1))));
|
||||||
|
}
|
||||||
|
return result.toString().split("\\.")[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String _decimalToBase(String decimal, int base) {
|
||||||
|
if (base == 10) {
|
||||||
|
return decimal;
|
||||||
|
}
|
||||||
|
BigDecimal bigDecimal = new BigDecimal("0." + decimal);
|
||||||
|
StringBuilder result = new StringBuilder();
|
||||||
|
|
||||||
|
while (bigDecimal.compareTo(new BigDecimal(0)) > 0 && result.length() < 50) {
|
||||||
|
bigDecimal = bigDecimal.multiply(new BigDecimal(base));
|
||||||
|
if (bigDecimal.toString().contains("E")) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (bigDecimal.toString().contains(".99999")) {
|
||||||
|
result.append(handleNumber(Integer.parseInt(bigDecimal.toString().split("\\.")[0]) + 1));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
result.append(handleNumber(Integer.parseInt(bigDecimal.toString().split("\\.")[0])));
|
||||||
|
bigDecimal = new BigDecimal("0." + bigDecimal.toString().split("\\.")[1]);
|
||||||
|
}
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String baseToDecimal(String number, int base) throws Exception{
|
||||||
|
if (!checkNumber(number, base)) {
|
||||||
|
throw new Exception("Illegal number");
|
||||||
|
}
|
||||||
|
StringBuilder result = new StringBuilder();
|
||||||
|
|
||||||
|
String sign = "";
|
||||||
|
if (number.charAt(0) == '-' || number.charAt(0) == '+') {
|
||||||
|
sign = number.substring(0, 1);
|
||||||
|
number = number.substring(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!number.contains(".")) {
|
||||||
|
result.append(baseToDecimal_(number, base));
|
||||||
|
} else {
|
||||||
|
String[] data = number.split("\\.");
|
||||||
|
result.append(baseToDecimal_(data[0], base));
|
||||||
|
result.append(".");
|
||||||
|
result.append(_baseToDecimal(data[1], base));
|
||||||
|
}
|
||||||
|
|
||||||
|
result.insert(0, sign);
|
||||||
|
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String decimalToBase(String number, int base) {
|
||||||
|
StringBuilder result = new StringBuilder();
|
||||||
|
|
||||||
|
String sign = "";
|
||||||
|
if (number.charAt(0) == '-' || number.charAt(0) == '+') {
|
||||||
|
sign = number.substring(0, 1);
|
||||||
|
number = number.substring(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!number.contains(".")) {
|
||||||
|
result.append(decimalToBase_(number, base));
|
||||||
|
} else {
|
||||||
|
String[] data = number.split("\\.");
|
||||||
|
result.append(decimalToBase_(data[0], base));
|
||||||
|
result.append(".");
|
||||||
|
result.append(_decimalToBase(data[1], base));
|
||||||
|
}
|
||||||
|
|
||||||
|
result.insert(0, sign);
|
||||||
|
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
14
app/src/main/res/drawable/ic_tool_converter_convert.xml
Normal file
14
app/src/main/res/drawable/ic_tool_converter_convert.xml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="56dp"
|
||||||
|
android:height="56dp"
|
||||||
|
android:autoMirrored="true"
|
||||||
|
android:viewportWidth="24.0"
|
||||||
|
android:viewportHeight="24.0">
|
||||||
|
<path
|
||||||
|
android:fillColor="?attr/app_theme"
|
||||||
|
android:pathData="M 0 12 C 0 5.374 5.374 0 12 0 C 18.627 0 24 5.374 24 12 C 24 18.627 18.627 24 12 24 C 5.374 24 0 18.627 0 12 Z" />
|
||||||
|
|
||||||
|
<path
|
||||||
|
android:fillColor="?attr/app_on_theme"
|
||||||
|
android:pathData="M18.67,12l-1.17,-1.17L12.83,15.48V5.33h-1.67v10.14l-4.65,-4.66L5.33,12l6.67,6.67 6.67,-6.67z" />
|
||||||
|
</vector>
|
||||||
108
app/src/main/res/layout/activity_tool_converter.xml
Normal file
108
app/src/main/res/layout/activity_tool_converter.xml
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
tools:context=".tools.converter.MainActivity">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/linear_layout_base"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_margin="@dimen/tool_converter_layout_margin"
|
||||||
|
android:background="@drawable/background_radius"
|
||||||
|
android:gravity="center"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
app:layout_constraintTop_toTopOf="parent">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/text_view_base_from"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="@string/tool_converter_base_10"
|
||||||
|
android:textColor="?attr/app_theme"
|
||||||
|
android:textSize="@dimen/tool_converter_text_size" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/image_view_swap"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:contentDescription="Swap"
|
||||||
|
android:padding="@dimen/tool_converter_clickable_padding"
|
||||||
|
android:src="@drawable/animation_swap_horizon" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/text_view_base_to"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="@string/tool_converter_base_2"
|
||||||
|
android:textColor="?attr/app_theme"
|
||||||
|
android:textSize="@dimen/tool_converter_text_size" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<EditText
|
||||||
|
android:id="@+id/edit_text_from"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="@dimen/tool_converter_edit_text_view_height"
|
||||||
|
android:layout_margin="@dimen/tool_converter_layout_margin"
|
||||||
|
android:autofillHints="text"
|
||||||
|
android:background="@drawable/background_radius"
|
||||||
|
android:gravity="start|top"
|
||||||
|
android:hint="@string/tool_converter_please_enter_text"
|
||||||
|
android:inputType="text"
|
||||||
|
android:maxLength="850"
|
||||||
|
android:paddingHorizontal="@dimen/tool_converter_edit_text_view_padding"
|
||||||
|
android:paddingTop="@dimen/tool_converter_edit_text_view_padding"
|
||||||
|
android:paddingBottom="@dimen/tool_converter_edit_text_view_padding_plus"
|
||||||
|
android:textColor="?attr/app_text_theme"
|
||||||
|
android:textSize="@dimen/tool_converter_text_size"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/linear_layout_base" />
|
||||||
|
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/text_view_to"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="@dimen/tool_converter_edit_text_view_height"
|
||||||
|
android:layout_margin="@dimen/tool_converter_layout_margin"
|
||||||
|
android:autofillHints="text"
|
||||||
|
android:background="@drawable/background_radius"
|
||||||
|
android:gravity="start|top"
|
||||||
|
android:paddingHorizontal="@dimen/tool_converter_edit_text_view_padding"
|
||||||
|
android:paddingTop="@dimen/tool_converter_edit_text_view_padding_plus"
|
||||||
|
android:paddingBottom="@dimen/tool_converter_edit_text_view_padding"
|
||||||
|
android:textColor="?attr/app_text_theme"
|
||||||
|
android:textIsSelectable="true"
|
||||||
|
android:textSize="@dimen/tool_converter_text_size"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/edit_text_from" />
|
||||||
|
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="@drawable/background_round"
|
||||||
|
android:padding="@dimen/tool_converter_clickable_padding"
|
||||||
|
app:layout_constraintBottom_toTopOf="@id/text_view_to"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/edit_text_from">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/image_view_convert"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:clickable="true"
|
||||||
|
android:contentDescription="Convert"
|
||||||
|
android:focusable="true"
|
||||||
|
android:foreground="@drawable/foreground_ripple"
|
||||||
|
android:src="@drawable/ic_tool_converter_convert"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
File diff suppressed because one or more lines are too long
@@ -87,4 +87,10 @@
|
|||||||
<string name="tool_ip_province">省份</string>
|
<string name="tool_ip_province">省份</string>
|
||||||
<string name="tool_ip_isp">网络提供商</string>
|
<string name="tool_ip_isp">网络提供商</string>
|
||||||
<string name="tool_ip_query_failed">查询失败,请检查网络连接。</string>
|
<string name="tool_ip_query_failed">查询失败,请检查网络连接。</string>
|
||||||
|
|
||||||
|
<string name="tool_converter_choose_base">选择进制</string>
|
||||||
|
<string name="tool_converter_from_base">源进制</string>
|
||||||
|
<string name="tool_converter_to_base">目标进制</string>
|
||||||
|
<string name="tool_converter_please_enter_text">请输入内容……</string>
|
||||||
|
<string name="tool_converter_illegal_number">非法数字</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -87,4 +87,10 @@
|
|||||||
<string name="tool_ip_province">省份</string>
|
<string name="tool_ip_province">省份</string>
|
||||||
<string name="tool_ip_isp">网络提供商</string>
|
<string name="tool_ip_isp">网络提供商</string>
|
||||||
<string name="tool_ip_query_failed">查询失败,请检查网络连接。</string>
|
<string name="tool_ip_query_failed">查询失败,请检查网络连接。</string>
|
||||||
|
|
||||||
|
<string name="tool_converter_choose_base">选择进制</string>
|
||||||
|
<string name="tool_converter_from_base">源进制</string>
|
||||||
|
<string name="tool_converter_to_base">目标进制</string>
|
||||||
|
<string name="tool_converter_please_enter_text">请输入内容……</string>
|
||||||
|
<string name="tool_converter_illegal_number">非法数字</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -87,4 +87,10 @@
|
|||||||
<string name="tool_ip_province">省份</string>
|
<string name="tool_ip_province">省份</string>
|
||||||
<string name="tool_ip_isp">网络提供商</string>
|
<string name="tool_ip_isp">网络提供商</string>
|
||||||
<string name="tool_ip_query_failed">查询失败,请检查网络连接。</string>
|
<string name="tool_ip_query_failed">查询失败,请检查网络连接。</string>
|
||||||
|
|
||||||
|
<string name="tool_converter_choose_base">选择进制</string>
|
||||||
|
<string name="tool_converter_from_base">源进制</string>
|
||||||
|
<string name="tool_converter_to_base">目标进制</string>
|
||||||
|
<string name="tool_converter_please_enter_text">请输入内容……</string>
|
||||||
|
<string name="tool_converter_illegal_number">非法数字</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -48,4 +48,11 @@
|
|||||||
<dimen name="tool_ip_layout_padding">10dp</dimen>
|
<dimen name="tool_ip_layout_padding">10dp</dimen>
|
||||||
<dimen name="tool_ip_layout_margin">@dimen/common_layout_margin</dimen>
|
<dimen name="tool_ip_layout_margin">@dimen/common_layout_margin</dimen>
|
||||||
<dimen name="tool_ip_query_bar_size">48dp</dimen>
|
<dimen name="tool_ip_query_bar_size">48dp</dimen>
|
||||||
|
|
||||||
|
<dimen name="tool_converter_text_size">16sp</dimen>
|
||||||
|
<dimen name="tool_converter_clickable_padding">5dp</dimen>
|
||||||
|
<dimen name="tool_converter_layout_margin">@dimen/common_layout_margin</dimen>
|
||||||
|
<dimen name="tool_converter_edit_text_view_height">200dp</dimen>
|
||||||
|
<dimen name="tool_converter_edit_text_view_padding">15dp</dimen>
|
||||||
|
<dimen name="tool_converter_edit_text_view_padding_plus">30dp</dimen>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -4,6 +4,8 @@
|
|||||||
<string name="app_full_name">Oxygen Toolbox</string>
|
<string name="app_full_name">Oxygen Toolbox</string>
|
||||||
<string name="app_desc">All in One</string>
|
<string name="app_desc">All in One</string>
|
||||||
|
|
||||||
|
<string name="base_nan" translatable="false">NaN</string>
|
||||||
|
|
||||||
<string name="navigation_drawer_open">Open navigation drawer</string>
|
<string name="navigation_drawer_open">Open navigation drawer</string>
|
||||||
<string name="navigation_drawer_close">Close navigation drawer</string>
|
<string name="navigation_drawer_close">Close navigation drawer</string>
|
||||||
<string name="nav_header_title" translatable="false">@string/app_full_name</string>
|
<string name="nav_header_title" translatable="false">@string/app_full_name</string>
|
||||||
@@ -123,4 +125,14 @@
|
|||||||
<string name="tool_ip_province">Province</string>
|
<string name="tool_ip_province">Province</string>
|
||||||
<string name="tool_ip_isp">ISP</string>
|
<string name="tool_ip_isp">ISP</string>
|
||||||
<string name="tool_ip_query_failed">Query failed, please check network connection.</string>
|
<string name="tool_ip_query_failed">Query failed, please check network connection.</string>
|
||||||
|
|
||||||
|
<string name="tool_converter_base_2" translatable="false">2 (binary)</string>
|
||||||
|
<string name="tool_converter_base_8" translatable="false">8 (octal)</string>
|
||||||
|
<string name="tool_converter_base_10" translatable="false">10 (decimal)</string>
|
||||||
|
<string name="tool_converter_base_16" translatable="false">16 (hex)</string>
|
||||||
|
<string name="tool_converter_choose_base">Choose base</string>
|
||||||
|
<string name="tool_converter_from_base">From Base</string>
|
||||||
|
<string name="tool_converter_to_base">To Base</string>
|
||||||
|
<string name="tool_converter_please_enter_text">Please enter text…</string>
|
||||||
|
<string name="tool_converter_illegal_number">Illegal Number</string>
|
||||||
</resources>
|
</resources>
|
||||||
14
app/src/test/java/com/fatapp/oxygentoolbox/MethodTest.java
Normal file
14
app/src/test/java/com/fatapp/oxygentoolbox/MethodTest.java
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
package com.fatapp.oxygentoolbox;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
import com.fatapp.oxygentoolbox.util.HexConversionUtils;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class MethodTest {
|
||||||
|
@Test
|
||||||
|
public void decimalToBaseTest() {
|
||||||
|
assertEquals(HexConversionUtils.decimalToBase("2.2", 2), "10.00110011001100110011001100110011001100110011001100");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,14 +1,21 @@
|
|||||||
package com.fatapp.oxygentoolbox;
|
package com.fatapp.oxygentoolbox;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
import java.net.URLEncoder;
|
import java.net.URLEncoder;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
public class Tester {
|
public class TempTest {
|
||||||
@Test
|
@Test
|
||||||
public void urlEncodeTest() throws UnsupportedEncodingException {
|
public void urlEncodeTest() throws UnsupportedEncodingException {
|
||||||
System.out.println(URLEncoder.encode(" ", StandardCharsets.UTF_8.toString()));
|
System.out.println(URLEncoder.encode(" ", StandardCharsets.UTF_8.toString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void hexTest() {
|
||||||
|
assertEquals(Integer.parseInt("a", 36), 10);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||||
plugins {
|
plugins {
|
||||||
id 'com.android.application' version '7.3.0' apply false
|
id 'com.android.application' version '7.3.1' apply false
|
||||||
id 'com.android.library' version '7.3.0' apply false
|
id 'com.android.library' version '7.3.1' apply false
|
||||||
id 'com.mikepenz.aboutlibraries.plugin' version '10.3.1' apply false
|
id 'com.mikepenz.aboutlibraries.plugin' version '10.3.1' apply false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user