diff --git a/bramble-android/build.gradle b/bramble-android/build.gradle
index cc6786f48..5ca4b8a51 100644
--- a/bramble-android/build.gradle
+++ b/bramble-android/build.gradle
@@ -12,7 +12,7 @@ android {
defaultConfig {
minSdkVersion 21
- targetSdkVersion 31
+ targetSdkVersion 33
versionCode 10504
versionName "1.5.4"
consumerProguardFiles 'proguard-rules.txt'
diff --git a/briar-android/build.gradle b/briar-android/build.gradle
index 88dcd1b2b..fa172c88e 100644
--- a/briar-android/build.gradle
+++ b/briar-android/build.gradle
@@ -25,7 +25,7 @@ android {
defaultConfig {
minSdkVersion 21
- targetSdkVersion 31
+ targetSdkVersion 33
versionCode 10504
versionName "1.5.4"
applicationId "org.briarproject.briar.android"
diff --git a/briar-android/src/main/AndroidManifest.xml b/briar-android/src/main/AndroidManifest.xml
index fd765c9f4..873971ae8 100644
--- a/briar-android/src/main/AndroidManifest.xml
+++ b/briar-android/src/main/AndroidManifest.xml
@@ -30,6 +30,7 @@
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18"
tools:ignore="ScopedStorage" />
+
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/account/SetPasswordFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/account/SetPasswordFragment.java
index 9d0047570..601cb59ff 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/account/SetPasswordFragment.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/account/SetPasswordFragment.java
@@ -19,10 +19,17 @@ import org.briarproject.nullsafety.ParametersNotNullByDefault;
import javax.annotation.Nullable;
+import androidx.activity.result.ActivityResultLauncher;
+import androidx.activity.result.contract.ActivityResultContracts.RequestPermission;
+
+import static android.Manifest.permission.POST_NOTIFICATIONS;
import static android.content.Context.INPUT_METHOD_SERVICE;
+import static android.content.pm.PackageManager.PERMISSION_GRANTED;
+import static android.os.Build.VERSION.SDK_INT;
import static android.view.View.INVISIBLE;
import static android.view.View.VISIBLE;
import static android.view.inputmethod.EditorInfo.IME_ACTION_DONE;
+import static androidx.core.content.ContextCompat.checkSelfPermission;
import static org.briarproject.bramble.api.crypto.PasswordStrengthEstimator.QUITE_WEAK;
import static org.briarproject.briar.android.util.UiUtils.setError;
@@ -38,6 +45,10 @@ public class SetPasswordFragment extends SetupFragment {
private StrengthMeter strengthMeter;
private Button nextButton;
+ private final ActivityResultLauncher requestPermissionLauncher =
+ registerForActivityResult(new RequestPermission(), isGranted ->
+ setPassword());
+
public static SetPasswordFragment newInstance() {
return new SetPasswordFragment();
}
@@ -121,6 +132,18 @@ public class SetPasswordFragment extends SetupFragment {
IBinder token = passwordEntry.getWindowToken();
Object o = requireContext().getSystemService(INPUT_METHOD_SERVICE);
((InputMethodManager) o).hideSoftInputFromWindow(token, 0);
+ if (SDK_INT >= 33 &&
+ checkSelfPermission(requireContext(), POST_NOTIFICATIONS) !=
+ PERMISSION_GRANTED) {
+ // this calls setPassword() when it returns
+ requestPermissionLauncher.launch(POST_NOTIFICATIONS);
+ } else {
+ setPassword();
+ }
+ }
+
+ private void setPassword() {
viewModel.setPassword(passwordEntry.getText().toString());
}
+
}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/login/PasswordFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/login/PasswordFragment.java
index 30d224c0a..7f5640444 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/login/PasswordFragment.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/login/PasswordFragment.java
@@ -22,13 +22,19 @@ import org.briarproject.nullsafety.ParametersNotNullByDefault;
import javax.annotation.Nullable;
import javax.inject.Inject;
+import androidx.activity.result.ActivityResultLauncher;
+import androidx.activity.result.contract.ActivityResultContracts.RequestPermission;
import androidx.appcompat.app.AlertDialog;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.ViewModelProvider;
+import static android.Manifest.permission.POST_NOTIFICATIONS;
+import static android.content.pm.PackageManager.PERMISSION_GRANTED;
+import static android.os.Build.VERSION.SDK_INT;
import static android.view.View.INVISIBLE;
import static android.view.View.VISIBLE;
import static android.view.inputmethod.EditorInfo.IME_ACTION_DONE;
+import static androidx.core.content.ContextCompat.checkSelfPermission;
import static org.briarproject.bramble.api.crypto.DecryptionResult.KEY_STRENGTHENER_ERROR;
import static org.briarproject.bramble.api.crypto.DecryptionResult.SUCCESS;
import static org.briarproject.briar.android.login.LoginUtils.createKeyStrengthenerErrorDialog;
@@ -52,6 +58,10 @@ public class PasswordFragment extends BaseFragment implements TextWatcher {
private TextInputLayout input;
private TextInputEditText password;
+ private final ActivityResultLauncher requestPermissionLauncher =
+ registerForActivityResult(new RequestPermission(), isGranted ->
+ validatePassword());
+
@Override
public void injectFragment(ActivityComponent component) {
component.inject(this);
@@ -109,6 +119,17 @@ public class PasswordFragment extends BaseFragment implements TextWatcher {
hideSoftKeyboard(password);
signInButton.setVisibility(INVISIBLE);
progress.setVisibility(VISIBLE);
+ if (SDK_INT >= 33 &&
+ checkSelfPermission(requireContext(), POST_NOTIFICATIONS) !=
+ PERMISSION_GRANTED) {
+ // this calls validatePassword() when it returns
+ requestPermissionLauncher.launch(POST_NOTIFICATIONS);
+ } else {
+ validatePassword();
+ }
+ }
+
+ private void validatePassword() {
viewModel.validatePassword(password.getText().toString());
}
diff --git a/briar-android/src/main/res/layout/info_view.xml b/briar-android/src/main/res/layout/info_view.xml
index c7cf40f7b..8a884a4d8 100644
--- a/briar-android/src/main/res/layout/info_view.xml
+++ b/briar-android/src/main/res/layout/info_view.xml
@@ -13,10 +13,10 @@
android:layout_margin="@dimen/margin_medium"
android:contentDescription="@string/info"
android:drawablePadding="@dimen/margin_medium"
- android:drawableTint="?attr/colorControlNormal"
android:gravity="center_vertical"
app:drawableLeftCompat="@drawable/ic_info_dark"
app:drawableStartCompat="@drawable/ic_info_dark"
+ app:drawableTint="?attr/colorControlNormal"
tools:text="Did you know that if you took all the veins out of your body and laid them out end to end, you would die?" />
\ No newline at end of file