diff --git a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java index 1f2808bed..625f514e9 100644 --- a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java +++ b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java @@ -17,8 +17,11 @@ import android.util.Log; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; -import org.json.JSONException; -import org.json.JSONObject; +import com.grack.nanojson.JsonObject; +import com.grack.nanojson.JsonParser; +import com.grack.nanojson.JsonParserException; + +import org.schabi.newpipe.extractor.exceptions.ReCaptchaException; import org.schabi.newpipe.report.ErrorActivity; import org.schabi.newpipe.report.UserAction; @@ -31,11 +34,6 @@ import java.security.cert.CertificateEncodingException; import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; -import java.util.concurrent.TimeUnit; - -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.Response; /** * AsyncTask to check if there is a newer version of the NewPipe github apk available or not. @@ -45,14 +43,11 @@ import okhttp3.Response; public class CheckForNewAppVersionTask extends AsyncTask { private static final boolean DEBUG = MainActivity.DEBUG; private static final String TAG = CheckForNewAppVersionTask.class.getSimpleName(); + private static final Application APP = App.getApp(); private static final String GITHUB_APK_SHA1 = "B0:2E:90:7C:1C:D6:FC:57:C3:35:F0:88:D0:8F:50:5F:94:E4:D2:15"; private static final String NEWPIPE_API_URL = "https://newpipe.schabi.org/api/data.json"; - private static final int TIMEOUT_PERIOD = 30; - - private SharedPreferences mPrefs; - private OkHttpClient client; /** * Method to get the apk's SHA1 key. See https://stackoverflow.com/questions/9293019/#22506133. @@ -60,31 +55,30 @@ public class CheckForNewAppVersionTask extends AsyncTask { * @return String with the apk's SHA1 fingeprint in hexadecimal */ private static String getCertificateSHA1Fingerprint() { - PackageManager pm = APP.getPackageManager(); - String packageName = APP.getPackageName(); - int flags = PackageManager.GET_SIGNATURES; + final PackageManager pm = APP.getPackageManager(); + final String packageName = APP.getPackageName(); + final int flags = PackageManager.GET_SIGNATURES; PackageInfo packageInfo = null; try { packageInfo = pm.getPackageInfo(packageName, flags); - } catch (PackageManager.NameNotFoundException ex) { - ErrorActivity.reportError(APP, ex, null, null, + } catch (PackageManager.NameNotFoundException e) { + ErrorActivity.reportError(APP, e, null, null, ErrorActivity.ErrorInfo.make(UserAction.SOMETHING_ELSE, "none", "Could not find package info", R.string.app_ui_crash)); } - Signature[] signatures = packageInfo.signatures; - byte[] cert = signatures[0].toByteArray(); - InputStream input = new ByteArrayInputStream(cert); + final Signature[] signatures = packageInfo.signatures; + final byte[] cert = signatures[0].toByteArray(); + final InputStream input = new ByteArrayInputStream(cert); - CertificateFactory cf = null; X509Certificate c = null; try { - cf = CertificateFactory.getInstance("X509"); + final CertificateFactory cf = CertificateFactory.getInstance("X509"); c = (X509Certificate) cf.generateCertificate(input); - } catch (CertificateException ex) { - ErrorActivity.reportError(APP, ex, null, null, + } catch (CertificateException e) { + ErrorActivity.reportError(APP, e, null, null, ErrorActivity.ErrorInfo.make(UserAction.SOMETHING_ELSE, "none", "Certificate error", R.string.app_ui_crash)); } @@ -93,14 +87,10 @@ public class CheckForNewAppVersionTask extends AsyncTask { try { MessageDigest md = MessageDigest.getInstance("SHA1"); - byte[] publicKey = md.digest(c.getEncoded()); + final byte[] publicKey = md.digest(c.getEncoded()); hexString = byte2HexFormatted(publicKey); - } catch (NoSuchAlgorithmException ex1) { - ErrorActivity.reportError(APP, ex1, null, null, - ErrorActivity.ErrorInfo.make(UserAction.SOMETHING_ELSE, "none", - "Could not retrieve SHA1 key", R.string.app_ui_crash)); - } catch (CertificateEncodingException ex2) { - ErrorActivity.reportError(APP, ex2, null, null, + } catch (NoSuchAlgorithmException | CertificateEncodingException e) { + ErrorActivity.reportError(APP, e, null, null, ErrorActivity.ErrorInfo.make(UserAction.SOMETHING_ELSE, "none", "Could not retrieve SHA1 key", R.string.app_ui_crash)); } @@ -109,11 +99,11 @@ public class CheckForNewAppVersionTask extends AsyncTask { } private static String byte2HexFormatted(final byte[] arr) { - StringBuilder str = new StringBuilder(arr.length * 2); + final StringBuilder str = new StringBuilder(arr.length * 2); for (int i = 0; i < arr.length; i++) { String h = Integer.toHexString(arr[i]); - int l = h.length(); + final int l = h.length(); if (l == 1) { h = "0" + h; } @@ -134,11 +124,11 @@ public class CheckForNewAppVersionTask extends AsyncTask { @Override protected void onPreExecute() { - mPrefs = PreferenceManager.getDefaultSharedPreferences(APP); + final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(APP); - // Check if user has enabled/ disabled update checking + // Check if user has enabled/disabled update checking // and if the current apk is a github one or not. - if (!mPrefs.getBoolean(APP.getString(R.string.update_app_key), true) || !isGithubApk()) { + if (!prefs.getBoolean(APP.getString(R.string.update_app_key), true) || !isGithubApk()) { this.cancel(true); } } @@ -150,22 +140,12 @@ public class CheckForNewAppVersionTask extends AsyncTask { } // Make a network request to get latest NewPipe data. - // FIXME: Use DownloaderImp - if (client == null) { - - client = new OkHttpClient.Builder() - .readTimeout(TIMEOUT_PERIOD, TimeUnit.SECONDS).build(); - } - - Request request = new Request.Builder().url(NEWPIPE_API_URL).build(); - try { - Response response = client.newCall(request).execute(); - return response.body().string(); - } catch (IOException ex) { + return DownloaderImpl.getInstance().get(NEWPIPE_API_URL).responseBody(); + } catch (IOException | ReCaptchaException e) { // connectivity problems, do not alarm user and fail silently if (DEBUG) { - Log.w(TAG, Log.getStackTraceString(ex)); + Log.w(TAG, Log.getStackTraceString(e)); } } @@ -178,21 +158,19 @@ public class CheckForNewAppVersionTask extends AsyncTask { if (response != null) { try { - JSONObject mainObject = new JSONObject(response); - JSONObject flavoursObject = mainObject.getJSONObject("flavors"); - JSONObject githubObject = flavoursObject.getJSONObject("github"); - JSONObject githubStableObject = githubObject.getJSONObject("stable"); + final JsonObject githubStableObject = JsonParser.object().from(response) + .getObject("flavors").getObject("github").getObject("stable"); - String versionName = githubStableObject.getString("version"); - String versionCode = githubStableObject.getString("version_code"); - String apkLocationUrl = githubStableObject.getString("apk"); + final String versionName = githubStableObject.getString("version"); + final int versionCode = githubStableObject.getInt("version_code"); + final String apkLocationUrl = githubStableObject.getString("apk"); compareAppVersionAndShowNotification(versionName, apkLocationUrl, versionCode); - } catch (JSONException ex) { + } catch (JsonParserException e) { // connectivity problems, do not alarm user and fail silently if (DEBUG) { - Log.w(TAG, Log.getStackTraceString(ex)); + Log.w(TAG, Log.getStackTraceString(e)); } } } @@ -208,17 +186,17 @@ public class CheckForNewAppVersionTask extends AsyncTask { */ private void compareAppVersionAndShowNotification(final String versionName, final String apkLocationUrl, - final String versionCode) { + final int versionCode) { int notificationId = 2000; - if (BuildConfig.VERSION_CODE < Integer.valueOf(versionCode)) { + if (BuildConfig.VERSION_CODE < versionCode) { // A pending intent to open the apk location url in the browser. - Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(apkLocationUrl)); - PendingIntent pendingIntent + final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(apkLocationUrl)); + final PendingIntent pendingIntent = PendingIntent.getActivity(APP, 0, intent, 0); - NotificationCompat.Builder notificationBuilder = new NotificationCompat + final NotificationCompat.Builder notificationBuilder = new NotificationCompat .Builder(APP, APP.getString(R.string.app_update_notification_channel_id)) .setSmallIcon(R.drawable.ic_newpipe_update) .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) @@ -228,13 +206,14 @@ public class CheckForNewAppVersionTask extends AsyncTask { .setContentText(APP.getString(R.string.app_update_notification_content_text) + " " + versionName); - NotificationManagerCompat notificationManager = NotificationManagerCompat.from(APP); + final NotificationManagerCompat notificationManager + = NotificationManagerCompat.from(APP); notificationManager.notify(notificationId, notificationBuilder.build()); } } private boolean isConnected() { - ConnectivityManager cm = + final ConnectivityManager cm = (ConnectivityManager) APP.getSystemService(Context.CONNECTIVITY_SERVICE); return cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isConnected();