Related News
iPhone 3GS unlock available on Mac OS X
George Hotz was the first to release a jailbreak app for the iPhone 3GS -- the only problem was that it was only available for Windows. Now there's a Mac-based jailbreak solution for the 3GS, Purplera1n RC2a has been released for the Mac. iPhoneHacks.com has posted a detailed step-by-step of the process. If simply jailbreaking your iPhone isn't enough and you feel compelled to unlock your shiny new iPhone 3GS too, there's an app for that. If you've jailbroken via Purplera1n RC2a you can use the iPhone Dev Team's UltraSn0w to unlock an iPhone 3GS (video).
AT&T revises iPhone upgrade eligibility policy
In an open letter (and accompanying YouTube video, natch) posted today, AT&T revised its policy on upgrade eligibility for the new iPhone 3GS for a small number of iPhone 3G customers. I previously blogged about the lack or rhyme or reason to AT&T's seemingly random iPhone 3GS upgrade eligibility policy. Before today most iPhone 3G owners that purchased their phone on or around launch day (in July 2008) had to pay a $200 "early upgrade" penalty (read: $399/$499) to get the iPhone 3GS on Friday. AppleInsider clarified things slightly saying "iPhone customers who spend more than $99 a month per line are generally eligible for an upgrade between 12 and 18 months into their contract." All that changed today when AT&T changed its ...
News to know: iPhone OS 3.0; Text messaging; Social search; Morro; Palm
Here are today s notable headlines. You can get News To Know via email alert and RSS daily. For continuous updates see BNET s around-the-Web tech coverage. Mary Jo Foley: Former Softie to take real-time social-search startup public Matthew Miller: iPhone OS 3.0 update fails connecting to cellular data network What can you expect with the iPhone OS 3.0 update? Ryan Naraine: Apple iPhone OS 3.0 update plugs 46 security holes New iPhone 3.0 OS available Sam Diaz: Can MLB.com hit an iPhone homerun with AT&T powering the network? Jason O'Grady: Some pre-ordered iPhone 3GS' delayed Walt Mossberg: New iPhone Is Better Model Or Just Get OS 3.0 Microsoft to scale back Soapbox video service Washington digs in on text message pricing; asks about carrier exclusivity Richard Koman: Genachowski sails through FCC confirmation hearings Tom Steinert-Threlkeld: ...
iPhone Dev Team Updates Software Jailbreak for iPhone OS 3.0 (PC World)
PC World - The game of cat-and-mouse continues between hackers at the iPhone Dev Team and Apple. As we near the launch of iPhone OS 3.0, the Dev Team's pineapple-faced spokesperson, MuscleNerd, broadcast on Tuesday night a qik livestream showing off ultrasn0w, the updated version of the Dev Team's iPhone software jailbreak. MuscleNerd said in the video the new jailbreak applies to any iPhone 3G running 3.0.
Silverlight
I'm doing a lot of Silverlight work and one issue I've encountered is how to set the cursor to an application wide busy wait icon, and disable all the controls in the application, while a web service call is made. The first technique I tried was to wrap all the application content in a ControlControl and set the latter's IsEnabled property to false while the service call is made, also setting the cursor to Wait on the main UserControl. This doesn't look good though because the application is greyed out while it is disabled, which seems too visually aggressive. A better technique is to place a transparent rectangle over the application content during the service call. For example, in the following XAML the Rectangle element is defined with its Cursor set to "Wait" and its Visibility set to "Collapsed" so that when the application runs the Rectangle will not affect its appearance:<UserControl x:Class="TestBusyCursor1.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" HorizontalAlignment="Center" VerticalAlignment="Center"> <Grid x:Name="LayoutRoot" Background="LightGray" > <Border BorderBrush="Black" Cursor="Arrow" > <StackPanel Margin="50"> <TextBlock Margin="10" Width="300" Text="Busy Cursor 1"/> <TextBox Margin="10" Width="300"/> <Button Content="Do Something" Click="Button_Click" Margin="10" HorizontalAlignment="Right"/> </StackPanel> </Border> <Rectangle x:Name="WaitCursor" Fill="Transparent" Visibility="Collapsed" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Cursor="Wait"/> </Grid></UserControl>In the code-behind the click handler sets the Visibility of the Rectangle to Visible and so because the Rectangle is defined after the other content in the Grid control it effectively overlays the other content and prevents the user from clicking on any controls underneath the Rectangle. A worker thread sleeps for 5 seconds to simulate the long-running service call, and then when this completes the visibility of the Rectangle is set to Collapsed again so the Rectangle is hidden:using System.ComponentModel;using System.Linq;using System.Threading;using System.Windows;using System.Windows.Controls;namespace TestBusyCursor1{ public partial class MainPage : UserControl { public MainPage() { InitializeComponent(); } private void Button_Click(object sender, RoutedEventArgs args) { WaitCursor.Visibility = Visibility.Visible; var worker = new BackgroundWorker(); worker.DoWork += (s, e) => { // simulate making a slow web service call Thread.Sleep(10000); }; worker.RunWorkerCompleted += (s, e) => { Dispatcher.BeginInvoke(() => { WaitCursor.Visibility = Visibility.Collapsed; }); }; worker.RunWorkerAsync(); } }}Click on the button here to see the Wait cursor and how the button and textbox cannot be clicked during the simulation of the service call:

One problem with this is that it is still possible to tab into the text box, and enter text there, while clicking on the content is prevented by the Rectangle. This can be worked around by finding all the child controls which have their IsTabStop property set to true and setting it to false for the duration of the service call: private void Button_Click(object sender, RoutedEventArgs args) { WaitCursor.Visibility = Visibility.Visible; var tabStops = LayoutRoot.GetVisuals().OfType<Control>() .Where(c => c.IsTabStop).ToArray(); foreach (var tabStop in tabStops) tabStop.IsTabStop = false; var worker = new BackgroundWorker(); worker.DoWork += (s, e) => { // simulate making a slow web service call Thread.Sleep(10000); }; worker.RunWorkerCompleted += (s, e) => { Dispatcher.BeginInvoke(() => { foreach (var control in tabStops) control.IsTabStop = true; WaitCursor.Visibility = Visibility.Collapsed; }); }; worker.RunWorkerAsync(); }So in this version it is not possible to tab into the text box during the service call:

There is one problem remaining: the visual state of the cursor is not changed until the mouse is moved. This can be confusing if you click on the button and move the mouse for a moment so that the Wait cursor is displayed, but then don't move the mouse after the service call. From the user's point of view it looks like the service call is continuing indefinitely. For this reason it may look better to instead use some sort of spinning icon, web browser style, to indicate that the application is busy.