AI prompts
base on # Poke.dex
So one day, I saw someone post their [Jetpack Compose pokedex app](https://github.com/skydoves/pokedex-compose) on /r/androiddev on Reddit as supposedly following the current "best practices" around Android app development. I took it as a challenge to build the same thing, but **ignoring** all the things that Google recommends on this particular season and/or that I might be required to like if I cared about the labor market.
<img src="/images/screenshots.jpg"/>
## Download
Go to [releases](https://github.com/grishka/poke.dex/releases/latest) to download the latest apk.
## Tech stack & open-source libraries
- Minimum SDK level is 21 (Android 5.0).
- Java 17 based, utilizing [Runnable](https://developer.android.com/reference/java/lang/Runnable)s posted to [HandlerThread](https://developer.android.com/reference/android/os/HandlerThread)s and back to the main thread for asynchronous operations.
- Jetpack libraries:
- None really.
- There are RecyclerView and SwipeRefreshLayout from [LiteX](https://github.com/grishka/LiteX), my de-appcompat-ified fork of several AndroidX libraries.
- AndroidX and Jetpack aren't the same thing, are they? Or is AndroidX part of Jetpack?
- Architecture:
- Something MVC-ish I guess? I don't really like following patterns for the sake of following patterns.
- I do sometimes end up with a pattern in my code by pure coincidence because that ends up being the most optimal way of solving the task at hand.
- [OkHttp3](https://github.com/square/okhttp/tree/okhttp_3.14.x) for networking.
- [Appkit](https://github.com/grishka/appkit) for some boilerplate and an image loader.
- [Gson](https://github.com/google/gson) for JSON parsing.
- [Parceler](https://github.com/johncarl81/parceler) for one (1) class that I needed to be parcelable.
- Yes it's overkill in this particular case. But then I used Parceler in another project and I liked it (I used an Android Studio plugin to generate parcelables before that). And I want to show off my Android stack to contrast it with the "best practice" one anyway.
- Android's built-in SQLite for caching.
- No fancy abstraction libraries on top of it. It's `Cursor`s all the way down!
## Open API
Poke.dex uses the [PokeAPI](https://pokeapi.co/) to retrieve the Pokémon data.
## FAQ
#### Is this project serious?
Absolutely. This is more-or-less how I've been doing Android apps for around 10 years, including ones used by millions of people.
#### Have you tried { technology.name }?
Probably not. I'm not very open to innovation in programming because most of the current "innovations" involve piling ever more abstraction layers on top of each other for no other benefit than to say "my code looks beautiful" or "this project can be worked on even by most junior of developers who need not understand the abstraction layers beneath the topmost one".
I do like where Java is going though, hence Java 17.
", Assign "at most 3 tags" to the expected json: {"id":"9412","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"