package in.mamga.carousalnotificationmaster;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.lang.reflect.Type;
import java.util.ArrayList;
import in.mamga.carousalnotification.Carousal;
import in.mamga.carousalnotification.CarousalItem;
public class MainActivity extends AppCompatActivity {
Button btnQuote;
Button btnNasa;
TextView tvStatus;
TextView tvResponse;
ProgressDialog progressDialog;
private final String FETCHING = "Status = fetching data";
private final String BUILDING_CAROUSAL = "Status = Data detched. building carousal";
private final String CAROUSALPREPARING = "Status = Caraousal preparing. will be be up in few seconds!";
private final String FETCHING_ERROR = "Status = Seems like this url is not working. Should try others.";
private final String PARSING_ERROR = "Status = Seems like data format of this spi has changed. Should try others.";
public static final String TYPE_QUOTE = "Quote";
public static final String TYPE_IMAGE_MARS = "MarsImage";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setUpLayout();
onNewIntent(getIntent());
}
private void setUpLayout() {
btnQuote = (Button) findViewById(R.id.btnQuote);
btnNasa = (Button) findViewById(R.id.btnMovies);
tvStatus = (TextView) findViewById(R.id.tvCurrentStatus);
tvResponse = (TextView) findViewById(R.id.tvResponse);
btnQuote.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
fetchQuotes();
}
});
btnNasa.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
fetchMarsPhotos();
}
});
}
private void fetchMarsPhotos() {
tvStatus.setText( FETCHING);
showDialog("Fetching Photos");
JSONParser.OnConnectionListener onConnectionListener = new JSONParser.OnConnectionListener() {
@Override
public void onResponse(String s) {
hideDialog();
tvStatus.setText( BUILDING_CAROUSAL);
tvResponse.setText("Fetched Result = " + s);
buildMarsCarousal(s);
}
@Override
public void onError() {
hideDialog();
tvStatus.setText(FETCHING_ERROR);
}
};
JSONParser jsonParser = new JSONParser(onConnectionListener);
jsonParser.fetchJson("https://mars-photos.herokuapp.com/api/v1/rovers/opportunity/photos?earth_date=2015-6-3&camera=pancam");
}
/**
* once we receive data from api, we start building the carousal
* @param s : response string
*/
private void buildMarsCarousal(String s) {
ArrayList<RoverItem> photoList = new ArrayList<RoverItem>();
try {
JSONObject photoOb = new JSONObject(s);
JSONArray photos = photoOb.getJSONArray("photos");
Type type = new TypeToken<RoverItem>() {
}.getType();
for (int i = 0; i < photos.length() && i < 10 ; i = i + 4 ) {
RoverItem item = new Gson().fromJson(photos.get(i).toString(), type);
photoList.add(item);
}
} catch (JSONException e) {
e.printStackTrace();
tvStatus.setText(PARSING_ERROR);
}
if (photoList.size() > 0) {
tvStatus.setText(CAROUSALPREPARING);
//Here we build the carousal
Carousal carousal = Carousal.with(this).beginTransaction();
carousal.setContentTitle("Opportunity on Mars!").setContentText("Check out these photographs by Opportunity on Mars.");
for ( RoverItem photo : photoList) {
//Notice here. In case you want to preserve data of each item, you can save a gson string
// of the object in carousal item's id. Though not much recommended.
CarousalItem cItem = new CarousalItem(new Gson().toJson(photo).toString(), photo.getEarth_date(), null, photo.getImg_src());
//Additionally we can set a type to it. It is useful if we are showing more than one type
//of data in carousal. so that we know, where to go when an item is clicked.
cItem.setType(TYPE_IMAGE_MARS);
carousal.addCarousalItem(cItem);
}
carousal.buildCarousal();
}
}
private void fetchQuotes() {
tvStatus.setText( FETCHING);
showDialog("Fetching Quotes");
JSONParser.OnConnectionListener onConnectionListener = new JSONParser.OnConnectionListener() {
@Override
public void onResponse(String s) {
hideDialog();
tvStatus.setText( BUILDING_CAROUSAL);
tvResponse.setText("Fetched Result = " + s);
buildQuoteCarousal(s);
}
@Override
public void onError() {
hideDialog();
tvStatus.setText(FETCHING_ERROR);
}
};
JSONParser jsonParser = new JSONParser(onConnectionListener);
jsonParser.fetchJson("http://quotesondesign.com/wp-json/posts?filter[orderby]=rand&filter[posts_per_page]=10");
}
/**
* once we receive data from api, we start building the carousal
* @param s : response string
*/
private void buildQuoteCarousal(String s) {
ArrayList<QuoteItem> quotesList = new ArrayList<QuoteItem>();
try {
JSONArray quotes = new JSONArray(s);
for (int i = 0; i < quotes.length() ; i++) {
JSONObject quote = (JSONObject) quotes.get(i);
quotesList.add(new QuoteItem(quote.getInt("ID"), quote.getString("title"), quote.getString("content")));
}
} catch (JSONException e) {
e.printStackTrace();
tvStatus.setText(PARSING_ERROR);
}
if (quotesList.size() > 0) {
tvStatus.setText(CAROUSALPREPARING);
//Here we build the carousal
Carousal carousal = Carousal.with(this).beginTransaction();
carousal.setContentTitle("Quotes from everywhere!").setContentText("Notice these random quotes from around the world")
.setBigContentTitle("Quotes from everywhere!").setBigContentText("Notice these random quotes from around the world");
for ( QuoteItem item : quotesList) {
CarousalItem cItem = new CarousalItem(item.getID()+"", item.getTitle(), item.getContent(),null);
//Additionally we can set a type to it. It is useful if we are showing more than one type
//of data in carousal. so that we know, where to go when an item is clicked.
cItem.setType(TYPE_QUOTE);
carousal.addCarousalItem(cItem);
}
carousal.setOtherRegionClickable(true);
carousal.buildCarousal();
}
}
@Override
public void onNewIntent(Intent intent) {
Bundle extras = intent.getExtras();
if (extras != null) {
if (extras.containsKey(Carousal.CAROUSAL_ITEM_CLICKED_KEY)) {
CarousalItem carousalItem = (CarousalItem) extras.getParcelable(Carousal.CAROUSAL_ITEM_CLICKED_KEY);
Toast.makeText(this, carousalItem.getTitle() + carousalItem.getDescription(), Toast.LENGTH_LONG).show();
}
}
}
private void showDialog(String message) {
progressDialog = new ProgressDialog(this);
progressDialog.setMessage(message);
progressDialog.show();
}
private void hideDialog() {
if (progressDialog != null) {
progressDialog.hide();
progressDialog = null;
}
}
}