diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java index 8da01ad759..b9c6384a7b 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java @@ -37,6 +37,7 @@ import android.os.Bundle; import android.os.Debug; import android.provider.Settings; import android.text.SpannableStringBuilder; +import android.text.Spanned; import android.text.style.RelativeSizeSpan; import android.text.style.StyleSpan; import android.util.Pair; @@ -143,6 +144,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc private TextView tvMemoryClass; private TextView tvMemoryUsage; private TextView tvStorageUsage; + private TextView tvSuffixes; private TextView tvFingerprint; private Button btnGC; private Button btnCharsets; @@ -262,6 +264,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc tvMemoryClass = view.findViewById(R.id.tvMemoryClass); tvMemoryUsage = view.findViewById(R.id.tvMemoryUsage); tvStorageUsage = view.findViewById(R.id.tvStorageUsage); + tvSuffixes = view.findViewById(R.id.tvSuffixes); tvFingerprint = view.findViewById(R.id.tvFingerprint); btnGC = view.findViewById(R.id.btnGC); btnCharsets = view.findViewById(R.id.btnCharsets); @@ -959,8 +962,6 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc setLastCleanup(prefs.getLong("last_cleanup", -1)); - setPermissionInfo(); - swExactAlarms.setEnabled(AlarmManagerCompatEx.canScheduleExactAlarms(getContext())); swTestIab.setVisibility(BuildConfig.DEBUG ? View.VISIBLE : View.GONE); @@ -969,6 +970,13 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc return view; } + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + setSuffixes(); + setPermissionInfo(); + } + @Override public void onResume() { super.onResume(); @@ -1227,79 +1235,121 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc time < 0 ? "-" : DTF.format(time))); } + private void setSuffixes() { + new SimpleTask() { + @Override + protected void onPreExecute(Bundle args) { + tvSuffixes.setText(getString(R.string.title_advanced_suffixes, -1)); + } + + @Override + protected Integer onExecute(Context context, Bundle args) { + return UriHelper.getSuffixCount(context); + } + + @Override + protected void onExecuted(Bundle args, Integer count) { + tvSuffixes.setText(getString(R.string.title_advanced_suffixes, count)); + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Log.w(ex); + tvSuffixes.setText(ex.toString()); + } + }.execute(this, new Bundle(), "suffixes"); + } + private void setPermissionInfo() { - try { - int start = 0; - int dp24 = Helper.dp2pixels(getContext(), 24); - SpannableStringBuilder ssb = new SpannableStringBuilderEx(); - PackageManager pm = getContext().getPackageManager(); - PackageInfo pi = pm.getPackageInfo(BuildConfig.APPLICATION_ID, PackageManager.GET_PERMISSIONS); - for (int i = 0; i < pi.requestedPermissions.length; i++) { - boolean granted = ((pi.requestedPermissionsFlags[i] & PackageInfo.REQUESTED_PERMISSION_GRANTED) != 0); - - PermissionInfo info; - try { - info = pm.getPermissionInfo(pi.requestedPermissions[i], PackageManager.GET_META_DATA); - } catch (Throwable ex) { - info = new PermissionInfo(); - info.name = pi.requestedPermissions[i]; - if (!(ex instanceof PackageManager.NameNotFoundException)) - info.group = ex.toString(); - } + new SimpleTask() { + @Override + protected void onPreExecute(Bundle args) { + tvPermissions.setText(null); + } - ssb.append(info.name).append('\n'); - if (granted) - ssb.setSpan(new StyleSpan(Typeface.BOLD), start, ssb.length(), 0); - start = ssb.length(); + @Override + protected Spanned onExecute(Context context, Bundle args) throws Throwable { + int start = 0; + int dp24 = Helper.dp2pixels(getContext(), 24); + SpannableStringBuilder ssb = new SpannableStringBuilderEx(); + PackageManager pm = getContext().getPackageManager(); + PackageInfo pi = pm.getPackageInfo(BuildConfig.APPLICATION_ID, PackageManager.GET_PERMISSIONS); + for (int i = 0; i < pi.requestedPermissions.length; i++) { + boolean granted = ((pi.requestedPermissionsFlags[i] & PackageInfo.REQUESTED_PERMISSION_GRANTED) != 0); + + PermissionInfo info; + try { + info = pm.getPermissionInfo(pi.requestedPermissions[i], PackageManager.GET_META_DATA); + } catch (Throwable ex) { + info = new PermissionInfo(); + info.name = pi.requestedPermissions[i]; + if (!(ex instanceof PackageManager.NameNotFoundException)) + info.group = ex.toString(); + } - if (info.group != null) { - ssb.append(info.group).append('\n'); - ssb.setSpan(new IndentSpan(dp24), start, ssb.length(), 0); + ssb.append(info.name).append('\n'); + if (granted) + ssb.setSpan(new StyleSpan(Typeface.BOLD), start, ssb.length(), 0); start = ssb.length(); - } - CharSequence description = info.loadDescription(pm); - if (description != null) { - ssb.append(description).append('\n'); - ssb.setSpan(new IndentSpan(dp24), start, ssb.length(), 0); - ssb.setSpan(new RelativeSizeSpan(HtmlHelper.FONT_SMALL), start, ssb.length(), 0); - start = ssb.length(); - } + if (info.group != null) { + ssb.append(info.group).append('\n'); + ssb.setSpan(new IndentSpan(dp24), start, ssb.length(), 0); + start = ssb.length(); + } - if (info.protectionLevel != 0) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) - switch (info.getProtection()) { - case PermissionInfo.PROTECTION_DANGEROUS: - ssb.append("dangerous "); - break; - case PermissionInfo.PROTECTION_NORMAL: - ssb.append("normal "); - break; - case PermissionInfo.PROTECTION_SIGNATURE: - ssb.append("signature "); - break; - case PermissionInfo.PROTECTION_SIGNATURE_OR_SYSTEM: - ssb.append("signatureOrSystem "); - break; - } + CharSequence description = info.loadDescription(pm); + if (description != null) { + ssb.append(description).append('\n'); + ssb.setSpan(new IndentSpan(dp24), start, ssb.length(), 0); + ssb.setSpan(new RelativeSizeSpan(HtmlHelper.FONT_SMALL), start, ssb.length(), 0); + start = ssb.length(); + } + + if (info.protectionLevel != 0) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) + switch (info.getProtection()) { + case PermissionInfo.PROTECTION_DANGEROUS: + ssb.append("dangerous "); + break; + case PermissionInfo.PROTECTION_NORMAL: + ssb.append("normal "); + break; + case PermissionInfo.PROTECTION_SIGNATURE: + ssb.append("signature "); + break; + case PermissionInfo.PROTECTION_SIGNATURE_OR_SYSTEM: + ssb.append("signatureOrSystem "); + break; + } - ssb.append(Integer.toHexString(info.protectionLevel)); + ssb.append(Integer.toHexString(info.protectionLevel)); - if (info.flags != 0) - ssb.append(' ').append(Integer.toHexString(info.flags)); + if (info.flags != 0) + ssb.append(' ').append(Integer.toHexString(info.flags)); + + ssb.append('\n'); + ssb.setSpan(new IndentSpan(dp24), start, ssb.length(), 0); + start = ssb.length(); + } ssb.append('\n'); - ssb.setSpan(new IndentSpan(dp24), start, ssb.length(), 0); - start = ssb.length(); } - ssb.append('\n'); + return ssb; } - tvPermissions.setText(ssb); - } catch (Throwable ex) { - Log.w(ex); - tvPermissions.setText(ex.toString()); - } + + @Override + protected void onExecuted(Bundle args, Spanned permissions) { + tvPermissions.setText(permissions); + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Log.w(ex); + tvPermissions.setText(ex.toString()); + } + }.execute(this, new Bundle(), "permissions"); } private static class StorageData { diff --git a/app/src/main/java/eu/faircode/email/UriHelper.java b/app/src/main/java/eu/faircode/email/UriHelper.java index ab8704432b..1fedba78af 100644 --- a/app/src/main/java/eu/faircode/email/UriHelper.java +++ b/app/src/main/java/eu/faircode/email/UriHelper.java @@ -162,7 +162,14 @@ public class UriHelper { } } - static void ensureSuffixList(Context context) { + static int getSuffixCount(Context context) { + ensureSuffixList(context); + synchronized (suffixList) { + return suffixList.size(); + } + } + + private static void ensureSuffixList(Context context) { synchronized (suffixList) { if (suffixList.size() > 0) return; diff --git a/app/src/main/res/layout/fragment_options_misc.xml b/app/src/main/res/layout/fragment_options_misc.xml index e2359b02f2..a5fa92a1c3 100644 --- a/app/src/main/res/layout/fragment_options_misc.xml +++ b/app/src/main/res/layout/fragment_options_misc.xml @@ -855,6 +855,17 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/tvMemoryUsage" /> + + + app:layout_constraintTop_toBottomOf="@id/tvSuffixes" />