#microPebble - open source Pebble Android app
1507 messages · Page 2 of 2 (latest)
No, I think it's a very valid concern. I'll try reworking the UI a little more and see where I can get
why would you want it as MutableState?
So I can set it from the UI too
Please expose function that sets it then.
I think behind the screnes it uses null for something else
Is it equivalent to saved { MutableStateFlow... }?
no, that will crash, because MutableStateFlow is not parcelable
hm, then how should I represent nulls?
can you give it a non-null value that would signify default value?
No, they're either serialization objects from the API or are types from libpebble
@Parcelize
data class NullWrapper<T>(val value: T?): Parcelable
😅
Darn okay I guess I'm doing that then
Ended up doing
class ValueWrapper<T>(val value: T, private val serializer: KSerializer<T>) : Parcelable {
override fun describeContents() = 0
override fun writeToParcel(dest: Parcel, flags: Int) {
dest.writeString(Json.encodeToString(serializer, value))
}
}
inline fun <reified T> T.wrapValue() = ValueWrapper(this, Json.serializersModule.serializer<T>())
which I think should be right
This merge request needs to be merged: https://gitlab.com/muhammad23012009/rockwork/-/merge_requests/4
You can use my APKBUILD in the meantime: https://git.allpurposem.at/mat/rockwork-apkbuild/src/branch/main/APKBUILD
There is also a Nix devShell you can use to build it.
Happy to discuss further but we should move out of the microPebble room :)
This merge request brings work done on @xelageo's fork https://gitlab.com/xelageo/rockwork/-/tree/wip/alex/desktop-support?ref_type=heads and rebases it on top of...
moby thanks! I will give it a try
The proposed time to meet with Intent is <t:1770192000:F> , is this ok for any/all of @undone valve @coral drift cc: @daring loom ?
yes
What's the meeting topic?
Planning the next arc of work around having them Compose-MP-ize things and making the Compose-MP branch become the main branch -- and figuring out how to handle that in parallel with you doing other UI / feature work
I will ACK that timeslot since at least two of us can join
What timezone is this? Or does the discord always show local timezones in this?
It's a timezone widget, it always shows you the time in the local zone
Times Are Hard™
then I think I will be able to make it
I think even more topical is this classic by Tom Scott: https://www.youtube.com/watch?v=-5wpm-gesOY
A web app that works out how many seconds ago something happened. How hard can coding that be? Tom Scott explains how time twists and turns like a twisty-turny thing. It's not to be trifled with!
A Universe of Triangles: http://www.youtube.com/watch?v=KdyvizaygyY
LZ Compression in Text: http://www.youtube.com/watch?v=goOa3DGezUA
Characters, Sym...
I like the Kotlin talks though
Also I guess I will try to be at the meeting if only to listen
can you DM me e-mail addresses that you would like me to add?
I will forward the invite
what's the reality of texting from pebble through micropebble?
What exactly do you mean by "texting"? 😄
sending SMS via phone numbers
I know it's not cool outside of US but
that's how a lot of people communicate here
(I'm only concerned about Android)
like, currently, I can still use the Send Text app on the old pebble app
I kinda think that this might be better served by the 3rd party app?
Oh, is the Send Text native firwmare thing?
Basically
It's Pebble app pretty sure
and they had to do trickery to get it to work
I personally will not implement this, but the PRs are welcome 🙂
all good - just curious
@undone valve How's this for passing state to screens with a saved flow? I think it's similar to what's done elsewhere
```kt
@Stable
data class AppstoreScreenState(
val appstoreSource: AppstoreSource? = null,
val selectedTab: ApplicationType = ApplicationType.Watchface,
val platformFilter: WatchType? = null,
val searchQuery: String = "",
) : Parcelable {
override fun describeContents() = 0
override fun writeToParcel(dest: Parcel, flags: Int) = dest.writeString(Json.encodeToString(this))
companion object CREATOR : Parcelable.Creator<AppstoreScreenState> {
override fun createFromParcel(source: Parcel?) =
runCatching { source?.readString()?.let { Json.decodeFromString<AppstoreScreenState>(it) } }.getOrNull()
override fun newArray(size: Int) = arrayOfNulls<AppstoreScreenState?>(size)
}
}
private val _state by savedFlow { AppstoreScreenState() }
val state: StateFlow<AppstoreScreenState> = _state
do we need runCatching there?
It potentially hides bugs
otherwise LGTM. Not thrilled about json decoding in parcelables, but it's probably the best we can do (ideally there should have been separate parcelable UI models that are mapped from the DTO models, but let's not go that way)
I think I should be safe to remove it, because the state isn't being persisted long-term to disk, but it seemed safer that way
I'm not really sure how to fix the compiler warning errors generated by the linter github action
Also, why is it reporting a bunch of definitely reachable code as unreachable? The IDE doesn't give any warnings for it
I could pull in the cbor serialization dependency and serialize them to bytes, which might make it a bit more efficient
It appears you inadvertedly updated to the Kotlin 2.3.0, which is not supported yet in this project. To fix, downgrade those:
```
ktor = "3.2.3"
algolia = "3.36.0"
Oh, I was using Ktor 3.4.0 because they added an easy way to write a network stream to a file
Is there a way to do both?
Yeah, we can't use that yet 😐
I wanted to update at some point, but I was waiting for you, otherwise you would get a lot of conflicts
Sounds good
Just copy this function into the project https://github.com/ktorio/ktor/blob/b01069c877aba48406597737d2df1070afc9998c/ktor-io/common/src/io/ktor/utils/io/ByteReadChannelOperations.kt#L180 🙂
True
Now fixed
Huh for some reason opening the merge.sarif file works now
@undone valve I'm getting this linter error:
```
Advice for :appstore:ui
Unused dependencies which should be removed:
api(libs.dispatch)
but I need the lib to exist. Making it an implementation doesn't fix it either
Oh, it might've been wanting me to make something in another module an api and remove that one?
Aha, fixDependencies fixed it
yeah, error messages for that are confusing sometimes. Sometimes you need to apply all suggestions in one go, otherwise it fails
I believe I may have actually fixed all the linter warnings
Time to run the big linter check and see if it fails again
How do I fix these?
```
Execution failed for task ':appstore:ui:debugComposeCompilerCheck'.
New unstable parameters were added in the following @Composables!
FunctionAndParameter(functionName=com, parameterName=key, parameterType=AppstoreCollectionScreenKey)
FunctionAndParameter(functionName=com, parameterName=<this>, parameterType=AppstoreCollectionScreen)
FunctionAndParameter(functionName=com, parameterName=<this>, parameterType=AppstoreCollectionViewModel)
FunctionAndParameter(functionName=com, parameterName=<this>, parameterType=Instant)
FunctionAndParameter(functionName=com, parameterName=key, parameterType=AppstoreDetailsScreenKey)
FunctionAndParameter(functionName=com, parameterName=<this>, parameterType=AppstoreDetailsScreen)
FunctionAndParameter(functionName=com, parameterName=app, parameterType=Application)
FunctionAndParameter(functionName=com, parameterName=appstoreSource, parameterType=AppstoreSource?)
FunctionAndParameter(functionName=com, parameterName=<this>, parameterType=AppstoreScreen)
FunctionAndParameter(functionName=com, parameterName=selectedTab, parameterType=ApplicationType)
FunctionAndParameter(functionName=com, parameterName=selectedSource, parameterType=AppstoreSource?)
FunctionAndParameter(functionName=com, parameterName=appstoreSources, parameterType=List)
FunctionAndParameter(functionName=com, parameterName=source, parameterType=AppstoreSource)
FunctionAndParameter(functionName=com, parameterName=collection, parameterType=AppstoreCollection)
FunctionAndParameter(functionName=com, parameterName=<this>, parameterType=AppstoreSourcesScreen)
FunctionAndParameter(functionName=com, parameterName=listItems, parameterType=List)
FunctionAndParameter(functionName=com, parameterName=source, parameterType=AppstoreSource?)
https://developer.android.com/develop/ui/compose/performance/stability/fix
Most of the fixes probably involve plopping @Immutable annottation on data classes that are the parameters of the Compsoe functions
What about the ones that are for Kotlin types?
Like Uuid and Instant
Add them to the https://github.com/matejdro/microPebble/blob/master/config/global_compose_stable_classes.txt
How do I fix the <this> instance being marked as mutable?
```
FunctionAndParameter(functionName=com, parameterName=<this>, parameterType=AppstoreCollectionScreen)
mark the Screen as @Stable
In other news, I have fixed this little annoyance https://github.com/inovait/kotlinova/commit/7f83604c04fdc67f067f35449bb4faf283a1ec56
Nice!
Do you have any idea what may be causing this crash? It looks like some sort of reflection error in the Bluetooth system
It's a leak somewhere in the Bluetooth system
https://github.com/coredevices/mobileapp/issues/30 I have reported it to Core, but they don't seem rush to fix it
reminder: meeting with Intent tonight
we had what I considered to be a productive meeting, I am writing a few notes into the Discourse thread
Where?
I am writing into the thread that you just briefly posted and then unposted into
Ah okay I didn't see it there so I was wondering if I had posted it to the wrong place
yeah, I'm still typing
this is the part where I wish I had a transcript to refer to, or I wish that I had a quieter keyboard so I could take notes while we talked
I thought Zoom auto-generates one?
If not and you can download the video, you could use Whisper or something to transcribe it
I think it does for the owner of the meeting, but that was them
certainly Google Meet can, and can feed the whole thing into an LLM if you have that feature turned on
https://forum.rebble.io/t/micropebble-and-its-future/575/9 meeting summary
We met with Intent this {morning,evening}. On the call: Intent: Filip (business development side), Matteo (eng lead) Rebble: @joshua, @hellcp, @matejdro , @fishy We chatted about: Phases of work that could happen next, with varying levels of Intent involvement: Phase 1: iOS bringup completion Completing Intent microPebble POC and product...
This is awesome!
The best diff ever
Also for some reason this is using the wrong icon and I don't know why
Could there be a different icon with the same name in the different module? And it gets overwritten.
Oh, do the icon names need to be unique?
I didn't know that, I'll check for it
In other news, appstore version is out!
(Btw, now you can see, why feat and fix should be used sparingly 😄 )
Nice except it had some annoying errors I needed to fix 😭
Also, how do I use an alias for the plugin version?
add it here
and then use alias(libs.plugins.serialization)
Also, merge in master, so you don't get the failing screenshot tests
I think I have? I synced my master with upstream before creating the branch
hm, weird why does it fail then
I think some of the UI tests were failing
java.lang.AssertionError: Images differ (by 9.383352%) - see details in file:///home/fish/Documents/microPebble/app-screenshot-tests/build/paparazzi/failures/delta-screenshot_Tests1_test[AppstoreDetailsContentPreview].png
I did what it said to merge the new changes but that doesn't seem to have done anything
Hm, it appears my datetime formatting has changed slightly
I think my mistake was using a locale-aware formatter, I should be hard-coding the string for previews
Aha, I think I didn't realize there were 3 different tests. All should work now
Alright I think it should work
Hm, CI still fails but it works fine when I run it locally
There were two issues:
- Date formatter used local date format. And local format on your computer is different than the one on the server, so the screenshots did not match
- You always used system default timezone when formatting the date. And system default timezone on your computer is different than the one on the server, so the screenshots did not match
I have pushed the fix (now preview provides static formatter locale and static timezone), hopefully it goes through now 🤞
Awesome, thanks
java.time.DateTimeException: Field Year cannot be printed as the value -100001 exceeds the maximum print width of 4
at java.time.format.DateTimeFormatterBuilder$NumberPrinterParser.format(DateTimeFormatterBuilder.java:2806)
at java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2437)
at java.time.format.DateTimeFormatter.formatTo(DateTimeFormatter.java:1847)
at java.time.format.DateTimeFormatter.format(DateTimeFormatter.java:1821)
at java.time.OffsetDateTime.format(OffsetDateTime.java:1674)
at com.matejdro.micropebble.appstore.api.serializer.PebbleAPIInstantSerializer.serialize(PebbleAPIInstantSerializer.kt:50)
at com.matejdro.micropebble.appstore.api.serializer.PebbleAPIInstantSerializer.serialize(PebbleAPIInstantSerializer.kt:45)
at kotlinx.serialization.json.internal.StreamingJsonEncoder.encodeSerializableValue(StreamingJsonEncoder.kt:259)
at kotlinx.serialization.encoding.AbstractEncoder.encodeSerializableElement(AbstractEncoder.kt:80)
at com.matejdro.micropebble.appstore.api.store.application.Application.write$Self$api(Application.kt:12)
at com.matejdro.micropebble.appstore.api.store.application.Application$$serializer.serialize(Application.kt:12)
at
Are wr using Instant.MIN somewhere? 😂
Oh hey I got that error too! Couldn't repro it though
Oh yeah I get it randomly too
I think it's the default for something, but I don't remember what
Now AppstoreHomepagePreview is breaking, because order of the apps is different 🤔
This IS hardcoded, right?
I don't remember, it might not be
I'll fix it in a bit, currently trying to fix up a PR to Godot
Oh actually this should be a very easy fix
I just need to use the default Instant serializer on serialization, and add it as a deserializer
Will put these together soon™
What's yours at
Or do I not want to know
Anyway my navigate to library definition mysteriously stopped working so I'm deleting the folder to see if that fixes it
😅
It still doesn't work 😢
Trying the repair IDE thing
Huh, invalidating caches fixed it
Neat
It now autogenerates a random set of apps instead of getting API data 😅
No, it shouldn't autogenerate it
unless it's from static seed
otherwsie, every screenshot will be different again
It is from a static seed
ah great then 👍
Also, any idea what the different colors mean? Both are composables
I have, I didn't see anything
Only the green color I think
Oh it's just the generic dsl style1 color
PR opened
I'm starting work on the RWS interface, I might have a baseline implementation soon™
Hm would it make sense to start in the KMP version? So they will not have to port as much
I'm not sure what you mean
At some point, we will migrate to the KMP microPebble version, right? All code added to the Android version will have to be migrated. So it would make sense to start working there instead of in the Android version.
However, I'm not sure if it's far enough yet that you can actually do that.
I hope you end up using cobble boot endpoints
I am willing to help out a bit with this if you need anything
Are those not the same as the normal ones? Like https://appstore-api.rebble.io/api/v1/locker
they are
boot is used mostly as a way to allow us to change endpoints without having to release new app version
mind you, cobble config is a bit limited
like I assume you would want to get the locker part of this https://github.com/pebble-dev/rebble-boot/blob/master/boot/stage2.py
boot.rebble.io. Contribute to pebble-dev/rebble-boot development by creating an account on GitHub.
still the existing config should be useful for oauth, right?
also a part of boot is handling pebble://custom-boot-config-url/ urls
that is followed by an encoded url, like https://boot.rebble.io/api/cobble/ from above
(and that's likely a good default)
but the expectation from the boot process is that you will save the last used boot url, or use the default one
and then after you receive the boot json from that url, you will use it to set the endpoints around the app from that file
(and the original pebble app refreshed boot every 24h, but I think that's not necessary for the statt)
I poked the Intent folks to see when they'll be able to start phase-next
otherwise I'm going to have to learn Kotlin, and as I explained on the call, 'an electrical engineer can write verilog in any language'
nobody wants that
That sounds like a bad time for everyone involved
I think you could definitely write a Verilog DSL for Kotlin
It's gotta be possible
... so, if that's what you want...
yeah, actually, it seems like people do DSLs in Kotlin regularly
like Compose feels like a DSL
and I am spending my day today writing Migen (which is a Python frontend for Verilog)
Compose is a DSL for Kotlin
Plus some compiler plugin magic to track state changes in MutableState<T>
I guess there is a vague line around 'what is a DSL and what is just using a language' somewhere
maybe my personal fuzzy line is 'when things that are actually function calls stop looking like function calls' or something
@coral drift Do you know how long the tokens take to expire?
Nevermind, found out they refresh in 10 years as per https://github.com/pebble-dev/rebble-auth-py
Well, just in time for the second Pebble revival
It's a little fixed but not much
Hm, so voice replies setting. Is there a way to toggle this from microPebble?
"Enable voice in the settings page of the Pebble app" is displayed when I try to select voice for a reply
Also, latest version now slams me with crashlogs if I disconnect my Pebble
App version: 1.4.1 (150)
java.lang.RuntimeException: Unable to create service com.materjdro.micropebble.voice.VoicePermissionService
at android.app.ActivityThread.handleCreateService(ActivityThread.java:5590)
at android.app.ActivityThread.-$$Nest$mhandleCreateService(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2742)
at android.os.Handler.dispatchMessage(Handler.java:132)
at android.os.Looper.dispatchMessage(Looper.java:333)
at android.os.Looper.loopOnce(Looper.java:263)
at android.os.Looper.loop(Looper.java:367)
at android.app.ActivityThread.main(ActivityThread.java:9331)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:566)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:837)
Caused by: java.lang.SecurityException: Starting FGS with type microphone callerApp=ProcessRecord{5ef5e21 18987:com.matejdro.micropebble/u0a265} targetSDK=34 requires permissions: all of the permissions allOf=true [android.permission.FOREGROUND_SERVICE_MICROPHONE] any of the permissions allOf=false [android.permission.CAPTURE_AUDIO_HOTWORD, android.permission.CAPTURE_AUDIO_OUTPUT, android.permission.CAPTURE_MEDIA_OUTPUT, android.permission.CAPTURE_TUNER_AUDIO_INPUT, android.permission.CAPTURE_VOICE_COMMUNICATION_OUTPUT, android.permission.RECORD_AUDIO] and the app must be in the eligible state/exemptions to access the foreground only permission
at android.os.Parcel.createExceptionOrNull(Parcel.java:3382)
at android.os.Parcel.createException(Parcel.java:3366)
at android.os.Parcel.readException(Parcel.java:3342)
at android.os.Parcel.readException(Parcel.java:3284)
at android.app.IActivityManager$Stub$Proxy.setServiceForeground(IActivityManager.java:7512)
at android.app.Service.startForeground(Service.java:878)
Do you have voice permission?
Sigh, will look into it
I have Microphone permission enabled for microPebble
But seems something needs to be set on the Pebble itself?
No, it's only companion app depending
BTW I am that guy using GrapheneOS, so an outlier
can you send me logs of one such instance where you get this error?
Sure let me try and repro it tomorrow
No need for logs. I've pushed now an entirely new approach to attempt to fix this issue. Unfortunately, now user has to manually tap on the "Enable Voice" button after every phone/app restart.
How often does the GH actions bot for releases run?
Once per day (every morning CEST time)
It just ran
ta
short for thanks ?
ah, I'm used to ty 😄
got mail back from Intent (and also posted in forum thread):
Thank you for your patience, wanted to share a transparent update on the Rebble timeline and our proposed path forward.
To deliver the project in the setup you're expecting, we would want to staff the work with someone who has strong Kotlin Multiplatform skills and understands OSS.
We won't have the Kotlin Multiplatform capacity until June. If you’re comfortable waiting, we’d recommend planning around a June kickoff (and we will pull it forward to May if capacity frees up earlier).
If the May/June timing works for you, we can hold the slot and propose a short alignment call to confirm scope and kickoff logistics.
so that's later than we wanted but if matejdro is already going to replace the navigation with the more modern thing that works on KMP, then that seems to get us to the point where your local iOS-running electrical engineer can integrate the KMP parts to actually make it run on iOS
it might make sense to work on some of this ourselves then, that is a lot of time and merging this back cannot be that difficult overall
right
well, the big 'merge back' problem was that they rewrote a bunch of pages to use a new navigation framework
for reasons I did not understand
and I am now understanding that the reason is 'the other navigation framework does not work on KMP'
and I think matejdro (in the forum) mentioned he plans to make that change anyway, which means that it's very possible that my small python and verilog brain can glue that to their iOS changes
the moment I start thinking about how much work rws integration is, I don't even want to touch it
we should figure out all of the endpoints that should be available without auth at some point
(Local iOS-running software engineer who specifically has a lot of Kotlin Multiplatform experience here)
I forget what MicroPebble uses right now, but the KMP navigation actually seems really nice and easy so far (I'm building an unrelated app in my own time and have just started on making the UI)
I never want to put the too-many-th-cook in the kitchen and don’t really follow where this project is right now but if there’s a list of “get to Kotlin Multiplatform” tasks already known I wonder if it’d be worth just opening as issues or a GitHub project no one understands how to use
GitHub Projects are annoying. They're attached to repos but not integrated in a way that makes them useful
They aren't attached to repos, they're per-user or per-organization
Well yes that's what makes them annoying to use. You can get to a Project from a repo but you can't go the other way
I still get that weird spinner spinning around my screen while loading sometimes
dont u mean throbber
As it should be
Thank you doctor, goodbye
Yeah, this will be fixed over the weekend hopefully
The big update is complete. I hope I did not break too many things. Most dependencies should be latest now and navigation should, at least in theory, be KMP-compatible.
For anyone adventurous familiar with the iOS and the KMP, I would suggest something like this:
- Convert
common-navigationmodule to multiplatform - this should be fairly trivial, I don't think there are any classes not compatible with common kotlin code there - Convert
homemodule to multiplatform - keep theHomeScreenin common, move everything else toandroidMainfor now - Make a barebones iOS version of the
appmodule (maybe namediosApp?) that only initializes the navigation system and shows theHomeScreen - Create dummy
WatchListScreen,WatchappListScreen,NotificationAppListScreenandToolsScreenclasses insideiosApp- make them a solid color or something - Now the home screen & tab switcing should be working on both Android and iOS
- We can continue migrating piece-by-piece from here (ideally also reusing as much existing iOS code from Intent fork as possible)
I do not have a mac or an iOS device, so I cannot do any of these, but I'm available for assistance with any step (as long as it's not iOS-specific as I know next to nothing about that OS or its development).
Is anyone else having issues with dev connection? I'm getting
Exception in thread PebbleConnection:
Traceback (most recent call last):
File "/home/flynn/.local/share/uv/python/cpython-3.13.11-linux-x86_64-gnu/lib/python3.13/threading.py", line 1044, in _bootstrap_inner
self.run()
~~~~~~~~^^
File "/home/flynn/.local/share/uv/python/cpython-3.13.11-linux-x86_64-gnu/lib/python3.13/threading.py", line 995, in run
self._target(*self._args, **self._kwargs)
~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/flynn/.local/share/uv/tools/pebble-tool/lib/python3.13/site-packages/libpebble2/communication/__init__.py", line 88, in run_sync
self.pump_reader()
~~~~~~~~~~~~~~~~^^
File "/home/flynn/.local/share/uv/tools/pebble-tool/lib/python3.13/site-packages/libpebble2/communication/__init__.py", line 73, in pump_reader
origin, message = self.transport.read_packet()
~~~~~~~~~~~~~~~~~~~~~~~~~~^^
File "/home/flynn/.local/share/uv/tools/pebble-tool/lib/python3.13/site-packages/libpebble2/communication/transports/websocket/__init__.py", line 63, in read_packet
...
WebSocketConnectionClosedException("Connection to remote host was lost.")
websocket._exceptions.WebSocketConnectionClosedException: Connection to remote host was lost.
When I try to install an app. I'm running 4.9.127 firmware on my C2D, running MicroPebble built from main branch with up to date libpebble3
hm is that a regression or it did never work? It worked for me a couple of versions back, but I did not have a chance to use the new one yet
Seems like a regression. It might be port of the SDK though, haven't had the chance to try the old one again, and I've gotten a similar error with the emulator like once or twice
hm, it appears ktor update broke it
will revert for now
For anyone thinking of looking into multiplatform, it turns out the navigation was not 100% compatible yet (it would crash on iOS). I have gotten a coworker familiar with the iOS to help me. We fixed the iOS issue and created a sample on how to create an app module with the navigation system used in the microPebble: https://github.com/inovait/kotlinova/tree/cf00b48aae05b211506fd1697dff90ee6138c46d/navigation/sample/multiplatform .
Since v1.5.0 the GH action does not find an apk as artifact and so they are not attached to the releases anymore
I looked at it today, first thing I'm doing is porting android to multiplatform, and there is quite a bit of things to change out
both modified: apps/ui/src/main/kotlin/com/matejdro/micropebble/apps/ui/list/WatchappListViewModel.kt
both modified: bluetooth/ui/src/main/kotlin/com/matejdro/micropebble/bluetooth/scan/BluetoothScanScreen.kt
both modified: bluetooth/ui/src/main/kotlin/com/matejdro/micropebble/bluetooth/scan/BluetoothScanViewmodel.kt
both modified: bluetooth/ui/src/main/kotlin/com/matejdro/micropebble/bluetooth/watches/WatchListScreen.kt
both modified: bluetooth/ui/src/main/kotlin/com/matejdro/micropebble/bluetooth/watches/WatchListViewModel.kt
this is a not so fun rebase
a few of those things are appstore related of course
I think I have a maybe working port from Android to multiplatform on my machine but even after doing it I didn’t think I understood the code base well enough to know what I broke
well, I wouldn't mind seeing that
I got ambitious and got it building for iOS (it builds, sure. It also crashes). I'll remove that and see if it's intelligible
yeah, the first thing I did was to remove all of the intent iOS stuff because it's easy enough to add in later
and then a quick rebase on top of current master
quite a few things happened since november 5th when this was branched off though
fair
I keep looking at what I did and I think I just moved the already pure Kotlin modules to just be Multiplatform modules in structure which is just a file move and plugin change 😬
So I didn’t do anything cool
maybe you guys should coordinate? So you don't duplicate each other's work
Maybe we should make competing forks with slight differences to conventional taste but are otherwise identical (if I ramp up fully on this outside of experimenting I’ll definitely message here to others)
I did give Apple money to renew my dev account over this so I’m committed but haven’t finished my other projects yet is all
I am basing all of my work on the work that intent did because I don't like redoing work
so my approach is largely just rebase and fix
Hm, yeah there's a dilemma here. Their work basically involved replacimg the backbone of the app to make it KMP compatible. This is theoretically not necessary amymore, so the question is whether we continue replacing the backbone to not loose all of their work or try to keep the current one to make integration of every change after the fork easier
To make sure I'm not out of the loop. If I wanted to put up a PR that was related to supporting efforts to migrate more of these modules to multiplatform, which branch would I want to be looking at basing off of
microPebble master
Good good. That is what I'm doing and wanted to be sure there wasn't a development branch for this I was supposed to be touching instead
I spun up a new branch on latest main, copied my code changes, and then put up a PR about it. It’s not groundbreaking by any means it just gets Java and Android out of non-UI modules
I left a batch of comments about it too because I’m really not the most astute when it comes to a conversion of this stuff in place and I’m also not a user because no Android. Just some low hanging fruit work for all this.
The other thing I’m looking at now is just transposing the androidLibraryModules to multiplatformModules (that only contain androids source sets).
I’m sitting on this if I compete it though until the other PR clears (if it does) so I’m clear I understand the goals here and not just making nonsense changes if I'm off base
Any idea why Futura Weather fails to get appstore info when installed from the store?
what do you mean by "fails to get the appstore info"?
Shows the little struckthrough cloud icon
It's the first time I've seen that on an app installed from the appstore
hm weird. Does it work on the core app?
I don't know. He was sad that all his apps got removed when switching to MicroPebble so I assume he had that one installed before
I can at least click the remote install button in the Core webstore 🤷
Not familiar with this particular watchface, so I have no idea what that icon means
Ah, no I mean in MicroPebble itself
The watchface doesn't work because OpenWeatherMap needs an API token to work. That's expected, but MicroPebble itself doesn't seem to be able to check the app version for some reason
That app has a 2.1.0 version code on the Rebble App Store feed too so probably some odd about how it set version in the past or was uploaded. Typically the feeds only show major.minor because patch isn’t supported
Oh yeah. It uses patch versions it’s last one was 2.0.3. If MicroPebble isn’t expecting an actual patch number that could be it
Huh I wonder how it managed to use patch versions lol
I think maybe Will patched some things manually because my old apps that may or may not use patch versions just don’t display the version at all. Maybe it used to be allowed around 2014 or 2015 but I can’t remember
That's not supposed to be a valid patch number 💀
Ever since updating to a newer version of microPebble, I get a "voice service not active" notification on a daily basis. Is there a way to dismiss this permanently? (Without enabling voice or disabling notifications for the app altogether 👀)
Hold your finger on the notification
and then disable that notification category
but then voice recognition will not work
Ah, didn't realize it was its own category. Thank you!
yup it's intentionally in its own category exactly for this purpose
Im having trouble sideloading this pbw, is there a workaround?
JayPS (Pebble Bike/Ventoo) Watch Face. Contribute to daktak/JayPS-WatchFace development by creating an account on GitHub.
It's in the rebble store and doesn't load there either
Looks like it's got a malformed app manifest
E : kotlinx.serialization.json.internal.JsonDecodingException: Unexpected JSON token at offset 3782: Expected start of the array '[', but had '"' instead at path: $.resources.media[19].targetPlatforms
E : JSON input: ..... "targetPlatforms": "aplite",
I think if you rebuild it with the latest SDK it might work
Yes, targetPlatforms in the resources are supposed to be arrays. I can patch the PBW and reupload it here and see if that'd work
@hushed light Try this one, it loaded for me
Basically:
{
"name": "OVL_FULL",
"file": "data/OVL_aplite.bin",
"type": "raw",
- "targetPlatforms": "aplite"
+ "targetPlatforms": [
+ "aplite"
+ ]
}
Thank you!!!! This did the trick!!!
FWIW I have that notification channel disabled and I still get the notification. I'm on a fairly recent git build
Also FWIW I have the "Voice issues" channel disabled and never see the notification
Fun fact if you disable the "voice recognition" channel it won't disable the "voice issues" notifications 💀
My work here is done
yeah those are two different ones, again intentionally
when you enable voice recognition you get a different annoying notification
I wanted to give the users the ability to disable either one separately.
This Google's system is very annoying though, at some point we will need to migrate to something else. Maybe Rebble's voice recognition? And/or extra offline model, similar to the Core app?
more rebble integration >:D
I need more time in my life so that I can work on some of that
Rebble dictation vould be super nice, that's the only STT I've used that hasn't been bad lol
Except Whisper-Medium and larger on a laptop, I guess
it's impressive how well the google stt works despite the god awful quality of some mics on pebbles
Oh actually FUTO's voice dictation was also good. They use Whisper too IIRC
Yeah no hearing the debug audio from the older watches I'm super impressed
also, I wish there was a guide that you really shouldn't keep the hand so close to the mouth, since you are bound to peak the audio
It mostly works even if it does peak though
sometimes, sometimes not
in my experience the detection is slighly better when the audio is too quiet than too loud
I think you'd maybe want a note but not something that cancels the dictation attempt if it clips?
wiggle the points on the svg violently and go "too loud!" if the mic peaks
it would also likely require changes to the firmware anyway
Well it could be handled in the firmware itself, or in the mobile app
I would love to see a small model in micropebble to do reminders
I'm in favour of this
since all it has to do is detect the date you want for the reminder, so you don't need anything particularly large out of language models
alternatively we could use one of the small geminis on the server side
(if you ever want to do anything server side for services, let me know, I would love to work on some more services to support stuff like this)
i want gtasks in my timeline and bobby reminders in my gtasks
hmm
You might not even need an LLM for time extraction, just regular old NLP
yeah, indeed
supporting reminders app means three things iirc:
- enable reminders app
- handle special transcription type
- handle pins
@upbeat wharf what if there was a generic timeline integration that added items to its own task list in google tasks?
instead of doing that through bobby
hell yeah
hmm, so only tasks specifically added to that list would show up on the watch?
what i want is twofold:
- reminders i set on my watch show up on m other devices
- reminders i set on my other devices show up on my watch
i have put zero thought into the specifics
is the task interface the best way to go about this though?
wouldn't a calendar provider make more sense?
Do Google Task reminders show up in a calendar?
it's not a calendar provider
But I think they do show up in a calendar, right? I thought they did back when I was using it
they do show up in google calendar, but they don't appear as a calendar provider
they show up in google calendar but not other calendars
Oh so it's a special thing
indeed
problem with my idea, if you have a calendar provider that's timeline, your timeline items would get duplicated by default
Timeline also sends a calendar ID that you can know to exclude, maybe?
you can just disable that calendar in the micropebble or core app
if they are nice about it, they could also disable that provider by default
Well yes but you'd need to know to disable it by default is what I mean
Or at least, that would be nicer than having to disable it manually
yeah, fair
huh weird, I have never seen this before
I'm gonna try reflashing the firmware, I think
Hmm, looks like my computer can't connect to it either
When I try to pair it to my phone, I see both a "Pebble Time <whatever> and a "Pebble Time LE <whatever>" in the system settings but only the LE device in microPebble
And now it just says "pairing rejected by pebble"
And now it says it can't connect because it has an incorrect PIN
I'm going to try uninstalling micropebble and installing the core app and see if that likes it
Huh, it just connected immediately
It's in PRF right now so I can't really
I did try re-PRFing it though
Hmm, core app worked perfectly
Pair via LE through microPebble, then unpair LE in system settings and pair non-LE in system settings
wow that worked
?????
'Course it did; I'm simply a god at debugging
Does it work in le too, or just in Classic? Because I did something similar and I can only use classic
MicroPebble seems to not really like LE with older watches, LE on the C2D seems to work fine though
I upgraded to the latest main branch and it seems like I can't open up watchapp settings anymore does anyone else have that issue? It just shows the lodaing circle and nothing else
I'm on 1.6.1 release, both faces and apps load the config pages for me
Hm maybe I'll just switch to the regular release then. I've been building from source because switching between source and release erased all my apps 😅
Release seems to work. Maybe I wauld've just had to update LibPebble3 or something
This takes forever
It only takes forever on startup, subsequent builds should be better
yeah libpebble has like two million dependencies
because it is a multiplatform library, it can't access any system stdlib, it has to bring everything with it
Hm, not sure, microPebble just delegates to the libpebble3 for this
but that only happened when the watch was in recovery?
Just managed to install this same firware without any issues
Yeah, just recovery, was whatever firmware got shipped with the CT2
I honestly don't think I'd be able to replicate this 😅
You may be able to reset to PRF and then could replicate?
Maybe. I'll try when I get home, don't have a phone with Core app on it atm
Nope, update from PRF works fine
any tips on getting micropebble to see a PTS? cannot get it to find it for the life of me
no amount of airplane mode, reset watch, reboot phone, whatever will get it to show up
if i try to pair a bluetooth device in the android settings it can see the PTS (both LE and classic)
and i can pair it there
(and i have been forgetting those pairings immediately while testing)
but micropebble does not show it in the list
it can see my PT2, so it's not that
i'll see how it fares with my P2 and P2D
okay that's a yes on my silk, asterix and obelix
and a no on my bobbysmiles and spalding
doesn't like the original times, it seems
sounds like ble issue then?
smells likely
those watches have a specific name for the bt connection that's low energy
they also appear later in the refresh in my experience
yeah there's a "Pebble Time 527D" and a "Pebble Time LE 527D" in my android settings pairing menu
neither appear in micropebble
settings menu can also pair to both of them just fine
I have two Microsoft Outlooks Pebbles and none of them are working
at least im not in space
yet you are upside down
you know gravity is upside down here as well right
ohh
I had to turn on location to get anything to show up in app. You've done that already?
I think i clicked connect in micropebble, then while it shows the loading circle I switch to my system settings and pair the pebble. After some tries it worked for me
yep
iiiinteresting
spinner I'd guess
which i don't see anywhere
i've just checked with another phone - same issue
hang on is this a bobbysmiles
i had this issue with mine
I ended up having to pair it to pebbleapp on an old phone, install a firmware, factory reset, and then pair to coreapp on my current phone
no idea why it worked, but it did
this also does not appear to have helped
Does the Core app work?
i would have to reinstall it but when i checked the other day it also did not work
which makes me suspect libpebble3
like, settings app bluetooth "add a new device" sees the watch. but none of the apps do
yep, coreapp on the phone i just had it paired to with the old pebble app can't see it either
I got my watch, installed micropebble and so I'm so tempted to just run around a bit and make the ui make sense
considering how core app has battery in servers, will micropebble store battery history locally in phone?
such a wack move to require sending them battery stats just to see them locally
I was thinking about it
we do still need to send this data to a server for dev statistics
but there's little reason to have the dashboard actually require to be online
ok makes sense
It sounded like it was an internal analytics tool meant to show aggregated data from all users. That was then decided to be exposed to the end user, filtered down to their account specifically
still, requiring login and all seems overkill when you can just capture that data in the app db
though I assume vibe coding that is harder than just creating a website from an existing database
that makes sense
Hm. Calendar option shows me I have no calendars on my device?? It has the permission...
I seem to be able to replicate this...
I just built a slot0 and slot1 pbz and neither of them will flash via micropebble
Do the official releases work?
You need to either be using Google calendar or your system calendar
I use Proton Calendar but the watch only sinks from my Google calendar (which is a mirror of my Proton calendar for this exact reason)
Well, you just need to be using a calendar that integrates with the OS
Proton doesn't
Fair, my verbiage is misleading
I have Google Calendar installed, I use Gsuite or whatever it's called now
Aha, the official pbz doesn't work either, error parsing pbz
I've invited the Intent team to come and join and chat here about future iOS work -- Jakub can introduce himself if he likes 🙂 Once the Board gets the next statement of work signed off, Jakub will provide updates and presumably will ask questions of @undone valve as needed.
Hey everyone, I’m Jakub, an Android/Kotlin Multiplatform developer, and I’ll be working on KMP/iOS stuff. Happy to help 🙂
Is there a way to put Pebble in PRF mode from microPebble?
Hm, I seem to have bricked my PT2
It won't enter PRF, just sits at the "pebbleOS" screen, progress bar runs half way and then disappears
Weird, finally it restarted to PRF after I restarted it for like the 9th time
Should probably use qemu more
oh shit