diff --git a/NOTICE b/NOTICE index 1d7ccb3..4c5514d 100644 --- a/NOTICE +++ b/NOTICE @@ -1,5 +1,5 @@ - Morphe NOTICE - Copyright 2026 Morphe - https://github.com/MorpheApp/PotHelper +Morphe NOTICE +Copyright 2026 Morphe +https://github.com/MorpheApp/PotHelper - Portions of this software are provided by the Morphe software project. \ No newline at end of file +Portions of this software are provided by the Morphe software project. \ No newline at end of file diff --git a/README.md b/README.md index 72b8add..37e6832 100644 --- a/README.md +++ b/README.md @@ -19,10 +19,19 @@ A simple PoToken minter written in Java. +The helper app runs offline and has no internet access permissions. + ## ⚖️ Disclaimer This project is provided **as is** without any warranty or guarantee of functionality, stability, or safety. **Use at your own risk**. ## 📜 License -Distributed under the [Apache License 2.0](https://choosealicense.com/licenses/apache-2.0/). \ No newline at end of file +Distributed under the [Apache License 2.0](https://choosealicense.com/licenses/apache-2.0/). + +### License Compatibility + +This project contains native code distributed exclusively in compiled binary form. + +Because the "Corresponding Source" for these binaries is not available, the native code is incompatible with copyleft licenses. +Specifically, the native code portions may not be linked with or distributed with GPLv3 code or with code under any other strong copyleft license. diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 305786b..87ce8ef 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,31 +1,50 @@ - + + + + - + + + android:exported="true" + tools:ignore="ExportedContentProvider" /> + android:exported="true" + tools:ignore="ExportedService"> diff --git a/app/src/main/java/app/morphe/pot/helper/LicensePreference.java b/app/src/main/java/app/morphe/pot/helper/LicensePreference.java deleted file mode 100644 index 7fc1899..0000000 --- a/app/src/main/java/app/morphe/pot/helper/LicensePreference.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2026 Morphe. - * https://github.com/MorpheApp/PotHelper - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package app.morphe.pot.helper; - -public enum LicensePreference { - PROJECT_NOTICE_WITH_LICENSE( - "pref_project_license_pot_helper", - "https://github.com/MorpheApp/PotHelper", - true, - false - ), - SAFEPARCEL( - "pref_third_party_license_safe_parcel", - "https://github.com/microg/SafeParcel", - true, - false - ), - NANOPB( - "pref_third_party_license_nano_pb", - "https://github.com/nanopb/nanopb", - false, - true - ); - - public final String key; - public final String url; - public final boolean resizeDialog; - public final boolean useNumberFormat; - - LicensePreference(String key, String url, boolean resizeDialog, boolean useNumberFormat) { - this.key = key; - this.url = url; - this.resizeDialog = resizeDialog; - this.useNumberFormat = useNumberFormat; - } -} diff --git a/app/src/main/java/app/morphe/pot/helper/MainActivity.java b/app/src/main/java/app/morphe/pot/helper/MainActivity.java index 448db75..85a42c6 100644 --- a/app/src/main/java/app/morphe/pot/helper/MainActivity.java +++ b/app/src/main/java/app/morphe/pot/helper/MainActivity.java @@ -18,17 +18,38 @@ package app.morphe.pot.helper; import android.app.Activity; +import android.app.AlertDialog; +import android.content.ActivityNotFoundException; +import android.content.ComponentName; +import android.content.Intent; +import android.content.pm.PackageManager; import android.content.res.Configuration; import android.graphics.Color; +import android.graphics.Insets; +import android.net.Uri; import android.os.Build; import android.os.Bundle; +import android.text.Html; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.text.style.BulletSpan; +import android.util.Log; import android.util.TypedValue; import android.view.View; +import android.view.ViewGroup; import android.view.Window; +import android.view.WindowInsets; import android.view.WindowInsetsController; +import android.view.WindowManager; +import android.widget.Switch; +import android.widget.TextView; + +import java.io.InputStream; +import java.util.Scanner; @SuppressWarnings("deprecation") public class MainActivity extends Activity { + private static final String TAG = "morphe: MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { @@ -40,34 +61,185 @@ protected void onCreate(Bundle savedInstanceState) { Window window = getWindow(); window.setStatusBarColor(Color.TRANSPARENT); + window.setNavigationBarColor(Color.TRANSPARENT); - View decorView = window.getDecorView(); - if (isDarkModeEnabled) { - decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); - } else { - decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); + // Otherwise the system paints its own opaque scrim over the bars. + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + window.setStatusBarContrastEnforced(false); + window.setNavigationBarContrastEnforced(false); } - if (Build.VERSION.SDK_INT > 30) { + + // Creates the decor view, which the insets controller needs. + View decorView = window.getDecorView(); + + // A light flag means the bar background is light, so it belongs to the light theme. + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { WindowInsetsController insetsController = window.getInsetsController(); if (insetsController != null) { - insetsController.setSystemBarsAppearance( - WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS, - WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS - ); + int lightBars = WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS + | WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS; + insetsController.setSystemBarsAppearance(isDarkModeEnabled ? 0 : lightBars, lightBars); } + } else { + int lightBars = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR; + int visibility = decorView.getSystemUiVisibility(); + decorView.setSystemUiVisibility(isDarkModeEnabled + ? visibility & ~lightBars + : visibility | lightBars); } TypedValue typedValue = new TypedValue(); getTheme().resolveAttribute(android.R.attr.colorBackground, typedValue, true); - findViewById(android.R.id.content).setBackgroundColor(typedValue.data); - setContentView(R.layout.root_view); + View contentView = findViewById(android.R.id.content); + contentView.setBackgroundColor(typedValue.data); + + // The window is edge to edge. + contentView.setOnApplyWindowInsetsListener((view, insets) -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + Insets bars = insets.getInsets(WindowInsets.Type.systemBars()); + view.setPadding(bars.left, bars.top, bars.right, bars.bottom); + } else { + view.setPadding( + insets.getSystemWindowInsetLeft(), + insets.getSystemWindowInsetTop(), + insets.getSystemWindowInsetRight(), + insets.getSystemWindowInsetBottom() + ); + } + return insets; + }); + + setContentView(R.layout.about); - if (savedInstanceState == null) { - getFragmentManager() - .beginTransaction() - .replace(R.id.fragment_container, new MorpheFragment()) - .commit(); + TextView versionView = findViewById(R.id.app_version); + versionView.setText(getString(R.string.app_version, BuildConfig.VERSION_NAME)); + + bind(findViewById(R.id.about_content)); + + Switch showIconSwitch = findViewById(R.id.show_icon_switch); + showIconSwitch.setChecked(isLauncherIconShown()); + showIconSwitch.setOnCheckedChangeListener((view, shown) -> setLauncherIconShown(shown)); + findViewById(R.id.show_icon).setOnClickListener(view -> showIconSwitch.toggle()); + } + + /** + * Makes every tagged row tappable. A tag is either a link, or the name + * of a license asset followed by the URL of its source. + */ + private void bind(ViewGroup group) { + for (int i = 0; i < group.getChildCount(); i++) { + View child = group.getChildAt(i); + Object tag = child.getTag(); + if (tag instanceof String) { + child.setOnClickListener(view -> open((String) tag)); + } else if (child instanceof ViewGroup && !child.isClickable()) { + // Only a card is clipped, so that the ripple of its rows follows the rounded + // corners. Clipping a row would hide it, because its own ripple has no outline. + child.setClipToOutline(true); + bind((ViewGroup) child); + } } } -} \ No newline at end of file + + private ComponentName launcherAlias() { + return new ComponentName(this, getPackageName() + ".Launcher"); + } + + private boolean isLauncherIconShown() { + return getPackageManager().getComponentEnabledSetting(launcherAlias()) + == PackageManager.COMPONENT_ENABLED_STATE_ENABLED; + } + + private void setLauncherIconShown(boolean shown) { + getPackageManager().setComponentEnabledSetting( + launcherAlias(), + shown + ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED + : PackageManager.COMPONENT_ENABLED_STATE_DISABLED, + PackageManager.DONT_KILL_APP); + } + + private void open(String tag) { + if (tag.indexOf(' ') < 0) { + browse(tag); + } else { + showLicenseDialog(tag); + } + } + + private void browse(String url) { + try { + startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url))); + } catch (ActivityNotFoundException ex) { + Log.e(TAG, "No app can open: " + url, ex); + } + } + + /** + * Shows the license of a row tagged with an asset name, the URL of its source, + * and optionally the markers 'numbered' and 'tall'. + */ + @SuppressWarnings("CharsetObjectCanBeUsed") + private void showLicenseDialog(String tag) { + String[] parts = tag.split(" "); + String asset = parts[0]; + String sourceUrl = parts[1]; + boolean useNumberFormat = tag.contains(" numbered"); + boolean tallDialog = tag.contains(" tall"); + + Spanned content; + try (InputStream is = getAssets().open(asset + ".html")) { + String text = new Scanner(is, "UTF-8").useDelimiter("\\A").next(); + content = Html.fromHtml(text, Html.FROM_HTML_MODE_LEGACY); + } catch (Exception ex) { + Log.e(TAG, "openAssets failed", ex); + return; + } + + View contentView = getLayoutInflater().inflate(R.layout.license_dialog, null); + TextView licenseContentView = contentView.findViewById(R.id.license_content); + licenseContentView.setText(handleBulletSpans(content, useNumberFormat)); + + AlertDialog alertDialog = new AlertDialog.Builder(this, R.style.DialogTheme) + .setView(contentView) + .setPositiveButton(R.string.license_dialog_ok_button_text, null) + .setNeutralButton(R.string.license_dialog_source_button_text, + (dialog, id) -> browse(sourceUrl)) + .show(); + + Window window = alertDialog.getWindow(); + if (window != null) { + window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); + + // A long notice would otherwise stretch the dialog over the whole screen. + if (tallDialog) { + WindowManager.LayoutParams params = window.getAttributes(); + params.height = (int) (getResources().getDisplayMetrics().heightPixels * 0.85); + window.setAttributes(params); + } + } + } + + /** + * Html.fromHtml turns every 'li' tag into a bullet point and drops the list type, + * so the bullets are replaced with the numbering of the original license: + * 1, 2, 3 when useNumberFormat is set, a, b, c otherwise. + */ + private Spanned handleBulletSpans(Spanned spanned, boolean useNumberFormat) { + SpannableStringBuilder builder = new SpannableStringBuilder(spanned); + BulletSpan[] bulletSpans = builder.getSpans(0, builder.length(), BulletSpan.class); + + for (int i = 0; i < bulletSpans.length; i++) { + BulletSpan bulletSpan = bulletSpans[i]; + int start = builder.getSpanStart(bulletSpan); + builder.removeSpan(bulletSpan); + String prefix = useNumberFormat + ? (i + 1) + ". " + : (char) ('a' + (i % 26)) + ". "; + builder.insert(start, prefix); + } + + return builder; + } +} diff --git a/app/src/main/java/app/morphe/pot/helper/MorpheFragment.java b/app/src/main/java/app/morphe/pot/helper/MorpheFragment.java deleted file mode 100644 index 154b82a..0000000 --- a/app/src/main/java/app/morphe/pot/helper/MorpheFragment.java +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright 2026 Morphe. - * https://github.com/MorpheApp/PotHelper - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package app.morphe.pot.helper; - -import android.content.Intent; -import android.graphics.Point; -import android.app.AlertDialog; -import android.content.Context; -import android.net.Uri; -import android.os.Bundle; -import android.preference.Preference; -import android.preference.PreferenceFragment; -import android.text.Html; -import android.text.SpannableStringBuilder; -import android.text.Spanned; -import android.text.style.BulletSpan; -import android.util.Log; -import android.view.Display; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.view.Window; -import android.view.WindowManager; -import android.widget.ListView; -import android.widget.TextView; - -import java.io.InputStream; -import java.util.Scanner; - -@SuppressWarnings({"deprecation", "FieldCanBeLocal"}) -public class MorpheFragment extends PreferenceFragment { - private final String TAG = "morphe: MorpheFragment"; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - addPreferencesFromResource(R.xml.about); - - for (LicensePreference licensePref : LicensePreference.values()) { - Preference pref = findPreference(licensePref.key); - if (pref != null) { - pref.setOnPreferenceClickListener(preference -> { - showLicenseDialog(licensePref); - return true; - }); - } - } - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = super.onCreateView(inflater, container, savedInstanceState); - if (view != null) { - ListView listView = view.findViewById(android.R.id.list); - if (listView != null) { - View headerContainer = inflater.inflate(R.layout.header_container, listView, false); - TextView textView = headerContainer.findViewById(R.id.header_app_version); - if (textView != null) { - textView.setText(String.format(getResources().getString(R.string.app_version), BuildConfig.VERSION_NAME)); - } - - listView.addHeaderView(headerContainer, null, false); - } - } - - return view; - } - - @Override - public void onResume() { - super.onResume(); - - final View rootView = getView(); - if (rootView == null) return; - ListView listView = getView().findViewById(android.R.id.list); - if (listView == null) return; - listView.setDivider(null); - listView.setDividerHeight(0); - } - - @SuppressWarnings("CharsetObjectCanBeUsed") - private void showLicenseDialog(LicensePreference licensePref) { - Context context = getContext(); - Spanned content; - String fileName = licensePref.name().toLowerCase() + ".html"; - try (InputStream is = context.getAssets().open(fileName)) { - String text = new Scanner(is, "UTF-8").useDelimiter("\\A").next(); - content = Html.fromHtml(text, Html.FROM_HTML_MODE_LEGACY); - } catch (Exception ex) { - Log.e(TAG, "openAssets failed", ex); - return; - } - - LayoutInflater inflater = getLayoutInflater(); - View contentView = inflater.inflate(R.layout.license_dialog, null); - TextView licenseContentView = contentView.findViewById(R.id.license_content); - licenseContentView.setText(handleBulletSpans(content, licensePref.useNumberFormat)); - - AlertDialog alertDialog = new AlertDialog.Builder(context, R.style.DialogTheme) - .setView(contentView) - .setPositiveButton(R.string.license_dialog_ok_button_text, null) - .setNeutralButton(R.string.license_dialog_source_button_text, (dialog, id) -> { - Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(licensePref.url)); - startActivity(intent); - }) - .show(); - - Window window = alertDialog.getWindow(); - if (window != null) { - // Remove window background. - window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); - - // If the message is too long, the dialog uses the entire vertical area of the screen. - // Set the dialog height to 85% of the screen. - if (licensePref.resizeDialog) { - Display display = getActivity().getWindowManager().getDefaultDisplay(); - Point size = new Point(); - display.getSize(size); - - WindowManager.LayoutParams params = window.getAttributes(); - params.height = (int) (size.y * 0.85); - window.setAttributes(params); - } - } - } - - /** - * 'Html.fromHtml(text, Html.FROM_HTML_MODE_LEGACY)' was used to show HTML as a dialog message. - * As a result, the attributes of most HTML tags, including the 'ul' tag, are ignored. - * Since the 'li' tag is always converted to a bullet point, it must be replaced with the string used in the original license. - * - * @param spanned Formatted HTML string. - * @param useNumberFormat Whether to replace 'li' tags with numbers. - * If true, they will be replaced with 1, 2, 3. - * If false, they will be replaced with a, b, c. - * @return Replaced formatted HTML string. - */ - private Spanned handleBulletSpans(Spanned spanned, boolean useNumberFormat) { - SpannableStringBuilder builder = new SpannableStringBuilder(spanned); - BulletSpan[] bulletSpans = builder.getSpans(0, builder.length(), BulletSpan.class); - - for (int i = 0; i < bulletSpans.length; i++) { - BulletSpan bulletSpan = bulletSpans[i]; - int start = builder.getSpanStart(bulletSpan); - builder.removeSpan(bulletSpan); - String prefix = useNumberFormat - ? (i + 1) + ". " - : (char) ('a' + (i % 26)) + ". "; - builder.insert(start, prefix); - } - - return builder; - } -} \ No newline at end of file diff --git a/app/src/main/java/app/morphe/pot/helper/chimera/ServiceProvider.java b/app/src/main/java/app/morphe/pot/helper/chimera/ServiceProvider.java index 256b58d..fc60f2c 100644 --- a/app/src/main/java/app/morphe/pot/helper/chimera/ServiceProvider.java +++ b/app/src/main/java/app/morphe/pot/helper/chimera/ServiceProvider.java @@ -81,4 +81,4 @@ public int update(Uri uri, ContentValues contentValues, String selection, String Log.d(TAG, "update: " + uri + ", " + contentValues + ", " + selection + ", " + Arrays.toString(selectionArgs)); return 0; } -} \ No newline at end of file +} diff --git a/app/src/main/java/app/morphe/pot/helper/potokens/PoTokenServiceImpl.java b/app/src/main/java/app/morphe/pot/helper/potokens/PoTokenServiceImpl.java index 7125eec..df904dc 100644 --- a/app/src/main/java/app/morphe/pot/helper/potokens/PoTokenServiceImpl.java +++ b/app/src/main/java/app/morphe/pot/helper/potokens/PoTokenServiceImpl.java @@ -86,4 +86,4 @@ private static byte[] encrypt(byte[] rawKey, byte[] data) { } private static native byte[][][] mintMorpheIntegrityTokens(byte[] data); -} \ No newline at end of file +} diff --git a/app/src/main/res/drawable/group_background.xml b/app/src/main/res/drawable/group_background.xml new file mode 100644 index 0000000..ec99015 --- /dev/null +++ b/app/src/main/res/drawable/group_background.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/app/src/main/res/drawable/item_divider.xml b/app/src/main/res/drawable/item_divider.xml new file mode 100644 index 0000000..82890f3 --- /dev/null +++ b/app/src/main/res/drawable/item_divider.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/app/src/main/res/layout/about.xml b/app/src/main/res/layout/about.xml new file mode 100644 index 0000000..0cf219b --- /dev/null +++ b/app/src/main/res/layout/about.xml @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/category_text.xml b/app/src/main/res/layout/category_text.xml deleted file mode 100644 index b39877a..0000000 --- a/app/src/main/res/layout/category_text.xml +++ /dev/null @@ -1,11 +0,0 @@ - - diff --git a/app/src/main/res/layout/header_container.xml b/app/src/main/res/layout/header_container.xml deleted file mode 100644 index 5e59fd9..0000000 --- a/app/src/main/res/layout/header_container.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/root_view.xml b/app/src/main/res/layout/root_view.xml deleted file mode 100644 index a9ee9c5..0000000 --- a/app/src/main/res/layout/root_view.xml +++ /dev/null @@ -1,5 +0,0 @@ - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index f30783b..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi/ic_launcher.xml similarity index 100% rename from app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml rename to app/src/main/res/mipmap-anydpi/ic_launcher.xml diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 6047b46..0000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index 351f766..0000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and /dev/null differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index ec3bb85..0000000 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index ccace5f..0000000 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 42e7879..0000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index d920b61..0000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index c348744..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100644 index f8ce200..0000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 61b33b0..0000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png deleted file mode 100644 index 33c4ef8..0000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/app/src/main/res/values-night-v31/colors.xml b/app/src/main/res/values-night-v31/colors.xml index 842f9b7..bc40f83 100644 --- a/app/src/main/res/values-night-v31/colors.xml +++ b/app/src/main/res/values-night-v31/colors.xml @@ -2,6 +2,10 @@ @android:color/system_neutral1_900 @android:color/system_neutral1_50 + @android:color/system_neutral2_200 + @android:color/system_accent1_200 + @android:color/system_neutral1_800 + @android:color/system_neutral1_700 @android:color/system_accent2_900 @android:color/system_accent1_200 - \ No newline at end of file + diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml index 19e1179..3ff4c33 100644 --- a/app/src/main/res/values-night/colors.xml +++ b/app/src/main/res/values-night/colors.xml @@ -2,5 +2,9 @@ #ff181825 #ffe6e9ef + #ffa6adc8 + #ff89b4fa + #ff1e1e2e + #ff313244 #ff001029 - \ No newline at end of file + diff --git a/app/src/main/res/values-night/styles.xml b/app/src/main/res/values-night/styles.xml index 01bc409..34170be 100644 --- a/app/src/main/res/values-night/styles.xml +++ b/app/src/main/res/values-night/styles.xml @@ -1,4 +1,7 @@ - diff --git a/app/src/main/res/values-v31/colors.xml b/app/src/main/res/values-v31/colors.xml index d78e984..f2c5a86 100644 --- a/app/src/main/res/values-v31/colors.xml +++ b/app/src/main/res/values-v31/colors.xml @@ -2,6 +2,10 @@ @android:color/system_neutral1_50 @android:color/system_neutral1_900 + @android:color/system_neutral2_700 + @android:color/system_accent1_600 + @android:color/system_neutral1_0 + @android:color/system_neutral1_100 @android:color/system_accent2_100 @android:color/system_accent1_600 - \ No newline at end of file + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 7b5fd4b..01a9f70 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -3,6 +3,10 @@ #ffffffff #ffe6e9ef #ff181825 + #ff6c6f85 + #ff1e66f5 + #ffeff1f5 + #ffccd0da #ffd1e0ff #ffc2e9fb - \ No newline at end of file + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 19e83cf..66c53d1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -6,6 +6,10 @@ Version %1$s App version + Settings + Show app icon + Add PotHelper to the home screen + Official links Donate Support us diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index f650069..b8f85e7 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -16,4 +16,57 @@ 42.0dip 0.0dip + + + + + + + + + + + + diff --git a/app/src/main/res/xml/about.xml b/app/src/main/res/xml/about.xml deleted file mode 100644 index 4b6e7ae..0000000 --- a/app/src/main/res/xml/about.xml +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file