Skip to content

Handled on login redirection #14

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Dec 11, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
145 changes: 145 additions & 0 deletions app/src/main/java/pl/tkadziolka/snipmeandroid/bridge/Bridge.java
Original file line number Diff line number Diff line change
Expand Up @@ -965,6 +965,84 @@ public static final class Builder {
}
}

/** Generated class from Pigeon that represents data sent in messages. */
public static class LoginModelStateData {
private @Nullable ModelState state;
public @Nullable ModelState getState() { return state; }
public void setState(@Nullable ModelState setterArg) {
this.state = setterArg;
}

private @Nullable Boolean is_loading;
public @Nullable Boolean getIs_loading() { return is_loading; }
public void setIs_loading(@Nullable Boolean setterArg) {
this.is_loading = setterArg;
}

private @Nullable Long oldHash;
public @Nullable Long getOldHash() { return oldHash; }
public void setOldHash(@Nullable Long setterArg) {
this.oldHash = setterArg;
}

private @Nullable Long newHash;
public @Nullable Long getNewHash() { return newHash; }
public void setNewHash(@Nullable Long setterArg) {
this.newHash = setterArg;
}

public static final class Builder {
private @Nullable ModelState state;
public @NonNull Builder setState(@Nullable ModelState setterArg) {
this.state = setterArg;
return this;
}
private @Nullable Boolean is_loading;
public @NonNull Builder setIs_loading(@Nullable Boolean setterArg) {
this.is_loading = setterArg;
return this;
}
private @Nullable Long oldHash;
public @NonNull Builder setOldHash(@Nullable Long setterArg) {
this.oldHash = setterArg;
return this;
}
private @Nullable Long newHash;
public @NonNull Builder setNewHash(@Nullable Long setterArg) {
this.newHash = setterArg;
return this;
}
public @NonNull LoginModelStateData build() {
LoginModelStateData pigeonReturn = new LoginModelStateData();
pigeonReturn.setState(state);
pigeonReturn.setIs_loading(is_loading);
pigeonReturn.setOldHash(oldHash);
pigeonReturn.setNewHash(newHash);
return pigeonReturn;
}
}
@NonNull Map<String, Object> toMap() {
Map<String, Object> toMapResult = new HashMap<>();
toMapResult.put("state", state == null ? null : state.index);
toMapResult.put("is_loading", is_loading);
toMapResult.put("oldHash", oldHash);
toMapResult.put("newHash", newHash);
return toMapResult;
}
static @NonNull LoginModelStateData fromMap(@NonNull Map<String, Object> map) {
LoginModelStateData pigeonResult = new LoginModelStateData();
Object state = map.get("state");
pigeonResult.setState(state == null ? null : ModelState.values()[(int)state]);
Object is_loading = map.get("is_loading");
pigeonResult.setIs_loading((Boolean)is_loading);
Object oldHash = map.get("oldHash");
pigeonResult.setOldHash((oldHash == null) ? null : ((oldHash instanceof Integer) ? (Integer)oldHash : (Long)oldHash));
Object newHash = map.get("newHash");
pigeonResult.setNewHash((newHash == null) ? null : ((newHash instanceof Integer) ? (Integer)newHash : (Long)newHash));
return pigeonResult;
}
}

/** Generated class from Pigeon that represents data sent in messages. */
public static class LoginModelEventData {
private @Nullable LoginModelEvent event;
Expand Down Expand Up @@ -1106,6 +1184,7 @@ protected void writeValue(@NonNull ByteArrayOutputStream stream, Object value)
public interface MainModelBridge {
@NonNull MainModelStateData getState();
@NonNull MainModelEventData getEvent();
void resetEvent();
void initState();
void loadNextPage();
void filter(@NonNull SnippetFilter filter);
Expand Down Expand Up @@ -1155,6 +1234,25 @@ static void setup(BinaryMessenger binaryMessenger, MainModelBridge api) {
channel.setMessageHandler(null);
}
}
{
BasicMessageChannel<Object> channel =
new BasicMessageChannel<>(binaryMessenger, "dev.flutter.pigeon.MainModelBridge.resetEvent", getCodec());
if (api != null) {
channel.setMessageHandler((message, reply) -> {
Map<String, Object> wrapped = new HashMap<>();
try {
api.resetEvent();
wrapped.put("result", null);
}
catch (Error | RuntimeException exception) {
wrapped.put("error", wrapError(exception));
}
reply.reply(wrapped);
});
} else {
channel.setMessageHandler(null);
}
}
{
BinaryMessenger.TaskQueue taskQueue = binaryMessenger.makeBackgroundTaskQueue();
BasicMessageChannel<Object> channel =
Expand Down Expand Up @@ -1536,6 +1634,9 @@ protected Object readValueOfType(byte type, @NonNull ByteBuffer buffer) {
case (byte)128:
return LoginModelEventData.fromMap((Map<String, Object>) readValue(buffer));

case (byte)129:
return LoginModelStateData.fromMap((Map<String, Object>) readValue(buffer));

default:
return super.readValueOfType(type, buffer);

Expand All @@ -1547,6 +1648,10 @@ protected void writeValue(@NonNull ByteArrayOutputStream stream, Object value)
stream.write(128);
writeValue(stream, ((LoginModelEventData) value).toMap());
} else
if (value instanceof LoginModelStateData) {
stream.write(129);
writeValue(stream, ((LoginModelStateData) value).toMap());
} else
{
super.writeValue(stream, value);
}
Expand All @@ -1555,15 +1660,36 @@ protected void writeValue(@NonNull ByteArrayOutputStream stream, Object value)

/** Generated interface from Pigeon that represents a handler of messages from Flutter. */
public interface LoginModelBridge {
@NonNull LoginModelStateData getState();
@NonNull LoginModelEventData getEvent();
void loginOrRegister(@NonNull String email, @NonNull String password);
void checkLoginState();
void resetEvent();

/** The codec used by LoginModelBridge. */
static MessageCodec<Object> getCodec() {
return LoginModelBridgeCodec.INSTANCE; }
/**Sets up an instance of `LoginModelBridge` to handle messages through the `binaryMessenger`. */
static void setup(BinaryMessenger binaryMessenger, LoginModelBridge api) {
{
BasicMessageChannel<Object> channel =
new BasicMessageChannel<>(binaryMessenger, "dev.flutter.pigeon.LoginModelBridge.getState", getCodec());
if (api != null) {
channel.setMessageHandler((message, reply) -> {
Map<String, Object> wrapped = new HashMap<>();
try {
LoginModelStateData output = api.getState();
wrapped.put("result", output);
}
catch (Error | RuntimeException exception) {
wrapped.put("error", wrapError(exception));
}
reply.reply(wrapped);
});
} else {
channel.setMessageHandler(null);
}
}
{
BasicMessageChannel<Object> channel =
new BasicMessageChannel<>(binaryMessenger, "dev.flutter.pigeon.LoginModelBridge.getEvent", getCodec());
Expand Down Expand Up @@ -1612,6 +1738,25 @@ static void setup(BinaryMessenger binaryMessenger, LoginModelBridge api) {
channel.setMessageHandler(null);
}
}
{
BasicMessageChannel<Object> channel =
new BasicMessageChannel<>(binaryMessenger, "dev.flutter.pigeon.LoginModelBridge.checkLoginState", getCodec());
if (api != null) {
channel.setMessageHandler((message, reply) -> {
Map<String, Object> wrapped = new HashMap<>();
try {
api.checkLoginState();
wrapped.put("result", null);
}
catch (Error | RuntimeException exception) {
wrapped.put("error", wrapError(exception));
}
reply.reply(wrapped);
});
} else {
channel.setMessageHandler(null);
}
}
{
BasicMessageChannel<Object> channel =
new BasicMessageChannel<>(binaryMessenger, "dev.flutter.pigeon.LoginModelBridge.resetEvent", getCodec());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,23 +6,30 @@ import io.reactivex.rxkotlin.plusAssign
import io.reactivex.rxkotlin.subscribeBy
import io.reactivex.schedulers.Schedulers
import kotlinx.coroutines.flow.MutableStateFlow
import pl.tkadziolka.snipmeandroid.domain.auth.InitialLoginUseCase
import pl.tkadziolka.snipmeandroid.domain.auth.LoginInteractor
import pl.tkadziolka.snipmeandroid.domain.error.exception.*
import pl.tkadziolka.snipmeandroid.domain.message.ErrorMessages
import pl.tkadziolka.snipmeandroid.ui.error.ErrorParsable
import pl.tkadziolka.snipmeandroid.ui.login.*
import pl.tkadziolka.snipmeandroid.ui.splash.NotAuthorized
import pl.tkadziolka.snipmeandroid.util.extension.inProgress
import timber.log.Timber
import java.util.concurrent.TimeUnit

class LoginModel(
private val errorMessages: ErrorMessages,
private val interactor: LoginInteractor,
): ErrorParsable {
private val initialLogin: InitialLoginUseCase,
) : ErrorParsable {
private val disposables = CompositeDisposable()
private var identifyDisposable: Disposable? = null
private var loginDisposable: Disposable? = null
private var registerDisposable: Disposable? = null

private val mutableState = MutableStateFlow<LoginState>(Loading)
val state = mutableState

private val mutableEvent = MutableStateFlow<LoginEvent>(Idle)
val event = mutableEvent

Expand All @@ -39,9 +46,26 @@ class LoginModel(
}
}

fun init() {
initialLogin()
.delay(3, TimeUnit.SECONDS)
.subscribeOn(Schedulers.io())
.doOnEvent { setState(Loaded) }
.subscribeBy(
onComplete = { setEvent(Logged) },
onError = {
if (it !is NotAuthorizedException) {
Timber.e("Couldn't get token or user, error = $it")
}
}
).also { disposables += it }
}

fun loginOrRegister(email: String, password: String) {
if (identifyDisposable.inProgress()) return

setState(Loading)

identifyDisposable = interactor.identify(email)
.subscribeOn(Schedulers.io())
.subscribeBy(
Expand All @@ -58,6 +82,7 @@ class LoginModel(

loginDisposable = interactor.login(email, password)
.subscribeOn(Schedulers.io())
.doOnEvent { setState(Loaded) }
.subscribeBy(
onComplete = { setEvent(Logged) },
onError = {
Expand All @@ -72,6 +97,7 @@ class LoginModel(

registerDisposable = interactor.register(email, password, email)
.subscribeOn(Schedulers.io())
.doOnEvent { setState(Loaded) }
.subscribeBy(
onComplete = { setEvent(Logged) },
onError = {
Expand All @@ -92,4 +118,8 @@ class LoginModel(
private fun setEvent(event: LoginEvent) {
mutableEvent.value = event
}

private fun setState(state: LoginState) {
mutableState.value = state
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,16 @@ import io.flutter.plugin.common.BinaryMessenger
import org.koin.core.component.inject
import pl.tkadziolka.snipmeandroid.bridge.Bridge
import pl.tkadziolka.snipmeandroid.bridge.ModelPlugin
import pl.tkadziolka.snipmeandroid.ui.login.Idle
import pl.tkadziolka.snipmeandroid.ui.login.Logged
import pl.tkadziolka.snipmeandroid.ui.login.LoginEvent
import pl.tkadziolka.snipmeandroid.ui.detail.DetailViewState
import pl.tkadziolka.snipmeandroid.ui.login.*

class LoginModelPlugin : ModelPlugin<Bridge.LoginModelBridge>(), Bridge.LoginModelBridge {
private var oldEvent: LoginEvent? = null
private var oldState: LoginState? = null
private val model: LoginModel by inject()

override fun getState(): Bridge.LoginModelStateData = getModelState(model.state.value)

override fun getEvent(): Bridge.LoginModelEventData = getModelEvent(model.event.value)

override fun resetEvent() {
Expand All @@ -22,6 +24,10 @@ class LoginModelPlugin : ModelPlugin<Bridge.LoginModelBridge>(), Bridge.LoginMod
Bridge.LoginModelBridge.setup(messenger, bridge)
}

override fun checkLoginState() {
model.init()
}

override fun loginOrRegister(email: String, password: String) {
model.loginOrRegister(email, password)
}
Expand All @@ -36,6 +42,22 @@ class LoginModelPlugin : ModelPlugin<Bridge.LoginModelBridge>(), Bridge.LoginMod
}
}

private fun getModelState(loginState: LoginState): Bridge.LoginModelStateData {
return Bridge.LoginModelStateData().apply {
state = loginState.toModelLoginState()
oldHash = oldState?.hashCode()?.toLong() ?: 0
newHash = loginState.hashCode().toLong()
}.also {
oldState = loginState
}
}

private fun LoginState.toModelLoginState() =
when (this) {
Loaded -> Bridge.ModelState.LOADED
else -> Bridge.ModelState.LOADING
}

private fun LoginEvent.toModelLoginEvent() =
when (this) {
Logged -> Bridge.LoginModelEvent.LOGGED
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,10 @@ class MainModelPlugin : ModelPlugin<Bridge.MainModelBridge>(), Bridge.MainModelB

override fun getEvent(): Bridge.MainModelEventData = getEvent(model.event.value)

override fun resetEvent() {
model.event.value = Startup
}

override fun initState() {
model.initState()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import pl.tkadziolka.snipmeandroid.bridge.session.SessionModel

internal val modelModule = module {
single { SessionModel(get()) }
single { LoginModel(get(), get()) }
single { LoginModel(get(), get(), get()) }
single { MainModel(get(), get(), get(), get(), get(), get(), get()) }
single { DetailModel(get(), get(), get(), get(), get(), get(), get(), get()) }
}
Loading