mirror of
				https://github.com/TeamNewPipe/NewPipe
				synced 2025-10-31 07:13:00 +00:00 
			
		
		
		
	Fix crash when no browser is present and use an ACTION_CHOOSER intent in the app update notification (#5429)
Fix crash when no browser is present and use an ACTION_CHOOSER intent for app update notification Show a Toast when no app is present on user's device to open a content in an app and in a browser and use an ACTION_CHOOSER intent with the ACTION_VIEW intent put as an extra intent in the update notification.
This commit is contained in:
		| @@ -132,7 +132,13 @@ public final class CheckForNewAppVersion { | |||||||
|  |  | ||||||
|         if (BuildConfig.VERSION_CODE < versionCode) { |         if (BuildConfig.VERSION_CODE < versionCode) { | ||||||
|             // A pending intent to open the apk location url in the browser. |             // A pending intent to open the apk location url in the browser. | ||||||
|             final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(apkLocationUrl)); |             final Intent viewIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(apkLocationUrl)); | ||||||
|  |  | ||||||
|  |             final Intent intent = new Intent(Intent.ACTION_CHOOSER); | ||||||
|  |             intent.putExtra(Intent.EXTRA_INTENT, viewIntent); | ||||||
|  |             intent.putExtra(Intent.EXTRA_TITLE, R.string.open_with); | ||||||
|  |             intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); | ||||||
|  |  | ||||||
|             final PendingIntent pendingIntent |             final PendingIntent pendingIntent | ||||||
|                     = PendingIntent.getActivity(application, 0, intent, 0); |                     = PendingIntent.getActivity(application, 0, intent, 0); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -6,6 +6,7 @@ import android.content.ClipboardManager; | |||||||
| import android.content.Context; | import android.content.Context; | ||||||
| import android.content.Intent; | import android.content.Intent; | ||||||
| import android.content.pm.PackageManager; | import android.content.pm.PackageManager; | ||||||
|  | import android.content.pm.ResolveInfo; | ||||||
| import android.net.Uri; | import android.net.Uri; | ||||||
| import android.widget.Toast; | import android.widget.Toast; | ||||||
|  |  | ||||||
| @@ -63,6 +64,10 @@ public final class ShareUtils { | |||||||
|         if (defaultPackageName.equals("android")) { |         if (defaultPackageName.equals("android")) { | ||||||
|             // No browser set as default (doesn't work on some devices) |             // No browser set as default (doesn't work on some devices) | ||||||
|             openInDefaultApp(context, intent); |             openInDefaultApp(context, intent); | ||||||
|  |         } else { | ||||||
|  |             if (defaultPackageName.isEmpty()) { | ||||||
|  |                 // No app installed to open a web url | ||||||
|  |                 Toast.makeText(context, R.string.no_app_to_open_intent, Toast.LENGTH_LONG).show(); | ||||||
|             } else { |             } else { | ||||||
|                 try { |                 try { | ||||||
|                     intent.setPackage(defaultPackageName); |                     intent.setPackage(defaultPackageName); | ||||||
| @@ -74,6 +79,7 @@ public final class ShareUtils { | |||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Open the url with the system default browser. |      * Open the url with the system default browser. | ||||||
| @@ -104,14 +110,18 @@ public final class ShareUtils { | |||||||
|      * @param intent  the intent to open |      * @param intent  the intent to open | ||||||
|      */ |      */ | ||||||
|     public static void openIntentInApp(final Context context, final Intent intent) { |     public static void openIntentInApp(final Context context, final Intent intent) { | ||||||
|         final String defaultAppPackageName = getDefaultAppPackageName(context, intent); |         final String defaultPackageName = getDefaultAppPackageName(context, intent); | ||||||
|  |  | ||||||
|         if (defaultAppPackageName.equals("android")) { |         if (defaultPackageName.equals("android")) { | ||||||
|             // No app set as default (doesn't work on some devices) |             // No app set as default (doesn't work on some devices) | ||||||
|             openInDefaultApp(context, intent); |             openInDefaultApp(context, intent); | ||||||
|  |         } else { | ||||||
|  |             if (defaultPackageName.isEmpty()) { | ||||||
|  |                 // No app installed to open the intent | ||||||
|  |                 Toast.makeText(context, R.string.no_app_to_open_intent, Toast.LENGTH_LONG).show(); | ||||||
|             } else { |             } else { | ||||||
|                 try { |                 try { | ||||||
|                 intent.setPackage(defaultAppPackageName); |                     intent.setPackage(defaultPackageName); | ||||||
|                     context.startActivity(intent); |                     context.startActivity(intent); | ||||||
|                 } catch (final ActivityNotFoundException e) { |                 } catch (final ActivityNotFoundException e) { | ||||||
|                     // Not an app to open the intent but an app chooser because of OEMs changes |                     // Not an app to open the intent but an app chooser because of OEMs changes | ||||||
| @@ -120,6 +130,7 @@ public final class ShareUtils { | |||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Open the url in the default app set to open this type of link. |      * Open the url in the default app set to open this type of link. | ||||||
| @@ -140,33 +151,47 @@ public final class ShareUtils { | |||||||
|     /** |     /** | ||||||
|      * Get the default app package name. |      * Get the default app package name. | ||||||
|      * <p> |      * <p> | ||||||
|      * If no app is set as default, it will return "android". |      * If no app is set as default, it will return "android" (not on some devices because some | ||||||
|  |      * OEMs changed the app chooser). | ||||||
|      * <p> |      * <p> | ||||||
|      * Note: it doesn't return "android" on some devices because some OEMs changed the app chooser. |      * If no app is installed on user's device to handle the intent, it will return an empty string. | ||||||
|      * |      * | ||||||
|      * @param context the context to use |      * @param context the context to use | ||||||
|      * @param intent  the intent to get default app |      * @param intent  the intent to get default app | ||||||
|      * @return the package name of the default app, or the app chooser if there's no default |      * @return the package name of the default app to open the intent, an empty string if there's no | ||||||
|  |      * app installed to handle it or the app chooser if there's no default | ||||||
|      */ |      */ | ||||||
|     private static String getDefaultAppPackageName(final Context context, final Intent intent) { |     private static String getDefaultAppPackageName(final Context context, final Intent intent) { | ||||||
|         return context.getPackageManager().resolveActivity(intent, |         final ResolveInfo resolveInfo = context.getPackageManager().resolveActivity(intent, | ||||||
|                 PackageManager.MATCH_DEFAULT_ONLY).activityInfo.packageName; |                 PackageManager.MATCH_DEFAULT_ONLY); | ||||||
|  |         if (resolveInfo == null) { | ||||||
|  |             return ""; | ||||||
|  |         } else { | ||||||
|  |             return resolveInfo.activityInfo.packageName; | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Get the default browser package name. |      * Get the default browser package name. | ||||||
|      * <p> |      * <p> | ||||||
|      * If no browser is set as default, it will return "android" |      * If no browser is set as default, it will return "android" (not on some devices because some | ||||||
|      * Note: it doesn't return "android" on some devices because some OEMs changed the app chooser. |      * OEMs changed the app chooser). | ||||||
|      * |      * <p> | ||||||
|  |      * If no browser is installed on user's device, it will return an empty string. | ||||||
|      * @param context the context to use |      * @param context the context to use | ||||||
|      * @return the package name of the default browser, or "android" if there's no default |      * @return the package name of the default browser, an empty string if there's no browser | ||||||
|  |      * installed or the app chooser if there's no default | ||||||
|      */ |      */ | ||||||
|     private static String getDefaultBrowserPackageName(final Context context) { |     private static String getDefaultBrowserPackageName(final Context context) { | ||||||
|         final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://")) |         final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://")) | ||||||
|                 .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); |                 .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); | ||||||
|         return context.getPackageManager().resolveActivity(intent, |         final ResolveInfo resolveInfo = context.getPackageManager().resolveActivity(intent, | ||||||
|                 PackageManager.MATCH_DEFAULT_ONLY).activityInfo.packageName; |                 PackageManager.MATCH_DEFAULT_ONLY); | ||||||
|  |         if (resolveInfo == null) { | ||||||
|  |             return ""; | ||||||
|  |         } else { | ||||||
|  |             return resolveInfo.activityInfo.packageName; | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|   | |||||||
| @@ -658,4 +658,5 @@ | |||||||
|     <string name="hash_channel_name">Notification de hachage vidéo</string> |     <string name="hash_channel_name">Notification de hachage vidéo</string> | ||||||
|     <string name="show_meta_info_summary">Désactivez cette option pour masquer les zones de méta-informations contenant des informations supplémentaires sur le créateur du flux, le contenu du flux ou une demande de recherche.</string> |     <string name="show_meta_info_summary">Désactivez cette option pour masquer les zones de méta-informations contenant des informations supplémentaires sur le créateur du flux, le contenu du flux ou une demande de recherche.</string> | ||||||
|     <string name="show_meta_info_title">Afficher les méta-infos</string> |     <string name="show_meta_info_title">Afficher les méta-infos</string> | ||||||
|  |     <string name="no_app_to_open_intent">Aucune application sur votre appareil ne peut ouvrir ceci</string> | ||||||
| </resources> | </resources> | ||||||
| @@ -699,4 +699,5 @@ | |||||||
|     <string name="show_thumbnail_summary">Use thumbnail for both lock screen background and notifications</string> |     <string name="show_thumbnail_summary">Use thumbnail for both lock screen background and notifications</string> | ||||||
|     <string name="recent">Recent</string> |     <string name="recent">Recent</string> | ||||||
|     <string name="chapters">Chapters</string> |     <string name="chapters">Chapters</string> | ||||||
|  |     <string name="no_app_to_open_intent">No app on your device can open this</string> | ||||||
| </resources> | </resources> | ||||||
		Reference in New Issue
	
	Block a user
	 TiA4f8R
					TiA4f8R