From c48ee839253395482c8e6009c641a9a258860c07 Mon Sep 17 00:00:00 2001 From: M66B Date: Sun, 23 Aug 2020 17:34:14 +0200 Subject: [PATCH] Singleton handler --- .../java/eu/faircode/email/ActivityBase.java | 5 +++ .../java/eu/faircode/email/ActivityMain.java | 5 ++- .../java/eu/faircode/email/ActivityView.java | 7 ++-- .../java/eu/faircode/email/AdapterFolder.java | 3 +- .../eu/faircode/email/AdapterMessage.java | 11 +++---- .../java/eu/faircode/email/ApplicationEx.java | 10 ++++++ .../email/BoundaryCallbackMessages.java | 11 ++----- .../java/eu/faircode/email/ContactInfo.java | 6 +--- .../email/ContentLoadingProgressBar.java | 15 ++------- .../eu/faircode/email/FragmentAccount.java | 11 +++---- .../java/eu/faircode/email/FragmentBase.java | 5 +++ .../eu/faircode/email/FragmentCompose.java | 14 +++----- .../eu/faircode/email/FragmentFolder.java | 3 +- .../java/eu/faircode/email/FragmentGmail.java | 7 ++-- .../eu/faircode/email/FragmentIdentity.java | 7 ++-- .../eu/faircode/email/FragmentMessages.java | 13 +++----- .../java/eu/faircode/email/FragmentOAuth.java | 3 +- .../email/FragmentOptionsPrivacy.java | 10 +----- .../java/eu/faircode/email/FragmentPop.java | 3 +- .../eu/faircode/email/FragmentQuickSetup.java | 5 ++- .../java/eu/faircode/email/FragmentRule.java | 3 +- .../main/java/eu/faircode/email/Helper.java | 32 ++++++++----------- .../java/eu/faircode/email/ServiceBase.java | 5 +++ .../java/eu/faircode/email/ServiceSend.java | 8 ++--- .../eu/faircode/email/ServiceSynchronize.java | 6 ++-- .../java/eu/faircode/email/SimpleTask.java | 6 +--- 26 files changed, 87 insertions(+), 127 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/ActivityBase.java b/app/src/main/java/eu/faircode/email/ActivityBase.java index 522b1b92a6..07d09c4c85 100644 --- a/app/src/main/java/eu/faircode/email/ActivityBase.java +++ b/app/src/main/java/eu/faircode/email/ActivityBase.java @@ -28,6 +28,7 @@ import android.content.SharedPreferences; import android.content.res.Configuration; import android.os.Build; import android.os.Bundle; +import android.os.Handler; import android.os.PowerManager; import android.text.TextUtils; import android.view.KeyEvent; @@ -513,6 +514,10 @@ abstract class ActivityBase extends AppCompatActivity implements SharedPreferenc return super.shouldUpRecreateTask(targetIntent); } + Handler getMainHandler() { + return ApplicationEx.getMainHandler(); + } + public interface IKeyPressedListener { boolean onKeyPressed(KeyEvent event); diff --git a/app/src/main/java/eu/faircode/email/ActivityMain.java b/app/src/main/java/eu/faircode/email/ActivityMain.java index 0208f5f3b8..4ad66a4ad8 100644 --- a/app/src/main/java/eu/faircode/email/ActivityMain.java +++ b/app/src/main/java/eu/faircode/email/ActivityMain.java @@ -24,7 +24,6 @@ import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Configuration; import android.os.Bundle; -import android.os.Handler; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; @@ -62,7 +61,7 @@ public class ActivityMain extends ActivityBase implements FragmentManager.OnBack final SimpleTask boot = new SimpleTask() { @Override protected void onPreExecute(Bundle args) { - new Handler().postDelayed(new Runnable() { + getMainHandler().postDelayed(new Runnable() { @Override public void run() { getWindow().setBackgroundDrawableResource(R.drawable.splash); @@ -102,7 +101,7 @@ public class ActivityMain extends ActivityBase implements FragmentManager.OnBack startActivity(view); } - new Handler().postDelayed(new Runnable() { + getMainHandler().postDelayed(new Runnable() { @Override public void run() { ServiceSynchronize.eval(ActivityMain.this, "main"); diff --git a/app/src/main/java/eu/faircode/email/ActivityView.java b/app/src/main/java/eu/faircode/email/ActivityView.java index 5a2b604595..f3bf29f7e4 100644 --- a/app/src/main/java/eu/faircode/email/ActivityView.java +++ b/app/src/main/java/eu/faircode/email/ActivityView.java @@ -35,7 +35,6 @@ import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; -import android.os.Handler; import android.text.TextUtils; import android.util.DisplayMetrics; import android.util.TypedValue; @@ -332,7 +331,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB ibExpanderExtra.setImageLevel(minimal ? 1 /* more */ : 0 /* less */); rvMenuExtra.setVisibility(minimal ? View.GONE : View.VISIBLE); if (!minimal) - new Handler().post(new Runnable() { + getMainHandler().post(new Runnable() { @Override public void run() { drawerContainer.fullScroll(View.FOCUS_DOWN); @@ -676,7 +675,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB else { exit = true; ToastEx.makeText(this, R.string.app_exit, Toast.LENGTH_SHORT).show(); - new Handler().postDelayed(new Runnable() { + getMainHandler().postDelayed(new Runnable() { @Override public void run() { exit = false; @@ -773,7 +772,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB snackbar.show(); // Wait - new Handler().postDelayed(new Runnable() { + getMainHandler().postDelayed(new Runnable() { @Override public void run() { Log.i("Undo timeout"); diff --git a/app/src/main/java/eu/faircode/email/AdapterFolder.java b/app/src/main/java/eu/faircode/email/AdapterFolder.java index 9c0d030f8e..7d301d7e08 100644 --- a/app/src/main/java/eu/faircode/email/AdapterFolder.java +++ b/app/src/main/java/eu/faircode/email/AdapterFolder.java @@ -32,7 +32,6 @@ import android.graphics.Color; import android.graphics.Typeface; import android.os.Build; import android.os.Bundle; -import android.os.Handler; import android.provider.Settings; import android.text.SpannableString; import android.text.TextUtils; @@ -972,7 +971,7 @@ public class AdapterFolder extends RecyclerView.Adapter data) { tvHost.setText(data.first); tvOwner.setText(data.second.name == null ? "?" : data.second.name); - new Handler().post(new Runnable() { + ApplicationEx.getMainHandler().post(new Runnable() { @Override public void run() { dview.scrollTo(0, tvOwner.getBottom()); diff --git a/app/src/main/java/eu/faircode/email/ApplicationEx.java b/app/src/main/java/eu/faircode/email/ApplicationEx.java index 0cef160b5e..d582e71bf8 100644 --- a/app/src/main/java/eu/faircode/email/ApplicationEx.java +++ b/app/src/main/java/eu/faircode/email/ApplicationEx.java @@ -32,6 +32,8 @@ import android.content.SharedPreferences; import android.content.res.Configuration; import android.graphics.Color; import android.os.Build; +import android.os.Handler; +import android.os.Looper; import android.util.Printer; import android.webkit.CookieManager; @@ -393,4 +395,12 @@ public class ApplicationEx extends Application { Helper.clearAuthentication(ApplicationEx.this); } }; + + private static Handler handler = null; + + synchronized static Handler getMainHandler() { + if (handler == null) + handler = new Handler(Looper.getMainLooper()); + return handler; + } } diff --git a/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java b/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java index c486801b63..46f373bab3 100644 --- a/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java +++ b/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java @@ -21,8 +21,6 @@ package eu.faircode.email; import android.content.Context; import android.content.SharedPreferences; -import android.os.Handler; -import android.os.Looper; import android.text.TextUtils; import androidx.annotation.NonNull; @@ -87,8 +85,6 @@ public class BoundaryCallbackMessages extends PagedList.BoundaryCallback>() { @Override public void onChanged(List ids) { - new Handler().post(new Runnable() { + getMainHandler().post(new Runnable() { @Override public void run() { selectionTracker.clearSelection(); diff --git a/app/src/main/java/eu/faircode/email/FragmentOAuth.java b/app/src/main/java/eu/faircode/email/FragmentOAuth.java index 7e8082db2c..f2e886afb8 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOAuth.java +++ b/app/src/main/java/eu/faircode/email/FragmentOAuth.java @@ -28,7 +28,6 @@ import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; import android.os.Bundle; -import android.os.Handler; import android.text.TextUtils; import android.util.Base64; import android.util.Pair; @@ -641,7 +640,7 @@ public class FragmentOAuth extends FragmentBase { btnOAuth.setEnabled(true); pbOAuth.setVisibility(View.GONE); - new Handler().post(new Runnable() { + getMainHandler().post(new Runnable() { @Override public void run() { scroll.smoothScrollTo(0, tvError.getBottom()); diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsPrivacy.java b/app/src/main/java/eu/faircode/email/FragmentOptionsPrivacy.java index 74d9881732..f0310a2fa6 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptionsPrivacy.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptionsPrivacy.java @@ -27,7 +27,6 @@ import android.content.SharedPreferences; import android.net.Uri; import android.os.Build; import android.os.Bundle; -import android.os.Handler; import android.text.TextUtils; import android.view.KeyEvent; import android.view.LayoutInflater; @@ -445,14 +444,7 @@ public class FragmentOptionsPrivacy extends FragmentBase implements SharedPrefer } }); - new Handler().post(new Runnable() { - @Override - public void run() { - etPin.requestFocus(); - } - }); - - new Handler().post(new Runnable() { + ApplicationEx.getMainHandler().post(new Runnable() { @Override public void run() { etPin.requestFocus(); diff --git a/app/src/main/java/eu/faircode/email/FragmentPop.java b/app/src/main/java/eu/faircode/email/FragmentPop.java index 7155e2dc32..0d4a22391f 100644 --- a/app/src/main/java/eu/faircode/email/FragmentPop.java +++ b/app/src/main/java/eu/faircode/email/FragmentPop.java @@ -26,7 +26,6 @@ import android.graphics.Color; import android.net.Uri; import android.os.Build; import android.os.Bundle; -import android.os.Handler; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; @@ -549,7 +548,7 @@ public class FragmentPop extends FragmentBase { tvError.setText(Log.formatThrowable(ex, false)); grpError.setVisibility(View.VISIBLE); - new Handler().post(new Runnable() { + getMainHandler().post(new Runnable() { @Override public void run() { scroll.smoothScrollTo(0, tvError.getBottom()); diff --git a/app/src/main/java/eu/faircode/email/FragmentQuickSetup.java b/app/src/main/java/eu/faircode/email/FragmentQuickSetup.java index 31498a40a0..04b0fe3b48 100644 --- a/app/src/main/java/eu/faircode/email/FragmentQuickSetup.java +++ b/app/src/main/java/eu/faircode/email/FragmentQuickSetup.java @@ -25,7 +25,6 @@ import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; import android.os.Bundle; -import android.os.Handler; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; @@ -486,7 +485,7 @@ public class FragmentQuickSetup extends FragmentBase { tvError.setText(ex.getMessage()); grpError.setVisibility(View.VISIBLE); - new Handler().post(new Runnable() { + getMainHandler().post(new Runnable() { @Override public void run() { scroll.smoothScrollTo(0, tvErrorHint.getBottom()); @@ -509,7 +508,7 @@ public class FragmentQuickSetup extends FragmentBase { tvInstructions.setVisibility(View.VISIBLE); } - new Handler().post(new Runnable() { + getMainHandler().post(new Runnable() { @Override public void run() { if (args.containsKey("documentation")) diff --git a/app/src/main/java/eu/faircode/email/FragmentRule.java b/app/src/main/java/eu/faircode/email/FragmentRule.java index 4899809a37..50610f676e 100644 --- a/app/src/main/java/eu/faircode/email/FragmentRule.java +++ b/app/src/main/java/eu/faircode/email/FragmentRule.java @@ -27,7 +27,6 @@ import android.database.Cursor; import android.graphics.Color; import android.net.Uri; import android.os.Bundle; -import android.os.Handler; import android.provider.ContactsContract; import android.speech.tts.TextToSpeech; import android.text.TextUtils; @@ -419,7 +418,7 @@ public class FragmentRule extends FragmentBase { private void onActionSelected(int type) { showActionParameters(type); - new Handler().post(new Runnable() { + getMainHandler().post(new Runnable() { @Override public void run() { scroll.smoothScrollTo(0, content.getBottom()); diff --git a/app/src/main/java/eu/faircode/email/Helper.java b/app/src/main/java/eu/faircode/email/Helper.java index 04bb98dea7..1cc42df13a 100644 --- a/app/src/main/java/eu/faircode/email/Helper.java +++ b/app/src/main/java/eu/faircode/email/Helper.java @@ -40,9 +40,7 @@ import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Environment; -import android.os.Handler; import android.os.LocaleList; -import android.os.Looper; import android.os.Parcel; import android.os.PowerManager; import android.os.StatFs; @@ -1258,8 +1256,6 @@ public class Helper { static void authenticate(final FragmentActivity activity, final LifecycleOwner owner, Boolean enabled, final Runnable authenticated, final Runnable cancelled) { - final Handler handler = new Handler(); - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity); String pin = prefs.getString("pin", null); @@ -1289,7 +1285,7 @@ public class Helper { if (errorCode != BiometricPrompt.ERROR_NEGATIVE_BUTTON && errorCode != BiometricPrompt.ERROR_CANCELED && errorCode != BiometricPrompt.ERROR_USER_CANCELED) - handler.post(new Runnable() { + ApplicationEx.getMainHandler().post(new Runnable() { @Override public void run() { ToastEx.makeText(activity, @@ -1298,20 +1294,20 @@ public class Helper { } }); - handler.post(cancelled); + ApplicationEx.getMainHandler().post(cancelled); } @Override public void onAuthenticationSucceeded(@NonNull BiometricPrompt.AuthenticationResult result) { Log.i("Biometric succeeded"); setAuthenticated(activity); - handler.post(authenticated); + ApplicationEx.getMainHandler().post(authenticated); } @Override public void onAuthenticationFailed() { Log.w("Biometric failed"); - handler.post(cancelled); + ApplicationEx.getMainHandler().post(cancelled); } }); @@ -1328,12 +1324,12 @@ public class Helper { } }; - handler.postDelayed(cancelPrompt, 60 * 1000L); + ApplicationEx.getMainHandler().postDelayed(cancelPrompt, 60 * 1000L); owner.getLifecycle().addObserver(new LifecycleObserver() { @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) public void onDestroy() { - handler.post(cancelPrompt); + ApplicationEx.getMainHandler().post(cancelPrompt); } }); @@ -1352,21 +1348,21 @@ public class Helper { if (pin.equals(entered)) { setAuthenticated(activity); - handler.post(authenticated); + ApplicationEx.getMainHandler().post(authenticated); } else - handler.post(cancelled); + ApplicationEx.getMainHandler().post(cancelled); } }) .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - handler.post(cancelled); + ApplicationEx.getMainHandler().post(cancelled); } }) .setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { - handler.post(cancelled); + ApplicationEx.getMainHandler().post(cancelled); } }) .create(); @@ -1390,7 +1386,7 @@ public class Helper { } }); - new Handler().post(new Runnable() { + ApplicationEx.getMainHandler().post(new Runnable() { @Override public void run() { etPin.requestFocus(); @@ -1413,8 +1409,6 @@ public class Helper { static void selectKeyAlias(final Activity activity, final LifecycleOwner owner, final String alias, final IKeyAlias intf) { final Context context = activity.getApplicationContext(); - final Handler handler = new Handler(Looper.getMainLooper()); - new Thread(new Runnable() { @Override public void run() { @@ -1431,7 +1425,7 @@ public class Helper { Log.e(ex); } - handler.post(new Runnable() { + ApplicationEx.getMainHandler().post(new Runnable() { @Override public void run() { KeyChain.choosePrivateKeyAlias(activity, new KeyChainAliasCallback() { @@ -1447,7 +1441,7 @@ public class Helper { } private void deliver(final String selected) { - handler.post(new Runnable() { + ApplicationEx.getMainHandler().post(new Runnable() { @Override public void run() { if (owner.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) { diff --git a/app/src/main/java/eu/faircode/email/ServiceBase.java b/app/src/main/java/eu/faircode/email/ServiceBase.java index de163aceec..75d36f5c0c 100644 --- a/app/src/main/java/eu/faircode/email/ServiceBase.java +++ b/app/src/main/java/eu/faircode/email/ServiceBase.java @@ -21,6 +21,7 @@ package eu.faircode.email; import android.content.Intent; import android.os.Bundle; +import android.os.Handler; import androidx.lifecycle.LifecycleService; @@ -62,4 +63,8 @@ abstract class ServiceBase extends LifecycleService { super.onDestroy(); } + + Handler getMainHandler() { + return ApplicationEx.getMainHandler(); + } } diff --git a/app/src/main/java/eu/faircode/email/ServiceSend.java b/app/src/main/java/eu/faircode/email/ServiceSend.java index 8df52718fb..3c9612c5cc 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSend.java +++ b/app/src/main/java/eu/faircode/email/ServiceSend.java @@ -31,7 +31,6 @@ import android.net.ConnectivityManager; import android.net.Network; import android.net.NetworkCapabilities; import android.net.NetworkRequest; -import android.os.Handler; import android.os.PowerManager; import android.text.TextUtils; @@ -70,7 +69,6 @@ public class ServiceSend extends ServiceBase implements SharedPreferences.OnShar private Network lastActive = null; private boolean lastSuitable = false; - private Handler handler; private PowerManager.WakeLock wlOutbox; private TwoStateOwner owner = new TwoStateOwner("send"); private List handling = new ArrayList<>(); @@ -88,8 +86,6 @@ public class ServiceSend extends ServiceBase implements SharedPreferences.OnShar super.onCreate(); startForeground(Helper.NOTIFICATION_SEND, getNotificationService().build()); - handler = new Handler(); - PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); wlOutbox = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, BuildConfig.APPLICATION_ID + ":send"); @@ -175,7 +171,7 @@ public class ServiceSend extends ServiceBase implements SharedPreferences.OnShar ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); cm.unregisterNetworkCallback(networkCallback); - handler.removeCallbacks(_checkConnectivity); + getMainHandler().removeCallbacks(_checkConnectivity); owner.stop(); handling.clear(); @@ -284,7 +280,7 @@ public class ServiceSend extends ServiceBase implements SharedPreferences.OnShar }; private void checkConnectivity() { - handler.postDelayed(_checkConnectivity, CONNECTIVITY_DELAY); + getMainHandler().postDelayed(_checkConnectivity, CONNECTIVITY_DELAY); } private Runnable _checkConnectivity = new Runnable() { diff --git a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java index b3a27dcd43..cd8e57763b 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java +++ b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java @@ -35,7 +35,6 @@ import android.net.NetworkInfo; import android.net.NetworkRequest; import android.os.Build; import android.os.Bundle; -import android.os.Handler; import android.os.PowerManager; import android.service.notification.StatusBarNotification; import android.text.TextUtils; @@ -901,7 +900,6 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences state.reset(); Log.i(account.name + " run thread=" + currentThread); - Handler handler = new Handler(getMainLooper()); final List cowners = new ArrayList<>(); // Debug @@ -1210,7 +1208,7 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences mapFolders.put(folder, null); Log.d(folder.name + " observing"); - handler.post(new Runnable() { + getMainHandler().post(new Runnable() { @Override public void run() { TwoStateOwner cowner = new TwoStateOwner(ServiceSynchronize.this, folder.name); @@ -1576,7 +1574,7 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences db.account().setAccountState(account.id, "closing"); // Stop watching for operations - handler.post(new Runnable() { + getMainHandler().post(new Runnable() { @Override public void run() { for (TwoStateOwner owner : cowners) diff --git a/app/src/main/java/eu/faircode/email/SimpleTask.java b/app/src/main/java/eu/faircode/email/SimpleTask.java index e9e68260a8..4fd58e1a20 100644 --- a/app/src/main/java/eu/faircode/email/SimpleTask.java +++ b/app/src/main/java/eu/faircode/email/SimpleTask.java @@ -23,8 +23,6 @@ import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; -import android.os.Handler; -import android.os.Looper; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; @@ -94,8 +92,6 @@ public abstract class SimpleTask implements LifecycleObserver { } private void run(final Context context, final LifecycleOwner owner, final Bundle args, final String name) { - final Handler handler = new Handler(Looper.getMainLooper()); - this.name = name; if (owner instanceof TwoStateOwner) @@ -148,7 +144,7 @@ public abstract class SimpleTask implements LifecycleObserver { } // Run on UI thread - handler.post(new Runnable() { + ApplicationEx.getMainHandler().post(new Runnable() { @Override public void run() { Lifecycle.State state = owner.getLifecycle().getCurrentState();