// Path: app/src/main/java/apidez/com/databinding/MyApplication.java
// public class MyApplication extends Application {
//     private static Context mContext;
//     protected AppComponent mAppComponent;
//     protected ComponentBuilder mComponentBuilder;
// 
//     @Override
//     public void onCreate() {
//         super.onCreate();
//         mContext = this;
// 
//         // Create app component
//         mAppComponent = DaggerAppComponent.builder()
//                 .appModule(new AppModule())
//                 .build();
// 
//         // Create component builder
//         mComponentBuilder = new ComponentBuilder(mAppComponent);
//     }
// 
//     public AppComponent component() {
//         return mAppComponent;
//     }
// 
//     public ComponentBuilder builder() {
//         return mComponentBuilder;
//     }
// 
//     public static Context context() {
//         return mContext;
//     }
// }
// 
// Path: app/src/main/java/apidez/com/databinding/utils/TextWatcherAdapter.java
// public class TextWatcherAdapter implements TextWatcher {
//     @Override
//     public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// 
//     }
// 
//     @Override
//     public void onTextChanged(CharSequence s, int start, int before, int count) {
// 
//     }
// 
//     @Override
//     public void afterTextChanged(Editable s) {
// 
//     }
// }
// 
// Path: app/src/main/java/apidez/com/databinding/utils/UiUtils.java
// public class UiUtils {
//     public static void showDialog(String text, Context context) {
//         new AlertDialog.Builder(context)
//                 .setMessage(text)
//                 .setPositiveButton(android.R.string.yes, (dialog, which) -> {
//                 })
//                 .show();
//     }
// 
//     public static void closeKeyboard(Activity context) {
//         // Check if no view has focus:
//         View view = context.getCurrentFocus();
//         if (view != null) {
//             InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
//             imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
//         }
//     }
// }
// 
// Path: app/src/main/java/apidez/com/databinding/view/handler/IPurchaseHandler.java
// public interface IPurchaseHandler {
//     TextWatcher emailWatcher();
//     TextWatcher creditCardWatcher();
//     View.OnClickListener onSubmit();
//     View.OnClickListener onInvalid();
// }
// 
// Path: app/src/main/java/apidez/com/databinding/viewmodel/IPurchaseViewModel.java
// public interface IPurchaseViewModel {
//     /**
//      * Observable validation of card
//      */
//     ObservableInt creditCardError();
// 
//     /**
//      * Observable validation of email
//      */
//     ObservableInt emailError();
// 
//     /**
//      * Observable validation of submit
//      */
//     ObservableBoolean canSubmit();
// 
//     /**
//      * set new credit card
//      */
//     void setCreditCard(String newCreditCard);
// 
//     /**
//      * Set new email
//      */
//     void setEmail(String newEmail);
// 
//     /**
//      * Command submit
//      */
//     rx.Observable<Boolean> submit();
// }


import android.app.ProgressDialog;
import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import javax.inject.Inject;
import apidez.com.databinding.MyApplication;
import apidez.com.databinding.R;
import apidez.com.databinding.databinding.ActivityPurchaseBinding;
import apidez.com.databinding.utils.TextWatcherAdapter;
import apidez.com.databinding.utils.UiUtils;
import apidez.com.databinding.view.handler.IPurchaseHandler;
import apidez.com.databinding.viewmodel.IPurchaseViewModel;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
    }

    @Override
    public View.OnClickListener onSubmit() {
        return v -> mViewModel.submit()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .takeUntil(preDestroy())
                .doOnSubscribe(mProgressDialog::show)
                .subscribe(success -> {
                    UiUtils.showDialog(getString(R.string.success), this);
                    mProgressDialog.hide();
                }, throwable -> {
                    UiUtils.showDialog(getString(R.string.error), this);
                    mProgressDialog.hide();
                });
    }

    @Override
    public View.OnClickListener onInvalid() {
        return v -> {
            // Do something
            Log.d("APP", "Invalid");
        };
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
// Path: app/src/main/java/apidez/com/databinding/MyApplication.java
// public class MyApplication extends Application {
//     private static Context mContext;
//     protected AppComponent mAppComponent;
//     protected ComponentBuilder mComponentBuilder;
// 
//     @Override
//     public void onCreate() {
//         super.onCreate();
//         mContext = this;
// 
//         // Create app component
//         mAppComponent = DaggerAppComponent.builder()
//                 .appModule(new AppModule())
//                 .build();
// 
//         // Create component builder
//         mComponentBuilder = new ComponentBuilder(mAppComponent);
//     }
// 
//     public AppComponent component() {
//         return mAppComponent;
//     }
// 
//     public ComponentBuilder builder() {
//         return mComponentBuilder;
//     }
// 
//     public static Context context() {
//         return mContext;
//     }
// }
// 
// Path: app/src/main/java/apidez/com/databinding/utils/TextWatcherAdapter.java
// public class TextWatcherAdapter implements TextWatcher {
//     @Override
//     public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// 
//     }
// 
//     @Override
//     public void onTextChanged(CharSequence s, int start, int before, int count) {
// 
//     }
// 
//     @Override
//     public void afterTextChanged(Editable s) {
// 
//     }
// }
// 
// Path: app/src/main/java/apidez/com/databinding/utils/UiUtils.java
// public class UiUtils {
//     public static void showDialog(String text, Context context) {
//         new AlertDialog.Builder(context)
//                 .setMessage(text)
//                 .setPositiveButton(android.R.string.yes, (dialog, which) -> {
//                 })
//                 .show();
//     }
// 
//     public static void closeKeyboard(Activity context) {
//         // Check if no view has focus:
//         View view = context.getCurrentFocus();
//         if (view != null) {
//             InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
//             imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
//         }
//     }
// }
// 
// Path: app/src/main/java/apidez/com/databinding/view/handler/IPurchaseHandler.java
// public interface IPurchaseHandler {
//     TextWatcher emailWatcher();
//     TextWatcher creditCardWatcher();
//     View.OnClickListener onSubmit();
//     View.OnClickListener onInvalid();
// }
// 
// Path: app/src/main/java/apidez/com/databinding/viewmodel/IPurchaseViewModel.java
// public interface IPurchaseViewModel {
//     /**
//      * Observable validation of card
//      */
//     ObservableInt creditCardError();
// 
//     /**
//      * Observable validation of email
//      */
//     ObservableInt emailError();
// 
//     /**
//      * Observable validation of submit
//      */
//     ObservableBoolean canSubmit();
// 
//     /**
//      * set new credit card
//      */
//     void setCreditCard(String newCreditCard);
// 
//     /**
//      * Set new email
//      */
//     void setEmail(String newEmail);
// 
//     /**
//      * Command submit
//      */
//     rx.Observable<Boolean> submit();
// }


// Path: app/src/main/java/apidez/com/databinding/view/activity/PurchaseActivity.java
import android.app.ProgressDialog;
import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import javax.inject.Inject;
import apidez.com.databinding.MyApplication;
import apidez.com.databinding.R;
import apidez.com.databinding.databinding.ActivityPurchaseBinding;
import apidez.com.databinding.utils.TextWatcherAdapter;
import apidez.com.databinding.utils.UiUtils;
import apidez.com.databinding.view.handler.IPurchaseHandler;
import apidez.com.databinding.viewmodel.IPurchaseViewModel;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;

    }

    @Override
    public View.OnClickListener onSubmit() {
        return v -> mViewModel.submit()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .takeUntil(preDestroy())
                .doOnSubscribe(mProgressDialog::show)
                .subscribe(success -> {
                    UiUtils.showDialog(getString(R.string.success), this);
                    mProgressDialog.hide();
                }, throwable -> {
                    UiUtils.showDialog(getString(R.string.error), this);
                    mProgressDialog.hide();
                });
    }

    @Override
    public View.OnClickListener onInvalid() {
        return v -> {
            // Do something
            Log.d("APP", "Invalid");
        };
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                onBackPressed();