mirror of
				https://codeberg.org/tom79/Fedilab.git
				synced 2025-10-20 11:20:16 +03:00 
			
		
		
		
	Fix potential crashes when clicking on notifications
This commit is contained in:
		
							parent
							
								
									886b74c171
								
							
						
					
					
						commit
						a1a6005ca0
					
				
					 5 changed files with 89 additions and 68 deletions
				
			
		| 
						 | 
				
			
			@ -675,32 +675,35 @@ public abstract class BaseMainActivity extends BaseActivity implements NetworkSt
 | 
			
		|||
     */
 | 
			
		||||
    private static void openNotifications(Activity activity, Intent intent) {
 | 
			
		||||
        if (intent != null && intent.getExtras() != null) {
 | 
			
		||||
            Bundle bundle = intent.getExtras();
 | 
			
		||||
            app.fedilab.android.mastodon.client.entities.api.Account account = (app.fedilab.android.mastodon.client.entities.api.Account) bundle.getSerializable(Helper.INTENT_TARGETED_ACCOUNT);
 | 
			
		||||
            Status status = (Status) bundle.getSerializable(Helper.INTENT_TARGETED_STATUS);
 | 
			
		||||
            if (account != null) {
 | 
			
		||||
                Intent intentAccount = new Intent(activity, ProfileActivity.class);
 | 
			
		||||
                Bundle args = new Bundle();
 | 
			
		||||
                args.putSerializable(Helper.ARG_ACCOUNT, account);
 | 
			
		||||
                new CachedBundle(activity).insertBundle(args, currentAccount, bundleId -> {
 | 
			
		||||
                    Bundle bundleCached = new Bundle();
 | 
			
		||||
                    bundleCached.putLong(Helper.ARG_INTENT_ID, bundleId);
 | 
			
		||||
                    intentAccount.putExtras(bundleCached);
 | 
			
		||||
                    intentAccount.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 | 
			
		||||
                    activity.startActivity(intentAccount);
 | 
			
		||||
                });
 | 
			
		||||
            } else if (status != null) {
 | 
			
		||||
                Intent intentContext = new Intent(activity, ContextActivity.class);
 | 
			
		||||
                Bundle args = new Bundle();
 | 
			
		||||
                args.putSerializable(Helper.ARG_STATUS, status);
 | 
			
		||||
                new CachedBundle(activity).insertBundle(args, currentAccount, bundleId -> {
 | 
			
		||||
                    Bundle bundleCached = new Bundle();
 | 
			
		||||
                    bundleCached.putLong(Helper.ARG_INTENT_ID, bundleId);
 | 
			
		||||
                    intentContext.putExtras(bundleCached);
 | 
			
		||||
                    intentContext.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 | 
			
		||||
                    activity.startActivity(intentContext);
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
            Bundle args = intent.getExtras();
 | 
			
		||||
            long bundleId = args.getLong(Helper.ARG_INTENT_ID, -1);
 | 
			
		||||
            new CachedBundle(activity).getBundle(bundleId, currentAccount, bundle -> {
 | 
			
		||||
                app.fedilab.android.mastodon.client.entities.api.Account account = (app.fedilab.android.mastodon.client.entities.api.Account) bundle.getSerializable(Helper.INTENT_TARGETED_ACCOUNT);
 | 
			
		||||
                Status status = (Status) bundle.getSerializable(Helper.INTENT_TARGETED_STATUS);
 | 
			
		||||
                if (account != null) {
 | 
			
		||||
                    Intent intentAccount = new Intent(activity, ProfileActivity.class);
 | 
			
		||||
                    Bundle args2 = new Bundle();
 | 
			
		||||
                    args2.putSerializable(Helper.ARG_ACCOUNT, account);
 | 
			
		||||
                    new CachedBundle(activity).insertBundle(args2, currentAccount, bundleId2 -> {
 | 
			
		||||
                        Bundle bundleCached = new Bundle();
 | 
			
		||||
                        bundleCached.putLong(Helper.ARG_INTENT_ID, bundleId2);
 | 
			
		||||
                        intentAccount.putExtras(bundleCached);
 | 
			
		||||
                        intentAccount.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 | 
			
		||||
                        activity.startActivity(intentAccount);
 | 
			
		||||
                    });
 | 
			
		||||
                } else if (status != null) {
 | 
			
		||||
                    Intent intentContext = new Intent(activity, ContextActivity.class);
 | 
			
		||||
                    Bundle args2 = new Bundle();
 | 
			
		||||
                    args2.putSerializable(Helper.ARG_STATUS, status);
 | 
			
		||||
                    new CachedBundle(activity).insertBundle(args2, currentAccount, bundleId2 -> {
 | 
			
		||||
                        Bundle bundleCached = new Bundle();
 | 
			
		||||
                        bundleCached.putLong(Helper.ARG_INTENT_ID, bundleId2);
 | 
			
		||||
                        intentContext.putExtras(bundleCached);
 | 
			
		||||
                        intentContext.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 | 
			
		||||
                        activity.startActivity(intentContext);
 | 
			
		||||
                    });
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        final Handler handler = new Handler();
 | 
			
		||||
        handler.postDelayed(() -> {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -171,9 +171,15 @@ public class MediaActivity extends BaseTransparentActivity implements OnDownload
 | 
			
		|||
        if (attachments.get(mediaPosition - 1).status != null) {
 | 
			
		||||
            binding.originalMessage.setOnClickListener(v -> {
 | 
			
		||||
                Intent intentContext = new Intent(MediaActivity.this, ContextActivity.class);
 | 
			
		||||
                intentContext.putExtra(Helper.ARG_STATUS, attachments.get(mediaPosition - 1).status);
 | 
			
		||||
                intentContext.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 | 
			
		||||
                startActivity(intentContext);
 | 
			
		||||
                Bundle args = new Bundle();
 | 
			
		||||
                args.putSerializable(Helper.ARG_STATUS, attachments.get(mediaPosition - 1).status);
 | 
			
		||||
                new CachedBundle(MediaActivity.this).insertBundle(args, currentAccount, bundleId -> {
 | 
			
		||||
                    Bundle bundleCached = new Bundle();
 | 
			
		||||
                    bundleCached.putLong(Helper.ARG_INTENT_ID, bundleId);
 | 
			
		||||
                    intentContext.putExtras(bundleCached);
 | 
			
		||||
                    intentContext.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 | 
			
		||||
                    startActivity(intentContext);
 | 
			
		||||
                });
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -82,7 +82,6 @@ public class SearchResultTabActivity extends BaseBarActivity {
 | 
			
		|||
        Bundle b = getIntent().getExtras();
 | 
			
		||||
        if (b != null) {
 | 
			
		||||
            search = b.getString(Helper.ARG_SEARCH_KEYWORD, null);
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
        if (search == null) {
 | 
			
		||||
            Toasty.error(SearchResultTabActivity.this, getString(R.string.toast_error_search), Toast.LENGTH_LONG).show();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -54,6 +54,7 @@ import app.fedilab.android.mastodon.client.entities.api.Notifications;
 | 
			
		|||
import app.fedilab.android.mastodon.client.entities.api.Status;
 | 
			
		||||
import app.fedilab.android.mastodon.client.entities.app.Account;
 | 
			
		||||
import app.fedilab.android.mastodon.client.entities.app.BaseAccount;
 | 
			
		||||
import app.fedilab.android.mastodon.client.entities.app.CachedBundle;
 | 
			
		||||
import app.fedilab.android.mastodon.exception.DBException;
 | 
			
		||||
import app.fedilab.android.mastodon.ui.drawer.StatusAdapter;
 | 
			
		||||
import okhttp3.OkHttpClient;
 | 
			
		||||
| 
						 | 
				
			
			@ -398,48 +399,48 @@ public class NotificationsHelper {
 | 
			
		|||
                //Some others notification
 | 
			
		||||
                final Intent intent = new Intent(context, MainActivity.class);
 | 
			
		||||
                intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
 | 
			
		||||
                Bundle args = new Bundle();
 | 
			
		||||
                intent.putExtra(Helper.INTENT_ACTION, Helper.NOTIFICATION_INTENT);
 | 
			
		||||
                intent.putExtra(Helper.PREF_USER_ID, account.user_id);
 | 
			
		||||
                if (targeted_account != null) {
 | 
			
		||||
                    Bundle bundle = new Bundle();
 | 
			
		||||
                    bundle.putSerializable(Helper.INTENT_TARGETED_ACCOUNT, targeted_account);
 | 
			
		||||
                    intent.putExtras(bundle);
 | 
			
		||||
                    args.putSerializable(Helper.INTENT_TARGETED_ACCOUNT, targeted_account);
 | 
			
		||||
                } else if (targeted_status != null) {
 | 
			
		||||
                    Bundle bundle = new Bundle();
 | 
			
		||||
                    bundle.putSerializable(Helper.INTENT_TARGETED_STATUS, targeted_status);
 | 
			
		||||
                    intent.putExtras(bundle);
 | 
			
		||||
                    args.putSerializable(Helper.INTENT_TARGETED_STATUS, targeted_status);
 | 
			
		||||
                }
 | 
			
		||||
                intent.putExtra(Helper.PREF_USER_INSTANCE, account.instance);
 | 
			
		||||
                notificationUrl = notification.account.avatar;
 | 
			
		||||
                Handler mainHandler = new Handler(Looper.getMainLooper());
 | 
			
		||||
                final String finalNotificationUrl = notificationUrl;
 | 
			
		||||
                Helper.NotifType finalNotifType = notifType;
 | 
			
		||||
                String finalMessage = message;
 | 
			
		||||
                String finalTitle = title;
 | 
			
		||||
                StatusAdapter.sendAction(context, Helper.RECEIVE_REFRESH_NOTIFICATIONS_ACTION, null, null);
 | 
			
		||||
                Runnable myRunnable = () -> Glide.with(context)
 | 
			
		||||
                        .asBitmap()
 | 
			
		||||
                        .load(finalNotificationUrl != null ? finalNotificationUrl : R.drawable.fedilab_logo_bubbles)
 | 
			
		||||
                        .into(new CustomTarget<Bitmap>() {
 | 
			
		||||
                            @Override
 | 
			
		||||
                            public void onResourceReady(@NonNull Bitmap resource, Transition<? super Bitmap> transition) {
 | 
			
		||||
                                Helper.notify_user(context, account, intent, resource, finalNotifType, finalTitle, finalMessage);
 | 
			
		||||
                            }
 | 
			
		||||
                String finalMessage1 = message;
 | 
			
		||||
                String finalTitle1 = title;
 | 
			
		||||
                Helper.NotifType finalNotifType1 = notifType;
 | 
			
		||||
                new CachedBundle(context).insertBundle(args, account, bundleId -> {
 | 
			
		||||
                    Bundle bundle = new Bundle();
 | 
			
		||||
                    bundle.putLong(Helper.ARG_INTENT_ID, bundleId);
 | 
			
		||||
                    intent.putExtras(bundle);
 | 
			
		||||
                    intent.putExtra(Helper.PREF_USER_INSTANCE, account.instance);
 | 
			
		||||
                    Handler mainHandler = new Handler(Looper.getMainLooper());
 | 
			
		||||
                    final String finalNotificationUrl = notification.account.avatar;
 | 
			
		||||
                    StatusAdapter.sendAction(context, Helper.RECEIVE_REFRESH_NOTIFICATIONS_ACTION, null, null);
 | 
			
		||||
                    Runnable myRunnable = () -> Glide.with(context)
 | 
			
		||||
                            .asBitmap()
 | 
			
		||||
                            .load(finalNotificationUrl != null ? finalNotificationUrl : R.drawable.fedilab_logo_bubbles)
 | 
			
		||||
                            .into(new CustomTarget<Bitmap>() {
 | 
			
		||||
                                @Override
 | 
			
		||||
                                public void onResourceReady(@NonNull Bitmap resource, Transition<? super Bitmap> transition) {
 | 
			
		||||
                                    Helper.notify_user(context, account, intent, resource, finalNotifType1, finalTitle1, finalMessage1);
 | 
			
		||||
                                }
 | 
			
		||||
 | 
			
		||||
                            @Override
 | 
			
		||||
                            public void onLoadFailed(@Nullable Drawable errorDrawable) {
 | 
			
		||||
                                super.onLoadFailed(errorDrawable);
 | 
			
		||||
                                Helper.notify_user(context, account, intent, BitmapFactory.decodeResource(context.getResources(),
 | 
			
		||||
                                        getMainLogo(context)), finalNotifType, finalTitle, finalMessage);
 | 
			
		||||
                            }
 | 
			
		||||
                                @Override
 | 
			
		||||
                                public void onLoadFailed(@Nullable Drawable errorDrawable) {
 | 
			
		||||
                                    super.onLoadFailed(errorDrawable);
 | 
			
		||||
                                    Helper.notify_user(context, account, intent, BitmapFactory.decodeResource(context.getResources(),
 | 
			
		||||
                                            getMainLogo(context)), finalNotifType1, finalTitle1, finalMessage1);
 | 
			
		||||
                                }
 | 
			
		||||
 | 
			
		||||
                            @Override
 | 
			
		||||
                            public void onLoadCleared(@Nullable Drawable placeholder) {
 | 
			
		||||
 | 
			
		||||
                            }
 | 
			
		||||
                        });
 | 
			
		||||
                mainHandler.post(myRunnable);
 | 
			
		||||
                                @Override
 | 
			
		||||
                                public void onLoadCleared(@Nullable Drawable placeholder) {
 | 
			
		||||
 | 
			
		||||
                                }
 | 
			
		||||
                            });
 | 
			
		||||
                    mainHandler.post(myRunnable);
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2225,8 +2225,14 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
 | 
			
		|||
                    MastodonHelper.scheduleBoost(context, MastodonHelper.ScheduleType.BOOST, statusToDeal, null, null);
 | 
			
		||||
                } else if (itemId == R.id.action_admin) {
 | 
			
		||||
                    Intent intent = new Intent(context, AdminAccountActivity.class);
 | 
			
		||||
                    intent.putExtra(Helper.ARG_ACCOUNT_ID, statusToDeal.account.id);
 | 
			
		||||
                    context.startActivity(intent);
 | 
			
		||||
                    Bundle args = new Bundle();
 | 
			
		||||
                    args.putString(Helper.ARG_ACCOUNT_ID, statusToDeal.account.id);
 | 
			
		||||
                    new CachedBundle(context).insertBundle(args, currentAccount, bundleId -> {
 | 
			
		||||
                        Bundle bundle = new Bundle();
 | 
			
		||||
                        bundle.putLong(Helper.ARG_INTENT_ID, bundleId);
 | 
			
		||||
                        intent.putExtras(bundle);
 | 
			
		||||
                        context.startActivity(intent);
 | 
			
		||||
                    });
 | 
			
		||||
                } else if (itemId == R.id.action_open_browser) {
 | 
			
		||||
                    Helper.openBrowser(context, statusToDeal.url);
 | 
			
		||||
                } else if (itemId == R.id.action_remove) {
 | 
			
		||||
| 
						 | 
				
			
			@ -2487,8 +2493,14 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
 | 
			
		|||
        });
 | 
			
		||||
        holder.binding.actionButtonQuote.setOnClickListener(v -> {
 | 
			
		||||
            Intent intent = new Intent(context, ComposeActivity.class);
 | 
			
		||||
            intent.putExtra(Helper.ARG_QUOTED_MESSAGE, statusToDeal);
 | 
			
		||||
            context.startActivity(intent);
 | 
			
		||||
            Bundle args = new Bundle();
 | 
			
		||||
            args.putSerializable(Helper.ARG_QUOTED_MESSAGE, statusToDeal);
 | 
			
		||||
            new CachedBundle(context).insertBundle(args, currentAccount, bundleId -> {
 | 
			
		||||
                Bundle bundle = new Bundle();
 | 
			
		||||
                bundle.putLong(Helper.ARG_INTENT_ID, bundleId);
 | 
			
		||||
                intent.putExtras(bundle);
 | 
			
		||||
                context.startActivity(intent);
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
        holder.binding.actionButtonReply.setOnClickListener(v -> {
 | 
			
		||||
            if (remote) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue