Twenty days ago, tucked into my small New Jersey bed, I started working on an ambitious project I called “CellCircle.” After a string of small, intense jailbreak tweaks, this seemed a little more complex, a little more interesting, and a little more productive. Pulling inspiration from /r/jailbreak had always worked in the past, and it guaranteed at least a minuscule amount of attention. So, around 8AM (about six hours earlier than I usually worked), I poured some coffee and began typing away on my Macbook Pro (in my pajamas). The idea seemed so simple: reduce the iOS 7 signal indicator to a single, unified circle that filled with each bar. How tricky could it be?
My first goal was to create the single “CellCircle” that would take over the five, unnecessary circles that were crammed into the status bar. Plugging away in Xcode, I was able to create a somewhat dense UIView subclass that not only filled depending on current “bar” and maximum state (so, for cellular signals, the bars should be between 1-5, and the max a constant 5), but also casually moved with the z-positioning of the device (sort of like a parallax/glass of water effect). It took a few hours to get all the positioning and dynamic sizing (e.g. border size, motion amount) right, but when it was done, it was beautiful. There were absolutely no saved images or external resources— everything was generated live, and it was very concise and mutable. The next step was to merge it with a theos project, and inject into the statusbar. Another cup of coffee, and I got back to work.
Peeling away the frameworks that make up SpringBoard, effectively the main process of iOS runtime, to find the status bar icons wasn’t too bad. In fact, finding the exact method through which the signal images were displayed only took a second longer than I expected. But things only got worse from there. UIKit (the framework in charge of the major user interface components of SpringBoard) only allowed for images to be hosted in the status bar. There was no way to just swap out the old view for my new, dynamic view, since there were no views. It would take far more for me to give up, however, and I spent the next day or so experimenting with ways to remove the old image, and insert my view into the correct location. This quickly got out of hand, however, when UIKit frequently needed to check on the status of the item (and image), and messing with such an ever-present part of the interface would mean conflicts by the boatful when other tweaks wanted to perform similar transactions. In fact, as I hovered over TypeStatus development, I realized that even adding my CellCircle view to the status bar in the first place could throw everything off balance, when it simply needed to move to a different location on the screen. Yes, ultimately it was imaginable that my dynamic view could exist in the statubar, but it would require much more time and effort than I had on my hands. It was time for another, much larger cup of coffee, and a major refactoring of how CellCircle worked.
At this point in most of my projects, I’m exhausted. The last time this had happened, with my baby iOS application Catalyst, I almost left it stagnating for two months. I knew there had to be an acceleration in my development. Especially after being in the process of releasing a dozen rapid-fire tweaks, working on one for almost a week was bizarre. As such, I started to spend a few hours less a day puzzling over CellCircle, and continued to spawn new, minor silly projects that were completed over lunch. There was little stress to complete it quickly, but my goal was still harsh. I didn’t want this to take more than a month, or even two weeks, if I could help it.
And then I saw the competition. After my public announcements about CellCircle development, and the original thread requesting it, starting to gain traction, handfuls of replicas hit Cydia. Mostly Winterboard themes, these mini-CellCircles just saved a few images to the device, and let the fantastic theming engine do all the grunt work for them. My motivation tanked.
How do you sell a product, weeks late, when any kid in their basement can make a similar version in a few minutes?
I started getting pings, mentions, and PMs all over the place. People still supported CellCircle, but no longer had any need for it. They said they would install it when it was released— but I knew most wouldn’t pay for it anymore. With the inevitable loss of my favorite feature, motion effects, and the finish line still far away, I couldn’t have been more disappointed. Without many other options, I decided the only way to redeem CellCircle was to change it entirely. Instead of just replacing the signal indicator, it was time to replace the wifi and battery symbols as well. It was time to offer an immense amount of customizability, and a beautiful interface. It was time for another week, and another dozen cups of coffee.
Instead of going in detail through each milestone, let me sum up the next twenty or so iterations of CellCircle, which was since renamed to Circlet (as it dealt with much more than just the signal indicator now), for you:
- Live conversion of Circlet view to an image, with the removal of all motion effects
- Injection of Circlet into the signal indicator
- Modifications to the layout manager for the status bar, to make everything shift and display properly
- Introduction of a preferences area, where the size, color, and availability could be toggled
- Re-making of the Circlet injection process, to cooperate with live-preference changing
- Introduction of Wifi indicator replacements, mostly grabbed from the signal process
- Modification of Wifi indicator and preferences to include different signal strengths, and specific coloration for data and wifi connections
- Introduction of Battery indicator, with the same changes that the Wifi indicator had to be fit with
- Realization that my image generation cannot occur in processes other than main (mostly SpringBoard), and for some reason only the signal strength indicator worked in 3rd-party apps
- Entire refactoring and re-writing of Circlet to generate images in SpringBoard, and use shared instances of a Circlet-holder for individual indicator image retrieval
- Realization that the above solution still wouldn’t work, as separate versions of the shared instance would be created in every app
- Entire refactoring and re-writing of Circlet to generate images in SpringBoard, and use two-way notifications for retrieval
- Entire refactoring and re-writing of Circlet to generate images in SpringBoard, and use two-way notifications and shared instances for retrieval
- Entire refactoring and re-writing of Circlet to generate images in SpringBoard, and use LightMessaging for retrieval
At that point, I realized this wasn’t going to work. Things were getting too complicated. Too hacky. Too advanced for my jailbreak development abilities. It had been 19 days, and every day someone mentioned me on Twitter, asking for a beta, or an ETA. I was given ~$20 in donations, which was sucked away immediately for college expenses. And suddenly, I realized something terrible.
The ideal solution would be almost the same as the replica’s.
The only way I could see myself completing Circlet on time was by creating a Circlet view, converting every possible state to an image, saving it to the disk, and grabbing it in every process. In a sense, I was just creating a glorified theming engine, but just for the three status bar images. And it had taken 20 days. And its only redeeming qualities were in preferences, coloration, and personal development support. Was it sincerely better than Winterboard? Than the minor tweaks that had since been released, that individually modified some of the elements? Was it worth my time?
I could only say yes, because I don’t give up. And because I knew there were a few jailbreakers out there that still supported me. And because I don’t know how to get better without trudging through projects, even if they’ve gone so far off course from their original intent.
As of publication, Circlet’s release was planned for 1/25/14, but has since been pushed to the week of the 26th for another stage of major refactoring. Make sure to follow the writer on twitter for questions and updates, and remember: always thank your developers.