Merge branch 'master' of https://github.com/mportuesisf/robolectric into mportuesisf-master

Conflicts:
	src/com/xtremelabs/robolectric/Robolectric.java
	src/com/xtremelabs/robolectric/shadows/ShadowApplication.java
	src/com/xtremelabs/robolectric/shadows/ShadowIntent.java
	src/com/xtremelabs/robolectric/shadows/ShadowPreferenceManager.java
	src/com/xtremelabs/robolectric/view/TestWindowManager.java
	test/com/xtremelabs/robolectric/shadows/DisplayTest.java
	test/com/xtremelabs/robolectric/shadows/PreferenceManagerTest.java
diff --git a/.gitignore b/.gitignore
index e552798..5023274 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,4 +6,5 @@
 pages
 .DS_Store
 *~
+local.properties
 \#*\#
\ No newline at end of file
diff --git a/src/com/xtremelabs/robolectric/Robolectric.java b/src/com/xtremelabs/robolectric/Robolectric.java
index 7c99d39..18ecc69 100644
--- a/src/com/xtremelabs/robolectric/Robolectric.java
+++ b/src/com/xtremelabs/robolectric/Robolectric.java
@@ -12,6 +12,7 @@
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 import android.location.LocationManager;
+import android.media.AudioManager;
 import android.os.Handler;
 import android.os.Looper;
 import android.view.Display;
@@ -80,6 +81,7 @@
                 ShadowAlertDialog.ShadowBuilder.class,
                 ShadowApplication.class,
                 ShadowAppWidgetManager.class,
+                ShadowAudioManager.class,
                 ShadowBaseAdapter.class,
                 ShadowBitmapDrawable.class,
                 ShadowBundle.class,
@@ -275,10 +277,13 @@
 	public static ShadowDisplay shadowOf(Display instance) {
 		return ((ShadowDisplay) shadowOf_(instance));
 	}
+	
+	public static ShadowAudioManager shadowOf(AudioManager instance) {
+		return ((ShadowAudioManager) shadowOf_(instance));
+	}
 
     @SuppressWarnings({"unchecked"})
     public static <P, R> P shadowOf_(R instance) {
         return (P) ShadowWrangler.getInstance().shadowOf(instance);
     }
-
 }
diff --git a/src/com/xtremelabs/robolectric/shadows/ShadowApplication.java b/src/com/xtremelabs/robolectric/shadows/ShadowApplication.java
index d902f39..d2c0c94 100644
--- a/src/com/xtremelabs/robolectric/shadows/ShadowApplication.java
+++ b/src/com/xtremelabs/robolectric/shadows/ShadowApplication.java
@@ -6,6 +6,7 @@
 import android.content.*;
 import android.content.res.Resources;
 import android.location.LocationManager;
+import android.media.AudioManager;
 import android.net.wifi.WifiManager;
 import android.test.mock.MockContentResolver;
 import android.view.LayoutInflater;
@@ -37,6 +38,7 @@
     private LocationManager locationManager;
     private WifiManager wifiManager;
     private WindowManager windowManager;
+    private AudioManager audioManager;
     private List<Intent> startedActivities = new ArrayList<Intent>();
     private List<Intent> startedServices = new ArrayList<Intent>();
     private List<Wrapper> registeredReceivers = new ArrayList<Wrapper>();
@@ -85,7 +87,9 @@
         } else if (name.equals(Context.WIFI_SERVICE)) {
             return wifiManager == null ? wifiManager = newInstanceOf(WifiManager.class) : wifiManager;
         } else if (name.equals(Context.WINDOW_SERVICE)) {
-            return windowManager == null ? windowManager = new TestWindowManager() : windowManager;
+        	return windowManager == null ? windowManager = new TestWindowManager() : windowManager;
+        } else if (name.equals(Context.AUDIO_SERVICE)) {
+        	return audioManager == null ? audioManager = newInstanceOf(AudioManager.class) : audioManager;
         }
         return null;
     }
diff --git a/src/com/xtremelabs/robolectric/shadows/ShadowAudioManager.java b/src/com/xtremelabs/robolectric/shadows/ShadowAudioManager.java
new file mode 100644
index 0000000..820aef1
--- /dev/null
+++ b/src/com/xtremelabs/robolectric/shadows/ShadowAudioManager.java
@@ -0,0 +1,57 @@
+package com.xtremelabs.robolectric.shadows;
+
+import com.xtremelabs.robolectric.util.Implementation;
+import com.xtremelabs.robolectric.util.Implements;
+
+import android.media.AudioManager;
+
+@SuppressWarnings({"UnusedDeclaration"})
+@Implements(AudioManager.class)
+public class ShadowAudioManager {
+	
+	private int streamMaxVolume = 15;
+	private int streamVolume = 7;
+
+	private int flags;
+	
+	@Implementation
+	public int getStreamMaxVolume(int streamType) {
+		return streamMaxVolume;
+	}
+	
+	@Implementation
+	public int getStreamVolume(int streamType) {
+		return streamVolume;
+	}
+	
+	@Implementation
+	public void setStreamVolume(int streamType, int index, int flags) {
+		this.streamVolume = index;
+		this.flags = flags;
+	}
+
+	public int getStreamMaxVolume() {
+		return streamMaxVolume;
+	}
+
+	public void setStreamMaxVolume(int streamMaxVolume) {
+		this.streamMaxVolume = streamMaxVolume;
+	}
+
+	public int getStreamVolume() {
+		return streamVolume;
+	}
+
+	public void setStreamVolume(int streamVolume) {
+		this.streamVolume = streamVolume;
+	}
+
+	public int getFlags() {
+		return flags;
+	}
+
+	public void setFlags(int flags) {
+		this.flags = flags;
+	}
+	
+}
diff --git a/src/com/xtremelabs/robolectric/shadows/ShadowHandler.java b/src/com/xtremelabs/robolectric/shadows/ShadowHandler.java
index 8f2bfda..4cc69c6 100644
--- a/src/com/xtremelabs/robolectric/shadows/ShadowHandler.java
+++ b/src/com/xtremelabs/robolectric/shadows/ShadowHandler.java
@@ -53,6 +53,13 @@
         });
         return true;
     }
+    
+    @Implementation
+    public final boolean sendEmptyMessage(int what) {
+    	final Message msg = new Message();
+    	msg.what = what;
+    	return sendMessage(msg);
+    }
 
     public static void flush() {
         shadowOf(Looper.myLooper()).idle();
diff --git a/test/com/xtremelabs/robolectric/shadows/ApplicationTest.java b/test/com/xtremelabs/robolectric/shadows/ApplicationTest.java
index 206b6e4..baebe9d 100644
--- a/test/com/xtremelabs/robolectric/shadows/ApplicationTest.java
+++ b/test/com/xtremelabs/robolectric/shadows/ApplicationTest.java
@@ -1,9 +1,16 @@
 package com.xtremelabs.robolectric.shadows;
 
 import android.app.Activity;
+import android.app.AlarmManager;
 import android.app.Application;
 import android.content.Context;
 import android.content.ContextWrapper;
+import android.location.LocationManager;
+import android.media.AudioManager;
+import android.net.wifi.WifiManager;
+import android.view.LayoutInflater;
+import android.view.WindowManager;
+
 import com.xtremelabs.robolectric.R;
 import com.xtremelabs.robolectric.Robolectric;
 import com.xtremelabs.robolectric.WithTestDefaultsRunner;
@@ -14,6 +21,7 @@
 import org.junit.runner.RunWith;
 
 import static org.hamcrest.Matchers.sameInstance;
+import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 import static org.mockito.Mockito.mock;
@@ -47,4 +55,22 @@
         assertEquals("title from resourceLoader1", new ContextWrapper(app1).getResources().getString(R.id.title));
         assertEquals("title from resourceLoader2", new ContextWrapper(app2).getResources().getString(R.id.title));
     }
+    
+    @Test
+    public void shouldProvideServices() throws Exception {
+    	Application app = Robolectric.application;
+    	
+    	Object service = app.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+    	assertTrue(service instanceof LayoutInflater);
+    	service = app.getSystemService(Context.ALARM_SERVICE);
+    	assertTrue(service instanceof AlarmManager);
+    	service = app.getSystemService(Context.LOCATION_SERVICE);
+    	assertTrue(service instanceof LocationManager);
+    	service = app.getSystemService(Context.WIFI_SERVICE);
+    	assertTrue(service instanceof WifiManager);
+    	service = app.getSystemService(Context.WINDOW_SERVICE);
+    	assertTrue(service instanceof WindowManager);
+    	service = app.getSystemService(Context.AUDIO_SERVICE);
+    	assertTrue(service instanceof AudioManager);
+    }
 }
diff --git a/test/com/xtremelabs/robolectric/shadows/AudioManagerTest.java b/test/com/xtremelabs/robolectric/shadows/AudioManagerTest.java
new file mode 100644
index 0000000..75387db
--- /dev/null
+++ b/test/com/xtremelabs/robolectric/shadows/AudioManagerTest.java
@@ -0,0 +1,54 @@
+package com.xtremelabs.robolectric.shadows;
+
+
+import android.media.AudioManager;
+import com.xtremelabs.robolectric.Robolectric;
+import com.xtremelabs.robolectric.WithTestDefaultsRunner;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.assertEquals;
+
+@RunWith(WithTestDefaultsRunner.class)
+public class AudioManagerTest {
+
+    private AudioManager audioManager;
+    private ShadowAudioManager shadowAudioManager;
+
+    @Before
+    public void setUp() throws Exception {
+        Robolectric.bindDefaultShadowClasses();
+
+        audioManager = Robolectric.newInstanceOf(AudioManager.class);
+        shadowAudioManager = Robolectric.shadowOf(audioManager);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+    }
+
+    @Test
+    public void shouldGetStreamMaxVolume() throws Exception {
+        shadowAudioManager.setStreamMaxVolume(45);
+
+        assertEquals(45, audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC));
+    }
+
+    @Test
+    public void shouldGetVolume() throws Exception {
+        shadowAudioManager.setStreamVolume(5);
+
+        assertEquals(5, audioManager.getStreamVolume(AudioManager.STREAM_MUSIC));
+    }
+
+    @Test
+    public void shouldSetVolume() throws Exception {
+        audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, 8, 0);
+
+        assertEquals(8, audioManager.getStreamVolume(AudioManager.STREAM_MUSIC));
+        assertEquals(8, shadowAudioManager.getStreamVolume());
+    }
+
+}