<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>kiefermat</title>
	
	<link>http://kiefermat.com</link>
	<description>[self.brain dump]</description>
	<lastBuildDate>Mon, 16 Apr 2012 18:46:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/kiefermat" /><feedburner:info uri="kiefermat" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Inspect HTTP requests from Android devices</title>
		<link>http://feedproxy.google.com/~r/kiefermat/~3/oXwqsan19m4/</link>
		<comments>http://kiefermat.com/2012/03/28/inspect-http-requests-from-android-devices/#comments</comments>
		<pubDate>Wed, 28 Mar 2012 20:13:27 +0000</pubDate>
		<dc:creator>kiefermat</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Howtos]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[HTTP]]></category>

		<guid isPermaLink="false">http://kiefermat.com/?p=374</guid>
		<description><![CDATA[Sometimes it is necessary to have a detailed view on the HTTP requests sent by your Android app and also inspect the responses from the server. With a few steps, it is quite easily possible to do this: Connect your &#8230; <a href="http://kiefermat.com/2012/03/28/inspect-http-requests-from-android-devices/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Sometimes it is necessary to have a detailed view on the HTTP requests sent by your Android app and also inspect the responses from the server. With a few steps, it is quite easily possible to do this:</p>
<p><span id="more-374"></span></p>
<ul>
<li>Connect your Android device and your PC with the same network, e.g. by connecting the PC to the same Wifi.</li>
<li>On the PC, install <a href="http://www.fiddler2.com/fiddler2/" target="_blank">Fiddler</a>. </li>
<li>Make sure, Fiddler is configured to allow remote computers to connect:<br />
<a href="http://kiefermat.com/wp-content/uploads/2012/03/Fiddler_Connections.png"><img src="http://kiefermat.com/wp-content/uploads/2012/03/Fiddler_Connections-300x199.png" alt="" title="Fiddler Connections Settings" width="300" height="199" class="alignnone size-medium wp-image-381" /></a>	</li>
<li>
If you want, you can user Fiddler also to capture HTTPS traffic:<br />
<a href="http://kiefermat.com/wp-content/uploads/2012/03/Fiddler-HTTPS.png"><img src="http://kiefermat.com/wp-content/uploads/2012/03/Fiddler-HTTPS-300x199.png" alt="" title="Fiddler HTTPS Settings" width="300" height="199" class="alignnone size-medium wp-image-383" /></a></li>
<li>In your Android app you have to set your PC as proxy server for the HTTP traffic. To do this, you have to provide the proxy information to the HttpClient by setting a HttpHost instance pointing to your PC’s IP address and the port Fiddler is listening at as proxy in the Http parameters:
<pre class="brush: plain; title: ; notranslate">
HttpParams httpParameters = new BasicHttpParams();
HttpHost proxy = new HttpHost(&quot;&lt;your PC's IP&gt;&quot;, 8888);
httpParameters.setParameter(ConnRoutePNames.DEFAULT_PROXY
        , proxy);

httpClient = new DefaultHttpClient(httpParameters);
</pre>
</li>
</ul>
<p>Now let Fiddler run on your PC and capture the traffic. Compile your Android app and start it on your mobile device.<br />
That’s it. Fiddler should now show you what’s going on between your Android app and the servers it is connecting.</p>
<p><strong>Troubleshooting:</strong></p>
<p>Your app can&#8217;t connect to the server</p>
<ul>
<li>Make sure, that the correct IP address is set as proxy.</li>
<li>Make sure, the PC is reachable from your Android device. E.g. check if the Android device is connected to the same Wifi as the PC</li>
<li>Make sure, that Fiddler correctly setup the Firewall. Try connecting with disabled firewall.</li>
</ul>
<img src="http://feeds.feedburner.com/~r/kiefermat/~4/oXwqsan19m4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://kiefermat.com/2012/03/28/inspect-http-requests-from-android-devices/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://kiefermat.com/2012/03/28/inspect-http-requests-from-android-devices/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=inspect-http-requests-from-android-devices</feedburner:origLink></item>
		<item>
		<title>Testing HTTP requests on Android using Robolectric</title>
		<link>http://feedproxy.google.com/~r/kiefermat/~3/VAx0layefnk/</link>
		<comments>http://kiefermat.com/2012/03/21/testing-http-requests-on-android-using-robolectric/#comments</comments>
		<pubDate>Wed, 21 Mar 2012 20:37:18 +0000</pubDate>
		<dc:creator>kiefermat</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[JUnit]]></category>
		<category><![CDATA[Robolectric]]></category>
		<category><![CDATA[Unit Testing]]></category>

		<guid isPermaLink="false">http://kiefermat.com/?p=346</guid>
		<description><![CDATA[With Robolectric you can not only mock HTTP responses for your code, but you can also test which HTTP requests your code sends. To do this, you can easily use either one of the static methods provided in the Robolectric &#8230; <a href="http://kiefermat.com/2012/03/21/testing-http-requests-on-android-using-robolectric/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>With <a href="http://robolectric.org/" target="_blank">Robolectric</a> you can not only <a href="http://kiefermat.com/2012/03/19/mocking-http-responses-in-android-using-robolectric/" title="Mocking HTTP responses in Android using Robolectric">mock HTTP responses</a> for your code, but you can also test which HTTP requests your code sends. To do this, you can easily use either one of the static methods provided in the <a href="http://pivotal.github.com/robolectric/javadoc/com/xtremelabs/robolectric/Robolectric.html" target="_blank">Robolectric</a> class or you can use methods of the <a href="http://pivotal.github.com/robolectric/javadoc/com/xtremelabs/robolectric/tester/org/apache/http/FakeHttpLayer.html" target="_blank">FakeHTTPLayer</a>.</p>
<p><span id="more-346"></span></p>
<p>Say, you want to test, if there was a HTTP request sent at all. In this case, you can use the following code:</p>
<pre class="brush: plain; title: ; notranslate">
assertTrue(Robolectric.httpRequestWasMade());
</pre>
<p>Or you want to check, if a call to a certain uri was made:</p>
<pre class="brush: plain; title: ; notranslate">
assertTrue(Robolectric.
        httpRequestWasMade(&quot;http://www.myserver.com/&quot;));
</pre>
<p>If you want to check for some more complex rules, you can use the method <a href="http://pivotal.github.com/robolectric/javadoc/com/xtremelabs/robolectric/tester/org/apache/http/FakeHttpLayer.html#hasRequestMatchingRule%28com.xtremelabs.robolectric.tester.org.apache.http.RequestMatcher%29" target="_blank">hasRequestMatchingRule</a> of the <a href="http://pivotal.github.com/robolectric/javadoc/com/xtremelabs/robolectric/tester/org/apache/http/FakeHttpLayer.html" target="_blank">FakeHttpLayer</a> class and provide a request matcher that tests your criteria, e.g. if the request contains a certain header:</p>
<pre class="brush: plain; title: ; notranslate">
assertTrue(Robolectric.getFakeHttpLayer()
    .hasRequestMatchingRule(
    new RequestMatcher() {
        @Override
        public boolean matches(HttpRequest request) {
            if (request.containsHeader(&quot;X-CustomHeader&quot;)) {
                return true;
            }

            return false;
        }
    }));
</pre>
<p>To get the sent requests in the order of sending, you can use the method <a href="http://pivotal.github.com/robolectric/javadoc/com/xtremelabs/robolectric/tester/org/apache/http/FakeHttpLayer.html#getSentHttpRequestInfos%28%29">FakeHttpLayer.<br />
getSentHttpRequestInfos</a> and then e.g. check if the correct number of requests has been sent, the correct methods have been called, etc.:</p>
<pre class="brush: plain; title: ; notranslate">
List&lt;HttpRequestInfo&gt; sentRequests =
        Robolectric.getFakeHttpLayer().getSentHttpRequestInfos();
assertTrue(sentRequests.size() == 2);

HttpRequestInfo firstRequest = sentRequests.get(0);
assertTrue(firstRequest.getHttpRequest()
        .containsHeader(&quot;X-CustomHeader&quot;));
assertTrue(firstRequest.getHttpHost().getPort() == 8080);
</pre>
<p><strong>Conclusion</strong><br />
Robolectric provides some very helpful methods to test if your code sents the correct HTTP requests in the correct order. </p>
<hr />
My other <a href="http://kiefermat.com/tag/robolectric/">articles about Robolectric</a> might also be interesting for you.</p>
<img src="http://feeds.feedburner.com/~r/kiefermat/~4/VAx0layefnk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://kiefermat.com/2012/03/21/testing-http-requests-on-android-using-robolectric/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://kiefermat.com/2012/03/21/testing-http-requests-on-android-using-robolectric/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=testing-http-requests-on-android-using-robolectric</feedburner:origLink></item>
		<item>
		<title>Mocking HTTP responses in Android using Robolectric</title>
		<link>http://feedproxy.google.com/~r/kiefermat/~3/iWm-7TnOzf0/</link>
		<comments>http://kiefermat.com/2012/03/19/mocking-http-responses-in-android-using-robolectric/#comments</comments>
		<pubDate>Mon, 19 Mar 2012 21:25:26 +0000</pubDate>
		<dc:creator>kiefermat</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[JUnit]]></category>
		<category><![CDATA[Robolectric]]></category>
		<category><![CDATA[Unit Testing]]></category>

		<guid isPermaLink="false">http://kiefermat.com/?p=320</guid>
		<description><![CDATA[One of the nice features of Robolectric, is its ability to intercept HTTP requests and provide a way to return the HTTP responses you want. It is very useful, if you want to test code that reacts on certain HTTP &#8230; <a href="http://kiefermat.com/2012/03/19/mocking-http-responses-in-android-using-robolectric/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>One of the nice features of <a href="http://robolectric.org" target="_blank">Robolectric</a>, is its ability to intercept HTTP requests and provide a way to return the HTTP responses you want. It is very useful, if you want to test code that reacts on certain HTTP requests. To accomplish this, Robolectric provides a <a href="http://pivotal.github.com/robolectric/javadoc/com/xtremelabs/robolectric/tester/org/apache/http/FakeHttpLayer.html">fake HTTP layer</a>, which you can configure with different complexity levels depending on your needs.</p>
<p><span id="more-320"></span></p>
<ul>
<li><strong>One response for all: <a href="http://pivotal.github.com/robolectric/javadoc/com/xtremelabs/robolectric/Robolectric.html#setDefaultHttpResponse(org.apache.http.HttpResponse)" target="_blank">Robolectric.setDefaultHttpResponse</a></strong><br />
Using this static method, you can set a HTTP response that is returned by the fake HTTP layer when there is no other response rule matching. If you only set an HTTP response with this method, all HTTP requests made will receive the given HTTP response as return value.<br />
E.g. if you always want to return just a success code, you could use the following line of code:</p>
<pre class="brush: plain; title: ; notranslate">
Robolectric.setDefaultHttpResponse(200, &quot;response body&quot;);
</pre>
<p>or you always want to fail:</p>
<pre class="brush: plain; title: ; notranslate">
Robolectric.setDefaultHttpResponse(400, null);
</pre>
</li>
<li><strong>Using defined order of HTTP responses: <a href="http://pivotal.github.com/robolectric/javadoc/com/xtremelabs/robolectric/Robolectric.html#addPendingHttpResponse(int,%20java.lang.String)">Robolectric.addPendingHTTPResponse</a></strong><br />
Using these static method, you can just put HTTP responses in a queue, which will then be returned by Robolectric one after the other for consecutive HTTP requests.</p>
<p>Say, the first HTTP request should return a status code of 400 and the second one a status code of 200:</p>
<pre class="brush: plain; title: ; notranslate">
Robolectric.addPendingHttpResponse(400, null);
Robolectric.addPendingHttpResponse(200, &quot;some content&quot;);
</pre>
<p>To make sure a failing test does not leave some responses in the queue, you should always call <a href="http://pivotal.github.com/robolectric/javadoc/com/xtremelabs/robolectric/Robolectric.html#clearPendingHttpResponses()">Robolectric.clearPendingHTTPResponses</a> after each test.
</li>
<li><strong>Complex response rules: <a href="http://pivotal.github.com/robolectric/javadoc/com/xtremelabs/robolectric/Robolectric.html#addHttpResponseRule(com.xtremelabs.robolectric.tester.org.apache.http.RequestMatcher,%20org.apache.http.HttpResponse)">Robolectric.addHTTPResponseRule</a></strong><br />
In some cases it can be useful to setup the fake HTTP layer to return HTTP responses based on hostaddress, the path on the server, the HTTP method, etc. E.g. if you want to provide a 200 response for the uri http://www.myserver.com/successfullcall and a 400 response for the uri http://www.myserver.com/failedcall you can use the following code:</p>
<pre class="brush: plain; title: ; notranslate">
ProtocolVersion httpProtocolVersion = new ProtocolVersion(&quot;HTTP&quot;, 1, 1);
HttpResponse successResponse =
        new BasicHttpResponse(httpProtocolVersion, 200, &quot;OK&quot;);
Robolectric.addHttpResponseRule(&quot;http://www.myserver.com/successfullcall&quot;, successResponse);

HttpResponse failedResponse =
        new BasicHttpResponse(httpProtocolVersion, 400, &quot;Bad Request&quot;);
Robolectric.addHttpResponseRule(&quot;http://www.myserver.com/failedcall&quot;, failedResponse);
</pre>
<p>Of course, you can also provide some content with your responses by adding an entity to the response object:</p>
<pre class="brush: plain; title: ; notranslate">
successResponse.setEntity(
        new StringEntity(&quot;the content to return&quot;));
</pre>
</li>
<li><strong>Dynamic Responses</strong><br />
Instead of adding static responses to some pre-defined rules, you can also create an object that inherits from <a href="http://pivotal.github.com/robolectric/javadoc/com/xtremelabs/robolectric/tester/org/apache/http/HttpEntityStub.ResponseRule.html">ResponseRule</a> and where you can create new HTTP response on every request.<br />
As an example we want to return the number of the request as content each time our rule matches:</p>
<pre class="brush: plain; title: ; notranslate">
class CountingResponseRule implements ResponseRule {

    private int mCounter = 0;

    @Override
    public HttpResponse getResponse() throws HttpException, IOException {
        HttpResponse response= new BasicHttpResponse(
                   new ProtocolVersion(&quot;HTTP&quot;, 1, 1), 200, &quot;OK&quot;);
        response.setEntity(new StringEntity(Integer.toString(mCounter));
        mCounter++;

        return response;
    }

    @Override
    public boolean matches(HttpRequest request) {
        String uri = request.getRequestLine().getUri();
        if (uri.equals(&quot;http://www.myserver.com/counter&quot;)) {
            return true;
        }

        return false;
    }
}
</pre>
<p>Then add this rule using</p>
<pre class="brush: plain; title: ; notranslate">
Robolectric.getFakeHttpLayer().addResponseRule(
        new CountingResponseRule()));
</pre>
</li>
</ul>
<p><strong>Conclusion</strong><br />
Robolectric provides a powerful way to return different HTTP responses to HTTP requests in your code and test how your code reacts on these responses. It is easy to create test cases which verify that your code will behave correctly even if the server reacts with weird responses.</p>
<hr />
My other <a href="http://kiefermat.com/tag/robolectric/">articles about Robolectric</a> might also be interesting for you.</p>
<img src="http://feeds.feedburner.com/~r/kiefermat/~4/iWm-7TnOzf0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://kiefermat.com/2012/03/19/mocking-http-responses-in-android-using-robolectric/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://kiefermat.com/2012/03/19/mocking-http-responses-in-android-using-robolectric/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=mocking-http-responses-in-android-using-robolectric</feedburner:origLink></item>
		<item>
		<title>Android Unit Testing with Robolectric</title>
		<link>http://feedproxy.google.com/~r/kiefermat/~3/dSVus3elgaw/</link>
		<comments>http://kiefermat.com/2012/03/14/android-unit-testing-with-robolectric/#comments</comments>
		<pubDate>Wed, 14 Mar 2012 19:27:51 +0000</pubDate>
		<dc:creator>kiefermat</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[JUnit]]></category>
		<category><![CDATA[Robolectric]]></category>
		<category><![CDATA[Unit Testing]]></category>

		<guid isPermaLink="false">http://kiefermat.com/?p=308</guid>
		<description><![CDATA[The last weeks I had the chance to dive deeper into unit testing of an Android application. The solution we are using is Robolectric. It is an interesting and promising framework since it does not need an emulator but just &#8230; <a href="http://kiefermat.com/2012/03/14/android-unit-testing-with-robolectric/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>The last weeks I had the chance to dive deeper into unit testing of an Android application. The solution we are using is <a href="http://robolectric.org" target="_blank">Robolectric</a>. It is an interesting and promising framework since it does not need an emulator but just runs as standard junit test. The tests we have been able to write and run with it are great. You can even create an instance of an activity, inflate the UI from layout files and check the state of single views. Or you can send a broadcast intent and check if it has been received.</p>
<p>Of course, Robolectric does not create a real UI for the tests. The way Robolectric allows testing of Android applications, works by intercepting the creation of instances of Android classes and provides some kind of proxy objects for them (so called Shadows). This way, the Robolectric developers have been able to rewrite parts of the platform&#8217;s behaviour, emulate the logic of a lot of classes and internally keep track of the state of the objects. </p>
<p>While this allows for efficient unit and integration testing without starting an emulator, it is clear that Robolectric tests do not replace testing on real Android devices or emulators with different OS versions. There are a few reasons for this:</p>
<ul>
<li>The code just emulates the logic the Robolectric developers have implemented. For the most common use cases, this works well, but you find missing/limited functionality quite quickly. This will improve over time. Nevertheless, one has to be aware of the fact, that not the real Android classes are used and the behaviour can be different from the Robolectric classes.</li>
<li>The Robolectric framework does not emulate the real lifetime of an whole application. E.g. it will not start an activity or a service on its own. Also, it does not emulate the lifecycle of activities. This is by purpose, since it anyway is meant only for testing single units of the app. Of course, you can check which intent is being sent from an activity, which allows for testing the correct behaviour.</li>
<li>There are also general limits to this concept. E.g. when your app is not based on the standard View classes, but uses OpenGL, this can not be tested with Robolectric. I would say, all cases where real hardware is involved, can not be tested.</li>
</ul>
<p>In summary, Robolectric allows efficient testing of a lot of use cases of an Android application. It is certainly not enough to make sure it will run on all devices. But it already provides a way to cover a lot of use cases of standard Android applications and make sure that the single components of your app behave correctly.</p>
<p>One thing that is heavily missing is better documentation, though. Without having the source code of Robolectric available and checking how it is implemented or looking at the unit tests of Robolectric itself, I would have not been able to figure out how some things are expected to work.<br />
Therefore, I will try to collect here some howtos and hints for Robolectric in the coming weeks.</p>
<hr />
My other <a href="http://kiefermat.com/tag/robolectric/">articles about Robolectric</a> might also be interesting for you.</p>
<img src="http://feeds.feedburner.com/~r/kiefermat/~4/dSVus3elgaw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://kiefermat.com/2012/03/14/android-unit-testing-with-robolectric/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://kiefermat.com/2012/03/14/android-unit-testing-with-robolectric/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=android-unit-testing-with-robolectric</feedburner:origLink></item>
		<item>
		<title>My summary of the Android Open Conference 2011</title>
		<link>http://feedproxy.google.com/~r/kiefermat/~3/HfHtiOrEx9c/</link>
		<comments>http://kiefermat.com/2011/10/14/my-summary-of-the-android-open-conference-2011/#comments</comments>
		<pubDate>Fri, 14 Oct 2011 13:09:37 +0000</pubDate>
		<dc:creator>kiefermat</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[Conference]]></category>
		<category><![CDATA[Design Principle]]></category>

		<guid isPermaLink="false">http://kiefermat.com/?p=292</guid>
		<description><![CDATA[After arriving back in Germany from the O&#8217;Reilly Android Open Conference in San Francisco, I want to summarize my conclusions and general impressions. Being in San Francisco and attending the conference was very inspiring. The keynotes have given a great &#8230; <a href="http://kiefermat.com/2011/10/14/my-summary-of-the-android-open-conference-2011/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>After arriving back in Germany from the <a href="http://androidopen.com/android2011">O&#8217;Reilly Android Open Conference</a> in San Francisco, I want to summarize my conclusions and general impressions.</p>
<p>Being in San Francisco and attending the conference was very inspiring. The keynotes have given a great overview what is possibly coming in the future and having <a href="http://androidopen.com/android2011/public/schedule/detail/21620">Tim O&#8217;Reilly speaking</a> about leveraging the openness of the Android platform was very motivating. As well as seeing what people are doing with standard hardware, like the NASA with <a href="http://androidopen.com/android2011/public/schedule/detail/21761">Nexus S based mini satellites</a> is crazy.</p>
<p>What was also great, was to &#8220;feel&#8221; what makes the bay area so special in terms of innovations: ways are short, it is easy to connect with people from great companies ( be it startups or established ones), you get first class information from first hand, and people are very open to try out new things.</p>
<p><span id="more-292"></span></p>
<p>Regarding devices: I had the impression that tablets are not really in focus of the Android developers. One is aware that you should support them, but most focus lies on the phone. This is also backed by the numbers that have been <a href="http://androidopen.com/android2011/public/schedule/detail/20831">presented by Flurry</a>: Android tablets are not very wide spread.</p>
<p>The <a href="http://androidopen.com/android2011/public/schedule/detail/20831">Flurry talk</a> was very interesting BTW. Seing which categories are having the most usage time and and how and when people are using the apps have been enlightening. Also that a typical lifecycle of an app is independent of the category and that in average 50% of the users will not use your app anymore after one week.</p>
<p><strong>Cross Platform</strong></p>
<p>A topic that was very present was how to effectively develop apps that should run on multiple mobile platforms, mainly iOS and Android, and what to care about in designing the interface. As expected there was no silver bullet for this problem. However, a very interesting way to approach this is to mix native and HTML5 content. But not in the way e.g. Phonegap is doing it. Instead, the app itself is developed natively but wherever possible a webview with reusable HTML5 code is integrated. Especially, this seem to working well with views containing only a certain amount of information, like a detailed view or similiar. This approach was mentioned several times to be used successfully, e.g. by LinkedIn&#8217;s Director of Engineering Mobile Kiran Prasad and Nick Farina, CTO from Meridian.</p>
<p>In designing apps the general concensus was to keep the apps similiar but adapt to platforms where the concept is different. E.g. an Android app should normally not need to have a back button in the UI but should rather leverage the hardware back button instead. Also an interesting point mentioned by Kiran Prasad is that especially the navigation behavior is different on the platforms. On Android users are used to getting back also to a different context where on iOS they are e.g. not expecting that and instead back is working on the current context only.</p>
<p>Regarding designing the workflow of an mobile app, Kiran Prasad provided a great overview <a href="http://androidopen.com/android2011/public/schedule/detail/21272">how LinkedIn does it</a>. He provided the analogy to speak of room planning when designing the app and concentrate on how the rooms are connected and what the rooms do and have instead of room decor. Especially interesting was they they found out that if you have more than 4 rooms (to stay in this analogy) people will make it hard for people to navigate in your app. In addition, each room should not have more than 3 levels of depth to not confuse the user.</p>
<p><strong>Recommended Talks</strong></p>
<p>The slides and videos of most talks are <a href="http://androidopen.com/android2011/public/schedule/proceedings">publicly available</a>, so don&#8217;t  hesitate to go there and check it out.</p>
<p>Some talks I can recommend for viewing (not for all of them videos and slides are already present. Hopefully, these will be posted later):</p>
<ul>
<li><a href="http://androidopen.com/android2011/public/schedule/detail/21620">What Android Can Learn from Steve Jobs: Tim O&#8217;Reilly&#8217;s Keynote</a></li>
<li><a href="http://androidopen.com/android2011/public/schedule/detail/21013">Getting the Magic on Android Tablets</a>: Suzanne Alexandra from Motorola provides some great hints on how to design apps for Android tablets</li>
<li><a href="http://androidopen.com/android2011/public/schedule/detail/20991">Challenges of Building HTC Sense</a>: David Wu from HTC provides excellent tips and tricks on how to improve performance of your apps and how to provide a good user experience.</li>
<li><a href="http://androidopen.com/android2011/public/schedule/detail/21272">Cross Platform Mobile Applications: How LinkedIn Does It</a>: An excellent talk by Kiran Prasad from LinkedIn on how to successfully design and develop cross platform mobile apps</li>
<li><a href="http://androidopen.com/android2011/public/schedule/detail/21652">From iOS to Android</a>: Nick Farina from Meridian talks about their experiences in develop cross platform mobile apps</li>
<li><a href="http://androidopen.com/android2011/public/schedule/detail/20930">Beautiful Android</a>: Eric Burke from Square provides some good hints on creating pixel perfect apps on Android
</ul>
<img src="http://feeds.feedburner.com/~r/kiefermat/~4/HfHtiOrEx9c" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://kiefermat.com/2011/10/14/my-summary-of-the-android-open-conference-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://kiefermat.com/2011/10/14/my-summary-of-the-android-open-conference-2011/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=my-summary-of-the-android-open-conference-2011</feedburner:origLink></item>
		<item>
		<title>SQLiteOpenHelper with Database on SD card</title>
		<link>http://feedproxy.google.com/~r/kiefermat/~3/ChnS9pKCvQU/</link>
		<comments>http://kiefermat.com/2011/10/07/sqliteopenhelper-with-database-on-sd-card/#comments</comments>
		<pubDate>Fri, 07 Oct 2011 10:00:25 +0000</pubDate>
		<dc:creator>kiefermat</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Howtos]]></category>
		<category><![CDATA[ContentProvider]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[SDCard]]></category>

		<guid isPermaLink="false">http://kiefermat.com/?p=228</guid>
		<description><![CDATA[For certain reasons, e.g. because a database is very big, it might be necessary to put the database on the SD card instead of the internal storage of the phone. Of course, putting the database on the SD card should &#8230; <a href="http://kiefermat.com/2011/10/07/sqliteopenhelper-with-database-on-sd-card/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>For certain reasons, e.g. because a database is very big, it might be necessary to put the database on the SD card instead of the internal storage of the phone. Of course, putting the database on the SD card should be carefully thought through because it adds quite a lot of complexity, e.g. by having to deal with the case that the SD card is unmounted or replaced.</p>
<p>Nevertheless, in cases this approach might be appropriate, it is not obvious how to configure the location of the database if you are using <a href="http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html">SQLiteOpenHelper</a>. The solution is to overwrite the context&#8217;s <a href="http://developer.android.com/reference/android/content/Context.html#openOrCreateDatabase%28java.lang.String,%20int,%20android.database.sqlite.SQLiteDatabase.CursorFactory%29">openOrCreateDatabase</a> method. This method is called by SQLiteOpenHelper when it needs to open the actual database.</p>
<p>E.g. you can use the following code to store the database in the applications private folder on the sdcard.</p>
<pre class="brush: java; title: ; notranslate">
@Override
public SQLiteDatabase openOrCreateDatabase(String name, int mode,
CursorFactory factory) {
    File externalFilesDir = getExternalFilesDir(null);
    if(externalFilesDir == null) {
        return null;
    }

    File dbFile = new File(externalFilesDir, name);
    return SQLiteDatabase.openDatabase(dbFile.getAbsolutePath(), null, SQLiteDatabase.CREATE_IF_NECESSARY);
}
</pre>
<p>To overwrite this method, you can either inherit from <a href="http://developer.android.com/reference/android/content/ContextWrapper.html">ContextWrapper</a> and then provide the wrapped context to the constructor of SQLiteOpenHelper or you can e.g. provide an own <a href="http://developer.android.com/reference/android/app/Application.html">Application</a> class with this overwritten method and then give the application context to the constructor of SQLiteHelper.</p>
<img src="http://feeds.feedburner.com/~r/kiefermat/~4/ChnS9pKCvQU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://kiefermat.com/2011/10/07/sqliteopenhelper-with-database-on-sd-card/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://kiefermat.com/2011/10/07/sqliteopenhelper-with-database-on-sd-card/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=sqliteopenhelper-with-database-on-sd-card</feedburner:origLink></item>
		<item>
		<title>Using UIWebView for displaying Rich Text</title>
		<link>http://feedproxy.google.com/~r/kiefermat/~3/19Qb9lzlHT0/</link>
		<comments>http://kiefermat.com/2011/09/30/using-uiwebview-for-displaying-rich-text/#comments</comments>
		<pubDate>Fri, 30 Sep 2011 09:18:20 +0000</pubDate>
		<dc:creator>kiefermat</dc:creator>
				<category><![CDATA[Howtos]]></category>
		<category><![CDATA[iOS]]></category>

		<guid isPermaLink="false">http://kiefermat.com/?p=202</guid>
		<description><![CDATA[If you need to display rich text in your iOS application, the easiest way is to use a UIWebView for this. If you have only one or two links in a text, activating link detection in a UITextView might be &#8230; <a href="http://kiefermat.com/2011/09/30/using-uiwebview-for-displaying-rich-text/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>If you need to display rich text in your iOS application, the easiest way is to use a <a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/UIWebView_Class/Reference/Reference.html" target="_blank">UIWebView</a> for this. If you have only one or two links in a text, activating link detection in a <a href="http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UITextView_Class/Reference/UITextView.html" target="_blank">UITextView</a> might be the fastest way. However, you not always want to display the full link to the user or you might want to structure the text with headings or colors etc. In all these cases, the <a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/UIWebView_Class/Reference/Reference.html" target="_blank">UIWebView</a> gives you the full power of HTML.</p>
<p>Since integrating the <a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/UIWebView_Class/Reference/Reference.html" target="_blank">UIWebView</a> is not straight forward for all features, you can find here a summary on how to accomplish this.<br />
<span id="more-202"></span></p>
<h3>What do we want to achieve?</h3>
<p>First, let&#8217;s define what we want to do: The view should behave like a normal text view, but display rich text instead of normal text only. This also means that in some cases, we want to have a transparent background and if the user clicks a link, the page should be opened in the external browser.</p>
<h3>Adding the UIWebView</h3>
<p>The UIWebView can be added to your view as you do with any other view, either programmatically or using the Interface Builder.</p>
<h3>Setting the Text</h3>
<p>To set the text, you call the method <a href="http://developer.apple.com/library/ios/documentation/uikit/reference/UIWebView_Class/Reference/Reference.html#//apple_ref/occ/instm/UIWebView/loadHTMLString:baseURL:">loadHTMLString:baseURL:</a> on your instance of the UIWebView. You can set the baseURL to nil if you want. For the content string you have to keep in mind that the view is made to display HTML pages. Therefore, you have to provide valid HTML content for the HTML string.<br />
Setting a very basic HTML string could look like the following:</p>
<pre class="brush: objc; title: ; notranslate">
NSString* plainContent = @&quot;My &lt;strong&gt;HTML&lt;/strong&gt; markup&quot;;
NSString* htmlContentString = [NSString stringWithFormat:
  @&quot;&lt;html&gt;&quot;
   &quot;&lt;body&gt;&quot;
   &quot;&lt;p&gt;%@&lt;/p&gt;&quot;
   &quot;&lt;/body&gt;&lt;/html&gt;&quot;, plainContent];

[webView loadHTMLString:htmlContentString baseURL:nil];
</pre>
<h3>Setting Text Properties</h3>
<p>If you want to change the font, the font size or other markup related properties, you have provide this properties in the HTML string, e.g. by setting the body style. Of course, you can use the full power of CSS, but we want to keep this article simple. So, to set font and font size for the whole document you can use the following code (note the additional style element for the body):</p>
<pre class="brush: objc; highlight: [4,5,6]; title: ; notranslate">
NSString* plainContent = @&quot;My &lt;strong&gt;HTML&lt;/strong&gt; markup&quot;;
NSString* htmlContentString = [NSString stringWithFormat:
    @&quot;&lt;html&gt;&quot;
     &quot;&lt;style type=\&quot;text/css\&quot;&gt;&quot;
     &quot;body { font-family:Marker Felt; font-size:24;}&quot;
     &quot;&lt;/style&gt;&quot;
     &quot;&lt;body&gt;&quot;
     &quot;&lt;p&gt;%@&lt;/p&gt;&quot;
     &quot;&lt;/body&gt;&lt;/html&gt;&quot;, plainContent];

[webView loadHTMLString:htmlContentString baseURL:nil];
</pre>
<h3>Transparent Background</h3>
<p>If you want to have a transparent background for your UIWebView, you have to set this property on two places. First, you have to set the background color of the view itself to be transparent. But since the webpage you display also has a background color, this is not enough. Therefore, you also have to set the background color of the HTML content to be transparent by setting the background property of the body style to &#8220;transparent&#8221;:</p>
<pre class="brush: objc; highlight: [1,7]; title: ; notranslate">
[webView setBackgroundColor:[UIColor clearColor]];

NSString* plainContent = @&quot;My &lt;strong&gt;HTML&lt;/strong&gt; markup&quot;;
NSString* htmlContentString = [NSString stringWithFormat:
     @&quot;&lt;html&gt;&quot;
      &quot;&lt;style type=\&quot;text/css\&quot;&gt;&quot;
      &quot;body { background-color:transparent; font-family:Marker Felt; font-size:24;}&quot;
      &quot;&lt;/style&gt;&quot;
      &quot;&lt;body&gt;&quot;
      &quot;&lt;p&gt;%@&lt;/p&gt;&quot;
      &quot;&lt;/body&gt;&lt;/html&gt;&quot;, plainContent];

[webView loadHTMLString:htmlContentString baseURL:nil];
</pre>
<h3>Open links in External Browser</h3>
<p>By default, the UIWebView handles links by itself and loads and displays the linked content. Since we do not want this behavior we need to catch clicks on links and forward them to Safari (or any other app that handles the clicked URL).</p>
<p>UIWebView  provides a delegate property for this, where you can set a delegate implementing the <a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/UIWebViewDelegate_Protocol/Reference/Reference.html#//apple_ref/doc/uid/TP40006951">UIWebViewDelegate protocol</a>. The important method for us is <a href="http://developer.apple.com/library/ios/documentation/uikit/reference/UIWebViewDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intfm/UIWebViewDelegate/webView:shouldStartLoadWithRequest:navigationType:">webView:shouldStartLoadWithRequest:navigationType:</a></p>
<p>So in viewDidLoad you could set the delegate to an instance of an object implementing the following method:</p>
<pre class="brush: objc; title: ; notranslate">
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    if ( navigationType == UIWebViewNavigationTypeLinkClicked )
    {
        [[UIApplication sharedApplication] openURL:[request URL]];
        return NO;
    }

    return YES;
}
</pre>
<p>If a link is clicked, we just forward the linked URL and let the OS handle it using the default application.</p>
<p>Important side note: If you set a delegate to the UIWebView, do not forget to set it to nil before releasing it, e.g. in your dealloc method, like it is mentioned in the <a href="http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIWebView_Class/Reference/Reference.html#//apple_ref/occ/instp/UIWebView/delegate" target="_blank">UIWebView documentation</a>.</p>
<h3>Conclusion</h3>
<p>Using the UIWebView for displaying rich text is not difficult when keeping in mind, that you are actually using a full web browser. Following these simple steps allows you to integrate the UIWebView very easily:</p>
<ol>
<li>Add the UIWebView to your view hierarchy as you would do with any other view</li>
<li>Set the text by wrapping it into a simple HTML markup</li>
<li>Set the text and content properties by changing the body style of your HTML markup</li>
<li>Implement the UIWebViewDelegate protocol and set the delegate of your UIWebView to forward clicked links to the default handler</li>
</ol>
<img src="http://feeds.feedburner.com/~r/kiefermat/~4/19Qb9lzlHT0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://kiefermat.com/2011/09/30/using-uiwebview-for-displaying-rich-text/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://kiefermat.com/2011/09/30/using-uiwebview-for-displaying-rich-text/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=using-uiwebview-for-displaying-rich-text</feedburner:origLink></item>
		<item>
		<title>Great Android Memory Management Links</title>
		<link>http://feedproxy.google.com/~r/kiefermat/~3/XXUmzeUAWUc/</link>
		<comments>http://kiefermat.com/2011/09/30/great-android-memory-management-links/#comments</comments>
		<pubDate>Fri, 30 Sep 2011 06:52:39 +0000</pubDate>
		<dc:creator>kiefermat</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[Garbage Collector]]></category>
		<category><![CDATA[Memory Leak]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Profiler]]></category>

		<guid isPermaLink="false">http://kiefermat.com/?p=186</guid>
		<description><![CDATA[Here are some great links to get the basics of memory management for Android applications: Java Performance blog: How to really measure the memory usage of your objects Android Developers blog: Avoiding memory leaks Java Performance blog: Eclipse Memory Analyzer, &#8230; <a href="http://kiefermat.com/2011/09/30/great-android-memory-management-links/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Here are some great links to get the basics of memory management for Android applications:</p>
<p><a href="http://kohlerm.blogspot.com/2009/02/how-to-really-measure-memory-usage-of.html">Java Performance blog: How to really measure the memory usage of your objects</a></p>
<p><a href="http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html">Android Developers blog: Avoiding memory leaks</a></p>
<p><a href="http://kohlerm.blogspot.com/2009/07/eclipse-memory-analyzer-10-useful.html">Java Performance blog: Eclipse Memory Analyzer, 10 useful tips/articles</a></p>
<p><a href="http://www.google.com/events/io/2011/sessions/memory-management-for-android-apps.html">Google IO 2011 Session: Memory management for Android Apps</a></p>
<img src="http://feeds.feedburner.com/~r/kiefermat/~4/XXUmzeUAWUc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://kiefermat.com/2011/09/30/great-android-memory-management-links/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://kiefermat.com/2011/09/30/great-android-memory-management-links/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=great-android-memory-management-links</feedburner:origLink></item>
		<item>
		<title>Android: Displaying Modified Camera Preview Data</title>
		<link>http://feedproxy.google.com/~r/kiefermat/~3/UPXQgsBo7e0/</link>
		<comments>http://kiefermat.com/2011/09/23/android-displaying-modified-camera-preview-data/#comments</comments>
		<pubDate>Fri, 23 Sep 2011 13:03:03 +0000</pubDate>
		<dc:creator>kiefermat</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Howtos]]></category>
		<category><![CDATA[Camera]]></category>

		<guid isPermaLink="false">http://kiefermat.com/?p=206</guid>
		<description><![CDATA[If you just want to have the camera preview data under Android without displaying the preview on the screen the problem is that you have to provide a surface to the Camera object for displaying the preview. On some devices &#8230; <a href="http://kiefermat.com/2011/09/23/android-displaying-modified-camera-preview-data/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>If you just want to have the camera preview data under Android without displaying the preview on the screen the problem is that you have to provide a surface to the <a href="http://developer.android.com/reference/android/hardware/Camera.html">Camera</a> object for displaying the preview. On some devices it works without, but even the documentation states that you need to to set a preview surface for the camera to work.</p>
<p>Since I did not want to display the real data but only the processed data on the activity, I needed a solution for this problem. My first try was to include a hidden SurfaceView in the layout, but the SurfaceView does not create a surface if it is not visible. This <a href="http://www.41post.com/3794/programming/android-take-a-picture-without-displaying-a-preview">post</a> provided the first hint for solving the problem: You have to include a surface view and set the layout_height and layout_width parameters to &#8220;0dip&#8221;. This will trigger creation of the surface but the surfave view is virtually invisible.<br />
Unfortunately, when trying this solution with different devices, it turned out that it does not work correctly  on all devices. On some devices the SurfaceView need to have visible size to make the camera preview work.</p>
<p>Finally, what worked on all devices is to overlay the SurfaceView completely with one or more other views so that it is logically visible but the user can not see it. In this way you can easily draw you own processed preview data in a custom view that is hiding the real preview.</p>
<p>Additionally important for further processing of the image data or if you want to display your own preview is that the camera data you get in your preview callback is normally not in RGB but YUV format. If you want to draw the image on a Canvas, you first have to convert the data to RGB, e.g. by using the method you can find described in this <a href="https://groups.google.com/forum/?pli=1#!msg/android-developers/yF6CmrIJzuo/m7-K3D2dstMJ">post of the Android Developer Forum</a>.</p>
<p>(Interesting sidenote: the YUV format contains the grayscale image in the first width*heigth bytes, so if you just need a grayscale image, no conversion is needed).</p>
<p>Up from API level 8 there is also a YUVImage which you can use to convert the provided data to RGB, see <a href="http://stackoverflow.com/questions/5740759/region-of-interest">stackoverflow for an example</a>.</p>
<img src="http://feeds.feedburner.com/~r/kiefermat/~4/UPXQgsBo7e0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://kiefermat.com/2011/09/23/android-displaying-modified-camera-preview-data/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://kiefermat.com/2011/09/23/android-displaying-modified-camera-preview-data/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=android-displaying-modified-camera-preview-data</feedburner:origLink></item>
		<item>
		<title>iOS View Transition Animation in Wrong Direction</title>
		<link>http://feedproxy.google.com/~r/kiefermat/~3/2p-sGCC4L-g/</link>
		<comments>http://kiefermat.com/2011/08/18/ios-view-transition-animation-in-wrong-direction/#comments</comments>
		<pubDate>Thu, 18 Aug 2011 21:36:01 +0000</pubDate>
		<dc:creator>kiefermat</dc:creator>
				<category><![CDATA[Howtos]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Animation]]></category>
		<category><![CDATA[Orientation]]></category>

		<guid isPermaLink="false">http://kiefermat.com/?p=222</guid>
		<description><![CDATA[If you transition between two views using an animation e.g. by using the method + transitionFromView:toView:duration:options:completion:, it might be that the animation looks fine if the interface orientation is the standard orientation, e.g.UIInterfaceOrientationPortrait. However, in upside down orientation it can be that &#8230; <a href="http://kiefermat.com/2011/08/18/ios-view-transition-animation-in-wrong-direction/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>If you transition between two views using an animation e.g. by using the method <a href="http://developer.apple.com/library/ios/documentation/uikit/reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/clm/UIView/transitionFromView:toView:duration:options:completion:" target="_blank">+ transitionFromView:toView:duration:options:completion:</a>, it might be that the animation looks fine if the interface orientation is the standard orientation, e.g.<a href="http://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplication_Class/Reference/Reference.html#//apple_ref/doc/c_ref/UIInterfaceOrientationPortrait">UIInterfaceOrientationPortrait</a>. However, in upside down orientation it can be that the content is displayed correctly, but the transition animation looks like it is not rotated.</p>
<p>The reason for this behavior is that you are trying to transition between subviews of the root view. However, although the coordinate system of the subviews are correctly rotated so that they are displayed in the correct orientation, the root view itself is not rotated. Therefore, the animation on this view is also not rotated.</p>
<p>A possible solution to this problem is to add a new subview into your root view ( with the same size) and move all existing subviews to this new subview so that they are no longer direct children of the root view. Your animated transition is then not applied to the root view but to the new subview and it is therefore correctly rotated.</p>
<img src="http://feeds.feedburner.com/~r/kiefermat/~4/2p-sGCC4L-g" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://kiefermat.com/2011/08/18/ios-view-transition-animation-in-wrong-direction/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://kiefermat.com/2011/08/18/ios-view-transition-animation-in-wrong-direction/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=ios-view-transition-animation-in-wrong-direction</feedburner:origLink></item>
	</channel>
</rss><!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Page Caching using disk: enhanced

Served from: kiefermat.com @ 2012-04-16 22:24:37 -->

