Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

set targetSdkVersion to 33 #2649

Merged
merged 15 commits into from
Oct 2, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,10 @@

<!-- dangerous permissions - we need to as the user with a PermissionsRequest -->
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
Expand Down
4 changes: 2 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ dependencies {
android {
namespace "org.thoughtcrime.securesms"
flavorDimensions "none"
compileSdkVersion 32
compileSdkVersion 33

// Set NDK version to strip native libraries.
// Even though we compile our libraries outside Gradle with `scripts/ndk-make.sh`,
Expand All @@ -105,7 +105,7 @@ android {
multiDexEnabled true

minSdkVersion 16
targetSdkVersion 32
targetSdkVersion 33

vectorDrawables.useSupportLibrary = true

Expand Down
2 changes: 2 additions & 0 deletions res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -919,6 +919,7 @@
<string name="notify_name_and_message">Name and message</string>
<string name="notify_name_only">Name only</string>
<string name="notify_no_name_or_message">No name or message</string>
<string name="notifications_disabled">Notifications disabled</string>


<!-- permissions -->
Expand All @@ -928,6 +929,7 @@
<string name="perm_explain_access_to_mic_denied">To send audio messages, go to the app settings, select \"Permissions\", and enable \"Microphone\".</string>
<string name="perm_explain_access_to_storage_denied">To receive or send files, go to the app settings, select \"Permissions\", and enable \"Storage\".</string>
<string name="perm_explain_access_to_location_denied">To attach a location, go to the app settings, select \"Permissions\", and enable \"Location\".</string>
<string name="perm_explain_access_to_notifications_denied">To receive notifications, go to \"System Settings / Apps / Delta Chat\" and enable \"Notifications\".</string>

<!-- ImageEditorHud -->
<string name="ImageEditorHud_draw_anywhere_to_blur">Draw anywhere to blur</string>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
*/
package org.thoughtcrime.securesms;

import android.Manifest;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.Intent;
Expand Down Expand Up @@ -247,7 +248,16 @@ public boolean onPreferenceClick(Preference preference) {

switch (category) {
case PREFERENCE_CATEGORY_NOTIFICATIONS:
fragment = new NotificationsPreferenceFragment();
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU || Permissions.hasAll(getActivity(), Manifest.permission.POST_NOTIFICATIONS)) {
fragment = new NotificationsPreferenceFragment();
} else {
new AlertDialog.Builder(getActivity())
.setTitle(R.string.notifications_disabled)
.setMessage(R.string.perm_explain_access_to_notifications_denied)
.setPositiveButton(R.string.perm_continue, (dialog, which) -> getActivity().startActivity(Permissions.getApplicationSettingsIntent(getActivity())))
.setNegativeButton(android.R.string.cancel, null)
.show();
}
break;
case PREFERENCE_CATEGORY_CONNECTIVITY:
startActivity(new Intent(getActivity(), ConnectivityActivity.class));
Expand Down
7 changes: 7 additions & 0 deletions src/org/thoughtcrime/securesms/ConversationListActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.Toolbar;
import androidx.appcompat.widget.TooltipCompat;
Expand All @@ -58,6 +59,7 @@
import org.thoughtcrime.securesms.connect.DirectShareUtil;
import org.thoughtcrime.securesms.map.MapActivity;
import org.thoughtcrime.securesms.mms.GlideApp;
import org.thoughtcrime.securesms.permissions.Permissions;
import org.thoughtcrime.securesms.qr.QrActivity;
import org.thoughtcrime.securesms.qr.QrCodeHandler;
import org.thoughtcrime.securesms.recipients.Recipient;
Expand Down Expand Up @@ -443,4 +445,9 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
break;
}
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
Permissions.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
}
}
27 changes: 26 additions & 1 deletion src/org/thoughtcrime/securesms/ConversationListFragment.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
*/
package org.thoughtcrime.securesms;

import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
Expand Down Expand Up @@ -50,6 +51,7 @@
import com.b44t.messenger.DcChatlist;
import com.b44t.messenger.DcContext;
import com.b44t.messenger.DcEvent;
import com.b44t.messenger.DcMsg;
import com.google.android.material.snackbar.Snackbar;

import org.thoughtcrime.securesms.ConversationListAdapter.ItemClickListener;
Expand All @@ -60,6 +62,8 @@
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.connect.DirectShareUtil;
import org.thoughtcrime.securesms.mms.GlideApp;
import org.thoughtcrime.securesms.permissions.Permissions;
import org.thoughtcrime.securesms.util.Prefs;
import org.thoughtcrime.securesms.util.RelayUtil;
import org.thoughtcrime.securesms.util.SendRelayedMessageUtil;
import org.thoughtcrime.securesms.util.Util;
Expand Down Expand Up @@ -267,7 +271,28 @@ protected Void doInBackground(Context... params) {

@Override
protected void onPostExecute(Void result) {
DozeReminder.maybeAskDirectly(getActivity());
Activity activity = ConversationListFragment.this.getActivity();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
if (!Prefs.getBooleanPreference(activity, Prefs.ASKED_FOR_NOTIFICATION_PERMISSION, false)) {
Prefs.setBooleanPreference(activity, Prefs.ASKED_FOR_NOTIFICATION_PERMISSION, true);
Permissions.with(activity)
.request(Manifest.permission.POST_NOTIFICATIONS)
.ifNecessary()
.onAllGranted(() -> {
DozeReminder.maybeAskDirectly(getActivity());
})
.onAnyDenied(() -> {
final DcContext dcContext = DcHelper.getContext(activity);
DcMsg msg = new DcMsg(dcContext, DcMsg.DC_MSG_TEXT);
msg.setText("\uD83D\uDC49 "+activity.getString(R.string.notifications_disabled)+" \uD83D\uDC48\n\n"
+activity.getString(R.string.perm_explain_access_to_notifications_denied));
dcContext.addDeviceMsg("android.notifications-disabled", msg);
})
.execute();
}
} else {
DozeReminder.maybeAskDirectly(getActivity());
}
}
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, getActivity());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ public AttachmentTypeSelector(@NonNull Context context, @NonNull LoaderManager l
}

public void show(@NonNull Activity activity, final @NonNull View anchor) {
if (Permissions.hasAll(activity, Manifest.permission.READ_EXTERNAL_STORAGE)) {
if (Permissions.hasAll(activity, Permissions.galleryPermissions())) {
recentRail.setVisibility(View.VISIBLE);
loaderManager.restartLoader(1, null, recentRail);
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ public AvatarSelector(@NonNull Context context, @NonNull LoaderManager loaderMan
}

public void show(@NonNull Activity activity, final @NonNull View anchor) {
if (Permissions.hasAll(activity, Manifest.permission.READ_EXTERNAL_STORAGE)) {
if (Permissions.hasAll(activity, Permissions.galleryPermissions())) {
recentRail.setVisibility(View.VISIBLE);
loaderManager.restartLoader(1, null, recentRail);
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public RecentPhotosLoader(Context context) {

@Override
public Cursor loadInBackground() {
if (Permissions.hasAll(context, Manifest.permission.READ_EXTERNAL_STORAGE)) {
if (Permissions.hasAll(context, Permissions.galleryPermissions())) {
return context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
PROJECTION, SELECTION, null,
MediaStore.Images.ImageColumns.DATE_MODIFIED + " DESC");
Expand Down
4 changes: 2 additions & 2 deletions src/org/thoughtcrime/securesms/mms/AttachmentManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -445,7 +445,7 @@ public static void selectDocument(Activity activity, int requestCode) {

public static void selectGallery(Activity activity, int requestCode) {
Permissions.with(activity)
.request(Manifest.permission.READ_EXTERNAL_STORAGE)
.request(Permissions.galleryPermissions())
.ifNecessary()
.withPermanentDenialDialog(activity.getString(R.string.perm_explain_access_to_storage_denied))
.onAllGranted(() -> selectMediaType(activity, "image/*", new String[] {"image/*", "video/*"}, requestCode))
Expand All @@ -454,7 +454,7 @@ public static void selectGallery(Activity activity, int requestCode) {

public static void selectImage(Activity activity, int requestCode) {
Permissions.with(activity)
.request(Manifest.permission.READ_EXTERNAL_STORAGE)
.request(Permissions.galleryPermissions())
.ifNecessary()
.withPermanentDenialDialog(activity.getString(R.string.perm_explain_access_to_storage_denied))
.onAllGranted(() -> selectMediaType(activity, "image/*", null, requestCode))
Expand Down
27 changes: 26 additions & 1 deletion src/org/thoughtcrime/securesms/permissions/Permissions.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.thoughtcrime.securesms.permissions;


import android.Manifest;
import android.app.Activity;
import androidx.appcompat.app.AlertDialog;
import android.content.Context;
Expand Down Expand Up @@ -34,6 +35,18 @@

public class Permissions {

public static String[] galleryPermissions() {
// on modern androids, the gallery picker works without permissions,
// however, the "camera roll" still requires permissions.
// to get that dialog at a UX-wise good moment, we still always ask for permission when opening gallery.
// just-always-asking this also avoids the mess with handling various paths for various apis.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
return new String[]{Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO};
} else {
return new String[]{Manifest.permission.READ_EXTERNAL_STORAGE};
}
}

private static final Map<Integer, PermissionsRequest> OUTSTANDING = new LRUCache<>(2);

public static PermissionsBuilder with(@NonNull Activity activity) {
Expand Down Expand Up @@ -134,6 +147,18 @@ public PermissionsBuilder onSomePermanentlyDenied(Consumer<List<String>> somePer
}

public void execute() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
// READ_EXTERNAL_STORAGE and WRITE_EXTERNAL_STORAGE does not exist on modern androids
// as file access is done by pickers
String[] r = requestedPermissions;
Arrays.sort(r);
if ( (r.length == 1 && (r[0].equals(Manifest.permission.READ_EXTERNAL_STORAGE) || r[0].equals(Manifest.permission.WRITE_EXTERNAL_STORAGE)))
|| (r.length == 2 && r[0].equals(Manifest.permission.READ_EXTERNAL_STORAGE) && r[1].equals(Manifest.permission.WRITE_EXTERNAL_STORAGE)) ) {
allGrantedListener.run();
return;
}
}

PermissionsRequest request = new PermissionsRequest(allGrantedListener, anyDeniedListener, anyPermanentlyDeniedListener, anyResultListener,
someGrantedListener, someDeniedListener, somePermanentlyDeniedListener);

Expand Down Expand Up @@ -247,7 +272,7 @@ private static void onRequestPermissionsResult(@NonNull PermissionObject context
resultListener.onResult(permissions, grantResults, shouldShowRationaleDialog);
}

private static Intent getApplicationSettingsIntent(@NonNull Context context) {
public static Intent getApplicationSettingsIntent(@NonNull Context context) {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", context.getPackageName(), null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import org.thoughtcrime.securesms.ApplicationPreferencesActivity;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.connect.KeepAliveService;
import org.thoughtcrime.securesms.permissions.Permissions;
import org.thoughtcrime.securesms.util.Prefs;

import static android.app.Activity.RESULT_OK;
Expand Down Expand Up @@ -198,8 +199,10 @@ private void initializeRingtoneSummary(Preference pref) {
}

public static CharSequence getSummary(Context context) {
boolean notificationsEnabled = Prefs.isNotificationsEnabled(context);
String ret = context.getString(notificationsEnabled ? R.string.on : R.string.off);
return ret;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU || Permissions.hasAll(context, Manifest.permission.POST_NOTIFICATIONS)) {
return context.getString(Prefs.isNotificationsEnabled(context) ? R.string.on : R.string.off);
} else {
return context.getString(R.string.disabled_in_system_settings);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ public static void appendSSID(Activity activity, final TextView textView) {
new Thread(() -> {
try {
// depending on the android version, getting the SSID requires none, all or one of
// ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION, ACCESS_WIFI_STATE, ACCESS_NETWORK_STATE and maybe even more.
// ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION, NEARBY_WIFI_DEVICES, ACCESS_WIFI_STATE, ACCESS_NETWORK_STATE and maybe even more.
final WifiManager wifiManager = (WifiManager)activity.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
if (wifiManager.isWifiEnabled()) {
final WifiInfo info = wifiManager.getConnectionInfo();
Expand Down
1 change: 1 addition & 0 deletions src/org/thoughtcrime/securesms/util/Prefs.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ public class Prefs {
private static final String ENTER_SENDS_PREF = "pref_enter_sends";
private static final String PROMPTED_DOZE_MSG_ID_PREF = "pref_prompted_doze_msg_id";
public static final String DOZE_ASKED_DIRECTLY = "pref_doze_asked_directly";
public static final String ASKED_FOR_NOTIFICATION_PERMISSION= "pref_asked_for_notification_permission";
private static final String IN_THREAD_NOTIFICATION_PREF = "pref_key_inthread_notifications";
public static final String MESSAGE_BODY_TEXT_SIZE_PREF = "pref_message_body_text_size";

Expand Down
Loading