Bars really don’t matter. You can have full bars and slow to no internet. You can have one bar but relatively decent internet. Honestly kind of wish the signal display would go away and instead show me when I lose internet.
When you lose internet, you get a ! next to the bars (at least I have on my last few androids). Usually I also have no bars when I lose internet, but sometimes I've got coverage without data flow.
And while we're at it: Just surface the fact that connectivity sucks to applications (maybe even at the socket layer, by just closing them if there's not been any forward progress for a certain time), rather than showing me loading screens that'll never go anywhere for minutes.
This would give apps that do have some offline caching the chance of falling back to that (looking at a certain green music streaming service here).
It is surfaced to apps, but the "just detecting that connectivity sucks" heuristic turns out to be not all that easy to implement. There doesn't seem to be a better heuristic than "try and let the app decide if waited too long".
That is literally what i am observing lately with my provider: i have 2 bars and yet i do not have internet, where as my gf, using the same iPhone model, with a different provider, having 2 bars, has perfect data connectivity.
I build apps at the moment, in addition to the phone's network indicators you really should provide your user with visible and live feedback to indicate whether the servers are reachable because there's so many things that can break down in between. Also programming your app for offline-first is good unless it's critically important the information is either live or absent. We allow offline access by using React Query and storing its caches in user storage.