package com.ronakmanglani.watchlist.ui.activity; import android.content.Intent; import android.content.pm.ActivityInfo; import android.net.Uri; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.util.DisplayMetrics; import android.view.MenuItem; import android.view.View; import android.widget.TextView; import com.android.volley.Request; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.JsonObjectRequest; import com.ronakmanglani.watchlist.R; import com.ronakmanglani.watchlist.WatchlistApp; import com.ronakmanglani.watchlist.ui.adapter.PhotoAdapter; import com.ronakmanglani.watchlist.ui.adapter.PhotoAdapter.OnPhotoClickListener; import com.ronakmanglani.watchlist.api.ApiHelper; import com.ronakmanglani.watchlist.api.VolleySingleton; import com.ronakmanglani.watchlist.ui.view.PaddingDecorationView; import org.json.JSONArray; import org.json.JSONObject; import java.util.ArrayList; import butterknife.BindView; import butterknife.BindBool; import butterknife.ButterKnife; import butterknife.OnClick; public class PhotoActivity extends AppCompatActivity implements OnPhotoClickListener { private String movieId; private PhotoAdapter adapter; private boolean isLoading = false; @BindBool(R.bool.is_tablet) boolean isTablet; @BindView(R.id.toolbar) Toolbar toolbar; @BindView(R.id.toolbar_title) TextView toolbarTitle; @BindView(R.id.toolbar_subtitle) TextView toolbarSubtitle; @BindView(R.id.photo_list) RecyclerView photoList; @BindView(R.id.error_message) View errorMessage; @BindView(R.id.progress_circle) View progressCircle; @BindView(R.id.no_results) View noResults; @BindView(R.id.no_results_message) TextView noResultsMessage; // Activity lifecycle @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_photo); ButterKnife.bind(this); movieId = getIntent().getStringExtra(WatchlistApp.MOVIE_ID); String movieName = getIntent().getStringExtra(WatchlistApp.MOVIE_NAME); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setTitle(""); toolbarTitle.setText(R.string.photos_title); toolbarSubtitle.setText(movieName); GridLayoutManager layoutManager = new GridLayoutManager(this,getNumberOfColumns()); adapter = new PhotoAdapter(this, new ArrayList<String>(), this); photoList.setHasFixedSize(true); photoList.setLayoutManager(layoutManager); photoList.addItemDecoration(new PaddingDecorationView(this, R.dimen.dist_xxsmall)); photoList.setAdapter(adapter); if (savedInstanceState == null) { downloadPhotosList(); } // Lock orientation for tablets if (isTablet) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } } @Override protected void onStop() { super.onStop(); VolleySingleton.getInstance().requestQueue.cancelAll(this.getClass().getName()); } // Save/restore state @Override public void onSaveInstanceState(Bundle outState) { if (adapter != null) { outState.putStringArrayList(WatchlistApp.PHOTO_LIST, adapter.photoList); outState.putBoolean(WatchlistApp.IS_LOADING, isLoading); } super.onSaveInstanceState(outState); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); adapter.photoList = savedInstanceState.getStringArrayList(WatchlistApp.PHOTO_LIST); isLoading = savedInstanceState.getBoolean(WatchlistApp.IS_LOADING); // If activity was previously downloading and it stopped, download again if (isLoading) { downloadPhotosList(); } else { onDownloadSuccessful(); } } // Toolbar actions @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { finish(); return true; } else { return false; } } // Helper method public int getNumberOfColumns() { DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); float widthPx = displayMetrics.widthPixels; float desiredPx = getResources().getDimensionPixelSize(R.dimen.photo_item_width); int columns = Math.round(widthPx / desiredPx); if (columns <= 1) { return 1; } else { return columns; } } // JSON parsing and display private void downloadPhotosList() { isLoading = true; if (adapter == null) { adapter = new PhotoAdapter(this, new ArrayList<String>(), this); photoList.setAdapter(adapter); } JsonObjectRequest request = new JsonObjectRequest( Request.Method.GET, ApiHelper.getPhotosLink(this, movieId), null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject object) { try { JSONArray backdrops = object.getJSONArray("backdrops"); for (int i = 0; i < backdrops.length(); i++) { adapter.photoList.add(backdrops.getJSONObject(i).getString("file_path")); } onDownloadSuccessful(); } catch (Exception ex) { onDownloadFailed(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { onDownloadFailed(); } }); request.setTag(getClass().getName()); VolleySingleton.getInstance().requestQueue.add(request); } private void onDownloadSuccessful() { isLoading = false; if (adapter.photoList.size() == 0) { noResultsMessage.setText(R.string.photos_no_results); noResults.setVisibility(View.VISIBLE); errorMessage.setVisibility(View.GONE); progressCircle.setVisibility(View.GONE); photoList.setVisibility(View.GONE); } else { errorMessage.setVisibility(View.GONE); progressCircle.setVisibility(View.GONE); photoList.setVisibility(View.VISIBLE); adapter.notifyDataSetChanged(); } } private void onDownloadFailed() { isLoading = false; errorMessage.setVisibility(View.VISIBLE); progressCircle.setVisibility(View.GONE); photoList.setVisibility(View.GONE); } // Click events @OnClick(R.id.try_again) public void onTryAgainClicked() { photoList.setVisibility(View.GONE); errorMessage.setVisibility(View.GONE); progressCircle.setVisibility(View.VISIBLE); adapter = null; downloadPhotosList(); } @Override public void onPhotoClicked(int position) { String url = ApiHelper.getOriginalImageURL(adapter.photoList.get(position)); Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(browserIntent); } }