package com.couchbase.cityexplorer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import com.couchbase.cityexplorer.model.Place;
import com.couchbase.lite.CouchbaseLiteException;
import com.couchbase.lite.Database;
import com.couchbase.lite.Emitter;
import com.couchbase.lite.LiveQuery;
import com.couchbase.lite.Manager;
import com.couchbase.lite.Mapper;
import com.couchbase.lite.Query;
import com.couchbase.lite.QueryEnumerator;
import com.couchbase.lite.QueryRow;
import com.couchbase.lite.View;
import com.couchbase.lite.android.AndroidContext;
import com.couchbase.lite.replicator.Replication;
import com.couchbase.lite.support.LazyJsonObject;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
private static final String PLACES_VIEW = "getPlaces";
private Database database;
private List<QueryRow> currentRows;
private PlacesAdapter adapter;
private RecyclerView recyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
// replace with the IP to use
URL url = new URL("http://192.168.1.218:4984/db");
Manager manager = new Manager(new AndroidContext(getApplicationContext()), Manager.DEFAULT_OPTIONS);
database = manager.getExistingDatabase("cityexplorer");
if (database != null) {
database.delete();
}
database = manager.getDatabase("cityexplorer");
registerViews();
Replication pull = database.createPullReplication(url);
pull.setContinuous(true);
pull.start();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (CouchbaseLiteException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
recyclerView = (RecyclerView) findViewById(R.id.list);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter = new PlacesAdapter(this, new ArrayList<Place>(), database);
recyclerView.setAdapter(adapter);
final Query queryPlaces = database.getView(PLACES_VIEW).createQuery();
database.addChangeListener(new Database.ChangeListener() {
@Override
public void changed(Database.ChangeEvent event) {
if (event.isExternal()) {
QueryEnumerator rows = null;
try {
rows = queryPlaces.run();
} catch (CouchbaseLiteException e) {
e.printStackTrace();
}
List<Place> places = new ArrayList<>();
for (Iterator<QueryRow> it = rows; it.hasNext(); ) {
QueryRow row = it.next();
Log.d("", row.getValue().toString());
Map<String, Object> properties = database.getDocument(row.getDocumentId()).getProperties();
places.add(new Place((LazyJsonObject) row.getValue()));
}
adapter.dataSet = places;
runOnUiThread(new Runnable() {
@Override
public void run() {
recyclerView.getAdapter().notifyDataSetChanged();
}
});
}
}
});
}
public void deletePlace(android.view.View view) {
Log.d("", "delete me");
adapter.dataSet.remove(2);
try {
database.getExistingDocument(adapter.dataSet.get(2).getId()).delete();
} catch (CouchbaseLiteException e) {
e.printStackTrace();
}
adapter.notifyItemRemoved(2);
}
private void registerViews() {
View placesView = database.getView(PLACES_VIEW);
placesView.setMap(new Mapper() {
@Override
public void map(Map<String, Object> document, Emitter emitter) {
emitter.emit(document.get("_id"), document);
}
}, "1");
}
}