// Path: app/src/main/java/com/rxjava2/android/samples/ui/cache/model/Data.java
// public class Data {
// 
//     public String source;
// 
//     @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
//     @Override
//     public Data clone() {
//         return new Data();
//     }
// }
// 
// Path: app/src/main/java/com/rxjava2/android/samples/ui/cache/source/DataSource.java
// public class DataSource {
// 
//     private final MemoryDataSource memoryDataSource;
//     private final DiskDataSource diskDataSource;
//     private final NetworkDataSource networkDataSource;
// 
//     public DataSource(MemoryDataSource memoryDataSource,
//                       DiskDataSource diskDataSource,
//                       NetworkDataSource networkDataSource) {
//         this.memoryDataSource = memoryDataSource;
//         this.diskDataSource = diskDataSource;
//         this.networkDataSource = networkDataSource;
//     }
// 
//     public Observable<Data> getDataFromMemory() {
//         return memoryDataSource.getData();
//     }
// 
//     public Observable<Data> getDataFromDisk() {
//         return diskDataSource.getData().doOnNext(data ->
//                 memoryDataSource.cacheInMemory(data)
//         );
//     }
// 
//     public Observable<Data> getDataFromNetwork() {
//         return networkDataSource.getData().doOnNext(data -> {
//             diskDataSource.saveToDisk(data);
//             memoryDataSource.cacheInMemory(data);
//         });
//     }
// 
// }
// 
// Path: app/src/main/java/com/rxjava2/android/samples/ui/cache/source/DiskDataSource.java
// public class DiskDataSource {
// 
//     private Data data;
// 
//     public Observable<Data> getData() {
//         return Observable.create(emitter -> {
//             if (data != null) {
//                 emitter.onNext(data);
//             }
//             emitter.onComplete();
//         });
//     }
// 
//     public void saveToDisk(Data data) {
//         this.data = data.clone();
//         this.data.source = "disk";
//     }
// 
// }
// 
// Path: app/src/main/java/com/rxjava2/android/samples/ui/cache/source/MemoryDataSource.java
// public class MemoryDataSource {
// 
//     private Data data;
// 
//     public Observable<Data> getData() {
//         return Observable.create(emitter -> {
//             if (data != null) {
//                 emitter.onNext(data);
//             }
//             emitter.onComplete();
//         });
//     }
// 
//     public void cacheInMemory(Data data) {
//         this.data = data.clone();
//         this.data.source = "memory";
//     }
// 
// }
// 
// Path: app/src/main/java/com/rxjava2/android/samples/ui/cache/source/NetworkDataSource.java
// public class NetworkDataSource {
// 
//     public Observable<Data> getData() {
//         return Observable.create(emitter -> {
//             Data data = new Data();
//             data.source = "network";
//             emitter.onNext(data);
//             emitter.onComplete();
//         });
//     }
// 
// }
// 
// Path: app/src/main/java/com/rxjava2/android/samples/utils/AppConstant.java
// public final class AppConstant {
// 
//     private AppConstant() {
//         // This class in not publicly instantiable.
//     }
// 
//     public static final String LINE_SEPARATOR = "\n";
// 
// }


import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.rxjava2.android.samples.R;
import com.rxjava2.android.samples.ui.cache.model.Data;
import com.rxjava2.android.samples.ui.cache.source.DataSource;
import com.rxjava2.android.samples.ui.cache.source.DiskDataSource;
import com.rxjava2.android.samples.ui.cache.source.MemoryDataSource;
import com.rxjava2.android.samples.ui.cache.source.NetworkDataSource;
import com.rxjava2.android.samples.utils.AppConstant;
import androidx.appcompat.app.AppCompatActivity;
import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
package com.rxjava2.android.samples.ui.cache;




public class CacheExampleActivity extends AppCompatActivity {

    private static final String TAG = CacheExampleActivity.class.getSimpleName();
    Button btn;
    TextView textView;
    DataSource dataSource;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_example);
        btn = (Button) findViewById(R.id.btn);
        textView = (TextView) findViewById(R.id.textView);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                doSomeWork();
            }
        });

// Path: app/src/main/java/com/rxjava2/android/samples/ui/cache/model/Data.java
// public class Data {
// 
//     public String source;
// 
//     @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
//     @Override
//     public Data clone() {
//         return new Data();
//     }
// }
// 
// Path: app/src/main/java/com/rxjava2/android/samples/ui/cache/source/DataSource.java
// public class DataSource {
// 
//     private final MemoryDataSource memoryDataSource;
//     private final DiskDataSource diskDataSource;
//     private final NetworkDataSource networkDataSource;
// 
//     public DataSource(MemoryDataSource memoryDataSource,
//                       DiskDataSource diskDataSource,
//                       NetworkDataSource networkDataSource) {
//         this.memoryDataSource = memoryDataSource;
//         this.diskDataSource = diskDataSource;
//         this.networkDataSource = networkDataSource;
//     }
// 
//     public Observable<Data> getDataFromMemory() {
//         return memoryDataSource.getData();
//     }
// 
//     public Observable<Data> getDataFromDisk() {
//         return diskDataSource.getData().doOnNext(data ->
//                 memoryDataSource.cacheInMemory(data)
//         );
//     }
// 
//     public Observable<Data> getDataFromNetwork() {
//         return networkDataSource.getData().doOnNext(data -> {
//             diskDataSource.saveToDisk(data);
//             memoryDataSource.cacheInMemory(data);
//         });
//     }
// 
// }
// 
// Path: app/src/main/java/com/rxjava2/android/samples/ui/cache/source/DiskDataSource.java
// public class DiskDataSource {
// 
//     private Data data;
// 
//     public Observable<Data> getData() {
//         return Observable.create(emitter -> {
//             if (data != null) {
//                 emitter.onNext(data);
//             }
//             emitter.onComplete();
//         });
//     }
// 
//     public void saveToDisk(Data data) {
//         this.data = data.clone();
//         this.data.source = "disk";
//     }
// 
// }
// 
// Path: app/src/main/java/com/rxjava2/android/samples/ui/cache/source/MemoryDataSource.java
// public class MemoryDataSource {
// 
//     private Data data;
// 
//     public Observable<Data> getData() {
//         return Observable.create(emitter -> {
//             if (data != null) {
//                 emitter.onNext(data);
//             }
//             emitter.onComplete();
//         });
//     }
// 
//     public void cacheInMemory(Data data) {
//         this.data = data.clone();
//         this.data.source = "memory";
//     }
// 
// }
// 
// Path: app/src/main/java/com/rxjava2/android/samples/ui/cache/source/NetworkDataSource.java
// public class NetworkDataSource {
// 
//     public Observable<Data> getData() {
//         return Observable.create(emitter -> {
//             Data data = new Data();
//             data.source = "network";
//             emitter.onNext(data);
//             emitter.onComplete();
//         });
//     }
// 
// }
// 
// Path: app/src/main/java/com/rxjava2/android/samples/utils/AppConstant.java
// public final class AppConstant {
// 
//     private AppConstant() {
//         // This class in not publicly instantiable.
//     }
// 
//     public static final String LINE_SEPARATOR = "\n";
// 
// }


// Path: app/src/main/java/com/rxjava2/android/samples/ui/cache/CacheExampleActivity.java
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.rxjava2.android.samples.R;
import com.rxjava2.android.samples.ui.cache.model.Data;
import com.rxjava2.android.samples.ui.cache.source.DataSource;
import com.rxjava2.android.samples.ui.cache.source.DiskDataSource;
import com.rxjava2.android.samples.ui.cache.source.MemoryDataSource;
import com.rxjava2.android.samples.ui.cache.source.NetworkDataSource;
import com.rxjava2.android.samples.utils.AppConstant;
import androidx.appcompat.app.AppCompatActivity;
import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;

package com.rxjava2.android.samples.ui.cache;




public class CacheExampleActivity extends AppCompatActivity {

    private static final String TAG = CacheExampleActivity.class.getSimpleName();
    Button btn;
    TextView textView;
    DataSource dataSource;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_example);
        btn = (Button) findViewById(R.id.btn);
        textView = (TextView) findViewById(R.id.textView);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                doSomeWork();
            }
        });

        dataSource = new DataSource(new MemoryDataSource(), new DiskDataSource(), new NetworkDataSource());