// Path: RxJava/RxJavaExample/app/src/main/java/com/example/rxjavaexample/MainActivity.java
// public class MainActivity extends AppCompatActivity
// {
// 	
// 	
// 	@BindView(R.id.text_view)
// 	TextView textView;
// 	
// 	
// 	@Inject
// 	TwitchAPI twitchAPI;
// 	
// 	private ApplicationContextComponent applicationContextComponent;
// 	private App app;
// 	
// 	@Override
// 	protected void onCreate( Bundle savedInstanceState )
// 	{
// 		super.onCreate( savedInstanceState );
// 		setContentView( R.layout.activity_main );
// 		
// 		
// 		ButterKnife.bind( this );
// 		
// 		app = App.get( this );
// 		
// 		
// 		applicationContextComponent = app.getComponent();
// 		
// 		
// 		applicationContextComponent.inject( this );
// 		
// 		// Retrofit2
// 		 Call<Twitch> call = twitchAPI.getTopGames();
// 		
// 		call.enqueue( new Callback<Twitch>()
// 		{
// 			@Override
// 			public void onResponse( Call<Twitch> call, Response<Twitch> response )
// 			{
// 				List<Stream> gameList = response.body().getStreams();
// 				
// 				
// 				for ( Stream game : gameList )
// 				{
// 					Log.i( "RETRO_RESPONSE", "onResponse: " + game.getGame() );
// 				}
// 			}
// 			
// 			@Override
// 			public void onFailure( Call<Twitch> call, Throwable t )
// 			{
// 				
// 			}
// 		} );
// 		
// 		// RxJava
// 		
// 		/*Observable<String> sampleStringObservable = Observable.fromCallable( new Callable<String>()
// 		{
// 			@Override
// 			public String call() throws Exception
// 			{
// 				
// 				Thread.sleep( 5000 );
// 				return "Hello from callable sample observable string!";
// 			}
// 		} );
// 		
// 		sampleStringObservable.observeOn( AndroidSchedulers.mainThread() )
// 				.subscribeOn( Schedulers.io() )
// 				.subscribe( new Observer<String>()
// 				{
// 					@Override
// 					public void onCompleted()
// 					{
// 						
// 					}
// 					
// 					@Override
// 					public void onError( @NonNull Throwable e )
// 					{
// 						
// 					}
// 					
// 					@Override
// 					public void onNext( @NonNull String s )
// 					{
// 						
// 						
// 						textView.setText( s + " On Next" );
// 						
// 					}
// 				} )
// 		;*/
// 		
// 		
// 		twitchAPI.getTopGamesObservable().flatMap(new Func1<Twitch, Observable<Stream>>() {
// 			@Override
// 			public Observable<Stream> call(Twitch twitch) {
// 				
// 				return Observable.from(twitch.getStreams());
// 			}
// 		}).flatMap(new Func1<Stream, Observable<String>>() {
// 			@Override
// 			public Observable<String> call(Stream top) {
// 				
// 				return Observable.just(top.getGame());
// 				
// 			}
// 		}).subscribeOn( Schedulers.io()).observeOn( AndroidSchedulers.mainThread()).subscribe( new Observer<String>() {
// 			@Override
// 			public void onCompleted() {
// 				
// 			}
// 			
// 			@Override
// 			public void onError(Throwable e) {
// 				
// 			}
// 			
// 			@Override
// 			public void onNext(String s) {
// 				
// 				System.out.println("From rx java: " + s);
// 			}
// 		});
// 		
// 	}
// }
// 
// Path: RxJava/RxJavaExample/app/src/main/java/com/example/rxjavaexample/http/ApiModule.java
// @Module(includes = ApplicationContextModule.class)
// public class ApiModule
// {
// 
//     public final String BASE_URL = "https://api.twitch.tv/kraken/";
// 
//     @Provides
//     public OkHttpClient provideClient( final Context context )
//     {
// 
// 
//         OkHttpClient.Builder httpClient =
//                 new OkHttpClient.Builder();
// 
// 
//         httpClient.addInterceptor( new Interceptor()
//         {
//             @Override
//             public Response intercept( Interceptor.Chain chain )
//             {
//                 Request original = chain.request();
//                 HttpUrl originalHttpUrl = original.url();
// 
//                 HttpUrl url = originalHttpUrl.newBuilder()
//                         .addQueryParameter( "client_id", context.getString( R.string.twitch_id ) )
//                         .build();
// 
//                 // Request customization: add request headers
//                 Request.Builder requestBuilder = original.newBuilder()
//                         .url( url );
// 
//                 Request request = requestBuilder.build();
//                 try
//                 {
//                     return chain.proceed( request );
//                 }
//                 catch ( IOException e )
//                 {
//                     e.printStackTrace();
//                     return null;
//                 }
// 
//             }
//         } );
// 
// 
//         HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
// 
// 
//         interceptor.setLevel( HttpLoggingInterceptor.Level.HEADERS );
//         return httpClient.addInterceptor( interceptor )
//                 .build();
// 
//     }
// 
//     @Provides
//     public Retrofit provideRetrofit( String baseURL, OkHttpClient client )
//     {
//         return new Retrofit.Builder()
//                 .baseUrl( baseURL )
//                 .client( client )
//                 .addConverterFactory( GsonConverterFactory.create() )
//                 .addCallAdapterFactory( RxJavaCallAdapterFactory.create() )
//                 .build();
//     }
// 
//     @Provides
//     public TwitchAPI provideApiService(Context context)
//     {
//         return provideRetrofit( BASE_URL, provideClient(context) ).create( TwitchAPI.class );
//     }
// }


import dagger.Component;
import com.example.rxjavaexample.MainActivity;
import com.example.rxjavaexample.http.ApiModule;

package com.example.rxjavaexample.root;





/**
 * Created by tzia on 17-May-17.
 */


@Component(modules = {ApplicationContextModule.class, ApiModule.class})
// Search for dependencies in these listed modules or components in some cases
public interface ApplicationContextComponent
{


// Path: RxJava/RxJavaExample/app/src/main/java/com/example/rxjavaexample/MainActivity.java
// public class MainActivity extends AppCompatActivity
// {
// 	
// 	
// 	@BindView(R.id.text_view)
// 	TextView textView;
// 	
// 	
// 	@Inject
// 	TwitchAPI twitchAPI;
// 	
// 	private ApplicationContextComponent applicationContextComponent;
// 	private App app;
// 	
// 	@Override
// 	protected void onCreate( Bundle savedInstanceState )
// 	{
// 		super.onCreate( savedInstanceState );
// 		setContentView( R.layout.activity_main );
// 		
// 		
// 		ButterKnife.bind( this );
// 		
// 		app = App.get( this );
// 		
// 		
// 		applicationContextComponent = app.getComponent();
// 		
// 		
// 		applicationContextComponent.inject( this );
// 		
// 		// Retrofit2
// 		 Call<Twitch> call = twitchAPI.getTopGames();
// 		
// 		call.enqueue( new Callback<Twitch>()
// 		{
// 			@Override
// 			public void onResponse( Call<Twitch> call, Response<Twitch> response )
// 			{
// 				List<Stream> gameList = response.body().getStreams();
// 				
// 				
// 				for ( Stream game : gameList )
// 				{
// 					Log.i( "RETRO_RESPONSE", "onResponse: " + game.getGame() );
// 				}
// 			}
// 			
// 			@Override
// 			public void onFailure( Call<Twitch> call, Throwable t )
// 			{
// 				
// 			}
// 		} );
// 		
// 		// RxJava
// 		
// 		/*Observable<String> sampleStringObservable = Observable.fromCallable( new Callable<String>()
// 		{
// 			@Override
// 			public String call() throws Exception
// 			{
// 				
// 				Thread.sleep( 5000 );
// 				return "Hello from callable sample observable string!";
// 			}
// 		} );
// 		
// 		sampleStringObservable.observeOn( AndroidSchedulers.mainThread() )
// 				.subscribeOn( Schedulers.io() )
// 				.subscribe( new Observer<String>()
// 				{
// 					@Override
// 					public void onCompleted()
// 					{
// 						
// 					}
// 					
// 					@Override
// 					public void onError( @NonNull Throwable e )
// 					{
// 						
// 					}
// 					
// 					@Override
// 					public void onNext( @NonNull String s )
// 					{
// 						
// 						
// 						textView.setText( s + " On Next" );
// 						
// 					}
// 				} )
// 		;*/
// 		
// 		
// 		twitchAPI.getTopGamesObservable().flatMap(new Func1<Twitch, Observable<Stream>>() {
// 			@Override
// 			public Observable<Stream> call(Twitch twitch) {
// 				
// 				return Observable.from(twitch.getStreams());
// 			}
// 		}).flatMap(new Func1<Stream, Observable<String>>() {
// 			@Override
// 			public Observable<String> call(Stream top) {
// 				
// 				return Observable.just(top.getGame());
// 				
// 			}
// 		}).subscribeOn( Schedulers.io()).observeOn( AndroidSchedulers.mainThread()).subscribe( new Observer<String>() {
// 			@Override
// 			public void onCompleted() {
// 				
// 			}
// 			
// 			@Override
// 			public void onError(Throwable e) {
// 				
// 			}
// 			
// 			@Override
// 			public void onNext(String s) {
// 				
// 				System.out.println("From rx java: " + s);
// 			}
// 		});
// 		
// 	}
// }
// 
// Path: RxJava/RxJavaExample/app/src/main/java/com/example/rxjavaexample/http/ApiModule.java
// @Module(includes = ApplicationContextModule.class)
// public class ApiModule
// {
// 
//     public final String BASE_URL = "https://api.twitch.tv/kraken/";
// 
//     @Provides
//     public OkHttpClient provideClient( final Context context )
//     {
// 
// 
//         OkHttpClient.Builder httpClient =
//                 new OkHttpClient.Builder();
// 
// 
//         httpClient.addInterceptor( new Interceptor()
//         {
//             @Override
//             public Response intercept( Interceptor.Chain chain )
//             {
//                 Request original = chain.request();
//                 HttpUrl originalHttpUrl = original.url();
// 
//                 HttpUrl url = originalHttpUrl.newBuilder()
//                         .addQueryParameter( "client_id", context.getString( R.string.twitch_id ) )
//                         .build();
// 
//                 // Request customization: add request headers
//                 Request.Builder requestBuilder = original.newBuilder()
//                         .url( url );
// 
//                 Request request = requestBuilder.build();
//                 try
//                 {
//                     return chain.proceed( request );
//                 }
//                 catch ( IOException e )
//                 {
//                     e.printStackTrace();
//                     return null;
//                 }
// 
//             }
//         } );
// 
// 
//         HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
// 
// 
//         interceptor.setLevel( HttpLoggingInterceptor.Level.HEADERS );
//         return httpClient.addInterceptor( interceptor )
//                 .build();
// 
//     }
// 
//     @Provides
//     public Retrofit provideRetrofit( String baseURL, OkHttpClient client )
//     {
//         return new Retrofit.Builder()
//                 .baseUrl( baseURL )
//                 .client( client )
//                 .addConverterFactory( GsonConverterFactory.create() )
//                 .addCallAdapterFactory( RxJavaCallAdapterFactory.create() )
//                 .build();
//     }
// 
//     @Provides
//     public TwitchAPI provideApiService(Context context)
//     {
//         return provideRetrofit( BASE_URL, provideClient(context) ).create( TwitchAPI.class );
//     }
// }


// Path: RxJava/RxJavaExample/app/src/main/java/com/example/rxjavaexample/root/ApplicationContextComponent.java
import dagger.Component;
import com.example.rxjavaexample.MainActivity;
import com.example.rxjavaexample.http.ApiModule;


package com.example.rxjavaexample.root;





/**
 * Created by tzia on 17-May-17.
 */


@Component(modules = {ApplicationContextModule.class, ApiModule.class})
// Search for dependencies in these listed modules or components in some cases
public interface ApplicationContextComponent
{


    void inject(MainActivity target);