#microPebble - open source Pebble Android app

1507 messages · Page 2 of 2 (latest)

late notch
#

how did you install? I didn't see an apk for flatpak or deb. only .click whatever that is. presumably yet another packager type

daring loom
#

No, I think it's a very valid concern. I'll try reworking the UI a little more and see where I can get

daring loom
#

It works now

#

How do I collect a MutableStateFlow as a MutableState?

undone valve
#

why would you want it as MutableState?

daring loom
#

So I can set it from the UI too

undone valve
#

Please expose function that sets it then.

daring loom
#

Ah okay

#

Why does savedFlow only accept non-nullable values?

undone valve
#

I think behind the screnes it uses null for something else

daring loom
#

Is it equivalent to saved { MutableStateFlow... }?

undone valve
#

no, that will crash, because MutableStateFlow is not parcelable

daring loom
#

hm, then how should I represent nulls?

undone valve
#

can you give it a non-null value that would signify default value?

daring loom
#

No, they're either serialization objects from the API or are types from libpebble

undone valve
#
@Parcelize
data class NullWrapper<T>(val value: T?): Parcelable

😅

daring loom
#

Darn okay I guess I'm doing that then

daring loom
#

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

lean ivy
# late notch how did you install? I didn't see an apk for flatpak or deb. only .click whate...

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 :)

late notch
timid kelp
#

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 ?

coral drift
#

yes

timid kelp
# daring loom 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

timid kelp
#

I will ACK that timeslot since at least two of us can join

undone valve
#

What timezone is this? Or does the discord always show local timezones in this?

daring loom
#

Times Are Hard™

undone valve
#

then I think I will be able to make it

undone valve
# daring loom topical: <https://youtube.com/watch?v=lxoKilLSJ4k>

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...

▶ Play video
daring loom
#

I like the Kotlin talks though

#

Also I guess I will try to be at the meeting if only to listen

timid kelp
#

can you DM me e-mail addresses that you would like me to add?

#

I will forward the invite

native fulcrum
#

what's the reality of texting from pebble through micropebble?

undone valve
#

What exactly do you mean by "texting"? 😄

native fulcrum
#

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

undone valve
#

I kinda think that this might be better served by the 3rd party app?

#

Oh, is the Send Text native firwmare thing?

native fulcrum
#

Basically

#

It's Pebble app pretty sure

#

and they had to do trickery to get it to work

undone valve
#

I personally will not implement this, but the PRs are welcome 🙂

native fulcrum
#

all good - just curious

upbeat wharf
#

well android apps can send SMS still I think

#

they just aren't allowed to send rcs

daring loom
#

@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

undone valve
#

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)

daring loom
daring loom
#

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

daring loom
undone valve
daring loom
#

Is there a way to do both?

undone valve
#

Yeah, we can't use that yet 😐

daring loom
#

😔

#

I'll fix it tomorrow

undone valve
#

I wanted to update at some point, but I was waiting for you, otherwise you would get a lot of conflicts

daring loom
#

Sounds good

undone valve
daring loom
#

True

daring loom
#

Huh for some reason opening the merge.sarif file works now

daring loom
#

@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

undone valve
#

yeah, error messages for that are confusing sometimes. Sometimes you need to apply all suggestions in one go, otherwise it fails

daring loom
#

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?)

undone valve
#

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

Android Developers

This document outlines various techniques to make unstable classes stable in Jetpack Compose to improve application performance, covering strong skipping, immutability, immutable collections, annotations, configuration files, and handling multi-module architectures.

daring loom
#

Like Uuid and Instant

undone valve
daring loom
#

How do I fix the <this> instance being marked as mutable?

#

⁨```
FunctionAndParameter(functionName=com, parameterName=<this>, parameterType=AppstoreCollectionScreen)

undone valve
#

mark the Screen as @Stable

daring loom
#

Still green

#

All the warnings have been fixed, finally

daring loom
#

Nice!

#

Do you have any idea what may be causing this crash? It looks like some sort of reflection error in the Bluetooth system

undone valve
timid kelp
#

reminder: meeting with Intent tonight

timid kelp
#

we had what I considered to be a productive meeting, I am writing a few notes into the Discourse thread

timid kelp
#

I am writing into the thread that you just briefly posted and then unposted into

daring loom
#

Ah okay I didn't see it there so I was wondering if I had posted it to the wrong place

timid kelp
#

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

daring loom
#

I thought Zoom auto-generates one?

#

If not and you can download the video, you could use Whisper or something to transcribe it

timid kelp
#

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

timid kelp
#
Rebble Developer Forum

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...

native fulcrum
#

This is awesome!

daring loom
#

The best diff ever

#

Also for some reason this is using the wrong icon and I don't know why

undone valve
daring loom
#

Oh, do the icon names need to be unique?

undone valve
#

yes

#

android merges resources into a single namespace

daring loom
#

I didn't know that, I'll check for it

undone valve
#

(Btw, now you can see, why feat and fix should be used sparingly 😄 )

daring loom
#

Nice except it had some annoying errors I needed to fix 😭

#

Also, how do I use an alias for the plugin version?

undone valve
#

add it here

#

and then use alias(libs.plugins.serialization)

#

Also, merge in master, so you don't get the failing screenshot tests

daring loom
undone valve
#

hm, weird why does it fail then

daring loom
# undone valve 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

daring loom
#

Alright I think it should work

daring loom
#

Hm, CI still fails but it works fine when I run it locally

undone valve
#

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 🤞

daring loom
#

Awesome, thanks

undone valve
#

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? 😂

open roost
#

Oh hey I got that error too! Couldn't repro it though

daring loom
#

Oh yeah I get it randomly too

#

I think it's the default for something, but I don't remember what

undone valve
#

Now AppstoreHomepagePreview is breaking, because order of the apps is different 🤔

#

This IS hardcoded, right?

daring loom
#

I'll fix it in a bit, currently trying to fix up a PR to Godot

daring loom
#

I just need to use the default Instant serializer on serialization, and add it as a deserializer

#

Will put these together soon™

daring loom
#

I just discovered my .gradle folder is 22 GiB

#

So that's nice

daring loom
#

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

undone valve
daring loom
#

It still doesn't work 😢

#

Trying the repair IDE thing

#

Huh, invalidating caches fixed it

#

Neat

daring loom
#

It now autogenerates a random set of apps instead of getting API data 😅

undone valve
#

No, it shouldn't autogenerate it

#

unless it's from static seed

#

otherwsie, every screenshot will be different again

daring loom
undone valve
#

ah great then 👍

daring loom
#

Also, any idea what the different colors mean? Both are composables

undone valve
#

huh, no idea off the top of my head

#

check the IDE settings

#

color scheme

daring loom
#

I have, I didn't see anything

#

Only the green color I think

#

Oh it's just the generic dsl style1 color

#

PR opened

daring loom
#

I'm starting work on the RWS interface, I might have a baseline implementation soon™

undone valve
#

Hm would it make sense to start in the KMP version? So they will not have to port as much

undone valve
#

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.

coral drift
#

I hope you end up using cobble boot endpoints

#

I am willing to help out a bit with this if you need anything

daring loom
coral drift
#

they are

#

boot is used mostly as a way to allow us to change endpoints without having to release new app version

daring loom
#

How do I get the right endpoints

#

If it's easy I'll do it

coral drift
#

mind you, cobble config is a bit limited

#

still the existing config should be useful for oauth, right?

#

also a part of boot is handling pebble://custom-boot-config-url/ urls

#

(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)

timid kelp
#

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

keen rapids
#

That sounds like a bad time for everyone involved

daring loom
#

It's gotta be possible

#

... so, if that's what you want...

timid kelp
#

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)

daring loom
#

Plus some compiler plugin magic to track state changes in MutableState<T>

timid kelp
#

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

daring loom
#

@coral drift Do you know how long the tokens take to expire?

undone valve
#

Well, just in time for the second Pebble revival

daring loom
#

It's a little fixed but not much

cobalt niche
#

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

cobalt niche
#

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)
undone valve
cobalt niche
#

But seems something needs to be set on the Pebble itself?

undone valve
#

No, it's only companion app depending

cobalt niche
#

BTW I am that guy using GrapheneOS, so an outlier

undone valve
#

can you send me logs of one such instance where you get this error?

cobalt niche
#

Sure let me try and repro it tomorrow

undone valve
#

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.

cobalt niche
#

How often does the GH actions bot for releases run?

undone valve
#

Once per day (every morning CEST time)

fast ember
cobalt niche
#

ta

lean ivy
#

short for thanks ?

undone valve
#

ah, I'm used to ty 😄

timid kelp
#

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

coral drift
#

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

timid kelp
#

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'

coral drift
#

yep

#

that is likely to be most of the reason for these things

timid kelp
#

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

coral drift
#

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

unreal cliff
#

(Local iOS-running software engineer who specifically has a lot of Kotlin Multiplatform experience here)

open roost
#

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)

unreal cliff
#

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

open roost
#

GitHub Projects are annoying. They're attached to repos but not integrated in a way that makes them useful

daring loom
open roost
#

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

cobalt niche
#

I still get that weird spinner spinning around my screen while loading sometimes

open roost
#

dont u mean throbber

cobalt niche
#

oi mate

#

okay the throbber is throbbing all over my screen

open roost
#

As it should be

cobalt niche
#

Thank you doctor, goodbye

undone valve
undone valve
#

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:

  1. Convert common-navigation module to multiplatform - this should be fairly trivial, I don't think there are any classes not compatible with common kotlin code there
  2. Convert home module to multiplatform - keep the HomeScreen in common, move everything else to androidMain for now
  3. Make a barebones iOS version of the app module (maybe named iosApp?) that only initializes the navigation system and shows the HomeScreen
  4. Create dummy WatchListScreen, WatchappListScreen, NotificationAppListScreen and ToolsScreen classes inside iosApp - make them a solid color or something
  5. Now the home screen & tab switcing should be working on both Android and iOS
  6. 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).

open roost
#

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

undone valve
#

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

open roost
#

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

undone valve
#

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 .

GitHub

An opinionated set of common utility classes for Kotlin projects, primarily based on Kotlin coroutines. - inovait/kotlinova

fast ember
#

Since v1.5.0 the GH action does not find an apk as artifact and so they are not attached to the releases anymore

undone valve
#

oops

#

pushed the fix

coral drift
#
    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

unreal cliff
#

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

coral drift
#

well, I wouldn't mind seeing that

unreal cliff
#

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

coral drift
#

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

undone valve
#

I wouldn't do the whole app at once

#

it's modularized, so we can go piece by piece

coral drift
#

fair

unreal cliff
#

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

undone valve
#

maybe you guys should coordinate? So you don't duplicate each other's work

unreal cliff
#

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

coral drift
#

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

undone valve
#

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

coral drift
#

hm, that's fair

#

it's still might be useful for iOS platform stuff I guess

unreal cliff
#

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

coral drift
#

microPebble master

unreal cliff
#

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

unreal cliff
#

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.

unreal cliff
#

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

open roost
#

Any idea why Futura Weather fails to get appstore info when installed from the store?

undone valve
#

what do you mean by "fails to get the appstore info"?

open roost
#

Shows the little struckthrough cloud icon

#

It's the first time I've seen that on an app installed from the appstore

undone valve
#

hm weird. Does it work on the core app?

open roost
#

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 🤷

undone valve
#

Not familiar with this particular watchface, so I have no idea what that icon means

open roost
#

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

unreal cliff
#

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

open roost
#

Huh I wonder how it managed to use patch versions lol

unreal cliff
#

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

daring loom
grim lotus
#

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 👀)

undone valve
#

Hold your finger on the notification

#

and then disable that notification category

#

but then voice recognition will not work

grim lotus
#

Ah, didn't realize it was its own category. Thank you!

undone valve
#

yup it's intentionally in its own category exactly for this purpose

hushed light
#

Im having trouble sideloading this pbw, is there a workaround?

#

It's in the rebble store and doesn't load there either

daring loom
#
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

#

Basically:

 {
   "name": "OVL_FULL",
   "file": "data/OVL_aplite.bin",
   "type": "raw",
-  "targetPlatforms": "aplite"
+  "targetPlatforms": [
+    "aplite"
+   ]
 }
hushed light
open roost
cobalt niche
#

Also FWIW I have the "Voice issues" channel disabled and never see the notification

open roost
#

Fun fact if you disable the "voice recognition" channel it won't disable the "voice issues" notifications 💀

cobalt niche
#

My work here is done

undone valve
#

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?

coral drift
#

more rebble integration >:D

#

I need more time in my life so that I can work on some of that

open roost
#

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

coral drift
#

it's impressive how well the google stt works despite the god awful quality of some mics on pebbles

open roost
open roost
coral drift
#

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

undone valve
#

or just display a message on the screen?

#

"Your hand was too close. Try again"

open roost
#

It mostly works even if it does peak though

coral drift
#

sometimes, sometimes not

#

in my experience the detection is slighly better when the audio is too quiet than too loud

open roost
#

I think you'd maybe want a note but not something that cancels the dictation attempt if it clips?

coral drift
#

yes

#

I wonder if the server actually tells you

upbeat wharf
#

wiggle the points on the svg violently and go "too loud!" if the mic peaks

coral drift
#

it would also likely require changes to the firmware anyway

open roost
#

Well it could be handled in the firmware itself, or in the mobile app

coral drift
#

I would love to see a small model in micropebble to do reminders

coral drift
#

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)

upbeat wharf
#

i want gtasks in my timeline and bobby reminders in my gtasks

coral drift
#

hmm

open roost
#

You might not even need an LLM for time extraction, just regular old NLP

coral drift
#

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

upbeat wharf
#

hell yeah

#

hmm, so only tasks specifically added to that list would show up on the watch?

coral drift
#

yes

#

no

#

wait

#

I don't think about the other direction

upbeat wharf
#

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

coral drift
#

is the task interface the best way to go about this though?

#

wouldn't a calendar provider make more sense?

open roost
#

Do Google Task reminders show up in a calendar?

coral drift
#

it's not a calendar provider

open roost
#

But I think they do show up in a calendar, right? I thought they did back when I was using it

coral drift
#

they do show up in google calendar, but they don't appear as a calendar provider

upbeat wharf
#

they show up in google calendar but not other calendars

open roost
#

Oh so it's a special thing

coral drift
#

indeed

#

problem with my idea, if you have a calendar provider that's timeline, your timeline items would get duplicated by default

open roost
#

Timeline also sends a calendar ID that you can know to exclude, maybe?

coral drift
#

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

open roost
#

Or at least, that would be nicer than having to disable it manually

coral drift
#

yeah, fair

daring loom
undone valve
#

huh weird, I have never seen this before

daring loom
#

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

undone valve
#

did you remove both ends from the bluetooth settings?

#

on both devices

daring loom
#

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

open roost
daring loom
#

Hmm, core app doesn't seem to have any issue with the PIN

#

Let me try reinstalling μ

open roost
#

'Course it did; I'm simply a god at debugging

fast ember
#

Does it work in le too, or just in Classic? Because I did something similar and I can only use classic

open roost
#

MicroPebble seems to not really like LE with older watches, LE on the C2D seems to work fine though

open roost
#

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

cobalt niche
#

I'm on 1.6.1 release, both faces and apps load the config pages for me

open roost
#

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

jolly bridge
#

Cloning now to see if there is anything i can help with

jolly bridge
#

This takes forever

open roost
#

It only takes forever on startup, subsequent builds should be better

undone valve
#

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

open roost
#

This might be a MicroPebble-specific issue

undone valve
#

Hm, not sure, microPebble just delegates to the libpebble3 for this

#

but that only happened when the watch was in recovery?

undone valve
#

Just managed to install this same firware without any issues

open roost
#

Yeah, just recovery, was whatever firmware got shipped with the CT2

#

I honestly don't think I'd be able to replicate this 😅

rain ocean
open roost
#

Maybe. I'll try when I get home, don't have a phone with Core app on it atm

open roost
vestal dragon
#

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

coral drift
#

sounds like ble issue then?

vestal dragon
#

smells likely

coral drift
#

those watches have a specific name for the bt connection that's low energy

#

they also appear later in the refresh in my experience

vestal dragon
#

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

rain ocean
#

I have two Microsoft Outlooks Pebbles and none of them are working

vestal dragon
#

at least im not in space

coral drift
#

yet you are upside down

vestal dragon
#

you know gravity is upside down here as well right

coral drift
#

ohh

open roost
fast ember
#

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

vestal dragon
#

hmm, nope. didn't work

#

also not sure what you mean by "loading circle"

cobalt niche
#

spinner I'd guess

vestal dragon
#

which i don't see anywhere

vestal dragon
#

i've just checked with another phone - same issue

upbeat wharf
#

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

vestal dragon
#

yes but also a spalding

#

both have the same problem

vestal dragon
#

this also does not appear to have helped

open roost
#

Does the Core app work?

vestal dragon
#

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

coral drift
#

I got my watch, installed micropebble and so I'm so tempted to just run around a bit and make the ui make sense

vernal crag
#

considering how core app has battery in servers, will micropebble store battery history locally in phone?

cobalt niche
#

such a wack move to require sending them battery stats just to see them locally

vernal crag
#

it sounded like it was vibe coded

#

would also explain weird ui difference

coral drift
#

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

vernal crag
#

ok makes sense

open roost
coral drift
#

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

cobalt niche
#

Hm. Calendar option shows me I have no calendars on my device?? It has the permission...

cobalt niche
#

I just built a slot0 and slot1 pbz and neither of them will flash via micropebble

open roost
#

Do the official releases work?

mint yoke
open roost
#

Well, you just need to be using a calendar that integrates with the OS

#

Proton doesn't

mint yoke
#

Fair, my verbiage is misleading

cobalt niche
#

I have Google Calendar installed, I use Gsuite or whatever it's called now

cobalt niche
timid kelp
#

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.

fierce quartz
#

Hey everyone, I’m Jakub, an Android/Kotlin Multiplatform developer, and I’ll be working on KMP/iOS stuff. Happy to help 🙂

cobalt niche
#

Is there a way to put Pebble in PRF mode from microPebble?

open roost
#

Not that I know of

#

Though the up/back/select combo would still work

cobalt niche
#

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

undone valve
#

oh shit