Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use DownloaderImpl in CheckForNewAppVersionTask #3344

Merged
merged 2 commits into from
Apr 4, 2020
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
107 changes: 43 additions & 64 deletions app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,11 @@
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;

Expand All @@ -31,11 +34,6 @@
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.
Expand All @@ -45,46 +43,42 @@
public class CheckForNewAppVersionTask extends AsyncTask<Void, Void, String> {
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.
*
* @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));
}
Expand All @@ -93,14 +87,10 @@ private static String getCertificateSHA1Fingerprint() {

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));
}
Expand All @@ -109,11 +99,11 @@ private static String getCertificateSHA1Fingerprint() {
}

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;
}
Expand All @@ -134,11 +124,11 @@ public static boolean isGithubApk() {

@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);
}
}
Expand All @@ -150,22 +140,12 @@ protected String doInBackground(final Void... voids) {
}

// 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));
}
}

Expand All @@ -178,21 +158,19 @@ protected void onPostExecute(final String response) {
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));
}
}
}
Expand All @@ -208,17 +186,17 @@ protected void onPostExecute(final String response) {
*/
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)
Expand All @@ -228,13 +206,14 @@ private void compareAppVersionAndShowNotification(final String versionName,
.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();
Expand Down