diff --git a/app/src/androidTest/java/com/btellez/solidandroid/test/activity/MainUserActivityTest.java b/app/src/androidTest/java/com/btellez/solidandroid/test/activity/MainUserActivityTest.java deleted file mode 100644 index 68390d1..0000000 --- a/app/src/androidTest/java/com/btellez/solidandroid/test/activity/MainUserActivityTest.java +++ /dev/null @@ -1,171 +0,0 @@ -package com.btellez.solidandroid.test.activity; - -import android.app.Activity; -import android.app.Application; -import android.content.Context; -import android.content.ContextWrapper; -import android.content.Intent; -import android.test.ActivityUnitTestCase; -import android.util.Log; - -import com.btellez.solidandroid.module.DependencyInjector; -import com.google.gson.JsonObject; -import com.squareup.otto.Bus; - -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; - -import javax.inject.Inject; - -import dagger.Module; -import dagger.Provides; -import com.btellez.solidandroid.activity.MainUserActivity; -import com.btellez.solidandroid.fragment.SimpleFragment; -import com.btellez.solidandroid.network.SimpleApi; -import com.btellez.solidandroid.test.MockApplicationInjectable; -import com.btellez.solidandroid.test.module.SingletonTestModule; - -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.isA; -import static org.mockito.Mockito.anyObject; -import static org.mockito.Mockito.atLeastOnce; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; - -public class MainUserActivityTest extends ActivityUnitTestCase { - - Activity activity; - private Application mApplication; - private Context mContext; - - @Inject SimpleApi simpleApi; - @Inject Bus eventBus; - - //region start-module-def - /* - * This region is used to define modules that are needed for the classes tested - * in this test. - * - */ - - @Module(injects = MainUserActivityTest.class, includes = SingletonTestModule.class) - public class SelfInjectorModule {} - - @Module(injects = MainUserActivity.class, includes = SingletonTestModule.class) - public class MainUserActivityTestModule { - // Sample Mocke String Injected... - @Provides String provideStringValue() { return "Mock String"; } - } - - @Module(injects = {SimpleApi.class, SimpleFragment.class}, includes = SingletonTestModule.class) - public class SimpleFragmentTestModule {} - //endregion - - - public MainUserActivityTest() { - super(MainUserActivity.class); - } - - - @Override - public void setUp() throws Exception { - super.setUp(); - // See: http://stackoverflow.com/questions/12267572/mockito-dexmaker-on-android - System.setProperty("dexmaker.dexcache",getInstrumentation().getTargetContext().getCacheDir().getPath()); - mContext = new ContextWrapper(getInstrumentation().getTargetContext()) { - @Override - public Context getApplicationContext() { - return mApplication; - } - }; - - // Complete the implementation of the Application class - // with the modules required for this test in particular. - mApplication = new MockApplicationInjectable(mContext){ - @Override - public Object[] getModules() { - return new Object[]{ - new SelfInjectorModule(), - new MainUserActivityTestModule(), - new SimpleFragmentTestModule(), - new MockApplicationContextModule(this) - }; - } - }; - - ((DependencyInjector) mApplication).inject(this); // Inject self dependencies - - setApplication(mApplication); // Specify modules and initialize object graph - setActivityContext(mContext); - startActivity(new Intent(mContext, MainUserActivity.class), null, null); - activity = getActivity(); - - } - - - @Override - public void tearDown() throws Exception { - super.tearDown(); - activity.finish(); - } - - - public void testContext() { - assertTrue(activity.getApplicationContext() instanceof MockApplicationInjectable); - } - - - public void testMockObject() throws Exception { - getInstrumentation().callActivityOnResume(activity); - getInstrumentation().callActivityOnPause(activity); - Log.e("TEST", "Event Bus Object" + eventBus.toString() + eventBus.hashCode()); - verify(eventBus, times(3)).register(anyObject()); - verify(eventBus, atLeastOnce()).post(anyObject()); - } - - - public void testSimpleAPITestSuccess() throws Exception { - // Set up stubbing for the api calls - doAnswer(new Answer() { - @Override - public Void answer(InvocationOnMock invocation) throws Throwable { - eventBus.post(new SimpleApi.Success(new JsonObject())); - return null; - } - }).when(simpleApi).getAllData(); - - getInstrumentation().callActivityOnResume(activity); - getInstrumentation().callActivityOnPause(activity); - - // Verify API was called - verify(simpleApi, times(1)).getAllData(); - verify(eventBus, times(1)).post(isA(SimpleApi.Success.class)); - } - - - public void testSimpleAPITestFailure() throws Exception { - // Set up stubbing for the api calls - doAnswer(new Answer() { - @Override - public Void answer(InvocationOnMock invocation) throws Throwable { - eventBus.post(new SimpleApi.Failure(new Exception())); - return null; - } - }).when(simpleApi).getAllData(); - - getInstrumentation().callActivityOnResume(activity); - getInstrumentation().callActivityOnPause(activity); - - // Verify API was called - verify(simpleApi, times(1)).getAllData(); - verify(eventBus, times(1)).post(isA(SimpleApi.Failure.class)); - - // Unable to do verification for the direct method call, since the system interacts - // directly with the activity, not the spy, so Mockito can not pick up on any interactions - // that are going on with the activity. - // - // verify(activitySpy, times(1)).onNetworkFailure(any(SimpleApi.Failure.class)); - // TODO: Verify correct method calls were made and that the events were received as expected. - } -} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 37ca7c8..3acb23a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,7 +12,7 @@ android:label="@string/app_name" android:theme="@style/AppTheme" > @@ -22,7 +22,6 @@ - diff --git a/app/src/main/java/com/btellez/solidandroid/SimpleAndroidApplication.java b/app/src/main/java/com/btellez/solidandroid/SimpleAndroidApplication.java index ca17bdd..511a1a1 100644 --- a/app/src/main/java/com/btellez/solidandroid/SimpleAndroidApplication.java +++ b/app/src/main/java/com/btellez/solidandroid/SimpleAndroidApplication.java @@ -3,9 +3,7 @@ import android.app.Application; import android.content.Context; -import com.btellez.solidandroid.activity.MainUserActivity; import com.btellez.solidandroid.activity.SearchResultsActivity; -import com.btellez.solidandroid.fragment.SimpleFragment; import com.btellez.solidandroid.module.DependencyInjector; import dagger.Module; @@ -40,10 +38,6 @@ public void onCreate() { @Override public Object[] getModules() { return new Object[]{ - // Each Activity and Class Defined their own Injector, - // Shared Modules should go under the ../Module package - new MainUserActivity.MainUserActivityModule(), - new SimpleFragment.SimpleFragmentModule(), new ApplicationContextModule(this), new SearchResultsActivity.SearchResultDepedencyModule() }; diff --git a/app/src/main/java/com/btellez/solidandroid/activity/MainUserActivity.java b/app/src/main/java/com/btellez/solidandroid/activity/MainUserActivity.java deleted file mode 100644 index f6e1971..0000000 --- a/app/src/main/java/com/btellez/solidandroid/activity/MainUserActivity.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.btellez.solidandroid.activity; - -import android.os.Bundle; -import android.support.v4.app.FragmentActivity; -import android.util.Log; -import android.view.Menu; -import android.view.MenuItem; - -import com.btellez.solidandroid.module.DependencyInjector; -import com.squareup.otto.Bus; -import com.squareup.otto.Produce; -import com.squareup.otto.Subscribe; - -import javax.inject.Inject; - -import dagger.Module; -import dagger.Provides; -import com.btellez.solidandroid.fragment.SimpleFragment; -import com.btellez.solidandroid.module.SingletonModule; -import com.btellez.solidandroid.network.SimpleApi; -import com.btellez.solidandroid.R; - - -public class MainUserActivity extends FragmentActivity { - - private static String TAG = MainUserActivity.class.getSimpleName(); - private int recentValue; - private Object recentSource; - - @Inject Bus eventBus; - @Inject String sampleString; - @Inject SimpleApi api; - - //region Module that injects this class and components used by this class - @Module(injects = {MainUserActivity.class, SimpleApi.class}, includes = SingletonModule.class) - public static class MainUserActivityModule { - // Sample Provider for this class: - @Provides String provideStringValue() { - return "Hello World"; - } - } - //endregion - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - ((DependencyInjector) getApplication()).inject(this); // Dagger Injection - - Log.e(TAG, "Event Bus Object" + eventBus.toString() + eventBus.hashCode()); - setContentView(R.layout.activity_main_user); - if (savedInstanceState == null) { - getSupportFragmentManager() - .beginTransaction() - .replace(R.id.fragmentA, new SimpleFragment()) - .commit(); - - getSupportFragmentManager() - .beginTransaction() - .replace(R.id.fragmentB, new SimpleFragment()) - .commit(); - } - } - - - @Override - protected void onResume() { - super.onResume(); - // Register as a Producer - eventBus.register(this); - postEvent(new SimpleFragment.ButtonClickedEvent(this, 100)); - api.getAllData(); - } - - - @Override - protected void onPause() { - super.onPause(); - // Unregister as a Producer - eventBus.unregister(this); - } - - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - // Inflate the menu; this adds items to the action bar if it is present. - getMenuInflater().inflate(R.menu.main_user, menu); - return true; - } - - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - int id = item.getItemId(); - postEvent(new SimpleFragment.ButtonClickedEvent(this, id)); - - if (id == R.id.action_settings) { - return true; - } - - return super.onOptionsItemSelected(item); - } - - //region Event Producers and Subscribers - /** - * Anytime any new Broadcaster are registered, We are the Authority on it the - * last value that was registered for this type of event. - * @return - */ - @Produce - public SimpleFragment.ButtonClickedEvent getRecentValue() { - return new SimpleFragment.ButtonClickedEvent(recentSource, recentValue); - } - - - /** - * Listen for events from other broadcasters. - * - * @param event - */ - @Subscribe - public void updateState(SimpleFragment.ButtonClickedEvent event) { - recentValue = event.getValue(); - } - - - @Subscribe - public void onNetworkSuccess(SimpleApi.Success event) { - Log.d(TAG, "Network Success Received"); - Log.d(TAG, "Network Data:" + event.getResult().toString()); - // Do Something With network event - } - - - @Subscribe - public void onNetworkFailure(SimpleApi.Failure event) { - Log.d(TAG, "Network Failure Received"); - Log.d(TAG, "Network Exception:"+ event.getResult().toString()); - // Do something with network event - } - //endregion - - /** - * Helper method for posting an event, and rem - * @param event - */ - protected void postEvent(SimpleFragment.ButtonClickedEvent event) { - Log.d(TAG, "Posting Event"); - recentSource = ((SimpleFragment.ButtonClickedEvent) event).getSource(); - recentValue = ((SimpleFragment.ButtonClickedEvent)event).getValue(); - eventBus.post(event); - } - - public String getSampleString() { - return sampleString; - } -} diff --git a/app/src/main/java/com/btellez/solidandroid/fragment/SimpleFragment.java b/app/src/main/java/com/btellez/solidandroid/fragment/SimpleFragment.java deleted file mode 100644 index 2d5c1b9..0000000 --- a/app/src/main/java/com/btellez/solidandroid/fragment/SimpleFragment.java +++ /dev/null @@ -1,139 +0,0 @@ -package com.btellez.solidandroid.fragment; - - -import android.app.Activity; -import android.content.Intent; -import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.Button; -import android.widget.TextView; - -import com.btellez.solidandroid.activity.SearchResultsActivity; -import com.btellez.solidandroid.module.DependencyInjector; -import com.squareup.otto.Bus; -import com.squareup.otto.Subscribe; - -import javax.inject.Inject; - -import butterknife.ButterKnife; -import butterknife.InjectView; -import butterknife.OnClick; -import dagger.Module; -import hugo.weaving.DebugLog; - -import com.btellez.solidandroid.module.SingletonModule; -import com.btellez.solidandroid.R; - -public class SimpleFragment extends Fragment { - private static int instace = 0; - private int fragNum; - private static String TAG = SimpleFragment.class.getSimpleName(); - private int lastBroadcastValue; - - @InjectView(R.id.simpleTextField) TextView simpleTextField; - @InjectView(R.id.fragmentButton) Button fragmentButton; - - @Inject Bus eventBus; - - @Module(injects = {SimpleFragment.class}, includes = SingletonModule.class) - public static class SimpleFragmentModule { - // Define any dependency providers in this class. - } - - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - ((DependencyInjector) activity.getApplication()).inject(this); // Dagger Injection - Log.e(TAG, "Event Bus Object"+ eventBus.toString() + eventBus.hashCode()); - } - - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View rootView = inflater.inflate(R.layout.fragment_main_user, container, false); - ButterKnife.inject(this, rootView); - instace++; - fragNum = instace; - return rootView; - } - - - @Override - public void onResume() { - super.onResume(); - Log.d(TAG, "Register Subscriber: " + SimpleFragment.class.getSimpleName()); - eventBus.register(this); // Register as a subscriber - } - - - @Override - public void onPause() { - Log.d(TAG, "Unregister Subscriber: "+ SimpleFragment.class.getSimpleName()); - eventBus.unregister(this); // Unregister as we probaly will not need to update if not visible. - super.onPause(); - } - - - @Override - public void onDestroyView() { - ButterKnife.reset(this); - super.onDestroyView(); - } - - - /** - * On Click Listener for R.id.fragmentButton - * Note: the parameter is optional - */ - @DebugLog - @OnClick(R.id.fragmentButton) - public void buttonIsClicked(Button clickedButton) { - Log.d(TAG, "Text View Clicked!"); - lastBroadcastValue = fragNum; - eventBus.post(new ButtonClickedEvent(this, fragNum)); - startActivity(new Intent(getActivity(), SearchResultsActivity.class)); - } - - - //region Event Produces and Subscribers - /** - * Event Listener for ButtonClickedEvent. - * @param event - */ - @Subscribe - public void onEventAvailable(ButtonClickedEvent event) { - Log.d(TAG, "Recieve Event: " + event.getValue()); - if (!event.getSource().equals(this)) { - simpleTextField.setText("Value Recieved: " + event.getValue()); - } - } - - - /** - * A sample event type used in the sample application. Used to denote that a button click happened. - */ - public static class ButtonClickedEvent { - - protected Object source; - protected int value; - - public ButtonClickedEvent(Object src, int val){ - value = val; - source = src; - } - - public Object getSource() { - return source; - } - public int getValue() { - return value; - } - - } - //endregion - -}