From ff915f18133b97abed6b5e2641980e7e5924af94 Mon Sep 17 00:00:00 2001 From: opyale Date: Wed, 3 Mar 2021 15:10:23 +0100 Subject: [PATCH] Make singletons threadsafe. (#838) Merge branch 'master' into threadsafe-singletons Make singletons threadsafe. Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/838 Reviewed-by: M M Arif Co-Authored-By: opyale Co-Committed-By: opyale --- .../gitnex/activities/CreateFileActivity.java | 2 +- .../mian/gitnex/activities/LoginActivity.java | 2 +- .../mian/gitnex/clients/PicassoService.java | 21 ++++++++------ .../mian/gitnex/clients/RetrofitClient.java | 28 ++++++++++++------- .../java/org/mian/gitnex/helpers/AppUtil.java | 2 +- .../gitnex/helpers/NetworkStatusObserver.java | 12 ++++++-- .../java/org/mian/gitnex/helpers/TinyDB.java | 10 +++++-- 7 files changed, 51 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/org/mian/gitnex/activities/CreateFileActivity.java b/app/src/main/java/org/mian/gitnex/activities/CreateFileActivity.java index 92753d71..f8cf0c8f 100644 --- a/app/src/main/java/org/mian/gitnex/activities/CreateFileActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/CreateFileActivity.java @@ -150,7 +150,7 @@ public class CreateFileActivity extends BaseActivity { disableProcessButton(); - NetworkStatusObserver networkStatusObserver = NetworkStatusObserver.get(ctx); + NetworkStatusObserver networkStatusObserver = NetworkStatusObserver.getInstance(ctx); networkStatusObserver.registerNetworkStatusListener(hasNetworkConnection -> newFileCreate.setEnabled(hasNetworkConnection)); newFileCreate.setOnClickListener(createFileListener); diff --git a/app/src/main/java/org/mian/gitnex/activities/LoginActivity.java b/app/src/main/java/org/mian/gitnex/activities/LoginActivity.java index 5e4a29cb..4c3698cd 100644 --- a/app/src/main/java/org/mian/gitnex/activities/LoginActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/LoginActivity.java @@ -61,7 +61,7 @@ public class LoginActivity extends BaseActivity { ActivityLoginBinding activityLoginBinding = ActivityLoginBinding.inflate(getLayoutInflater()); setContentView(activityLoginBinding.getRoot()); - NetworkStatusObserver networkStatusObserver = NetworkStatusObserver.get(ctx); + NetworkStatusObserver networkStatusObserver = NetworkStatusObserver.getInstance(ctx); loginButton = activityLoginBinding.loginButton; instanceUrlET = activityLoginBinding.instanceUrl; diff --git a/app/src/main/java/org/mian/gitnex/clients/PicassoService.java b/app/src/main/java/org/mian/gitnex/clients/PicassoService.java index aa1cd7f8..9374da6d 100644 --- a/app/src/main/java/org/mian/gitnex/clients/PicassoService.java +++ b/app/src/main/java/org/mian/gitnex/clients/PicassoService.java @@ -19,7 +19,7 @@ import okhttp3.OkHttpClient; public class PicassoService { - private static PicassoService picassoService; + private static volatile PicassoService picassoService; private final File cachePath; private Picasso picasso; @@ -40,12 +40,12 @@ public class PicassoService { .hostnameVerifier(memorizingTrustManager.wrapHostnameVerifier(HttpsURLConnection.getDefaultHostnameVerifier())); builder.downloader(new OkHttp3Downloader(okHttpClient.build())); - builder.listener((picasso, uri, exception) -> { - - //Log.e("PicassoService", Objects.requireNonNull(uri.toString())); - //Log.e("PicassoService", exception.toString()); - - }); +// builder.listener((picasso, uri, exception) -> { +// +// Log.e("PicassoService", Objects.requireNonNull(uri.toString())); +// Log.e("PicassoService", exception.toString()); +// +// }); picasso = builder.memoryCache(new PicassoCache(cachePath, context)).build(); @@ -66,10 +66,15 @@ public class PicassoService { public static synchronized PicassoService getInstance(Context context) { if(picassoService == null) { - picassoService = new PicassoService(context); + synchronized(PicassoService.class) { + if(picassoService == null) { + picassoService = new PicassoService(context); + } + } } return picassoService; + } } diff --git a/app/src/main/java/org/mian/gitnex/clients/RetrofitClient.java b/app/src/main/java/org/mian/gitnex/clients/RetrofitClient.java index b30ad5d2..d7772734 100644 --- a/app/src/main/java/org/mian/gitnex/clients/RetrofitClient.java +++ b/app/src/main/java/org/mian/gitnex/clients/RetrofitClient.java @@ -96,30 +96,38 @@ public class RetrofitClient { } public static ApiInterface getApiInterface(Context context, String url) { + if(!apiInterfaces.containsKey(url)) { + synchronized(RetrofitClient.class) { + if(!apiInterfaces.containsKey(url)) { - ApiInterface apiInterface = createRetrofit(context, url) - .create(ApiInterface.class); - - apiInterfaces.put(url, apiInterface); - return apiInterface; + ApiInterface apiInterface = createRetrofit(context, url).create(ApiInterface.class); + apiInterfaces.put(url, apiInterface); + return apiInterface; + } + } } return apiInterfaces.get(url); + } public static WebInterface getWebInterface(Context context, String url) { + if(!webInterfaces.containsKey(url)) { + synchronized(RetrofitClient.class) { + if(!webInterfaces.containsKey(url)) { - WebInterface webInterface = createRetrofit(context, url) - .create(WebInterface.class); - - webInterfaces.put(url, webInterface); - return webInterface; + WebInterface webInterface = createRetrofit(context, url).create(WebInterface.class); + webInterfaces.put(url, webInterface); + return webInterface; + } + } } return webInterfaces.get(url); + } } diff --git a/app/src/main/java/org/mian/gitnex/helpers/AppUtil.java b/app/src/main/java/org/mian/gitnex/helpers/AppUtil.java index 675f751c..d4ae2371 100644 --- a/app/src/main/java/org/mian/gitnex/helpers/AppUtil.java +++ b/app/src/main/java/org/mian/gitnex/helpers/AppUtil.java @@ -57,7 +57,7 @@ public class AppUtil { public static boolean hasNetworkConnection(Context context) { - return NetworkStatusObserver.get(context).hasNetworkConnection(); + return NetworkStatusObserver.getInstance(context).hasNetworkConnection(); } public static int getAppBuildNo(Context context) { diff --git a/app/src/main/java/org/mian/gitnex/helpers/NetworkStatusObserver.java b/app/src/main/java/org/mian/gitnex/helpers/NetworkStatusObserver.java index 5845be53..a3df356b 100644 --- a/app/src/main/java/org/mian/gitnex/helpers/NetworkStatusObserver.java +++ b/app/src/main/java/org/mian/gitnex/helpers/NetworkStatusObserver.java @@ -15,7 +15,7 @@ import java.util.concurrent.atomic.AtomicBoolean; */ public class NetworkStatusObserver { - private static NetworkStatusObserver networkStatusObserver; + private static volatile NetworkStatusObserver networkStatusObserver; private final AtomicBoolean hasNetworkConnection = new AtomicBoolean(false); private final List networkStatusListeners = new ArrayList<>(); @@ -98,12 +98,18 @@ public class NetworkStatusObserver { public interface NetworkStatusListener { void onNetworkStatusChanged(boolean hasNetworkConnection); } - public static NetworkStatusObserver get(Context context) { + public static NetworkStatusObserver getInstance(Context context) { + if(networkStatusObserver == null) { - networkStatusObserver = new NetworkStatusObserver(context); + synchronized(NetworkStatusObserver.class) { + if(networkStatusObserver == null) { + networkStatusObserver = new NetworkStatusObserver(context); + } + } } return networkStatusObserver; + } } diff --git a/app/src/main/java/org/mian/gitnex/helpers/TinyDB.java b/app/src/main/java/org/mian/gitnex/helpers/TinyDB.java index b93962b3..92441fc8 100644 --- a/app/src/main/java/org/mian/gitnex/helpers/TinyDB.java +++ b/app/src/main/java/org/mian/gitnex/helpers/TinyDB.java @@ -15,7 +15,7 @@ import java.util.Map; public class TinyDB { - private static TinyDB tinyDB; + private static volatile TinyDB tinyDB; private final SharedPreferences preferences; @@ -24,11 +24,17 @@ public class TinyDB { } public static synchronized TinyDB getInstance(Context context) { + if(tinyDB == null) { - tinyDB = new TinyDB(context); + synchronized(TinyDB.class) { + if(tinyDB == null) { + tinyDB = new TinyDB(context); + } + } } return tinyDB; + } /**