diff options
Diffstat (limited to '')
7 files changed, 179 insertions, 121 deletions
diff --git a/src/main/java/de/pixart/messenger/entities/Conversation.java b/src/main/java/de/pixart/messenger/entities/Conversation.java index fe89009d3..cc995a30b 100644 --- a/src/main/java/de/pixart/messenger/entities/Conversation.java +++ b/src/main/java/de/pixart/messenger/entities/Conversation.java @@ -165,47 +165,61 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl } public void findWaitingMessages(OnMessageFound onMessageFound) { + final ArrayList<Message> results = new ArrayList<>(); synchronized (this.messages) { for (Message message : this.messages) { if (message.getStatus() == Message.STATUS_WAITING) { - onMessageFound.onMessageFound(message); + results.add(message); } } } + for (Message result : results) { + onMessageFound.onMessageFound(result); + } } public void findUnreadMessages(OnMessageFound onMessageFound) { + final ArrayList<Message> results = new ArrayList<>(); synchronized (this.messages) { for (Message message : this.messages) { if (!message.isRead()) { - onMessageFound.onMessageFound(message); + results.add(message); } } } + for (Message result : results) { + onMessageFound.onMessageFound(result); + } } public void findMessagesWithFiles(final OnMessageFound onMessageFound) { + final ArrayList<Message> results = new ArrayList<>(); synchronized (this.messages) { - for (final Message message : this.messages) { - if ((message.getType() == Message.TYPE_IMAGE || message.getType() == Message.TYPE_FILE) - && message.getEncryption() != Message.ENCRYPTION_PGP) { - onMessageFound.onMessageFound(message); + for (final Message m : this.messages) { + if (m.isFileOrImage() && m.getEncryption() != Message.ENCRYPTION_PGP) { + results.add(m); } } } + for (Message result : results) { + onMessageFound.onMessageFound(result); + } } public void findFailedMessagesWithFiles(final OnMessageFound onMessageFound) { + final ArrayList<Message> results = new ArrayList<>(); synchronized (this.messages) { - for (final Message message : this.messages) { - if ((message.getType() == Message.TYPE_IMAGE || message.getType() == Message.TYPE_FILE) - && message.getEncryption() != Message.ENCRYPTION_PGP) { - if (message.getStatus() == Message.STATUS_SEND_FAILED && !message.isDeleted() && message.needsUploading()) { - onMessageFound.onMessageFound(message); + for (final Message m : this.messages) { + if (m.isFileOrImage() && m.getEncryption() != Message.ENCRYPTION_PGP) { + if (m.getStatus() == Message.STATUS_SEND_FAILED && !m.isDeleted() && m.needsUploading()) { + results.add(m); } } } } + for(Message result : results) { + onMessageFound.onMessageFound(result); + } } public Message findMessageWithFileAndUuid(final String uuid) { @@ -281,14 +295,17 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl } public void findUnsentTextMessages(OnMessageFound onMessageFound) { + final ArrayList<Message> results = new ArrayList<>(); synchronized (this.messages) { for (Message message : this.messages) { - if (message.getType() != Message.TYPE_IMAGE - && message.getStatus() == Message.STATUS_UNSEND) { - onMessageFound.onMessageFound(message); + if (message.getType() != Message.TYPE_IMAGE && message.getStatus() == Message.STATUS_UNSEND) { + results.add(message); } } } + for(Message result : results) { + onMessageFound.onMessageFound(result); + } } public Message findSentMessageWithUuidOrRemoteId(String id) { diff --git a/src/main/java/de/pixart/messenger/services/UpdateService.java b/src/main/java/de/pixart/messenger/services/UpdateService.java index 7e636b8e6..3b3829290 100644 --- a/src/main/java/de/pixart/messenger/services/UpdateService.java +++ b/src/main/java/de/pixart/messenger/services/UpdateService.java @@ -32,13 +32,13 @@ import static de.pixart.messenger.services.NotificationService.UPDATE_NOTIFICATI public class UpdateService extends AsyncTask<String, Object, UpdateService.Wrapper> { private boolean mUseTor; private Context context; - private boolean playstore; + private String store; public UpdateService() { } - public UpdateService(Context context, boolean PlayStore, XmppConnectionService mXmppConnectionService) { + public UpdateService(Context context, String Store, XmppConnectionService mXmppConnectionService) { this.context = context; - this.playstore = PlayStore; + this.store = Store; this.mUseTor = mXmppConnectionService.useTorToConnect(); } @@ -94,7 +94,7 @@ public class UpdateService extends AsyncTask<String, Object, UpdateService.Wrapp if (checkVersion(version, ownVersion) >= 1) { Log.d(Config.LOGTAG, "AppUpdater: Version " + ownVersion + " should be updated to " + version); UpdateAvailable = true; - showNotification(url, changelog, version, filesize, playstore); + showNotification(url, changelog, version, filesize, store); } else { Log.d(Config.LOGTAG, "AppUpdater: Version " + ownVersion + " is up to date"); UpdateAvailable = false; @@ -138,12 +138,12 @@ public class UpdateService extends AsyncTask<String, Object, UpdateService.Wrapp }); } - private void showNotification(String url, String changelog, String version, String filesize, boolean playstore) { + private void showNotification(String url, String changelog, String version, String filesize, String store) { Intent intent = new Intent(context, UpdaterActivity.class); intent.putExtra("update", "PixArtMessenger_UpdateService"); intent.putExtra("url", url); intent.putExtra("changelog", changelog); - intent.putExtra("playstore", playstore); + intent.putExtra("store", store); PendingIntent pi = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); final NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context); diff --git a/src/main/java/de/pixart/messenger/services/XmppConnectionService.java b/src/main/java/de/pixart/messenger/services/XmppConnectionService.java index 7f7d319aa..e50f0d9e2 100644 --- a/src/main/java/de/pixart/messenger/services/XmppConnectionService.java +++ b/src/main/java/de/pixart/messenger/services/XmppConnectionService.java @@ -169,6 +169,9 @@ public class XmppConnectionService extends Service { public static final String ACTION_FCM_MESSAGE_RECEIVED = "fcm_message_received"; private static final String ACTION_MERGE_PHONE_CONTACTS = "merge_phone_contacts"; private static final String SETTING_LAST_ACTIVITY_TS = "last_activity_timestamp"; + public static final String FDroid = "org.fdroid.fdroid"; + public static final String PlayStore = "com.android.vending"; + public static final String Yalp = "com.github.yeriomin.yalpstore"; static { URL.setURLStreamHandlerFactory(new CustomURLStreamHandlerFactory()); @@ -1482,13 +1485,7 @@ public class XmppConnectionService extends Service { } private void sendUnsentMessages(final Conversation conversation) { - conversation.findWaitingMessages(new Conversation.OnMessageFound() { - - @Override - public void onMessageFound(Message message) { - resendMessage(message, true); - } - }); + conversation.findWaitingMessages(message -> resendMessage(message, true)); } private void resendFailedFileMessages(final Conversation conversation) { @@ -2146,165 +2143,196 @@ public class XmppConnectionService extends Service { } public void setOnConversationListChangedListener(OnConversationUpdate listener) { + final boolean remainingListeners; synchronized (LISTENER_LOCK) { - if (checkListeners()) { - switchToForeground(); - } + remainingListeners = checkListeners(); if (!this.mOnConversationUpdates.add(listener)) { - Log.w(Config.LOGTAG, listener.getClass().getName() + " is already registered as ConversationListChangedListener"); + Log.w(Config.LOGTAG,listener.getClass().getName()+" is already registered as ConversationListChangedListener"); } this.mNotificationService.setIsInForeground(this.mOnConversationUpdates.size() > 0); } + if (remainingListeners) { + switchToForeground(); + } } public void removeOnConversationListChangedListener(OnConversationUpdate listener) { + final boolean remainingListeners; synchronized (LISTENER_LOCK) { this.mOnConversationUpdates.remove(listener); - Log.d(Config.LOGTAG, "XmppConnectionService removeOnConversationListChangedListener(): setIsInForeground = " + (this.mOnConversationUpdates.size() > 0)); this.mNotificationService.setIsInForeground(this.mOnConversationUpdates.size() > 0); - if (checkListeners()) { - switchToBackground(); - } + remainingListeners = checkListeners(); + } + if (remainingListeners) { + switchToBackground(); } } public void setOnShowErrorToastListener(OnShowErrorToast listener) { + final boolean remainingListeners; synchronized (LISTENER_LOCK) { - if (checkListeners()) { - switchToForeground(); - } + remainingListeners = checkListeners(); if (!this.mOnShowErrorToasts.add(listener)) { - Log.w(Config.LOGTAG, listener.getClass().getName() + " is already registered as OnShowErrorToastListener"); + Log.w(Config.LOGTAG,listener.getClass().getName()+" is already registered as OnShowErrorToastListener"); } } + if (remainingListeners) { + switchToForeground(); + } } public void removeOnShowErrorToastListener(OnShowErrorToast onShowErrorToast) { + final boolean remainingListeners; synchronized (LISTENER_LOCK) { this.mOnShowErrorToasts.remove(onShowErrorToast); - if (checkListeners()) { - switchToBackground(); - } + remainingListeners = checkListeners(); + } + if (remainingListeners) { + switchToBackground(); } } public void setOnAccountListChangedListener(OnAccountUpdate listener) { + final boolean remainingListeners; synchronized (LISTENER_LOCK) { - if (checkListeners()) { - switchToForeground(); - } + remainingListeners = checkListeners(); if (!this.mOnAccountUpdates.add(listener)) { - Log.w(Config.LOGTAG, listener.getClass().getName() + " is already registered as OnAccountListChangedtListener"); + Log.w(Config.LOGTAG,listener.getClass().getName()+" is already registered as OnAccountListChangedtListener"); } } + if (remainingListeners) { + switchToForeground(); + } } public void removeOnAccountListChangedListener(OnAccountUpdate listener) { + final boolean remainingListeners; synchronized (LISTENER_LOCK) { this.mOnAccountUpdates.remove(listener); - if (checkListeners()) { - switchToBackground(); - } + remainingListeners = checkListeners(); + } + if (remainingListeners) { + switchToBackground(); } } public void setOnCaptchaRequestedListener(OnCaptchaRequested listener) { + final boolean remainingListeners; synchronized (LISTENER_LOCK) { - if (checkListeners()) { - switchToForeground(); - } + remainingListeners = checkListeners(); if (!this.mOnCaptchaRequested.add(listener)) { - Log.w(Config.LOGTAG, listener.getClass().getName() + " is already registered as OnCaptchaRequestListener"); + Log.w(Config.LOGTAG,listener.getClass().getName()+" is already registered as OnCaptchaRequestListener"); } } + if (remainingListeners) { + switchToForeground(); + } } public void removeOnCaptchaRequestedListener(OnCaptchaRequested listener) { + final boolean remainingListeners; synchronized (LISTENER_LOCK) { this.mOnCaptchaRequested.remove(listener); - if (checkListeners()) { - switchToBackground(); - } + remainingListeners = checkListeners(); + } + if (remainingListeners) { + switchToBackground(); } } public void setOnRosterUpdateListener(final OnRosterUpdate listener) { + final boolean remainingListeners; synchronized (LISTENER_LOCK) { - if (checkListeners()) { - switchToForeground(); - } + remainingListeners = checkListeners(); if (!this.mOnRosterUpdates.add(listener)) { - Log.w(Config.LOGTAG, listener.getClass().getName() + " is already registered as OnRosterUpdateListener"); + Log.w(Config.LOGTAG,listener.getClass().getName()+" is already registered as OnRosterUpdateListener"); } } + if (remainingListeners) { + switchToForeground(); + } } public void removeOnRosterUpdateListener(final OnRosterUpdate listener) { + final boolean remainingListeners; synchronized (LISTENER_LOCK) { this.mOnRosterUpdates.remove(listener); - if (checkListeners()) { - switchToBackground(); - } + remainingListeners = checkListeners(); + } + if (remainingListeners) { + switchToBackground(); } } public void setOnUpdateBlocklistListener(final OnUpdateBlocklist listener) { + final boolean remainingListeners; synchronized (LISTENER_LOCK) { - if (checkListeners()) { - switchToForeground(); - } + remainingListeners = checkListeners(); if (!this.mOnUpdateBlocklist.add(listener)) { - Log.w(Config.LOGTAG, listener.getClass().getName() + " is already registered as OnUpdateBlocklistListener"); + Log.w(Config.LOGTAG,listener.getClass().getName()+" is already registered as OnUpdateBlocklistListener"); } } + if (remainingListeners) { + switchToForeground(); + } } public void removeOnUpdateBlocklistListener(final OnUpdateBlocklist listener) { + final boolean remainingListeners; synchronized (LISTENER_LOCK) { this.mOnUpdateBlocklist.remove(listener); - if (checkListeners()) { - switchToBackground(); - } + remainingListeners = checkListeners(); + } + if (remainingListeners) { + switchToBackground(); } } public void setOnKeyStatusUpdatedListener(final OnKeyStatusUpdated listener) { + final boolean remainingListeners; synchronized (LISTENER_LOCK) { - if (checkListeners()) { - switchToForeground(); - } + remainingListeners = checkListeners(); if (!this.mOnKeyStatusUpdated.add(listener)) { - Log.w(Config.LOGTAG, listener.getClass().getName() + " is already registered as OnKeyStatusUpdateListener"); + Log.w(Config.LOGTAG,listener.getClass().getName()+" is already registered as OnKeyStatusUpdateListener"); } } + if (remainingListeners) { + switchToForeground(); + } } public void removeOnNewKeysAvailableListener(final OnKeyStatusUpdated listener) { + final boolean remainingListeners; synchronized (LISTENER_LOCK) { this.mOnKeyStatusUpdated.remove(listener); - if (checkListeners()) { - switchToBackground(); - } + remainingListeners = checkListeners(); + } + if (remainingListeners) { + switchToBackground(); } } public void setOnMucRosterUpdateListener(OnMucRosterUpdate listener) { + final boolean remainingListeners; synchronized (LISTENER_LOCK) { - if (checkListeners()) { - switchToForeground(); - } + remainingListeners = checkListeners(); if (!this.mOnMucRosterUpdate.add(listener)) { - Log.w(Config.LOGTAG, listener.getClass().getName() + " is already registered as OnMucRosterListener"); + Log.w(Config.LOGTAG,listener.getClass().getName()+" is already registered as OnMucRosterListener"); } } + if (remainingListeners) { + switchToForeground(); + } } public void removeOnMucRosterUpdateListener(final OnMucRosterUpdate listener) { + final boolean remainingListeners; synchronized (LISTENER_LOCK) { this.mOnMucRosterUpdate.remove(listener); - if (checkListeners()) { - switchToBackground(); - } + remainingListeners = checkListeners(); + } + if (remainingListeners) { + switchToBackground(); } } @@ -3439,13 +3467,7 @@ public class XmppConnectionService extends Service { Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": reset 'sending' messages to 'waiting'"); for (Conversation conversation : getConversations()) { if (conversation.getAccount() == account) { - conversation.findUnsentTextMessages(new Conversation.OnMessageFound() { - - @Override - public void onMessageFound(Message message) { - markMessage(message, Message.STATUS_WAITING); - } - }); + conversation.findUnsentTextMessages(message -> markMessage(message, Message.STATUS_WAITING)); } } } @@ -4288,20 +4310,16 @@ public class XmppConnectionService extends Service { } } - public boolean installedFromFDroid() { - final PackageManager packageManager = this.getPackageManager(); - final String packageID = BuildConfig.APPLICATION_ID; - final String installedFrom = packageManager.getInstallerPackageName(packageID); - Log.d(Config.LOGTAG, "Messenger installed from " + installedFrom); - return installedFrom != null && installedFrom.contains("org.fdroid.fdroid"); - } - - public boolean installedFromPlayStore() { + public String installedFrom() { final PackageManager packageManager = this.getPackageManager(); final String packageID = BuildConfig.APPLICATION_ID; final String installedFrom = packageManager.getInstallerPackageName(packageID); Log.d(Config.LOGTAG, "Messenger installed from " + installedFrom); - return installedFrom != null && (installedFrom.contains("com.android.vending") || installedFrom.contains("com.github.yeriomin.yalpstore")); + if (installedFrom != null) { + return installedFrom; + } else { + return null; + } } public ShortcutService getShortcutService() { diff --git a/src/main/java/de/pixart/messenger/ui/ContactDetailsActivity.java b/src/main/java/de/pixart/messenger/ui/ContactDetailsActivity.java index 4919a4251..5dce3fca2 100644 --- a/src/main/java/de/pixart/messenger/ui/ContactDetailsActivity.java +++ b/src/main/java/de/pixart/messenger/ui/ContactDetailsActivity.java @@ -1,5 +1,6 @@ package de.pixart.messenger.ui; +import android.content.ActivityNotFoundException; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; @@ -116,12 +117,14 @@ public class ContactDetailsActivity extends OmemoActivity implements OnAccountUp public void onClick(DialogInterface dialog, int which) { Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT); intent.setType(Contacts.CONTENT_ITEM_TYPE); - intent.putExtra(Intents.Insert.IM_HANDLE, contact.getJid().toString()); - intent.putExtra(Intents.Insert.IM_PROTOCOL, - CommonDataKinds.Im.PROTOCOL_JABBER); + intent.putExtra(Intents.Insert.IM_HANDLE, contact.getJid().toEscapedString()); + intent.putExtra(Intents.Insert.IM_PROTOCOL, CommonDataKinds.Im.PROTOCOL_JABBER); intent.putExtra("finishActivityOnSaveCompleted", true); - ContactDetailsActivity.this.startActivityForResult(intent, 0); - overridePendingTransition(R.animator.fade_in, R.animator.fade_out); + try { + ContactDetailsActivity.this.startActivityForResult(intent, 0); + } catch (ActivityNotFoundException e) { + Toast.makeText(ContactDetailsActivity.this, R.string.no_application_found_to_view_contact, Toast.LENGTH_SHORT).show(); + } } }; @@ -308,8 +311,12 @@ public class ContactDetailsActivity extends OmemoActivity implements OnAccountUp Intent intent = new Intent(Intent.ACTION_EDIT); intent.setDataAndType(systemAccount, Contacts.CONTENT_ITEM_TYPE); intent.putExtra("finishActivityOnSaveCompleted", true); - startActivity(intent); - overridePendingTransition(R.animator.fade_in, R.animator.fade_out); + try { + startActivity(intent); + overridePendingTransition(R.animator.fade_in, R.animator.fade_out); + } catch (ActivityNotFoundException e) { + Toast.makeText(ContactDetailsActivity.this, R.string.no_application_found_to_view_contact, Toast.LENGTH_SHORT).show(); + } } break; case R.id.action_block: diff --git a/src/main/java/de/pixart/messenger/ui/ConversationsActivity.java b/src/main/java/de/pixart/messenger/ui/ConversationsActivity.java index 67618dc65..f2e4dc2b6 100644 --- a/src/main/java/de/pixart/messenger/ui/ConversationsActivity.java +++ b/src/main/java/de/pixart/messenger/ui/ConversationsActivity.java @@ -93,6 +93,7 @@ import de.pixart.messenger.utils.XmppUri; import de.pixart.messenger.xmpp.OnUpdateBlocklist; import de.pixart.messenger.xmpp.chatstate.ChatState; +import static de.pixart.messenger.services.XmppConnectionService.PlayStore; import static de.pixart.messenger.ui.ConversationFragment.REQUEST_DECRYPT_PGP; import static de.pixart.messenger.ui.SettingsActivity.USE_BUNDLED_EMOJIS; @@ -193,9 +194,7 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio if (xmppConnectionService.getAccounts().size() != 0) { if (xmppConnectionService.hasInternetConnection()) { if (xmppConnectionService.isWIFI() || (xmppConnectionService.isMobile() && !xmppConnectionService.isMobileRoaming())) { - if (!xmppConnectionService.installedFromFDroid()) { - AppUpdate(xmppConnectionService.installedFromPlayStore()); - } + AppUpdate(xmppConnectionService.installedFrom()); } } } @@ -559,10 +558,10 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio return true; case R.id.action_check_updates: if (xmppConnectionService.hasInternetConnection()) { - if (!installFromUnknownSourceAllowed() && !xmppConnectionService.installedFromPlayStore()) { + if (!installFromUnknownSourceAllowed() && !xmppConnectionService.installedFrom().equals(PlayStore)) { openInstallFromUnknownSourcesDialogIfNeeded(); } else { - UpdateService task = new UpdateService(this, xmppConnectionService.installedFromPlayStore(), xmppConnectionService); + UpdateService task = new UpdateService(this, xmppConnectionService.installedFrom(), xmppConnectionService); task.executeOnExecutor(UpdateService.THREAD_POOL_EXECUTOR, "true"); Log.d(Config.LOGTAG, "AppUpdater started"); } @@ -940,8 +939,8 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio runOnUiThread(() -> Toast.makeText(this, resId, Toast.LENGTH_SHORT).show()); } - protected void AppUpdate(boolean PlayStore) { - if (PlayStore) { + protected void AppUpdate(String Store) { + if (Store == null) { return; } String PREFS_NAME = "UpdateTimeStamp"; @@ -954,10 +953,10 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio editor.putLong("lastUpdateTime", lastUpdateTime); editor.apply(); Log.d(Config.LOGTAG, "AppUpdater: CurrentTime: " + lastUpdateTime); - if (!installFromUnknownSourceAllowed() && !PlayStore) { + if (!installFromUnknownSourceAllowed() && !Store.equals(PlayStore)) { openInstallFromUnknownSourcesDialogIfNeeded(); } else { - UpdateService task = new UpdateService(this, PlayStore, xmppConnectionService); + UpdateService task = new UpdateService(this, Store, xmppConnectionService); task.executeOnExecutor(UpdateService.THREAD_POOL_EXECUTOR, "false"); Log.d(Config.LOGTAG, "AppUpdater started"); } diff --git a/src/main/java/de/pixart/messenger/ui/UpdaterActivity.java b/src/main/java/de/pixart/messenger/ui/UpdaterActivity.java index 4832dc466..0c59b06c6 100644 --- a/src/main/java/de/pixart/messenger/ui/UpdaterActivity.java +++ b/src/main/java/de/pixart/messenger/ui/UpdaterActivity.java @@ -37,13 +37,15 @@ import de.pixart.messenger.services.XmppConnectionService; import de.pixart.messenger.utils.WakeLockHelper; import static de.pixart.messenger.http.HttpConnectionManager.getProxy; +import static de.pixart.messenger.services.XmppConnectionService.FDroid; +import static de.pixart.messenger.services.XmppConnectionService.PlayStore; public class UpdaterActivity extends XmppActivity { static final private String FileName = "update.apk"; String appURI = ""; String changelog = ""; Integer filesize = 0; - boolean playstore = false; + String store; ProgressDialog mProgressDialog; DownloadTask downloadTask; XmppConnectionService mXmppConnectionService; @@ -104,9 +106,9 @@ public class UpdaterActivity extends XmppActivity { UpdaterActivity.this.finish(); } try { - playstore = getIntent().getBooleanExtra("playstore", false); + store = getIntent().getStringExtra("store"); } catch (Exception e) { - playstore = false; + store = null; } //delete old downloaded localVersion files File dir = new File(FileBackend.getConversationsDirectory("Update", false)); @@ -129,7 +131,7 @@ public class UpdaterActivity extends XmppActivity { //ask for permissions on devices >= SDK 23 if (isStoragePermissionGranted() && isNetworkAvailable(getApplicationContext())) { //start downloading the file using the download manager - if (playstore) { + if (store.equals(PlayStore)) { Uri uri = Uri.parse("market://details?id=de.pixart.messenger"); Intent marketIntent = new Intent(Intent.ACTION_VIEW, uri); PackageManager manager = getApplicationContext().getPackageManager(); @@ -143,6 +145,20 @@ public class UpdaterActivity extends XmppActivity { startActivity(browserIntent); overridePendingTransition(R.animator.fade_in, R.animator.fade_out); } + } else if (store.equals(FDroid)) { + Uri uri = Uri.parse("https://f-droid.org/de/packages/de.pixart.messenger/"); + Intent marketIntent = new Intent(Intent.ACTION_VIEW, uri); + PackageManager manager = getApplicationContext().getPackageManager(); + List<ResolveInfo> infos = manager.queryIntentActivities(marketIntent, 0); + if (infos.size() > 0) { + startActivity(marketIntent); + overridePendingTransition(R.animator.fade_in, R.animator.fade_out); + } else { + uri = Uri.parse("https://f-droid.org/de/packages/de.pixart.messenger/"); + Intent browserIntent = new Intent(Intent.ACTION_VIEW, uri); + startActivity(browserIntent); + overridePendingTransition(R.animator.fade_in, R.animator.fade_out); + } } else { Toast.makeText(getApplicationContext(), getText(R.string.download_started), Toast.LENGTH_LONG).show(); downloadTask = new DownloadTask(UpdaterActivity.this) { diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 89cecf15f..4a5b4e3c6 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -805,4 +805,5 @@ <string name="conference_resource_constraint">Resource constraint</string> <string name="delete_message">Delete message</string> <string name="conference_destroyed">This group chat has been destroyed</string> + <string name="no_application_found_to_view_contact">No application found to view contact</string> </resources> |