RetroPod - The original iPod, on your iPhone
RetroPod is a simulation of the original iPod for iPhone and iPod touch originated by Johannes Lechner.
It was crafted with much love and care for details and is now available under the GPL.
Open with Xcode, change the provisioning info (if necessary) and run it on your iPhone.
- Navigate your songs by album, artist, genre and more
- Fast forward/rewind and skimming
- Working battery indicator
- Backside with custom engraving and real-time mirror
- Recreate the Breakout Game
- Add an about screen
- Integrate with MPNowPlayingInfoCenter, i.e. have the RetroPod app icon showing in the multitasking UI.
- Allow browsing of your contacts
- Recreate the calendar
This quick overview should be enough to get you started on writing your own extensions.
This class integrates all the pieces (which are explained later on).
First, a stack of
Content is maintained, similar to the
UIViewController stack managed by a
- (void)pushContent:(Content *)content animate:(BOOL)a;
- (void)popContentAnimate:(BOOL)a toRoot:(BOOL)r;
PodViewController is responsible for presenting the right
Controller based on the
Content subclass passed.
Second, it dispatches
ScollWheelView events (e.g. Prev, Next, etc.) to the currently active controller.
Third, it creates a
Menu instance for the main menu with
MenuItems, which in turn can also contain
It then pushes a
MenuController responsible for displaying this main menu on the stack.
Content subclasses model the different screen types available in RetroPod.
Current subclasses are
Player (displaying the currently played song),
MainMenu (root menu) and
MediaMenu (list of songs).
Menu subclasses display a list of
PodController subclasses contain the logic of RetroPod.
ScollWheelView events to them and calls their
deactivate methods before display/after disposal accordingly.
Current subclasses are
PlayerController (responsible for controlling music playback and playlist management via
MenuController (responsible for coordinating the rendering of
Menus and executing the
Actions assigned to the
PodController can have a
parentController to which it can forward events it can't process.
This for example allows the Play/Pause button to function (which is implemented in
PlayerController), even when a
MenuController is currently displayed:
MenuController receives the event, decices that it can't do anything useful with it and then forwards it to its parent.
This group contains subclasses of
ContentView analogous to the
Content subclasses of the Model group.
So for example
PlayerController all fit together.
Further it contains
DisplayView, which is responsible for animating in the
ContentViews in & out.
There can be an
Action attached to an
For example a
SettingsAction is responsible for changing preferences accordingly.
This group contains the implementation of the back side of RetroPod.