1cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultzpackage com.xtremelabs.robolectric;
2cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz
3db121a3768da9bd5f9ac210a0b1fc368acb85824Ryan Richardimport android.app.Activity;
4cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultzimport android.content.Context;
544edf424f14a67d7a35501a258a9b96d9c943ccfAlexander Murmann & Phil Goodwinimport android.os.Handler;
69931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Planteimport android.view.Display;
7cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultzimport android.view.View;
822c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implementation;
922c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implements;
109931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Planteimport com.xtremelabs.robolectric.shadows.ShadowDisplay;
11867bc14e9ed74617c4d2770d122231c29e4a02e3Phil Goodwin & Tyler Schultzimport com.xtremelabs.robolectric.util.TestOnClickListener;
122399fd1c2f5ff65d329717361082957d309f7314Alexander Murmann & Jesse Tothimport org.apache.http.HttpException;
132399fd1c2f5ff65d329717361082957d309f7314Alexander Murmann & Jesse Tothimport org.apache.http.HttpResponse;
142399fd1c2f5ff65d329717361082957d309f7314Alexander Murmann & Jesse Tothimport org.apache.http.client.methods.HttpGet;
152399fd1c2f5ff65d329717361082957d309f7314Alexander Murmann & Jesse Tothimport org.apache.http.conn.ConnectionKeepAliveStrategy;
162399fd1c2f5ff65d329717361082957d309f7314Alexander Murmann & Jesse Tothimport org.apache.http.impl.client.DefaultRequestDirector;
172399fd1c2f5ff65d329717361082957d309f7314Alexander Murmann & Jesse Tothimport org.apache.http.protocol.HttpContext;
18cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultzimport org.junit.After;
19cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultzimport org.junit.Before;
20cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultzimport org.junit.Test;
21cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultzimport org.junit.runner.RunWith;
22cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz
23cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultzimport java.io.ByteArrayOutputStream;
242399fd1c2f5ff65d329717361082957d309f7314Alexander Murmann & Jesse Tothimport java.io.IOException;
25cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultzimport java.io.PrintStream;
26867bc14e9ed74617c4d2770d122231c29e4a02e3Phil Goodwin & Tyler Schultz
279931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Planteimport static com.xtremelabs.robolectric.Robolectric.shadowOf;
28a3030055b95774b06a963ccc9224fac58c887cb2Christian Williams & Phil Goodwinimport static org.hamcrest.CoreMatchers.equalTo;
292399fd1c2f5ff65d329717361082957d309f7314Alexander Murmann & Jesse Tothimport static org.junit.Assert.*;
30cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz
31cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz@RunWith(WithTestDefaultsRunner.class)
32cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultzpublic class RobolectricTest {
33cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz
34cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz    private PrintStream originalSystemOut;
35cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz    private ByteArrayOutputStream buff;
3640c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams    private String defaultLineSeparator;
37cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz
38cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz    @Before
39cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz    public void setUp() {
40cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz        originalSystemOut = System.out;
41f68306afa7b75d4e375d00d433f3432ffb68d4e4unknown        defaultLineSeparator = System.getProperty("line.separator");
42f68306afa7b75d4e375d00d433f3432ffb68d4e4unknown
43f68306afa7b75d4e375d00d433f3432ffb68d4e4unknown        System.setProperty("line.separator", "\n");
44cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz        buff = new ByteArrayOutputStream();
45cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz        PrintStream testOut = new PrintStream(buff);
46cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz        System.setOut(testOut);
47cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz    }
4840c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams
49cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz    @After
50f68306afa7b75d4e375d00d433f3432ffb68d4e4unknown    public void tearDown() throws Exception {
5140c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams        System.setProperty("line.separator", defaultLineSeparator);
52cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz        System.setOut(originalSystemOut);
53cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz    }
54cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz
55cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz    @Test
56cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz    public void shouldLogMissingInvokedShadowMethodsWhenRequested() throws Exception {
57237888bb1e926aea523388de5d511a35f38506efPhil Goodwin & Tyler Schultz        Robolectric.bindShadowClass(TestShadowView.class);
58cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz        Robolectric.logMissingInvokedShadowMethods();
59cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz
60cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz
61cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz        View aView = new View(null);
62cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz        // There's a shadow method for this
63cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz        aView.getContext();
64cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz        String output = buff.toString();
651cdfbcfd97e89e1d9451a8c06a307fb07c380924Christian Williams        assertEquals("No Shadow method found for View.<init>(android.content.Context)\n", output);
661cdfbcfd97e89e1d9451a8c06a307fb07c380924Christian Williams        buff.reset();
67cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz
68cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz        aView.findViewById(27);
69cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz        // No shadow here... should be logged
70cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz        output = buff.toString();
71f68306afa7b75d4e375d00d433f3432ffb68d4e4unknown        assertEquals("No Shadow method found for View.findViewById(int)\n", output);
72cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz    }
73cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz
74cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz    @Test // This is nasty because it depends on the test above having run first in order to fail
75cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz    public void shouldNotLogMissingInvokedShadowMethodsByDefault() throws Exception {
76cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz        View aView = new View(null);
77cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz        aView.findViewById(27);
78cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz        String output = buff.toString();
79cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz
80cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz        assertEquals("", output);
81cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz    }
82cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz
8340c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams    @Test(expected = RuntimeException.class)
84867bc14e9ed74617c4d2770d122231c29e4a02e3Phil Goodwin & Tyler Schultz    public void clickOn_shouldThrowIfViewIsDisabled() throws Exception {
85867bc14e9ed74617c4d2770d122231c29e4a02e3Phil Goodwin & Tyler Schultz        View view = new View(null);
86867bc14e9ed74617c4d2770d122231c29e4a02e3Phil Goodwin & Tyler Schultz        view.setEnabled(false);
87867bc14e9ed74617c4d2770d122231c29e4a02e3Phil Goodwin & Tyler Schultz        Robolectric.clickOn(view);
88867bc14e9ed74617c4d2770d122231c29e4a02e3Phil Goodwin & Tyler Schultz    }
89867bc14e9ed74617c4d2770d122231c29e4a02e3Phil Goodwin & Tyler Schultz
90a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz    @Test
91a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz    public void shouldResetBackgroundSchedulerBeforeTests() throws Exception {
920fe1965a36c508fb5b9fa4c8d0caa2d30540f2ccChristian Williams & Phil Goodwin        assertThat(Robolectric.getBackgroundScheduler().isPaused(), equalTo(false));
930fe1965a36c508fb5b9fa4c8d0caa2d30540f2ccChristian Williams & Phil Goodwin        Robolectric.getBackgroundScheduler().pause();
94a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz    }
95a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz
96a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz    @Test
97a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz    public void shouldResetBackgroundSchedulerAfterTests() throws Exception {
980fe1965a36c508fb5b9fa4c8d0caa2d30540f2ccChristian Williams & Phil Goodwin        assertThat(Robolectric.getBackgroundScheduler().isPaused(), equalTo(false));
990fe1965a36c508fb5b9fa4c8d0caa2d30540f2ccChristian Williams & Phil Goodwin        Robolectric.getBackgroundScheduler().pause();
100a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz    }
101a4f7d50f8e6f12d541421383544fe16c185e4bbcPhil Goodwin & Tyler Schultz
102db121a3768da9bd5f9ac210a0b1fc368acb85824Ryan Richard    @Test
1032399fd1c2f5ff65d329717361082957d309f7314Alexander Murmann & Jesse Toth    public void httpRequestWasSent_ReturnsTrueIfRequestWasSent() throws IOException, HttpException {
1045ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin        makeRequest("http://example.com");
1052399fd1c2f5ff65d329717361082957d309f7314Alexander Murmann & Jesse Toth
1062399fd1c2f5ff65d329717361082957d309f7314Alexander Murmann & Jesse Toth        assertTrue(Robolectric.httpRequestWasMade());
1072399fd1c2f5ff65d329717361082957d309f7314Alexander Murmann & Jesse Toth    }
1082399fd1c2f5ff65d329717361082957d309f7314Alexander Murmann & Jesse Toth
1092399fd1c2f5ff65d329717361082957d309f7314Alexander Murmann & Jesse Toth    @Test
1102399fd1c2f5ff65d329717361082957d309f7314Alexander Murmann & Jesse Toth    public void httpRequestWasMade_ReturnsFalseIfNoRequestWasMade() {
1112399fd1c2f5ff65d329717361082957d309f7314Alexander Murmann & Jesse Toth        assertFalse(Robolectric.httpRequestWasMade());
1122399fd1c2f5ff65d329717361082957d309f7314Alexander Murmann & Jesse Toth    }
1132399fd1c2f5ff65d329717361082957d309f7314Alexander Murmann & Jesse Toth
1145ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin    @Test
1155ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin    public void httpRequestWasMade_returnsTrueIfRequestMatchingGivenRuleWasMade() throws IOException, HttpException {
1165ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin        makeRequest("http://example.com");
1175ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin        assertTrue(Robolectric.httpRequestWasMade("http://example.com"));
1185ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin    }
1195ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin
1205ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin    @Test
1215ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin    public void httpRequestWasMade_returnsFalseIfNoRequestMatchingGivenRuleWasMAde() throws IOException, HttpException {
1225ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin        makeRequest("http://example.com");
1235ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin        assertFalse(Robolectric.httpRequestWasMade("http://example.org"));
1245ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin    }
1255ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin
12644edf424f14a67d7a35501a258a9b96d9c943ccfAlexander Murmann & Phil Goodwin    @Test
12744edf424f14a67d7a35501a258a9b96d9c943ccfAlexander Murmann & Phil Goodwin    public void idleMainLooper_executesScheduledTasks() {
1289931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante        final boolean[] wasRun = new boolean[]{false};
12944edf424f14a67d7a35501a258a9b96d9c943ccfAlexander Murmann & Phil Goodwin        new Handler().postDelayed(new Runnable() {
13044edf424f14a67d7a35501a258a9b96d9c943ccfAlexander Murmann & Phil Goodwin            @Override
13144edf424f14a67d7a35501a258a9b96d9c943ccfAlexander Murmann & Phil Goodwin            public void run() {
13244edf424f14a67d7a35501a258a9b96d9c943ccfAlexander Murmann & Phil Goodwin                wasRun[0] = true;
13344edf424f14a67d7a35501a258a9b96d9c943ccfAlexander Murmann & Phil Goodwin            }
13444edf424f14a67d7a35501a258a9b96d9c943ccfAlexander Murmann & Phil Goodwin        }, 2000);
13544edf424f14a67d7a35501a258a9b96d9c943ccfAlexander Murmann & Phil Goodwin
13644edf424f14a67d7a35501a258a9b96d9c943ccfAlexander Murmann & Phil Goodwin        assertFalse(wasRun[0]);
13744edf424f14a67d7a35501a258a9b96d9c943ccfAlexander Murmann & Phil Goodwin        Robolectric.idleMainLooper(1999);
13844edf424f14a67d7a35501a258a9b96d9c943ccfAlexander Murmann & Phil Goodwin        assertFalse(wasRun[0]);
13944edf424f14a67d7a35501a258a9b96d9c943ccfAlexander Murmann & Phil Goodwin        Robolectric.idleMainLooper(1);
14044edf424f14a67d7a35501a258a9b96d9c943ccfAlexander Murmann & Phil Goodwin        assertTrue(wasRun[0]);
14144edf424f14a67d7a35501a258a9b96d9c943ccfAlexander Murmann & Phil Goodwin    }
14244edf424f14a67d7a35501a258a9b96d9c943ccfAlexander Murmann & Phil Goodwin
1435f52066979dd3a3eb6a0df2cd360611c50fb31ecRyan Richard    @Test
144db121a3768da9bd5f9ac210a0b1fc368acb85824Ryan Richard    public void shouldUseSetDensityForContexts() throws Exception {
145db121a3768da9bd5f9ac210a0b1fc368acb85824Ryan Richard        assertThat(new Activity().getResources().getDisplayMetrics().density, equalTo(1.0f));
146db121a3768da9bd5f9ac210a0b1fc368acb85824Ryan Richard        Robolectric.setDisplayMetricsDensity(1.5f);
147db121a3768da9bd5f9ac210a0b1fc368acb85824Ryan Richard        assertThat(new Activity().getResources().getDisplayMetrics().density, equalTo(1.5f));
148db121a3768da9bd5f9ac210a0b1fc368acb85824Ryan Richard    }
149db121a3768da9bd5f9ac210a0b1fc368acb85824Ryan Richard
1509931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante    @Test
1519931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante    public void shouldUseSetDisplayForContexts() throws Exception {
1529931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante        assertThat(new Activity().getResources().getDisplayMetrics().widthPixels, equalTo(480));
1539931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante        assertThat(new Activity().getResources().getDisplayMetrics().heightPixels, equalTo(800));
1549931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante
1559931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante        Display display = Robolectric.newInstanceOf(Display.class);
1569931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante        ShadowDisplay shadowDisplay = shadowOf(display);
1579931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante        shadowDisplay.setWidth(100);
1589931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante        shadowDisplay.setHeight(200);
1599931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante        Robolectric.setDefaultDisplay(display);
1609931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante
1619931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante        assertThat(new Activity().getResources().getDisplayMetrics().widthPixels, equalTo(100));
1629931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante        assertThat(new Activity().getResources().getDisplayMetrics().heightPixels, equalTo(200));
1639931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante    }
1649931c0dc82b7213f180aa4570bafdbb57ec563d7Spider Phil Plante
165867bc14e9ed74617c4d2770d122231c29e4a02e3Phil Goodwin & Tyler Schultz    public void clickOn_shouldCallClickListener() throws Exception {
166867bc14e9ed74617c4d2770d122231c29e4a02e3Phil Goodwin & Tyler Schultz        View view = new View(null);
167867bc14e9ed74617c4d2770d122231c29e4a02e3Phil Goodwin & Tyler Schultz        TestOnClickListener testOnClickListener = new TestOnClickListener();
168867bc14e9ed74617c4d2770d122231c29e4a02e3Phil Goodwin & Tyler Schultz        view.setOnClickListener(testOnClickListener);
169867bc14e9ed74617c4d2770d122231c29e4a02e3Phil Goodwin & Tyler Schultz        Robolectric.clickOn(view);
170867bc14e9ed74617c4d2770d122231c29e4a02e3Phil Goodwin & Tyler Schultz        assertTrue(testOnClickListener.clicked);
171867bc14e9ed74617c4d2770d122231c29e4a02e3Phil Goodwin & Tyler Schultz    }
172867bc14e9ed74617c4d2770d122231c29e4a02e3Phil Goodwin & Tyler Schultz
173cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz    @Implements(View.class)
1741cdfbcfd97e89e1d9451a8c06a307fb07c380924Christian Williams    public static class TestShadowView {
175cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz        @SuppressWarnings({"UnusedDeclaration"})
176cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz        @Implementation
177cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz        public Context getContext() {
178cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz            return null;
179cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz        }
180cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz    }
1815ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin
1825ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin    private void makeRequest(String uri) throws HttpException, IOException {
1835ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin        Robolectric.addPendingHttpResponse(200, "a happy response body");
1845ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin
1855ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin        ConnectionKeepAliveStrategy connectionKeepAliveStrategy = new ConnectionKeepAliveStrategy() {
1865ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin            @Override
1875ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin            public long getKeepAliveDuration(HttpResponse httpResponse, HttpContext httpContext) {
1885ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin                return 0;
1895ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin            }
1905ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin
1915ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin        };
1925ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin        DefaultRequestDirector requestDirector = new DefaultRequestDirector(null, null, null, connectionKeepAliveStrategy, null, null, null, null, null, null, null, null);
1935ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin
1945ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin        requestDirector.execute(null, new HttpGet(uri), null);
1955ed9c8041b5f927c930d50edef58c5378d12f89cAlexander Murmann & Phil Goodwin    }
196cedd6ea60db4bf5744077021f20092005bb3d461Tyler Schultz}
197