diff --git a/README.md b/README.md deleted file mode 100644 index 83956dc..0000000 --- a/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# SnipMeApp -Simple application that allows to save and share code snippets in different languages. - - - diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 58b4508..e321917 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,6 +1,6 @@ - - + + android:supportsRtl="true" + android:networkSecurityConfig="@xml/network_security_config" + > + android:theme="@style/Theme.AppCompat.Light.NoActionBar" + android:exported="true"> - - - - - + \ No newline at end of file diff --git a/app/src/main/java/dev/snipme/snipmeapp/AppService.kt b/app/src/main/java/dev/snipme/snipmeapp/AppService.kt deleted file mode 100644 index 4d1aa21..0000000 --- a/app/src/main/java/dev/snipme/snipmeapp/AppService.kt +++ /dev/null @@ -1,107 +0,0 @@ -package dev.snipme.snipmeapp - -import android.content.ClipData -import android.content.ContentValues -import android.content.Context -import android.content.Intent -import android.content.Intent.FLAG_ACTIVITY_NEW_TASK -import android.net.Uri -import android.os.Environment -import android.provider.MediaStore -import androidx.core.content.ContextCompat.startActivity -import androidx.core.content.FileProvider -import dev.snipme.snipmeapp.domain.snippets.Snippet -import java.io.File -import java.io.FileNotFoundException -import java.text.DateFormat -import java.util.Date - -const val imageMime = "image/png" - -class AppService(private val context: Context) { - private var imageUri: Uri? = null - - fun getCurrentDateFormatted(): String { - return DateFormat.getDateInstance().format(Date()) - } - - fun storeFile(image: ByteArray, fileName: String, temp: Boolean = false) { - val directoryFile = if (temp) context.cacheDir else context.getExternalFilesDir( - Environment.DIRECTORY_PICTURES - ) - - if (directoryFile == null) throw IllegalStateException("Storage not available") - if (!directoryFile.exists()) { - directoryFile.mkdirs() - } - - val imageFile = File(directoryFile, fileName) - val imageUri = FileProvider.getUriForFile( - context, - "dev.snipme.snipmeapp.fileprovider", - imageFile, - ) - - context.grantUriPermission( - "dev.snipme.snipmeapp.fileprovider", - imageUri, - Intent.FLAG_GRANT_WRITE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION - ) - - imageFile.writeBytes(image) - this.imageUri = imageUri - } - - fun launchShareIntent(snippet: Snippet) { - if (imageUri == null) - throw IllegalStateException("Image path is not set. Store image first!") - - val uri = imageUri!! // Store temporary to avoid var change - val sendIntent: Intent = Intent().apply { - action = Intent.ACTION_SEND - type = imageMime - clipData = ClipData.newRawUri(snippet.title, uri) - setDataAndType(uri, context.contentResolver.getType(uri)); - addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - putExtra(Intent.EXTRA_TITLE, snippet.title) - putExtra(Intent.EXTRA_STREAM, uri) - } - - val shareIntent = Intent.createChooser(sendIntent, null) - shareIntent.addFlags(FLAG_ACTIVITY_NEW_TASK) - startActivity(context, shareIntent, null) - } - - fun storeMediaFile(image: ByteArray, name: String) { - val directory = "Pictures/SnipMeApp" - val contentValues = ContentValues().apply { - put(MediaStore.Images.Media.DISPLAY_NAME, name) - put(MediaStore.Images.Media.RELATIVE_PATH, directory) - put(MediaStore.Images.Media.MIME_TYPE, imageMime) - } - - val resolver = context.contentResolver - val existingUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI.buildUpon() - .appendQueryParameter(MediaStore.Images.Media.DISPLAY_NAME, name) - .appendQueryParameter(MediaStore.Images.Media.RELATIVE_PATH, directory) - .build() - - val cursor = - resolver.query(existingUri, arrayOf(MediaStore.Images.Media._ID), null, null, null) - val uri: Uri? = if (cursor != null && cursor.moveToFirst()) { - val id = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID)) - Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id.toString()) - } else { - resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues) - } - cursor?.close() - - if (uri != null) { - resolver.openOutputStream(uri)?.use { outputStream -> - outputStream.write(image) - } - } else { - throw FileNotFoundException("Failed to create or update MediaStore record.") - } - } -} \ No newline at end of file diff --git a/app/src/main/java/dev/snipme/snipmeapp/MainActivity.kt b/app/src/main/java/dev/snipme/snipmeapp/MainActivity.kt index b74f45a..92a818d 100644 --- a/app/src/main/java/dev/snipme/snipmeapp/MainActivity.kt +++ b/app/src/main/java/dev/snipme/snipmeapp/MainActivity.kt @@ -2,19 +2,16 @@ package dev.snipme.snipmeapp import android.os.Bundle import androidx.appcompat.app.AppCompatActivity -import dev.snipme.snipmeapp.channel.EventStreamHandlerPlugin -import dev.snipme.snipmeapp.channel.StateStreamHandlerPlugin -import dev.snipme.snipmeapp.channel.details.DetailsModelPlugin -import dev.snipme.snipmeapp.channel.login.LoginModelPlugin -import dev.snipme.snipmeapp.channel.main.MainModelPlugin import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.engine.FlutterEngine import io.flutter.embedding.engine.FlutterEngineCache import io.flutter.embedding.engine.dart.DartExecutor +import dev.snipme.snipmeapp.bridge.detail.DetailModelPlugin +import dev.snipme.snipmeapp.bridge.login.LoginModelPlugin +import dev.snipme.snipmeapp.bridge.main.MainModelPlugin class MainActivity : AppCompatActivity() { - // TODO Improve flutter enginge management or remove - private lateinit var flutterEngine: FlutterEngine + private lateinit var flutterEngine : FlutterEngine private val cachedEngineId = "ID_CACHED_FLUTTER_ENGINE" @@ -22,24 +19,16 @@ class MainActivity : AppCompatActivity() { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) - FlutterEngine(this).apply { - dartExecutor.executeDartEntrypoint(DartExecutor.DartEntrypoint.createDefault()) - - plugins.add( - setOf( - StateStreamHandlerPlugin(), - EventStreamHandlerPlugin(), - LoginModelPlugin(), - MainModelPlugin(), - DetailsModelPlugin() - ) - ) - FlutterEngineCache.getInstance().put(cachedEngineId, this) - - startActivity( - FlutterActivity.withCachedEngine(cachedEngineId) - .build(baseContext) - ) - } + FlutterEngine(this).apply { + dartExecutor.executeDartEntrypoint(DartExecutor.DartEntrypoint.createDefault()) + + plugins.add(LoginModelPlugin()) + plugins.add(MainModelPlugin()) + plugins.add(DetailModelPlugin()) + + FlutterEngineCache.getInstance().put(cachedEngineId, this) + + startActivity(FlutterActivity.withCachedEngine(cachedEngineId).build(baseContext)) + } } } \ No newline at end of file diff --git a/app/src/main/java/dev/snipme/snipmeapp/bridge/Bridge.java b/app/src/main/java/dev/snipme/snipmeapp/bridge/Bridge.java new file mode 100644 index 0000000..b16744b --- /dev/null +++ b/app/src/main/java/dev/snipme/snipmeapp/bridge/Bridge.java @@ -0,0 +1,2526 @@ +// Autogenerated from Pigeon (v22.5.0), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +package dev.snipme.snipmeapp.bridge; + +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.RetentionPolicy.CLASS; + +import android.util.Log; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import io.flutter.plugin.common.BasicMessageChannel; +import io.flutter.plugin.common.BinaryMessenger; +import io.flutter.plugin.common.MessageCodec; +import io.flutter.plugin.common.StandardMessageCodec; +import java.io.ByteArrayOutputStream; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** Generated class from Pigeon. */ +@SuppressWarnings({"unused", "unchecked", "CodeBlock2Expr", "RedundantSuppression", "serial"}) +public class Bridge { + + /** Error class for passing custom error details to Flutter via a thrown PlatformException. */ + public static class FlutterError extends RuntimeException { + + /** The error code. */ + public final String code; + + /** The error details. Must be a datatype supported by the api codec. */ + public final Object details; + + public FlutterError(@NonNull String code, @Nullable String message, @Nullable Object details) + { + super(message); + this.code = code; + this.details = details; + } + } + + @NonNull + protected static ArrayList wrapError(@NonNull Throwable exception) { + ArrayList errorList = new ArrayList<>(3); + if (exception instanceof FlutterError) { + FlutterError error = (FlutterError) exception; + errorList.add(error.code); + errorList.add(error.getMessage()); + errorList.add(error.details); + } else { + errorList.add(exception.toString()); + errorList.add(exception.getClass().getSimpleName()); + errorList.add( + "Cause: " + exception.getCause() + ", Stacktrace: " + Log.getStackTraceString(exception)); + } + return errorList; + } + + @Target(METHOD) + @Retention(CLASS) + @interface CanIgnoreReturnValue {} + + public enum SnippetLanguageType { + C(0), + CPP(1), + OBJECTIVE_C(2), + C_SHARP(3), + JAVA(4), + BASH(5), + PYTHON(6), + PERL(7), + RUBY(8), + SWIFT(9), + JAVASCRIPT(10), + KOTLIN(11), + COFFEESCRIPT(12), + RUST(13), + BASIC(14), + CLOJURE(15), + CSS(16), + DART(17), + ERLANG(18), + GO(19), + HASKELL(20), + LISP(21), + LLVM(22), + LUA(23), + MATLAB(24), + ML(25), + MUMPS(26), + NEMERLE(27), + PASCAL(28), + R(29), + RD(30), + SCALA(31), + SQL(32), + TEX(33), + VB(34), + VHDL(35), + TCL(36), + XQUERY(37), + YAML(38), + MARKDOWN(39), + JSON(40), + XML(41), + PROTO(42), + REGEX(43), + UNKNOWN(44); + + final int index; + + SnippetLanguageType(final int index) { + this.index = index; + } + } + + public enum SnippetFilterType { + ALL(0), + MINE(1), + SHARED(2); + + final int index; + + SnippetFilterType(final int index) { + this.index = index; + } + } + + public enum UserReaction { + NONE(0), + LIKE(1), + DISLIKE(2); + + final int index; + + UserReaction(final int index) { + this.index = index; + } + } + + public enum ModelState { + LOADING(0), + LOADED(1), + ERROR(2); + + final int index; + + ModelState(final int index) { + this.index = index; + } + } + + public enum MainModelEvent { + NONE(0), + ALERT(1), + LOGOUT(2); + + final int index; + + MainModelEvent(final int index) { + this.index = index; + } + } + + public enum DetailModelEvent { + NONE(0), + SAVED(1), + DELETED(2); + + final int index; + + DetailModelEvent(final int index) { + this.index = index; + } + } + + public enum LoginModelEvent { + NONE(0), + LOGGED(1); + + final int index; + + LoginModelEvent(final int index) { + this.index = index; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class Snippet { + private @Nullable String uuid; + + public @Nullable String getUuid() { + return uuid; + } + + public void setUuid(@Nullable String setterArg) { + this.uuid = setterArg; + } + + private @Nullable String title; + + public @Nullable String getTitle() { + return title; + } + + public void setTitle(@Nullable String setterArg) { + this.title = setterArg; + } + + private @Nullable SnippetCode code; + + public @Nullable SnippetCode getCode() { + return code; + } + + public void setCode(@Nullable SnippetCode setterArg) { + this.code = setterArg; + } + + private @Nullable SnippetLanguage language; + + public @Nullable SnippetLanguage getLanguage() { + return language; + } + + public void setLanguage(@Nullable SnippetLanguage setterArg) { + this.language = setterArg; + } + + private @Nullable Owner owner; + + public @Nullable Owner getOwner() { + return owner; + } + + public void setOwner(@Nullable Owner setterArg) { + this.owner = setterArg; + } + + private @Nullable Boolean isOwner; + + public @Nullable Boolean getIsOwner() { + return isOwner; + } + + public void setIsOwner(@Nullable Boolean setterArg) { + this.isOwner = setterArg; + } + + private @Nullable String timeAgo; + + public @Nullable String getTimeAgo() { + return timeAgo; + } + + public void setTimeAgo(@Nullable String setterArg) { + this.timeAgo = setterArg; + } + + private @Nullable Long voteResult; + + public @Nullable Long getVoteResult() { + return voteResult; + } + + public void setVoteResult(@Nullable Long setterArg) { + this.voteResult = setterArg; + } + + private @Nullable UserReaction userReaction; + + public @Nullable UserReaction getUserReaction() { + return userReaction; + } + + public void setUserReaction(@Nullable UserReaction setterArg) { + this.userReaction = setterArg; + } + + private @Nullable Boolean isPrivate; + + public @Nullable Boolean getIsPrivate() { + return isPrivate; + } + + public void setIsPrivate(@Nullable Boolean setterArg) { + this.isPrivate = setterArg; + } + + private @Nullable Boolean isLiked; + + public @Nullable Boolean getIsLiked() { + return isLiked; + } + + public void setIsLiked(@Nullable Boolean setterArg) { + this.isLiked = setterArg; + } + + private @Nullable Boolean isDisliked; + + public @Nullable Boolean getIsDisliked() { + return isDisliked; + } + + public void setIsDisliked(@Nullable Boolean setterArg) { + this.isDisliked = setterArg; + } + + private @Nullable Boolean isSaved; + + public @Nullable Boolean getIsSaved() { + return isSaved; + } + + public void setIsSaved(@Nullable Boolean setterArg) { + this.isSaved = setterArg; + } + + private @Nullable Boolean isToDelete; + + public @Nullable Boolean getIsToDelete() { + return isToDelete; + } + + public void setIsToDelete(@Nullable Boolean setterArg) { + this.isToDelete = setterArg; + } + + @Override + public boolean equals(Object o) { + if (this == o) { return true; } + if (o == null || getClass() != o.getClass()) { return false; } + Snippet that = (Snippet) o; + return Objects.equals(uuid, that.uuid) && Objects.equals(title, that.title) && Objects.equals(code, that.code) && Objects.equals(language, that.language) && Objects.equals(owner, that.owner) && Objects.equals(isOwner, that.isOwner) && Objects.equals(timeAgo, that.timeAgo) && Objects.equals(voteResult, that.voteResult) && Objects.equals(userReaction, that.userReaction) && Objects.equals(isPrivate, that.isPrivate) && Objects.equals(isLiked, that.isLiked) && Objects.equals(isDisliked, that.isDisliked) && Objects.equals(isSaved, that.isSaved) && Objects.equals(isToDelete, that.isToDelete); + } + + @Override + public int hashCode() { + return Objects.hash(uuid, title, code, language, owner, isOwner, timeAgo, voteResult, userReaction, isPrivate, isLiked, isDisliked, isSaved, isToDelete); + } + + public static final class Builder { + + private @Nullable String uuid; + + @CanIgnoreReturnValue + public @NonNull Builder setUuid(@Nullable String setterArg) { + this.uuid = setterArg; + return this; + } + + private @Nullable String title; + + @CanIgnoreReturnValue + public @NonNull Builder setTitle(@Nullable String setterArg) { + this.title = setterArg; + return this; + } + + private @Nullable SnippetCode code; + + @CanIgnoreReturnValue + public @NonNull Builder setCode(@Nullable SnippetCode setterArg) { + this.code = setterArg; + return this; + } + + private @Nullable SnippetLanguage language; + + @CanIgnoreReturnValue + public @NonNull Builder setLanguage(@Nullable SnippetLanguage setterArg) { + this.language = setterArg; + return this; + } + + private @Nullable Owner owner; + + @CanIgnoreReturnValue + public @NonNull Builder setOwner(@Nullable Owner setterArg) { + this.owner = setterArg; + return this; + } + + private @Nullable Boolean isOwner; + + @CanIgnoreReturnValue + public @NonNull Builder setIsOwner(@Nullable Boolean setterArg) { + this.isOwner = setterArg; + return this; + } + + private @Nullable String timeAgo; + + @CanIgnoreReturnValue + public @NonNull Builder setTimeAgo(@Nullable String setterArg) { + this.timeAgo = setterArg; + return this; + } + + private @Nullable Long voteResult; + + @CanIgnoreReturnValue + public @NonNull Builder setVoteResult(@Nullable Long setterArg) { + this.voteResult = setterArg; + return this; + } + + private @Nullable UserReaction userReaction; + + @CanIgnoreReturnValue + public @NonNull Builder setUserReaction(@Nullable UserReaction setterArg) { + this.userReaction = setterArg; + return this; + } + + private @Nullable Boolean isPrivate; + + @CanIgnoreReturnValue + public @NonNull Builder setIsPrivate(@Nullable Boolean setterArg) { + this.isPrivate = setterArg; + return this; + } + + private @Nullable Boolean isLiked; + + @CanIgnoreReturnValue + public @NonNull Builder setIsLiked(@Nullable Boolean setterArg) { + this.isLiked = setterArg; + return this; + } + + private @Nullable Boolean isDisliked; + + @CanIgnoreReturnValue + public @NonNull Builder setIsDisliked(@Nullable Boolean setterArg) { + this.isDisliked = setterArg; + return this; + } + + private @Nullable Boolean isSaved; + + @CanIgnoreReturnValue + public @NonNull Builder setIsSaved(@Nullable Boolean setterArg) { + this.isSaved = setterArg; + return this; + } + + private @Nullable Boolean isToDelete; + + @CanIgnoreReturnValue + public @NonNull Builder setIsToDelete(@Nullable Boolean setterArg) { + this.isToDelete = setterArg; + return this; + } + + public @NonNull Snippet build() { + Snippet pigeonReturn = new Snippet(); + pigeonReturn.setUuid(uuid); + pigeonReturn.setTitle(title); + pigeonReturn.setCode(code); + pigeonReturn.setLanguage(language); + pigeonReturn.setOwner(owner); + pigeonReturn.setIsOwner(isOwner); + pigeonReturn.setTimeAgo(timeAgo); + pigeonReturn.setVoteResult(voteResult); + pigeonReturn.setUserReaction(userReaction); + pigeonReturn.setIsPrivate(isPrivate); + pigeonReturn.setIsLiked(isLiked); + pigeonReturn.setIsDisliked(isDisliked); + pigeonReturn.setIsSaved(isSaved); + pigeonReturn.setIsToDelete(isToDelete); + return pigeonReturn; + } + } + + @NonNull + ArrayList toList() { + ArrayList toListResult = new ArrayList<>(14); + toListResult.add(uuid); + toListResult.add(title); + toListResult.add(code); + toListResult.add(language); + toListResult.add(owner); + toListResult.add(isOwner); + toListResult.add(timeAgo); + toListResult.add(voteResult); + toListResult.add(userReaction); + toListResult.add(isPrivate); + toListResult.add(isLiked); + toListResult.add(isDisliked); + toListResult.add(isSaved); + toListResult.add(isToDelete); + return toListResult; + } + + static @NonNull Snippet fromList(@NonNull ArrayList pigeonVar_list) { + Snippet pigeonResult = new Snippet(); + Object uuid = pigeonVar_list.get(0); + pigeonResult.setUuid((String) uuid); + Object title = pigeonVar_list.get(1); + pigeonResult.setTitle((String) title); + Object code = pigeonVar_list.get(2); + pigeonResult.setCode((SnippetCode) code); + Object language = pigeonVar_list.get(3); + pigeonResult.setLanguage((SnippetLanguage) language); + Object owner = pigeonVar_list.get(4); + pigeonResult.setOwner((Owner) owner); + Object isOwner = pigeonVar_list.get(5); + pigeonResult.setIsOwner((Boolean) isOwner); + Object timeAgo = pigeonVar_list.get(6); + pigeonResult.setTimeAgo((String) timeAgo); + Object voteResult = pigeonVar_list.get(7); + pigeonResult.setVoteResult((Long) voteResult); + Object userReaction = pigeonVar_list.get(8); + pigeonResult.setUserReaction((UserReaction) userReaction); + Object isPrivate = pigeonVar_list.get(9); + pigeonResult.setIsPrivate((Boolean) isPrivate); + Object isLiked = pigeonVar_list.get(10); + pigeonResult.setIsLiked((Boolean) isLiked); + Object isDisliked = pigeonVar_list.get(11); + pigeonResult.setIsDisliked((Boolean) isDisliked); + Object isSaved = pigeonVar_list.get(12); + pigeonResult.setIsSaved((Boolean) isSaved); + Object isToDelete = pigeonVar_list.get(13); + pigeonResult.setIsToDelete((Boolean) isToDelete); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class SnippetCode { + private @Nullable String raw; + + public @Nullable String getRaw() { + return raw; + } + + public void setRaw(@Nullable String setterArg) { + this.raw = setterArg; + } + + private @Nullable List tokens; + + public @Nullable List getTokens() { + return tokens; + } + + public void setTokens(@Nullable List setterArg) { + this.tokens = setterArg; + } + + @Override + public boolean equals(Object o) { + if (this == o) { return true; } + if (o == null || getClass() != o.getClass()) { return false; } + SnippetCode that = (SnippetCode) o; + return Objects.equals(raw, that.raw) && Objects.equals(tokens, that.tokens); + } + + @Override + public int hashCode() { + return Objects.hash(raw, tokens); + } + + public static final class Builder { + + private @Nullable String raw; + + @CanIgnoreReturnValue + public @NonNull Builder setRaw(@Nullable String setterArg) { + this.raw = setterArg; + return this; + } + + private @Nullable List tokens; + + @CanIgnoreReturnValue + public @NonNull Builder setTokens(@Nullable List setterArg) { + this.tokens = setterArg; + return this; + } + + public @NonNull SnippetCode build() { + SnippetCode pigeonReturn = new SnippetCode(); + pigeonReturn.setRaw(raw); + pigeonReturn.setTokens(tokens); + return pigeonReturn; + } + } + + @NonNull + ArrayList toList() { + ArrayList toListResult = new ArrayList<>(2); + toListResult.add(raw); + toListResult.add(tokens); + return toListResult; + } + + static @NonNull SnippetCode fromList(@NonNull ArrayList pigeonVar_list) { + SnippetCode pigeonResult = new SnippetCode(); + Object raw = pigeonVar_list.get(0); + pigeonResult.setRaw((String) raw); + Object tokens = pigeonVar_list.get(1); + pigeonResult.setTokens((List) tokens); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class SyntaxToken { + private @Nullable Long start; + + public @Nullable Long getStart() { + return start; + } + + public void setStart(@Nullable Long setterArg) { + this.start = setterArg; + } + + private @Nullable Long end; + + public @Nullable Long getEnd() { + return end; + } + + public void setEnd(@Nullable Long setterArg) { + this.end = setterArg; + } + + private @Nullable Long color; + + public @Nullable Long getColor() { + return color; + } + + public void setColor(@Nullable Long setterArg) { + this.color = setterArg; + } + + @Override + public boolean equals(Object o) { + if (this == o) { return true; } + if (o == null || getClass() != o.getClass()) { return false; } + SyntaxToken that = (SyntaxToken) o; + return Objects.equals(start, that.start) && Objects.equals(end, that.end) && Objects.equals(color, that.color); + } + + @Override + public int hashCode() { + return Objects.hash(start, end, color); + } + + public static final class Builder { + + private @Nullable Long start; + + @CanIgnoreReturnValue + public @NonNull Builder setStart(@Nullable Long setterArg) { + this.start = setterArg; + return this; + } + + private @Nullable Long end; + + @CanIgnoreReturnValue + public @NonNull Builder setEnd(@Nullable Long setterArg) { + this.end = setterArg; + return this; + } + + private @Nullable Long color; + + @CanIgnoreReturnValue + public @NonNull Builder setColor(@Nullable Long setterArg) { + this.color = setterArg; + return this; + } + + public @NonNull SyntaxToken build() { + SyntaxToken pigeonReturn = new SyntaxToken(); + pigeonReturn.setStart(start); + pigeonReturn.setEnd(end); + pigeonReturn.setColor(color); + return pigeonReturn; + } + } + + @NonNull + ArrayList toList() { + ArrayList toListResult = new ArrayList<>(3); + toListResult.add(start); + toListResult.add(end); + toListResult.add(color); + return toListResult; + } + + static @NonNull SyntaxToken fromList(@NonNull ArrayList pigeonVar_list) { + SyntaxToken pigeonResult = new SyntaxToken(); + Object start = pigeonVar_list.get(0); + pigeonResult.setStart((Long) start); + Object end = pigeonVar_list.get(1); + pigeonResult.setEnd((Long) end); + Object color = pigeonVar_list.get(2); + pigeonResult.setColor((Long) color); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class SnippetLanguage { + private @Nullable String raw; + + public @Nullable String getRaw() { + return raw; + } + + public void setRaw(@Nullable String setterArg) { + this.raw = setterArg; + } + + private @Nullable SnippetLanguageType type; + + public @Nullable SnippetLanguageType getType() { + return type; + } + + public void setType(@Nullable SnippetLanguageType setterArg) { + this.type = setterArg; + } + + @Override + public boolean equals(Object o) { + if (this == o) { return true; } + if (o == null || getClass() != o.getClass()) { return false; } + SnippetLanguage that = (SnippetLanguage) o; + return Objects.equals(raw, that.raw) && Objects.equals(type, that.type); + } + + @Override + public int hashCode() { + return Objects.hash(raw, type); + } + + public static final class Builder { + + private @Nullable String raw; + + @CanIgnoreReturnValue + public @NonNull Builder setRaw(@Nullable String setterArg) { + this.raw = setterArg; + return this; + } + + private @Nullable SnippetLanguageType type; + + @CanIgnoreReturnValue + public @NonNull Builder setType(@Nullable SnippetLanguageType setterArg) { + this.type = setterArg; + return this; + } + + public @NonNull SnippetLanguage build() { + SnippetLanguage pigeonReturn = new SnippetLanguage(); + pigeonReturn.setRaw(raw); + pigeonReturn.setType(type); + return pigeonReturn; + } + } + + @NonNull + ArrayList toList() { + ArrayList toListResult = new ArrayList<>(2); + toListResult.add(raw); + toListResult.add(type); + return toListResult; + } + + static @NonNull SnippetLanguage fromList(@NonNull ArrayList pigeonVar_list) { + SnippetLanguage pigeonResult = new SnippetLanguage(); + Object raw = pigeonVar_list.get(0); + pigeonResult.setRaw((String) raw); + Object type = pigeonVar_list.get(1); + pigeonResult.setType((SnippetLanguageType) type); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class Owner { + private @Nullable Long id; + + public @Nullable Long getId() { + return id; + } + + public void setId(@Nullable Long setterArg) { + this.id = setterArg; + } + + private @Nullable String login; + + public @Nullable String getLogin() { + return login; + } + + public void setLogin(@Nullable String setterArg) { + this.login = setterArg; + } + + @Override + public boolean equals(Object o) { + if (this == o) { return true; } + if (o == null || getClass() != o.getClass()) { return false; } + Owner that = (Owner) o; + return Objects.equals(id, that.id) && Objects.equals(login, that.login); + } + + @Override + public int hashCode() { + return Objects.hash(id, login); + } + + public static final class Builder { + + private @Nullable Long id; + + @CanIgnoreReturnValue + public @NonNull Builder setId(@Nullable Long setterArg) { + this.id = setterArg; + return this; + } + + private @Nullable String login; + + @CanIgnoreReturnValue + public @NonNull Builder setLogin(@Nullable String setterArg) { + this.login = setterArg; + return this; + } + + public @NonNull Owner build() { + Owner pigeonReturn = new Owner(); + pigeonReturn.setId(id); + pigeonReturn.setLogin(login); + return pigeonReturn; + } + } + + @NonNull + ArrayList toList() { + ArrayList toListResult = new ArrayList<>(2); + toListResult.add(id); + toListResult.add(login); + return toListResult; + } + + static @NonNull Owner fromList(@NonNull ArrayList pigeonVar_list) { + Owner pigeonResult = new Owner(); + Object id = pigeonVar_list.get(0); + pigeonResult.setId((Long) id); + Object login = pigeonVar_list.get(1); + pigeonResult.setLogin((String) login); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class SnippetFilter { + private @Nullable List languages; + + public @Nullable List getLanguages() { + return languages; + } + + public void setLanguages(@Nullable List setterArg) { + this.languages = setterArg; + } + + private @Nullable List selectedLanguages; + + public @Nullable List getSelectedLanguages() { + return selectedLanguages; + } + + public void setSelectedLanguages(@Nullable List setterArg) { + this.selectedLanguages = setterArg; + } + + private @Nullable List scopes; + + public @Nullable List getScopes() { + return scopes; + } + + public void setScopes(@Nullable List setterArg) { + this.scopes = setterArg; + } + + private @Nullable String selectedScope; + + public @Nullable String getSelectedScope() { + return selectedScope; + } + + public void setSelectedScope(@Nullable String setterArg) { + this.selectedScope = setterArg; + } + + @Override + public boolean equals(Object o) { + if (this == o) { return true; } + if (o == null || getClass() != o.getClass()) { return false; } + SnippetFilter that = (SnippetFilter) o; + return Objects.equals(languages, that.languages) && Objects.equals(selectedLanguages, that.selectedLanguages) && Objects.equals(scopes, that.scopes) && Objects.equals(selectedScope, that.selectedScope); + } + + @Override + public int hashCode() { + return Objects.hash(languages, selectedLanguages, scopes, selectedScope); + } + + public static final class Builder { + + private @Nullable List languages; + + @CanIgnoreReturnValue + public @NonNull Builder setLanguages(@Nullable List setterArg) { + this.languages = setterArg; + return this; + } + + private @Nullable List selectedLanguages; + + @CanIgnoreReturnValue + public @NonNull Builder setSelectedLanguages(@Nullable List setterArg) { + this.selectedLanguages = setterArg; + return this; + } + + private @Nullable List scopes; + + @CanIgnoreReturnValue + public @NonNull Builder setScopes(@Nullable List setterArg) { + this.scopes = setterArg; + return this; + } + + private @Nullable String selectedScope; + + @CanIgnoreReturnValue + public @NonNull Builder setSelectedScope(@Nullable String setterArg) { + this.selectedScope = setterArg; + return this; + } + + public @NonNull SnippetFilter build() { + SnippetFilter pigeonReturn = new SnippetFilter(); + pigeonReturn.setLanguages(languages); + pigeonReturn.setSelectedLanguages(selectedLanguages); + pigeonReturn.setScopes(scopes); + pigeonReturn.setSelectedScope(selectedScope); + return pigeonReturn; + } + } + + @NonNull + ArrayList toList() { + ArrayList toListResult = new ArrayList<>(4); + toListResult.add(languages); + toListResult.add(selectedLanguages); + toListResult.add(scopes); + toListResult.add(selectedScope); + return toListResult; + } + + static @NonNull SnippetFilter fromList(@NonNull ArrayList pigeonVar_list) { + SnippetFilter pigeonResult = new SnippetFilter(); + Object languages = pigeonVar_list.get(0); + pigeonResult.setLanguages((List) languages); + Object selectedLanguages = pigeonVar_list.get(1); + pigeonResult.setSelectedLanguages((List) selectedLanguages); + Object scopes = pigeonVar_list.get(2); + pigeonResult.setScopes((List) scopes); + Object selectedScope = pigeonVar_list.get(3); + pigeonResult.setSelectedScope((String) selectedScope); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class MainModelStateData { + private @Nullable ModelState state; + + public @Nullable ModelState getState() { + return state; + } + + public void setState(@Nullable ModelState setterArg) { + this.state = setterArg; + } + + private @Nullable Boolean isLoading; + + public @Nullable Boolean getIsLoading() { + return isLoading; + } + + public void setIsLoading(@Nullable Boolean setterArg) { + this.isLoading = setterArg; + } + + private @Nullable List data; + + public @Nullable List getData() { + return data; + } + + public void setData(@Nullable List setterArg) { + this.data = setterArg; + } + + private @Nullable SnippetFilter filter; + + public @Nullable SnippetFilter getFilter() { + return filter; + } + + public void setFilter(@Nullable SnippetFilter setterArg) { + this.filter = setterArg; + } + + private @Nullable String error; + + public @Nullable String getError() { + return error; + } + + public void setError(@Nullable String setterArg) { + this.error = 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; + } + + @Override + public boolean equals(Object o) { + if (this == o) { return true; } + if (o == null || getClass() != o.getClass()) { return false; } + MainModelStateData that = (MainModelStateData) o; + return Objects.equals(state, that.state) && Objects.equals(isLoading, that.isLoading) && Objects.equals(data, that.data) && Objects.equals(filter, that.filter) && Objects.equals(error, that.error) && Objects.equals(oldHash, that.oldHash) && Objects.equals(newHash, that.newHash); + } + + @Override + public int hashCode() { + return Objects.hash(state, isLoading, data, filter, error, oldHash, newHash); + } + + public static final class Builder { + + private @Nullable ModelState state; + + @CanIgnoreReturnValue + public @NonNull Builder setState(@Nullable ModelState setterArg) { + this.state = setterArg; + return this; + } + + private @Nullable Boolean isLoading; + + @CanIgnoreReturnValue + public @NonNull Builder setIsLoading(@Nullable Boolean setterArg) { + this.isLoading = setterArg; + return this; + } + + private @Nullable List data; + + @CanIgnoreReturnValue + public @NonNull Builder setData(@Nullable List setterArg) { + this.data = setterArg; + return this; + } + + private @Nullable SnippetFilter filter; + + @CanIgnoreReturnValue + public @NonNull Builder setFilter(@Nullable SnippetFilter setterArg) { + this.filter = setterArg; + return this; + } + + private @Nullable String error; + + @CanIgnoreReturnValue + public @NonNull Builder setError(@Nullable String setterArg) { + this.error = setterArg; + return this; + } + + private @Nullable Long oldHash; + + @CanIgnoreReturnValue + public @NonNull Builder setOldHash(@Nullable Long setterArg) { + this.oldHash = setterArg; + return this; + } + + private @Nullable Long newHash; + + @CanIgnoreReturnValue + public @NonNull Builder setNewHash(@Nullable Long setterArg) { + this.newHash = setterArg; + return this; + } + + public @NonNull MainModelStateData build() { + MainModelStateData pigeonReturn = new MainModelStateData(); + pigeonReturn.setState(state); + pigeonReturn.setIsLoading(isLoading); + pigeonReturn.setData(data); + pigeonReturn.setFilter(filter); + pigeonReturn.setError(error); + pigeonReturn.setOldHash(oldHash); + pigeonReturn.setNewHash(newHash); + return pigeonReturn; + } + } + + @NonNull + ArrayList toList() { + ArrayList toListResult = new ArrayList<>(7); + toListResult.add(state); + toListResult.add(isLoading); + toListResult.add(data); + toListResult.add(filter); + toListResult.add(error); + toListResult.add(oldHash); + toListResult.add(newHash); + return toListResult; + } + + static @NonNull MainModelStateData fromList(@NonNull ArrayList pigeonVar_list) { + MainModelStateData pigeonResult = new MainModelStateData(); + Object state = pigeonVar_list.get(0); + pigeonResult.setState((ModelState) state); + Object isLoading = pigeonVar_list.get(1); + pigeonResult.setIsLoading((Boolean) isLoading); + Object data = pigeonVar_list.get(2); + pigeonResult.setData((List) data); + Object filter = pigeonVar_list.get(3); + pigeonResult.setFilter((SnippetFilter) filter); + Object error = pigeonVar_list.get(4); + pigeonResult.setError((String) error); + Object oldHash = pigeonVar_list.get(5); + pigeonResult.setOldHash((Long) oldHash); + Object newHash = pigeonVar_list.get(6); + pigeonResult.setNewHash((Long) newHash); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class MainModelEventData { + private @Nullable MainModelEvent event; + + public @Nullable MainModelEvent getEvent() { + return event; + } + + public void setEvent(@Nullable MainModelEvent setterArg) { + this.event = setterArg; + } + + private @Nullable String message; + + public @Nullable String getMessage() { + return message; + } + + public void setMessage(@Nullable String setterArg) { + this.message = 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; + } + + @Override + public boolean equals(Object o) { + if (this == o) { return true; } + if (o == null || getClass() != o.getClass()) { return false; } + MainModelEventData that = (MainModelEventData) o; + return Objects.equals(event, that.event) && Objects.equals(message, that.message) && Objects.equals(oldHash, that.oldHash) && Objects.equals(newHash, that.newHash); + } + + @Override + public int hashCode() { + return Objects.hash(event, message, oldHash, newHash); + } + + public static final class Builder { + + private @Nullable MainModelEvent event; + + @CanIgnoreReturnValue + public @NonNull Builder setEvent(@Nullable MainModelEvent setterArg) { + this.event = setterArg; + return this; + } + + private @Nullable String message; + + @CanIgnoreReturnValue + public @NonNull Builder setMessage(@Nullable String setterArg) { + this.message = setterArg; + return this; + } + + private @Nullable Long oldHash; + + @CanIgnoreReturnValue + public @NonNull Builder setOldHash(@Nullable Long setterArg) { + this.oldHash = setterArg; + return this; + } + + private @Nullable Long newHash; + + @CanIgnoreReturnValue + public @NonNull Builder setNewHash(@Nullable Long setterArg) { + this.newHash = setterArg; + return this; + } + + public @NonNull MainModelEventData build() { + MainModelEventData pigeonReturn = new MainModelEventData(); + pigeonReturn.setEvent(event); + pigeonReturn.setMessage(message); + pigeonReturn.setOldHash(oldHash); + pigeonReturn.setNewHash(newHash); + return pigeonReturn; + } + } + + @NonNull + ArrayList toList() { + ArrayList toListResult = new ArrayList<>(4); + toListResult.add(event); + toListResult.add(message); + toListResult.add(oldHash); + toListResult.add(newHash); + return toListResult; + } + + static @NonNull MainModelEventData fromList(@NonNull ArrayList pigeonVar_list) { + MainModelEventData pigeonResult = new MainModelEventData(); + Object event = pigeonVar_list.get(0); + pigeonResult.setEvent((MainModelEvent) event); + Object message = pigeonVar_list.get(1); + pigeonResult.setMessage((String) message); + Object oldHash = pigeonVar_list.get(2); + pigeonResult.setOldHash((Long) oldHash); + Object newHash = pigeonVar_list.get(3); + pigeonResult.setNewHash((Long) newHash); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class DetailModelStateData { + private @Nullable ModelState state; + + public @Nullable ModelState getState() { + return state; + } + + public void setState(@Nullable ModelState setterArg) { + this.state = setterArg; + } + + private @Nullable Boolean isLoading; + + public @Nullable Boolean getIsLoading() { + return isLoading; + } + + public void setIsLoading(@Nullable Boolean setterArg) { + this.isLoading = setterArg; + } + + private @Nullable Snippet data; + + public @Nullable Snippet getData() { + return data; + } + + public void setData(@Nullable Snippet setterArg) { + this.data = setterArg; + } + + private @Nullable String error; + + public @Nullable String getError() { + return error; + } + + public void setError(@Nullable String setterArg) { + this.error = 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; + } + + @Override + public boolean equals(Object o) { + if (this == o) { return true; } + if (o == null || getClass() != o.getClass()) { return false; } + DetailModelStateData that = (DetailModelStateData) o; + return Objects.equals(state, that.state) && Objects.equals(isLoading, that.isLoading) && Objects.equals(data, that.data) && Objects.equals(error, that.error) && Objects.equals(oldHash, that.oldHash) && Objects.equals(newHash, that.newHash); + } + + @Override + public int hashCode() { + return Objects.hash(state, isLoading, data, error, oldHash, newHash); + } + + public static final class Builder { + + private @Nullable ModelState state; + + @CanIgnoreReturnValue + public @NonNull Builder setState(@Nullable ModelState setterArg) { + this.state = setterArg; + return this; + } + + private @Nullable Boolean isLoading; + + @CanIgnoreReturnValue + public @NonNull Builder setIsLoading(@Nullable Boolean setterArg) { + this.isLoading = setterArg; + return this; + } + + private @Nullable Snippet data; + + @CanIgnoreReturnValue + public @NonNull Builder setData(@Nullable Snippet setterArg) { + this.data = setterArg; + return this; + } + + private @Nullable String error; + + @CanIgnoreReturnValue + public @NonNull Builder setError(@Nullable String setterArg) { + this.error = setterArg; + return this; + } + + private @Nullable Long oldHash; + + @CanIgnoreReturnValue + public @NonNull Builder setOldHash(@Nullable Long setterArg) { + this.oldHash = setterArg; + return this; + } + + private @Nullable Long newHash; + + @CanIgnoreReturnValue + public @NonNull Builder setNewHash(@Nullable Long setterArg) { + this.newHash = setterArg; + return this; + } + + public @NonNull DetailModelStateData build() { + DetailModelStateData pigeonReturn = new DetailModelStateData(); + pigeonReturn.setState(state); + pigeonReturn.setIsLoading(isLoading); + pigeonReturn.setData(data); + pigeonReturn.setError(error); + pigeonReturn.setOldHash(oldHash); + pigeonReturn.setNewHash(newHash); + return pigeonReturn; + } + } + + @NonNull + ArrayList toList() { + ArrayList toListResult = new ArrayList<>(6); + toListResult.add(state); + toListResult.add(isLoading); + toListResult.add(data); + toListResult.add(error); + toListResult.add(oldHash); + toListResult.add(newHash); + return toListResult; + } + + static @NonNull DetailModelStateData fromList(@NonNull ArrayList pigeonVar_list) { + DetailModelStateData pigeonResult = new DetailModelStateData(); + Object state = pigeonVar_list.get(0); + pigeonResult.setState((ModelState) state); + Object isLoading = pigeonVar_list.get(1); + pigeonResult.setIsLoading((Boolean) isLoading); + Object data = pigeonVar_list.get(2); + pigeonResult.setData((Snippet) data); + Object error = pigeonVar_list.get(3); + pigeonResult.setError((String) error); + Object oldHash = pigeonVar_list.get(4); + pigeonResult.setOldHash((Long) oldHash); + Object newHash = pigeonVar_list.get(5); + pigeonResult.setNewHash((Long) newHash); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class DetailModelEventData { + private @Nullable DetailModelEvent event; + + public @Nullable DetailModelEvent getEvent() { + return event; + } + + public void setEvent(@Nullable DetailModelEvent setterArg) { + this.event = setterArg; + } + + private @Nullable String value; + + public @Nullable String getValue() { + return value; + } + + public void setValue(@Nullable String setterArg) { + this.value = 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; + } + + @Override + public boolean equals(Object o) { + if (this == o) { return true; } + if (o == null || getClass() != o.getClass()) { return false; } + DetailModelEventData that = (DetailModelEventData) o; + return Objects.equals(event, that.event) && Objects.equals(value, that.value) && Objects.equals(oldHash, that.oldHash) && Objects.equals(newHash, that.newHash); + } + + @Override + public int hashCode() { + return Objects.hash(event, value, oldHash, newHash); + } + + public static final class Builder { + + private @Nullable DetailModelEvent event; + + @CanIgnoreReturnValue + public @NonNull Builder setEvent(@Nullable DetailModelEvent setterArg) { + this.event = setterArg; + return this; + } + + private @Nullable String value; + + @CanIgnoreReturnValue + public @NonNull Builder setValue(@Nullable String setterArg) { + this.value = setterArg; + return this; + } + + private @Nullable Long oldHash; + + @CanIgnoreReturnValue + public @NonNull Builder setOldHash(@Nullable Long setterArg) { + this.oldHash = setterArg; + return this; + } + + private @Nullable Long newHash; + + @CanIgnoreReturnValue + public @NonNull Builder setNewHash(@Nullable Long setterArg) { + this.newHash = setterArg; + return this; + } + + public @NonNull DetailModelEventData build() { + DetailModelEventData pigeonReturn = new DetailModelEventData(); + pigeonReturn.setEvent(event); + pigeonReturn.setValue(value); + pigeonReturn.setOldHash(oldHash); + pigeonReturn.setNewHash(newHash); + return pigeonReturn; + } + } + + @NonNull + ArrayList toList() { + ArrayList toListResult = new ArrayList<>(4); + toListResult.add(event); + toListResult.add(value); + toListResult.add(oldHash); + toListResult.add(newHash); + return toListResult; + } + + static @NonNull DetailModelEventData fromList(@NonNull ArrayList pigeonVar_list) { + DetailModelEventData pigeonResult = new DetailModelEventData(); + Object event = pigeonVar_list.get(0); + pigeonResult.setEvent((DetailModelEvent) event); + Object value = pigeonVar_list.get(1); + pigeonResult.setValue((String) value); + Object oldHash = pigeonVar_list.get(2); + pigeonResult.setOldHash((Long) oldHash); + Object newHash = pigeonVar_list.get(3); + pigeonResult.setNewHash((Long) newHash); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class LoginModelStateData { + private @Nullable ModelState state; + + public @Nullable ModelState getState() { + return state; + } + + public void setState(@Nullable ModelState setterArg) { + this.state = setterArg; + } + + private @Nullable Boolean isLoading; + + public @Nullable Boolean getIsLoading() { + return isLoading; + } + + public void setIsLoading(@Nullable Boolean setterArg) { + this.isLoading = 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; + } + + @Override + public boolean equals(Object o) { + if (this == o) { return true; } + if (o == null || getClass() != o.getClass()) { return false; } + LoginModelStateData that = (LoginModelStateData) o; + return Objects.equals(state, that.state) && Objects.equals(isLoading, that.isLoading) && Objects.equals(oldHash, that.oldHash) && Objects.equals(newHash, that.newHash); + } + + @Override + public int hashCode() { + return Objects.hash(state, isLoading, oldHash, newHash); + } + + public static final class Builder { + + private @Nullable ModelState state; + + @CanIgnoreReturnValue + public @NonNull Builder setState(@Nullable ModelState setterArg) { + this.state = setterArg; + return this; + } + + private @Nullable Boolean isLoading; + + @CanIgnoreReturnValue + public @NonNull Builder setIsLoading(@Nullable Boolean setterArg) { + this.isLoading = setterArg; + return this; + } + + private @Nullable Long oldHash; + + @CanIgnoreReturnValue + public @NonNull Builder setOldHash(@Nullable Long setterArg) { + this.oldHash = setterArg; + return this; + } + + private @Nullable Long newHash; + + @CanIgnoreReturnValue + public @NonNull Builder setNewHash(@Nullable Long setterArg) { + this.newHash = setterArg; + return this; + } + + public @NonNull LoginModelStateData build() { + LoginModelStateData pigeonReturn = new LoginModelStateData(); + pigeonReturn.setState(state); + pigeonReturn.setIsLoading(isLoading); + pigeonReturn.setOldHash(oldHash); + pigeonReturn.setNewHash(newHash); + return pigeonReturn; + } + } + + @NonNull + ArrayList toList() { + ArrayList toListResult = new ArrayList<>(4); + toListResult.add(state); + toListResult.add(isLoading); + toListResult.add(oldHash); + toListResult.add(newHash); + return toListResult; + } + + static @NonNull LoginModelStateData fromList(@NonNull ArrayList pigeonVar_list) { + LoginModelStateData pigeonResult = new LoginModelStateData(); + Object state = pigeonVar_list.get(0); + pigeonResult.setState((ModelState) state); + Object isLoading = pigeonVar_list.get(1); + pigeonResult.setIsLoading((Boolean) isLoading); + Object oldHash = pigeonVar_list.get(2); + pigeonResult.setOldHash((Long) oldHash); + Object newHash = pigeonVar_list.get(3); + pigeonResult.setNewHash((Long) newHash); + return pigeonResult; + } + } + + /** Generated class from Pigeon that represents data sent in messages. */ + public static final class LoginModelEventData { + private @Nullable LoginModelEvent event; + + public @Nullable LoginModelEvent getEvent() { + return event; + } + + public void setEvent(@Nullable LoginModelEvent setterArg) { + this.event = 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; + } + + @Override + public boolean equals(Object o) { + if (this == o) { return true; } + if (o == null || getClass() != o.getClass()) { return false; } + LoginModelEventData that = (LoginModelEventData) o; + return Objects.equals(event, that.event) && Objects.equals(oldHash, that.oldHash) && Objects.equals(newHash, that.newHash); + } + + @Override + public int hashCode() { + return Objects.hash(event, oldHash, newHash); + } + + public static final class Builder { + + private @Nullable LoginModelEvent event; + + @CanIgnoreReturnValue + public @NonNull Builder setEvent(@Nullable LoginModelEvent setterArg) { + this.event = setterArg; + return this; + } + + private @Nullable Long oldHash; + + @CanIgnoreReturnValue + public @NonNull Builder setOldHash(@Nullable Long setterArg) { + this.oldHash = setterArg; + return this; + } + + private @Nullable Long newHash; + + @CanIgnoreReturnValue + public @NonNull Builder setNewHash(@Nullable Long setterArg) { + this.newHash = setterArg; + return this; + } + + public @NonNull LoginModelEventData build() { + LoginModelEventData pigeonReturn = new LoginModelEventData(); + pigeonReturn.setEvent(event); + pigeonReturn.setOldHash(oldHash); + pigeonReturn.setNewHash(newHash); + return pigeonReturn; + } + } + + @NonNull + ArrayList toList() { + ArrayList toListResult = new ArrayList<>(3); + toListResult.add(event); + toListResult.add(oldHash); + toListResult.add(newHash); + return toListResult; + } + + static @NonNull LoginModelEventData fromList(@NonNull ArrayList pigeonVar_list) { + LoginModelEventData pigeonResult = new LoginModelEventData(); + Object event = pigeonVar_list.get(0); + pigeonResult.setEvent((LoginModelEvent) event); + Object oldHash = pigeonVar_list.get(1); + pigeonResult.setOldHash((Long) oldHash); + Object newHash = pigeonVar_list.get(2); + pigeonResult.setNewHash((Long) newHash); + return pigeonResult; + } + } + + private static class PigeonCodec extends StandardMessageCodec { + public static final PigeonCodec INSTANCE = new PigeonCodec(); + + private PigeonCodec() {} + + @Override + protected Object readValueOfType(byte type, @NonNull ByteBuffer buffer) { + switch (type) { + case (byte) 129: { + Object value = readValue(buffer); + return value == null ? null : SnippetLanguageType.values()[((Long) value).intValue()]; + } + case (byte) 130: { + Object value = readValue(buffer); + return value == null ? null : SnippetFilterType.values()[((Long) value).intValue()]; + } + case (byte) 131: { + Object value = readValue(buffer); + return value == null ? null : UserReaction.values()[((Long) value).intValue()]; + } + case (byte) 132: { + Object value = readValue(buffer); + return value == null ? null : ModelState.values()[((Long) value).intValue()]; + } + case (byte) 133: { + Object value = readValue(buffer); + return value == null ? null : MainModelEvent.values()[((Long) value).intValue()]; + } + case (byte) 134: { + Object value = readValue(buffer); + return value == null ? null : DetailModelEvent.values()[((Long) value).intValue()]; + } + case (byte) 135: { + Object value = readValue(buffer); + return value == null ? null : LoginModelEvent.values()[((Long) value).intValue()]; + } + case (byte) 136: + return Snippet.fromList((ArrayList) readValue(buffer)); + case (byte) 137: + return SnippetCode.fromList((ArrayList) readValue(buffer)); + case (byte) 138: + return SyntaxToken.fromList((ArrayList) readValue(buffer)); + case (byte) 139: + return SnippetLanguage.fromList((ArrayList) readValue(buffer)); + case (byte) 140: + return Owner.fromList((ArrayList) readValue(buffer)); + case (byte) 141: + return SnippetFilter.fromList((ArrayList) readValue(buffer)); + case (byte) 142: + return MainModelStateData.fromList((ArrayList) readValue(buffer)); + case (byte) 143: + return MainModelEventData.fromList((ArrayList) readValue(buffer)); + case (byte) 144: + return DetailModelStateData.fromList((ArrayList) readValue(buffer)); + case (byte) 145: + return DetailModelEventData.fromList((ArrayList) readValue(buffer)); + case (byte) 146: + return LoginModelStateData.fromList((ArrayList) readValue(buffer)); + case (byte) 147: + return LoginModelEventData.fromList((ArrayList) readValue(buffer)); + default: + return super.readValueOfType(type, buffer); + } + } + + @Override + protected void writeValue(@NonNull ByteArrayOutputStream stream, Object value) { + if (value instanceof SnippetLanguageType) { + stream.write(129); + writeValue(stream, value == null ? null : ((SnippetLanguageType) value).index); + } else if (value instanceof SnippetFilterType) { + stream.write(130); + writeValue(stream, value == null ? null : ((SnippetFilterType) value).index); + } else if (value instanceof UserReaction) { + stream.write(131); + writeValue(stream, value == null ? null : ((UserReaction) value).index); + } else if (value instanceof ModelState) { + stream.write(132); + writeValue(stream, value == null ? null : ((ModelState) value).index); + } else if (value instanceof MainModelEvent) { + stream.write(133); + writeValue(stream, value == null ? null : ((MainModelEvent) value).index); + } else if (value instanceof DetailModelEvent) { + stream.write(134); + writeValue(stream, value == null ? null : ((DetailModelEvent) value).index); + } else if (value instanceof LoginModelEvent) { + stream.write(135); + writeValue(stream, value == null ? null : ((LoginModelEvent) value).index); + } else if (value instanceof Snippet) { + stream.write(136); + writeValue(stream, ((Snippet) value).toList()); + } else if (value instanceof SnippetCode) { + stream.write(137); + writeValue(stream, ((SnippetCode) value).toList()); + } else if (value instanceof SyntaxToken) { + stream.write(138); + writeValue(stream, ((SyntaxToken) value).toList()); + } else if (value instanceof SnippetLanguage) { + stream.write(139); + writeValue(stream, ((SnippetLanguage) value).toList()); + } else if (value instanceof Owner) { + stream.write(140); + writeValue(stream, ((Owner) value).toList()); + } else if (value instanceof SnippetFilter) { + stream.write(141); + writeValue(stream, ((SnippetFilter) value).toList()); + } else if (value instanceof MainModelStateData) { + stream.write(142); + writeValue(stream, ((MainModelStateData) value).toList()); + } else if (value instanceof MainModelEventData) { + stream.write(143); + writeValue(stream, ((MainModelEventData) value).toList()); + } else if (value instanceof DetailModelStateData) { + stream.write(144); + writeValue(stream, ((DetailModelStateData) value).toList()); + } else if (value instanceof DetailModelEventData) { + stream.write(145); + writeValue(stream, ((DetailModelEventData) value).toList()); + } else if (value instanceof LoginModelStateData) { + stream.write(146); + writeValue(stream, ((LoginModelStateData) value).toList()); + } else if (value instanceof LoginModelEventData) { + stream.write(147); + writeValue(stream, ((LoginModelEventData) value).toList()); + } else { + super.writeValue(stream, value); + } + } + } + + /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ + public interface MainModelBridge { + + @NonNull + MainModelStateData getState(); + + @NonNull + MainModelEventData getEvent(); + + void resetEvent(); + + void initState(); + + void filterLanguage(@NonNull String language, @NonNull Boolean isSelected); + + void filterScope(@NonNull String scope); + + void logOut(); + + /** The codec used by MainModelBridge. */ + static @NonNull MessageCodec getCodec() { + return PigeonCodec.INSTANCE; + } + /**Sets up an instance of `MainModelBridge` to handle messages through the `binaryMessenger`. */ + static void setUp(@NonNull BinaryMessenger binaryMessenger, @Nullable MainModelBridge api) { + setUp(binaryMessenger, "", api); + } + static void setUp(@NonNull BinaryMessenger binaryMessenger, @NonNull String messageChannelSuffix, @Nullable MainModelBridge api) { + messageChannelSuffix = messageChannelSuffix.isEmpty() ? "" : "." + messageChannelSuffix; + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.flutter_module.MainModelBridge.getState" + messageChannelSuffix, getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + try { + MainModelStateData output = api.getState(); + wrapped.add(0, output); + } + catch (Throwable exception) { + wrapped = wrapError(exception); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.flutter_module.MainModelBridge.getEvent" + messageChannelSuffix, getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + try { + MainModelEventData output = api.getEvent(); + wrapped.add(0, output); + } + catch (Throwable exception) { + wrapped = wrapError(exception); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.flutter_module.MainModelBridge.resetEvent" + messageChannelSuffix, getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + try { + api.resetEvent(); + wrapped.add(0, null); + } + catch (Throwable exception) { + wrapped = wrapError(exception); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BinaryMessenger.TaskQueue taskQueue = binaryMessenger.makeBackgroundTaskQueue(); + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.flutter_module.MainModelBridge.initState" + messageChannelSuffix, getCodec(), taskQueue); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + try { + api.initState(); + wrapped.add(0, null); + } + catch (Throwable exception) { + wrapped = wrapError(exception); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BinaryMessenger.TaskQueue taskQueue = binaryMessenger.makeBackgroundTaskQueue(); + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.flutter_module.MainModelBridge.filterLanguage" + messageChannelSuffix, getCodec(), taskQueue); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + String languageArg = (String) args.get(0); + Boolean isSelectedArg = (Boolean) args.get(1); + try { + api.filterLanguage(languageArg, isSelectedArg); + wrapped.add(0, null); + } + catch (Throwable exception) { + wrapped = wrapError(exception); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BinaryMessenger.TaskQueue taskQueue = binaryMessenger.makeBackgroundTaskQueue(); + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.flutter_module.MainModelBridge.filterScope" + messageChannelSuffix, getCodec(), taskQueue); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + String scopeArg = (String) args.get(0); + try { + api.filterScope(scopeArg); + wrapped.add(0, null); + } + catch (Throwable exception) { + wrapped = wrapError(exception); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BinaryMessenger.TaskQueue taskQueue = binaryMessenger.makeBackgroundTaskQueue(); + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.flutter_module.MainModelBridge.logOut" + messageChannelSuffix, getCodec(), taskQueue); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + try { + api.logOut(); + wrapped.add(0, null); + } + catch (Throwable exception) { + wrapped = wrapError(exception); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + } + } + /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ + public interface DetailModelBridge { + + @NonNull + DetailModelStateData getState(); + + @NonNull + DetailModelEventData getEvent(); + + void resetEvent(); + + void load(@NonNull String uuid); + + void like(); + + void dislike(); + + void save(); + + void copyToClipboard(); + + void share(); + + void delete(); + + /** The codec used by DetailModelBridge. */ + static @NonNull MessageCodec getCodec() { + return PigeonCodec.INSTANCE; + } + /**Sets up an instance of `DetailModelBridge` to handle messages through the `binaryMessenger`. */ + static void setUp(@NonNull BinaryMessenger binaryMessenger, @Nullable DetailModelBridge api) { + setUp(binaryMessenger, "", api); + } + static void setUp(@NonNull BinaryMessenger binaryMessenger, @NonNull String messageChannelSuffix, @Nullable DetailModelBridge api) { + messageChannelSuffix = messageChannelSuffix.isEmpty() ? "" : "." + messageChannelSuffix; + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.getState" + messageChannelSuffix, getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + try { + DetailModelStateData output = api.getState(); + wrapped.add(0, output); + } + catch (Throwable exception) { + wrapped = wrapError(exception); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.getEvent" + messageChannelSuffix, getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + try { + DetailModelEventData output = api.getEvent(); + wrapped.add(0, output); + } + catch (Throwable exception) { + wrapped = wrapError(exception); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.resetEvent" + messageChannelSuffix, getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + try { + api.resetEvent(); + wrapped.add(0, null); + } + catch (Throwable exception) { + wrapped = wrapError(exception); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.load" + messageChannelSuffix, getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + String uuidArg = (String) args.get(0); + try { + api.load(uuidArg); + wrapped.add(0, null); + } + catch (Throwable exception) { + wrapped = wrapError(exception); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.like" + messageChannelSuffix, getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + try { + api.like(); + wrapped.add(0, null); + } + catch (Throwable exception) { + wrapped = wrapError(exception); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.dislike" + messageChannelSuffix, getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + try { + api.dislike(); + wrapped.add(0, null); + } + catch (Throwable exception) { + wrapped = wrapError(exception); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.save" + messageChannelSuffix, getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + try { + api.save(); + wrapped.add(0, null); + } + catch (Throwable exception) { + wrapped = wrapError(exception); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.copyToClipboard" + messageChannelSuffix, getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + try { + api.copyToClipboard(); + wrapped.add(0, null); + } + catch (Throwable exception) { + wrapped = wrapError(exception); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.share" + messageChannelSuffix, getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + try { + api.share(); + wrapped.add(0, null); + } + catch (Throwable exception) { + wrapped = wrapError(exception); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.delete" + messageChannelSuffix, getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + try { + api.delete(); + wrapped.add(0, null); + } + catch (Throwable exception) { + wrapped = wrapError(exception); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + } + } + /** 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 @NonNull MessageCodec getCodec() { + return PigeonCodec.INSTANCE; + } + /**Sets up an instance of `LoginModelBridge` to handle messages through the `binaryMessenger`. */ + static void setUp(@NonNull BinaryMessenger binaryMessenger, @Nullable LoginModelBridge api) { + setUp(binaryMessenger, "", api); + } + static void setUp(@NonNull BinaryMessenger binaryMessenger, @NonNull String messageChannelSuffix, @Nullable LoginModelBridge api) { + messageChannelSuffix = messageChannelSuffix.isEmpty() ? "" : "." + messageChannelSuffix; + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.flutter_module.LoginModelBridge.getState" + messageChannelSuffix, getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + try { + LoginModelStateData output = api.getState(); + wrapped.add(0, output); + } + catch (Throwable exception) { + wrapped = wrapError(exception); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.flutter_module.LoginModelBridge.getEvent" + messageChannelSuffix, getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + try { + LoginModelEventData output = api.getEvent(); + wrapped.add(0, output); + } + catch (Throwable exception) { + wrapped = wrapError(exception); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.flutter_module.LoginModelBridge.loginOrRegister" + messageChannelSuffix, getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + ArrayList args = (ArrayList) message; + String emailArg = (String) args.get(0); + String passwordArg = (String) args.get(1); + try { + api.loginOrRegister(emailArg, passwordArg); + wrapped.add(0, null); + } + catch (Throwable exception) { + wrapped = wrapError(exception); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.flutter_module.LoginModelBridge.checkLoginState" + messageChannelSuffix, getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + try { + api.checkLoginState(); + wrapped.add(0, null); + } + catch (Throwable exception) { + wrapped = wrapError(exception); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.flutter_module.LoginModelBridge.resetEvent" + messageChannelSuffix, getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList<>(); + try { + api.resetEvent(); + wrapped.add(0, null); + } + catch (Throwable exception) { + wrapped = wrapError(exception); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + } + } +} diff --git a/app/src/main/java/dev/snipme/snipmeapp/bridge/ModelPlugin.kt b/app/src/main/java/dev/snipme/snipmeapp/bridge/ModelPlugin.kt new file mode 100644 index 0000000..734cf9a --- /dev/null +++ b/app/src/main/java/dev/snipme/snipmeapp/bridge/ModelPlugin.kt @@ -0,0 +1,106 @@ +package dev.snipme.snipmeapp.bridge + +import android.text.Spanned +import android.text.format.DateUtils +import android.text.style.ForegroundColorSpan +import androidx.core.text.getSpans +import io.flutter.embedding.engine.plugins.FlutterPlugin +import io.flutter.plugin.common.BinaryMessenger +import org.koin.core.component.KoinComponent +import dev.snipme.snipmeapp.domain.reaction.UserReaction +import dev.snipme.snipmeapp.domain.snippets.* +import java.util.* + +/* + flutter pub run pigeon \ + --input bridge/main_model.dart \ + --dart_out lib/model/main_model.dart \ + --java_out ../app/src/main/java/dev/snipme/snipmeapp/bridge/Bridge.java \ + --java_package "dev.snipme.snipmeapp.bridge" + */ + +abstract class ModelPlugin : FlutterPlugin, KoinComponent { + + abstract fun onSetup(messenger: BinaryMessenger, bridge: T?) + + override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) { + onSetup(binding.binaryMessenger, this as T) + } + + override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) { + onSetup(binding.binaryMessenger, null) + } +} + +fun Snippet.toModelData(): Bridge.Snippet { + val it = this + return Bridge.Snippet().apply { + uuid = it.uuid + title = it.title + code = it.code.toModelSnippetCode() + language = it.language.toModelSnippetLanguage() + owner = it.owner.toModelOwner() + isOwner = it.isOwner + voteResult = (it.numberOfLikes - it.numberOfDislikes).toLong() + userReaction = it.userReaction.toModelUserReaction() + isLiked = it.userReaction.toModelReactionState(UserReaction.LIKE) + isDisliked = it.userReaction.toModelReactionState(UserReaction.DISLIKE) + isPrivate = it.visibility == SnippetVisibility.PRIVATE + isSaved = calculateSavedState(it.isOwner, it.visibility) + isToDelete = it.isOwner + timeAgo = DateUtils.getRelativeTimeSpanString( + it.modifiedAt.time, + Date().time, + DateUtils.SECOND_IN_MILLIS + ).toString() + } +} + +private fun Owner.toModelOwner() = + Bridge.Owner().let { + it.id = id.toLong() + it.login = login + it + } + +private fun SnippetCode.toModelSnippetCode() = + Bridge.SnippetCode().let { + it.raw = raw + it.tokens = highlighted.getSpans().map { span -> + span.toSyntaxToken(highlighted) + } + it + } + +private fun SnippetLanguage.toModelSnippetLanguage() = + Bridge.SnippetLanguage().let { + it.raw = raw + it.type = Bridge.SnippetLanguageType.valueOf(type.name) + it + } + +private fun UserReaction.toModelUserReaction(): Bridge.UserReaction = + when (this) { + UserReaction.LIKE -> Bridge.UserReaction.LIKE + UserReaction.DISLIKE -> Bridge.UserReaction.DISLIKE + else -> Bridge.UserReaction.NONE + } + +private fun UserReaction.toModelReactionState(reaction: UserReaction) = + if (this == UserReaction.NONE) null else this == reaction + +private fun calculateSavedState( + isOwner: Boolean, + visibility: SnippetVisibility +): Boolean? { + if (isOwner.not()) return null + return visibility == SnippetVisibility.PRIVATE +} + +private fun ForegroundColorSpan.toSyntaxToken(spannable: Spanned) = + Bridge.SyntaxToken().let { + it.start = spannable.getSpanStart(this).toLong() + it.end = spannable.getSpanEnd(this).toLong() + it.color = foregroundColor.toLong() + it + } diff --git a/app/src/main/java/dev/snipme/snipmeapp/channel/details/DetailsModel.kt b/app/src/main/java/dev/snipme/snipmeapp/bridge/detail/DetailModel.kt similarity index 66% rename from app/src/main/java/dev/snipme/snipmeapp/channel/details/DetailsModel.kt rename to app/src/main/java/dev/snipme/snipmeapp/bridge/detail/DetailModel.kt index c97cb3f..1f479cc 100644 --- a/app/src/main/java/dev/snipme/snipmeapp/channel/details/DetailsModel.kt +++ b/app/src/main/java/dev/snipme/snipmeapp/bridge/detail/DetailModel.kt @@ -1,48 +1,42 @@ -package dev.snipme.snipmeapp.channel.details +package dev.snipme.snipmeapp.bridge.detail -import dev.snipme.snipmeapp.channel.error.ErrorParsable -import dev.snipme.snipmeapp.channel.session.SessionModel +import io.reactivex.disposables.CompositeDisposable +import io.reactivex.rxkotlin.plusAssign +import io.reactivex.rxkotlin.subscribeBy +import io.reactivex.schedulers.Schedulers +import kotlinx.coroutines.flow.MutableStateFlow +import dev.snipme.snipmeapp.bridge.session.SessionModel import dev.snipme.snipmeapp.domain.clipboard.AddToClipboardUseCase -import dev.snipme.snipmeapp.domain.error.exception.ConnectionException -import dev.snipme.snipmeapp.domain.error.exception.ContentNotFoundException -import dev.snipme.snipmeapp.domain.error.exception.ForbiddenActionException -import dev.snipme.snipmeapp.domain.error.exception.NetworkNotAvailableException -import dev.snipme.snipmeapp.domain.error.exception.NotAuthorizedException -import dev.snipme.snipmeapp.domain.error.exception.RemoteException -import dev.snipme.snipmeapp.domain.error.exception.SessionExpiredException +import dev.snipme.snipmeapp.domain.error.exception.* import dev.snipme.snipmeapp.domain.message.ErrorMessages import dev.snipme.snipmeapp.domain.reaction.GetTargetUserReactionUseCase import dev.snipme.snipmeapp.domain.reaction.SetUserReactionUseCase import dev.snipme.snipmeapp.domain.reaction.UserReaction -import dev.snipme.snipmeapp.domain.share.ShareSnippetUseCase +import dev.snipme.snipmeapp.domain.share.ShareSnippetCodeUseCase import dev.snipme.snipmeapp.domain.snippet.DeleteSnippetUseCase import dev.snipme.snipmeapp.domain.snippet.GetSingleSnippetUseCase import dev.snipme.snipmeapp.domain.snippet.SaveSnippetUseCase import dev.snipme.snipmeapp.domain.snippets.Snippet -import io.reactivex.disposables.CompositeDisposable -import io.reactivex.rxkotlin.plusAssign -import io.reactivex.rxkotlin.subscribeBy -import io.reactivex.schedulers.Schedulers -import kotlinx.coroutines.flow.MutableStateFlow +import dev.snipme.snipmeapp.bridge.error.ErrorParsable import timber.log.Timber -class DetailsModel( +class DetailModel( private val errorMessages: ErrorMessages, private val getSnippet: GetSingleSnippetUseCase, private val clipboard: AddToClipboardUseCase, private val getTargetReaction: GetTargetUserReactionUseCase, private val setUserReaction: SetUserReactionUseCase, private val saveSnippet: SaveSnippetUseCase, - private val shareSnippet: ShareSnippetUseCase, + private val shareSnippet: ShareSnippetCodeUseCase, private val deleteSnippet: DeleteSnippetUseCase, private val session: SessionModel ) : ErrorParsable { private val disposables = CompositeDisposable() - private val mutableState = MutableStateFlow(Loading) + private val mutableState = MutableStateFlow(Loading) val state = mutableState - private val mutableEvent = MutableStateFlow(Idle) + private val mutableEvent = MutableStateFlow(Idle) val event = mutableEvent override fun parseError(throwable: Throwable) { @@ -71,8 +65,12 @@ class DetailsModel( ).also { disposables += it } } - fun toggleFavorite() { - // TODO Implement + fun like() { + changeReaction(UserReaction.LIKE) + } + + fun dislike() { + changeReaction(UserReaction.DISLIKE) } fun copyToClipboard() { @@ -81,29 +79,27 @@ class DetailsModel( } } - fun save(image: ByteArray) { - Timber.d("Saving snippet image ${image.size}") - try { - getSnippet()?.let { - saveSnippet(image, it) - Timber.d("Snippet ${it.title} saved") - } - mutableEvent.value = Alert("Snippet saved") - } catch (e: Exception) { - Timber.e("Couldn't save snippet, error = $e") - mutableEvent.value = Alert(errorMessages.generic) + fun save() { + getSnippet()?.let { + setState(Loading) + saveSnippet(it) + .subscribeOn(Schedulers.io()) + .subscribeBy( + onSuccess = { saved -> + setState(Loaded(it)) + mutableEvent.value = Saved(saved.uuid) + }, + onError = { error -> + Timber.e("Couldn't save snippet, error = $error") + parseError(error) + } + ).also { disposables += it } } } - fun share(image: ByteArray) { - try { - getSnippet()?.let { - shareSnippet(image, it) - } - mutableEvent.value = Alert("Snippet shared") - } catch (e: Exception) { - Timber.e("Couldn't share snippet, error = $e") - mutableEvent.value = Alert(errorMessages.generic) + fun share() { + getSnippet()?.let { + shareSnippet(it) } } @@ -150,18 +146,19 @@ class DetailsModel( null } - private fun setState(newState: DetailsViewState?) { + private fun setState(newState: DetailViewState?) { newState?.let { mutableState.value = it } } } -sealed class DetailsViewState -data object Loading : DetailsViewState() -data class Loaded(val snippet: Snippet) : DetailsViewState() -data class Error(val error: String?) : DetailsViewState() - -sealed class DetailsEvent -data object Idle : DetailsEvent() -data object Deleted : DetailsEvent() -data class Alert(val message: String) : DetailsEvent() -data object Logout : DetailsEvent() \ No newline at end of file +sealed class DetailViewState +object Loading : DetailViewState() +data class Loaded(val snippet: Snippet) : DetailViewState() +data class Error(val error: String?) : DetailViewState() + +sealed class DetailEvent +object Idle : DetailEvent() +object Deleted : DetailEvent() +data class Alert(val message: String) : DetailEvent() +data class Saved(val snippetId: String) : DetailEvent() +object Logout : DetailEvent() \ No newline at end of file diff --git a/app/src/main/java/dev/snipme/snipmeapp/bridge/detail/DetailModelPlugin.kt b/app/src/main/java/dev/snipme/snipmeapp/bridge/detail/DetailModelPlugin.kt new file mode 100644 index 0000000..a43651c --- /dev/null +++ b/app/src/main/java/dev/snipme/snipmeapp/bridge/detail/DetailModelPlugin.kt @@ -0,0 +1,90 @@ +package dev.snipme.snipmeapp.bridge.detail + +import io.flutter.plugin.common.BinaryMessenger +import org.koin.core.component.inject +import dev.snipme.snipmeapp.bridge.Bridge +import dev.snipme.snipmeapp.bridge.ModelPlugin +import dev.snipme.snipmeapp.bridge.toModelData + +class DetailModelPlugin : ModelPlugin(), Bridge.DetailModelBridge { + private val model: DetailModel by inject() + private var oldEvent: DetailEvent? = null + private var oldState: DetailViewState? = null + + override fun getState(): Bridge.DetailModelStateData = getData(model.state.value) + + override fun getEvent(): Bridge.DetailModelEventData = getEvent(model.event.value) + + override fun resetEvent() { + model.event.value = Idle + } + + override fun onSetup(messenger: BinaryMessenger, bridge: Bridge.DetailModelBridge?) { + Bridge.DetailModelBridge.setUp(messenger, bridge) + } + + override fun load(uuid: String) { + model.load(uuid) + } + + override fun like() { + model.like() + } + + override fun dislike() { + model.dislike() + } + + override fun save() { + model.save() + } + + override fun copyToClipboard() { + model.copyToClipboard() + } + + override fun share() { + model.share() + } + + override fun delete() { + model.delete() + } + + private fun getData(viewState: DetailViewState): Bridge.DetailModelStateData { + return Bridge.DetailModelStateData().apply { + state = viewState.toModelState() + isLoading = viewState is Loading + data = (viewState as? Loaded)?.snippet?.toModelData() + oldHash = oldState?.hashCode()?.toLong() + newHash = viewState.hashCode().toLong() + }.also { + oldState = viewState + } + } + + private fun getEvent(detailEvent: DetailEvent): Bridge.DetailModelEventData { + return Bridge.DetailModelEventData().apply { + event = detailEvent.toModelEvent() + value = (detailEvent as? Saved)?.snippetId.toString() + oldHash = oldEvent?.hashCode()?.toLong() + newHash = detailEvent.hashCode().toLong() + }.also { + oldEvent = detailEvent + } + } + + private fun DetailViewState.toModelState() = + when (this) { + Loading -> Bridge.ModelState.LOADING + is Loaded -> Bridge.ModelState.LOADED + else -> Bridge.ModelState.ERROR + } + + private fun DetailEvent.toModelEvent() = + when (this) { + is Saved -> Bridge.DetailModelEvent.SAVED + is Deleted -> Bridge.DetailModelEvent.DELETED + else -> Bridge.DetailModelEvent.NONE + } +} \ No newline at end of file diff --git a/app/src/main/java/dev/snipme/snipmeapp/channel/error/ErrorParsable.kt b/app/src/main/java/dev/snipme/snipmeapp/bridge/error/ErrorParsable.kt similarity index 61% rename from app/src/main/java/dev/snipme/snipmeapp/channel/error/ErrorParsable.kt rename to app/src/main/java/dev/snipme/snipmeapp/bridge/error/ErrorParsable.kt index 6db36db..ee059b1 100644 --- a/app/src/main/java/dev/snipme/snipmeapp/channel/error/ErrorParsable.kt +++ b/app/src/main/java/dev/snipme/snipmeapp/bridge/error/ErrorParsable.kt @@ -1,4 +1,4 @@ -package dev.snipme.snipmeapp.channel.error +package dev.snipme.snipmeapp.bridge.error interface ErrorParsable { fun parseError(throwable: Throwable) diff --git a/app/src/main/java/dev/snipme/snipmeapp/channel/login/LoginModel.kt b/app/src/main/java/dev/snipme/snipmeapp/bridge/login/LoginModel.kt similarity index 85% rename from app/src/main/java/dev/snipme/snipmeapp/channel/login/LoginModel.kt rename to app/src/main/java/dev/snipme/snipmeapp/bridge/login/LoginModel.kt index ed1cc70..72e3d04 100644 --- a/app/src/main/java/dev/snipme/snipmeapp/channel/login/LoginModel.kt +++ b/app/src/main/java/dev/snipme/snipmeapp/bridge/login/LoginModel.kt @@ -1,23 +1,17 @@ -package dev.snipme.snipmeapp.channel.login +package dev.snipme.snipmeapp.bridge.login -import dev.snipme.snipmeapp.channel.error.ErrorParsable -import dev.snipme.snipmeapp.domain.auth.InitialLoginUseCase -import dev.snipme.snipmeapp.domain.auth.LoginInteractor -import dev.snipme.snipmeapp.domain.error.exception.ConnectionException -import dev.snipme.snipmeapp.domain.error.exception.ContentNotFoundException -import dev.snipme.snipmeapp.domain.error.exception.ForbiddenActionException -import dev.snipme.snipmeapp.domain.error.exception.NetworkNotAvailableException -import dev.snipme.snipmeapp.domain.error.exception.NotAuthorizedException -import dev.snipme.snipmeapp.domain.error.exception.RemoteException -import dev.snipme.snipmeapp.domain.error.exception.SessionExpiredException -import dev.snipme.snipmeapp.domain.message.ErrorMessages -import dev.snipme.snipmeapp.util.extension.inProgress import io.reactivex.disposables.CompositeDisposable import io.reactivex.disposables.Disposable import io.reactivex.rxkotlin.plusAssign import io.reactivex.rxkotlin.subscribeBy import io.reactivex.schedulers.Schedulers import kotlinx.coroutines.flow.MutableStateFlow +import dev.snipme.snipmeapp.domain.auth.InitialLoginUseCase +import dev.snipme.snipmeapp.domain.auth.LoginInteractor +import dev.snipme.snipmeapp.domain.error.exception.* +import dev.snipme.snipmeapp.domain.message.ErrorMessages +import dev.snipme.snipmeapp.bridge.error.ErrorParsable +import dev.snipme.snipmeapp.util.extension.inProgress import timber.log.Timber import java.util.concurrent.TimeUnit @@ -68,6 +62,8 @@ class LoginModel( fun loginOrRegister(email: String, password: String) { if (identifyDisposable.inProgress()) return + setState(Loading) + identifyDisposable = interactor.identify(email) .subscribeOn(Schedulers.io()) .subscribeBy( @@ -128,10 +124,10 @@ class LoginModel( sealed class LoginState -data object Loading : LoginState() -data object Loaded : LoginState() +object Loading : LoginState() +object Loaded : LoginState() sealed class LoginEvent -data object Idle : LoginEvent() -data object Logged : LoginEvent() +object Idle : LoginEvent() +object Logged : LoginEvent() data class Error(val message: String?) : LoginEvent() diff --git a/app/src/main/java/dev/snipme/snipmeapp/bridge/login/LoginModelPlugin.kt b/app/src/main/java/dev/snipme/snipmeapp/bridge/login/LoginModelPlugin.kt new file mode 100644 index 0000000..ef323ee --- /dev/null +++ b/app/src/main/java/dev/snipme/snipmeapp/bridge/login/LoginModelPlugin.kt @@ -0,0 +1,64 @@ +package dev.snipme.snipmeapp.bridge.login + +import io.flutter.plugin.common.BinaryMessenger +import org.koin.core.component.inject +import dev.snipme.snipmeapp.bridge.Bridge +import dev.snipme.snipmeapp.bridge.ModelPlugin + +class LoginModelPlugin : ModelPlugin(), 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() { + model.event.value = Idle + } + + override fun onSetup(messenger: BinaryMessenger, bridge: Bridge.LoginModelBridge?) { + Bridge.LoginModelBridge.setUp(messenger, bridge) + } + + override fun checkLoginState() { + model.init() + } + + override fun loginOrRegister(email: String, password: String) { + model.loginOrRegister(email, password) + } + + private fun getModelEvent(loginEvent: LoginEvent): Bridge.LoginModelEventData { + return Bridge.LoginModelEventData().apply { + event = loginEvent.toModelLoginEvent() + oldHash = oldEvent?.hashCode()?.toLong() ?: 0 + newHash = loginEvent.hashCode().toLong() + }.also { + oldEvent = loginEvent + } + } + + 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 + else -> Bridge.LoginModelEvent.NONE + } +} \ No newline at end of file diff --git a/app/src/main/java/dev/snipme/snipmeapp/channel/main/MainModel.kt b/app/src/main/java/dev/snipme/snipmeapp/bridge/main/MainModel.kt similarity index 97% rename from app/src/main/java/dev/snipme/snipmeapp/channel/main/MainModel.kt rename to app/src/main/java/dev/snipme/snipmeapp/bridge/main/MainModel.kt index d8263a8..e397251 100644 --- a/app/src/main/java/dev/snipme/snipmeapp/channel/main/MainModel.kt +++ b/app/src/main/java/dev/snipme/snipmeapp/bridge/main/MainModel.kt @@ -1,11 +1,11 @@ -package dev.snipme.snipmeapp.channel.main +package dev.snipme.snipmeapp.bridge.main import io.reactivex.disposables.CompositeDisposable import io.reactivex.rxkotlin.plusAssign import io.reactivex.rxkotlin.subscribeBy import io.reactivex.schedulers.Schedulers import kotlinx.coroutines.flow.MutableStateFlow -import dev.snipme.snipmeapp.channel.session.SessionModel +import dev.snipme.snipmeapp.bridge.session.SessionModel import dev.snipme.snipmeapp.domain.error.exception.* import dev.snipme.snipmeapp.domain.filter.* import dev.snipme.snipmeapp.domain.message.ErrorMessages @@ -13,7 +13,7 @@ import dev.snipme.snipmeapp.domain.snippet.ObserveSnippetUpdatesUseCase import dev.snipme.snipmeapp.domain.snippets.* import dev.snipme.snipmeapp.domain.user.GetSingleUserUseCase import dev.snipme.snipmeapp.domain.user.User -import dev.snipme.snipmeapp.channel.error.ErrorParsable +import dev.snipme.snipmeapp.bridge.error.ErrorParsable import timber.log.Timber private const val ONE_PAGE = 1 diff --git a/app/src/main/java/dev/snipme/snipmeapp/bridge/main/MainModelPlugin.kt b/app/src/main/java/dev/snipme/snipmeapp/bridge/main/MainModelPlugin.kt new file mode 100644 index 0000000..efb3cd4 --- /dev/null +++ b/app/src/main/java/dev/snipme/snipmeapp/bridge/main/MainModelPlugin.kt @@ -0,0 +1,96 @@ +package dev.snipme.snipmeapp.bridge.main + +import io.flutter.plugin.common.BinaryMessenger +import org.koin.core.component.inject +import dev.snipme.snipmeapp.bridge.Bridge +import dev.snipme.snipmeapp.bridge.ModelPlugin +import dev.snipme.snipmeapp.bridge.toModelData +import dev.snipme.snipmeapp.domain.snippets.Snippet +import dev.snipme.snipmeapp.domain.snippets.SnippetFilters + +class MainModelPlugin : ModelPlugin(), Bridge.MainModelBridge { + private val model: MainModel by inject() + private var oldEvent: MainEvent? = null + private var oldState: MainViewState? = null + + override fun onSetup( + messenger: BinaryMessenger, + bridge: Bridge.MainModelBridge? + ) { + Bridge.MainModelBridge.setUp(messenger, bridge) + } + + override fun getState(): Bridge.MainModelStateData = getState(model.state.value) + + override fun getEvent(): Bridge.MainModelEventData = getEvent(model.event.value) + + override fun resetEvent() { + model.event.value = Startup + } + + override fun initState() { + model.initState() + } + + override fun filterLanguage(language: String, isSelected: Boolean) { + model.filterLanguage(language, isSelected) + } + + override fun filterScope(scope: String) { + model.filterScope(scope) + } + + override fun logOut() { + model.logOut() + } + + private fun getState(viewState: MainViewState): Bridge.MainModelStateData { + return Bridge.MainModelStateData().apply { + state = viewState.toModelState() + isLoading = viewState is Loading + data = (viewState as? Loaded)?.snippets?.toModelData() + filter = (viewState as? Loaded)?.filters?.toModelFilter() + oldHash = oldState?.hashCode()?.toLong() + newHash = viewState.hashCode().toLong() + }.also { + oldState = viewState + } + } + + private fun getEvent(viewEvent: MainEvent): Bridge.MainModelEventData { + return Bridge.MainModelEventData().apply { + event = viewEvent.toModelEvent() + message = (viewEvent as? Alert)?.message + oldHash = oldEvent?.hashCode()?.toLong() + newHash = viewEvent.hashCode().toLong() + }.also { + oldEvent = viewEvent + } + } + + private fun MainEvent.toModelEvent() = + when (this) { + is Alert -> Bridge.MainModelEvent.ALERT + is Logout -> Bridge.MainModelEvent.LOGOUT + else -> Bridge.MainModelEvent.NONE + } + + private fun MainViewState.toModelState() = + when (this) { + Loading -> Bridge.ModelState.LOADING + is Loaded -> Bridge.ModelState.LOADED + is Error -> Bridge.ModelState.ERROR + } + + private fun List.toModelData() = map { it.toModelData() } + + private fun SnippetFilters.toModelFilter(): Bridge.SnippetFilter { + val it = this + return Bridge.SnippetFilter().apply { + languages = it.languages + selectedLanguages = it.selectedLanguages + scopes = it.scopes + selectedScope = it.selectedScope + } + } +} diff --git a/app/src/main/java/dev/snipme/snipmeapp/channel/session/SessionModel.kt b/app/src/main/java/dev/snipme/snipmeapp/bridge/session/SessionModel.kt similarity index 94% rename from app/src/main/java/dev/snipme/snipmeapp/channel/session/SessionModel.kt rename to app/src/main/java/dev/snipme/snipmeapp/bridge/session/SessionModel.kt index e2c44ce..14ae406 100644 --- a/app/src/main/java/dev/snipme/snipmeapp/channel/session/SessionModel.kt +++ b/app/src/main/java/dev/snipme/snipmeapp/bridge/session/SessionModel.kt @@ -1,4 +1,4 @@ -package dev.snipme.snipmeapp.channel.session +package dev.snipme.snipmeapp.bridge.session import io.reactivex.disposables.CompositeDisposable import io.reactivex.disposables.Disposable diff --git a/app/src/main/java/dev/snipme/snipmeapp/channel/DataModel.g.kt b/app/src/main/java/dev/snipme/snipmeapp/channel/DataModel.g.kt deleted file mode 100644 index 1003358..0000000 --- a/app/src/main/java/dev/snipme/snipmeapp/channel/DataModel.g.kt +++ /dev/null @@ -1,1055 +0,0 @@ -// Autogenerated from Pigeon (v24.2.0), do not edit directly. -// See also: https://pub.dev/packages/pigeon -@file:Suppress("UNCHECKED_CAST", "ArrayInDataClass") - -package dev.snipme.snipmeapp.channel - -import android.util.Log -import io.flutter.plugin.common.BasicMessageChannel -import io.flutter.plugin.common.BinaryMessenger -import io.flutter.plugin.common.EventChannel -import io.flutter.plugin.common.MessageCodec -import io.flutter.plugin.common.StandardMethodCodec -import io.flutter.plugin.common.StandardMessageCodec -import java.io.ByteArrayOutputStream -import java.nio.ByteBuffer - -private fun wrapResult(result: Any?): List { - return listOf(result) -} - -private fun wrapError(exception: Throwable): List { - return if (exception is FlutterError) { - listOf( - exception.code, - exception.message, - exception.details - ) - } else { - listOf( - exception.javaClass.simpleName, - exception.toString(), - "Cause: " + exception.cause + ", Stacktrace: " + Log.getStackTraceString(exception) - ) - } -} - -/** - * Error class for passing custom error details to Flutter via a thrown PlatformException. - * @property code The error code. - * @property message The error message. - * @property details The error details. Must be a datatype supported by the api codec. - */ -class FlutterError ( - val code: String, - override val message: String? = null, - val details: Any? = null -) : Throwable() - -enum class SnippetLanguageType(val raw: Int) { - C(0), - CPP(1), - OBJECTIVE_C(2), - C_SHARP(3), - JAVA(4), - BASH(5), - PYTHON(6), - PERL(7), - RUBY(8), - SWIFT(9), - JAVASCRIPT(10), - KOTLIN(11), - COFFEESCRIPT(12), - RUST(13), - BASIC(14), - CLOJURE(15), - CSS(16), - DART(17), - ERLANG(18), - GO(19), - HASKELL(20), - LISP(21), - LLVM(22), - LUA(23), - MATLAB(24), - ML(25), - MUMPS(26), - NEMERLE(27), - PASCAL(28), - R(29), - RD(30), - SCALA(31), - SQL(32), - TEX(33), - VB(34), - VHDL(35), - TCL(36), - XQUERY(37), - YAML(38), - MARKDOWN(39), - JSON(40), - XML(41), - PROTO(42), - REGEX(43), - UNKNOWN(44); - - companion object { - fun ofRaw(raw: Int): SnippetLanguageType? { - return values().firstOrNull { it.raw == raw } - } - } -} - -enum class SnippetFilterType(val raw: Int) { - ALL(0), - MINE(1), - SHARED(2); - - companion object { - fun ofRaw(raw: Int): SnippetFilterType? { - return values().firstOrNull { it.raw == raw } - } - } -} - -enum class UserReaction(val raw: Int) { - NONE(0), - LIKE(1), - DISLIKE(2); - - companion object { - fun ofRaw(raw: Int): UserReaction? { - return values().firstOrNull { it.raw == raw } - } - } -} - -enum class ModelState(val raw: Int) { - LOADING(0), - LOADED(1), - ERROR(2); - - companion object { - fun ofRaw(raw: Int): ModelState? { - return values().firstOrNull { it.raw == raw } - } - } -} - -enum class MainModelEvent(val raw: Int) { - NONE(0), - ALERT(1), - LOGOUT(2); - - companion object { - fun ofRaw(raw: Int): MainModelEvent? { - return values().firstOrNull { it.raw == raw } - } - } -} - -enum class DetailsModelEvent(val raw: Int) { - NONE(0), - ALERT(1), - DELETED(2); - - companion object { - fun ofRaw(raw: Int): DetailsModelEvent? { - return values().firstOrNull { it.raw == raw } - } - } -} - -enum class LoginModelEvent(val raw: Int) { - NONE(0), - LOGGED(1); - - companion object { - fun ofRaw(raw: Int): LoginModelEvent? { - return values().firstOrNull { it.raw == raw } - } - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class Snippet ( - val uuid: String? = null, - val title: String? = null, - val code: SnippetCode? = null, - val language: SnippetLanguage? = null, - val owner: Owner? = null, - val isOwner: Boolean? = null, - val timeAgo: String? = null, - val voteResult: Long? = null, - val userReaction: UserReaction? = null, - val isPrivate: Boolean? = null, - val isLiked: Boolean? = null, - val isDisliked: Boolean? = null, - val isSaved: Boolean? = null, - val isToDelete: Boolean? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): Snippet { - val uuid = pigeonVar_list[0] as String? - val title = pigeonVar_list[1] as String? - val code = pigeonVar_list[2] as SnippetCode? - val language = pigeonVar_list[3] as SnippetLanguage? - val owner = pigeonVar_list[4] as Owner? - val isOwner = pigeonVar_list[5] as Boolean? - val timeAgo = pigeonVar_list[6] as String? - val voteResult = pigeonVar_list[7] as Long? - val userReaction = pigeonVar_list[8] as UserReaction? - val isPrivate = pigeonVar_list[9] as Boolean? - val isLiked = pigeonVar_list[10] as Boolean? - val isDisliked = pigeonVar_list[11] as Boolean? - val isSaved = pigeonVar_list[12] as Boolean? - val isToDelete = pigeonVar_list[13] as Boolean? - return Snippet(uuid, title, code, language, owner, isOwner, timeAgo, voteResult, userReaction, isPrivate, isLiked, isDisliked, isSaved, isToDelete) - } - } - fun toList(): List { - return listOf( - uuid, - title, - code, - language, - owner, - isOwner, - timeAgo, - voteResult, - userReaction, - isPrivate, - isLiked, - isDisliked, - isSaved, - isToDelete, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class SnippetCode ( - val raw: String? = null, - val tokens: List? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): SnippetCode { - val raw = pigeonVar_list[0] as String? - val tokens = pigeonVar_list[1] as List? - return SnippetCode(raw, tokens) - } - } - fun toList(): List { - return listOf( - raw, - tokens, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class SyntaxToken ( - val start: Long? = null, - val end: Long? = null, - val color: Long? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): SyntaxToken { - val start = pigeonVar_list[0] as Long? - val end = pigeonVar_list[1] as Long? - val color = pigeonVar_list[2] as Long? - return SyntaxToken(start, end, color) - } - } - fun toList(): List { - return listOf( - start, - end, - color, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class SnippetLanguage ( - val raw: String? = null, - val type: SnippetLanguageType? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): SnippetLanguage { - val raw = pigeonVar_list[0] as String? - val type = pigeonVar_list[1] as SnippetLanguageType? - return SnippetLanguage(raw, type) - } - } - fun toList(): List { - return listOf( - raw, - type, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class Owner ( - val id: Long? = null, - val login: String? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): Owner { - val id = pigeonVar_list[0] as Long? - val login = pigeonVar_list[1] as String? - return Owner(id, login) - } - } - fun toList(): List { - return listOf( - id, - login, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class SnippetFilter ( - val languages: List? = null, - val selectedLanguages: List? = null, - val scopes: List? = null, - val selectedScope: String? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): SnippetFilter { - val languages = pigeonVar_list[0] as List? - val selectedLanguages = pigeonVar_list[1] as List? - val scopes = pigeonVar_list[2] as List? - val selectedScope = pigeonVar_list[3] as String? - return SnippetFilter(languages, selectedLanguages, scopes, selectedScope) - } - } - fun toList(): List { - return listOf( - languages, - selectedLanguages, - scopes, - selectedScope, - ) - } -} - -/** - * Generated class from Pigeon that represents data sent in messages. - * This class should not be extended by any user class outside of the generated file. - */ -sealed class ModelStateData -/** - * Generated class from Pigeon that represents data sent in messages. - * This class should not be extended by any user class outside of the generated file. - */ -sealed class ModelEventData -/** Generated class from Pigeon that represents data sent in messages. */ -data class MainModelStateData ( - val state: ModelState? = null, - val isLoading: Boolean? = null, - val data: List? = null, - val filter: SnippetFilter? = null, - val error: String? = null -) : ModelStateData() - { - companion object { - fun fromList(pigeonVar_list: List): MainModelStateData { - val state = pigeonVar_list[0] as ModelState? - val isLoading = pigeonVar_list[1] as Boolean? - val data = pigeonVar_list[2] as List? - val filter = pigeonVar_list[3] as SnippetFilter? - val error = pigeonVar_list[4] as String? - return MainModelStateData(state, isLoading, data, filter, error) - } - } - fun toList(): List { - return listOf( - state, - isLoading, - data, - filter, - error, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class MainModelEventData ( - val event: MainModelEvent? = null, - val message: String? = null -) : ModelEventData() - { - companion object { - fun fromList(pigeonVar_list: List): MainModelEventData { - val event = pigeonVar_list[0] as MainModelEvent? - val message = pigeonVar_list[1] as String? - return MainModelEventData(event, message) - } - } - fun toList(): List { - return listOf( - event, - message, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class DetailsModelStateData ( - val state: ModelState? = null, - val isLoading: Boolean? = null, - val data: Snippet? = null, - val error: String? = null -) : ModelStateData() - { - companion object { - fun fromList(pigeonVar_list: List): DetailsModelStateData { - val state = pigeonVar_list[0] as ModelState? - val isLoading = pigeonVar_list[1] as Boolean? - val data = pigeonVar_list[2] as Snippet? - val error = pigeonVar_list[3] as String? - return DetailsModelStateData(state, isLoading, data, error) - } - } - fun toList(): List { - return listOf( - state, - isLoading, - data, - error, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class DetailsModelEventData ( - val event: DetailsModelEvent? = null, - val value: String? = null -) : ModelEventData() - { - companion object { - fun fromList(pigeonVar_list: List): DetailsModelEventData { - val event = pigeonVar_list[0] as DetailsModelEvent? - val value = pigeonVar_list[1] as String? - return DetailsModelEventData(event, value) - } - } - fun toList(): List { - return listOf( - event, - value, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class LoginModelStateData ( - val state: ModelState? = null, - val isLoading: Boolean? = null -) : ModelStateData() - { - companion object { - fun fromList(pigeonVar_list: List): LoginModelStateData { - val state = pigeonVar_list[0] as ModelState? - val isLoading = pigeonVar_list[1] as Boolean? - return LoginModelStateData(state, isLoading) - } - } - fun toList(): List { - return listOf( - state, - isLoading, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class LoginModelEventData ( - val event: LoginModelEvent? = null -) : ModelEventData() - { - companion object { - fun fromList(pigeonVar_list: List): LoginModelEventData { - val event = pigeonVar_list[0] as LoginModelEvent? - return LoginModelEventData(event) - } - } - fun toList(): List { - return listOf( - event, - ) - } -} -private open class DataModelPigeonCodec : StandardMessageCodec() { - override fun readValueOfType(type: Byte, buffer: ByteBuffer): Any? { - return when (type) { - 129.toByte() -> { - return (readValue(buffer) as Long?)?.let { - SnippetLanguageType.ofRaw(it.toInt()) - } - } - 130.toByte() -> { - return (readValue(buffer) as Long?)?.let { - SnippetFilterType.ofRaw(it.toInt()) - } - } - 131.toByte() -> { - return (readValue(buffer) as Long?)?.let { - UserReaction.ofRaw(it.toInt()) - } - } - 132.toByte() -> { - return (readValue(buffer) as Long?)?.let { - ModelState.ofRaw(it.toInt()) - } - } - 133.toByte() -> { - return (readValue(buffer) as Long?)?.let { - MainModelEvent.ofRaw(it.toInt()) - } - } - 134.toByte() -> { - return (readValue(buffer) as Long?)?.let { - DetailsModelEvent.ofRaw(it.toInt()) - } - } - 135.toByte() -> { - return (readValue(buffer) as Long?)?.let { - LoginModelEvent.ofRaw(it.toInt()) - } - } - 136.toByte() -> { - return (readValue(buffer) as? List)?.let { - Snippet.fromList(it) - } - } - 137.toByte() -> { - return (readValue(buffer) as? List)?.let { - SnippetCode.fromList(it) - } - } - 138.toByte() -> { - return (readValue(buffer) as? List)?.let { - SyntaxToken.fromList(it) - } - } - 139.toByte() -> { - return (readValue(buffer) as? List)?.let { - SnippetLanguage.fromList(it) - } - } - 140.toByte() -> { - return (readValue(buffer) as? List)?.let { - Owner.fromList(it) - } - } - 141.toByte() -> { - return (readValue(buffer) as? List)?.let { - SnippetFilter.fromList(it) - } - } - 142.toByte() -> { - return (readValue(buffer) as? List)?.let { - MainModelStateData.fromList(it) - } - } - 143.toByte() -> { - return (readValue(buffer) as? List)?.let { - MainModelEventData.fromList(it) - } - } - 144.toByte() -> { - return (readValue(buffer) as? List)?.let { - DetailsModelStateData.fromList(it) - } - } - 145.toByte() -> { - return (readValue(buffer) as? List)?.let { - DetailsModelEventData.fromList(it) - } - } - 146.toByte() -> { - return (readValue(buffer) as? List)?.let { - LoginModelStateData.fromList(it) - } - } - 147.toByte() -> { - return (readValue(buffer) as? List)?.let { - LoginModelEventData.fromList(it) - } - } - else -> super.readValueOfType(type, buffer) - } - } - override fun writeValue(stream: ByteArrayOutputStream, value: Any?) { - when (value) { - is SnippetLanguageType -> { - stream.write(129) - writeValue(stream, value.raw) - } - is SnippetFilterType -> { - stream.write(130) - writeValue(stream, value.raw) - } - is UserReaction -> { - stream.write(131) - writeValue(stream, value.raw) - } - is ModelState -> { - stream.write(132) - writeValue(stream, value.raw) - } - is MainModelEvent -> { - stream.write(133) - writeValue(stream, value.raw) - } - is DetailsModelEvent -> { - stream.write(134) - writeValue(stream, value.raw) - } - is LoginModelEvent -> { - stream.write(135) - writeValue(stream, value.raw) - } - is Snippet -> { - stream.write(136) - writeValue(stream, value.toList()) - } - is SnippetCode -> { - stream.write(137) - writeValue(stream, value.toList()) - } - is SyntaxToken -> { - stream.write(138) - writeValue(stream, value.toList()) - } - is SnippetLanguage -> { - stream.write(139) - writeValue(stream, value.toList()) - } - is Owner -> { - stream.write(140) - writeValue(stream, value.toList()) - } - is SnippetFilter -> { - stream.write(141) - writeValue(stream, value.toList()) - } - is MainModelStateData -> { - stream.write(142) - writeValue(stream, value.toList()) - } - is MainModelEventData -> { - stream.write(143) - writeValue(stream, value.toList()) - } - is DetailsModelStateData -> { - stream.write(144) - writeValue(stream, value.toList()) - } - is DetailsModelEventData -> { - stream.write(145) - writeValue(stream, value.toList()) - } - is LoginModelStateData -> { - stream.write(146) - writeValue(stream, value.toList()) - } - is LoginModelEventData -> { - stream.write(147) - writeValue(stream, value.toList()) - } - else -> super.writeValue(stream, value) - } - } -} - -val DataModelPigeonMethodCodec = StandardMethodCodec(DataModelPigeonCodec()); - - -private class DataModelPigeonStreamHandler( - val wrapper: DataModelPigeonEventChannelWrapper -) : EventChannel.StreamHandler { - var pigeonSink: PigeonEventSink? = null - - override fun onListen(p0: Any?, sink: EventChannel.EventSink) { - pigeonSink = PigeonEventSink(sink) - wrapper.onListen(p0, pigeonSink!!) - } - - override fun onCancel(p0: Any?) { - pigeonSink = null - wrapper.onCancel(p0) - } -} - -interface DataModelPigeonEventChannelWrapper { - open fun onListen(p0: Any?, sink: PigeonEventSink) {} - - open fun onCancel(p0: Any?) {} -} - -class PigeonEventSink(private val sink: EventChannel.EventSink) { - fun success(value: T) { - sink.success(value) - } - - fun error(errorCode: String, errorMessage: String?, errorDetails: Any?) { - sink.error(errorCode, errorMessage, errorDetails) - } - - fun endOfStream() { - sink.endOfStream() - } -} - -abstract class ChannelStateStreamHandler : DataModelPigeonEventChannelWrapper { - companion object { - fun register(messenger: BinaryMessenger, streamHandler: ChannelStateStreamHandler, instanceName: String = "") { - var channelName: String = "dev.flutter.pigeon.flutter_module.ChannelModelEventApi.channelState" - if (instanceName.isNotEmpty()) { - channelName += ".$instanceName" - } - val internalStreamHandler = DataModelPigeonStreamHandler(streamHandler) - EventChannel(messenger, channelName, DataModelPigeonMethodCodec).setStreamHandler(internalStreamHandler) - } - } -} - -abstract class ChannelEventStreamHandler : DataModelPigeonEventChannelWrapper { - companion object { - fun register(messenger: BinaryMessenger, streamHandler: ChannelEventStreamHandler, instanceName: String = "") { - var channelName: String = "dev.flutter.pigeon.flutter_module.ChannelModelEventApi.channelEvent" - if (instanceName.isNotEmpty()) { - channelName += ".$instanceName" - } - val internalStreamHandler = DataModelPigeonStreamHandler(streamHandler) - EventChannel(messenger, channelName, DataModelPigeonMethodCodec).setStreamHandler(internalStreamHandler) - } - } -} - -/** Generated interface from Pigeon that represents a handler of messages from Flutter. */ -interface ChannelMainModel { - fun resetEvent() - fun initState() - fun filterLanguage(language: String, isSelected: Boolean) - fun filterScope(scope: String) - fun logOut() - - companion object { - /** The codec used by ChannelMainModel. */ - val codec: MessageCodec by lazy { - DataModelPigeonCodec() - } - /** Sets up an instance of `ChannelMainModel` to handle messages through the `binaryMessenger`. */ - @JvmOverloads - fun setUp(binaryMessenger: BinaryMessenger, api: ChannelMainModel?, messageChannelSuffix: String = "") { - val separatedMessageChannelSuffix = if (messageChannelSuffix.isNotEmpty()) ".$messageChannelSuffix" else "" - val taskQueue = binaryMessenger.makeBackgroundTaskQueue() - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.ChannelMainModel.resetEvent$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.resetEvent() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.ChannelMainModel.initState$separatedMessageChannelSuffix", codec, taskQueue) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.initState() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.ChannelMainModel.filterLanguage$separatedMessageChannelSuffix", codec, taskQueue) - if (api != null) { - channel.setMessageHandler { message, reply -> - val args = message as List - val languageArg = args[0] as String - val isSelectedArg = args[1] as Boolean - val wrapped: List = try { - api.filterLanguage(languageArg, isSelectedArg) - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.ChannelMainModel.filterScope$separatedMessageChannelSuffix", codec, taskQueue) - if (api != null) { - channel.setMessageHandler { message, reply -> - val args = message as List - val scopeArg = args[0] as String - val wrapped: List = try { - api.filterScope(scopeArg) - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.ChannelMainModel.logOut$separatedMessageChannelSuffix", codec, taskQueue) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.logOut() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - } - } -} -/** Generated interface from Pigeon that represents a handler of messages from Flutter. */ -interface ChannelDetailsModel { - fun resetEvent() - fun load(uuid: String) - fun toggleFavorite() - fun saveImage(image: ByteArray) - fun copyToClipboard() - fun shareImage(image: ByteArray) - fun delete() - - companion object { - /** The codec used by ChannelDetailsModel. */ - val codec: MessageCodec by lazy { - DataModelPigeonCodec() - } - /** Sets up an instance of `ChannelDetailsModel` to handle messages through the `binaryMessenger`. */ - @JvmOverloads - fun setUp(binaryMessenger: BinaryMessenger, api: ChannelDetailsModel?, messageChannelSuffix: String = "") { - val separatedMessageChannelSuffix = if (messageChannelSuffix.isNotEmpty()) ".$messageChannelSuffix" else "" - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.ChannelDetailsModel.resetEvent$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.resetEvent() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.ChannelDetailsModel.load$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { message, reply -> - val args = message as List - val uuidArg = args[0] as String - val wrapped: List = try { - api.load(uuidArg) - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.ChannelDetailsModel.toggleFavorite$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.toggleFavorite() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.ChannelDetailsModel.saveImage$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { message, reply -> - val args = message as List - val imageArg = args[0] as ByteArray - val wrapped: List = try { - api.saveImage(imageArg) - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.ChannelDetailsModel.copyToClipboard$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.copyToClipboard() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.ChannelDetailsModel.shareImage$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { message, reply -> - val args = message as List - val imageArg = args[0] as ByteArray - val wrapped: List = try { - api.shareImage(imageArg) - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.ChannelDetailsModel.delete$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.delete() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - } - } -} -/** Generated interface from Pigeon that represents a handler of messages from Flutter. */ -interface ChannelLoginModel { - fun loginOrRegister(email: String, password: String) - fun checkLoginState() - fun resetEvent() - - companion object { - /** The codec used by ChannelLoginModel. */ - val codec: MessageCodec by lazy { - DataModelPigeonCodec() - } - /** Sets up an instance of `ChannelLoginModel` to handle messages through the `binaryMessenger`. */ - @JvmOverloads - fun setUp(binaryMessenger: BinaryMessenger, api: ChannelLoginModel?, messageChannelSuffix: String = "") { - val separatedMessageChannelSuffix = if (messageChannelSuffix.isNotEmpty()) ".$messageChannelSuffix" else "" - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.ChannelLoginModel.loginOrRegister$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { message, reply -> - val args = message as List - val emailArg = args[0] as String - val passwordArg = args[1] as String - val wrapped: List = try { - api.loginOrRegister(emailArg, passwordArg) - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.ChannelLoginModel.checkLoginState$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.checkLoginState() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.ChannelLoginModel.resetEvent$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.resetEvent() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - } - } -} diff --git a/app/src/main/java/dev/snipme/snipmeapp/channel/EventStreamHandlerPlugin.kt b/app/src/main/java/dev/snipme/snipmeapp/channel/EventStreamHandlerPlugin.kt deleted file mode 100644 index a0230cf..0000000 --- a/app/src/main/java/dev/snipme/snipmeapp/channel/EventStreamHandlerPlugin.kt +++ /dev/null @@ -1,48 +0,0 @@ -package dev.snipme.snipmeapp.channel - -import io.flutter.embedding.engine.plugins.FlutterPlugin -import io.flutter.embedding.engine.plugins.FlutterPlugin.FlutterPluginBinding -import io.flutter.plugin.common.BinaryMessenger -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.channels.BufferOverflow.DROP_OLDEST -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.MutableSharedFlow -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach -import org.koin.core.component.KoinComponent -import org.koin.core.component.inject - -class FlowChannelEventStreamHandler : ChannelEventStreamHandler() { - private val scope = CoroutineScope(Dispatchers.Main) - private val sinkFlow = MutableSharedFlow( - replay = 3, - onBufferOverflow = DROP_OLDEST - ) - - fun onSetup(messenger: BinaryMessenger) { - register(messenger, this) - } - - override fun onListen(p0: Any?, sink: PigeonEventSink) { - sinkFlow.onEach { sink.success(it) }.launchIn(scope) - } - - override fun onCancel(p0: Any?) { - sinkFlow.resetReplayCache() - } - - fun zip(flow: Flow) { - flow.onEach { sinkFlow.emit(it) }.launchIn(scope) - } -} - -class EventStreamHandlerPlugin : FlutterPlugin, KoinComponent { - private val eventStream by inject() - - override fun onAttachedToEngine(binding: FlutterPluginBinding) { - eventStream.onSetup(binding.binaryMessenger) - } - - override fun onDetachedFromEngine(binding: FlutterPluginBinding) {} -} \ No newline at end of file diff --git a/app/src/main/java/dev/snipme/snipmeapp/channel/ModelPlugin.kt b/app/src/main/java/dev/snipme/snipmeapp/channel/ModelPlugin.kt deleted file mode 100644 index 82ae9e5..0000000 --- a/app/src/main/java/dev/snipme/snipmeapp/channel/ModelPlugin.kt +++ /dev/null @@ -1,95 +0,0 @@ -package dev.snipme.snipmeapp.channel - -import android.text.Spanned -import android.text.format.DateUtils -import android.text.style.ForegroundColorSpan -import androidx.core.text.getSpans -import io.flutter.embedding.engine.plugins.FlutterPlugin -import io.flutter.plugin.common.BinaryMessenger -import org.koin.core.component.KoinComponent -import dev.snipme.snipmeapp.domain.reaction.UserReaction -import dev.snipme.snipmeapp.domain.snippets.* -import java.util.* -import dev.snipme.snipmeapp.channel.Snippet as ChannelSnippet -import dev.snipme.snipmeapp.channel.SnippetCode as ChannelSnippetCode -import dev.snipme.snipmeapp.channel.SnippetLanguage as ChannelSnippetLanguage -import dev.snipme.snipmeapp.channel.SnippetLanguageType as ChannelSnippetLanguageType -import dev.snipme.snipmeapp.channel.UserReaction as ChannelUserReaction -import dev.snipme.snipmeapp.channel.SyntaxToken as ChannelSyntaxToken -import dev.snipme.snipmeapp.channel.Owner as ChannelOwner - -abstract class ModelPlugin : FlutterPlugin, KoinComponent { - - abstract fun onSetup(messenger: BinaryMessenger, channelModel: T?) - - override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) { - onSetup(binding.binaryMessenger, this as T) - } - - override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) { - onSetup(binding.binaryMessenger, null) - } -} - -fun Snippet.toModelData(): ChannelSnippet = - ChannelSnippet( - uuid = uuid, - title = title, - code = code.toModelSnippetCode(), - language = language.toModelSnippetLanguage(), - owner = owner.toModelOwner(), - isOwner = isOwner, - voteResult = (numberOfLikes - numberOfDislikes).toLong(), - userReaction = userReaction.toModelUserReaction(), - isLiked = userReaction.toModelReactionState(UserReaction.LIKE), - isDisliked = userReaction.toModelReactionState(UserReaction.DISLIKE), - isPrivate = visibility == SnippetVisibility.PRIVATE, - isSaved = calculateSavedState(isOwner, visibility), - isToDelete = isOwner, - timeAgo = DateUtils.getRelativeTimeSpanString( - modifiedAt.time, - Date().time, - DateUtils.SECOND_IN_MILLIS - ).toString() - ) - -private fun Owner.toModelOwner() = ChannelOwner(id = id.toLong(), login = login) - -private fun SnippetCode.toModelSnippetCode() = - ChannelSnippetCode( - raw = raw, - tokens = highlighted.getSpans().map { span -> - span.toSyntaxToken(highlighted) - }, - ) - -private fun SnippetLanguage.toModelSnippetLanguage() = - ChannelSnippetLanguage( - raw = raw, - type = ChannelSnippetLanguageType.valueOf(type.name), - ) - -private fun UserReaction.toModelUserReaction(): ChannelUserReaction = - when (this) { - UserReaction.LIKE -> ChannelUserReaction.LIKE - UserReaction.DISLIKE -> ChannelUserReaction.DISLIKE - else -> ChannelUserReaction.NONE - } - -private fun UserReaction.toModelReactionState(reaction: UserReaction) = - if (this == UserReaction.NONE) null else this == reaction - -private fun calculateSavedState( - isOwner: Boolean, - visibility: SnippetVisibility -): Boolean? { - if (isOwner.not()) return null - return visibility == SnippetVisibility.PRIVATE -} - -private fun ForegroundColorSpan.toSyntaxToken(spannable: Spanned) = - ChannelSyntaxToken( - start = spannable.getSpanStart(this).toLong(), - end = spannable.getSpanEnd(this).toLong(), - color = foregroundColor.toLong(), - ) diff --git a/app/src/main/java/dev/snipme/snipmeapp/channel/StateStreamHandlerPlugin.kt b/app/src/main/java/dev/snipme/snipmeapp/channel/StateStreamHandlerPlugin.kt deleted file mode 100644 index 3bd5dc3..0000000 --- a/app/src/main/java/dev/snipme/snipmeapp/channel/StateStreamHandlerPlugin.kt +++ /dev/null @@ -1,48 +0,0 @@ -package dev.snipme.snipmeapp.channel - -import io.flutter.embedding.engine.plugins.FlutterPlugin -import io.flutter.embedding.engine.plugins.FlutterPlugin.FlutterPluginBinding -import io.flutter.plugin.common.BinaryMessenger -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.channels.BufferOverflow.DROP_OLDEST -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.MutableSharedFlow -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach -import org.koin.core.component.KoinComponent -import org.koin.core.component.inject - -class FlowChannelStateStreamHandler : ChannelStateStreamHandler() { - private val scope = CoroutineScope(Dispatchers.Main) - private val sinkFlow = MutableSharedFlow( - replay = 3, - onBufferOverflow = DROP_OLDEST - ) - - fun onSetup(messenger: BinaryMessenger) { - register(messenger, this) - } - - override fun onListen(p0: Any?, sink: PigeonEventSink) { - sinkFlow.onEach { sink.success(it) }.launchIn(scope) - } - - override fun onCancel(p0: Any?) { - sinkFlow.resetReplayCache() - } - - fun zip(flow: Flow) { - flow.onEach { sinkFlow.emit(it) }.launchIn(scope) - } -} - -class StateStreamHandlerPlugin : FlutterPlugin, KoinComponent { - private val stateStream by inject() - - override fun onAttachedToEngine(binding: FlutterPluginBinding) { - stateStream.onSetup(binding.binaryMessenger) - } - - override fun onDetachedFromEngine(binding: FlutterPluginBinding) {} -} \ No newline at end of file diff --git a/app/src/main/java/dev/snipme/snipmeapp/channel/details/DetailsModelPlugin.kt b/app/src/main/java/dev/snipme/snipmeapp/channel/details/DetailsModelPlugin.kt deleted file mode 100644 index 55496d6..0000000 --- a/app/src/main/java/dev/snipme/snipmeapp/channel/details/DetailsModelPlugin.kt +++ /dev/null @@ -1,83 +0,0 @@ -package dev.snipme.snipmeapp.channel.details - -import dev.snipme.snipmeapp.channel.ChannelDetailsModel -import dev.snipme.snipmeapp.channel.FlowChannelEventStreamHandler -import dev.snipme.snipmeapp.channel.FlowChannelStateStreamHandler -import dev.snipme.snipmeapp.channel.ModelPlugin -import dev.snipme.snipmeapp.channel.toModelData -import io.flutter.plugin.common.BinaryMessenger -import kotlinx.coroutines.flow.map -import org.koin.core.component.inject -import dev.snipme.snipmeapp.channel.DetailsModelEvent as ChannelDetailsModelEvent -import dev.snipme.snipmeapp.channel.DetailsModelEventData as ChannelDetailsModelEventData -import dev.snipme.snipmeapp.channel.DetailsModelStateData as ChannelDetailsModelStateData -import dev.snipme.snipmeapp.channel.ModelState as ChannelModelState - -class DetailsModelPlugin : ModelPlugin(), ChannelDetailsModel { - private val model: DetailsModel by inject() - private val channelStateFlow by inject() - private val channelEventFlow by inject() - - override fun onSetup(messenger: BinaryMessenger, channelModel: ChannelDetailsModel?) { - ChannelDetailsModel.setUp(messenger, channelModel) - channelStateFlow.zip(model.state.map { getModelState(it) }) - channelEventFlow.zip(model.event.map { getModelEvent(it) }) - } - - override fun resetEvent() { - model.event.value = Idle - } - - override fun load(uuid: String) { - model.load(uuid) - } - - override fun toggleFavorite() { - model.toggleFavorite() - } - - override fun saveImage(image: ByteArray) { - model.save(image) - } - - override fun copyToClipboard() { - model.copyToClipboard() - } - - override fun shareImage(image: ByteArray) { - model.share(image) - } - - override fun delete() { - model.delete() - } - - private fun getModelState(viewState: DetailsViewState): ChannelDetailsModelStateData { - return ChannelDetailsModelStateData( - state = viewState.toModelState(), - isLoading = viewState is Loading, - data = (viewState as? Loaded)?.snippet?.toModelData(), - ) - } - - private fun getModelEvent(event: DetailsEvent): ChannelDetailsModelEventData { - return ChannelDetailsModelEventData( - event = event.toModelEvent(), - value = (event as? Alert)?.message.orEmpty() - ) - } - - private fun DetailsViewState.toModelState() = - when (this) { - Loading -> ChannelModelState.LOADING - is Loaded -> ChannelModelState.LOADED - else -> ChannelModelState.ERROR - } - - private fun DetailsEvent.toModelEvent() = - when (this) { - is Deleted -> ChannelDetailsModelEvent.DELETED - is Alert -> ChannelDetailsModelEvent.ALERT - else -> ChannelDetailsModelEvent.NONE - } -} \ No newline at end of file diff --git a/app/src/main/java/dev/snipme/snipmeapp/channel/login/LoginModelPlugin.kt b/app/src/main/java/dev/snipme/snipmeapp/channel/login/LoginModelPlugin.kt deleted file mode 100644 index e0b319c..0000000 --- a/app/src/main/java/dev/snipme/snipmeapp/channel/login/LoginModelPlugin.kt +++ /dev/null @@ -1,62 +0,0 @@ -package dev.snipme.snipmeapp.channel.login - -import dev.snipme.snipmeapp.channel.ChannelLoginModel -import dev.snipme.snipmeapp.channel.FlowChannelEventStreamHandler -import dev.snipme.snipmeapp.channel.FlowChannelStateStreamHandler -import dev.snipme.snipmeapp.channel.ModelPlugin -import io.flutter.plugin.common.BinaryMessenger -import kotlinx.coroutines.flow.map -import org.koin.core.component.inject -import dev.snipme.snipmeapp.channel.LoginModelEvent as ChannelLoginModelEvent -import dev.snipme.snipmeapp.channel.LoginModelEventData as ChannelLoginModelEventData -import dev.snipme.snipmeapp.channel.LoginModelStateData as ChannelLoginModelStateData -import dev.snipme.snipmeapp.channel.ModelState as ChannelModelState - -class LoginModelPlugin : ModelPlugin(), ChannelLoginModel { - private val model: LoginModel by inject() - private val channelStateFlow by inject() - private val channelEventFlow by inject() - - override fun resetEvent() { - model.event.value = Idle - } - - override fun onSetup(messenger: BinaryMessenger, channelModel: ChannelLoginModel?) { - ChannelLoginModel.setUp(messenger, channelModel) - channelStateFlow.zip(model.state.map { getModelState(it) }) - channelEventFlow.zip(model.event.map { getModelEvent(it) }) - } - - override fun checkLoginState() { - model.init() - } - - override fun loginOrRegister(email: String, password: String) { - model.loginOrRegister(email, password) - } - - private fun getModelEvent(loginEvent: LoginEvent): ChannelLoginModelEventData { - return ChannelLoginModelEventData( - event = loginEvent.toModelLoginEvent() - ) - } - - private fun getModelState(loginState: LoginState): ChannelLoginModelStateData { - return ChannelLoginModelStateData( - state = loginState.toModelLoginState(), - isLoading = loginState is Loading - ) - } - - private fun LoginState.toModelLoginState() = - when (this) { - Loaded -> ChannelModelState.LOADED - else -> ChannelModelState.LOADING - } - - private fun LoginEvent.toModelLoginEvent() = - when (this) { - Logged -> ChannelLoginModelEvent.LOGGED - else -> ChannelLoginModelEvent.NONE - } -} \ No newline at end of file diff --git a/app/src/main/java/dev/snipme/snipmeapp/channel/main/MainModelPlugin.kt b/app/src/main/java/dev/snipme/snipmeapp/channel/main/MainModelPlugin.kt deleted file mode 100644 index 3075199..0000000 --- a/app/src/main/java/dev/snipme/snipmeapp/channel/main/MainModelPlugin.kt +++ /dev/null @@ -1,93 +0,0 @@ -package dev.snipme.snipmeapp.channel.main - -import dev.snipme.snipmeapp.channel.FlowChannelEventStreamHandler -import dev.snipme.snipmeapp.channel.FlowChannelStateStreamHandler -import dev.snipme.snipmeapp.channel.ModelPlugin -import dev.snipme.snipmeapp.channel.toModelData -import dev.snipme.snipmeapp.channel.ChannelMainModel -import dev.snipme.snipmeapp.domain.snippets.Snippet -import dev.snipme.snipmeapp.domain.snippets.SnippetFilters -import io.flutter.plugin.common.BinaryMessenger -import kotlinx.coroutines.flow.map -import org.koin.core.component.inject -import dev.snipme.snipmeapp.channel.MainModelEvent as ChannelMainModelEvent -import dev.snipme.snipmeapp.channel.MainModelEventData as ChannelMainModelEventData -import dev.snipme.snipmeapp.channel.MainModelStateData as ChannelMainModelStateData -import dev.snipme.snipmeapp.channel.ModelState as ChannelModelState -import dev.snipme.snipmeapp.channel.SnippetFilter as ChannelSnippetFilter - -class MainModelPlugin : ModelPlugin(), ChannelMainModel { - private val model: MainModel by inject() - private val channelStateFlow by inject() - private val channelEventFlow by inject() - - override fun onSetup( - messenger: BinaryMessenger, - channelModel: ChannelMainModel? - ) { - ChannelMainModel.setUp(messenger, channelModel) - channelStateFlow.zip(model.state.map { getState(it) }) - channelEventFlow.zip(model.event.map { getEvent(it) }) - } - - override fun resetEvent() { - model.event.value = Startup - } - - override fun initState() { - model.initState() - } - - override fun filterLanguage(language: String, isSelected: Boolean) { - model.filterLanguage(language, isSelected) - } - - override fun filterScope(scope: String) { - model.filterScope(scope) - } - - override fun logOut() { - model.logOut() - } - - private fun getState(viewState: MainViewState): ChannelMainModelStateData { - return ChannelMainModelStateData( - state = viewState.toModelState(), - isLoading = viewState is Loading, - data = (viewState as? Loaded)?.snippets?.toModelData(), - filter = (viewState as? Loaded)?.filters?.toModelFilter(), - ) - } - - private fun getEvent(viewEvent: MainEvent): ChannelMainModelEventData { - return ChannelMainModelEventData( - event = viewEvent.toModelEvent(), - message = (viewEvent as? Alert)?.message, - ) - } - - private fun MainEvent.toModelEvent() = - when (this) { - is Alert -> ChannelMainModelEvent.ALERT - is Logout -> ChannelMainModelEvent.LOGOUT - else -> ChannelMainModelEvent.NONE - } - - private fun MainViewState.toModelState() = - when (this) { - Loading -> ChannelModelState.LOADING - is Loaded -> ChannelModelState.LOADED - is Error -> ChannelModelState.ERROR - } - - private fun List.toModelData() = map { it.toModelData() } - - private fun SnippetFilters.toModelFilter(): ChannelSnippetFilter { - return ChannelSnippetFilter( - languages = languages, - selectedLanguages = selectedLanguages, - scopes = scopes, - selectedScope = selectedScope, - ) - } -} diff --git a/app/src/main/java/dev/snipme/snipmeapp/di/ChannelModule.kt b/app/src/main/java/dev/snipme/snipmeapp/di/ChannelModule.kt deleted file mode 100644 index e5e49a7..0000000 --- a/app/src/main/java/dev/snipme/snipmeapp/di/ChannelModule.kt +++ /dev/null @@ -1,18 +0,0 @@ -package dev.snipme.snipmeapp.di - -import dev.snipme.snipmeapp.channel.FlowChannelEventStreamHandler -import dev.snipme.snipmeapp.channel.FlowChannelStateStreamHandler -import dev.snipme.snipmeapp.channel.details.DetailsModel -import dev.snipme.snipmeapp.channel.login.LoginModel -import dev.snipme.snipmeapp.channel.main.MainModel -import dev.snipme.snipmeapp.channel.session.SessionModel -import org.koin.dsl.module - -internal val channelModule = module { - single { FlowChannelStateStreamHandler() } - single { FlowChannelEventStreamHandler() } - single { SessionModel(get()) } - single { LoginModel(get(), get(), get()) } - single { MainModel(get(), get(), get(), get(), get(), get(), get(), get(), get(), get()) } - single { DetailsModel(get(), get(), get(), get(), get(), get(), get(), get(), get()) } -} \ No newline at end of file diff --git a/app/src/main/java/dev/snipme/snipmeapp/di/KoinConfig.kt b/app/src/main/java/dev/snipme/snipmeapp/di/KoinConfig.kt index 001117a..ca08b3c 100644 --- a/app/src/main/java/dev/snipme/snipmeapp/di/KoinConfig.kt +++ b/app/src/main/java/dev/snipme/snipmeapp/di/KoinConfig.kt @@ -9,5 +9,5 @@ val koinModules = listOf( utilModule, useCaseModule, interactorModule, - channelModule + modelModule ) \ No newline at end of file diff --git a/app/src/main/java/dev/snipme/snipmeapp/di/ModelModule.kt b/app/src/main/java/dev/snipme/snipmeapp/di/ModelModule.kt new file mode 100644 index 0000000..a63b6ba --- /dev/null +++ b/app/src/main/java/dev/snipme/snipmeapp/di/ModelModule.kt @@ -0,0 +1,14 @@ +package dev.snipme.snipmeapp.di + +import org.koin.dsl.module +import dev.snipme.snipmeapp.bridge.detail.DetailModel +import dev.snipme.snipmeapp.bridge.login.LoginModel +import dev.snipme.snipmeapp.bridge.main.MainModel +import dev.snipme.snipmeapp.bridge.session.SessionModel + +internal val modelModule = module { + single { SessionModel(get()) } + single { LoginModel(get(), get(), get()) } + single { MainModel(get(), get(), get(), get(), get(), get(), get(), get(), get(), get()) } + single { DetailModel(get(), get(), get(), get(), get(), get(), get(), get(), get()) } +} \ No newline at end of file diff --git a/app/src/main/java/dev/snipme/snipmeapp/di/UseCaseModule.kt b/app/src/main/java/dev/snipme/snipmeapp/di/UseCaseModule.kt index bec68fc..3d2f1b6 100644 --- a/app/src/main/java/dev/snipme/snipmeapp/di/UseCaseModule.kt +++ b/app/src/main/java/dev/snipme/snipmeapp/di/UseCaseModule.kt @@ -8,7 +8,7 @@ import dev.snipme.snipmeapp.domain.language.GetLanguagesUseCase import dev.snipme.snipmeapp.domain.network.CheckNetworkAvailableUseCase import dev.snipme.snipmeapp.domain.reaction.GetTargetUserReactionUseCase import dev.snipme.snipmeapp.domain.reaction.SetUserReactionUseCase -import dev.snipme.snipmeapp.domain.share.ShareSnippetUseCase +import dev.snipme.snipmeapp.domain.share.ShareSnippetCodeUseCase import dev.snipme.snipmeapp.domain.snippet.* import dev.snipme.snipmeapp.domain.filter.FilterSnippetsByLanguageUseCase import dev.snipme.snipmeapp.domain.filter.FilterSnippetsByScopeUseCase @@ -44,7 +44,7 @@ internal val useCaseModule = module { // Language factory { GetLanguagesUseCase(get(), get(), get()) } // Share - factory { ShareSnippetUseCase(get()) } + factory { ShareSnippetCodeUseCase(get()) } // Clipboard single { AddToClipboardUseCase(get()) } factory { GetFromClipboardUseCase(get()) } diff --git a/app/src/main/java/dev/snipme/snipmeapp/di/UtilModule.kt b/app/src/main/java/dev/snipme/snipmeapp/di/UtilModule.kt index 89d5bd9..1ca58e7 100644 --- a/app/src/main/java/dev/snipme/snipmeapp/di/UtilModule.kt +++ b/app/src/main/java/dev/snipme/snipmeapp/di/UtilModule.kt @@ -2,20 +2,18 @@ package dev.snipme.snipmeapp.di import android.content.ClipboardManager import android.content.Context.CLIPBOARD_SERVICE -import dev.snipme.snipmeapp.AppService +import org.koin.android.ext.koin.androidApplication +import org.koin.dsl.module import dev.snipme.snipmeapp.BuildConfig import dev.snipme.snipmeapp.domain.error.DebugErrorHandler import dev.snipme.snipmeapp.domain.error.SafeErrorHandler import dev.snipme.snipmeapp.domain.message.ErrorMessages -import dev.snipme.snipmeapp.domain.message.RealValidationMessages import dev.snipme.snipmeapp.domain.message.ValidationMessages -import org.koin.android.ext.koin.androidApplication -import org.koin.dsl.module +import dev.snipme.snipmeapp.domain.message.RealValidationMessages internal val utilModule = module { factory { if (BuildConfig.DEBUG) DebugErrorHandler() else SafeErrorHandler() } factory { ErrorMessages(get()) } factory { RealValidationMessages(get()) } single { androidApplication().getSystemService(CLIPBOARD_SERVICE) as ClipboardManager } - single { AppService(androidApplication()) } } \ No newline at end of file diff --git a/app/src/main/java/dev/snipme/snipmeapp/domain/share/ShareSnippetCodeUseCase.kt b/app/src/main/java/dev/snipme/snipmeapp/domain/share/ShareSnippetCodeUseCase.kt new file mode 100644 index 0000000..d7d1cf5 --- /dev/null +++ b/app/src/main/java/dev/snipme/snipmeapp/domain/share/ShareSnippetCodeUseCase.kt @@ -0,0 +1,24 @@ +package dev.snipme.snipmeapp.domain.share + +import android.content.Context +import android.content.Intent +import android.content.Intent.FLAG_ACTIVITY_NEW_TASK +import androidx.core.content.ContextCompat.startActivity +import dev.snipme.snipmeapp.domain.snippets.Snippet + +class ShareSnippetCodeUseCase( + private val context: Context +) { + + operator fun invoke(snippet: Snippet) { + val sendIntent: Intent = Intent().apply { + action = Intent.ACTION_SEND + putExtra(Intent.EXTRA_TEXT, snippet.code.raw) + type = "text/plain" + } + + val shareIntent = Intent.createChooser(sendIntent, snippet.title) + shareIntent.addFlags(FLAG_ACTIVITY_NEW_TASK) + startActivity(context, shareIntent, null) + } +} \ No newline at end of file diff --git a/app/src/main/java/dev/snipme/snipmeapp/domain/share/ShareSnippetUseCase.kt b/app/src/main/java/dev/snipme/snipmeapp/domain/share/ShareSnippetUseCase.kt deleted file mode 100644 index 71dde64..0000000 --- a/app/src/main/java/dev/snipme/snipmeapp/domain/share/ShareSnippetUseCase.kt +++ /dev/null @@ -1,15 +0,0 @@ -package dev.snipme.snipmeapp.domain.share - -import dev.snipme.snipmeapp.AppService -import dev.snipme.snipmeapp.domain.snippets.Snippet - -class ShareSnippetUseCase( - private val appService: AppService -) { - - operator fun invoke(image: ByteArray, snippet: Snippet) { - val name = "${appService.getCurrentDateFormatted()}.png" - appService.storeFile(image, name, temp = true) - appService.launchShareIntent(snippet) - } -} \ No newline at end of file diff --git a/app/src/main/java/dev/snipme/snipmeapp/domain/snippet/SaveSnippetUseCase.kt b/app/src/main/java/dev/snipme/snipmeapp/domain/snippet/SaveSnippetUseCase.kt index b1ed75a..de98bec 100644 --- a/app/src/main/java/dev/snipme/snipmeapp/domain/snippet/SaveSnippetUseCase.kt +++ b/app/src/main/java/dev/snipme/snipmeapp/domain/snippet/SaveSnippetUseCase.kt @@ -1,15 +1,20 @@ package dev.snipme.snipmeapp.domain.snippet -import dev.snipme.snipmeapp.AppService +import io.reactivex.Single import dev.snipme.snipmeapp.domain.snippets.Snippet +import dev.snipme.snipmeapp.domain.snippets.SnippetVisibility +import java.util.concurrent.TimeUnit class SaveSnippetUseCase( - private val appService: AppService + private val createSnippet: CreateSnippetUseCase ) { - operator fun invoke(image: ByteArray, snippet: Snippet): String { - val name = "${snippet.title.replace(" ", "_")}.png" - appService.storeFile(image, name, temp = false) - appService.storeMediaFile(image, name) - return name + operator fun invoke(snippet: Snippet): Single { + if (snippet.isOwner) return Single.just(snippet) + return createSnippet( + snippet.title, + snippet.code.raw, + snippet.language.raw, + visibility = SnippetVisibility.PRIVATE, + ) } } \ No newline at end of file diff --git a/app/src/main/java/dev/snipme/snipmeapp/infrastructure/local/ReactionEntry.kt b/app/src/main/java/dev/snipme/snipmeapp/infrastructure/local/ReactionEntry.kt index c832293..b32bad5 100644 --- a/app/src/main/java/dev/snipme/snipmeapp/infrastructure/local/ReactionEntry.kt +++ b/app/src/main/java/dev/snipme/snipmeapp/infrastructure/local/ReactionEntry.kt @@ -4,6 +4,7 @@ import androidx.room.Entity import androidx.room.ForeignKey import androidx.room.Index import androidx.room.PrimaryKey +import dev.snipme.snipmeapp.bridge.Bridge.Snippet @Entity( tableName = "reactions", diff --git a/app/src/main/res/xml/file_paths.xml b/app/src/main/res/xml/file_paths.xml deleted file mode 100644 index 87bfdc8..0000000 --- a/app/src/main/res/xml/file_paths.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - \ No newline at end of file diff --git a/flutter_module/.android/Flutter/build.gradle b/flutter_module/.android/Flutter/build.gradle deleted file mode 100644 index becb6b9..0000000 --- a/flutter_module/.android/Flutter/build.gradle +++ /dev/null @@ -1,56 +0,0 @@ -// Generated file. Do not edit. - -def localProperties = new Properties() -def localPropertiesFile = new File(buildscript.sourceFile.parentFile.parentFile, "local.properties") -if (localPropertiesFile.exists()) { - localPropertiesFile.withReader("UTF-8") { reader -> - localProperties.load(reader) - } -} - -def flutterRoot = localProperties.getProperty("flutter.sdk") -if (flutterRoot == null) { - throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") -} - -def flutterVersionCode = localProperties.getProperty("flutter.versionCode") -if (flutterVersionCode == null) { - flutterVersionCode = "1" -} - -def flutterVersionName = localProperties.getProperty("flutter.versionName") -if (flutterVersionName == null) { - flutterVersionName = "1.0" -} - -apply plugin: "com.android.library" -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" - -group = "dev.snipme.flutter_module" -version = "1.0" - -android { - // Conditional for compatibility with AGP <4.2. - if (project.android.hasProperty("namespace")) { - namespace = "dev.snipme.flutter_module" - } - - compileSdk = flutter.compileSdkVersion - ndkVersion = flutter.ndkVersion - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - defaultConfig { - minSdk = flutter.minSdkVersion - targetSdk = flutter.targetSdkVersion - versionCode = flutterVersionCode.toInteger() - versionName = flutterVersionName - } -} - -flutter { - source = "../.." -} diff --git a/flutter_module/.android/Flutter/src/main/AndroidManifest.xml b/flutter_module/.android/Flutter/src/main/AndroidManifest.xml deleted file mode 100644 index 801919c..0000000 --- a/flutter_module/.android/Flutter/src/main/AndroidManifest.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - diff --git a/flutter_module/.android/Flutter/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java b/flutter_module/.android/Flutter/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java deleted file mode 100644 index 539ab02..0000000 --- a/flutter_module/.android/Flutter/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.flutter.plugins; - -import androidx.annotation.Keep; -import androidx.annotation.NonNull; -import io.flutter.Log; - -import io.flutter.embedding.engine.FlutterEngine; - -/** - * Generated file. Do not edit. - * This file is generated by the Flutter tool based on the - * plugins that support the Android platform. - */ -@Keep -public final class GeneratedPluginRegistrant { - private static final String TAG = "GeneratedPluginRegistrant"; - public static void registerWith(@NonNull FlutterEngine flutterEngine) { - } -} diff --git a/flutter_module/.android/app/build.gradle b/flutter_module/.android/app/build.gradle deleted file mode 100644 index be23c63..0000000 --- a/flutter_module/.android/app/build.gradle +++ /dev/null @@ -1,44 +0,0 @@ -def flutterPluginVersion = "managed" - -apply plugin: "com.android.application" - -android { - // Conditional for compatibility with AGP <4.2. - if (project.android.hasProperty("namespace")) { - namespace = "dev.snipme.flutter_module.host" - } - - compileSdk = 34 - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - } - - defaultConfig { - applicationId = "dev.snipme.flutter_module.host" - minSdk = 21 - targetSdk = 34 - versionCode = 1 - versionName = "1.0" - } - - buildTypes { - profile { - initWith debug - } - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.debug - } - } - -} -buildDir = new File(rootProject.projectDir, "../build/host") -dependencies { - implementation(project(":flutter")) - implementation(fileTree(dir: "libs", include: ["*.jar"])) - implementation("androidx.appcompat:appcompat:1.0.2") - implementation("androidx.constraintlayout:constraintlayout:1.1.3") -} diff --git a/flutter_module/.android/app/src/main/AndroidManifest.xml b/flutter_module/.android/app/src/main/AndroidManifest.xml deleted file mode 100644 index c30c61a..0000000 --- a/flutter_module/.android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/flutter_module/.android/app/src/main/java/dev/snipme/test_flutter/host/MainActivity.java b/flutter_module/.android/app/src/main/java/dev/snipme/test_flutter/host/MainActivity.java deleted file mode 100644 index cc518bb..0000000 --- a/flutter_module/.android/app/src/main/java/dev/snipme/test_flutter/host/MainActivity.java +++ /dev/null @@ -1,6 +0,0 @@ -package dev.snipme.flutter_module.host; - -import io.flutter.embedding.android.FlutterActivity; - -public class MainActivity extends FlutterActivity { -} diff --git a/flutter_module/.android/app/src/main/res/drawable/launch_background.xml b/flutter_module/.android/app/src/main/res/drawable/launch_background.xml deleted file mode 100644 index 304732f..0000000 --- a/flutter_module/.android/app/src/main/res/drawable/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/flutter_module/.android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/flutter_module/.android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index db77bb4..0000000 Binary files a/flutter_module/.android/app/src/main/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/flutter_module/.android/app/src/main/res/values/styles.xml b/flutter_module/.android/app/src/main/res/values/styles.xml deleted file mode 100644 index 2676b0b..0000000 --- a/flutter_module/.android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - diff --git a/flutter_module/.android/build.gradle b/flutter_module/.android/build.gradle deleted file mode 100644 index 7a066e6..0000000 --- a/flutter_module/.android/build.gradle +++ /dev/null @@ -1,41 +0,0 @@ -// Generated file. Do not edit. - -buildscript { - ext.kotlin_version = "1.7.10" - repositories { - google() - mavenCentral() - } - - dependencies { - classpath("com.android.tools.build:gradle:7.3.0") - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version") - } -} - -allprojects { - repositories { - google() - mavenCentral() - } -} - -apply plugin: "com.android.library" -apply plugin: "kotlin-android" - -android { - // Conditional for compatibility with AGP <4.2. - if (project.android.hasProperty("namespace")) { - namespace = "dev.snipme.flutter_module" - } - - compileSdk = 34 - defaultConfig { - minSdk = 21 - targetSdk = 34 - } -} - -dependencies { - implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version") -} diff --git a/flutter_module/.android/gradle.properties b/flutter_module/.android/gradle.properties deleted file mode 100644 index 2597170..0000000 --- a/flutter_module/.android/gradle.properties +++ /dev/null @@ -1,3 +0,0 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError -android.useAndroidX=true -android.enableJetifier=true diff --git a/flutter_module/.android/gradle/wrapper/gradle-wrapper.jar b/flutter_module/.android/gradle/wrapper/gradle-wrapper.jar deleted file mode 100755 index 13372ae..0000000 Binary files a/flutter_module/.android/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/flutter_module/.android/gradle/wrapper/gradle-wrapper.properties b/flutter_module/.android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 3c472b9..0000000 --- a/flutter_module/.android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip diff --git a/flutter_module/.android/gradlew b/flutter_module/.android/gradlew deleted file mode 100755 index 9d82f78..0000000 --- a/flutter_module/.android/gradlew +++ /dev/null @@ -1,160 +0,0 @@ -#!/usr/bin/env bash - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn ( ) { - echo "$*" -} - -die ( ) { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; -esac - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=$((i+1)) - done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") -} -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" - -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/flutter_module/.android/gradlew.bat b/flutter_module/.android/gradlew.bat deleted file mode 100755 index aec9973..0000000 --- a/flutter_module/.android/gradlew.bat +++ /dev/null @@ -1,90 +0,0 @@ -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windowz variants - -if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/flutter_module/.android/include_flutter.groovy b/flutter_module/.android/include_flutter.groovy deleted file mode 100644 index 6ceda7c..0000000 --- a/flutter_module/.android/include_flutter.groovy +++ /dev/null @@ -1,16 +0,0 @@ -def scriptFile = getClass().protectionDomain.codeSource.location.toURI() -def flutterProjectRoot = new File(scriptFile).parentFile.parentFile - -gradle.include ":flutter" -gradle.project(":flutter").projectDir = new File(flutterProjectRoot, ".android/Flutter") - -def localPropertiesFile = new File(flutterProjectRoot, ".android/local.properties") -def properties = new Properties() - -assert localPropertiesFile.exists(), "❗️The Flutter module doesn't have a `$localPropertiesFile` file." + - "\nYou must run `flutter pub get` in `$flutterProjectRoot`." -localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } - -def flutterSdkPath = properties.getProperty("flutter.sdk") -assert flutterSdkPath != null, "flutter.sdk not set in local.properties" -gradle.apply from: "$flutterSdkPath/packages/flutter_tools/gradle/module_plugin_loader.gradle" diff --git a/flutter_module/.android/settings.gradle b/flutter_module/.android/settings.gradle deleted file mode 100644 index b40f9f7..0000000 --- a/flutter_module/.android/settings.gradle +++ /dev/null @@ -1,6 +0,0 @@ -// Generated file. Do not edit. -include ':app' - -rootProject.name = 'android_generated' -setBinding(new Binding([gradle: this])) -evaluate(new File(settingsDir, 'include_flutter.groovy')) diff --git a/flutter_module/.android/src/main/AndroidManifest.xml b/flutter_module/.android/src/main/AndroidManifest.xml deleted file mode 100644 index f2940c7..0000000 --- a/flutter_module/.android/src/main/AndroidManifest.xml +++ /dev/null @@ -1,3 +0,0 @@ - - diff --git a/flutter_module/.fvm/flutter_sdk b/flutter_module/.fvm/flutter_sdk new file mode 120000 index 0000000..b478f77 --- /dev/null +++ b/flutter_module/.fvm/flutter_sdk @@ -0,0 +1 @@ +/Users/tkadziolka/fvm/versions/3.24.0 \ No newline at end of file diff --git a/flutter_module/.fvm/fvm_config.json b/flutter_module/.fvm/fvm_config.json new file mode 100644 index 0000000..8142fd7 --- /dev/null +++ b/flutter_module/.fvm/fvm_config.json @@ -0,0 +1,4 @@ +{ + "flutterSdkVersion": "3.24.0", + "flavors": {} +} \ No newline at end of file diff --git a/flutter_module/.fvmrc b/flutter_module/.fvmrc deleted file mode 100644 index 34136bb..0000000 --- a/flutter_module/.fvmrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "flutter": "3.27.0", - "flavors": {} -} \ No newline at end of file diff --git a/flutter_module/.gitignore b/flutter_module/.gitignore index f09264d..525e05c 100644 --- a/flutter_module/.gitignore +++ b/flutter_module/.gitignore @@ -33,9 +33,12 @@ xcuserdata *.pyc *sync/ +Icon? .tags* build/ +.android/ +.ios/ .flutter-plugins .flutter-plugins-dependencies @@ -44,6 +47,3 @@ app.*.symbols # Obfuscation related app.*.map.json - -# FVM Version Cache -.fvm/ \ No newline at end of file diff --git a/flutter_module/android/src/main/java/dev/snipme/snipmeapp/bridge/ModelPlugin.g.kt b/flutter_module/android/src/main/java/dev/snipme/snipmeapp/bridge/ModelPlugin.g.kt deleted file mode 100644 index 7d7e55e..0000000 --- a/flutter_module/android/src/main/java/dev/snipme/snipmeapp/bridge/ModelPlugin.g.kt +++ /dev/null @@ -1,1125 +0,0 @@ -// Autogenerated from Pigeon (v24.2.0), do not edit directly. -// See also: https://pub.dev/packages/pigeon -@file:Suppress("UNCHECKED_CAST", "ArrayInDataClass") - -package dev.snipme.snipmeapp.bridge - -import android.util.Log -import io.flutter.plugin.common.BasicMessageChannel -import io.flutter.plugin.common.BinaryMessenger -import io.flutter.plugin.common.EventChannel -import io.flutter.plugin.common.MessageCodec -import io.flutter.plugin.common.StandardMethodCodec -import io.flutter.plugin.common.StandardMessageCodec -import java.io.ByteArrayOutputStream -import java.nio.ByteBuffer - -private fun wrapResult(result: Any?): List { - return listOf(result) -} - -private fun wrapError(exception: Throwable): List { - return if (exception is FlutterError) { - listOf( - exception.code, - exception.message, - exception.details - ) - } else { - listOf( - exception.javaClass.simpleName, - exception.toString(), - "Cause: " + exception.cause + ", Stacktrace: " + Log.getStackTraceString(exception) - ) - } -} - -/** - * Error class for passing custom error details to Flutter via a thrown PlatformException. - * @property code The error code. - * @property message The error message. - * @property details The error details. Must be a datatype supported by the api codec. - */ -class FlutterError ( - val code: String, - override val message: String? = null, - val details: Any? = null -) : Throwable() - -enum class SnippetLanguageType(val raw: Int) { - C(0), - CPP(1), - OBJECTIVE_C(2), - C_SHARP(3), - JAVA(4), - BASH(5), - PYTHON(6), - PERL(7), - RUBY(8), - SWIFT(9), - JAVASCRIPT(10), - KOTLIN(11), - COFFEESCRIPT(12), - RUST(13), - BASIC(14), - CLOJURE(15), - CSS(16), - DART(17), - ERLANG(18), - GO(19), - HASKELL(20), - LISP(21), - LLVM(22), - LUA(23), - MATLAB(24), - ML(25), - MUMPS(26), - NEMERLE(27), - PASCAL(28), - R(29), - RD(30), - SCALA(31), - SQL(32), - TEX(33), - VB(34), - VHDL(35), - TCL(36), - XQUERY(37), - YAML(38), - MARKDOWN(39), - JSON(40), - XML(41), - PROTO(42), - REGEX(43), - UNKNOWN(44); - - companion object { - fun ofRaw(raw: Int): SnippetLanguageType? { - return values().firstOrNull { it.raw == raw } - } - } -} - -enum class SnippetFilterType(val raw: Int) { - ALL(0), - MINE(1), - SHARED(2); - - companion object { - fun ofRaw(raw: Int): SnippetFilterType? { - return values().firstOrNull { it.raw == raw } - } - } -} - -enum class UserReaction(val raw: Int) { - NONE(0), - LIKE(1), - DISLIKE(2); - - companion object { - fun ofRaw(raw: Int): UserReaction? { - return values().firstOrNull { it.raw == raw } - } - } -} - -enum class ModelState(val raw: Int) { - LOADING(0), - LOADED(1), - ERROR(2); - - companion object { - fun ofRaw(raw: Int): ModelState? { - return values().firstOrNull { it.raw == raw } - } - } -} - -enum class MainModelEvent(val raw: Int) { - NONE(0), - ALERT(1), - LOGOUT(2); - - companion object { - fun ofRaw(raw: Int): MainModelEvent? { - return values().firstOrNull { it.raw == raw } - } - } -} - -enum class DetailModelEvent(val raw: Int) { - NONE(0), - SAVED(1), - DELETED(2); - - companion object { - fun ofRaw(raw: Int): DetailModelEvent? { - return values().firstOrNull { it.raw == raw } - } - } -} - -enum class LoginModelEvent(val raw: Int) { - NONE(0), - LOGGED(1); - - companion object { - fun ofRaw(raw: Int): LoginModelEvent? { - return values().firstOrNull { it.raw == raw } - } - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class Snippet ( - val uuid: String? = null, - val title: String? = null, - val code: SnippetCode? = null, - val language: SnippetLanguage? = null, - val owner: Owner? = null, - val isOwner: Boolean? = null, - val timeAgo: String? = null, - val voteResult: Long? = null, - val userReaction: UserReaction? = null, - val isPrivate: Boolean? = null, - val isLiked: Boolean? = null, - val isDisliked: Boolean? = null, - val isSaved: Boolean? = null, - val isToDelete: Boolean? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): Snippet { - val uuid = pigeonVar_list[0] as String? - val title = pigeonVar_list[1] as String? - val code = pigeonVar_list[2] as SnippetCode? - val language = pigeonVar_list[3] as SnippetLanguage? - val owner = pigeonVar_list[4] as Owner? - val isOwner = pigeonVar_list[5] as Boolean? - val timeAgo = pigeonVar_list[6] as String? - val voteResult = pigeonVar_list[7] as Long? - val userReaction = pigeonVar_list[8] as UserReaction? - val isPrivate = pigeonVar_list[9] as Boolean? - val isLiked = pigeonVar_list[10] as Boolean? - val isDisliked = pigeonVar_list[11] as Boolean? - val isSaved = pigeonVar_list[12] as Boolean? - val isToDelete = pigeonVar_list[13] as Boolean? - return Snippet(uuid, title, code, language, owner, isOwner, timeAgo, voteResult, userReaction, isPrivate, isLiked, isDisliked, isSaved, isToDelete) - } - } - fun toList(): List { - return listOf( - uuid, - title, - code, - language, - owner, - isOwner, - timeAgo, - voteResult, - userReaction, - isPrivate, - isLiked, - isDisliked, - isSaved, - isToDelete, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class SnippetCode ( - val raw: String? = null, - val tokens: List? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): SnippetCode { - val raw = pigeonVar_list[0] as String? - val tokens = pigeonVar_list[1] as List? - return SnippetCode(raw, tokens) - } - } - fun toList(): List { - return listOf( - raw, - tokens, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class SyntaxToken ( - val start: Long? = null, - val end: Long? = null, - val color: Long? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): SyntaxToken { - val start = pigeonVar_list[0] as Long? - val end = pigeonVar_list[1] as Long? - val color = pigeonVar_list[2] as Long? - return SyntaxToken(start, end, color) - } - } - fun toList(): List { - return listOf( - start, - end, - color, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class SnippetLanguage ( - val raw: String? = null, - val type: SnippetLanguageType? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): SnippetLanguage { - val raw = pigeonVar_list[0] as String? - val type = pigeonVar_list[1] as SnippetLanguageType? - return SnippetLanguage(raw, type) - } - } - fun toList(): List { - return listOf( - raw, - type, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class Owner ( - val id: Long? = null, - val login: String? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): Owner { - val id = pigeonVar_list[0] as Long? - val login = pigeonVar_list[1] as String? - return Owner(id, login) - } - } - fun toList(): List { - return listOf( - id, - login, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class SnippetFilter ( - val languages: List? = null, - val selectedLanguages: List? = null, - val scopes: List? = null, - val selectedScope: String? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): SnippetFilter { - val languages = pigeonVar_list[0] as List? - val selectedLanguages = pigeonVar_list[1] as List? - val scopes = pigeonVar_list[2] as List? - val selectedScope = pigeonVar_list[3] as String? - return SnippetFilter(languages, selectedLanguages, scopes, selectedScope) - } - } - fun toList(): List { - return listOf( - languages, - selectedLanguages, - scopes, - selectedScope, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class MainModelStateData ( - val state: ModelState? = null, - val isLoading: Boolean? = null, - val data: List? = null, - val filter: SnippetFilter? = null, - val error: String? = null, - val oldHash: Long? = null, - val newHash: Long? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): MainModelStateData { - val state = pigeonVar_list[0] as ModelState? - val isLoading = pigeonVar_list[1] as Boolean? - val data = pigeonVar_list[2] as List? - val filter = pigeonVar_list[3] as SnippetFilter? - val error = pigeonVar_list[4] as String? - val oldHash = pigeonVar_list[5] as Long? - val newHash = pigeonVar_list[6] as Long? - return MainModelStateData(state, isLoading, data, filter, error, oldHash, newHash) - } - } - fun toList(): List { - return listOf( - state, - isLoading, - data, - filter, - error, - oldHash, - newHash, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class MainModelEventData ( - val event: MainModelEvent? = null, - val message: String? = null, - val oldHash: Long? = null, - val newHash: Long? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): MainModelEventData { - val event = pigeonVar_list[0] as MainModelEvent? - val message = pigeonVar_list[1] as String? - val oldHash = pigeonVar_list[2] as Long? - val newHash = pigeonVar_list[3] as Long? - return MainModelEventData(event, message, oldHash, newHash) - } - } - fun toList(): List { - return listOf( - event, - message, - oldHash, - newHash, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class DetailModelStateData ( - val state: ModelState? = null, - val isLoading: Boolean? = null, - val data: Snippet? = null, - val error: String? = null, - val oldHash: Long? = null, - val newHash: Long? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): DetailModelStateData { - val state = pigeonVar_list[0] as ModelState? - val isLoading = pigeonVar_list[1] as Boolean? - val data = pigeonVar_list[2] as Snippet? - val error = pigeonVar_list[3] as String? - val oldHash = pigeonVar_list[4] as Long? - val newHash = pigeonVar_list[5] as Long? - return DetailModelStateData(state, isLoading, data, error, oldHash, newHash) - } - } - fun toList(): List { - return listOf( - state, - isLoading, - data, - error, - oldHash, - newHash, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class DetailModelEventData ( - val event: DetailModelEvent? = null, - val value: String? = null, - val oldHash: Long? = null, - val newHash: Long? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): DetailModelEventData { - val event = pigeonVar_list[0] as DetailModelEvent? - val value = pigeonVar_list[1] as String? - val oldHash = pigeonVar_list[2] as Long? - val newHash = pigeonVar_list[3] as Long? - return DetailModelEventData(event, value, oldHash, newHash) - } - } - fun toList(): List { - return listOf( - event, - value, - oldHash, - newHash, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class LoginModelStateData ( - val state: ModelState? = null, - val isLoading: Boolean? = null, - val oldHash: Long? = null, - val newHash: Long? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): LoginModelStateData { - val state = pigeonVar_list[0] as ModelState? - val isLoading = pigeonVar_list[1] as Boolean? - val oldHash = pigeonVar_list[2] as Long? - val newHash = pigeonVar_list[3] as Long? - return LoginModelStateData(state, isLoading, oldHash, newHash) - } - } - fun toList(): List { - return listOf( - state, - isLoading, - oldHash, - newHash, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class LoginModelEventData ( - val event: LoginModelEvent? = null, - val oldHash: Long? = null, - val newHash: Long? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): LoginModelEventData { - val event = pigeonVar_list[0] as LoginModelEvent? - val oldHash = pigeonVar_list[1] as Long? - val newHash = pigeonVar_list[2] as Long? - return LoginModelEventData(event, oldHash, newHash) - } - } - fun toList(): List { - return listOf( - event, - oldHash, - newHash, - ) - } -} -private open class ModelPluginPigeonCodec : StandardMessageCodec() { - override fun readValueOfType(type: Byte, buffer: ByteBuffer): Any? { - return when (type) { - 129.toByte() -> { - return (readValue(buffer) as Long?)?.let { - SnippetLanguageType.ofRaw(it.toInt()) - } - } - 130.toByte() -> { - return (readValue(buffer) as Long?)?.let { - SnippetFilterType.ofRaw(it.toInt()) - } - } - 131.toByte() -> { - return (readValue(buffer) as Long?)?.let { - UserReaction.ofRaw(it.toInt()) - } - } - 132.toByte() -> { - return (readValue(buffer) as Long?)?.let { - ModelState.ofRaw(it.toInt()) - } - } - 133.toByte() -> { - return (readValue(buffer) as Long?)?.let { - MainModelEvent.ofRaw(it.toInt()) - } - } - 134.toByte() -> { - return (readValue(buffer) as Long?)?.let { - DetailModelEvent.ofRaw(it.toInt()) - } - } - 135.toByte() -> { - return (readValue(buffer) as Long?)?.let { - LoginModelEvent.ofRaw(it.toInt()) - } - } - 136.toByte() -> { - return (readValue(buffer) as? List)?.let { - Snippet.fromList(it) - } - } - 137.toByte() -> { - return (readValue(buffer) as? List)?.let { - SnippetCode.fromList(it) - } - } - 138.toByte() -> { - return (readValue(buffer) as? List)?.let { - SyntaxToken.fromList(it) - } - } - 139.toByte() -> { - return (readValue(buffer) as? List)?.let { - SnippetLanguage.fromList(it) - } - } - 140.toByte() -> { - return (readValue(buffer) as? List)?.let { - Owner.fromList(it) - } - } - 141.toByte() -> { - return (readValue(buffer) as? List)?.let { - SnippetFilter.fromList(it) - } - } - 142.toByte() -> { - return (readValue(buffer) as? List)?.let { - MainModelStateData.fromList(it) - } - } - 143.toByte() -> { - return (readValue(buffer) as? List)?.let { - MainModelEventData.fromList(it) - } - } - 144.toByte() -> { - return (readValue(buffer) as? List)?.let { - DetailModelStateData.fromList(it) - } - } - 145.toByte() -> { - return (readValue(buffer) as? List)?.let { - DetailModelEventData.fromList(it) - } - } - 146.toByte() -> { - return (readValue(buffer) as? List)?.let { - LoginModelStateData.fromList(it) - } - } - 147.toByte() -> { - return (readValue(buffer) as? List)?.let { - LoginModelEventData.fromList(it) - } - } - else -> super.readValueOfType(type, buffer) - } - } - override fun writeValue(stream: ByteArrayOutputStream, value: Any?) { - when (value) { - is SnippetLanguageType -> { - stream.write(129) - writeValue(stream, value.raw) - } - is SnippetFilterType -> { - stream.write(130) - writeValue(stream, value.raw) - } - is UserReaction -> { - stream.write(131) - writeValue(stream, value.raw) - } - is ModelState -> { - stream.write(132) - writeValue(stream, value.raw) - } - is MainModelEvent -> { - stream.write(133) - writeValue(stream, value.raw) - } - is DetailModelEvent -> { - stream.write(134) - writeValue(stream, value.raw) - } - is LoginModelEvent -> { - stream.write(135) - writeValue(stream, value.raw) - } - is Snippet -> { - stream.write(136) - writeValue(stream, value.toList()) - } - is SnippetCode -> { - stream.write(137) - writeValue(stream, value.toList()) - } - is SyntaxToken -> { - stream.write(138) - writeValue(stream, value.toList()) - } - is SnippetLanguage -> { - stream.write(139) - writeValue(stream, value.toList()) - } - is Owner -> { - stream.write(140) - writeValue(stream, value.toList()) - } - is SnippetFilter -> { - stream.write(141) - writeValue(stream, value.toList()) - } - is MainModelStateData -> { - stream.write(142) - writeValue(stream, value.toList()) - } - is MainModelEventData -> { - stream.write(143) - writeValue(stream, value.toList()) - } - is DetailModelStateData -> { - stream.write(144) - writeValue(stream, value.toList()) - } - is DetailModelEventData -> { - stream.write(145) - writeValue(stream, value.toList()) - } - is LoginModelStateData -> { - stream.write(146) - writeValue(stream, value.toList()) - } - is LoginModelEventData -> { - stream.write(147) - writeValue(stream, value.toList()) - } - else -> super.writeValue(stream, value) - } - } -} - -/** Generated interface from Pigeon that represents a handler of messages from Flutter. */ -interface MainModelBridge { - fun getState(): MainModelStateData - fun getEvent(): MainModelEventData - fun resetEvent() - fun initState() - fun filterLanguage(language: String, isSelected: Boolean) - fun filterScope(scope: String) - fun logOut() - - companion object { - /** The codec used by MainModelBridge. */ - val codec: MessageCodec by lazy { - ModelPluginPigeonCodec() - } - /** Sets up an instance of `MainModelBridge` to handle messages through the `binaryMessenger`. */ - @JvmOverloads - fun setUp(binaryMessenger: BinaryMessenger, api: MainModelBridge?, messageChannelSuffix: String = "") { - val separatedMessageChannelSuffix = if (messageChannelSuffix.isNotEmpty()) ".$messageChannelSuffix" else "" - val taskQueue = binaryMessenger.makeBackgroundTaskQueue() - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.MainModelBridge.getState$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - listOf(api.getState()) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.MainModelBridge.getEvent$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - listOf(api.getEvent()) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.MainModelBridge.resetEvent$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.resetEvent() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.MainModelBridge.initState$separatedMessageChannelSuffix", codec, taskQueue) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.initState() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.MainModelBridge.filterLanguage$separatedMessageChannelSuffix", codec, taskQueue) - if (api != null) { - channel.setMessageHandler { message, reply -> - val args = message as List - val languageArg = args[0] as String - val isSelectedArg = args[1] as Boolean - val wrapped: List = try { - api.filterLanguage(languageArg, isSelectedArg) - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.MainModelBridge.filterScope$separatedMessageChannelSuffix", codec, taskQueue) - if (api != null) { - channel.setMessageHandler { message, reply -> - val args = message as List - val scopeArg = args[0] as String - val wrapped: List = try { - api.filterScope(scopeArg) - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.MainModelBridge.logOut$separatedMessageChannelSuffix", codec, taskQueue) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.logOut() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - } - } -} -/** Generated interface from Pigeon that represents a handler of messages from Flutter. */ -interface DetailModelBridge { - fun getState(): DetailModelStateData - fun getEvent(): DetailModelEventData - fun resetEvent() - fun load(uuid: String) - fun like() - fun dislike() - fun save() - fun copyToClipboard() - fun share() - fun delete() - - companion object { - /** The codec used by DetailModelBridge. */ - val codec: MessageCodec by lazy { - ModelPluginPigeonCodec() - } - /** Sets up an instance of `DetailModelBridge` to handle messages through the `binaryMessenger`. */ - @JvmOverloads - fun setUp(binaryMessenger: BinaryMessenger, api: DetailModelBridge?, messageChannelSuffix: String = "") { - val separatedMessageChannelSuffix = if (messageChannelSuffix.isNotEmpty()) ".$messageChannelSuffix" else "" - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.getState$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - listOf(api.getState()) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.getEvent$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - listOf(api.getEvent()) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.resetEvent$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.resetEvent() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.load$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { message, reply -> - val args = message as List - val uuidArg = args[0] as String - val wrapped: List = try { - api.load(uuidArg) - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.like$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.like() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.dislike$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.dislike() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.save$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.save() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.copyToClipboard$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.copyToClipboard() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.share$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.share() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.delete$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.delete() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - } - } -} -/** Generated interface from Pigeon that represents a handler of messages from Flutter. */ -interface LoginModelBridge { - fun getState(): LoginModelStateData - fun getEvent(): LoginModelEventData - fun loginOrRegister(email: String, password: String) - fun checkLoginState() - fun resetEvent() - - companion object { - /** The codec used by LoginModelBridge. */ - val codec: MessageCodec by lazy { - ModelPluginPigeonCodec() - } - /** Sets up an instance of `LoginModelBridge` to handle messages through the `binaryMessenger`. */ - @JvmOverloads - fun setUp(binaryMessenger: BinaryMessenger, api: LoginModelBridge?, messageChannelSuffix: String = "") { - val separatedMessageChannelSuffix = if (messageChannelSuffix.isNotEmpty()) ".$messageChannelSuffix" else "" - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.LoginModelBridge.getState$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - listOf(api.getState()) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.LoginModelBridge.getEvent$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - listOf(api.getEvent()) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.LoginModelBridge.loginOrRegister$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { message, reply -> - val args = message as List - val emailArg = args[0] as String - val passwordArg = args[1] as String - val wrapped: List = try { - api.loginOrRegister(emailArg, passwordArg) - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.LoginModelBridge.checkLoginState$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.checkLoginState() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.LoginModelBridge.resetEvent$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.resetEvent() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - } - } -} diff --git a/flutter_module/android/src/main/kotlin/dev/snipme/bridge/ModelPlugin.g.kt b/flutter_module/android/src/main/kotlin/dev/snipme/bridge/ModelPlugin.g.kt deleted file mode 100644 index 7d7e55e..0000000 --- a/flutter_module/android/src/main/kotlin/dev/snipme/bridge/ModelPlugin.g.kt +++ /dev/null @@ -1,1125 +0,0 @@ -// Autogenerated from Pigeon (v24.2.0), do not edit directly. -// See also: https://pub.dev/packages/pigeon -@file:Suppress("UNCHECKED_CAST", "ArrayInDataClass") - -package dev.snipme.snipmeapp.bridge - -import android.util.Log -import io.flutter.plugin.common.BasicMessageChannel -import io.flutter.plugin.common.BinaryMessenger -import io.flutter.plugin.common.EventChannel -import io.flutter.plugin.common.MessageCodec -import io.flutter.plugin.common.StandardMethodCodec -import io.flutter.plugin.common.StandardMessageCodec -import java.io.ByteArrayOutputStream -import java.nio.ByteBuffer - -private fun wrapResult(result: Any?): List { - return listOf(result) -} - -private fun wrapError(exception: Throwable): List { - return if (exception is FlutterError) { - listOf( - exception.code, - exception.message, - exception.details - ) - } else { - listOf( - exception.javaClass.simpleName, - exception.toString(), - "Cause: " + exception.cause + ", Stacktrace: " + Log.getStackTraceString(exception) - ) - } -} - -/** - * Error class for passing custom error details to Flutter via a thrown PlatformException. - * @property code The error code. - * @property message The error message. - * @property details The error details. Must be a datatype supported by the api codec. - */ -class FlutterError ( - val code: String, - override val message: String? = null, - val details: Any? = null -) : Throwable() - -enum class SnippetLanguageType(val raw: Int) { - C(0), - CPP(1), - OBJECTIVE_C(2), - C_SHARP(3), - JAVA(4), - BASH(5), - PYTHON(6), - PERL(7), - RUBY(8), - SWIFT(9), - JAVASCRIPT(10), - KOTLIN(11), - COFFEESCRIPT(12), - RUST(13), - BASIC(14), - CLOJURE(15), - CSS(16), - DART(17), - ERLANG(18), - GO(19), - HASKELL(20), - LISP(21), - LLVM(22), - LUA(23), - MATLAB(24), - ML(25), - MUMPS(26), - NEMERLE(27), - PASCAL(28), - R(29), - RD(30), - SCALA(31), - SQL(32), - TEX(33), - VB(34), - VHDL(35), - TCL(36), - XQUERY(37), - YAML(38), - MARKDOWN(39), - JSON(40), - XML(41), - PROTO(42), - REGEX(43), - UNKNOWN(44); - - companion object { - fun ofRaw(raw: Int): SnippetLanguageType? { - return values().firstOrNull { it.raw == raw } - } - } -} - -enum class SnippetFilterType(val raw: Int) { - ALL(0), - MINE(1), - SHARED(2); - - companion object { - fun ofRaw(raw: Int): SnippetFilterType? { - return values().firstOrNull { it.raw == raw } - } - } -} - -enum class UserReaction(val raw: Int) { - NONE(0), - LIKE(1), - DISLIKE(2); - - companion object { - fun ofRaw(raw: Int): UserReaction? { - return values().firstOrNull { it.raw == raw } - } - } -} - -enum class ModelState(val raw: Int) { - LOADING(0), - LOADED(1), - ERROR(2); - - companion object { - fun ofRaw(raw: Int): ModelState? { - return values().firstOrNull { it.raw == raw } - } - } -} - -enum class MainModelEvent(val raw: Int) { - NONE(0), - ALERT(1), - LOGOUT(2); - - companion object { - fun ofRaw(raw: Int): MainModelEvent? { - return values().firstOrNull { it.raw == raw } - } - } -} - -enum class DetailModelEvent(val raw: Int) { - NONE(0), - SAVED(1), - DELETED(2); - - companion object { - fun ofRaw(raw: Int): DetailModelEvent? { - return values().firstOrNull { it.raw == raw } - } - } -} - -enum class LoginModelEvent(val raw: Int) { - NONE(0), - LOGGED(1); - - companion object { - fun ofRaw(raw: Int): LoginModelEvent? { - return values().firstOrNull { it.raw == raw } - } - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class Snippet ( - val uuid: String? = null, - val title: String? = null, - val code: SnippetCode? = null, - val language: SnippetLanguage? = null, - val owner: Owner? = null, - val isOwner: Boolean? = null, - val timeAgo: String? = null, - val voteResult: Long? = null, - val userReaction: UserReaction? = null, - val isPrivate: Boolean? = null, - val isLiked: Boolean? = null, - val isDisliked: Boolean? = null, - val isSaved: Boolean? = null, - val isToDelete: Boolean? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): Snippet { - val uuid = pigeonVar_list[0] as String? - val title = pigeonVar_list[1] as String? - val code = pigeonVar_list[2] as SnippetCode? - val language = pigeonVar_list[3] as SnippetLanguage? - val owner = pigeonVar_list[4] as Owner? - val isOwner = pigeonVar_list[5] as Boolean? - val timeAgo = pigeonVar_list[6] as String? - val voteResult = pigeonVar_list[7] as Long? - val userReaction = pigeonVar_list[8] as UserReaction? - val isPrivate = pigeonVar_list[9] as Boolean? - val isLiked = pigeonVar_list[10] as Boolean? - val isDisliked = pigeonVar_list[11] as Boolean? - val isSaved = pigeonVar_list[12] as Boolean? - val isToDelete = pigeonVar_list[13] as Boolean? - return Snippet(uuid, title, code, language, owner, isOwner, timeAgo, voteResult, userReaction, isPrivate, isLiked, isDisliked, isSaved, isToDelete) - } - } - fun toList(): List { - return listOf( - uuid, - title, - code, - language, - owner, - isOwner, - timeAgo, - voteResult, - userReaction, - isPrivate, - isLiked, - isDisliked, - isSaved, - isToDelete, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class SnippetCode ( - val raw: String? = null, - val tokens: List? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): SnippetCode { - val raw = pigeonVar_list[0] as String? - val tokens = pigeonVar_list[1] as List? - return SnippetCode(raw, tokens) - } - } - fun toList(): List { - return listOf( - raw, - tokens, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class SyntaxToken ( - val start: Long? = null, - val end: Long? = null, - val color: Long? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): SyntaxToken { - val start = pigeonVar_list[0] as Long? - val end = pigeonVar_list[1] as Long? - val color = pigeonVar_list[2] as Long? - return SyntaxToken(start, end, color) - } - } - fun toList(): List { - return listOf( - start, - end, - color, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class SnippetLanguage ( - val raw: String? = null, - val type: SnippetLanguageType? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): SnippetLanguage { - val raw = pigeonVar_list[0] as String? - val type = pigeonVar_list[1] as SnippetLanguageType? - return SnippetLanguage(raw, type) - } - } - fun toList(): List { - return listOf( - raw, - type, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class Owner ( - val id: Long? = null, - val login: String? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): Owner { - val id = pigeonVar_list[0] as Long? - val login = pigeonVar_list[1] as String? - return Owner(id, login) - } - } - fun toList(): List { - return listOf( - id, - login, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class SnippetFilter ( - val languages: List? = null, - val selectedLanguages: List? = null, - val scopes: List? = null, - val selectedScope: String? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): SnippetFilter { - val languages = pigeonVar_list[0] as List? - val selectedLanguages = pigeonVar_list[1] as List? - val scopes = pigeonVar_list[2] as List? - val selectedScope = pigeonVar_list[3] as String? - return SnippetFilter(languages, selectedLanguages, scopes, selectedScope) - } - } - fun toList(): List { - return listOf( - languages, - selectedLanguages, - scopes, - selectedScope, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class MainModelStateData ( - val state: ModelState? = null, - val isLoading: Boolean? = null, - val data: List? = null, - val filter: SnippetFilter? = null, - val error: String? = null, - val oldHash: Long? = null, - val newHash: Long? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): MainModelStateData { - val state = pigeonVar_list[0] as ModelState? - val isLoading = pigeonVar_list[1] as Boolean? - val data = pigeonVar_list[2] as List? - val filter = pigeonVar_list[3] as SnippetFilter? - val error = pigeonVar_list[4] as String? - val oldHash = pigeonVar_list[5] as Long? - val newHash = pigeonVar_list[6] as Long? - return MainModelStateData(state, isLoading, data, filter, error, oldHash, newHash) - } - } - fun toList(): List { - return listOf( - state, - isLoading, - data, - filter, - error, - oldHash, - newHash, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class MainModelEventData ( - val event: MainModelEvent? = null, - val message: String? = null, - val oldHash: Long? = null, - val newHash: Long? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): MainModelEventData { - val event = pigeonVar_list[0] as MainModelEvent? - val message = pigeonVar_list[1] as String? - val oldHash = pigeonVar_list[2] as Long? - val newHash = pigeonVar_list[3] as Long? - return MainModelEventData(event, message, oldHash, newHash) - } - } - fun toList(): List { - return listOf( - event, - message, - oldHash, - newHash, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class DetailModelStateData ( - val state: ModelState? = null, - val isLoading: Boolean? = null, - val data: Snippet? = null, - val error: String? = null, - val oldHash: Long? = null, - val newHash: Long? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): DetailModelStateData { - val state = pigeonVar_list[0] as ModelState? - val isLoading = pigeonVar_list[1] as Boolean? - val data = pigeonVar_list[2] as Snippet? - val error = pigeonVar_list[3] as String? - val oldHash = pigeonVar_list[4] as Long? - val newHash = pigeonVar_list[5] as Long? - return DetailModelStateData(state, isLoading, data, error, oldHash, newHash) - } - } - fun toList(): List { - return listOf( - state, - isLoading, - data, - error, - oldHash, - newHash, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class DetailModelEventData ( - val event: DetailModelEvent? = null, - val value: String? = null, - val oldHash: Long? = null, - val newHash: Long? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): DetailModelEventData { - val event = pigeonVar_list[0] as DetailModelEvent? - val value = pigeonVar_list[1] as String? - val oldHash = pigeonVar_list[2] as Long? - val newHash = pigeonVar_list[3] as Long? - return DetailModelEventData(event, value, oldHash, newHash) - } - } - fun toList(): List { - return listOf( - event, - value, - oldHash, - newHash, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class LoginModelStateData ( - val state: ModelState? = null, - val isLoading: Boolean? = null, - val oldHash: Long? = null, - val newHash: Long? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): LoginModelStateData { - val state = pigeonVar_list[0] as ModelState? - val isLoading = pigeonVar_list[1] as Boolean? - val oldHash = pigeonVar_list[2] as Long? - val newHash = pigeonVar_list[3] as Long? - return LoginModelStateData(state, isLoading, oldHash, newHash) - } - } - fun toList(): List { - return listOf( - state, - isLoading, - oldHash, - newHash, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class LoginModelEventData ( - val event: LoginModelEvent? = null, - val oldHash: Long? = null, - val newHash: Long? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): LoginModelEventData { - val event = pigeonVar_list[0] as LoginModelEvent? - val oldHash = pigeonVar_list[1] as Long? - val newHash = pigeonVar_list[2] as Long? - return LoginModelEventData(event, oldHash, newHash) - } - } - fun toList(): List { - return listOf( - event, - oldHash, - newHash, - ) - } -} -private open class ModelPluginPigeonCodec : StandardMessageCodec() { - override fun readValueOfType(type: Byte, buffer: ByteBuffer): Any? { - return when (type) { - 129.toByte() -> { - return (readValue(buffer) as Long?)?.let { - SnippetLanguageType.ofRaw(it.toInt()) - } - } - 130.toByte() -> { - return (readValue(buffer) as Long?)?.let { - SnippetFilterType.ofRaw(it.toInt()) - } - } - 131.toByte() -> { - return (readValue(buffer) as Long?)?.let { - UserReaction.ofRaw(it.toInt()) - } - } - 132.toByte() -> { - return (readValue(buffer) as Long?)?.let { - ModelState.ofRaw(it.toInt()) - } - } - 133.toByte() -> { - return (readValue(buffer) as Long?)?.let { - MainModelEvent.ofRaw(it.toInt()) - } - } - 134.toByte() -> { - return (readValue(buffer) as Long?)?.let { - DetailModelEvent.ofRaw(it.toInt()) - } - } - 135.toByte() -> { - return (readValue(buffer) as Long?)?.let { - LoginModelEvent.ofRaw(it.toInt()) - } - } - 136.toByte() -> { - return (readValue(buffer) as? List)?.let { - Snippet.fromList(it) - } - } - 137.toByte() -> { - return (readValue(buffer) as? List)?.let { - SnippetCode.fromList(it) - } - } - 138.toByte() -> { - return (readValue(buffer) as? List)?.let { - SyntaxToken.fromList(it) - } - } - 139.toByte() -> { - return (readValue(buffer) as? List)?.let { - SnippetLanguage.fromList(it) - } - } - 140.toByte() -> { - return (readValue(buffer) as? List)?.let { - Owner.fromList(it) - } - } - 141.toByte() -> { - return (readValue(buffer) as? List)?.let { - SnippetFilter.fromList(it) - } - } - 142.toByte() -> { - return (readValue(buffer) as? List)?.let { - MainModelStateData.fromList(it) - } - } - 143.toByte() -> { - return (readValue(buffer) as? List)?.let { - MainModelEventData.fromList(it) - } - } - 144.toByte() -> { - return (readValue(buffer) as? List)?.let { - DetailModelStateData.fromList(it) - } - } - 145.toByte() -> { - return (readValue(buffer) as? List)?.let { - DetailModelEventData.fromList(it) - } - } - 146.toByte() -> { - return (readValue(buffer) as? List)?.let { - LoginModelStateData.fromList(it) - } - } - 147.toByte() -> { - return (readValue(buffer) as? List)?.let { - LoginModelEventData.fromList(it) - } - } - else -> super.readValueOfType(type, buffer) - } - } - override fun writeValue(stream: ByteArrayOutputStream, value: Any?) { - when (value) { - is SnippetLanguageType -> { - stream.write(129) - writeValue(stream, value.raw) - } - is SnippetFilterType -> { - stream.write(130) - writeValue(stream, value.raw) - } - is UserReaction -> { - stream.write(131) - writeValue(stream, value.raw) - } - is ModelState -> { - stream.write(132) - writeValue(stream, value.raw) - } - is MainModelEvent -> { - stream.write(133) - writeValue(stream, value.raw) - } - is DetailModelEvent -> { - stream.write(134) - writeValue(stream, value.raw) - } - is LoginModelEvent -> { - stream.write(135) - writeValue(stream, value.raw) - } - is Snippet -> { - stream.write(136) - writeValue(stream, value.toList()) - } - is SnippetCode -> { - stream.write(137) - writeValue(stream, value.toList()) - } - is SyntaxToken -> { - stream.write(138) - writeValue(stream, value.toList()) - } - is SnippetLanguage -> { - stream.write(139) - writeValue(stream, value.toList()) - } - is Owner -> { - stream.write(140) - writeValue(stream, value.toList()) - } - is SnippetFilter -> { - stream.write(141) - writeValue(stream, value.toList()) - } - is MainModelStateData -> { - stream.write(142) - writeValue(stream, value.toList()) - } - is MainModelEventData -> { - stream.write(143) - writeValue(stream, value.toList()) - } - is DetailModelStateData -> { - stream.write(144) - writeValue(stream, value.toList()) - } - is DetailModelEventData -> { - stream.write(145) - writeValue(stream, value.toList()) - } - is LoginModelStateData -> { - stream.write(146) - writeValue(stream, value.toList()) - } - is LoginModelEventData -> { - stream.write(147) - writeValue(stream, value.toList()) - } - else -> super.writeValue(stream, value) - } - } -} - -/** Generated interface from Pigeon that represents a handler of messages from Flutter. */ -interface MainModelBridge { - fun getState(): MainModelStateData - fun getEvent(): MainModelEventData - fun resetEvent() - fun initState() - fun filterLanguage(language: String, isSelected: Boolean) - fun filterScope(scope: String) - fun logOut() - - companion object { - /** The codec used by MainModelBridge. */ - val codec: MessageCodec by lazy { - ModelPluginPigeonCodec() - } - /** Sets up an instance of `MainModelBridge` to handle messages through the `binaryMessenger`. */ - @JvmOverloads - fun setUp(binaryMessenger: BinaryMessenger, api: MainModelBridge?, messageChannelSuffix: String = "") { - val separatedMessageChannelSuffix = if (messageChannelSuffix.isNotEmpty()) ".$messageChannelSuffix" else "" - val taskQueue = binaryMessenger.makeBackgroundTaskQueue() - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.MainModelBridge.getState$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - listOf(api.getState()) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.MainModelBridge.getEvent$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - listOf(api.getEvent()) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.MainModelBridge.resetEvent$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.resetEvent() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.MainModelBridge.initState$separatedMessageChannelSuffix", codec, taskQueue) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.initState() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.MainModelBridge.filterLanguage$separatedMessageChannelSuffix", codec, taskQueue) - if (api != null) { - channel.setMessageHandler { message, reply -> - val args = message as List - val languageArg = args[0] as String - val isSelectedArg = args[1] as Boolean - val wrapped: List = try { - api.filterLanguage(languageArg, isSelectedArg) - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.MainModelBridge.filterScope$separatedMessageChannelSuffix", codec, taskQueue) - if (api != null) { - channel.setMessageHandler { message, reply -> - val args = message as List - val scopeArg = args[0] as String - val wrapped: List = try { - api.filterScope(scopeArg) - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.MainModelBridge.logOut$separatedMessageChannelSuffix", codec, taskQueue) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.logOut() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - } - } -} -/** Generated interface from Pigeon that represents a handler of messages from Flutter. */ -interface DetailModelBridge { - fun getState(): DetailModelStateData - fun getEvent(): DetailModelEventData - fun resetEvent() - fun load(uuid: String) - fun like() - fun dislike() - fun save() - fun copyToClipboard() - fun share() - fun delete() - - companion object { - /** The codec used by DetailModelBridge. */ - val codec: MessageCodec by lazy { - ModelPluginPigeonCodec() - } - /** Sets up an instance of `DetailModelBridge` to handle messages through the `binaryMessenger`. */ - @JvmOverloads - fun setUp(binaryMessenger: BinaryMessenger, api: DetailModelBridge?, messageChannelSuffix: String = "") { - val separatedMessageChannelSuffix = if (messageChannelSuffix.isNotEmpty()) ".$messageChannelSuffix" else "" - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.getState$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - listOf(api.getState()) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.getEvent$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - listOf(api.getEvent()) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.resetEvent$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.resetEvent() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.load$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { message, reply -> - val args = message as List - val uuidArg = args[0] as String - val wrapped: List = try { - api.load(uuidArg) - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.like$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.like() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.dislike$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.dislike() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.save$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.save() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.copyToClipboard$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.copyToClipboard() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.share$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.share() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.delete$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.delete() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - } - } -} -/** Generated interface from Pigeon that represents a handler of messages from Flutter. */ -interface LoginModelBridge { - fun getState(): LoginModelStateData - fun getEvent(): LoginModelEventData - fun loginOrRegister(email: String, password: String) - fun checkLoginState() - fun resetEvent() - - companion object { - /** The codec used by LoginModelBridge. */ - val codec: MessageCodec by lazy { - ModelPluginPigeonCodec() - } - /** Sets up an instance of `LoginModelBridge` to handle messages through the `binaryMessenger`. */ - @JvmOverloads - fun setUp(binaryMessenger: BinaryMessenger, api: LoginModelBridge?, messageChannelSuffix: String = "") { - val separatedMessageChannelSuffix = if (messageChannelSuffix.isNotEmpty()) ".$messageChannelSuffix" else "" - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.LoginModelBridge.getState$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - listOf(api.getState()) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.LoginModelBridge.getEvent$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - listOf(api.getEvent()) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.LoginModelBridge.loginOrRegister$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { message, reply -> - val args = message as List - val emailArg = args[0] as String - val passwordArg = args[1] as String - val wrapped: List = try { - api.loginOrRegister(emailArg, passwordArg) - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.LoginModelBridge.checkLoginState$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.checkLoginState() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.LoginModelBridge.resetEvent$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.resetEvent() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - } - } -} diff --git a/flutter_module/android/src/main/kotlin/dev/snipme/snipmeapp/bridge/ModelPlugin.g.kt b/flutter_module/android/src/main/kotlin/dev/snipme/snipmeapp/bridge/ModelPlugin.g.kt deleted file mode 100644 index 7d7e55e..0000000 --- a/flutter_module/android/src/main/kotlin/dev/snipme/snipmeapp/bridge/ModelPlugin.g.kt +++ /dev/null @@ -1,1125 +0,0 @@ -// Autogenerated from Pigeon (v24.2.0), do not edit directly. -// See also: https://pub.dev/packages/pigeon -@file:Suppress("UNCHECKED_CAST", "ArrayInDataClass") - -package dev.snipme.snipmeapp.bridge - -import android.util.Log -import io.flutter.plugin.common.BasicMessageChannel -import io.flutter.plugin.common.BinaryMessenger -import io.flutter.plugin.common.EventChannel -import io.flutter.plugin.common.MessageCodec -import io.flutter.plugin.common.StandardMethodCodec -import io.flutter.plugin.common.StandardMessageCodec -import java.io.ByteArrayOutputStream -import java.nio.ByteBuffer - -private fun wrapResult(result: Any?): List { - return listOf(result) -} - -private fun wrapError(exception: Throwable): List { - return if (exception is FlutterError) { - listOf( - exception.code, - exception.message, - exception.details - ) - } else { - listOf( - exception.javaClass.simpleName, - exception.toString(), - "Cause: " + exception.cause + ", Stacktrace: " + Log.getStackTraceString(exception) - ) - } -} - -/** - * Error class for passing custom error details to Flutter via a thrown PlatformException. - * @property code The error code. - * @property message The error message. - * @property details The error details. Must be a datatype supported by the api codec. - */ -class FlutterError ( - val code: String, - override val message: String? = null, - val details: Any? = null -) : Throwable() - -enum class SnippetLanguageType(val raw: Int) { - C(0), - CPP(1), - OBJECTIVE_C(2), - C_SHARP(3), - JAVA(4), - BASH(5), - PYTHON(6), - PERL(7), - RUBY(8), - SWIFT(9), - JAVASCRIPT(10), - KOTLIN(11), - COFFEESCRIPT(12), - RUST(13), - BASIC(14), - CLOJURE(15), - CSS(16), - DART(17), - ERLANG(18), - GO(19), - HASKELL(20), - LISP(21), - LLVM(22), - LUA(23), - MATLAB(24), - ML(25), - MUMPS(26), - NEMERLE(27), - PASCAL(28), - R(29), - RD(30), - SCALA(31), - SQL(32), - TEX(33), - VB(34), - VHDL(35), - TCL(36), - XQUERY(37), - YAML(38), - MARKDOWN(39), - JSON(40), - XML(41), - PROTO(42), - REGEX(43), - UNKNOWN(44); - - companion object { - fun ofRaw(raw: Int): SnippetLanguageType? { - return values().firstOrNull { it.raw == raw } - } - } -} - -enum class SnippetFilterType(val raw: Int) { - ALL(0), - MINE(1), - SHARED(2); - - companion object { - fun ofRaw(raw: Int): SnippetFilterType? { - return values().firstOrNull { it.raw == raw } - } - } -} - -enum class UserReaction(val raw: Int) { - NONE(0), - LIKE(1), - DISLIKE(2); - - companion object { - fun ofRaw(raw: Int): UserReaction? { - return values().firstOrNull { it.raw == raw } - } - } -} - -enum class ModelState(val raw: Int) { - LOADING(0), - LOADED(1), - ERROR(2); - - companion object { - fun ofRaw(raw: Int): ModelState? { - return values().firstOrNull { it.raw == raw } - } - } -} - -enum class MainModelEvent(val raw: Int) { - NONE(0), - ALERT(1), - LOGOUT(2); - - companion object { - fun ofRaw(raw: Int): MainModelEvent? { - return values().firstOrNull { it.raw == raw } - } - } -} - -enum class DetailModelEvent(val raw: Int) { - NONE(0), - SAVED(1), - DELETED(2); - - companion object { - fun ofRaw(raw: Int): DetailModelEvent? { - return values().firstOrNull { it.raw == raw } - } - } -} - -enum class LoginModelEvent(val raw: Int) { - NONE(0), - LOGGED(1); - - companion object { - fun ofRaw(raw: Int): LoginModelEvent? { - return values().firstOrNull { it.raw == raw } - } - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class Snippet ( - val uuid: String? = null, - val title: String? = null, - val code: SnippetCode? = null, - val language: SnippetLanguage? = null, - val owner: Owner? = null, - val isOwner: Boolean? = null, - val timeAgo: String? = null, - val voteResult: Long? = null, - val userReaction: UserReaction? = null, - val isPrivate: Boolean? = null, - val isLiked: Boolean? = null, - val isDisliked: Boolean? = null, - val isSaved: Boolean? = null, - val isToDelete: Boolean? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): Snippet { - val uuid = pigeonVar_list[0] as String? - val title = pigeonVar_list[1] as String? - val code = pigeonVar_list[2] as SnippetCode? - val language = pigeonVar_list[3] as SnippetLanguage? - val owner = pigeonVar_list[4] as Owner? - val isOwner = pigeonVar_list[5] as Boolean? - val timeAgo = pigeonVar_list[6] as String? - val voteResult = pigeonVar_list[7] as Long? - val userReaction = pigeonVar_list[8] as UserReaction? - val isPrivate = pigeonVar_list[9] as Boolean? - val isLiked = pigeonVar_list[10] as Boolean? - val isDisliked = pigeonVar_list[11] as Boolean? - val isSaved = pigeonVar_list[12] as Boolean? - val isToDelete = pigeonVar_list[13] as Boolean? - return Snippet(uuid, title, code, language, owner, isOwner, timeAgo, voteResult, userReaction, isPrivate, isLiked, isDisliked, isSaved, isToDelete) - } - } - fun toList(): List { - return listOf( - uuid, - title, - code, - language, - owner, - isOwner, - timeAgo, - voteResult, - userReaction, - isPrivate, - isLiked, - isDisliked, - isSaved, - isToDelete, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class SnippetCode ( - val raw: String? = null, - val tokens: List? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): SnippetCode { - val raw = pigeonVar_list[0] as String? - val tokens = pigeonVar_list[1] as List? - return SnippetCode(raw, tokens) - } - } - fun toList(): List { - return listOf( - raw, - tokens, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class SyntaxToken ( - val start: Long? = null, - val end: Long? = null, - val color: Long? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): SyntaxToken { - val start = pigeonVar_list[0] as Long? - val end = pigeonVar_list[1] as Long? - val color = pigeonVar_list[2] as Long? - return SyntaxToken(start, end, color) - } - } - fun toList(): List { - return listOf( - start, - end, - color, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class SnippetLanguage ( - val raw: String? = null, - val type: SnippetLanguageType? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): SnippetLanguage { - val raw = pigeonVar_list[0] as String? - val type = pigeonVar_list[1] as SnippetLanguageType? - return SnippetLanguage(raw, type) - } - } - fun toList(): List { - return listOf( - raw, - type, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class Owner ( - val id: Long? = null, - val login: String? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): Owner { - val id = pigeonVar_list[0] as Long? - val login = pigeonVar_list[1] as String? - return Owner(id, login) - } - } - fun toList(): List { - return listOf( - id, - login, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class SnippetFilter ( - val languages: List? = null, - val selectedLanguages: List? = null, - val scopes: List? = null, - val selectedScope: String? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): SnippetFilter { - val languages = pigeonVar_list[0] as List? - val selectedLanguages = pigeonVar_list[1] as List? - val scopes = pigeonVar_list[2] as List? - val selectedScope = pigeonVar_list[3] as String? - return SnippetFilter(languages, selectedLanguages, scopes, selectedScope) - } - } - fun toList(): List { - return listOf( - languages, - selectedLanguages, - scopes, - selectedScope, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class MainModelStateData ( - val state: ModelState? = null, - val isLoading: Boolean? = null, - val data: List? = null, - val filter: SnippetFilter? = null, - val error: String? = null, - val oldHash: Long? = null, - val newHash: Long? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): MainModelStateData { - val state = pigeonVar_list[0] as ModelState? - val isLoading = pigeonVar_list[1] as Boolean? - val data = pigeonVar_list[2] as List? - val filter = pigeonVar_list[3] as SnippetFilter? - val error = pigeonVar_list[4] as String? - val oldHash = pigeonVar_list[5] as Long? - val newHash = pigeonVar_list[6] as Long? - return MainModelStateData(state, isLoading, data, filter, error, oldHash, newHash) - } - } - fun toList(): List { - return listOf( - state, - isLoading, - data, - filter, - error, - oldHash, - newHash, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class MainModelEventData ( - val event: MainModelEvent? = null, - val message: String? = null, - val oldHash: Long? = null, - val newHash: Long? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): MainModelEventData { - val event = pigeonVar_list[0] as MainModelEvent? - val message = pigeonVar_list[1] as String? - val oldHash = pigeonVar_list[2] as Long? - val newHash = pigeonVar_list[3] as Long? - return MainModelEventData(event, message, oldHash, newHash) - } - } - fun toList(): List { - return listOf( - event, - message, - oldHash, - newHash, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class DetailModelStateData ( - val state: ModelState? = null, - val isLoading: Boolean? = null, - val data: Snippet? = null, - val error: String? = null, - val oldHash: Long? = null, - val newHash: Long? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): DetailModelStateData { - val state = pigeonVar_list[0] as ModelState? - val isLoading = pigeonVar_list[1] as Boolean? - val data = pigeonVar_list[2] as Snippet? - val error = pigeonVar_list[3] as String? - val oldHash = pigeonVar_list[4] as Long? - val newHash = pigeonVar_list[5] as Long? - return DetailModelStateData(state, isLoading, data, error, oldHash, newHash) - } - } - fun toList(): List { - return listOf( - state, - isLoading, - data, - error, - oldHash, - newHash, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class DetailModelEventData ( - val event: DetailModelEvent? = null, - val value: String? = null, - val oldHash: Long? = null, - val newHash: Long? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): DetailModelEventData { - val event = pigeonVar_list[0] as DetailModelEvent? - val value = pigeonVar_list[1] as String? - val oldHash = pigeonVar_list[2] as Long? - val newHash = pigeonVar_list[3] as Long? - return DetailModelEventData(event, value, oldHash, newHash) - } - } - fun toList(): List { - return listOf( - event, - value, - oldHash, - newHash, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class LoginModelStateData ( - val state: ModelState? = null, - val isLoading: Boolean? = null, - val oldHash: Long? = null, - val newHash: Long? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): LoginModelStateData { - val state = pigeonVar_list[0] as ModelState? - val isLoading = pigeonVar_list[1] as Boolean? - val oldHash = pigeonVar_list[2] as Long? - val newHash = pigeonVar_list[3] as Long? - return LoginModelStateData(state, isLoading, oldHash, newHash) - } - } - fun toList(): List { - return listOf( - state, - isLoading, - oldHash, - newHash, - ) - } -} - -/** Generated class from Pigeon that represents data sent in messages. */ -data class LoginModelEventData ( - val event: LoginModelEvent? = null, - val oldHash: Long? = null, - val newHash: Long? = null -) - { - companion object { - fun fromList(pigeonVar_list: List): LoginModelEventData { - val event = pigeonVar_list[0] as LoginModelEvent? - val oldHash = pigeonVar_list[1] as Long? - val newHash = pigeonVar_list[2] as Long? - return LoginModelEventData(event, oldHash, newHash) - } - } - fun toList(): List { - return listOf( - event, - oldHash, - newHash, - ) - } -} -private open class ModelPluginPigeonCodec : StandardMessageCodec() { - override fun readValueOfType(type: Byte, buffer: ByteBuffer): Any? { - return when (type) { - 129.toByte() -> { - return (readValue(buffer) as Long?)?.let { - SnippetLanguageType.ofRaw(it.toInt()) - } - } - 130.toByte() -> { - return (readValue(buffer) as Long?)?.let { - SnippetFilterType.ofRaw(it.toInt()) - } - } - 131.toByte() -> { - return (readValue(buffer) as Long?)?.let { - UserReaction.ofRaw(it.toInt()) - } - } - 132.toByte() -> { - return (readValue(buffer) as Long?)?.let { - ModelState.ofRaw(it.toInt()) - } - } - 133.toByte() -> { - return (readValue(buffer) as Long?)?.let { - MainModelEvent.ofRaw(it.toInt()) - } - } - 134.toByte() -> { - return (readValue(buffer) as Long?)?.let { - DetailModelEvent.ofRaw(it.toInt()) - } - } - 135.toByte() -> { - return (readValue(buffer) as Long?)?.let { - LoginModelEvent.ofRaw(it.toInt()) - } - } - 136.toByte() -> { - return (readValue(buffer) as? List)?.let { - Snippet.fromList(it) - } - } - 137.toByte() -> { - return (readValue(buffer) as? List)?.let { - SnippetCode.fromList(it) - } - } - 138.toByte() -> { - return (readValue(buffer) as? List)?.let { - SyntaxToken.fromList(it) - } - } - 139.toByte() -> { - return (readValue(buffer) as? List)?.let { - SnippetLanguage.fromList(it) - } - } - 140.toByte() -> { - return (readValue(buffer) as? List)?.let { - Owner.fromList(it) - } - } - 141.toByte() -> { - return (readValue(buffer) as? List)?.let { - SnippetFilter.fromList(it) - } - } - 142.toByte() -> { - return (readValue(buffer) as? List)?.let { - MainModelStateData.fromList(it) - } - } - 143.toByte() -> { - return (readValue(buffer) as? List)?.let { - MainModelEventData.fromList(it) - } - } - 144.toByte() -> { - return (readValue(buffer) as? List)?.let { - DetailModelStateData.fromList(it) - } - } - 145.toByte() -> { - return (readValue(buffer) as? List)?.let { - DetailModelEventData.fromList(it) - } - } - 146.toByte() -> { - return (readValue(buffer) as? List)?.let { - LoginModelStateData.fromList(it) - } - } - 147.toByte() -> { - return (readValue(buffer) as? List)?.let { - LoginModelEventData.fromList(it) - } - } - else -> super.readValueOfType(type, buffer) - } - } - override fun writeValue(stream: ByteArrayOutputStream, value: Any?) { - when (value) { - is SnippetLanguageType -> { - stream.write(129) - writeValue(stream, value.raw) - } - is SnippetFilterType -> { - stream.write(130) - writeValue(stream, value.raw) - } - is UserReaction -> { - stream.write(131) - writeValue(stream, value.raw) - } - is ModelState -> { - stream.write(132) - writeValue(stream, value.raw) - } - is MainModelEvent -> { - stream.write(133) - writeValue(stream, value.raw) - } - is DetailModelEvent -> { - stream.write(134) - writeValue(stream, value.raw) - } - is LoginModelEvent -> { - stream.write(135) - writeValue(stream, value.raw) - } - is Snippet -> { - stream.write(136) - writeValue(stream, value.toList()) - } - is SnippetCode -> { - stream.write(137) - writeValue(stream, value.toList()) - } - is SyntaxToken -> { - stream.write(138) - writeValue(stream, value.toList()) - } - is SnippetLanguage -> { - stream.write(139) - writeValue(stream, value.toList()) - } - is Owner -> { - stream.write(140) - writeValue(stream, value.toList()) - } - is SnippetFilter -> { - stream.write(141) - writeValue(stream, value.toList()) - } - is MainModelStateData -> { - stream.write(142) - writeValue(stream, value.toList()) - } - is MainModelEventData -> { - stream.write(143) - writeValue(stream, value.toList()) - } - is DetailModelStateData -> { - stream.write(144) - writeValue(stream, value.toList()) - } - is DetailModelEventData -> { - stream.write(145) - writeValue(stream, value.toList()) - } - is LoginModelStateData -> { - stream.write(146) - writeValue(stream, value.toList()) - } - is LoginModelEventData -> { - stream.write(147) - writeValue(stream, value.toList()) - } - else -> super.writeValue(stream, value) - } - } -} - -/** Generated interface from Pigeon that represents a handler of messages from Flutter. */ -interface MainModelBridge { - fun getState(): MainModelStateData - fun getEvent(): MainModelEventData - fun resetEvent() - fun initState() - fun filterLanguage(language: String, isSelected: Boolean) - fun filterScope(scope: String) - fun logOut() - - companion object { - /** The codec used by MainModelBridge. */ - val codec: MessageCodec by lazy { - ModelPluginPigeonCodec() - } - /** Sets up an instance of `MainModelBridge` to handle messages through the `binaryMessenger`. */ - @JvmOverloads - fun setUp(binaryMessenger: BinaryMessenger, api: MainModelBridge?, messageChannelSuffix: String = "") { - val separatedMessageChannelSuffix = if (messageChannelSuffix.isNotEmpty()) ".$messageChannelSuffix" else "" - val taskQueue = binaryMessenger.makeBackgroundTaskQueue() - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.MainModelBridge.getState$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - listOf(api.getState()) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.MainModelBridge.getEvent$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - listOf(api.getEvent()) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.MainModelBridge.resetEvent$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.resetEvent() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.MainModelBridge.initState$separatedMessageChannelSuffix", codec, taskQueue) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.initState() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.MainModelBridge.filterLanguage$separatedMessageChannelSuffix", codec, taskQueue) - if (api != null) { - channel.setMessageHandler { message, reply -> - val args = message as List - val languageArg = args[0] as String - val isSelectedArg = args[1] as Boolean - val wrapped: List = try { - api.filterLanguage(languageArg, isSelectedArg) - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.MainModelBridge.filterScope$separatedMessageChannelSuffix", codec, taskQueue) - if (api != null) { - channel.setMessageHandler { message, reply -> - val args = message as List - val scopeArg = args[0] as String - val wrapped: List = try { - api.filterScope(scopeArg) - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.MainModelBridge.logOut$separatedMessageChannelSuffix", codec, taskQueue) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.logOut() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - } - } -} -/** Generated interface from Pigeon that represents a handler of messages from Flutter. */ -interface DetailModelBridge { - fun getState(): DetailModelStateData - fun getEvent(): DetailModelEventData - fun resetEvent() - fun load(uuid: String) - fun like() - fun dislike() - fun save() - fun copyToClipboard() - fun share() - fun delete() - - companion object { - /** The codec used by DetailModelBridge. */ - val codec: MessageCodec by lazy { - ModelPluginPigeonCodec() - } - /** Sets up an instance of `DetailModelBridge` to handle messages through the `binaryMessenger`. */ - @JvmOverloads - fun setUp(binaryMessenger: BinaryMessenger, api: DetailModelBridge?, messageChannelSuffix: String = "") { - val separatedMessageChannelSuffix = if (messageChannelSuffix.isNotEmpty()) ".$messageChannelSuffix" else "" - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.getState$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - listOf(api.getState()) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.getEvent$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - listOf(api.getEvent()) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.resetEvent$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.resetEvent() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.load$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { message, reply -> - val args = message as List - val uuidArg = args[0] as String - val wrapped: List = try { - api.load(uuidArg) - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.like$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.like() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.dislike$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.dislike() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.save$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.save() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.copyToClipboard$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.copyToClipboard() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.share$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.share() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.DetailModelBridge.delete$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.delete() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - } - } -} -/** Generated interface from Pigeon that represents a handler of messages from Flutter. */ -interface LoginModelBridge { - fun getState(): LoginModelStateData - fun getEvent(): LoginModelEventData - fun loginOrRegister(email: String, password: String) - fun checkLoginState() - fun resetEvent() - - companion object { - /** The codec used by LoginModelBridge. */ - val codec: MessageCodec by lazy { - ModelPluginPigeonCodec() - } - /** Sets up an instance of `LoginModelBridge` to handle messages through the `binaryMessenger`. */ - @JvmOverloads - fun setUp(binaryMessenger: BinaryMessenger, api: LoginModelBridge?, messageChannelSuffix: String = "") { - val separatedMessageChannelSuffix = if (messageChannelSuffix.isNotEmpty()) ".$messageChannelSuffix" else "" - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.LoginModelBridge.getState$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - listOf(api.getState()) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.LoginModelBridge.getEvent$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - listOf(api.getEvent()) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.LoginModelBridge.loginOrRegister$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { message, reply -> - val args = message as List - val emailArg = args[0] as String - val passwordArg = args[1] as String - val wrapped: List = try { - api.loginOrRegister(emailArg, passwordArg) - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.LoginModelBridge.checkLoginState$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.checkLoginState() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.flutter_module.LoginModelBridge.resetEvent$separatedMessageChannelSuffix", codec) - if (api != null) { - channel.setMessageHandler { _, reply -> - val wrapped: List = try { - api.resetEvent() - listOf(null) - } catch (exception: Throwable) { - wrapError(exception) - } - reply.reply(wrapped) - } - } else { - channel.setMessageHandler(null) - } - } - } - } -} diff --git a/flutter_module/assets/images/icons/reaction_dislike.jpeg b/flutter_module/assets/images/icons/reaction_dislike.jpeg new file mode 100644 index 0000000..dbc7eba Binary files /dev/null and b/flutter_module/assets/images/icons/reaction_dislike.jpeg differ diff --git a/flutter_module/assets/images/icons/reaction_like.jpeg b/flutter_module/assets/images/icons/reaction_like.jpeg new file mode 100644 index 0000000..0876ac0 Binary files /dev/null and b/flutter_module/assets/images/icons/reaction_like.jpeg differ diff --git a/flutter_module/assets/images/icons/reaction_undefined.jpeg b/flutter_module/assets/images/icons/reaction_undefined.jpeg new file mode 100644 index 0000000..cba0036 Binary files /dev/null and b/flutter_module/assets/images/icons/reaction_undefined.jpeg differ diff --git a/flutter_module/channel/contract.dart b/flutter_module/bridge/main_model.dart similarity index 67% rename from flutter_module/channel/contract.dart rename to flutter_module/bridge/main_model.dart index 9449d2a..94515c7 100644 --- a/flutter_module/channel/contract.dart +++ b/flutter_module/bridge/main_model.dart @@ -1,14 +1,6 @@ import 'package:pigeon/pigeon.dart'; -@ConfigurePigeon( - PigeonOptions( - dartOut: 'lib/generated/data_model.g.dart', - // Generate in parent android module - kotlinOut: - '../app/src/main/java/dev/snipme/snipmeapp/channel/DataModel.g.kt', - kotlinOptions: KotlinOptions(package: 'dev.snipme.snipmeapp.channel'), - ), -) +// General class Snippet { String? uuid; @@ -105,63 +97,76 @@ class SnippetFilter { String? selectedScope; } -enum UserReaction { none, like, dislike } +enum UserReaction { + none, + like, + dislike +} + +// State enum ModelState { loading, loaded, error } enum MainModelEvent { none, alert, logout } -enum DetailsModelEvent { none, alert, deleted } +enum DetailModelEvent { none, saved, deleted } enum LoginModelEvent { none, logged } -sealed class ModelStateData {} - -sealed class ModelEventData {} - -class MainModelStateData extends ModelStateData { +class MainModelStateData { ModelState? state; bool? isLoading; List? data; SnippetFilter? filter; String? error; + int? oldHash; + int? newHash; } -class MainModelEventData extends ModelEventData { +class MainModelEventData { MainModelEvent? event; String? message; + int? oldHash; + int? newHash; } -class DetailsModelStateData extends ModelStateData { +class DetailModelStateData { ModelState? state; bool? isLoading; Snippet? data; String? error; + int? oldHash; + int? newHash; } -class DetailsModelEventData extends ModelEventData { - DetailsModelEvent? event; +class DetailModelEventData { + DetailModelEvent? event; String? value; + int? oldHash; + int? newHash; } -class LoginModelStateData extends ModelStateData { +class LoginModelStateData { ModelState? state; bool? isLoading; + int? oldHash; + int? newHash; } -class LoginModelEventData extends ModelEventData { +class LoginModelEventData { LoginModelEvent? event; + int? oldHash; + int? newHash; } -@EventChannelApi() -abstract class ChannelModelEventApi { - ModelStateData channelState(); - - ModelEventData channelEvent(); -} +// Api @HostApi() -abstract class ChannelMainModel { +abstract class MainModelBridge { + MainModelStateData getState(); + + MainModelEventData getEvent(); + void resetEvent(); @TaskQueue(type: TaskQueueType.serialBackgroundThread) @@ -178,27 +183,37 @@ abstract class ChannelMainModel { } @HostApi() -abstract class ChannelDetailsModel { +abstract class DetailModelBridge { + DetailModelStateData getState(); + + DetailModelEventData getEvent(); + void resetEvent(); void load(String uuid); - void toggleFavorite(); + void like(); + + void dislike(); - void saveImage(Uint8List image); + void save(); void copyToClipboard(); - void shareImage(Uint8List image); + void share(); void delete(); } @HostApi() -abstract class ChannelLoginModel { +abstract class LoginModelBridge { + LoginModelStateData getState(); + + LoginModelEventData getEvent(); + void loginOrRegister(String email, String password); void checkLoginState(); void resetEvent(); -} +} \ No newline at end of file diff --git a/flutter_module/lib/generated/assets.dart b/flutter_module/lib/generated/assets.dart index fd8188a..b0ec512 100644 --- a/flutter_module/lib/generated/assets.dart +++ b/flutter_module/lib/generated/assets.dart @@ -3,5 +3,8 @@ class Assets { Assets._(); static const String appLogo = 'assets/images/illustrations/app_logo.png'; + static const String reactionDislike = 'assets/images/icons/reaction_dislike.jpeg'; + static const String reactionLike = 'assets/images/icons/reaction_like.jpeg'; + static const String reactionUndefined = 'assets/images/icons/reaction_undefined.jpeg'; } diff --git a/flutter_module/lib/main.dart b/flutter_module/lib/main.dart index 4eb84e3..0a72b44 100644 --- a/flutter_module/lib/main.dart +++ b/flutter_module/lib/main.dart @@ -1,22 +1,21 @@ import 'package:flutter/material.dart'; -import 'package:flutter_module/generated/data_model.g.dart'; +import 'package:flutter_module/model/main_model.dart'; import 'package:flutter_module/presentation/navigation/details/details_navigator.dart'; import 'package:flutter_module/presentation/navigation/login/login_navigator.dart'; import 'package:flutter_module/presentation/screens//main_screen.dart'; import 'package:flutter_module/presentation/screens/details_screen.dart'; import 'package:flutter_module/presentation/screens/login_screen.dart'; import 'package:flutter_module/utils/extensions/text_extensions.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router_plus/go_router_plus.dart'; -void main() => runApp(ProviderScope(child: MyApp())); +void main() => runApp(MyApp()); class MyApp extends StatelessWidget { MyApp({super.key}); - final loginModel = ChannelLoginModel(); - final mainModel = ChannelMainModel(); - final detailModel = ChannelDetailsModel(); + final loginModel = LoginModelBridge(); + final mainModel = MainModelBridge(); + final detailModel = DetailModelBridge(); @override Widget build(BuildContext context) { diff --git a/flutter_module/lib/generated/data_model.g.dart b/flutter_module/lib/model/main_model.dart similarity index 69% rename from flutter_module/lib/generated/data_model.g.dart rename to flutter_module/lib/model/main_model.dart index 39faa95..587929e 100644 --- a/flutter_module/lib/generated/data_model.g.dart +++ b/flutter_module/lib/model/main_model.dart @@ -1,4 +1,4 @@ -// Autogenerated from Pigeon (v24.2.0), do not edit directly. +// Autogenerated from Pigeon (v22.5.0), do not edit directly. // See also: https://pub.dev/packages/pigeon // ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name, unnecessary_import, no_leading_underscores_for_local_identifiers @@ -87,9 +87,9 @@ enum MainModelEvent { logout, } -enum DetailsModelEvent { +enum DetailModelEvent { none, - alert, + saved, deleted, } @@ -329,19 +329,15 @@ class SnippetFilter { } } -sealed class ModelStateData { -} - -sealed class ModelEventData { -} - -class MainModelStateData extends ModelStateData { +class MainModelStateData { MainModelStateData({ this.state, this.isLoading, this.data, this.filter, this.error, + this.oldHash, + this.newHash, }); ModelState? state; @@ -354,6 +350,10 @@ class MainModelStateData extends ModelStateData { String? error; + int? oldHash; + + int? newHash; + Object encode() { return [ state, @@ -361,6 +361,8 @@ class MainModelStateData extends ModelStateData { data, filter, error, + oldHash, + newHash, ]; } @@ -372,24 +374,34 @@ class MainModelStateData extends ModelStateData { data: (result[2] as List?)?.cast(), filter: result[3] as SnippetFilter?, error: result[4] as String?, + oldHash: result[5] as int?, + newHash: result[6] as int?, ); } } -class MainModelEventData extends ModelEventData { +class MainModelEventData { MainModelEventData({ this.event, this.message, + this.oldHash, + this.newHash, }); MainModelEvent? event; String? message; + int? oldHash; + + int? newHash; + Object encode() { return [ event, message, + oldHash, + newHash, ]; } @@ -398,16 +410,20 @@ class MainModelEventData extends ModelEventData { return MainModelEventData( event: result[0] as MainModelEvent?, message: result[1] as String?, + oldHash: result[2] as int?, + newHash: result[3] as int?, ); } } -class DetailsModelStateData extends ModelStateData { - DetailsModelStateData({ +class DetailModelStateData { + DetailModelStateData({ this.state, this.isLoading, this.data, this.error, + this.oldHash, + this.newHash, }); ModelState? state; @@ -418,66 +434,92 @@ class DetailsModelStateData extends ModelStateData { String? error; + int? oldHash; + + int? newHash; + Object encode() { return [ state, isLoading, data, error, + oldHash, + newHash, ]; } - static DetailsModelStateData decode(Object result) { + static DetailModelStateData decode(Object result) { result as List; - return DetailsModelStateData( + return DetailModelStateData( state: result[0] as ModelState?, isLoading: result[1] as bool?, data: result[2] as Snippet?, error: result[3] as String?, + oldHash: result[4] as int?, + newHash: result[5] as int?, ); } } -class DetailsModelEventData extends ModelEventData { - DetailsModelEventData({ +class DetailModelEventData { + DetailModelEventData({ this.event, this.value, + this.oldHash, + this.newHash, }); - DetailsModelEvent? event; + DetailModelEvent? event; String? value; + int? oldHash; + + int? newHash; + Object encode() { return [ event, value, + oldHash, + newHash, ]; } - static DetailsModelEventData decode(Object result) { + static DetailModelEventData decode(Object result) { result as List; - return DetailsModelEventData( - event: result[0] as DetailsModelEvent?, + return DetailModelEventData( + event: result[0] as DetailModelEvent?, value: result[1] as String?, + oldHash: result[2] as int?, + newHash: result[3] as int?, ); } } -class LoginModelStateData extends ModelStateData { +class LoginModelStateData { LoginModelStateData({ this.state, this.isLoading, + this.oldHash, + this.newHash, }); ModelState? state; bool? isLoading; + int? oldHash; + + int? newHash; + Object encode() { return [ state, isLoading, + oldHash, + newHash, ]; } @@ -486,20 +528,30 @@ class LoginModelStateData extends ModelStateData { return LoginModelStateData( state: result[0] as ModelState?, isLoading: result[1] as bool?, + oldHash: result[2] as int?, + newHash: result[3] as int?, ); } } -class LoginModelEventData extends ModelEventData { +class LoginModelEventData { LoginModelEventData({ this.event, + this.oldHash, + this.newHash, }); LoginModelEvent? event; + int? oldHash; + + int? newHash; + Object encode() { return [ event, + oldHash, + newHash, ]; } @@ -507,6 +559,8 @@ class LoginModelEventData extends ModelEventData { result as List; return LoginModelEventData( event: result[0] as LoginModelEvent?, + oldHash: result[1] as int?, + newHash: result[2] as int?, ); } } @@ -534,7 +588,7 @@ class _PigeonCodec extends StandardMessageCodec { } else if (value is MainModelEvent) { buffer.putUint8(133); writeValue(buffer, value.index); - } else if (value is DetailsModelEvent) { + } else if (value is DetailModelEvent) { buffer.putUint8(134); writeValue(buffer, value.index); } else if (value is LoginModelEvent) { @@ -564,10 +618,10 @@ class _PigeonCodec extends StandardMessageCodec { } else if (value is MainModelEventData) { buffer.putUint8(143); writeValue(buffer, value.encode()); - } else if (value is DetailsModelStateData) { + } else if (value is DetailModelStateData) { buffer.putUint8(144); writeValue(buffer, value.encode()); - } else if (value is DetailsModelEventData) { + } else if (value is DetailModelEventData) { buffer.putUint8(145); writeValue(buffer, value.encode()); } else if (value is LoginModelStateData) { @@ -601,7 +655,7 @@ class _PigeonCodec extends StandardMessageCodec { return value == null ? null : MainModelEvent.values[value]; case 134: final int? value = readValue(buffer) as int?; - return value == null ? null : DetailsModelEvent.values[value]; + return value == null ? null : DetailModelEvent.values[value]; case 135: final int? value = readValue(buffer) as int?; return value == null ? null : LoginModelEvent.values[value]; @@ -622,9 +676,9 @@ class _PigeonCodec extends StandardMessageCodec { case 143: return MainModelEventData.decode(readValue(buffer)!); case 144: - return DetailsModelStateData.decode(readValue(buffer)!); + return DetailModelStateData.decode(readValue(buffer)!); case 145: - return DetailsModelEventData.decode(readValue(buffer)!); + return DetailModelEventData.decode(readValue(buffer)!); case 146: return LoginModelStateData.decode(readValue(buffer)!); case 147: @@ -635,36 +689,11 @@ class _PigeonCodec extends StandardMessageCodec { } } -const StandardMethodCodec pigeonMethodCodec = StandardMethodCodec(_PigeonCodec()); - -Stream channelState( {String instanceName = ''}) { - if (instanceName.isNotEmpty) { - instanceName = '.$instanceName'; - } - final EventChannel channelStateChannel = - EventChannel('dev.flutter.pigeon.flutter_module.ChannelModelEventApi.channelState$instanceName', pigeonMethodCodec); - return channelStateChannel.receiveBroadcastStream().map((dynamic event) { - return event as ModelStateData; - }); -} - -Stream channelEvent( {String instanceName = ''}) { - if (instanceName.isNotEmpty) { - instanceName = '.$instanceName'; - } - final EventChannel channelEventChannel = - EventChannel('dev.flutter.pigeon.flutter_module.ChannelModelEventApi.channelEvent$instanceName', pigeonMethodCodec); - return channelEventChannel.receiveBroadcastStream().map((dynamic event) { - return event as ModelEventData; - }); -} - - -class ChannelMainModel { - /// Constructor for [ChannelMainModel]. The [binaryMessenger] named argument is +class MainModelBridge { + /// Constructor for [MainModelBridge]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - ChannelMainModel({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) + MainModelBridge({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) : pigeonVar_binaryMessenger = binaryMessenger, pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; final BinaryMessenger? pigeonVar_binaryMessenger; @@ -673,8 +702,62 @@ class ChannelMainModel { final String pigeonVar_messageChannelSuffix; + Future getState() async { + final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.MainModelBridge.getState$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final List? pigeonVar_replyList = + await pigeonVar_channel.send(null) as List?; + if (pigeonVar_replyList == null) { + throw _createConnectionError(pigeonVar_channelName); + } else if (pigeonVar_replyList.length > 1) { + throw PlatformException( + code: pigeonVar_replyList[0]! as String, + message: pigeonVar_replyList[1] as String?, + details: pigeonVar_replyList[2], + ); + } else if (pigeonVar_replyList[0] == null) { + throw PlatformException( + code: 'null-error', + message: 'Host platform returned null value for non-null return value.', + ); + } else { + return (pigeonVar_replyList[0] as MainModelStateData?)!; + } + } + + Future getEvent() async { + final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.MainModelBridge.getEvent$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final List? pigeonVar_replyList = + await pigeonVar_channel.send(null) as List?; + if (pigeonVar_replyList == null) { + throw _createConnectionError(pigeonVar_channelName); + } else if (pigeonVar_replyList.length > 1) { + throw PlatformException( + code: pigeonVar_replyList[0]! as String, + message: pigeonVar_replyList[1] as String?, + details: pigeonVar_replyList[2], + ); + } else if (pigeonVar_replyList[0] == null) { + throw PlatformException( + code: 'null-error', + message: 'Host platform returned null value for non-null return value.', + ); + } else { + return (pigeonVar_replyList[0] as MainModelEventData?)!; + } + } + Future resetEvent() async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.ChannelMainModel.resetEvent$pigeonVar_messageChannelSuffix'; + final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.MainModelBridge.resetEvent$pigeonVar_messageChannelSuffix'; final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -696,7 +779,7 @@ class ChannelMainModel { } Future initState() async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.ChannelMainModel.initState$pigeonVar_messageChannelSuffix'; + final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.MainModelBridge.initState$pigeonVar_messageChannelSuffix'; final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -718,7 +801,7 @@ class ChannelMainModel { } Future filterLanguage(String language, bool isSelected) async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.ChannelMainModel.filterLanguage$pigeonVar_messageChannelSuffix'; + final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.MainModelBridge.filterLanguage$pigeonVar_messageChannelSuffix'; final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -740,7 +823,7 @@ class ChannelMainModel { } Future filterScope(String scope) async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.ChannelMainModel.filterScope$pigeonVar_messageChannelSuffix'; + final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.MainModelBridge.filterScope$pigeonVar_messageChannelSuffix'; final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -762,7 +845,7 @@ class ChannelMainModel { } Future logOut() async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.ChannelMainModel.logOut$pigeonVar_messageChannelSuffix'; + final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.MainModelBridge.logOut$pigeonVar_messageChannelSuffix'; final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -784,11 +867,11 @@ class ChannelMainModel { } } -class ChannelDetailsModel { - /// Constructor for [ChannelDetailsModel]. The [binaryMessenger] named argument is +class DetailModelBridge { + /// Constructor for [DetailModelBridge]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - ChannelDetailsModel({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) + DetailModelBridge({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) : pigeonVar_binaryMessenger = binaryMessenger, pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; final BinaryMessenger? pigeonVar_binaryMessenger; @@ -797,8 +880,62 @@ class ChannelDetailsModel { final String pigeonVar_messageChannelSuffix; + Future getState() async { + final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.DetailModelBridge.getState$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final List? pigeonVar_replyList = + await pigeonVar_channel.send(null) as List?; + if (pigeonVar_replyList == null) { + throw _createConnectionError(pigeonVar_channelName); + } else if (pigeonVar_replyList.length > 1) { + throw PlatformException( + code: pigeonVar_replyList[0]! as String, + message: pigeonVar_replyList[1] as String?, + details: pigeonVar_replyList[2], + ); + } else if (pigeonVar_replyList[0] == null) { + throw PlatformException( + code: 'null-error', + message: 'Host platform returned null value for non-null return value.', + ); + } else { + return (pigeonVar_replyList[0] as DetailModelStateData?)!; + } + } + + Future getEvent() async { + final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.DetailModelBridge.getEvent$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final List? pigeonVar_replyList = + await pigeonVar_channel.send(null) as List?; + if (pigeonVar_replyList == null) { + throw _createConnectionError(pigeonVar_channelName); + } else if (pigeonVar_replyList.length > 1) { + throw PlatformException( + code: pigeonVar_replyList[0]! as String, + message: pigeonVar_replyList[1] as String?, + details: pigeonVar_replyList[2], + ); + } else if (pigeonVar_replyList[0] == null) { + throw PlatformException( + code: 'null-error', + message: 'Host platform returned null value for non-null return value.', + ); + } else { + return (pigeonVar_replyList[0] as DetailModelEventData?)!; + } + } + Future resetEvent() async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.ChannelDetailsModel.resetEvent$pigeonVar_messageChannelSuffix'; + final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.DetailModelBridge.resetEvent$pigeonVar_messageChannelSuffix'; final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -820,7 +957,7 @@ class ChannelDetailsModel { } Future load(String uuid) async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.ChannelDetailsModel.load$pigeonVar_messageChannelSuffix'; + final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.DetailModelBridge.load$pigeonVar_messageChannelSuffix'; final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -841,8 +978,8 @@ class ChannelDetailsModel { } } - Future toggleFavorite() async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.ChannelDetailsModel.toggleFavorite$pigeonVar_messageChannelSuffix'; + Future like() async { + final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.DetailModelBridge.like$pigeonVar_messageChannelSuffix'; final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -863,15 +1000,37 @@ class ChannelDetailsModel { } } - Future saveImage(Uint8List image) async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.ChannelDetailsModel.saveImage$pigeonVar_messageChannelSuffix'; + Future dislike() async { + final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.DetailModelBridge.dislike$pigeonVar_messageChannelSuffix'; final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); final List? pigeonVar_replyList = - await pigeonVar_channel.send([image]) as List?; + await pigeonVar_channel.send(null) as List?; + if (pigeonVar_replyList == null) { + throw _createConnectionError(pigeonVar_channelName); + } else if (pigeonVar_replyList.length > 1) { + throw PlatformException( + code: pigeonVar_replyList[0]! as String, + message: pigeonVar_replyList[1] as String?, + details: pigeonVar_replyList[2], + ); + } else { + return; + } + } + + Future save() async { + final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.DetailModelBridge.save$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final List? pigeonVar_replyList = + await pigeonVar_channel.send(null) as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -886,7 +1045,7 @@ class ChannelDetailsModel { } Future copyToClipboard() async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.ChannelDetailsModel.copyToClipboard$pigeonVar_messageChannelSuffix'; + final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.DetailModelBridge.copyToClipboard$pigeonVar_messageChannelSuffix'; final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -907,15 +1066,15 @@ class ChannelDetailsModel { } } - Future shareImage(Uint8List image) async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.ChannelDetailsModel.shareImage$pigeonVar_messageChannelSuffix'; + Future share() async { + final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.DetailModelBridge.share$pigeonVar_messageChannelSuffix'; final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, binaryMessenger: pigeonVar_binaryMessenger, ); final List? pigeonVar_replyList = - await pigeonVar_channel.send([image]) as List?; + await pigeonVar_channel.send(null) as List?; if (pigeonVar_replyList == null) { throw _createConnectionError(pigeonVar_channelName); } else if (pigeonVar_replyList.length > 1) { @@ -930,7 +1089,7 @@ class ChannelDetailsModel { } Future delete() async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.ChannelDetailsModel.delete$pigeonVar_messageChannelSuffix'; + final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.DetailModelBridge.delete$pigeonVar_messageChannelSuffix'; final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -952,11 +1111,11 @@ class ChannelDetailsModel { } } -class ChannelLoginModel { - /// Constructor for [ChannelLoginModel]. The [binaryMessenger] named argument is +class LoginModelBridge { + /// Constructor for [LoginModelBridge]. The [binaryMessenger] named argument is /// available for dependency injection. If it is left null, the default /// BinaryMessenger will be used which routes to the host platform. - ChannelLoginModel({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) + LoginModelBridge({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''}) : pigeonVar_binaryMessenger = binaryMessenger, pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : ''; final BinaryMessenger? pigeonVar_binaryMessenger; @@ -965,8 +1124,62 @@ class ChannelLoginModel { final String pigeonVar_messageChannelSuffix; + Future getState() async { + final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.LoginModelBridge.getState$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final List? pigeonVar_replyList = + await pigeonVar_channel.send(null) as List?; + if (pigeonVar_replyList == null) { + throw _createConnectionError(pigeonVar_channelName); + } else if (pigeonVar_replyList.length > 1) { + throw PlatformException( + code: pigeonVar_replyList[0]! as String, + message: pigeonVar_replyList[1] as String?, + details: pigeonVar_replyList[2], + ); + } else if (pigeonVar_replyList[0] == null) { + throw PlatformException( + code: 'null-error', + message: 'Host platform returned null value for non-null return value.', + ); + } else { + return (pigeonVar_replyList[0] as LoginModelStateData?)!; + } + } + + Future getEvent() async { + final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.LoginModelBridge.getEvent$pigeonVar_messageChannelSuffix'; + final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( + pigeonVar_channelName, + pigeonChannelCodec, + binaryMessenger: pigeonVar_binaryMessenger, + ); + final List? pigeonVar_replyList = + await pigeonVar_channel.send(null) as List?; + if (pigeonVar_replyList == null) { + throw _createConnectionError(pigeonVar_channelName); + } else if (pigeonVar_replyList.length > 1) { + throw PlatformException( + code: pigeonVar_replyList[0]! as String, + message: pigeonVar_replyList[1] as String?, + details: pigeonVar_replyList[2], + ); + } else if (pigeonVar_replyList[0] == null) { + throw PlatformException( + code: 'null-error', + message: 'Host platform returned null value for non-null return value.', + ); + } else { + return (pigeonVar_replyList[0] as LoginModelEventData?)!; + } + } + Future loginOrRegister(String email, String password) async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.ChannelLoginModel.loginOrRegister$pigeonVar_messageChannelSuffix'; + final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.LoginModelBridge.loginOrRegister$pigeonVar_messageChannelSuffix'; final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -988,7 +1201,7 @@ class ChannelLoginModel { } Future checkLoginState() async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.ChannelLoginModel.checkLoginState$pigeonVar_messageChannelSuffix'; + final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.LoginModelBridge.checkLoginState$pigeonVar_messageChannelSuffix'; final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, @@ -1010,7 +1223,7 @@ class ChannelLoginModel { } Future resetEvent() async { - final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.ChannelLoginModel.resetEvent$pigeonVar_messageChannelSuffix'; + final String pigeonVar_channelName = 'dev.flutter.pigeon.flutter_module.LoginModelBridge.resetEvent$pigeonVar_messageChannelSuffix'; final BasicMessageChannel pigeonVar_channel = BasicMessageChannel( pigeonVar_channelName, pigeonChannelCodec, diff --git a/flutter_module/lib/presentation/providers/channel_model_provider.dart b/flutter_module/lib/presentation/providers/channel_model_provider.dart deleted file mode 100644 index 85e2b66..0000000 --- a/flutter_module/lib/presentation/providers/channel_model_provider.dart +++ /dev/null @@ -1,6 +0,0 @@ -import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:flutter_module/generated/data_model.g.dart'; - -final loginChannelModel = Provider((ref) => ChannelLoginModel()); -final mainChannelModel = Provider((ref) => ChannelMainModel()); -final detailsChannelModel = Provider((ref) => ChannelDetailsModel()); \ No newline at end of file diff --git a/flutter_module/lib/presentation/providers/channel_stream_state_notifier.dart b/flutter_module/lib/presentation/providers/channel_stream_state_notifier.dart deleted file mode 100644 index 73b220a..0000000 --- a/flutter_module/lib/presentation/providers/channel_stream_state_notifier.dart +++ /dev/null @@ -1,28 +0,0 @@ -import 'dart:async'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; - -class ChannelStreamStateNotifier extends StateNotifier { - ChannelStreamStateNotifier({ - required this.initialState, - required this.model, - required this.dataStream, - }) : super(initialState) { - _stateSubscription = dataStream.listen( - (state) => switch (state) { - STATE() => super.state = state, - _ => {}, - }, - ); - } - - final STATE initialState; - final MODEL model; - final Stream dataStream; - late StreamSubscription _stateSubscription; - - @override - void dispose() { - _stateSubscription.cancel(); - super.dispose(); - } -} diff --git a/flutter_module/lib/presentation/providers/details_page_state_provider.dart b/flutter_module/lib/presentation/providers/details_page_state_provider.dart deleted file mode 100644 index a883c17..0000000 --- a/flutter_module/lib/presentation/providers/details_page_state_provider.dart +++ /dev/null @@ -1,25 +0,0 @@ -import 'package:flutter_module/presentation/providers/channel_stream_state_notifier.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; - -import '../../generated/data_model.g.dart'; -import 'channel_model_provider.dart'; - -final detailsPageStateProvider = StateNotifierProvider< - ChannelStreamStateNotifier, - DetailsModelStateData>( - (ref) => ChannelStreamStateNotifier( - initialState: DetailsModelStateData(), - model: ref.read(detailsChannelModel), - dataStream: channelState(), - ), -); - -final detailsPageEventProvider = StateNotifierProvider< - ChannelStreamStateNotifier, - DetailsModelEventData>( - (ref) => ChannelStreamStateNotifier( - initialState: DetailsModelEventData(), - model: ref.read(detailsChannelModel), - dataStream: channelEvent(), - ), -); diff --git a/flutter_module/lib/presentation/providers/login_page_state_provider.dart b/flutter_module/lib/presentation/providers/login_page_state_provider.dart deleted file mode 100644 index 4dd5715..0000000 --- a/flutter_module/lib/presentation/providers/login_page_state_provider.dart +++ /dev/null @@ -1,25 +0,0 @@ -import 'package:flutter_module/generated/data_model.g.dart'; -import 'package:flutter_module/presentation/providers/channel_stream_state_notifier.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; - -import 'channel_model_provider.dart'; - -final loginPageStateProvider = StateNotifierProvider< - ChannelStreamStateNotifier, - LoginModelStateData>( - (ref) => ChannelStreamStateNotifier( - initialState: LoginModelStateData(), - model: ref.read(loginChannelModel), - dataStream: channelState(), - ), -); - -final loginPageEventProvider = StateNotifierProvider< - ChannelStreamStateNotifier, - LoginModelEventData>( - (ref) => ChannelStreamStateNotifier( - initialState: LoginModelEventData(), - model: ref.read(loginChannelModel), - dataStream: channelEvent(), - ), -); diff --git a/flutter_module/lib/presentation/providers/main_page_state_provider.dart b/flutter_module/lib/presentation/providers/main_page_state_provider.dart deleted file mode 100644 index 8857bf5..0000000 --- a/flutter_module/lib/presentation/providers/main_page_state_provider.dart +++ /dev/null @@ -1,25 +0,0 @@ -import 'package:flutter_module/generated/data_model.g.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:flutter_module/presentation/providers/channel_stream_state_notifier.dart'; - -import 'channel_model_provider.dart'; - -final mainPageStateProvider = StateNotifierProvider< - ChannelStreamStateNotifier, - MainModelStateData>( - (ref) => ChannelStreamStateNotifier( - initialState: MainModelStateData(), - model: ref.read(mainChannelModel), - dataStream: channelState(), - ), -); - -final mainPageEventProvider = StateNotifierProvider< - ChannelStreamStateNotifier, - MainModelEventData>( - (ref) => ChannelStreamStateNotifier( - initialState: MainModelEventData(), - model: ref.read(mainChannelModel), - dataStream: channelEvent(), - ), -); diff --git a/flutter_module/lib/presentation/screens/details_screen.dart b/flutter_module/lib/presentation/screens/details_screen.dart index 84da026..50962c7 100644 --- a/flutter_module/lib/presentation/screens/details_screen.dart +++ b/flutter_module/lib/presentation/screens/details_screen.dart @@ -1,8 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; -import 'package:flutter_module/generated/data_model.g.dart'; +import 'package:flutter_module/model/main_model.dart'; import 'package:flutter_module/presentation/navigation/details/details_navigator.dart'; -import 'package:flutter_module/presentation/providers/details_page_state_provider.dart'; import 'package:flutter_module/presentation/screens/named_screen.dart'; import 'package:flutter_module/presentation/styles/color_styles.dart'; import 'package:flutter_module/presentation/styles/dimens.dart'; @@ -12,10 +11,10 @@ import 'package:flutter_module/presentation/widgets/no_overscroll_single_child_s import 'package:flutter_module/presentation/widgets/snippet_action_bar.dart'; import 'package:flutter_module/presentation/widgets/snippet_details_bar.dart'; import 'package:flutter_module/presentation/widgets/view_state_wrapper.dart'; +import 'package:flutter_module/utils/extensions/state_extensions.dart'; import 'package:flutter_module/utils/hooks/use_navigator.dart'; +import 'package:flutter_module/utils/hooks/use_observable_state_hook.dart'; import 'package:go_router/go_router.dart'; -import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:screenshot/screenshot.dart'; class DetailsScreen extends NamedScreen { DetailsScreen({ @@ -26,7 +25,7 @@ class DetailsScreen extends NamedScreen { static String name = 'details'; final DetailsNavigator navigator; - final ChannelDetailsModel model; + final DetailModelBridge model; @override Widget build(BuildContext context, GoRouterState state) { @@ -35,59 +34,54 @@ class DetailsScreen extends NamedScreen { model: model, ); } + } -class _DetailsPage extends HookConsumerWidget { +class _DetailsPage extends HookWidget { const _DetailsPage({ required this.navigator, required this.model, }); final DetailsNavigator navigator; - final ChannelDetailsModel model; + final DetailModelBridge model; @override - Widget build(BuildContext context, WidgetRef ref) { + Widget build(BuildContext context) { useNavigator([navigator]); - final captureController = useRef(ScreenshotController()); - final stateNotification = ref.watch(detailsPageStateProvider); - final state = stateNotification.state; - final eventNotification = ref.watch(detailsPageEventProvider); - final event = eventNotification.event; + final state = useObservableState( + DetailModelStateData(), + () => model.getState(), + (current, newState) => (current as DetailModelStateData).equals(newState), + ).value; + + final event = useObservableState( + DetailModelEventData(), + () => model.getEvent(), + (current, newState) => (current as DetailModelEventData).equals(newState), + ).value; WidgetsBinding.instance.addPostFrameCallback((_) { - switch (event) { - case DetailsModelEvent.alert: - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(eventNotification.value ?? ""))); - case DetailsModelEvent.deleted: + if (event.event == DetailModelEvent.saved) { + final snippetId = event.value; + if (snippetId == null) { _exit(); - default: - print('Event $event'); + return; + } + + _exit(); + WidgetsBinding.instance.addPostFrameCallback((_) { + navigator.goToDetails(context, snippetId); + }); } - model.resetEvent(); }); - Future saveImage() async { - try { - final image = await captureController.value.capture(); - if (image == null) return; - model.saveImage(image); - } catch (e, s) { - print('Could not invoke save image, error: $e, stack: $s'); - } - } - - Future shareImage() async { - try { - final image = await captureController.value.capture(); - if (image == null) return; - model.shareImage(image); - } catch (e, s) { - print('Could not invoke share image, error: $e, stack: $s'); + WidgetsBinding.instance.addPostFrameCallback((_) { + if (event.event == DetailModelEvent.deleted) { + _exit(); } - } + }); useEffect(() { model.load(navigator.snippetId ?? ''); @@ -97,7 +91,7 @@ class _DetailsPage extends HookConsumerWidget { return Scaffold( backgroundColor: ColorStyles.surfacePrimary(), appBar: AppBar( - title: Text(stateNotification.data?.title ?? ''), + title: Text(state.data?.title ?? ''), backgroundColor: ColorStyles.surfacePrimary(), foregroundColor: Colors.black, elevation: 0, @@ -105,21 +99,18 @@ class _DetailsPage extends HookConsumerWidget { onPressed: navigator.back, color: Colors.black, ), - actions: stateNotification.data?.isPrivate == true + actions: state.data?.isPrivate == true ? [const PaddingStyles.regular(Icon(Icons.lock_outlined))] : null, ), body: ViewStateWrapper( isLoading: - state == ModelState.loading || stateNotification.isLoading == true, - error: stateNotification.error, - data: stateNotification.data as Snippet?, + state.state == ModelState.loading || state.isLoading == true, + error: state.error, + data: state.data, builder: (_, snippet) => _DetailPageData( model: model, snippet: snippet, - captureController: captureController.value, - saveImage: saveImage, - shareImage: shareImage, ), ), ); @@ -135,16 +126,10 @@ class _DetailPageData extends StatelessWidget { const _DetailPageData({ required this.model, required this.snippet, - required this.captureController, - required this.saveImage, - required this.shareImage, }); - final ChannelDetailsModel model; + final DetailModelBridge model; final Snippet? snippet; - final ScreenshotController captureController; - final VoidCallback saveImage; - final VoidCallback shareImage; @override Widget build(BuildContext context) { @@ -159,18 +144,9 @@ class _DetailPageData extends StatelessWidget { color: ColorStyles.codeBackground(), child: NoOverscrollSingleChildScrollView( padding: const EdgeInsets.all(Dimens.l), - child: Screenshot( - controller: captureController, - child: ColoredBox( - color: ColorStyles.codeBackground(), - child: Padding( - padding: const EdgeInsets.all(Dimens.m), - child: CodeTextView( - code: snippet!.code!.raw!, - tokens: snippet!.code?.tokens, - ), - ), - ), + child: CodeTextView( + code: snippet!.code!.raw!, + tokens: snippet!.code?.tokens, ), ), ), @@ -179,10 +155,11 @@ class _DetailPageData extends StatelessWidget { Center( child: SnippetActionBar( snippet: snippet!, - onFavoriteTap: model.toggleFavorite, - onSaveTap: saveImage, + onLikeTap: model.like, + onDislikeTap: model.dislike, + onSaveTap: model.save, onCopyTap: model.copyToClipboard, - onShareTap: shareImage, + onShareTap: model.share, onDeleteTap: model.delete, ), ), diff --git a/flutter_module/lib/presentation/screens/login_screen.dart b/flutter_module/lib/presentation/screens/login_screen.dart index 4dd4d1f..d3a208c 100644 --- a/flutter_module/lib/presentation/screens/login_screen.dart +++ b/flutter_module/lib/presentation/screens/login_screen.dart @@ -1,9 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_module/generated/assets.dart'; -import 'package:flutter_module/generated/data_model.g.dart'; +import 'package:flutter_module/model/main_model.dart'; import 'package:flutter_module/presentation/navigation/login/login_navigator.dart'; -import 'package:flutter_module/presentation/providers/login_page_state_provider.dart'; import 'package:flutter_module/presentation/screens/named_screen.dart'; import 'package:flutter_module/presentation/styles/dimens.dart'; import 'package:flutter_module/presentation/styles/padding_styles.dart'; @@ -12,9 +11,10 @@ import 'package:flutter_module/presentation/widgets/login_input_card.dart'; import 'package:flutter_module/presentation/widgets/no_overscroll_single_child_scroll_view.dart'; import 'package:flutter_module/presentation/widgets/rounded_action_button.dart'; import 'package:flutter_module/presentation/widgets/view_state_wrapper.dart'; +import 'package:flutter_module/utils/extensions/state_extensions.dart'; import 'package:flutter_module/utils/hooks/use_navigator.dart'; +import 'package:flutter_module/utils/hooks/use_observable_state_hook.dart'; import 'package:go_router_plus/go_router_plus.dart'; -import 'package:hooks_riverpod/hooks_riverpod.dart'; class LoginScreen extends NamedScreen implements InitialScreen, GuestScreen { LoginScreen({ @@ -24,37 +24,45 @@ class LoginScreen extends NamedScreen implements InitialScreen, GuestScreen { static String name = 'login'; final LoginNavigator navigator; - final ChannelLoginModel model; + final LoginModelBridge model; @override Widget build(BuildContext context, GoRouterState state) { - return _LoginPage( + return _MainPage( navigator: navigator, model: model, ); } } -class _LoginPage extends HookConsumerWidget { - const _LoginPage({ +class _MainPage extends HookWidget { + const _MainPage({ required this.navigator, required this.model, }); final LoginNavigator navigator; - final ChannelLoginModel model; + final LoginModelBridge model; @override - Widget build(BuildContext context, WidgetRef ref) { + Widget build(BuildContext context) { useNavigator([navigator]); final email = useState('mail@o2.pl'); final password = useState('12345678'); final validationCorrect = useState(true); - final stateNotification = ref.watch(loginPageStateProvider); - final eventNotification = ref.watch(loginPageEventProvider); - final event = eventNotification.event; + final state = useObservableState( + LoginModelStateData(), + () => model.getState(), + (current, newState) => (current as LoginModelStateData).equals(newState), + ).value; + + final event = useObservableState( + LoginModelEventData(), + () => model.getEvent(), + (current, newState) => (current as LoginModelEventData).equals(newState), + ).value; useEffect(() { model.checkLoginState(); @@ -62,7 +70,7 @@ class _LoginPage extends HookConsumerWidget { }, []); WidgetsBinding.instance.addPostFrameCallback((_) { - if (event == LoginModelEvent.logged) { + if (event.event == LoginModelEvent.logged) { model.resetEvent(); navigator.login(); } @@ -71,8 +79,8 @@ class _LoginPage extends HookConsumerWidget { return Scaffold( body: SafeArea( child: ViewStateWrapper( - isLoading: stateNotification.state == ModelState.loading, - data: stateNotification, + isLoading: state.state == ModelState.loading, + data: state.state, builder: (BuildContext context, _) { return NoOverscrollSingleChildScrollView( child: Column( diff --git a/flutter_module/lib/presentation/screens/main_screen.dart b/flutter_module/lib/presentation/screens/main_screen.dart index cd3318d..2c59a13 100644 --- a/flutter_module/lib/presentation/screens/main_screen.dart +++ b/flutter_module/lib/presentation/screens/main_screen.dart @@ -1,10 +1,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_module/generated/assets.dart'; -import 'package:flutter_module/generated/data_model.g.dart'; +import 'package:flutter_module/model/main_model.dart'; import 'package:flutter_module/presentation/navigation/details/details_navigator.dart'; import 'package:flutter_module/presentation/navigation/login/login_navigator.dart'; -import 'package:flutter_module/presentation/providers/main_page_state_provider.dart'; import 'package:flutter_module/presentation/screens/named_screen.dart'; import 'package:flutter_module/presentation/styles/color_styles.dart'; import 'package:flutter_module/presentation/styles/dimens.dart'; @@ -14,9 +13,10 @@ import 'package:flutter_module/presentation/widgets/filter_dropdown.dart'; import 'package:flutter_module/presentation/widgets/filter_list_view.dart'; import 'package:flutter_module/presentation/widgets/snippet_list_item.dart'; import 'package:flutter_module/presentation/widgets/view_state_wrapper.dart'; +import 'package:flutter_module/utils/extensions/state_extensions.dart'; import 'package:flutter_module/utils/hooks/use_navigator.dart'; +import 'package:flutter_module/utils/hooks/use_observable_state_hook.dart'; import 'package:go_router_plus/go_router_plus.dart'; -import 'package:hooks_riverpod/hooks_riverpod.dart'; class MainScreen extends NamedScreen implements UserScreen { MainScreen({ @@ -28,7 +28,7 @@ class MainScreen extends NamedScreen implements UserScreen { static String name = 'main'; final LoginNavigator loginNavigator; final DetailsNavigator detailsNavigator; - final ChannelMainModel model; + final MainModelBridge model; @override Widget build(BuildContext context, GoRouterState state) { @@ -40,7 +40,7 @@ class MainScreen extends NamedScreen implements UserScreen { } } -class _MainPage extends HookConsumerWidget { +class _MainPage extends HookWidget { const _MainPage({ required this.loginNavigator, required this.detailsNavigator, @@ -49,26 +49,35 @@ class _MainPage extends HookConsumerWidget { final LoginNavigator loginNavigator; final DetailsNavigator detailsNavigator; - final ChannelMainModel model; + final MainModelBridge model; @override - Widget build(BuildContext context, WidgetRef ref) { + Widget build(BuildContext context) { useNavigator([loginNavigator, detailsNavigator]); + + final state = useObservableState( + MainModelStateData(), + () => model.getState(), + (current, newState) => (current as MainModelStateData).equals(newState), + ).value; + + // Event + final event = useObservableState( + MainModelEventData(), + () => model.getEvent(), + (current, newState) => (current as MainModelEventData).equals(newState), + ).value; + final expandedState = useState(true); final controller = useScrollController(); - final stateNotification = ref.watch(mainPageStateProvider); - final state = stateNotification.state; - final eventNotification = ref.watch(mainPageEventProvider); - final event = eventNotification.event; - useEffect(() { model.initState(); return null; }, []); WidgetsBinding.instance.addPostFrameCallback((_) { - if (event == MainModelEvent.logout) { + if (event.event == MainModelEvent.logout) { model.resetEvent(); loginNavigator.logout(); } @@ -77,15 +86,15 @@ class _MainPage extends HookConsumerWidget { return Scaffold( backgroundColor: ColorStyles.pageBackground(), body: ViewStateWrapper>( - isLoading: state == ModelState.loading || stateNotification.isLoading == true, - error: stateNotification.error, - data: stateNotification.data?.cast(), + isLoading: state.state == ModelState.loading || state.isLoading == true, + error: state.error, + data: state.data?.cast(), builder: (_, snippets) { return _MainPageData( navigator: detailsNavigator, model: model, snippets: snippets ?? List.empty(), - filter: stateNotification.filter ?? SnippetFilter(), + filter: state.filter ?? SnippetFilter(), controller: controller, expanded: expandedState.value, onExpandChange: (expanded) => expandedState.value = expanded, @@ -124,7 +133,7 @@ class _MainPageData extends HookWidget { required this.onExpandChange}); final DetailsNavigator navigator; - final ChannelMainModel model; + final MainModelBridge model; final List snippets; final SnippetFilter filter; final ScrollController controller; diff --git a/flutter_module/lib/presentation/widgets/code_text_view.dart b/flutter_module/lib/presentation/widgets/code_text_view.dart index 90ad6b9..bc514d5 100644 --- a/flutter_module/lib/presentation/widgets/code_text_view.dart +++ b/flutter_module/lib/presentation/widgets/code_text_view.dart @@ -1,7 +1,7 @@ import 'dart:convert'; import 'package:flutter/material.dart'; -import 'package:flutter_module/generated/data_model.g.dart'; +import 'package:flutter_module/model/main_model.dart'; import 'package:flutter_module/presentation/styles/text_styles.dart'; import 'package:flutter_module/utils/extensions/collection_extensions.dart'; import 'package:flutter_module/utils/extensions/text_extensions.dart'; diff --git a/flutter_module/lib/presentation/widgets/snippet_action_bar.dart b/flutter_module/lib/presentation/widgets/snippet_action_bar.dart index 7e0b274..7f4d0eb 100644 --- a/flutter_module/lib/presentation/widgets/snippet_action_bar.dart +++ b/flutter_module/lib/presentation/widgets/snippet_action_bar.dart @@ -1,23 +1,24 @@ import 'package:flutter/material.dart'; -import 'package:flutter_module/generated/data_model.g.dart'; +import 'package:flutter_module/model/main_model.dart'; import 'package:flutter_module/presentation/styles/dimens.dart'; import 'package:flutter_module/presentation/styles/surface_styles.dart'; import 'package:flutter_module/presentation/widgets/state_icon.dart'; class SnippetActionBar extends StatelessWidget { const SnippetActionBar({ + super.key, required this.snippet, - this.onFavoriteTap, + this.onLikeTap, + this.onDislikeTap, this.onSaveTap, this.onCopyTap, this.onShareTap, - // TODO Add archive action this.onDeleteTap, - super.key, }); final Snippet snippet; - final GestureTapCallback? onFavoriteTap; + final GestureTapCallback? onLikeTap; + final GestureTapCallback? onDislikeTap; final GestureTapCallback? onSaveTap; final GestureTapCallback? onCopyTap; final GestureTapCallback? onShareTap; @@ -30,19 +31,21 @@ class SnippetActionBar extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ StateIcon( - icon: Icons.favorite, + icon: Icons.thumb_up_alt_outlined, active: snippet.isLiked, - onTap: onFavoriteTap, + onTap: snippet.isLiked == false ? null : onLikeTap, ), const SizedBox(width: Dimens.l), StateIcon( - icon: Icons.share, - onTap: onShareTap, + icon: Icons.thumb_down_alt_outlined, + active: snippet.isDisliked, + onTap: snippet.isDisliked == false ? null : onDislikeTap, ), const SizedBox(width: Dimens.l), StateIcon( icon: Icons.save_alt_outlined, - onTap: onSaveTap, + active: snippet.isSaved, + onTap: getSaveCallback(snippet.isSaved, onSaveTap), ), const SizedBox(width: Dimens.l), StateIcon( @@ -50,6 +53,11 @@ class SnippetActionBar extends StatelessWidget { onTap: onCopyTap, ), const SizedBox(width: Dimens.l), + StateIcon( + icon: Icons.share, + onTap: onShareTap, + ), + const SizedBox(width: Dimens.l), StateIcon( onTap: snippet.isToDelete == true ? onDeleteTap : null, active: snippet.isToDelete == true ? null : false, @@ -60,4 +68,13 @@ class SnippetActionBar extends StatelessWidget { ), ); } + + GestureTapCallback? getSaveCallback( + bool? isSaved, + GestureTapCallback? onSaveTap, + ) { + if (isSaved == false) return null; + if (isSaved == true) return null; + return onSaveTap; + } } diff --git a/flutter_module/lib/presentation/widgets/snippet_details_bar.dart b/flutter_module/lib/presentation/widgets/snippet_details_bar.dart index 5de306b..d3ec723 100644 --- a/flutter_module/lib/presentation/widgets/snippet_details_bar.dart +++ b/flutter_module/lib/presentation/widgets/snippet_details_bar.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_module/generated/assets.dart'; -import 'package:flutter_module/generated/data_model.g.dart'; +import 'package:flutter_module/model/main_model.dart'; import 'package:flutter_module/presentation/styles/dimens.dart'; import 'package:flutter_module/presentation/styles/surface_styles.dart'; import 'package:flutter_module/presentation/styles/text_styles.dart'; @@ -43,7 +43,6 @@ class SnippetDetailsBar extends StatelessWidget { ); } - // TODO Remove String _getVoteCountText(int? voteResult) { const defaultValue = '+0'; if (voteResult == null) return defaultValue; @@ -63,7 +62,20 @@ class _UserReactionIndicator extends StatelessWidget { @override Widget build(BuildContext context) { - // TODO Implement favorite - return SizedBox.shrink(); + if (reaction == UserReaction.like) { + return Image.asset( + Assets.reactionLike, + scale: _scale, + ); + } + + if (reaction == UserReaction.dislike) { + return Image.asset( + Assets.reactionDislike, + scale: _scale, + ); + } + + return Image.asset(Assets.reactionUndefined, scale: _scale); } } diff --git a/flutter_module/lib/presentation/widgets/snippet_list_item.dart b/flutter_module/lib/presentation/widgets/snippet_list_item.dart index 2150250..34a707d 100644 --- a/flutter_module/lib/presentation/widgets/snippet_list_item.dart +++ b/flutter_module/lib/presentation/widgets/snippet_list_item.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; -import 'package:flutter_module/generated/data_model.g.dart'; +import 'package:flutter_module/model/main_model.dart'; import 'package:flutter_module/presentation/styles/color_styles.dart'; import 'package:flutter_module/presentation/styles/dimens.dart'; import 'package:flutter_module/presentation/styles/surface_styles.dart'; diff --git a/flutter_module/lib/utils/extensions/collection_extensions.dart b/flutter_module/lib/utils/extensions/collection_extensions.dart index 432a8ef..f385eb8 100644 --- a/flutter_module/lib/utils/extensions/collection_extensions.dart +++ b/flutter_module/lib/utils/extensions/collection_extensions.dart @@ -1,7 +1,7 @@ import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; import 'package:flutter/painting.dart'; -import 'package:flutter_module/generated/data_model.g.dart'; +import 'package:flutter_module/model/main_model.dart'; import 'package:flutter_module/presentation/styles/text_styles.dart'; import 'package:flutter_module/utils/extensions/text_extensions.dart'; import 'package:collection/collection.dart'; diff --git a/flutter_module/lib/utils/extensions/state_extensions.dart b/flutter_module/lib/utils/extensions/state_extensions.dart index 6e2a187..e4960f9 100644 --- a/flutter_module/lib/utils/extensions/state_extensions.dart +++ b/flutter_module/lib/utils/extensions/state_extensions.dart @@ -1,3 +1,43 @@ -import 'package:flutter_module/generated/data_model.g.dart'; +import 'package:flutter_module/model/main_model.dart'; +extension MainModelStateDataExtension on MainModelStateData { + bool equals(Object other) { + if (other is! MainModelStateData) return false; + return other.oldHash == other.newHash; + } +} +extension MainModelEventDataExtension on MainModelEventData { + bool equals(Object other) { + if (other is! MainModelEventData) return false; + return other.oldHash == other.newHash; + } +} + +extension DetailModelStateDataExtension on DetailModelStateData { + bool equals(Object other) { + if (other is! DetailModelStateData) return false; + return other.oldHash == other.newHash; + } +} + +extension DetailModelEventDataExtension on DetailModelEventData { + bool equals(Object other) { + if (other is! DetailModelEventData) return false; + return other.oldHash == other.newHash; + } +} + +extension LoginModelStateDataExtension on LoginModelStateData { + bool equals(Object other) { + if (other is! LoginModelStateData) return false; + return other.oldHash == other.newHash; + } +} + +extension LoginModelEventDataExtension on LoginModelEventData { + bool equals(Object other) { + if (other is! LoginModelEventData) return false; + return other.oldHash == other.newHash; + } +} diff --git a/flutter_module/lib/utils/hooks/use_observable_state_hook.dart b/flutter_module/lib/utils/hooks/use_observable_state_hook.dart new file mode 100644 index 0000000..19c4054 --- /dev/null +++ b/flutter_module/lib/utils/hooks/use_observable_state_hook.dart @@ -0,0 +1,33 @@ +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; +import 'package:flutter_module/utils/hooks/use_same_state.dart'; + +typedef StateEqualsListener = bool Function(Object, Object); + +ValueNotifier useObservableState( + T initialData, + Future Function() getSource, + StateEqualsListener stateEquals, [ + List cancelKeys = const [], + List refreshKeys = const [], +]) { + final state = useSameState(initialData); + + final timer = useMemoized( + () => Timer.periodic(const Duration(milliseconds: 500), (_) async { + final T newData = await getSource(); + if (!stateEquals(state.value as Object, newData as Object)) { + state.value = newData; + } + }), + refreshKeys, + ); + + useEffect(() { + return () => timer.cancel(); + }, cancelKeys); + + return state; +} diff --git a/flutter_module/lib/utils/mock/mocks.dart b/flutter_module/lib/utils/mock/mocks.dart index 7da7de7..4ea496c 100644 --- a/flutter_module/lib/utils/mock/mocks.dart +++ b/flutter_module/lib/utils/mock/mocks.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter_module/generated/data_model.g.dart'; +import 'package:flutter_module/model/main_model.dart'; class Mocks { static final snippet = Snippet( diff --git a/flutter_module/pubspec.lock b/flutter_module/pubspec.lock index db6abd1..4e8fcf8 100644 --- a/flutter_module/pubspec.lock +++ b/flutter_module/pubspec.lock @@ -5,18 +5,18 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: dc27559385e905ad30838356c5f5d574014ba39872d732111cd07ac0beff4c57 + sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7" url: "https://pub.dev" source: hosted - version: "80.0.0" + version: "67.0.0" analyzer: dependency: transitive description: name: analyzer - sha256: "192d1c5b944e7e53b24b5586db760db934b177d4147c42fbca8c8c5f1eb8d11e" + sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d" url: "https://pub.dev" source: hosted - version: "7.3.0" + version: "6.4.1" args: dependency: transitive description: @@ -45,10 +45,10 @@ packages: dependency: transitive description: name: build - sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0 + sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0" url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "2.4.1" build_config: dependency: transitive description: @@ -69,26 +69,26 @@ packages: dependency: transitive description: name: build_resolvers - sha256: b9e4fda21d846e192628e7a4f6deda6888c36b5b69ba02ff291a01fd529140f0 + sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a" url: "https://pub.dev" source: hosted - version: "2.4.4" + version: "2.4.2" build_runner: dependency: "direct dev" description: name: build_runner - sha256: "74691599a5bc750dc96a6b4bfd48f7d9d66453eab04c7f4063134800d6a5c573" + sha256: "644dc98a0f179b872f612d3eb627924b578897c629788e858157fa5e704ca0c7" url: "https://pub.dev" source: hosted - version: "2.4.14" + version: "2.4.11" build_runner_core: dependency: transitive description: name: build_runner_core - sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021" + sha256: e3c79f69a64bdfcd8a776a3c28db4eb6e3fb5356d013ae5eb2e52007706d5dbe url: "https://pub.dev" source: hosted - version: "8.0.0" + version: "7.3.1" built_collection: dependency: transitive description: @@ -121,6 +121,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.3" + clock: + dependency: transitive + description: + name: clock + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" + source: hosted + version: "1.1.1" code_builder: dependency: transitive description: @@ -130,13 +138,13 @@ packages: source: hosted version: "4.10.0" collection: - dependency: transitive + dependency: "direct main" description: name: collection - sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a url: "https://pub.dev" source: hosted - version: "1.19.0" + version: "1.18.0" convert: dependency: transitive description: @@ -165,10 +173,10 @@ packages: dependency: transitive description: name: dart_style - sha256: "27eb0ae77836989a3bc541ce55595e8ceee0992807f14511552a898ddd0d88ac" + sha256: "99e066ce75c89d6b29903d788a7bb9369cf754f7b24bf70bf4b6d6d6b26853b9" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "2.3.6" equatable: dependency: "direct main" description: @@ -177,6 +185,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.5" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" + source: hosted + version: "1.3.1" file: dependency: transitive description: @@ -194,7 +210,7 @@ packages: source: hosted version: "1.1.1" flutter: - dependency: transitive + dependency: "direct main" description: flutter source: sdk version: "0.0.0" @@ -214,14 +230,11 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.0" - flutter_riverpod: - dependency: "direct main" - description: - name: flutter_riverpod - sha256: "9532ee6db4a943a1ed8383072a2e3eeda041db5657cdf6d2acecf3c21ecbe7e1" - url: "https://pub.dev" - source: hosted - version: "2.6.1" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" flutter_web_plugins: dependency: transitive description: flutter @@ -267,14 +280,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.2" - hooks_riverpod: - dependency: "direct main" - description: - name: hooks_riverpod - sha256: "70bba33cfc5670c84b796e6929c54b8bc5be7d0fe15bb28c2560500b9ad06966" - url: "https://pub.dev" - source: hosted - version: "2.6.1" http_multi_server: dependency: transitive description: @@ -315,6 +320,30 @@ packages: url: "https://pub.dev" source: hosted version: "4.9.0" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + url: "https://pub.dev" + source: hosted + version: "10.0.5" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" + url: "https://pub.dev" + source: hosted + version: "3.0.5" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" lints: dependency: transitive description: @@ -399,10 +428,10 @@ packages: dependency: "direct dev" description: name: pigeon - sha256: da22fa111e14a27dc2060f9891fd645649a76b108450f26eb9e72e1cdb2890b7 + sha256: bb5505b81fc9c718911fe7188c88a67566c37497a66f4d4abcfe29fb08614ea3 url: "https://pub.dev" source: hosted - version: "24.2.0" + version: "22.6.0" pool: dependency: transitive description: @@ -427,22 +456,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.0" - riverpod: - dependency: transitive - description: - name: riverpod - sha256: "59062512288d3056b2321804332a13ffdd1bf16df70dcc8e506e411280a72959" - url: "https://pub.dev" - source: hosted - version: "2.6.1" - screenshot: - dependency: "direct main" - description: - name: screenshot - sha256: "63817697a7835e6ce82add4228e15d233b74d42975c143ad8cfe07009fab866b" - url: "https://pub.dev" - source: hosted - version: "3.0.0" shelf: dependency: transitive description: @@ -479,7 +492,7 @@ packages: dependency: transitive description: flutter source: sdk - version: "0.0.0" + version: "0.0.99" source_map_stack_trace: dependency: transitive description: @@ -508,18 +521,10 @@ packages: dependency: transitive description: name: stack_trace - sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" url: "https://pub.dev" source: hosted - version: "1.12.0" - state_notifier: - dependency: transitive - description: - name: state_notifier - sha256: b8677376aa54f2d7c58280d5a007f9e8774f1968d1fb1c096adcb4792fba29bb - url: "https://pub.dev" - source: hosted - version: "1.0.0" + version: "1.11.1" stream_channel: dependency: transitive description: @@ -540,10 +545,10 @@ packages: dependency: transitive description: name: string_scanner - sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.2.0" term_glyph: dependency: transitive description: @@ -556,26 +561,26 @@ packages: dependency: "direct main" description: name: test - sha256: "301b213cd241ca982e9ba50266bd3f5bd1ea33f1455554c5abb85d1be0e2d87e" + sha256: "7ee44229615f8f642b68120165ae4c2a75fe77ae2065b1e55ae4711f6cf0899e" url: "https://pub.dev" source: hosted - version: "1.25.15" + version: "1.25.7" test_api: dependency: transitive description: name: test_api - sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" url: "https://pub.dev" source: hosted - version: "0.7.4" + version: "0.7.2" test_core: dependency: transitive description: name: test_core - sha256: "84d17c3486c8dfdbe5e12a50c8ae176d15e2a771b96909a9442b40173649ccaa" + sha256: "55ea5a652e38a1dfb32943a7973f3681a60f872f8c3a05a14664ad54ef9c6696" url: "https://pub.dev" source: hosted - version: "0.6.8" + version: "0.6.4" timing: dependency: transitive description: @@ -612,10 +617,10 @@ packages: dependency: transitive description: name: vm_service - sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b + sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc url: "https://pub.dev" source: hosted - version: "14.3.0" + version: "14.2.4" watcher: dependency: transitive description: @@ -657,5 +662,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.6.0 <4.0.0" - flutter: ">=3.22.0" + dart: ">=3.4.0 <4.0.0" + flutter: ">=3.18.0-18.0.pre.54" diff --git a/flutter_module/pubspec.yaml b/flutter_module/pubspec.yaml index 27e3ae8..629edd0 100644 --- a/flutter_module/pubspec.yaml +++ b/flutter_module/pubspec.yaml @@ -1,33 +1,46 @@ name: flutter_module description: A new flutter module project. + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +# +# This version is used _only_ for the Runner app, which is used if you just do +# a `flutter run` or a `flutter make-host-app-editable`. It has no impact +# on any other native host app that you embed your Flutter project into. version: 1.0.0+1 environment: - sdk: ">=3.0.0 <4.0.0" - -scripts: - # run is a default script. To use it, simply type " in the command line: "rps" - that's all! - add: "fvm flutter pub add" - get: "fvm flutter pub get" - gen: "fvm flutter pub run build_runner build --delete-conflicting-outputs" - run: "fvm flutter run" - pigeon: "fvm dart run pigeon --input=channel/contract.dart" + sdk: ">=2.18.2 <3.0.0" dependencies: + flutter: + sdk: flutter equatable: ^2.0.5 flutter_hooks: ^0.20.5 test: ^1.21.4 go_router: ^6.5.9 go_router_plus: ^4.1.1 validators: ^3.0.0 + + collection: any logger: ^2.4.0 - flutter_riverpod: ^2.6.1 - hooks_riverpod: ^2.6.1 - screenshot: ^3.0.0 dev_dependencies: + flutter_test: + sdk: flutter build_runner: ^2.2.1 flutter_lints: ^4.0.0 - pigeon: ^24.2.0 + pigeon: ^22.5.0 + +# For information on the generic Dart part of this file, see the +# following screens: https://dart.dev/tools/pub/pubspec flutter_assets_generator: named_with_parent: false # Don't add folder to icons's name @@ -40,14 +53,54 @@ flutter: pluginClass: PigeonPlugin ios: pluginClass: PigeonPlugin + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. uses-material-design: true assets: - assets/images/illustrations/app_logo.png + - assets/images/icons/reaction_undefined.jpeg + - assets/images/icons/reaction_like.jpeg + - assets/images/icons/reaction_dislike.jpeg fonts: - family: Kanit fonts: - asset: fonts/Kanit-Regular.ttf + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware. + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/assets-and-images/#from-packages + + # To add Flutter specific custom fonts to your application, add a fonts + # section here, in this "flutter" section. Each entry in this list should + # have a "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/custom-fonts/#from-packages + + + # This section identifies your Flutter project as a module meant for + # embedding in a native host app. These identifiers should _not_ ordinarily + # be changed after generation - they are used to ensure that the tooling can + # maintain consistency when adding or modifying assets and plugins. + # They also do not have any bearing on your native host application's + # identifiers, which may be completely independent or the same as these. module: androidX: true androidPackage: dev.snipme.flutter_module