Benoit Marty
1 year ago
14 changed files with 243 additions and 68 deletions
@ -0,0 +1,22 @@
@@ -0,0 +1,22 @@
|
||||
/* |
||||
* Copyright (c) 2023 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.appnav.loggedin |
||||
|
||||
// TODO Add your events or remove the file completely if no events |
||||
sealed interface LoggedInEvents { |
||||
object MyEvent : LoggedInEvents |
||||
} |
@ -0,0 +1,62 @@
@@ -0,0 +1,62 @@
|
||||
/* |
||||
* Copyright (c) 2023 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.appnav.loggedin |
||||
|
||||
import android.Manifest |
||||
import android.os.Build |
||||
import androidx.compose.runtime.Composable |
||||
import io.element.android.libraries.architecture.Presenter |
||||
import io.element.android.libraries.matrix.api.MatrixClient |
||||
import io.element.android.libraries.permissions.api.PermissionsPresenter |
||||
import io.element.android.libraries.permissions.noop.NoopPermissionsPresenter |
||||
import io.element.android.libraries.push.api.PushService |
||||
import javax.inject.Inject |
||||
|
||||
class LoggedInPresenter @Inject constructor( |
||||
private val permissionsPresenterFactory: PermissionsPresenter.Factory, |
||||
// private val matrixClient: MatrixClient, |
||||
// private val pushService: PushService, |
||||
) : Presenter<LoggedInState> { |
||||
|
||||
private val postNotificationPermissionsPresenter by lazy { |
||||
// Ask for POST_NOTIFICATION PERMISSION on Android 13+ |
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { |
||||
permissionsPresenterFactory.create(Manifest.permission.POST_NOTIFICATIONS) |
||||
} else { |
||||
NoopPermissionsPresenter() |
||||
} |
||||
} |
||||
|
||||
@Composable |
||||
override fun present(): LoggedInState { |
||||
|
||||
// TODO EAx pushService.registerPusher(matrixClient.sessionId) |
||||
|
||||
val permissionsState = postNotificationPermissionsPresenter.present() |
||||
|
||||
fun handleEvents(event: LoggedInEvents) { |
||||
when (event) { |
||||
LoggedInEvents.MyEvent -> Unit |
||||
} |
||||
} |
||||
|
||||
return LoggedInState( |
||||
permissionsState = permissionsState, |
||||
eventSink = ::handleEvents |
||||
) |
||||
} |
||||
} |
@ -0,0 +1,24 @@
@@ -0,0 +1,24 @@
|
||||
/* |
||||
* Copyright (c) 2023 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.appnav.loggedin |
||||
|
||||
import io.element.android.libraries.permissions.api.PermissionsState |
||||
|
||||
data class LoggedInState( |
||||
val permissionsState: PermissionsState, |
||||
val eventSink: (LoggedInEvents) -> Unit |
||||
) |
@ -0,0 +1,33 @@
@@ -0,0 +1,33 @@
|
||||
/* |
||||
* Copyright (c) 2023 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.appnav.loggedin |
||||
|
||||
import androidx.compose.ui.tooling.preview.PreviewParameterProvider |
||||
import io.element.android.libraries.permissions.api.createDummyPostNotificationPermissionsState |
||||
|
||||
open class LoggedInStateProvider : PreviewParameterProvider<LoggedInState> { |
||||
override val values: Sequence<LoggedInState> |
||||
get() = sequenceOf( |
||||
aLoggedInState(), |
||||
// Add other state here |
||||
) |
||||
} |
||||
|
||||
fun aLoggedInState() = LoggedInState( |
||||
permissionsState = createDummyPostNotificationPermissionsState(), |
||||
eventSink = {} |
||||
) |
@ -0,0 +1,76 @@
@@ -0,0 +1,76 @@
|
||||
/* |
||||
* Copyright (c) 2023 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.appnav.loggedin |
||||
|
||||
import android.app.Activity |
||||
import androidx.compose.foundation.layout.Box |
||||
import androidx.compose.foundation.layout.BoxScope |
||||
import androidx.compose.foundation.layout.fillMaxSize |
||||
import androidx.compose.runtime.Composable |
||||
import androidx.compose.ui.Alignment |
||||
import androidx.compose.ui.Modifier |
||||
import androidx.compose.ui.platform.LocalContext |
||||
import androidx.compose.ui.tooling.preview.Preview |
||||
import androidx.compose.ui.tooling.preview.PreviewParameter |
||||
import io.element.android.libraries.androidutils.system.openAppSettingsPage |
||||
import io.element.android.libraries.designsystem.preview.ElementPreviewDark |
||||
import io.element.android.libraries.designsystem.preview.ElementPreviewLight |
||||
import io.element.android.libraries.designsystem.theme.components.Text |
||||
import io.element.android.libraries.permissions.api.PermissionsView |
||||
|
||||
@Composable |
||||
fun LoggedInView( |
||||
state: LoggedInState, |
||||
modifier: Modifier = Modifier, |
||||
children: @Composable BoxScope.() -> Unit, |
||||
) { |
||||
val activity = LocalContext.current as? Activity |
||||
|
||||
Box( |
||||
modifier = modifier |
||||
.fillMaxSize(), |
||||
contentAlignment = Alignment.TopCenter, |
||||
) { |
||||
children() |
||||
|
||||
PermissionsView( |
||||
state = state.permissionsState, |
||||
openSystemSettings = { |
||||
activity?.let { openAppSettingsPage(it, "") } |
||||
} |
||||
) |
||||
} |
||||
} |
||||
|
||||
@Preview |
||||
@Composable |
||||
fun LoggedInViewLightPreview(@PreviewParameter(LoggedInStateProvider::class) state: LoggedInState) = |
||||
ElementPreviewLight { ContentToPreview(state) } |
||||
|
||||
@Preview |
||||
@Composable |
||||
fun LoggedInViewDarkPreview(@PreviewParameter(LoggedInStateProvider::class) state: LoggedInState) = |
||||
ElementPreviewDark { ContentToPreview(state) } |
||||
|
||||
@Composable |
||||
private fun ContentToPreview(state: LoggedInState) { |
||||
LoggedInView( |
||||
state = state |
||||
) { |
||||
Text("Children") |
||||
} |
||||
} |
Loading…
Reference in new issue