ganfra
4 months ago
11 changed files with 219 additions and 41 deletions
@ -0,0 +1 @@
@@ -0,0 +1 @@
|
||||
Fix modal contents overlapping screen lock pin. |
@ -0,0 +1,71 @@
@@ -0,0 +1,71 @@
|
||||
/* |
||||
* Copyright (c) 2024 New Vector Ltd |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0 |
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package io.element.android.features.lockscreen.impl.unlock.activity |
||||
|
||||
import android.content.Context |
||||
import android.content.Intent |
||||
import android.os.Bundle |
||||
import androidx.activity.OnBackPressedCallback |
||||
import androidx.activity.compose.setContent |
||||
import androidx.activity.enableEdgeToEdge |
||||
import androidx.appcompat.app.AppCompatActivity |
||||
import androidx.lifecycle.lifecycleScope |
||||
import io.element.android.compound.theme.ElementTheme |
||||
import io.element.android.features.lockscreen.api.LockScreenLockState |
||||
import io.element.android.features.lockscreen.api.LockScreenService |
||||
import io.element.android.features.lockscreen.impl.unlock.PinUnlockPresenter |
||||
import io.element.android.features.lockscreen.impl.unlock.PinUnlockView |
||||
import io.element.android.features.lockscreen.impl.unlock.di.PinUnlockBindings |
||||
import io.element.android.libraries.architecture.bindings |
||||
import kotlinx.coroutines.launch |
||||
import javax.inject.Inject |
||||
|
||||
class PinUnlockActivity : AppCompatActivity() { |
||||
companion object { |
||||
fun newIntent(context: Context): Intent { |
||||
return Intent(context, PinUnlockActivity::class.java) |
||||
} |
||||
} |
||||
|
||||
@Inject lateinit var presenter: PinUnlockPresenter |
||||
@Inject lateinit var lockScreenService: LockScreenService |
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) { |
||||
enableEdgeToEdge() |
||||
super.onCreate(savedInstanceState) |
||||
bindings<PinUnlockBindings>().inject(this) |
||||
setContent { |
||||
ElementTheme { |
||||
val state = presenter.present() |
||||
PinUnlockView(state = state, isInAppUnlock = false) |
||||
} |
||||
} |
||||
lifecycleScope.launch { |
||||
lockScreenService.lockState.collect { state -> |
||||
if (state == LockScreenLockState.Unlocked) { |
||||
finish() |
||||
} |
||||
} |
||||
} |
||||
val onBackPressedCallback = object : OnBackPressedCallback(true) { |
||||
override fun handleOnBackPressed() { |
||||
moveTaskToBack(true) |
||||
} |
||||
} |
||||
onBackPressedDispatcher.addCallback(this, onBackPressedCallback) |
||||
} |
||||
} |
@ -0,0 +1,26 @@
@@ -0,0 +1,26 @@
|
||||
/* |
||||
* Copyright (c) 2024 New Vector Ltd |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0 |
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package io.element.android.features.lockscreen.impl.unlock.di |
||||
|
||||
import com.squareup.anvil.annotations.ContributesTo |
||||
import io.element.android.features.lockscreen.impl.unlock.activity.PinUnlockActivity |
||||
import io.element.android.libraries.di.AppScope |
||||
|
||||
@ContributesTo(AppScope::class) |
||||
interface PinUnlockBindings { |
||||
fun inject(activity: PinUnlockActivity) |
||||
} |
@ -0,0 +1,40 @@
@@ -0,0 +1,40 @@
|
||||
/* |
||||
* Copyright (c) 2024 New Vector Ltd |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0 |
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package io.element.android.features.lockscreen.impl.unlock.signout |
||||
|
||||
import com.squareup.anvil.annotations.ContributesBinding |
||||
import io.element.android.libraries.di.AppScope |
||||
import io.element.android.libraries.matrix.api.MatrixClientProvider |
||||
import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService |
||||
import javax.inject.Inject |
||||
|
||||
@ContributesBinding(AppScope::class) |
||||
class DefaultSignOut @Inject constructor( |
||||
private val authenticationService: MatrixAuthenticationService, |
||||
private val matrixClientProvider: MatrixClientProvider, |
||||
) : SignOut { |
||||
override suspend fun invoke(): String? { |
||||
val currentSession = authenticationService.getLatestSessionId() |
||||
return if (currentSession != null) { |
||||
matrixClientProvider.getOrRestore(currentSession) |
||||
.getOrThrow() |
||||
.logout(ignoreSdkError = true) |
||||
} else { |
||||
error("No session to sign out") |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,21 @@
@@ -0,0 +1,21 @@
|
||||
/* |
||||
* Copyright (c) 2024 New Vector Ltd |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0 |
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package io.element.android.features.lockscreen.impl.unlock.signout |
||||
|
||||
interface SignOut { |
||||
suspend operator fun invoke(): String? |
||||
} |
@ -0,0 +1,28 @@
@@ -0,0 +1,28 @@
|
||||
/* |
||||
* Copyright (c) 2024 New Vector Ltd |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0 |
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package io.element.android.features.lockscreen.impl.unlock |
||||
|
||||
import io.element.android.features.lockscreen.impl.unlock.signout.SignOut |
||||
import io.element.android.tests.testutils.simulateLongTask |
||||
|
||||
class FakeSignOut( |
||||
var lambda: () -> String? = { null } |
||||
) : SignOut { |
||||
override suspend fun invoke(): String? = simulateLongTask { |
||||
lambda() |
||||
} |
||||
} |
Loading…
Reference in new issue