Skip to content

Commit 5223b8c

Browse files
authored
Merge pull request #14 from tmaxxdd/feature/redirect-logged-user
Handled on login redirection
2 parents 300fef4 + 1faac0c commit 5223b8c

File tree

12 files changed

+412
-58
lines changed

12 files changed

+412
-58
lines changed

app/src/main/java/pl/tkadziolka/snipmeandroid/bridge/Bridge.java

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -965,6 +965,84 @@ public static final class Builder {
965965
}
966966
}
967967

968+
/** Generated class from Pigeon that represents data sent in messages. */
969+
public static class LoginModelStateData {
970+
private @Nullable ModelState state;
971+
public @Nullable ModelState getState() { return state; }
972+
public void setState(@Nullable ModelState setterArg) {
973+
this.state = setterArg;
974+
}
975+
976+
private @Nullable Boolean is_loading;
977+
public @Nullable Boolean getIs_loading() { return is_loading; }
978+
public void setIs_loading(@Nullable Boolean setterArg) {
979+
this.is_loading = setterArg;
980+
}
981+
982+
private @Nullable Long oldHash;
983+
public @Nullable Long getOldHash() { return oldHash; }
984+
public void setOldHash(@Nullable Long setterArg) {
985+
this.oldHash = setterArg;
986+
}
987+
988+
private @Nullable Long newHash;
989+
public @Nullable Long getNewHash() { return newHash; }
990+
public void setNewHash(@Nullable Long setterArg) {
991+
this.newHash = setterArg;
992+
}
993+
994+
public static final class Builder {
995+
private @Nullable ModelState state;
996+
public @NonNull Builder setState(@Nullable ModelState setterArg) {
997+
this.state = setterArg;
998+
return this;
999+
}
1000+
private @Nullable Boolean is_loading;
1001+
public @NonNull Builder setIs_loading(@Nullable Boolean setterArg) {
1002+
this.is_loading = setterArg;
1003+
return this;
1004+
}
1005+
private @Nullable Long oldHash;
1006+
public @NonNull Builder setOldHash(@Nullable Long setterArg) {
1007+
this.oldHash = setterArg;
1008+
return this;
1009+
}
1010+
private @Nullable Long newHash;
1011+
public @NonNull Builder setNewHash(@Nullable Long setterArg) {
1012+
this.newHash = setterArg;
1013+
return this;
1014+
}
1015+
public @NonNull LoginModelStateData build() {
1016+
LoginModelStateData pigeonReturn = new LoginModelStateData();
1017+
pigeonReturn.setState(state);
1018+
pigeonReturn.setIs_loading(is_loading);
1019+
pigeonReturn.setOldHash(oldHash);
1020+
pigeonReturn.setNewHash(newHash);
1021+
return pigeonReturn;
1022+
}
1023+
}
1024+
@NonNull Map<String, Object> toMap() {
1025+
Map<String, Object> toMapResult = new HashMap<>();
1026+
toMapResult.put("state", state == null ? null : state.index);
1027+
toMapResult.put("is_loading", is_loading);
1028+
toMapResult.put("oldHash", oldHash);
1029+
toMapResult.put("newHash", newHash);
1030+
return toMapResult;
1031+
}
1032+
static @NonNull LoginModelStateData fromMap(@NonNull Map<String, Object> map) {
1033+
LoginModelStateData pigeonResult = new LoginModelStateData();
1034+
Object state = map.get("state");
1035+
pigeonResult.setState(state == null ? null : ModelState.values()[(int)state]);
1036+
Object is_loading = map.get("is_loading");
1037+
pigeonResult.setIs_loading((Boolean)is_loading);
1038+
Object oldHash = map.get("oldHash");
1039+
pigeonResult.setOldHash((oldHash == null) ? null : ((oldHash instanceof Integer) ? (Integer)oldHash : (Long)oldHash));
1040+
Object newHash = map.get("newHash");
1041+
pigeonResult.setNewHash((newHash == null) ? null : ((newHash instanceof Integer) ? (Integer)newHash : (Long)newHash));
1042+
return pigeonResult;
1043+
}
1044+
}
1045+
9681046
/** Generated class from Pigeon that represents data sent in messages. */
9691047
public static class LoginModelEventData {
9701048
private @Nullable LoginModelEvent event;
@@ -1106,6 +1184,7 @@ protected void writeValue(@NonNull ByteArrayOutputStream stream, Object value)
11061184
public interface MainModelBridge {
11071185
@NonNull MainModelStateData getState();
11081186
@NonNull MainModelEventData getEvent();
1187+
void resetEvent();
11091188
void initState();
11101189
void loadNextPage();
11111190
void filter(@NonNull SnippetFilter filter);
@@ -1155,6 +1234,25 @@ static void setup(BinaryMessenger binaryMessenger, MainModelBridge api) {
11551234
channel.setMessageHandler(null);
11561235
}
11571236
}
1237+
{
1238+
BasicMessageChannel<Object> channel =
1239+
new BasicMessageChannel<>(binaryMessenger, "dev.flutter.pigeon.MainModelBridge.resetEvent", getCodec());
1240+
if (api != null) {
1241+
channel.setMessageHandler((message, reply) -> {
1242+
Map<String, Object> wrapped = new HashMap<>();
1243+
try {
1244+
api.resetEvent();
1245+
wrapped.put("result", null);
1246+
}
1247+
catch (Error | RuntimeException exception) {
1248+
wrapped.put("error", wrapError(exception));
1249+
}
1250+
reply.reply(wrapped);
1251+
});
1252+
} else {
1253+
channel.setMessageHandler(null);
1254+
}
1255+
}
11581256
{
11591257
BinaryMessenger.TaskQueue taskQueue = binaryMessenger.makeBackgroundTaskQueue();
11601258
BasicMessageChannel<Object> channel =
@@ -1536,6 +1634,9 @@ protected Object readValueOfType(byte type, @NonNull ByteBuffer buffer) {
15361634
case (byte)128:
15371635
return LoginModelEventData.fromMap((Map<String, Object>) readValue(buffer));
15381636

1637+
case (byte)129:
1638+
return LoginModelStateData.fromMap((Map<String, Object>) readValue(buffer));
1639+
15391640
default:
15401641
return super.readValueOfType(type, buffer);
15411642

@@ -1547,6 +1648,10 @@ protected void writeValue(@NonNull ByteArrayOutputStream stream, Object value)
15471648
stream.write(128);
15481649
writeValue(stream, ((LoginModelEventData) value).toMap());
15491650
} else
1651+
if (value instanceof LoginModelStateData) {
1652+
stream.write(129);
1653+
writeValue(stream, ((LoginModelStateData) value).toMap());
1654+
} else
15501655
{
15511656
super.writeValue(stream, value);
15521657
}
@@ -1555,15 +1660,36 @@ protected void writeValue(@NonNull ByteArrayOutputStream stream, Object value)
15551660

15561661
/** Generated interface from Pigeon that represents a handler of messages from Flutter. */
15571662
public interface LoginModelBridge {
1663+
@NonNull LoginModelStateData getState();
15581664
@NonNull LoginModelEventData getEvent();
15591665
void loginOrRegister(@NonNull String email, @NonNull String password);
1666+
void checkLoginState();
15601667
void resetEvent();
15611668

15621669
/** The codec used by LoginModelBridge. */
15631670
static MessageCodec<Object> getCodec() {
15641671
return LoginModelBridgeCodec.INSTANCE; }
15651672
/**Sets up an instance of `LoginModelBridge` to handle messages through the `binaryMessenger`. */
15661673
static void setup(BinaryMessenger binaryMessenger, LoginModelBridge api) {
1674+
{
1675+
BasicMessageChannel<Object> channel =
1676+
new BasicMessageChannel<>(binaryMessenger, "dev.flutter.pigeon.LoginModelBridge.getState", getCodec());
1677+
if (api != null) {
1678+
channel.setMessageHandler((message, reply) -> {
1679+
Map<String, Object> wrapped = new HashMap<>();
1680+
try {
1681+
LoginModelStateData output = api.getState();
1682+
wrapped.put("result", output);
1683+
}
1684+
catch (Error | RuntimeException exception) {
1685+
wrapped.put("error", wrapError(exception));
1686+
}
1687+
reply.reply(wrapped);
1688+
});
1689+
} else {
1690+
channel.setMessageHandler(null);
1691+
}
1692+
}
15671693
{
15681694
BasicMessageChannel<Object> channel =
15691695
new BasicMessageChannel<>(binaryMessenger, "dev.flutter.pigeon.LoginModelBridge.getEvent", getCodec());
@@ -1612,6 +1738,25 @@ static void setup(BinaryMessenger binaryMessenger, LoginModelBridge api) {
16121738
channel.setMessageHandler(null);
16131739
}
16141740
}
1741+
{
1742+
BasicMessageChannel<Object> channel =
1743+
new BasicMessageChannel<>(binaryMessenger, "dev.flutter.pigeon.LoginModelBridge.checkLoginState", getCodec());
1744+
if (api != null) {
1745+
channel.setMessageHandler((message, reply) -> {
1746+
Map<String, Object> wrapped = new HashMap<>();
1747+
try {
1748+
api.checkLoginState();
1749+
wrapped.put("result", null);
1750+
}
1751+
catch (Error | RuntimeException exception) {
1752+
wrapped.put("error", wrapError(exception));
1753+
}
1754+
reply.reply(wrapped);
1755+
});
1756+
} else {
1757+
channel.setMessageHandler(null);
1758+
}
1759+
}
16151760
{
16161761
BasicMessageChannel<Object> channel =
16171762
new BasicMessageChannel<>(binaryMessenger, "dev.flutter.pigeon.LoginModelBridge.resetEvent", getCodec());

app/src/main/java/pl/tkadziolka/snipmeandroid/bridge/login/LoginModel.kt

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,30 @@ import io.reactivex.rxkotlin.plusAssign
66
import io.reactivex.rxkotlin.subscribeBy
77
import io.reactivex.schedulers.Schedulers
88
import kotlinx.coroutines.flow.MutableStateFlow
9+
import pl.tkadziolka.snipmeandroid.domain.auth.InitialLoginUseCase
910
import pl.tkadziolka.snipmeandroid.domain.auth.LoginInteractor
1011
import pl.tkadziolka.snipmeandroid.domain.error.exception.*
1112
import pl.tkadziolka.snipmeandroid.domain.message.ErrorMessages
1213
import pl.tkadziolka.snipmeandroid.ui.error.ErrorParsable
1314
import pl.tkadziolka.snipmeandroid.ui.login.*
15+
import pl.tkadziolka.snipmeandroid.ui.splash.NotAuthorized
1416
import pl.tkadziolka.snipmeandroid.util.extension.inProgress
1517
import timber.log.Timber
18+
import java.util.concurrent.TimeUnit
1619

1720
class LoginModel(
1821
private val errorMessages: ErrorMessages,
1922
private val interactor: LoginInteractor,
20-
): ErrorParsable {
23+
private val initialLogin: InitialLoginUseCase,
24+
) : ErrorParsable {
2125
private val disposables = CompositeDisposable()
2226
private var identifyDisposable: Disposable? = null
2327
private var loginDisposable: Disposable? = null
2428
private var registerDisposable: Disposable? = null
2529

30+
private val mutableState = MutableStateFlow<LoginState>(Loading)
31+
val state = mutableState
32+
2633
private val mutableEvent = MutableStateFlow<LoginEvent>(Idle)
2734
val event = mutableEvent
2835

@@ -39,9 +46,26 @@ class LoginModel(
3946
}
4047
}
4148

49+
fun init() {
50+
initialLogin()
51+
.delay(3, TimeUnit.SECONDS)
52+
.subscribeOn(Schedulers.io())
53+
.doOnEvent { setState(Loaded) }
54+
.subscribeBy(
55+
onComplete = { setEvent(Logged) },
56+
onError = {
57+
if (it !is NotAuthorizedException) {
58+
Timber.e("Couldn't get token or user, error = $it")
59+
}
60+
}
61+
).also { disposables += it }
62+
}
63+
4264
fun loginOrRegister(email: String, password: String) {
4365
if (identifyDisposable.inProgress()) return
4466

67+
setState(Loading)
68+
4569
identifyDisposable = interactor.identify(email)
4670
.subscribeOn(Schedulers.io())
4771
.subscribeBy(
@@ -58,6 +82,7 @@ class LoginModel(
5882

5983
loginDisposable = interactor.login(email, password)
6084
.subscribeOn(Schedulers.io())
85+
.doOnEvent { setState(Loaded) }
6186
.subscribeBy(
6287
onComplete = { setEvent(Logged) },
6388
onError = {
@@ -72,6 +97,7 @@ class LoginModel(
7297

7398
registerDisposable = interactor.register(email, password, email)
7499
.subscribeOn(Schedulers.io())
100+
.doOnEvent { setState(Loaded) }
75101
.subscribeBy(
76102
onComplete = { setEvent(Logged) },
77103
onError = {
@@ -92,4 +118,8 @@ class LoginModel(
92118
private fun setEvent(event: LoginEvent) {
93119
mutableEvent.value = event
94120
}
121+
122+
private fun setState(state: LoginState) {
123+
mutableState.value = state
124+
}
95125
}

app/src/main/java/pl/tkadziolka/snipmeandroid/bridge/login/LoginModelPlugin.kt

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,16 @@ import io.flutter.plugin.common.BinaryMessenger
44
import org.koin.core.component.inject
55
import pl.tkadziolka.snipmeandroid.bridge.Bridge
66
import pl.tkadziolka.snipmeandroid.bridge.ModelPlugin
7-
import pl.tkadziolka.snipmeandroid.ui.login.Idle
8-
import pl.tkadziolka.snipmeandroid.ui.login.Logged
9-
import pl.tkadziolka.snipmeandroid.ui.login.LoginEvent
7+
import pl.tkadziolka.snipmeandroid.ui.detail.DetailViewState
8+
import pl.tkadziolka.snipmeandroid.ui.login.*
109

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

15+
override fun getState(): Bridge.LoginModelStateData = getModelState(model.state.value)
16+
1517
override fun getEvent(): Bridge.LoginModelEventData = getModelEvent(model.event.value)
1618

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

27+
override fun checkLoginState() {
28+
model.init()
29+
}
30+
2531
override fun loginOrRegister(email: String, password: String) {
2632
model.loginOrRegister(email, password)
2733
}
@@ -36,6 +42,22 @@ class LoginModelPlugin : ModelPlugin<Bridge.LoginModelBridge>(), Bridge.LoginMod
3642
}
3743
}
3844

45+
private fun getModelState(loginState: LoginState): Bridge.LoginModelStateData {
46+
return Bridge.LoginModelStateData().apply {
47+
state = loginState.toModelLoginState()
48+
oldHash = oldState?.hashCode()?.toLong() ?: 0
49+
newHash = loginState.hashCode().toLong()
50+
}.also {
51+
oldState = loginState
52+
}
53+
}
54+
55+
private fun LoginState.toModelLoginState() =
56+
when (this) {
57+
Loaded -> Bridge.ModelState.LOADED
58+
else -> Bridge.ModelState.LOADING
59+
}
60+
3961
private fun LoginEvent.toModelLoginEvent() =
4062
when (this) {
4163
Logged -> Bridge.LoginModelEvent.LOGGED

app/src/main/java/pl/tkadziolka/snipmeandroid/bridge/main/MainModelPlugin.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ class MainModelPlugin : ModelPlugin<Bridge.MainModelBridge>(), Bridge.MainModelB
2525

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

28+
override fun resetEvent() {
29+
model.event.value = Startup
30+
}
31+
2832
override fun initState() {
2933
model.initState()
3034
}

app/src/main/java/pl/tkadziolka/snipmeandroid/di/ModelModule.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import pl.tkadziolka.snipmeandroid.bridge.session.SessionModel
88

99
internal val modelModule = module {
1010
single { SessionModel(get()) }
11-
single { LoginModel(get(), get()) }
11+
single { LoginModel(get(), get(), get()) }
1212
single { MainModel(get(), get(), get(), get(), get(), get(), get()) }
1313
single { DetailModel(get(), get(), get(), get(), get(), get(), get(), get()) }
1414
}

0 commit comments

Comments
 (0)