Loading app/src/main/AndroidManifest.xml +2 −3 Original line number Diff line number Diff line Loading @@ -4,8 +4,8 @@ android:installLocation="internalOnly"> <!-- normal permissions --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.BIND_AUTOFILL_SERVICE" tools:ignore="ProtectedPermissions" /> <!--<uses-permission android:name="android.permission.BIND_AUTOFILL_SERVICE" tools:ignore="ProtectedPermissions" />--> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.INTERNET" /> Loading Loading @@ -357,7 +357,6 @@ </service> <!-- account type "Eelo" --> <service android:name=".syncadapter.EeloAccountAuthenticatorService" android:permission="android.permission.BIND_AUTOFILL_SERVICE" android:exported="false"> <intent-filter> <action android:name="android.accounts.AccountAuthenticator" /> Loading app/src/main/java/at/bitfire/davdroid/ReLoginWithOidcActivity.kt +37 −23 Original line number Diff line number Diff line package at.bitfire.davdroid import android.accounts.AccountManager import android.accounts.AccountManager.KEY_ACCOUNT_NAME import android.accounts.AccountManager.KEY_ACCOUNT_SESSION_BUNDLE import android.accounts.AccountManager.KEY_ACCOUNT_TYPE import android.accounts.AccountManager.KEY_BOOLEAN_RESULT import android.accounts.AccountManager.KEY_INTENT import android.accounts.AccountManagerFuture Loading @@ -20,23 +22,19 @@ import java.io.IOException class ReLoginWithOidcActivity : AppCompatActivity() { private lateinit var addAccountLauncher: ActivityResultLauncher<Intent> private var sessionBundle: Bundle? = null override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) { super.onCreate(savedInstanceState, persistentState) val accountManager = AccountManager.get(this) // Initialize the ActivityResultLauncher addAccountLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { // Account was added successfully // Handle the result here accountManager.finishSession(sessionBundle, null, { _ -> Logger.log.info("Vincent: Account added") finish() }, null) Logger.log.info("Vincent: callback for resultActivity launch") } } } Loading @@ -44,7 +42,7 @@ class ReLoginWithOidcActivity : AppCompatActivity() { override fun onStart() { super.onStart() val accountName = intent?.extras?.getString(AccountManager.KEY_ACCOUNT_NAME, null) ?: return val accountName = intent?.extras?.getString(KEY_ACCOUNT_NAME, null) ?: return val accountRemovalCallback: (AliasFuture) -> Unit = { future -> val success = future.result.getBoolean(KEY_BOOLEAN_RESULT) Loading Loading @@ -81,8 +79,19 @@ class ReLoginWithOidcActivity : AppCompatActivity() { Logger.log.info("Vincent: Will start add Account Session for: $eAccountType account type") try { accountManager.addAccount(eAccountType, null, arrayOf(), null, this, { future -> startAddAccount(future) }, null ) //todo only work for API 33 ? accountManager.startAddAccountSession( /*accountManager.startAddAccountSession( eAccountType, null, arrayOf(), Loading @@ -90,7 +99,7 @@ class ReLoginWithOidcActivity : AppCompatActivity() { this, { future -> startAddAccount(future) }, null ) )*/ } catch (exception: AuthenticatorException) { Logger.log.info("Vincent: AuthenticatorException: can't add account: ${exception.message}") Loading @@ -103,24 +112,29 @@ class ReLoginWithOidcActivity : AppCompatActivity() { private fun startAddAccount(future: AliasFuture) { try { val intent: Intent? val result = future.result?: run { Logger.log.info("Vincent: Can't add new account: future.result is null") return } val accountName = result.getString(KEY_ACCOUNT_NAME) val accountType = result.getString(KEY_ACCOUNT_TYPE, "unexepected account type") if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { intent = future.result.getParcelable(KEY_INTENT, Intent::class.java) sessionBundle = future.result.getParcelable(KEY_ACCOUNT_SESSION_BUNDLE, Bundle::class.java) } else { intent = future.result.getParcelable<Intent>(KEY_INTENT) sessionBundle = future.result.getParcelable<Bundle>(KEY_ACCOUNT_SESSION_BUNDLE) if (accountName != null) { Logger.log.info("Vincent: ($accountType) account added: $accountName") finish() return } if (sessionBundle == null) { Logger.log.info("Vincent: session bundle is null") val intent = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { result.getParcelable(KEY_INTENT, Intent::class.java) } else { result.getParcelable<Intent>(KEY_INTENT) } try { intent?.let { Logger.log.info("Vincent: start activity for result with intent") addAccountLauncher.launch(it) } } catch (exception: Exception) { Loading Loading
app/src/main/AndroidManifest.xml +2 −3 Original line number Diff line number Diff line Loading @@ -4,8 +4,8 @@ android:installLocation="internalOnly"> <!-- normal permissions --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.BIND_AUTOFILL_SERVICE" tools:ignore="ProtectedPermissions" /> <!--<uses-permission android:name="android.permission.BIND_AUTOFILL_SERVICE" tools:ignore="ProtectedPermissions" />--> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.INTERNET" /> Loading Loading @@ -357,7 +357,6 @@ </service> <!-- account type "Eelo" --> <service android:name=".syncadapter.EeloAccountAuthenticatorService" android:permission="android.permission.BIND_AUTOFILL_SERVICE" android:exported="false"> <intent-filter> <action android:name="android.accounts.AccountAuthenticator" /> Loading
app/src/main/java/at/bitfire/davdroid/ReLoginWithOidcActivity.kt +37 −23 Original line number Diff line number Diff line package at.bitfire.davdroid import android.accounts.AccountManager import android.accounts.AccountManager.KEY_ACCOUNT_NAME import android.accounts.AccountManager.KEY_ACCOUNT_SESSION_BUNDLE import android.accounts.AccountManager.KEY_ACCOUNT_TYPE import android.accounts.AccountManager.KEY_BOOLEAN_RESULT import android.accounts.AccountManager.KEY_INTENT import android.accounts.AccountManagerFuture Loading @@ -20,23 +22,19 @@ import java.io.IOException class ReLoginWithOidcActivity : AppCompatActivity() { private lateinit var addAccountLauncher: ActivityResultLauncher<Intent> private var sessionBundle: Bundle? = null override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) { super.onCreate(savedInstanceState, persistentState) val accountManager = AccountManager.get(this) // Initialize the ActivityResultLauncher addAccountLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { // Account was added successfully // Handle the result here accountManager.finishSession(sessionBundle, null, { _ -> Logger.log.info("Vincent: Account added") finish() }, null) Logger.log.info("Vincent: callback for resultActivity launch") } } } Loading @@ -44,7 +42,7 @@ class ReLoginWithOidcActivity : AppCompatActivity() { override fun onStart() { super.onStart() val accountName = intent?.extras?.getString(AccountManager.KEY_ACCOUNT_NAME, null) ?: return val accountName = intent?.extras?.getString(KEY_ACCOUNT_NAME, null) ?: return val accountRemovalCallback: (AliasFuture) -> Unit = { future -> val success = future.result.getBoolean(KEY_BOOLEAN_RESULT) Loading Loading @@ -81,8 +79,19 @@ class ReLoginWithOidcActivity : AppCompatActivity() { Logger.log.info("Vincent: Will start add Account Session for: $eAccountType account type") try { accountManager.addAccount(eAccountType, null, arrayOf(), null, this, { future -> startAddAccount(future) }, null ) //todo only work for API 33 ? accountManager.startAddAccountSession( /*accountManager.startAddAccountSession( eAccountType, null, arrayOf(), Loading @@ -90,7 +99,7 @@ class ReLoginWithOidcActivity : AppCompatActivity() { this, { future -> startAddAccount(future) }, null ) )*/ } catch (exception: AuthenticatorException) { Logger.log.info("Vincent: AuthenticatorException: can't add account: ${exception.message}") Loading @@ -103,24 +112,29 @@ class ReLoginWithOidcActivity : AppCompatActivity() { private fun startAddAccount(future: AliasFuture) { try { val intent: Intent? val result = future.result?: run { Logger.log.info("Vincent: Can't add new account: future.result is null") return } val accountName = result.getString(KEY_ACCOUNT_NAME) val accountType = result.getString(KEY_ACCOUNT_TYPE, "unexepected account type") if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { intent = future.result.getParcelable(KEY_INTENT, Intent::class.java) sessionBundle = future.result.getParcelable(KEY_ACCOUNT_SESSION_BUNDLE, Bundle::class.java) } else { intent = future.result.getParcelable<Intent>(KEY_INTENT) sessionBundle = future.result.getParcelable<Bundle>(KEY_ACCOUNT_SESSION_BUNDLE) if (accountName != null) { Logger.log.info("Vincent: ($accountType) account added: $accountName") finish() return } if (sessionBundle == null) { Logger.log.info("Vincent: session bundle is null") val intent = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { result.getParcelable(KEY_INTENT, Intent::class.java) } else { result.getParcelable<Intent>(KEY_INTENT) } try { intent?.let { Logger.log.info("Vincent: start activity for result with intent") addAccountLauncher.launch(it) } } catch (exception: Exception) { Loading