// Path: app/src/main/java/org/xdty/kindle/di/AppComponent.java
// @Singleton
// @Component(modules = AppModule.class)
// public interface AppComponent {
// 
//     void inject(BookRepository bookRepository);
// 
//     void inject(DatabaseImpl database);
// 
//     void inject(BooksAdapter booksAdapter);
// 
//     void inject(MainPresenter mainPresenter);
// 
//     void inject(DetailPresenter detailPresenter);
// }
// 
// Path: app/src/main/java/org/xdty/kindle/di/modules/AppModule.java
// @Module
// public class AppModule {
//     private static final String TAG = AppModule.class.getSimpleName();
// 
//     private Application app;
//     private OkHttpClient mOkHttpClient;
// 
//     public AppModule(Application application) {
//         app = application;
// 
//         HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
//         loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);
// 
//         Interceptor interceptor = new Interceptor() {
//             @Override
//             public Response intercept(Chain chain) throws IOException {
//                 Request request = chain.request();
//                 HttpUrl url = request.url()
//                         .newBuilder()
//                         .addQueryParameter("timestamp",
//                                 Long.toString(System.currentTimeMillis() / 1000 / 60))
//                         .build();
//                 request = request.newBuilder().url(url).build();
//                 return chain.proceed(request);
//             }
//         };
// 
//         mOkHttpClient = new OkHttpClient.Builder()
//                 .addInterceptor(loggingInterceptor)
//                 .addInterceptor(interceptor)
//                 .build();
//     }
// 
//     @Singleton
//     @Provides
//     public Application provideApplication() {
//         return app;
//     }
// 
//     @Singleton
//     @Provides
//     public BookDataSource provideBookDataSource() {
//         return new BookRepository();
//     }
// 
//     @Singleton
//     @Provides
//     public OkHttpClient provideOkHttpClient() {
//         return mOkHttpClient;
//     }
// 
//     @Singleton
//     @Provides
//     public BookService provideBookService() {
//         Retrofit retrofit = new Retrofit.Builder()
//                 .baseUrl(Constants.BASE_URL)
//                 .client(mOkHttpClient)
//                 .addConverterFactory(GsonConverterFactory.create(new GsonBuilder()
//                         .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
//                         .create()))
//                 .build();
//         return retrofit.create(BookService.class);
//     }
// 
//     @Singleton
//     @Provides
//     public Database provideDatabase() {
//         return DatabaseImpl.getInstance();
//     }
// 
//     @Singleton
//     @Provides
//     public EntityDataStore<Persistable> provideDatabaseSource() {
//         Observable.<Void>just(null).observeOn(Schedulers.io()).subscribe(new Action1<Void>() {
//             @Override
//             public void call(Void aVoid) {
//                 raw2data(app, DB_NAME, R.raw.books);
//             }
//         });
// 
//         DatabaseSource source = new DatabaseSource(app, Models.DEFAULT, DB_NAME, DB_VERSION);
//         source.setLoggingEnabled(BuildConfig.DEBUG);
//         Configuration configuration = source.getConfiguration();
// 
//         return new EntityDataStore<>(configuration);
//     }
// 
//     @Singleton
//     @Provides
//     public RequestManager provideGlide() {
//         OkHttpUrlLoader.Factory factory = new OkHttpUrlLoader.Factory(mOkHttpClient);
//         Glide.get(app).register(GlideUrl.class, InputStream.class, factory);
//         return Glide.with(app);
//     }
// 
//     private void raw2data(Context context, String filename, int raw) {
// 
//         try {
//             InputStream inputStream = context.getResources().openRawResource(raw);
// 
//             File cacheFile = context.getDatabasePath(filename);
// 
//             if (cacheFile.exists()) {
//                 if (cacheFile.length() == inputStream.available()) {
//                     return;
//                 } else if (!cacheFile.delete()) {
//                     Log.d(TAG, "cache file delete failed.");
//                 } else {
//                     Log.d(TAG, "update cached database.");
//                 }
//             }
// 
//             File parent = cacheFile.getParentFile();
//             if (!parent.exists() && !parent.mkdirs()) {
//                 Log.d(TAG, "database directory create failed.");
//             }
// 
//             FileOutputStream fileOutputStream = new FileOutputStream(cacheFile);
// 
//             int bufferSize = 1024;
//             byte[] buffer = new byte[bufferSize];
//             int length;
//             while ((length = inputStream.read(buffer)) > 0) {
//                 fileOutputStream.write(buffer, 0, length);
//             }
//             fileOutputStream.close();
//             inputStream.close();
//         } catch (IOException e) {
//             e.printStackTrace();
//         }
//     }
// 
// }


import org.xdty.kindle.di.AppComponent;
import org.xdty.kindle.di.DaggerAppComponent;
import org.xdty.kindle.di.modules.AppModule;
package org.xdty.kindle.application;


public class Application extends android.app.Application {

    private static AppComponent sAppComponent;

    @Override
    public void onCreate() {
        super.onCreate();
// Path: app/src/main/java/org/xdty/kindle/di/AppComponent.java
// @Singleton
// @Component(modules = AppModule.class)
// public interface AppComponent {
// 
//     void inject(BookRepository bookRepository);
// 
//     void inject(DatabaseImpl database);
// 
//     void inject(BooksAdapter booksAdapter);
// 
//     void inject(MainPresenter mainPresenter);
// 
//     void inject(DetailPresenter detailPresenter);
// }
// 
// Path: app/src/main/java/org/xdty/kindle/di/modules/AppModule.java
// @Module
// public class AppModule {
//     private static final String TAG = AppModule.class.getSimpleName();
// 
//     private Application app;
//     private OkHttpClient mOkHttpClient;
// 
//     public AppModule(Application application) {
//         app = application;
// 
//         HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
//         loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);
// 
//         Interceptor interceptor = new Interceptor() {
//             @Override
//             public Response intercept(Chain chain) throws IOException {
//                 Request request = chain.request();
//                 HttpUrl url = request.url()
//                         .newBuilder()
//                         .addQueryParameter("timestamp",
//                                 Long.toString(System.currentTimeMillis() / 1000 / 60))
//                         .build();
//                 request = request.newBuilder().url(url).build();
//                 return chain.proceed(request);
//             }
//         };
// 
//         mOkHttpClient = new OkHttpClient.Builder()
//                 .addInterceptor(loggingInterceptor)
//                 .addInterceptor(interceptor)
//                 .build();
//     }
// 
//     @Singleton
//     @Provides
//     public Application provideApplication() {
//         return app;
//     }
// 
//     @Singleton
//     @Provides
//     public BookDataSource provideBookDataSource() {
//         return new BookRepository();
//     }
// 
//     @Singleton
//     @Provides
//     public OkHttpClient provideOkHttpClient() {
//         return mOkHttpClient;
//     }
// 
//     @Singleton
//     @Provides
//     public BookService provideBookService() {
//         Retrofit retrofit = new Retrofit.Builder()
//                 .baseUrl(Constants.BASE_URL)
//                 .client(mOkHttpClient)
//                 .addConverterFactory(GsonConverterFactory.create(new GsonBuilder()
//                         .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
//                         .create()))
//                 .build();
//         return retrofit.create(BookService.class);
//     }
// 
//     @Singleton
//     @Provides
//     public Database provideDatabase() {
//         return DatabaseImpl.getInstance();
//     }
// 
//     @Singleton
//     @Provides
//     public EntityDataStore<Persistable> provideDatabaseSource() {
//         Observable.<Void>just(null).observeOn(Schedulers.io()).subscribe(new Action1<Void>() {
//             @Override
//             public void call(Void aVoid) {
//                 raw2data(app, DB_NAME, R.raw.books);
//             }
//         });
// 
//         DatabaseSource source = new DatabaseSource(app, Models.DEFAULT, DB_NAME, DB_VERSION);
//         source.setLoggingEnabled(BuildConfig.DEBUG);
//         Configuration configuration = source.getConfiguration();
// 
//         return new EntityDataStore<>(configuration);
//     }
// 
//     @Singleton
//     @Provides
//     public RequestManager provideGlide() {
//         OkHttpUrlLoader.Factory factory = new OkHttpUrlLoader.Factory(mOkHttpClient);
//         Glide.get(app).register(GlideUrl.class, InputStream.class, factory);
//         return Glide.with(app);
//     }
// 
//     private void raw2data(Context context, String filename, int raw) {
// 
//         try {
//             InputStream inputStream = context.getResources().openRawResource(raw);
// 
//             File cacheFile = context.getDatabasePath(filename);
// 
//             if (cacheFile.exists()) {
//                 if (cacheFile.length() == inputStream.available()) {
//                     return;
//                 } else if (!cacheFile.delete()) {
//                     Log.d(TAG, "cache file delete failed.");
//                 } else {
//                     Log.d(TAG, "update cached database.");
//                 }
//             }
// 
//             File parent = cacheFile.getParentFile();
//             if (!parent.exists() && !parent.mkdirs()) {
//                 Log.d(TAG, "database directory create failed.");
//             }
// 
//             FileOutputStream fileOutputStream = new FileOutputStream(cacheFile);
// 
//             int bufferSize = 1024;
//             byte[] buffer = new byte[bufferSize];
//             int length;
//             while ((length = inputStream.read(buffer)) > 0) {
//                 fileOutputStream.write(buffer, 0, length);
//             }
//             fileOutputStream.close();
//             inputStream.close();
//         } catch (IOException e) {
//             e.printStackTrace();
//         }
//     }
// 
// }


// Path: app/src/main/java/org/xdty/kindle/application/Application.java
import org.xdty.kindle.di.AppComponent;
import org.xdty.kindle.di.DaggerAppComponent;
import org.xdty.kindle.di.modules.AppModule;

package org.xdty.kindle.application;


public class Application extends android.app.Application {

    private static AppComponent sAppComponent;

    @Override
    public void onCreate() {
        super.onCreate();
        sAppComponent = DaggerAppComponent.builder().appModule(new AppModule(this)).build();