actually fix crashes from update notifications on < android-11
8600ce8d8a56398a4eb731f0cccb848c4e18d2eb didn't get all the affected places. #1306
This commit is contained in:
parent
978f4a2928
commit
5547f12527
@ -7,6 +7,7 @@ import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.os.Build;
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import android.support.annotation.NonNull;
|
||||
@ -36,7 +37,6 @@ import java.util.Map;
|
||||
* and {@code versionCode} since there could be different copies of the same
|
||||
* APK on different servers, signed by different keys, or even different builds.
|
||||
*/
|
||||
@SuppressWarnings("LineLength")
|
||||
public final class AppUpdateStatusManager {
|
||||
|
||||
private static final String TAG = "AppUpdateStatusManager";
|
||||
@ -132,7 +132,7 @@ public final class AppUpdateStatusManager {
|
||||
*/
|
||||
public String toString() {
|
||||
return app.packageName + " [Status: " + status
|
||||
+ ", Progress: " + progressCurrent + " / " + progressMax + "]";
|
||||
+ ", Progress: " + progressCurrent + " / " + progressMax + ']';
|
||||
}
|
||||
|
||||
protected AppUpdateStatus(Parcel in) {
|
||||
@ -257,20 +257,14 @@ public final class AppUpdateStatusManager {
|
||||
boolean isStatusUpdate = entry.status != status;
|
||||
entry.status = status;
|
||||
entry.intent = intent;
|
||||
// If intent not set, see if we need to create a default intent
|
||||
if (entry.intent == null) {
|
||||
entry.intent = getContentIntent(entry);
|
||||
}
|
||||
setEntryContentIntentIfEmpty(entry);
|
||||
notifyChange(entry, isStatusUpdate);
|
||||
}
|
||||
|
||||
private void addApkInternal(@NonNull Apk apk, @NonNull Status status, PendingIntent intent) {
|
||||
Utils.debugLog(LOGTAG, "Add APK " + apk.apkName + " with state " + status.name());
|
||||
AppUpdateStatus entry = createAppEntry(apk, status, intent);
|
||||
// If intent not set, see if we need to create a default intent
|
||||
if (entry.intent == null) {
|
||||
entry.intent = getContentIntent(entry);
|
||||
}
|
||||
setEntryContentIntentIfEmpty(entry);
|
||||
appMapping.put(entry.getUniqueKey(), entry);
|
||||
notifyAdd(entry);
|
||||
}
|
||||
@ -453,6 +447,7 @@ public final class AppUpdateStatusManager {
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("LineLength")
|
||||
void clearAllUpdates() {
|
||||
synchronized (appMapping) {
|
||||
for (Iterator<Map.Entry<String, AppUpdateStatus>> it = appMapping.entrySet().iterator(); it.hasNext(); ) { // NOCHECKSTYLE EmptyForIteratorPad
|
||||
@ -465,6 +460,7 @@ public final class AppUpdateStatusManager {
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("LineLength")
|
||||
void clearAllInstalled() {
|
||||
synchronized (appMapping) {
|
||||
for (Iterator<Map.Entry<String, AppUpdateStatus>> it = appMapping.entrySet().iterator(); it.hasNext(); ) { // NOCHECKSTYLE EmptyForIteratorPad
|
||||
@ -477,28 +473,46 @@ public final class AppUpdateStatusManager {
|
||||
}
|
||||
}
|
||||
|
||||
private PendingIntent getContentIntent(AppUpdateStatus entry) {
|
||||
/**
|
||||
* If the {@link PendingIntent} aimed at {@link Notification.Builder#setContentIntent(PendingIntent)}
|
||||
* is not set, then create a default one. The goal is to link the notification
|
||||
* to the most relevant action, like the installer if the APK is downloaded, or the launcher once
|
||||
* installed, if possible, or other relevant action. If there is no app launch
|
||||
* {@code PendingIntent}, the app is probably not launchable, e.g. its a keyboard.
|
||||
* If there is not an {@code PendingIntent} to install the app, this creates an {@code PendingIntent}
|
||||
* to open up the app details page for the app. From there, the user can hit "install".
|
||||
* <p>
|
||||
* Before {@code android-11}, a {@code ContentIntent} was required in every
|
||||
* {@link Notification}. This generates a boilerplate one for places where
|
||||
* there isn't an obvious one.
|
||||
*/
|
||||
private void setEntryContentIntentIfEmpty(AppUpdateStatus entry) {
|
||||
if (entry.intent != null) {
|
||||
return;
|
||||
}
|
||||
switch (entry.status) {
|
||||
case UpdateAvailable:
|
||||
case ReadyToInstall:
|
||||
// Make sure we have an intent to install the app. If not set, we create an intent
|
||||
// to open up the app details page for the app. From there, the user can hit "install"
|
||||
return getAppDetailsIntent(entry.apk);
|
||||
|
||||
entry.intent = getAppDetailsIntent(entry.apk);
|
||||
break;
|
||||
case InstallError:
|
||||
return getAppErrorIntent(entry);
|
||||
|
||||
entry.intent = getAppErrorIntent(entry);
|
||||
break;
|
||||
case Installed:
|
||||
PackageManager pm = context.getPackageManager();
|
||||
Intent intentObject = pm.getLaunchIntentForPackage(entry.app.packageName);
|
||||
if (intentObject != null) {
|
||||
return PendingIntent.getActivity(context, 0, intentObject, 0);
|
||||
entry.intent = PendingIntent.getActivity(context, 0, intentObject, 0);
|
||||
} else {
|
||||
// Could not get launch intent, maybe not launchable, e.g. a keyboard
|
||||
return getAppDetailsIntent(entry.apk);
|
||||
entry.intent = getAppDetailsIntent(entry.apk);
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (Build.VERSION.SDK_INT < 11 && entry.intent == null) {
|
||||
Intent intent = new Intent();
|
||||
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
entry.intent = PendingIntent.getActivity(context, 0, intent, 0);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -77,9 +77,12 @@ class NotificationHelper {
|
||||
BroadcastReceiver receiverAppStatusChanges = new BroadcastReceiver() {
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
if (intent == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
AppUpdateStatusManager.AppUpdateStatus entry;
|
||||
String url;
|
||||
|
||||
switch (intent.getAction()) {
|
||||
case AppUpdateStatusManager.BROADCAST_APPSTATUS_LIST_CHANGED:
|
||||
notificationManager.cancelAll();
|
||||
@ -434,11 +437,6 @@ class NotificationHelper {
|
||||
PendingIntent piDeleted = PendingIntent.getBroadcast(context, 0, intentDeleted, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
builder.setDeleteIntent(piDeleted);
|
||||
|
||||
if (Build.VERSION.SDK_INT < 11) {
|
||||
Intent intent = new Intent();
|
||||
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
builder.setContentIntent(PendingIntent.getActivity(context, 0, intent, 0));
|
||||
}
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user