diff --git a/build.gradle b/build.gradle index 60ba30519e5a1788d953376999a93ff86c03eda0..20956240ae734201464cbb449f1d210cc918a6b7 100644 --- a/build.gradle +++ b/build.gradle @@ -105,7 +105,7 @@ android { def appName = "Conversations" resValue "string", "app_name", appName buildConfigField "String", "APP_NAME", "\"$appName\"" - buildConfigField "String", "PRIVACY_POLICY", "null" + buildConfigField "String", "PRIVACY_POLICY", "\"https://conversations.im/privacy.html\"" } splits { diff --git a/src/free/AndroidManifest.xml b/src/free/AndroidManifest.xml new file mode 100644 index 0000000000000000000000000000000000000000..b127401a906aa1dd886158b7f52d84d4b18f7ccd --- /dev/null +++ b/src/free/AndroidManifest.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index f9c3da16c5fd48983b4674bd3599662fac81437c..c01009862191e65e6f10cf106d0a85a885632ecc 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -5,8 +5,6 @@ - - diff --git a/src/main/java/eu/siacs/conversations/android/JabberIdContact.java b/src/main/java/eu/siacs/conversations/android/JabberIdContact.java index 0b701d27ac34cded2c222279f664073cffaa1eb5..1cb4dfa71b68162e0f640f97619c077b67f4775f 100644 --- a/src/main/java/eu/siacs/conversations/android/JabberIdContact.java +++ b/src/main/java/eu/siacs/conversations/android/JabberIdContact.java @@ -8,28 +8,39 @@ import android.os.Build; import android.provider.ContactsContract; import android.util.Log; +import eu.siacs.conversations.Config; +import eu.siacs.conversations.services.QuickConversationsService; +import eu.siacs.conversations.xmpp.Jid; + import java.util.Collections; import java.util.HashMap; import java.util.Map; -import eu.siacs.conversations.Config; -import eu.siacs.conversations.xmpp.Jid; - public class JabberIdContact extends AbstractPhoneContact { - private static final String[] PROJECTION = new String[]{ContactsContract.Data._ID, - ContactsContract.Data.DISPLAY_NAME, - ContactsContract.Data.PHOTO_URI, - ContactsContract.Data.LOOKUP_KEY, - ContactsContract.CommonDataKinds.Im.DATA - }; - private static final String SELECTION = ContactsContract.Data.MIMETYPE + "=? AND (" + ContactsContract.CommonDataKinds.Im.PROTOCOL + "=? or (" + ContactsContract.CommonDataKinds.Im.PROTOCOL + "=? and lower(" + ContactsContract.CommonDataKinds.Im.CUSTOM_PROTOCOL + ")=?))"; + private static final String[] PROJECTION = + new String[] { + ContactsContract.Data._ID, + ContactsContract.Data.DISPLAY_NAME, + ContactsContract.Data.PHOTO_URI, + ContactsContract.Data.LOOKUP_KEY, + ContactsContract.CommonDataKinds.Im.DATA + }; + private static final String SELECTION = + ContactsContract.Data.MIMETYPE + + "=? AND (" + + ContactsContract.CommonDataKinds.Im.PROTOCOL + + "=? or (" + + ContactsContract.CommonDataKinds.Im.PROTOCOL + + "=? and lower(" + + ContactsContract.CommonDataKinds.Im.CUSTOM_PROTOCOL + + ")=?))"; private static final String[] SELECTION_ARGS = { - ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE, - String.valueOf(ContactsContract.CommonDataKinds.Im.PROTOCOL_JABBER), - String.valueOf(ContactsContract.CommonDataKinds.Im.PROTOCOL_CUSTOM), - "xmpp" + ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE, + String.valueOf(ContactsContract.CommonDataKinds.Im.PROTOCOL_JABBER), + String.valueOf(ContactsContract.CommonDataKinds.Im.PROTOCOL_CUSTOM), + "xmpp" }; private final Jid jid; @@ -37,8 +48,12 @@ public class JabberIdContact extends AbstractPhoneContact { private JabberIdContact(Cursor cursor) throws IllegalArgumentException { super(cursor); try { - this.jid = Jid.of(cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA))); - } catch (IllegalArgumentException | NullPointerException e) { + this.jid = + Jid.of( + cursor.getString( + cursor.getColumnIndexOrThrow( + ContactsContract.CommonDataKinds.Im.DATA))); + } catch (final IllegalArgumentException | NullPointerException e) { throw new IllegalArgumentException(e); } } @@ -48,10 +63,20 @@ public class JabberIdContact extends AbstractPhoneContact { } public static Map load(Context context) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context.checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { + if (!QuickConversationsService.isFreeOrQuicksyFlavor() + || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M + && context.checkSelfPermission(Manifest.permission.READ_CONTACTS) + != PackageManager.PERMISSION_GRANTED)) { return Collections.emptyMap(); } - try (final Cursor cursor = context.getContentResolver().query(ContactsContract.Data.CONTENT_URI, PROJECTION, SELECTION, SELECTION_ARGS, null)) { + try (final Cursor cursor = + context.getContentResolver() + .query( + ContactsContract.Data.CONTENT_URI, + PROJECTION, + SELECTION, + SELECTION_ARGS, + null)) { if (cursor == null) { return Collections.emptyMap(); } diff --git a/src/main/java/eu/siacs/conversations/services/AbstractQuickConversationsService.java b/src/main/java/eu/siacs/conversations/services/AbstractQuickConversationsService.java index ea883683a298bcb316876c4d49117d3b595e2733..47cb567d7d5f86e8ad0ca9b6890db904a8537f18 100644 --- a/src/main/java/eu/siacs/conversations/services/AbstractQuickConversationsService.java +++ b/src/main/java/eu/siacs/conversations/services/AbstractQuickConversationsService.java @@ -30,6 +30,10 @@ public abstract class AbstractQuickConversationsService { return "playstore".equals(BuildConfig.FLAVOR_distribution); } + public static boolean isFreeOrQuicksyFlavor() { + return "free".equals(BuildConfig.FLAVOR_distribution) || "quicksy".equals(BuildConfig.FLAVOR_mode); + } + public static boolean isQuicksyPlayStore() { return isQuicksy() && isPlayStoreFlavor(); } diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index 0a3e9059b3bc29ce923b37c332a0231fb38084f8..ec6d93cec69825b866c07827b83b98df5d5d7021 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -1290,7 +1290,11 @@ public class XmppConnectionService extends Service { restoreFromDatabase(); - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M || ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) { + if (QuickConversationsService.isFreeOrQuicksyFlavor() + && (Build.VERSION.SDK_INT < Build.VERSION_CODES.M + || ContextCompat.checkSelfPermission( + this, Manifest.permission.READ_CONTACTS) + == PackageManager.PERMISSION_GRANTED)) { startContactObserver(); } FILE_OBSERVER_EXECUTOR.execute(fileBackend::deleteHistoricAvatarPath); diff --git a/src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java b/src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java index f1556df6ec0323975acbc26b84ce9acd293b397d..6c4134b9fab820d3b4ac7beb0ddd0de82815c237 100644 --- a/src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java @@ -46,6 +46,7 @@ import eu.siacs.conversations.entities.Account; import eu.siacs.conversations.entities.Contact; import eu.siacs.conversations.entities.ListItem; import eu.siacs.conversations.services.AbstractQuickConversationsService; +import eu.siacs.conversations.services.QuickConversationsService; import eu.siacs.conversations.services.XmppConnectionService.OnAccountUpdate; import eu.siacs.conversations.services.XmppConnectionService.OnRosterUpdate; import eu.siacs.conversations.ui.adapter.MediaAdapter; @@ -119,13 +120,13 @@ public class ContactDetailsActivity extends OmemoActivity implements OnAccountUp private void checkContactPermissionAndShowAddDialog() { if (hasContactsPermission()) { showAddToPhoneBookDialog(); - } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + } else if (QuickConversationsService.isFreeOrQuicksyFlavor() && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, REQUEST_SYNC_CONTACTS); } } private boolean hasContactsPermission() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (QuickConversationsService.isFreeOrQuicksyFlavor() && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { return checkSelfPermission(Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED; } else { return true; @@ -523,18 +524,30 @@ public class ContactDetailsActivity extends OmemoActivity implements OnAccountUp } } - private void onBadgeClick(View view) { - final Uri systemAccount = contact.getSystemAccount(); - if (systemAccount == null) { - checkContactPermissionAndShowAddDialog(); - } else { - final Intent intent = new Intent(Intent.ACTION_VIEW); - intent.setData(systemAccount); - try { - startActivity(intent); - } catch (final ActivityNotFoundException e) { - Toast.makeText(this, R.string.no_application_found_to_view_contact, Toast.LENGTH_SHORT).show(); + private void onBadgeClick(final View view) { + if (QuickConversationsService.isFreeOrQuicksyFlavor()) { + final Uri systemAccount = contact.getSystemAccount(); + if (systemAccount == null) { + checkContactPermissionAndShowAddDialog(); + } else { + final Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setData(systemAccount); + try { + startActivity(intent); + } catch (final ActivityNotFoundException e) { + Toast.makeText( + this, + R.string.no_application_found_to_view_contact, + Toast.LENGTH_SHORT) + .show(); + } } + } else { + Toast.makeText( + this, + R.string.contact_list_integration_not_available, + Toast.LENGTH_SHORT) + .show(); } } diff --git a/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java b/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java index dfdc8be19cd8b060fb256d4fa832a126e3431241..18c1fb892732a172bf586188edc0ed38d5a04b9a 100644 --- a/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java @@ -761,7 +761,7 @@ public class StartConversationActivity extends XmppActivity implements XmppConne } private void askForContactsPermissions() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (QuickConversationsService.isFreeOrQuicksyFlavor() && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { if (mRequestedContactsPermission.compareAndSet(false, true)) { if (QuickConversationsService.isQuicksy() || shouldShowRequestPermissionRationale(Manifest.permission.READ_CONTACTS)) { @@ -840,8 +840,10 @@ public class StartConversationActivity extends XmppActivity implements XmppConne @Override protected void onBackendConnected() { - - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M || checkSelfPermission(Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) { + if (QuickConversationsService.isFreeOrQuicksyFlavor() + && (Build.VERSION.SDK_INT < Build.VERSION_CODES.M + || checkSelfPermission(Manifest.permission.READ_CONTACTS) + == PackageManager.PERMISSION_GRANTED)) { xmppConnectionService.getQuickConversationsService().considerSyncBackground(false); } if (mPostponedActivityResult != null) { diff --git a/src/main/java/eu/siacs/conversations/utils/PhoneHelper.java b/src/main/java/eu/siacs/conversations/utils/PhoneHelper.java index d76be537b788b81e98747d36c197e589806960e6..f6849e6d1ec351fae6093b44c3f568ea9913d6c5 100644 --- a/src/main/java/eu/siacs/conversations/utils/PhoneHelper.java +++ b/src/main/java/eu/siacs/conversations/utils/PhoneHelper.java @@ -10,6 +10,8 @@ import android.os.Build; import android.provider.ContactsContract.Profile; import android.provider.Settings; +import eu.siacs.conversations.services.QuickConversationsService; + public class PhoneHelper { @SuppressLint("HardwareIds") @@ -18,8 +20,10 @@ public class PhoneHelper { } public static Uri getProfilePictureUri(final Context context) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M - && context.checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { + if (!QuickConversationsService.isFreeOrQuicksyFlavor() + || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M + && context.checkSelfPermission(Manifest.permission.READ_CONTACTS) + != PackageManager.PERMISSION_GRANTED)) { return null; } final String[] projection = new String[] {Profile._ID, Profile.PHOTO_URI}; diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index b644fbdd4f81a52d84001d8559f71f83927cabcf..0f8a16b468ee5e669d7e3bd3f32bea2cded81b91 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -1024,4 +1024,5 @@ Report spam Report spam and block spammer Privacy policy + Address book integration is not available diff --git a/src/quicksy/AndroidManifest.xml b/src/quicksy/AndroidManifest.xml index 7b03ed1b7189711d18d0f943647edc067baa7119..78f60cebe68bca5fde493c8105ae6c75074ff4f5 100644 --- a/src/quicksy/AndroidManifest.xml +++ b/src/quicksy/AndroidManifest.xml @@ -6,6 +6,9 @@ android:name="android.permission.REQUEST_INSTALL_PACKAGES" tools:node="remove" /> + + +