├── android
├── lib
│ ├── dig
│ │ ├── src
│ │ │ └── main
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ ├── kotlin
│ │ │ │ └── com
│ │ │ │ │ └── dropbox
│ │ │ │ │ └── forester
│ │ │ │ │ └── android
│ │ │ │ │ └── dig
│ │ │ │ │ ├── DigTypography.kt
│ │ │ │ │ ├── typography.kt
│ │ │ │ │ ├── color
│ │ │ │ │ ├── SystemThemeColors.kt
│ │ │ │ │ ├── LocalColors.kt
│ │ │ │ │ ├── StatefulColor.kt
│ │ │ │ │ ├── material.kt
│ │ │ │ │ └── Colors.kt
│ │ │ │ │ ├── Dig.kt
│ │ │ │ │ └── DigTheme.kt
│ │ │ │ └── res
│ │ │ │ └── drawable
│ │ │ │ ├── activity_fill.xml
│ │ │ │ ├── ic_activity_fill.xml
│ │ │ │ ├── activity.xml
│ │ │ │ ├── close.xml
│ │ │ │ ├── chevron_right.xml
│ │ │ │ ├── ic_activity_line.xml
│ │ │ │ ├── dropbox.xml
│ │ │ │ ├── switcher.xml
│ │ │ │ ├── home_fill.xml
│ │ │ │ ├── hashtag.xml
│ │ │ │ ├── search.xml
│ │ │ │ ├── person_fill.xml
│ │ │ │ ├── clock.xml
│ │ │ │ ├── ic_person_fill.xml
│ │ │ │ ├── add_circle.xml
│ │ │ │ ├── collection.xml
│ │ │ │ ├── home.xml
│ │ │ │ ├── fail.xml
│ │ │ │ ├── sort_type.xml
│ │ │ │ ├── person.xml
│ │ │ │ ├── apps.xml
│ │ │ │ ├── edit.xml
│ │ │ │ ├── google.xml
│ │ │ │ ├── notification_fill.xml
│ │ │ │ ├── mention.xml
│ │ │ │ ├── show.xml
│ │ │ │ ├── notification.xml
│ │ │ │ ├── finder.xml
│ │ │ │ ├── finder_fill.xml
│ │ │ │ ├── person_multiple.xml
│ │ │ │ ├── settings.xml
│ │ │ │ └── pokemon.xml
│ │ └── build.gradle
│ └── api
│ │ ├── src
│ │ └── main
│ │ │ └── kotlin
│ │ │ └── com
│ │ │ └── dropbox
│ │ │ └── forester
│ │ │ └── android
│ │ │ └── api
│ │ │ ├── entity
│ │ │ ├── user.kt
│ │ │ ├── machine.kt
│ │ │ ├── encounter.kt
│ │ │ ├── contest.kt
│ │ │ ├── berry.kt
│ │ │ ├── evolution.kt
│ │ │ ├── game.kt
│ │ │ ├── location.kt
│ │ │ ├── item.kt
│ │ │ ├── resource.kt
│ │ │ ├── misc.kt
│ │ │ ├── move.kt
│ │ │ └── pokemon.kt
│ │ │ ├── RequestResult.kt
│ │ │ └── PokeApi.kt
│ │ ├── build.gradle
│ │ └── impl
│ │ ├── build.gradle
│ │ └── src
│ │ └── main
│ │ └── kotlin
│ │ └── com
│ │ └── dropbox
│ │ └── forester
│ │ └── android
│ │ └── api
│ │ └── RealPokeApi.kt
├── common
│ ├── scoping
│ │ ├── src
│ │ │ └── main
│ │ │ │ ├── AndroidManifest.xml
│ │ │ │ └── kotlin
│ │ │ │ └── com
│ │ │ │ └── dropbox
│ │ │ │ └── forester
│ │ │ │ └── android
│ │ │ │ └── scoping
│ │ │ │ ├── AppScope.kt
│ │ │ │ ├── UserScope.kt
│ │ │ │ ├── ComponentHolder.kt
│ │ │ │ ├── UserDependencies.kt
│ │ │ │ ├── SingleIn.kt
│ │ │ │ └── binding.kt
│ │ └── build.gradle
│ └── repository_utils
│ │ └── build.gradle
├── app
│ ├── src
│ │ └── main
│ │ │ ├── res
│ │ │ ├── mipmap-hdpi
│ │ │ │ └── pokemon.webp
│ │ │ ├── mipmap-anydpi-v26
│ │ │ │ └── ic_launcher.xml
│ │ │ └── values
│ │ │ │ ├── colors.xml
│ │ │ │ └── theme.xml
│ │ │ ├── kotlin
│ │ │ └── com
│ │ │ │ └── dropbox
│ │ │ │ └── forester
│ │ │ │ └── android
│ │ │ │ └── app
│ │ │ │ ├── navigation
│ │ │ │ ├── BottomTabs.kt
│ │ │ │ ├── Routing.kt
│ │ │ │ └── Screen.kt
│ │ │ │ ├── wiring
│ │ │ │ ├── AppDependencies.kt
│ │ │ │ ├── AppComponent.kt
│ │ │ │ ├── UserComponent.kt
│ │ │ │ └── AppModule.kt
│ │ │ │ ├── ui
│ │ │ │ ├── PokedexScaffold.kt
│ │ │ │ └── PokedexBottomBar.kt
│ │ │ │ ├── PokedexMainActivity.kt
│ │ │ │ └── PokedexApp.kt
│ │ │ └── AndroidManifest.xml
│ └── build.gradle
└── feat
│ ├── pokedex_tab
│ ├── src
│ │ └── main
│ │ │ ├── res
│ │ │ ├── drawable
│ │ │ │ ├── pin.webp
│ │ │ │ ├── bolt.webp
│ │ │ │ ├── helix.webp
│ │ │ │ └── pokeball.webp
│ │ │ └── raw
│ │ │ │ └── pokeball_loading.json
│ │ │ └── kotlin
│ │ │ └── com
│ │ │ └── dropbox
│ │ │ └── forester
│ │ │ └── android
│ │ │ └── feat
│ │ │ └── pokedex_tab
│ │ │ ├── PokedexRepository.kt
│ │ │ ├── PokedexBindings.kt
│ │ │ ├── PokedexState.kt
│ │ │ ├── PokedexComponent.kt
│ │ │ ├── RealPokedexRepository.kt
│ │ │ ├── PokedexViewModel.kt
│ │ │ ├── Search.kt
│ │ │ ├── Tile.kt
│ │ │ ├── Tiles.kt
│ │ │ └── PokedexTab.kt
│ └── build.gradle
│ └── account_tab
│ ├── build.gradle
│ └── src
│ └── main
│ └── kotlin
│ └── com
│ └── dropbox
│ └── forester
│ └── android
│ └── feat
│ └── account_tab
│ └── AccountTab.kt
├── forester
├── gradle.properties
├── src
│ └── main
│ │ └── kotlin
│ │ └── com
│ │ └── dropbox
│ │ └── forester
│ │ ├── Scope.kt
│ │ ├── Forest.kt
│ │ ├── Graph.kt
│ │ ├── Directed.kt
│ │ ├── Undirected.kt
│ │ ├── Node.kt
│ │ ├── Shape.kt
│ │ └── Forester.kt
└── build.gradle.kts
├── .github
├── images
│ ├── sample_class.png
│ ├── sample_overview.png
│ └── mapping_out_the_forest.png
└── workflows
│ └── publish.yml
├── gradle
├── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
└── libs.versions.toml
├── forester-gradle-plugin
├── gradle.properties
├── src
│ └── main
│ │ └── kotlin
│ │ └── com
│ │ └── dropbox
│ │ └── forester
│ │ └── plugin
│ │ ├── ForesterPluginExt.kt
│ │ ├── ForesterAnnotation.kt
│ │ ├── ForesterAnnotationVisitor.kt
│ │ ├── ForesterClassVisitor.kt
│ │ └── ForesterPlugin.kt
└── build.gradle.kts
├── forester-graph-plugin
├── src
│ └── main
│ │ └── kotlin
│ │ └── com
│ │ └── dropbox
│ │ └── forester
│ │ └── dagger
│ │ ├── Node.kt
│ │ ├── Graph.kt
│ │ ├── Dependency.kt
│ │ ├── Component.kt
│ │ ├── Binding.kt
│ │ └── ForesterGraphPlugin.kt
└── build.gradle.kts
├── local.properties
├── .gitignore
├── settings.gradle.kts
├── gradle.properties
├── README.md
├── gradlew.bat
└── gradlew
/android/lib/dig/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/forester/gradle.properties:
--------------------------------------------------------------------------------
1 | POM_NAME=com.dropbox.forester
2 | POM_ARTIFACT_ID=forester
3 | POM_PACKAGING=jar
--------------------------------------------------------------------------------
/android/common/scoping/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.github/images/sample_class.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dropbox/forester/main/.github/images/sample_class.png
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dropbox/forester/main/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/.github/images/sample_overview.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dropbox/forester/main/.github/images/sample_overview.png
--------------------------------------------------------------------------------
/.github/images/mapping_out_the_forest.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dropbox/forester/main/.github/images/mapping_out_the_forest.png
--------------------------------------------------------------------------------
/forester-gradle-plugin/gradle.properties:
--------------------------------------------------------------------------------
1 | POM_NAME=com.dropbox.forester
2 | POM_ARTIFACT_ID=forester-gradle-plugin
3 | POM_PACKAGING=jar
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/pokemon.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dropbox/forester/main/android/app/src/main/res/mipmap-hdpi/pokemon.webp
--------------------------------------------------------------------------------
/android/feat/pokedex_tab/src/main/res/drawable/pin.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dropbox/forester/main/android/feat/pokedex_tab/src/main/res/drawable/pin.webp
--------------------------------------------------------------------------------
/android/feat/pokedex_tab/src/main/res/drawable/bolt.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dropbox/forester/main/android/feat/pokedex_tab/src/main/res/drawable/bolt.webp
--------------------------------------------------------------------------------
/android/feat/pokedex_tab/src/main/res/drawable/helix.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dropbox/forester/main/android/feat/pokedex_tab/src/main/res/drawable/helix.webp
--------------------------------------------------------------------------------
/android/feat/pokedex_tab/src/main/res/drawable/pokeball.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dropbox/forester/main/android/feat/pokedex_tab/src/main/res/drawable/pokeball.webp
--------------------------------------------------------------------------------
/forester/src/main/kotlin/com/dropbox/forester/Scope.kt:
--------------------------------------------------------------------------------
1 | package com.dropbox.forester
2 |
3 |
4 | interface Group
5 |
6 | interface Scope {
7 | val groups: List
8 | }
--------------------------------------------------------------------------------
/forester/src/main/kotlin/com/dropbox/forester/Forest.kt:
--------------------------------------------------------------------------------
1 | package com.dropbox.forester
2 |
3 | @MustBeDocumented
4 | @Retention(AnnotationRetention.RUNTIME)
5 | annotation class Forest
--------------------------------------------------------------------------------
/forester/src/main/kotlin/com/dropbox/forester/Graph.kt:
--------------------------------------------------------------------------------
1 | package com.dropbox.forester
2 |
3 | @MustBeDocumented
4 | @Retention(AnnotationRetention.RUNTIME)
5 | annotation class Graph
--------------------------------------------------------------------------------
/android/common/scoping/src/main/kotlin/com/dropbox/forester/android/scoping/AppScope.kt:
--------------------------------------------------------------------------------
1 | package com.dropbox.forester.android.scoping
2 |
3 | abstract class AppScope private constructor()
4 |
--------------------------------------------------------------------------------
/android/common/scoping/src/main/kotlin/com/dropbox/forester/android/scoping/UserScope.kt:
--------------------------------------------------------------------------------
1 | package com.dropbox.forester.android.scoping
2 |
3 | abstract class UserScope private constructor()
4 |
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/com/dropbox/forester/android/app/navigation/BottomTabs.kt:
--------------------------------------------------------------------------------
1 | package com.dropbox.forester.android.app.navigation
2 |
3 | val BottomTabs = listOf(Screen.Home, Screen.Account)
4 |
--------------------------------------------------------------------------------
/android/common/scoping/src/main/kotlin/com/dropbox/forester/android/scoping/ComponentHolder.kt:
--------------------------------------------------------------------------------
1 | package com.dropbox.forester.android.scoping
2 |
3 | interface ComponentHolder {
4 | val component: Any
5 | }
--------------------------------------------------------------------------------
/forester-graph-plugin/src/main/kotlin/com/dropbox/forester/dagger/Node.kt:
--------------------------------------------------------------------------------
1 | package com.dropbox.forester.dagger
2 |
3 | import kotlinx.serialization.Serializable
4 |
5 | @Serializable
6 | sealed class Node
7 |
--------------------------------------------------------------------------------
/android/lib/dig/src/main/kotlin/com/dropbox/forester/android/dig/DigTypography.kt:
--------------------------------------------------------------------------------
1 | package com.dropbox.forester.android.dig
2 |
3 | import androidx.compose.material.Typography
4 |
5 | val DigTypography = Typography()
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionBase=GRADLE_USER_HOME
2 | distributionPath=wrapper/dists
3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 |
--------------------------------------------------------------------------------
/forester-graph-plugin/src/main/kotlin/com/dropbox/forester/dagger/Graph.kt:
--------------------------------------------------------------------------------
1 | package com.dropbox.forester.dagger
2 |
3 | import kotlinx.serialization.Serializable
4 |
5 | @Serializable
6 | data class Graph(
7 | val name: String,
8 | val nodes: List
9 | )
--------------------------------------------------------------------------------
/forester/src/main/kotlin/com/dropbox/forester/Directed.kt:
--------------------------------------------------------------------------------
1 | package com.dropbox.forester
2 |
3 | import kotlin.reflect.KClass
4 |
5 | @MustBeDocumented
6 | @Retention(AnnotationRetention.RUNTIME)
7 | annotation class Directed(
8 | val nodes: Array>
9 | )
--------------------------------------------------------------------------------
/android/common/scoping/src/main/kotlin/com/dropbox/forester/android/scoping/UserDependencies.kt:
--------------------------------------------------------------------------------
1 | package com.dropbox.forester.android.scoping
2 |
3 | import com.squareup.anvil.annotations.ContributesTo
4 |
5 | @ContributesTo(UserScope::class)
6 | interface UserDependencies
--------------------------------------------------------------------------------
/forester/src/main/kotlin/com/dropbox/forester/Undirected.kt:
--------------------------------------------------------------------------------
1 | package com.dropbox.forester
2 |
3 | import kotlin.reflect.KClass
4 |
5 | @MustBeDocumented
6 | @Retention(AnnotationRetention.RUNTIME)
7 | annotation class Undirected(
8 | val nodes: Array>
9 | )
--------------------------------------------------------------------------------
/android/common/scoping/src/main/kotlin/com/dropbox/forester/android/scoping/SingleIn.kt:
--------------------------------------------------------------------------------
1 | package com.dropbox.forester.android.scoping
2 |
3 | import javax.inject.Scope
4 | import kotlin.reflect.KClass
5 |
6 | @Scope
7 | @Retention(AnnotationRetention.RUNTIME)
8 | annotation class SingleIn(val scope: KClass<*>)
--------------------------------------------------------------------------------
/forester-graph-plugin/src/main/kotlin/com/dropbox/forester/dagger/Dependency.kt:
--------------------------------------------------------------------------------
1 | package com.dropbox.forester.dagger
2 |
3 | import kotlinx.serialization.Serializable
4 |
5 | @Serializable
6 | data class Dependency(
7 | val key: String,
8 | val kind: String,
9 | val element: String?
10 | )
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/com/dropbox/forester/android/app/wiring/AppDependencies.kt:
--------------------------------------------------------------------------------
1 | package com.dropbox.forester.android.app.wiring
2 |
3 |
4 | import com.dropbox.forester.android.scoping.AppScope
5 | import com.squareup.anvil.annotations.ContributesTo
6 |
7 | @ContributesTo(AppScope::class)
8 | interface AppDependencies
--------------------------------------------------------------------------------
/forester-gradle-plugin/src/main/kotlin/com/dropbox/forester/plugin/ForesterPluginExt.kt:
--------------------------------------------------------------------------------
1 | package com.dropbox.forester.plugin
2 |
3 | import org.gradle.api.tasks.Input
4 |
5 | open class ForesterPluginExt {
6 |
7 | @Input
8 | var outputDir: String? = null
9 |
10 | @Input
11 | var update: Boolean = false
12 | }
--------------------------------------------------------------------------------
/forester/src/main/kotlin/com/dropbox/forester/Node.kt:
--------------------------------------------------------------------------------
1 | package com.dropbox.forester
2 |
3 | import kotlin.reflect.KClass
4 |
5 |
6 | @MustBeDocumented
7 | @Retention(AnnotationRetention.RUNTIME)
8 | annotation class Node(
9 | val scopes: Array> = [],
10 | val shape: Shape = Shape.Rectangle
11 | )
12 |
--------------------------------------------------------------------------------
/android/lib/api/src/main/kotlin/com/dropbox/forester/android/api/entity/user.kt:
--------------------------------------------------------------------------------
1 | package com.dropbox.forester.android.api.entity
2 |
3 | import kotlinx.serialization.Serializable
4 |
5 | @Serializable
6 | data class User(
7 | val id: String,
8 | val name: String,
9 | val email: String,
10 | val avatarUrl: String
11 | )
--------------------------------------------------------------------------------
/android/lib/api/src/main/kotlin/com/dropbox/forester/android/api/entity/machine.kt:
--------------------------------------------------------------------------------
1 | package com.dropbox.forester.android.api.entity
2 |
3 | import kotlinx.serialization.Serializable
4 |
5 | @Serializable
6 | data class Machine(
7 | val id: Int,
8 | val item: NamedApiResource,
9 | val move: NamedApiResource,
10 | val versionGroup: NamedApiResource
11 | )
--------------------------------------------------------------------------------
/android/feat/pokedex_tab/src/main/kotlin/com/dropbox/forester/android/feat/pokedex_tab/PokedexRepository.kt:
--------------------------------------------------------------------------------
1 | package com.dropbox.forester.android.feat.pokedex_tab
2 |
3 | import com.dropbox.forester.android.api.RequestResult
4 | import com.dropbox.forester.android.api.entity.Pokemon
5 |
6 | interface PokedexRepository {
7 | suspend fun getPokemon(id: Int): RequestResult
8 | }
--------------------------------------------------------------------------------
/android/common/repository_utils/build.gradle:
--------------------------------------------------------------------------------
1 | plugins {
2 | id("com.android.library")
3 | id("org.jetbrains.kotlin.android")
4 | }
5 |
6 | android {
7 | defaultConfig {
8 | minSdk = 27
9 | }
10 | compileSdk = 33
11 | compileSdkVersion = "android-33"
12 | namespace = "com.dropbox.forester.android.repository_utils"
13 | }
14 |
15 | dependencies {
16 | }
--------------------------------------------------------------------------------
/local.properties:
--------------------------------------------------------------------------------
1 | ## This file must *NOT* be checked into Version Control Systems,
2 | # as it contains information specific to your local configuration.
3 | #
4 | # Location of the SDK. This is only used by Gradle.
5 | # For customization when using a Version Control System, please read the
6 | # header note.
7 | #Sat Apr 01 15:13:34 EDT 2023
8 | sdk.dir=/Users/mramotar/Library/Android/sdk
9 |
--------------------------------------------------------------------------------
/android/feat/pokedex_tab/src/main/kotlin/com/dropbox/forester/android/feat/pokedex_tab/PokedexBindings.kt:
--------------------------------------------------------------------------------
1 | package com.dropbox.forester.android.feat.pokedex_tab
2 |
3 | import com.dropbox.forester.android.scoping.UserScope
4 | import com.squareup.anvil.annotations.ContributesTo
5 |
6 | @ContributesTo(UserScope::class)
7 | interface PokedexBindings {
8 | fun inject(viewModel: PokedexViewModel)
9 | }
--------------------------------------------------------------------------------
/android/lib/api/src/main/kotlin/com/dropbox/forester/android/api/RequestResult.kt:
--------------------------------------------------------------------------------
1 | package com.dropbox.forester.android.api
2 |
3 | sealed class RequestResult {
4 | data class Success