Partial tiramisu compatibility

pull/208/head
M66B 2 years ago
parent 9231a1fd22
commit 2867e759f4

@ -23,7 +23,7 @@ android {
defaultConfig { defaultConfig {
applicationId "eu.faircode.email" applicationId "eu.faircode.email"
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 33 targetSdkVersion 32
versionCode getVersionCode() versionCode getVersionCode()
versionName "1." + getVersionCode() versionName "1." + getVersionCode()
archivesBaseName = "FairEmail-v$versionName" + getRevision() archivesBaseName = "FairEmail-v$versionName" + getRevision()

@ -165,7 +165,8 @@ public class ActivityAMP extends ActivityBase {
private void setDarkMode() { private void setDarkMode() {
WebSettings settings = wvAmp.getSettings(); WebSettings settings = wvAmp.getSettings();
boolean dark = (Helper.isDarkTheme(this) && !force_light); boolean dark = (Helper.isDarkTheme(this) && !force_light);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU ||
Helper.getTargetSdk(this) < Build.VERSION_CODES.TIRAMISU) {
if (WebViewEx.isFeatureSupported(WebViewFeature.FORCE_DARK)) if (WebViewEx.isFeatureSupported(WebViewFeature.FORCE_DARK))
WebSettingsCompat.setForceDark(settings, dark ? FORCE_DARK_ON : FORCE_DARK_OFF); WebSettingsCompat.setForceDark(settings, dark ? FORCE_DARK_ON : FORCE_DARK_OFF);
} else } else

@ -86,7 +86,8 @@ public class FragmentDialogOpenFull extends FragmentDialogBase {
WebSettingsCompat.setSafeBrowsingEnabled(settings, safe_browsing); WebSettingsCompat.setSafeBrowsingEnabled(settings, safe_browsing);
boolean dark = (Helper.isDarkTheme(context) && !force_light); boolean dark = (Helper.isDarkTheme(context) && !force_light);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU ||
Helper.getTargetSdk(context) < Build.VERSION_CODES.TIRAMISU) {
if (WebViewEx.isFeatureSupported(WebViewFeature.FORCE_DARK)) if (WebViewEx.isFeatureSupported(WebViewFeature.FORCE_DARK))
WebSettingsCompat.setForceDark(settings, dark ? FORCE_DARK_ON : FORCE_DARK_OFF); WebSettingsCompat.setForceDark(settings, dark ? FORCE_DARK_ON : FORCE_DARK_OFF);
} else } else

@ -74,7 +74,7 @@ public class FragmentDialogPermissions extends FragmentDialogBase {
boolean hasContactPermissions = boolean hasContactPermissions =
Helper.hasPermission(context, Manifest.permission.READ_CONTACTS); Helper.hasPermission(context, Manifest.permission.READ_CONTACTS);
boolean hasNotificationPermissions = boolean hasNotificationPermissions =
(Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU || (Helper.getTargetSdk(context) < Build.VERSION_CODES.TIRAMISU ||
Helper.hasPermission(context, Manifest.permission.POST_NOTIFICATIONS)); Helper.hasPermission(context, Manifest.permission.POST_NOTIFICATIONS));
boolean isIgnoring = !Boolean.FALSE.equals(Helper.isIgnoringOptimizations(context)); boolean isIgnoring = !Boolean.FALSE.equals(Helper.isIgnoringOptimizations(context));
boolean canScheduleExact = AlarmManagerCompatEx.canScheduleExactAlarms(getContext()); boolean canScheduleExact = AlarmManagerCompatEx.canScheduleExactAlarms(getContext());

@ -623,9 +623,15 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
tvNotifications.setOnClickListener(new View.OnClickListener() { tvNotifications.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
v.getContext().startActivity( Intent intent;
new Intent(v.getContext(), ActivitySetup.class) if (Helper.getTargetSdk(v.getContext()) < Build.VERSION_CODES.TIRAMISU)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)); intent = new Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.parse("package:" + BuildConfig.APPLICATION_ID));
else
intent = new Intent(v.getContext(), ActivitySetup.class)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
v.getContext().startActivity(intent);
} }
}); });
@ -4476,20 +4482,21 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
iff.addAction(ACTION_KEYWORDS); iff.addAction(ACTION_KEYWORDS);
lbm.registerReceiver(receiver, iff); lbm.registerReceiver(receiver, iff);
ConnectivityManager cm = Helper.getSystemService(getContext(), ConnectivityManager.class); final Context context = getContext();
ConnectivityManager cm = Helper.getSystemService(context, ConnectivityManager.class);
NetworkRequest.Builder builder = new NetworkRequest.Builder(); NetworkRequest.Builder builder = new NetworkRequest.Builder();
builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
cm.registerNetworkCallback(builder.build(), networkCallback); cm.registerNetworkCallback(builder.build(), networkCallback);
updateAirplaneMode(ConnectionHelper.airplaneMode(getContext())); updateAirplaneMode(ConnectionHelper.airplaneMode(context));
getContext().registerReceiver(airplanemode, new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED)); context.registerReceiver(airplanemode, new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED));
boolean canNotify = boolean canNotify =
(Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU || (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU ||
hasPermission(Manifest.permission.POST_NOTIFICATIONS)); hasPermission(Manifest.permission.POST_NOTIFICATIONS));
grpNotifications.setVisibility(canNotify ? View.GONE : View.VISIBLE); grpNotifications.setVisibility(canNotify ? View.GONE : View.VISIBLE);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
boolean compact = prefs.getBoolean("compact", false); boolean compact = prefs.getBoolean("compact", false);
int zoom = prefs.getInt("view_zoom", compact ? 0 : 1); int zoom = prefs.getInt("view_zoom", compact ? 0 : 1);
adapter.setCompact(compact); adapter.setCompact(compact);
@ -4546,15 +4553,16 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
public void onPause() { public void onPause() {
super.onPause(); super.onPause();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); final Context context = getContext();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
prefs.unregisterOnSharedPreferenceChangeListener(this); prefs.unregisterOnSharedPreferenceChangeListener(this);
getContext().unregisterReceiver(airplanemode); context.unregisterReceiver(airplanemode);
ConnectivityManager cm = Helper.getSystemService(getContext(), ConnectivityManager.class); ConnectivityManager cm = Helper.getSystemService(context, ConnectivityManager.class);
cm.unregisterNetworkCallback(networkCallback); cm.unregisterNetworkCallback(networkCallback);
LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(getContext()); LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(context);
lbm.unregisterReceiver(receiver); lbm.unregisterReceiver(receiver);
} }

@ -484,15 +484,16 @@ public class FragmentOptions extends FragmentBase {
} }
private void onExit() { private void onExit() {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); final Context context = getContext();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
boolean setup_reminder = prefs.getBoolean("setup_reminder", true); boolean setup_reminder = prefs.getBoolean("setup_reminder", true);
boolean hasContactPermissions = boolean hasContactPermissions =
hasPermission(Manifest.permission.READ_CONTACTS); hasPermission(Manifest.permission.READ_CONTACTS);
boolean hasNotificationPermissions = boolean hasNotificationPermissions =
(Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU || (Helper.getTargetSdk(context) < Build.VERSION_CODES.TIRAMISU ||
hasPermission(Manifest.permission.POST_NOTIFICATIONS)); hasPermission(Manifest.permission.POST_NOTIFICATIONS));
boolean isIgnoring = !Boolean.FALSE.equals(Helper.isIgnoringOptimizations(getContext())); boolean isIgnoring = !Boolean.FALSE.equals(Helper.isIgnoringOptimizations(context));
if (!setup_reminder || if (!setup_reminder ||
(hasContactPermissions && hasNotificationPermissions && isIgnoring)) (hasContactPermissions && hasNotificationPermissions && isIgnoring))

@ -470,13 +470,14 @@ public class FragmentSetup extends FragmentBase {
btnPermissions.setOnClickListener(new View.OnClickListener() { btnPermissions.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View v) {
try { try {
btnPermissions.setEnabled(false); btnPermissions.setEnabled(false);
List<String> requesting = new ArrayList<>(); List<String> requesting = new ArrayList<>();
for (String permission : getDesiredPermissions()) for (String permission : Helper.getDesiredPermissions(getContext()))
if (!hasPermission(permission)) if (!hasPermission(permission))
requesting.add((permission)); requesting.add((permission));
Log.i("Requesting permissions " + TextUtils.join(",", requesting));
requestPermissions(requesting.toArray(new String[0]), REQUEST_PERMISSIONS); requestPermissions(requesting.toArray(new String[0]), REQUEST_PERMISSIONS);
} catch (Throwable ex) { } catch (Throwable ex) {
Log.unexpectedError(getParentFragmentManager(), ex); Log.unexpectedError(getParentFragmentManager(), ex);
@ -978,6 +979,9 @@ public class FragmentSetup extends FragmentBase {
for (int i = 0; i < Math.min(permissions.length, grantResults.length); i++) { for (int i = 0; i < Math.min(permissions.length, grantResults.length); i++) {
String key = "requested." + permissions[i]; String key = "requested." + permissions[i];
Log.i("Permission " + permissions[i] + "=" +
(grantResults[i] == PackageManager.PERMISSION_GRANTED));
if (grantResults[i] == PackageManager.PERMISSION_DENIED && if (grantResults[i] == PackageManager.PERMISSION_DENIED &&
grantResults[i] == prefs.getInt(key, PackageManager.PERMISSION_GRANTED)) grantResults[i] == prefs.getInt(key, PackageManager.PERMISSION_GRANTED))
denied++; denied++;
@ -999,17 +1003,9 @@ public class FragmentSetup extends FragmentBase {
} }
} }
private List<String> getDesiredPermissions() {
List<String> permissions = new ArrayList<>();
permissions.add(Manifest.permission.READ_CONTACTS);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU)
permissions.add(Manifest.permission.POST_NOTIFICATIONS);
return permissions;
}
private void setGrantedPermissions() { private void setGrantedPermissions() {
boolean all = true; boolean all = true;
for (String permission : getDesiredPermissions()) for (String permission : Helper.getDesiredPermissions(getContext()))
if (!hasPermission(permission)) { if (!hasPermission(permission)) {
all = false; all = false;
break; break;

@ -38,6 +38,7 @@ import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo;
@ -162,6 +163,7 @@ import java.util.concurrent.atomic.AtomicLong;
import java.util.regex.Pattern; import java.util.regex.Pattern;
public class Helper { public class Helper {
private static Integer targetSdk = null;
private static Boolean hasWebView = null; private static Boolean hasWebView = null;
private static Boolean hasPlayStore = null; private static Boolean hasPlayStore = null;
private static Boolean hasValidFingerprint = null; private static Boolean hasValidFingerprint = null;
@ -389,6 +391,14 @@ public class Helper {
return true; return true;
} }
static String[] getDesiredPermissions(Context context) {
List<String> permissions = new ArrayList<>();
permissions.add(Manifest.permission.READ_CONTACTS);
if (getTargetSdk(context) >= Build.VERSION_CODES.TIRAMISU)
permissions.add(Manifest.permission.POST_NOTIFICATIONS);
return permissions.toArray(new String[0]);
}
static String[] getOAuthPermissions() { static String[] getOAuthPermissions() {
List<String> permissions = new ArrayList<>(); List<String> permissions = new ArrayList<>();
//permissions.add(Manifest.permission.READ_CONTACTS); // profile //permissions.add(Manifest.permission.READ_CONTACTS); // profile
@ -997,6 +1007,19 @@ public class Helper {
return 0; return 0;
} }
static int getTargetSdk(Context context) {
if (targetSdk == null)
try {
PackageManager pm = context.getPackageManager();
ApplicationInfo ai = pm.getApplicationInfo(BuildConfig.APPLICATION_ID, 0);
targetSdk = ai.targetSdkVersion;
} catch (Throwable ex) {
Log.e(ex);
targetSdk = Build.VERSION.SDK_INT;
}
return targetSdk;
}
static boolean isSupportedDevice() { static boolean isSupportedDevice() {
if ("Amazon".equals(Build.BRAND) && Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { if ("Amazon".equals(Build.BRAND) && Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
/* /*

@ -32,7 +32,6 @@ import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.PermissionGroupInfo; import android.content.pm.PermissionGroupInfo;
@ -1813,14 +1812,6 @@ public class Log {
PackageManager pm = context.getPackageManager(); PackageManager pm = context.getPackageManager();
String installer = pm.getInstallerPackageName(BuildConfig.APPLICATION_ID); String installer = pm.getInstallerPackageName(BuildConfig.APPLICATION_ID);
int targetSdk = -1;
try {
ApplicationInfo ai = pm.getApplicationInfo(BuildConfig.APPLICATION_ID, 0);
targetSdk = ai.targetSdkVersion;
} catch (PackageManager.NameNotFoundException ex) {
sb.append(ex).append("\r\n");
}
// Get version info // Get version info
sb.append(String.format("%s %s/%d%s%s%s%s\r\n", sb.append(String.format("%s %s/%d%s%s%s%s\r\n",
context.getString(R.string.app_name), context.getString(R.string.app_name),
@ -1831,8 +1822,8 @@ public class Log {
BuildConfig.DEBUG ? "d" : "", BuildConfig.DEBUG ? "d" : "",
ActivityBilling.isPro(context) ? "+" : "-")); ActivityBilling.isPro(context) ? "+" : "-"));
sb.append(String.format("Package: %s\r\n", BuildConfig.APPLICATION_ID)); sb.append(String.format("Package: %s\r\n", BuildConfig.APPLICATION_ID));
sb.append(String.format("Android: %s (SDK %d/%d)\r\n", sb.append(String.format("Android: %s (SDK device=%d target=%d)\r\n",
Build.VERSION.RELEASE, Build.VERSION.SDK_INT, targetSdk)); Build.VERSION.RELEASE, Build.VERSION.SDK_INT, Helper.getTargetSdk(context)));
boolean reporting = prefs.getBoolean("crash_reports", false); boolean reporting = prefs.getBoolean("crash_reports", false);
if (reporting || BuildConfig.TEST_RELEASE) { if (reporting || BuildConfig.TEST_RELEASE) {

@ -118,7 +118,8 @@ public class WebViewEx extends WebView implements DownloadListener, View.OnLongC
WebSettings settings = getSettings(); WebSettings settings = getSettings();
boolean dark = Helper.isDarkTheme(context); boolean dark = Helper.isDarkTheme(context);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU ||
Helper.getTargetSdk(context) < Build.VERSION_CODES.TIRAMISU) {
boolean canForce = WebViewEx.isFeatureSupported(WebViewFeature.FORCE_DARK); boolean canForce = WebViewEx.isFeatureSupported(WebViewFeature.FORCE_DARK);
if (canForce) if (canForce)
WebSettingsCompat.setForceDark(settings, dark && !force_light ? FORCE_DARK_ON : FORCE_DARK_OFF); WebSettingsCompat.setForceDark(settings, dark && !force_light ? FORCE_DARK_ON : FORCE_DARK_OFF);

Loading…
Cancel
Save