Merge pull request #7296 from vhouriet/vhouriet_feature_issue6049

Add "Check for updates" button in update settings
This commit is contained in:
litetex 2021-11-01 23:17:25 +01:00 committed by GitHub
commit c0f7b123a3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 82 additions and 58 deletions

View File

@ -7,7 +7,6 @@ import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.Signature; import android.content.pm.Signature;
import android.net.ConnectivityManager;
import android.net.Uri; import android.net.Uri;
import android.util.Log; import android.util.Log;
@ -15,7 +14,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat; import androidx.core.app.NotificationManagerCompat;
import androidx.core.content.ContextCompat;
import androidx.core.content.pm.PackageInfoCompat; import androidx.core.content.pm.PackageInfoCompat;
import androidx.preference.PreferenceManager; import androidx.preference.PreferenceManager;
@ -48,7 +46,8 @@ public final class CheckForNewAppVersion extends IntentService {
private static final boolean DEBUG = MainActivity.DEBUG; private static final boolean DEBUG = MainActivity.DEBUG;
private static final String TAG = CheckForNewAppVersion.class.getSimpleName(); private static final String TAG = CheckForNewAppVersion.class.getSimpleName();
private static final String GITHUB_APK_SHA1 // Public key of the certificate that is used in NewPipe release versions
private static final String RELEASE_CERT_PUBLIC_KEY_SHA1
= "B0:2E:90:7C:1C:D6:FC:57:C3:35:F0:88:D0:8F:50:5F:94:E4:D2:15"; = "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.net/api/data.json"; private static final String NEWPIPE_API_URL = "https://newpipe.net/api/data.json";
@ -129,44 +128,37 @@ public final class CheckForNewAppVersion extends IntentService {
final String versionName, final String versionName,
final String apkLocationUrl, final String apkLocationUrl,
final int versionCode) { final int versionCode) {
final int notificationId = 2000; if (BuildConfig.VERSION_CODE >= versionCode) {
return;
if (BuildConfig.VERSION_CODE < versionCode) {
// A pending intent to open the apk location url in the browser.
final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(apkLocationUrl));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
final PendingIntent pendingIntent
= PendingIntent.getActivity(application, 0, intent, 0);
final String channelId = application
.getString(R.string.app_update_notification_channel_id);
final NotificationCompat.Builder notificationBuilder
= new NotificationCompat.Builder(application, channelId)
.setSmallIcon(R.drawable.ic_newpipe_update)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setContentIntent(pendingIntent)
.setAutoCancel(true)
.setContentTitle(application
.getString(R.string.app_update_notification_content_title))
.setContentText(application
.getString(R.string.app_update_notification_content_text)
+ " " + versionName);
final NotificationManagerCompat notificationManager
= NotificationManagerCompat.from(application);
notificationManager.notify(notificationId, notificationBuilder.build());
} }
// A pending intent to open the apk location url in the browser.
final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(apkLocationUrl));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
final PendingIntent pendingIntent
= PendingIntent.getActivity(application, 0, intent, 0);
final String channelId = application
.getString(R.string.app_update_notification_channel_id);
final NotificationCompat.Builder notificationBuilder
= new NotificationCompat.Builder(application, channelId)
.setSmallIcon(R.drawable.ic_newpipe_update)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setContentIntent(pendingIntent)
.setAutoCancel(true)
.setContentTitle(application
.getString(R.string.app_update_notification_content_title))
.setContentText(application
.getString(R.string.app_update_notification_content_text)
+ " " + versionName);
final NotificationManagerCompat notificationManager
= NotificationManagerCompat.from(application);
notificationManager.notify(2000, notificationBuilder.build());
} }
private static boolean isConnected(@NonNull final App app) { public static boolean isReleaseApk(@NonNull final App app) {
final ConnectivityManager connectivityManager = return getCertificateSHA1Fingerprint(app).equals(RELEASE_CERT_PUBLIC_KEY_SHA1);
ContextCompat.getSystemService(app, ConnectivityManager.class);
return connectivityManager != null && connectivityManager.getActiveNetworkInfo() != null
&& connectivityManager.getActiveNetworkInfo().isConnected();
}
public static boolean isGithubApk(@NonNull final App app) {
return getCertificateSHA1Fingerprint(app).equals(GITHUB_APK_SHA1);
} }
private void checkNewVersion() throws IOException, ReCaptchaException { private void checkNewVersion() throws IOException, ReCaptchaException {
@ -175,9 +167,8 @@ public final class CheckForNewAppVersion extends IntentService {
final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(app); final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(app);
final NewVersionManager manager = new NewVersionManager(); final NewVersionManager manager = new NewVersionManager();
// Check if user has enabled/disabled update checking // Check if the current apk is a github one or not.
// and if the current apk is a github one or not. if (!isReleaseApk(app)) {
if (!prefs.getBoolean(app.getString(R.string.update_app_key), true) || !isGithubApk(app)) {
return; return;
} }
@ -213,6 +204,7 @@ public final class CheckForNewAppVersion extends IntentService {
// Parse the json from the response. // Parse the json from the response.
try { try {
final JsonObject githubStableObject = JsonParser.object() final JsonObject githubStableObject = JsonParser.object()
.from(response.responseBody()).getObject("flavors") .from(response.responseBody()).getObject("flavors")
.getObject("github").getObject("stable"); .getObject("github").getObject("stable");

View File

@ -169,10 +169,16 @@ public class MainActivity extends AppCompatActivity {
@Override @Override
protected void onPostCreate(final Bundle savedInstanceState) { protected void onPostCreate(final Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState); super.onPostCreate(savedInstanceState);
// Start the service which is checking all conditions
// and eventually searching for a new version. final App app = App.getApp();
// The service searching for a new NewPipe version must not be started in background. final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(app);
startNewVersionCheckService();
if (prefs.getBoolean(app.getString(R.string.update_app_key), true)) {
// Start the service which is checking all conditions
// and eventually searching for a new version.
// The service searching for a new NewPipe version must not be started in background.
startNewVersionCheckService();
}
} }
private void setupDrawer() throws ExtractionException { private void setupDrawer() throws ExtractionException {

View File

@ -16,8 +16,9 @@ public class MainSettingsFragment extends BasePreferenceFragment {
public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {
addPreferencesFromResource(R.xml.main_settings); addPreferencesFromResource(R.xml.main_settings);
if (!CheckForNewAppVersion.isGithubApk(App.getApp())) { if (!CheckForNewAppVersion.isReleaseApk(App.getApp())) {
final Preference update = findPreference(getString(R.string.update_pref_screen_key)); final Preference update
= findPreference(getString(R.string.update_pref_screen_key));
getPreferenceScreen().removePreference(update); getPreferenceScreen().removePreference(update);
defaultPreferences.edit().putBoolean(getString(R.string.update_app_key), false).apply(); defaultPreferences.edit().putBoolean(getString(R.string.update_app_key), false).apply();

View File

@ -1,34 +1,48 @@
package org.schabi.newpipe.settings; package org.schabi.newpipe.settings;
import static org.schabi.newpipe.CheckForNewAppVersion.startNewVersionCheckService;
import android.os.Bundle; import android.os.Bundle;
import android.widget.Toast;
import androidx.preference.Preference; import androidx.preference.Preference;
import org.schabi.newpipe.R; import org.schabi.newpipe.R;
import static org.schabi.newpipe.CheckForNewAppVersion.startNewVersionCheckService;
public class UpdateSettingsFragment extends BasePreferenceFragment { public class UpdateSettingsFragment extends BasePreferenceFragment {
private final Preference.OnPreferenceChangeListener updatePreferenceChange private final Preference.OnPreferenceChangeListener updatePreferenceChange
= (preference, checkForUpdates) -> { = (preference, checkForUpdates) -> {
defaultPreferences.edit() defaultPreferences.edit()
.putBoolean(getString(R.string.update_app_key), (boolean) checkForUpdates).apply(); .putBoolean(getString(R.string.update_app_key), (boolean) checkForUpdates).apply();
if ((boolean) checkForUpdates) { if ((boolean) checkForUpdates) {
// Search for updates immediately when update checks are enabled. checkNewVersionNow();
// Reset the expire time. This is necessary to check for an update immediately. }
defaultPreferences.edit()
.putLong(getString(R.string.update_expiry_key), 0).apply();
startNewVersionCheckService();
}
return true; return true;
}; };
private final Preference.OnPreferenceClickListener manualUpdateClick
= preference -> {
Toast.makeText(getContext(), R.string.checking_updates_toast, Toast.LENGTH_SHORT).show();
checkNewVersionNow();
return true;
};
private void checkNewVersionNow() {
// Search for updates immediately when update checks are enabled.
// Reset the expire time. This is necessary to check for an update immediately.
defaultPreferences.edit()
.putLong(getString(R.string.update_expiry_key), 0).apply();
startNewVersionCheckService();
}
@Override @Override
public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {
addPreferencesFromResource(R.xml.update_settings); addPreferencesFromResource(R.xml.update_settings);
final String updateToggleKey = getString(R.string.update_app_key); findPreference(getString(R.string.update_app_key))
findPreference(updateToggleKey).setOnPreferenceChangeListener(updatePreferenceChange); .setOnPreferenceChangeListener(updatePreferenceChange);
findPreference(getString(R.string.manual_update_key))
.setOnPreferenceClickListener(manualUpdateClick);
} }
} }

View File

@ -383,6 +383,7 @@
<!-- Updates --> <!-- Updates -->
<string name="update_app_key" translatable="false">update_app_key</string> <string name="update_app_key" translatable="false">update_app_key</string>
<string name="manual_update_key">manual_update_key</string>
<string name="update_pref_screen_key" translatable="false">update_pref_screen_key</string> <string name="update_pref_screen_key" translatable="false">update_pref_screen_key</string>
<string name="update_expiry_key" translatable="false">update_expiry_key</string> <string name="update_expiry_key" translatable="false">update_expiry_key</string>

View File

@ -517,6 +517,8 @@
<!-- Updates Settings --> <!-- Updates Settings -->
<string name="updates_setting_title">Updates</string> <string name="updates_setting_title">Updates</string>
<string name="updates_setting_description">Show a notification to prompt app update when a new version is available</string> <string name="updates_setting_description">Show a notification to prompt app update when a new version is available</string>
<string name="manual_update_title">Check for updates</string>
<string name="manual_update_description">Manually check for new versions</string>
<!-- Minimize to exit action --> <!-- Minimize to exit action -->
<string name="minimize_on_exit_title">Minimize on app switch</string> <string name="minimize_on_exit_title">Minimize on app switch</string>
<string name="minimize_on_exit_summary">Action when switching to other app from main video player — %s</string> <string name="minimize_on_exit_summary">Action when switching to other app from main video player — %s</string>
@ -547,6 +549,7 @@
<string name="recovering">recovering</string> <string name="recovering">recovering</string>
<string name="enqueue">Queue</string> <string name="enqueue">Queue</string>
<string name="permission_denied">Action denied by the system</string> <string name="permission_denied">Action denied by the system</string>
<string name="checking_updates_toast">Checking for updates…</string>
<!-- download notifications --> <!-- download notifications -->
<string name="download_failed">Download failed</string> <string name="download_failed">Download failed</string>
<plurals name="download_finished_notification"> <plurals name="download_finished_notification">

View File

@ -12,4 +12,11 @@
app:singleLineTitle="false" app:singleLineTitle="false"
app:iconSpaceReserved="false" /> app:iconSpaceReserved="false" />
<Preference
android:key="@string/manual_update_key"
android:summary="@string/manual_update_description"
android:title="@string/manual_update_title"
app:singleLineTitle="false"
app:iconSpaceReserved="false" />
</PreferenceScreen> </PreferenceScreen>