Merge pull request #7296 from vhouriet/vhouriet_feature_issue6049
Add "Check for updates" button in update settings
This commit is contained in:
commit
c0f7b123a3
|
@ -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");
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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>
|
||||||
|
|
||||||
|
|
|
@ -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">
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Loading…
Reference in New Issue