Posts Tagged ‘ android

Implementing “Pull To Refresh” in your Android App

From the android-pulltorefresh repo, https://github.com/johannilsson/android-pulltorefresh

“Pull To Refresh” is a UI gesture made popular by the Twitter for Iphone app. It allows a user to refresh a list by pulling down and releasing from the top of the list. IOS developers have had library support for this feature for some time now. Over in Android-land, only the official Twitter app has managed to implement this gesture. Long-promised to be open-sourced, Twitter’s solution is still secret and Android developers have no official means to implement this increasingly demanded feature.

But thanks to Android’s open eco-system, we can build this into our Android app’s using the open-source android-pulltorefresh library developed by Johan Nilson. With thanks to the projects other contributors, his library is capable of producing a UI experience similar to the Twitter app, with support all the way back to 1.5.

The project provides a simple and sufficient example app to demonstrate the library use, but I needed something a bit more robust when I was implementing this in my application. So I thought I’d share my changes here, applying it to example application provided in the project.

Let’s start with a brief explanation of how this works. The android-pulltorefresh library provides a custom ListView that includes a special header. The list is initially displayed with the first item selected. This hides the header from view. The custom ListView responds to touch events so that when you pull down on the list, the header is displayed and handles displaying “pull” and “release” text and animation based on how far you are pulling down. Once its released, the header remains visible with the “loading” message until the view is told the refresh is complete, then it resets the header so its hidden once again.

Getting the basic functionality implemented is straight-forward. First, setup your layout and reference the custom ListView.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <!--
    The PullToRefreshListView replaces a standard ListView widget.
    -->
    <com.markupartist.android.widget.PullToRefreshListView
        android:id="@+id/android:list"
        android:layout_height="fill_parent"
        android:layout_width="fill_parent"
        />
</LinearLayout>

Now in your ListActivity you need to do 2 things, respond to the refresh request and let the view know when you’re done.
To handle the refresh action the custom view notifies an OnRefreshListener that you can implement to handle your refresh operation.
In the code below you’ll see that it implements the onRefresh method of the listener and wisely executes the refresh on a background thread using an AsyncTask.

 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.pull_to_refresh);
 
        // Set a listener to be invoked when the list should be refreshed.
        ((PullToRefreshListView) getListView()).setOnRefreshListener(new OnRefreshListener() {
            @Override
            public void onRefresh() {
                // Do work to refresh the list here.
                new GetDataTask().execute();
            }
        });
        ....

Once your refresh is complete, notify the view by calling its onRefreshComplete() method. In this example, we call this method on the UI thread once the task is completed.

private class GetDataTask extends AsyncTask {
 
        @Override
        protected Void doInBackground(Void... params) {
            // Simulates a background job.
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                ;
            }
            return null;
        }
 
        @Override
        protected void onPostExecute() {
            mListItems.addFirst("Added after refresh...");
 
            // Call onRefreshComplete when the list has been refreshed.
            ((PullToRefreshListView) getListView()).onRefreshComplete();
 
            super.onPostExecute();
        }
    }

So that’s basically how the example app from the project is setup. It just initializes a list of Strings and then on every refresh adds a String to the beginning of the list. In a real application we’ll probably need to beef this up a bit.

First let’s take that Task to task and do some real work. In my situation I need to refresh the list by calling an external api and retrieving all the data to be displayed. In this case its actually more efficient just to rebuild the whole list rather than calculating deltas and prepending to the existing list. For this example, assume we have a List as a class-level field managed by a custom ArrayAdapter.
Here’s the first iteration, the list is re-initialized in the task’s onPreExecute() phase, and the work is moved into the doInBackground() method.

private class GetDataTask extends AsyncTask {
 
        @Override
        protected void onPreExecute() {
		mList = new ArrayList();
	}    
 
        @Override
        protected Void doInBackground(Void... params) {
            JSONArray results = api.getData();
            for (int i=0; i &lt; results.length(); i++) {
                ListData data = parseResult(results[i]);
                mList.add(data);
            }
            return null;
        }
 
        @Override
        protected void onPostExecute() {
            // Call onRefreshComplete when the list has been refreshed.
            ((PullToRefreshListView) getListView()).onRefreshComplete();
 
            super.onPostExecute();
        }
    }

Seems like that should work ok, but I ran into a problem with this approach. As the user pulls down on the list, the onRefresh() method is called triggering the task, which starts by clearing out the mList array. At the same time, it seems that because of the UI changes, the system appears to be taking some measurements which is causing the getView() method to be called on the adapter that is managing the list. Now because we’ve emptied out the list, the application can exhibit some unpredictable behavior.
Let’s solve this in the next iteration by loading a temporary list in the background, and switching the list once we’re done. We should also consider that its possible we have some error while retrieving the new data, so in that case let’s not refresh the existing list. At least the user will still see their existing data.
Ok, now the GetDataTask looks like this:

private class GetDataTask extends AsyncTask {
 
        private List localList;
 
        @Override
        protected void onPreExecute() {
	    localList = new ArrayList();
        }    
 
        @Override
        protected Void doInBackground(Void... params) {
 
            try{
                JSONArray results = api.getData();
                for (int i=0; i &lt; results.length(); i++) {
                    ListData data = parseResult(results[i]);
                    localList.add(data);
                }
            } catch (Exception ex){
                localList=null;
                Log.e(TAG,&quot;Exception during refresh:&quot;,ex);
            }
            return null;
        }
 
        @Override
        protected void onPostExecute() {
 
             if(localList != null &amp;&amp; !localList.empty()){
                 mList = localList;
                 mListAdapter.notifyDataSetChanged();
             }
            // Call onRefreshComplete when the list has been refreshed.
            ((PullToRefreshListView) getListView()).onRefreshComplete();
 
            super.onPostExecute();
        }
    }

Alright, that’s looking pretty good now. For completeness we really should handle the possibility of the task getting cancelled. This can happen when the user navigates away from the app and the task is killed before its completed. This will cause the onPostExecute() method to not be called and so the onRefreshComplete() method won’t be called. Depending on how the user navigates through the app, they could return to this activity without going through the complete onCreate() lifecycle, and you’ll end up with the screen still showing the “loading” progress message in the header. This is common when using tabs between multiple ListViews.
Also, the documented best practices for implementing an AsyncTask says that in long running background work you should periodically check if the task has been cancelled and try to gracefully quit your work and exit. So let’s get all of that in there.

private class GetDataTask extends AsyncTask {
 
        private List localList;
 
        @Override
        protected void onPreExecute() {
	    localList = new ArrayList();
        }    
 
        @Override
        protected Void doInBackground(Void... params) {
 
            try{
                JSONArray results = api.getData();
 
                // check if task was cancelled during long api call
                if(isCancelled(){
                  return null;
               }
                for (int i=0; i &lt; results.length(); i++) {
                    ListData data = parseResult(results[i]);
                    localList.add(data);
                }
            } catch (Exception ex){
                localList=null;
                Log.e(TAG,&quot;Exception during refresh:&quot;,ex);
            }
            return null;
        }
 
        @Override
        protected void onPostExecute() {
 
             if(localList != null &amp;&amp; !localList.empty()){
                 mList = localList;
                 mListAdapter.notifyDataSetChanged();
             }
            // Call onRefreshComplete when the list has been refreshed.
            ((PullToRefreshListView) getListView()).onRefreshComplete();
 
            super.onPostExecute();
        }
 
        @Override
        protected void onCancelled() {
             // reset the UI
             ((PullToRefreshListView) getListView()).onRefreshComplete();
        }
    }

Now that you have a solid refresh implementation you may want to tweak the design of the refresh header. In the sample application they are using the Android “Light” theme. This makes the text black and easy to read. But if you’re using the default “Dark” theme you’ll find the text very hard to see. Here’s a look at the text portion of the refresh header layout, you can see that it references an attribute for the textAppearance style.

        <TextView
            android:id="@+id/pull_to_refresh_text"
            android:text="@string/pull_to_refresh_tap_label"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:textStyle="bold"
            android:paddingTop="5dip"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:gravity="center"
        />

Let’s tweak the color of the text to make it readable in our application. To do that, we’ll create a theme that overrides the style used by the textAppearanceMedium attribute. We’ll override this with our own style, which will inherit from the Android TextAppearance.Medium style and override the textColor attribute. Got all that?

First, here’s what Android’s style declaration looks like:

<style name="TextAppearance.Medium">
        <item name="android:textSize">18sp</item>
        <item name="android:textStyle">normal</item>
        <item name="android:textColor">?textColorPrimary</item>
</style>

Now here’s our theme and style declaration:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="MyCustomTheme" parent="android:Theme.NoTitleBar.Fullscreen">
    	<item name="android:textAppearanceMedium">@style/TextAppearance.Medium</item>
    </style>
 
    <style name="TextAppearance.Medium" parent="android:TextAppearance.Medium">
    	<item name="android:textColor">#FFCDC9C9</item>
    </style>
</resources>

And finally edit the Android Manifest in order to use the new theme:

<application android:name="MyApplication"
                     android:icon="@drawable/icon"
                     android:label="@string/app_name"
                     android:theme="@style/MyCustomTheme">
</application>

And that’s it, everything you you need to implement the pull to refresh gesture, handle the operation and customize the UI.

By the way, the android-pulltorefresh library is made available under the Apache License, V2.0. So you need to maintain any NOTICE files and copyright headers from the source. But you are free to redistribute in derivative works for commercial use.

Originally posted on Shared State

This Week in Mobile and Web 03.11.11

if you’re waiting in line for an iPad 2, save me a spot.

This week — and this year, for that matter — there has been a lot of talk about ‘mobile payments’.  Many of the top companies (read: banks) are scrambling to catch up, as startups like Square and Venmo have pretty much revolutionized the way that B2C — and even C2C — transactions are made.

Square was in the news this week, boasting “$1 million mobile payments per day”.  Which didn’t sit well, with the top credit card processor, VeriFone.  Here is the story, told with links.

And now, the rest of the news…

    Design // Develop

    OS News

    The Web

    Apps, Apps, and Additional Apps

    Device Central

    Carrier News

    Friday humor

    Win an iPad 2 or Motorola XOOM at Mobile March!

    That’s right, folks.  Recursive Awesome is giving away an Android 3.0 powered Motorola XOOM and a yet-to-be-released Apple iPad 2 at Mobile March Twin Cities.

    The Motorola XOOM has only been out for a couple of week, and it’s already making its mark in the world of tablets.  I was able to get my hands on a review unit.  You can read what I think about it here.

    Complete with front and rear-facing cameras, the iPad 2 is sure to take the market by storm…again.  It will be released on March 11th, and we’ll be there to snatch one up, just for you.

    Not sure what Mobile March is all about?  Take a peek at this blog post from Recursive Awesome founder, and Mobile March organizer, Justin Grammens.  If you can’t make it to the full event, check out Mobile 3D (Demos, Dinner and Drinks).  Mobile 3D is a new addition to Mobile March.  Mobile 3D is included with your Mobile March admission, or can be purchased separately.

    See you there!

    Motorola XOOM; One Tablet to Rule Them All [REVIEW]

    Okay.  Maybe I’m being a little dramatic.  However, based on my time with the XOOM, and my previous experience with the iPad, I think the XOOM, with Android 3.0 (Honeycomb) has much more potential than the iPad.

    Let’s dig in…

    The Guts

    The XOOM is packing the latest and greatest in mobile technology.  It has an NVIDIA Tegra2 1GHz dual-core processor, 1GB DDR2 RAM, and 32GB of on-board storage.  It also has a microSD slot, but won’t be enabled until a future software update.  There are two cameras; Rear 5MP with dual LED flash, Front 2MP.  It also records 720p HD video.  Both picture and video quality are on par with smartphones with the same specs.  in addition to recording in HD, the XOOM will playback 1080p HD videos.  There is an HDMI port on the bottom, but I’m unsure of its capabilities, as I didn’t have a cable.  Flanking the HDMI port, you’ll find micro USB and charging ports.  On a side note, the tablet will NOT charge via the USB port.  There are also metal, dock contacts on the bottom.  The only physical buttons on the device are the volume and power/unlock buttons.  The power/unlock button is on the back of the device, next to the camera.  It’s unintuitive at first, but you get used to it.  The XOOM is 4G capable…eventually.  Unfortunately, this upgrade cannot be performed with a simple software update.  You have to box it up and ship it off to Verizon.  Not an ideal upgrade.

    (Screen) Size Matters…or does it?

    You don’t have to be a mathematician to know that 10.1″ is larger than 9.7″.  However, when you actually measure the screens, the iPad and XOOM have roughly the same screen real estate.  The XOOM merely has a wider screen, so the total diagonal measurement is larger.  There are no physical UI buttons on the XOOM.  However, there is a persistent ”System Bar” visible on the bottom of the screen, which includes the BACK, HOME, and RECENT APPS soft buttons.  It also display Notifications, the time, connectivity and the battery meter.  As a developer, it doesn’t appear that you can hide it.  You can only enable “lights out mode” to dim the icons and information…but the bar is still there.  Additionally, developers have the option to use the built-in Action Bar, which give them a consistent location to place navigation, search, and context sensitive elements.  The stock Honeycomb Home app uses this.  Add up the extra space that the “bars” take up and 10.1″ is less than 9.7″.  Regardless, the screen size is fine.

    Apps – or – The Lack Thereof

    Google did a good job of retooling their apps to utilize the larger screen. Gmail, Calendar, Contacts, Books, Maps, Market, Music, Talk, and YouTube  all received the tablet treatment.  They even added a new core app called Movie Studio.  As the name suggests, Movie Studio is a movie editing app, which allows you to combine/trim video files as well as add images, transitions, and a music score.  Then you can export your video for future upload.  While it’s nice that the core apps have been tabletized, most of your favorite apps, in the Android Market, have not.  Google does now offer a “Apps for Tablets” section, but there are only 16 apps listed.  It’s possible that these are “featured” apps, and not the entire list of apps that are available.  Rest assured, most of your favorite apps will still work on  the XOOM.  They just might not fill the screen or look quite right.  It would have been nice if Google would have reached out to some key developers to have them upgrade their existing apps to be tablet-friendly.  At the time of writing this, Adobe Flash is not present on the XOOM.  The official announcement word is that it will be “available soon, as a free download” from the Android Market.

    Pricing and Availability

    The Motorola XOOM tablet is available now through Verizon Wireless or an authorized retailer.  You can purchase it for $599.99, with a new two-year contract, or $799.99, without a contract.  Data plan options are 1GB/$20, 3GB/$35, 5GB/$50, and 10GB/$80.  4G pricing is unknown at this time.  There are several accessories available, including a standard dock, an HD speaker dock, a protective case, and a wireless keyboard (not yet available on VZW’s site, but is available at Best Buy).

    In Conclusion, and In Summary…

    Overall, I like the XOOM.  Android 3.0 is very responsive.  The updated core apps and widgets are well designed for tablet use.  The other tablet apps, that are available in the Market, also work well.  The lack of SD card and Adobe Flash capabilities, out of the box, coupled with the 4G LTE mail-in upgrade puts the the XOOM on my “wait to purchase” list.  At least until they get this sorted out.  The other reason I would wait, to purchase this tablet, is to see what else is going to be available in the next two months.  LG, Samsung and a few other manufacturers have announced new tablets.  More competition may drive prices down.

    Made with Movie Studio

    Short HD Video Sample

    Sample Pictures & Screenshots

    This Week in Mobile and Web – 02.25.11

    This week, Verizon Wireless and Motorola released the XOOM Android tablet.  In my opinion, this is the first Android 3.0 (Honeycomb) tablet that will give the iPad a run for it’s money.  It has a 10.1″ screen, NVIDIA Tegra 2 1GHz dual-core processor, 1GB RAM, 32GB on-board storage, 5MP back cam with flash, 2MP front cam, HDMI, 720P video recording and playback, and a ton of other features (full specs).  As far as I can tell, Motorola and Verizon have not altered the operating system in any way.  There are no V-Cast or MotoBLUR apps preinstalled.  Google has updated the core apps for tablet consumptions; Gmail, Calendar, Browser, Camera, Gallery, Music.  They’ve even included Movie Studio, which allows you to splice, trim, fade, title, score and add photos to your recorded videos.

    Keep an eye out for my full review, coming soon.

    Development

    The Web

    Apps, Apps and Additional Apps

    Carrier News

    Device Central

    Friday Video

    Friday Infographic

    The Next Generation of Android Phones

    It all started with the T-Mobile G1 in 2008; The first Android powered smartphone.  3.2″ screen, 528 MHz processor, 192 MB RAM, 256 MB ROM, QWERTY keyboard.  It was a very underpowered device, but it set the wheels in motion.  The Android revolution had begun.

    Fast-forward to 2010.  Google releases the Nexus One.  The N1 was intended to be a “reference” phone.  It had the latest hardware (1GHz processor, 512 MB RAM and ROM, 5 MP Camera), a larger, 3.7″, AMOLED screen with a higher resolution, and it ran vanilla Android.  This phone (along with the previously released Motorola DROID) signified the start of “Gen 2″ in the Android universe.  Throughout 2010, many manufactures followed suit, releasing phones with similar specs to the Nexus One.  Some had larger screens.  Some with QWERTY keyboards.  Heck, a couple even saw a bump in processing power, to 1.2GHz.  Never-the-less, they were all still pretty much Gen 2.

    Fast-forward to present day…well, a few weeks ago.  Consumer Electronics Show 2011 (CES) opens its door to the public.  Traditionally, CES was all about audio and video products.  Over the past decade, computers and other tech gear has started to infiltrate the show floor.  Mobile phones and tablets have now carved out their own space.  Manufacturers and carriers alike are using CES to announce upcoming products and services.  Most of the phones shared some common attributes; larger screens, 4G technology, front-facing camera.  But just a few stood above the rest.  What makes these phones so special? Dual-core processors.

    Motorola stole the show by announcing, not one, but two phones that feature dual-core processors.  The Atrix 4G and the DROID Bionic.  The Atrix 4G will be available on AT&T and features a 4″ qHD screen (540×960 @ 240 dpi), 1GHz NVIDIA Tegra 2 dual-core processor, 1 GB RAM, 5 MP rear camera and a .3 MP front-facing camera.  Additionally, the Atrix 4G will have a whole host of accessories, including the standard-issue home and car docks.  It will also have two specialty docks.  The Laptop Dock has a large screen and keyboard.  It gives you access to Firefox web browsing, as well as the ability to still access your apps and make calls.  The HD Multimedia dock allows you to connect up to 3 USB devices, like a keyboard.

    As the name suggests, the DROID Bionic is part of the Verizon Wireless’ DROID series.  It has the same processor as the Atrix 4G.  However, it only has 512 MB ram.  Other differences include a 4.3″ screen (still qHD), 16 GB internal storage, and an 8 MP camera (with the front cam).  It doesn’t look like the Bionic have the same accessory mix as its brother.  I’d be willing to bet that there will be basic home and car docs.  One neat feature of the Bionic is Mirror Mode.

    Multiply your fun with Mirror Mode, which lets you enjoy all of your favorite apps, websites, videos, photos, and games full-screen on your larger home TV.

    This is something that I’ve been looking for in a phone.  It will be great to be able to demo apps for clients or for presentations.

    Motorola isn’t the only manufacturer throwing their hat into the dual-core ring.  LG announced the Optimus 2X some time ago and Samsung is teasing their next generation phone, just ahead of Mobile World Congress.

    With Mobile World Congress and CTIA just around the corner, I expect that most of the hottest new phones will rock dual-core processors.  Rumor has it that there will be quad-core phones out by December of this year.  I’ll believe it when I see it.

    This Week in Mobile and Web – 01.25.2011

    Hello, Readers!  It’s been awhile since we last chatted.  A lot has happened.  Let’s dive in.

    This Week in Shameless Plugs

    Mobile March is back!  Recursive Awesome is, once again, a platinum sponsor for the event.  Mobile March is a day-long (March 19th) event and will have two tracks, much like last year; Business and Development.  Many speakers have already signed up to present.  More are added everyday.  What’s new this year?  How about Mobile 3D?  Mobile 3D (Demos, Dinner, and Drinks) will give developers and business a chance to show off their mobile apps and services.  It will be held Friday night, before the event.  The best part?  It’s included with your Mobile March registration!

    Development

    OS News

    Web

    Apps

    Carrier News

    Devices

    This Week in Humor

    5 Reasons Why the iPhone on Verizon is a Big Meh

    iphone verizon meh

    Well, it finally happened.. Today is the day that many an iPhone fan has been waiting for. The iPhone is now available on the Verizon network! It has been hailed for years as the day that Apple would have access to the 93 million subscribers in the US and annihilate any other smartphone on the market ( or that is what Apple would like to have you believe ).

    After hearing this news today though, I paused and thought about exactly what this might mean to other mobile OS platforms on the market and in particular, Android. In short, I believe it really does little to harm the adoption of Android.

    Here’s why:

    1. Android Has Gained Adoptance : Android has been steadily cementing itself as a true contender to the iPhone throughout 2010. Last quarter it outsold the iPhone in number of units sold both in the US and worldwide. Here in the US it’s a little closer, but worldwide Android is being purchased well more than iPhone and is closing in on Symbian.

    Why does this matter? The iPhone on Verizon will use CDMA technology. The possible number of carriers and subscribers able to use CDMA is much smaller than what is currently used with a competing technology called GSM. GSM is more portable ( pop your sim card out and move to another phone ), is used by vastly more carrier worldwide and more importantly GSM allows for simultaneous data AND voice to occur at the same time. Remember those iPhone commercials where people are able to call someone AND surf the web at the same time? You won’t be able to do this on the iPhone with Verizon.

    2. IPhone not a 4G Device : Not only will the iPhone on Verizon be a CDMA device, it won’t be running on the new LTE (4G) network that the Android smartphone coming out around the same time will be on. What does this mean? If users are looking for fast download speeds ( 12 – 25 Mb/s ), they should skip the iPhone and purchase one of the many Android devices with LTE on the market.

    3. Users Are Stubborn : It’s hard for users to change devices. So many of Verizon’s users have bought Android phones. In fact, many phones were probably just bought this past holiday season. Sorry Apple, but these users are now Android users. If the iPhone would have been on Verizon BEFORE, say Thanksgiving or even earlier in the year, it would have carried more weight. But the millions of Android devices ( recall that 300,000 A DAY were being activated at one point ) this past holiday season are now Android users and as we all know, it’s very hard to get a user to convert from one platform to another.

    4. Competition is good : The assumption has been all along that when the iPhone came to Verizon, the other platforms would not be able to step up and compete. If there is one thing that I have seen in the past year is that competition in the smartphone market forces companies to innovate and create new products, new ways of solving problems and new technology. Look at Windows Phone 7 for example. Microsoft has put out a very solid device in the face of strict competition. It’s still a first stab ( arguable a much better first stab than Google’s own G1 in 2008 ) and Microsoft is innovating by trying a different design approach and user experience than both Apple and Google. Likewise with Palm WebOS V2. It’s a risk, but something that companies need to do to compete. With the iPhone coming to Verizon, it just means that Google MUST continue to improve Android. It’s a win for Android users!

    5. Need Other Carriers Besides Verizon : There is still T-Mobile, Sprint and many other networks around the world that after today still DON’T have the iPhone! Even though we will see many hundreds of millions of user’s having access to the iPhone while staying on a network running CDMA technology, there’s still many, many hundreds of millions more potential user’s that this announcement doesn’t affect. If the iPhone were suddenly announced on all of the carriers in the US and worldwide that Android devices were, this would be much more of a threat.

    Some people might read this as a negative article, but in reality I welcome the iPhone to Verizon! The more devices that are accessible to user, regardless of the network are better for consumers. This whole idea of “exclusive” devices per carrier is quite maddening. Owning and using both an Android device and an iPhone, I enjoy each for its own merits. At the end of the day, people will buy what devices they enjoy using and won’t have to deal with carriers exclusive terms. I dream of a day when all phones are available on any network and the consumer has true choice. Until that day though, we’ll have to wait years for an announcement like we heard today and realize that things that maybe seemed so ground breaking in a carrier controlled world, actually aren’t all that special. If things were just more open from the beginning ( imagine the market share Apple would have today if the iPhone was available on all networks back in January of 2007! ), we would have increased competition, advancement in the technology and announcements like we heard today won’t be such a… hmm, what’s the word? meh.

    This Week in Mobile and Web – 12.23.10

    It’s a short week, but there was no lack of mobile and web news.

    With the 2011 Consumer Electronics Show just about two weeks away, the pre-conference rumors and reports are pouring in.  I’ll be attending press conferences, industry sessions and hitting the show floor to bring you the latest and greatest news and info.  Keep and eye on the Recursive Awesome Twitter, Facebook and Blog feeds!

    Cheers,
    @breon

    CES Rumor Mill

    Development

    OS News

    Web

    Apps

    Carrier News

    Devices

    Friday Video

    This Week in Mobile and Web – 12.17.10

    The big news this week is that the Google Nexus S, by Samsung, is now available.  It’s sold exclusively at Best Buy and Best Buy Mobile stores.  You can buy it carrier unlocked (no A&TT 3G) and without a contact for $529.99.  If you want to sign up for a new T-Mobile contract you can get the phone for $199.99.  However, you can only buy it on contract at Best Buy stores that sell T-Mobile.  Don’t want to hassle with finding the right store?  Buy it online and get free express shipping!

    See the ninja unboxing video here.

    Development

    OS News

    The Web

    Apps

    Carrier News

    Devices

    Friday Visualization

    Facebook put out this neat friendship visualization map. (thanks Jared)