Benoit Marty
1 year ago
14 changed files with 243 additions and 68 deletions
@ -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 @@ |
|||||||
|
/* |
||||||
|
* 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 @@ |
|||||||
|
/* |
||||||
|
* 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 @@ |
|||||||
|
/* |
||||||
|
* 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 @@ |
|||||||
|
/* |
||||||
|
* 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