package livefyre.activities; import android.annotation.TargetApi; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.app.ActionBar; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; import android.widget.AdapterView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.Spinner; import android.widget.TextView; import com.daimajia.androidanimations.library.Techniques; import com.daimajia.androidanimations.library.YoYo; import com.livefyre.streamhub_android_sdk.network.AdminClient; import com.livefyre.streamhub_android_sdk.network.BootstrapClient; import com.livefyre.streamhub_android_sdk.network.StreamClient; import com.loopj.android.http.AsyncHttpResponseHandler; import com.loopj.android.http.JsonHttpResponseHandler; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.List; import cz.msebera.android.httpclient.Header; import livefyre.BaseActivity; import livefyre.LFSAppConstants; import livefyre.LFSConfig; import livefyre.R; import livefyre.adapters.ReviewListAdapter; import livefyre.adapters.SpinnerAdapter; import livefyre.listeners.ContentUpdateListener; import livefyre.models.Content; import livefyre.models.ContentTypeEnum; import livefyre.parsers.ContentParser; public class ReviewsActivity extends BaseActivity implements ContentUpdateListener { private class ParseContent extends AsyncTask<JSONObject, String, String> { @Override protected String doInBackground(JSONObject... jsonObjects) { try { content = new ContentParser(jsonObjects[0], getBaseContext()); content.getContentFromResponse(ReviewsActivity.this); reviewCollectiontoBuild = content.getReviews(); } catch (JSONException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); reviewListAdapter = new ReviewListAdapter(ReviewsActivity.this, reviewCollectiontoBuild); reviewsRV.setAdapter(reviewListAdapter); streamClintCall(); isReviewPosted(); swipeView.setEnabled(true); dismissProgressDialog(); } } public static final String TAG = ReviewsActivity.class.getSimpleName(); ImageView postNewReviewIv; RecyclerView reviewsRV; List<Content> reviewCollectiontoBuild; ReviewListAdapter reviewListAdapter; public String ownReviewId; public String adminClintId = "No"; ContentParser content; private Toolbar toolbar; Spinner activityTitleSpinner; private String selectedCategory; private SwipeRefreshLayout swipeView; LinearLayout notification; TextView notifMsgTV, activityTitle, actionTv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_reviews); pullViews(); setListenersToViews(); buildToolBar(); adminClintCall(); } @Override protected void onResume() { super.onResume(); if (ContentParser.ContentMap != null) if (!ContentParser.ContentMap.isEmpty()) { sortReviews(LFSAppConstants.MOVE_TO_VIEW_POINT); isReviewPosted(); streamClintCall(); } } @Override protected void onDestroy() { super.onDestroy(); StreamClient.stop(); } void sortReviews(Boolean viewpoint) { if (!isNetworkAvailable()) { showToast("Network Not Available"); return; } else dismissProgressDialog(); char sortCase = activityTitleSpinner.getPrompt().toString().charAt(0); reviewCollectiontoBuild = new ArrayList<Content>(); HashMap<String, Content> mainContent = ContentParser.ContentMap; if (mainContent != null) for (Content t : mainContent.values()) { if (t.getContentType() == ContentTypeEnum.PARENT && t.getVisibility().equals("1")) { reviewCollectiontoBuild.add(t); } } switch (sortCase) { case 'N': Collections.sort(reviewCollectiontoBuild, new Comparator<Content>() { @Override public int compare(Content p2, Content p1) { return Integer.parseInt(p1.getCreatedAt()) - Integer.parseInt(p2.getCreatedAt()); } }); break; case 'O': Collections.sort(reviewCollectiontoBuild, new Comparator<Content>() { @Override public int compare(Content p1, Content p2) { return Integer.parseInt(p1.getCreatedAt()) - Integer.parseInt(p2.getCreatedAt()); } }); break; case 'H': Collections.sort(reviewCollectiontoBuild, new Comparator<Content>() { @Override public int compare(Content p2, Content p1) { return Integer.parseInt(p1.getRating()) - Integer.parseInt(p2.getRating()); } }); break; case 'L': Collections.sort(reviewCollectiontoBuild, new Comparator<Content>() { @Override public int compare(Content p1, Content p2) { return Integer.parseInt(p1.getRating()) - Integer.parseInt(p2.getRating()); } }); break; case 'M': Collections.sort(reviewCollectiontoBuild, new Comparator<Content>() { @Override public int compare(Content p1, Content p2) { int t1 = 0, t2 = 0; if (p1.getVote() != null) { t1 = p1.getVote().size(); } if (p2.getVote() != null) { t2 = p2.getVote().size(); } return t1 - t2; } }); Collections.sort(reviewCollectiontoBuild, new Comparator<Content>() { @Override public int compare(Content p2, Content p1) { int t1 = 0, t2 = 0; if (p1.getVote() != null) { t1 = p1.getHelpfulcount(); } if (p2.getVote() != null) { t2 = p2.getHelpfulcount(); } return t1 - t2; } }); break; default: break; } // Move Own Review To Top. if (reviewCollectiontoBuild != null && !adminClintId.equals("NO")) { for (int i = 0; i < reviewCollectiontoBuild.size(); i++) { if (reviewCollectiontoBuild.get(i).getAuthorId() .equals(adminClintId)) { Content temp = reviewCollectiontoBuild.get(i); reviewCollectiontoBuild.remove(temp); reviewCollectiontoBuild.add(0, temp); break; } } } // Hide Notification notification.setVisibility(View.GONE); reviewListAdapter = null; reviewListAdapter = (ReviewListAdapter) reviewsRV.getAdapter(); if (reviewListAdapter != null) { reviewListAdapter.updateContentResult(reviewCollectiontoBuild); } else { reviewListAdapter = new ReviewListAdapter(getApplicationContext(), reviewCollectiontoBuild); } reviewListAdapter.notifyDataSetChanged(); reviewsRV.setAdapter(reviewListAdapter); if (viewpoint) reviewsRV.scrollToPosition(0); } void isReviewPosted() { Boolean isGiven = false; if (reviewCollectiontoBuild != null) for (int i = 0; i < reviewCollectiontoBuild.size(); i++) { if (reviewCollectiontoBuild.get(i).getAuthorId() .equals(adminClintId)) { isGiven = true; ownReviewId = reviewCollectiontoBuild.get(i).getId(); } } if (isGiven) { postNewReviewIv.setVisibility(View.GONE); actionTv.setText("MY REVIEW"); actionTv.setVisibility(View.VISIBLE); } else { postNewReviewIv.setVisibility(View.VISIBLE); actionTv.setVisibility(View.GONE); } } View.OnClickListener myReviewListener = new View.OnClickListener() { public void onClick(View v) { Intent detailViewIntent = new Intent(ReviewsActivity.this, ReviewInDetailActivity.class); detailViewIntent.putExtra("id", ownReviewId); startActivity(detailViewIntent); } }; private void adminClintCall() { if (!isNetworkAvailable()) { showAlert("No connection available", "TRY AGAIN", tryAgain); return; } else { showProgressDialog(); } try { AdminClient.authenticateUser(LFSConfig.USER_TOKEN, LFSConfig.COLLECTION_ID, LFSConfig.ARTICLE_ID, LFSConfig.SITE_ID, new AdminCallback()); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } void bootstrapClientCall() { try { BootstrapClient.getInit(LFSConfig.SITE_ID, LFSConfig.ARTICLE_ID, new InitCallback()); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } private class InitCallback extends JsonHttpResponseHandler { @Override public void onSuccess(int statusCode, Header[] headers, JSONObject response) { super.onSuccess(statusCode, headers, response); swipeView.setRefreshing(false); application.printLog(false, TAG + "-InitCallback-onSuccess", response.toString()); (new ParseContent()).execute(response); } public void onSuccess(int statusCode, Header[] headers, String responseString) { super.onSuccess(statusCode, headers, responseString); swipeView.setRefreshing(false); application.printLog(false, TAG + "-InitCallback-onSuccess", responseString.toString()); try { (new ParseContent()).execute(new JSONObject(responseString)); } catch (JSONException e) { e.printStackTrace(); } } @Override public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) { super.onFailure(statusCode, headers, throwable, errorResponse); swipeView.setRefreshing(false); application.printLog(true, TAG + "-InitCallback-onFailure", throwable.toString()); } @Override public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONArray errorResponse) { super.onFailure(statusCode, headers, throwable, errorResponse); swipeView.setRefreshing(false); application.printLog(true, TAG + "-InitCallback-onFailure", throwable.toString()); } @Override public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) { super.onFailure(statusCode, headers, responseString, throwable); swipeView.setRefreshing(false); application.printLog(true, TAG + "-InitCallback-onFailure", throwable.toString()); } } void streamClintCall() { try { StreamClient.pollStreamEndpoint( LFSConfig.COLLECTION_ID, ContentParser.lastEvent, new StreamCallBack()); } catch (IOException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } } public class StreamCallBack extends AsyncHttpResponseHandler { @Override public void onSuccess(int i, Header[] headers, byte[] bytes) { String response = new String(bytes); content.setStreamData(response); } @Override public void onFailure(int i, Header[] headers, byte[] bytes, Throwable throwable) { Log.e(TAG, "StreamCallBack-onFailure: " + throwable.getLocalizedMessage()); } } public class AdminCallback extends JsonHttpResponseHandler { @Override public void onSuccess(int statusCode, Header[] headers, JSONObject response) { super.onSuccess(statusCode, headers, response); JSONObject data; try { data = response.getJSONObject("data"); if (!data.isNull("permissions")) { JSONObject permissions = data.getJSONObject("permissions"); if (!permissions.isNull("moderator_key")) application.saveDataInSharedPreferences( LFSAppConstants.ISMOD, "yes"); else { application.saveDataInSharedPreferences( LFSAppConstants.ISMOD, "no"); } } else { application.saveDataInSharedPreferences( LFSAppConstants.ISMOD, "no"); } if (!data.isNull("profile")) { JSONObject profile = data.getJSONObject("profile"); if (!profile.isNull("id")) { application.saveDataInSharedPreferences( LFSAppConstants.ID, profile.getString("id")); adminClintId = profile.getString("id"); } } } catch (JSONException e1) { e1.printStackTrace(); } bootstrapClientCall(); } @Override public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) { super.onFailure(statusCode, headers, throwable, errorResponse); application.printLog(true, TAG + "-AdminCallback-onFailure", throwable.toString()); bootstrapClientCall(); } @Override public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONArray errorResponse) { super.onFailure(statusCode, headers, throwable, errorResponse); application.printLog(true, TAG + "-AdminCallback-onFailure", throwable.toString()); bootstrapClientCall(); } @Override public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) { super.onFailure(statusCode, headers, responseString, throwable); application.printLog(true, TAG + "-AdminCallback-onFailure", throwable.toString()); bootstrapClientCall(); } } @TargetApi(Build.VERSION_CODES.JELLY_BEAN) private void buildToolBar() { toolbar = (Toolbar) findViewById(R.id.app_bar); setSupportActionBar(toolbar); //disable title on toolbar getSupportActionBar().setDisplayShowTitleEnabled(false); ImageView homeIcon = (ImageView) findViewById(R.id.activityIcon); homeIcon.setBackgroundResource(R.mipmap.livefyreflame); final ActionBar actionBar = getSupportActionBar(); actionBar.setDisplayShowTitleEnabled(false); Spinner mSpinner = (Spinner) findViewById(R.id.activityTitleSpinner); String[] items = getResources().getStringArray(R.array.helpful_categories); mSpinner.setVisibility(View.VISIBLE); activityTitle.setVisibility(View.GONE); List<String> spinnerItems = new ArrayList<String>(); for (int i = 0; i < items.length; i++) { spinnerItems.add(items[i]); } SpinnerAdapter adapter = new SpinnerAdapter(actionBar.getThemedContext(), spinnerItems); mSpinner.setAdapter(adapter); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { mSpinner.setDropDownVerticalOffset(-116); } } private void setListenersToViews() { postNewReviewIv.setOnClickListener(postNewReviewsListener); reviewsRV.setOnScrollListener(onScrollListener); activityTitle.setOnClickListener(activityTitleListenerHide); activityTitleSpinner.setOnItemSelectedListener(activityTitleSpinnerListener); actionTv.setOnClickListener(myReviewListener); swipeView.setColorSchemeColors(getResources().getColor(R.color.colorPrimary)); swipeView.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { swipeView.setRefreshing(true); reviewListAdapter = null; reviewCollectiontoBuild.clear(); reviewListAdapter = new ReviewListAdapter(getApplication(), reviewCollectiontoBuild); reviewsRV.setAdapter(reviewListAdapter); bootstrapClientCall(); YoYo.with(Techniques.FadeIn) .duration(700) .playOn(findViewById(R.id.reviewsRV)); } }); reviewsRV.setOnScrollListener(onScrollListener); notification.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { activityTitleSpinner.setPrompt("Newest"); sortReviews(LFSAppConstants.MOVE_TO_TOP); YoYo.with(Techniques.BounceInUp) .duration(700) .playOn(findViewById(R.id.notification)); notification.setVisibility(View.GONE); reviewsRV.smoothScrollToPosition(0); } }); reviewsRV.addOnItemTouchListener(new RecyclerTouchListener(getApplicationContext(), reviewsRV, new ClickListener() { @Override public void onClick(View view, int position) { Intent detailViewIntent = new Intent(ReviewsActivity.this, ReviewInDetailActivity.class); detailViewIntent.putExtra(LFSAppConstants.ID, reviewCollectiontoBuild.get(position).getId()); startActivity(detailViewIntent); } @Override public void onLongClick(View view, int position) { } })); } AdapterView.OnItemSelectedListener activityTitleSpinnerListener = new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { String[] helpfulCategories = getResources().getStringArray(R.array.helpful_categories); selectedCategory = helpfulCategories[position]; if (selectedCategory.equals("Most Helpful")) { activityTitleSpinner.setPrompt("Most Helpful"); sortReviews(LFSAppConstants.MOVE_TO_TOP); } if (selectedCategory.equals("Highest Rating")) { activityTitleSpinner.setPrompt("Highest Rating"); sortReviews(LFSAppConstants.MOVE_TO_TOP); } if (selectedCategory.equals("Lowest Rating")) { activityTitleSpinner.setPrompt("Lowest Rating"); sortReviews(LFSAppConstants.MOVE_TO_TOP); } if (selectedCategory.equals("Newest")) { activityTitleSpinner.setPrompt("Newest"); sortReviews(LFSAppConstants.MOVE_TO_TOP); } if (selectedCategory.equals("Oldest")) { activityTitleSpinner.setPrompt("Oldest"); sortReviews(LFSAppConstants.MOVE_TO_TOP); } } public void onNothingSelected(AdapterView<?> parentView) { } }; public RecyclerView.OnScrollListener onScrollListener = new RecyclerView.OnScrollListener() { boolean hideToolBar = false; @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (hideToolBar) { getSupportActionBar().hide(); } else { getSupportActionBar().show(); } } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); if (dy > 2) { hideToolBar = true; } else if (dy < -1) { hideToolBar = false; } } }; View.OnClickListener activityTitleListenerShow = new View.OnClickListener() { @Override public void onClick(View v) { activityTitle.setOnClickListener(activityTitleListenerHide); } }; View.OnClickListener activityTitleListenerHide = new View.OnClickListener() { @Override public void onClick(View v) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { activityTitle.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { activityTitle.setSystemUiVisibility(View.STATUS_BAR_HIDDEN); } activityTitle.setOnClickListener(activityTitleListenerShow); } }; View.OnClickListener postNewReviewsListener = new View.OnClickListener() { public void onClick(View v) { Intent newPostIntent = new Intent(ReviewsActivity.this, NewReviewActivity.class); startActivity(newPostIntent); } }; static class RecyclerTouchListener implements RecyclerView.OnItemTouchListener { private GestureDetector gestureDetector; private ClickListener clickListener; public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final ClickListener clickListener) { this.clickListener = clickListener; gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent e) { return true; } @Override public void onLongPress(MotionEvent e) { View child = recyclerView.findChildViewUnder(e.getX(), e.getY()); if (child != null && clickListener != null) { clickListener.onLongClick(child, recyclerView.getChildPosition(child)); } } }); } @Override public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { View child = rv.findChildViewUnder(e.getX(), e.getY()); if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) { clickListener.onClick(child, rv.getChildPosition(child)); } return false; } @Override public void onTouchEvent(RecyclerView rv, MotionEvent e) { } @Override public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } } public static interface ClickListener { public void onClick(View view, int position); public void onLongClick(View view, int position); } DialogInterface.OnClickListener tryAgain = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface arg0, int arg1) { adminClintCall(); } }; private void pullViews() { reviewsRV = (RecyclerView) findViewById(R.id.reviewsRV); reviewsRV.setLayoutManager(new LinearLayoutManager(getApplicationContext())); postNewReviewIv = (ImageView) findViewById(R.id.postNewReviewIv); activityTitle = (TextView) findViewById(R.id.activityTitle); activityTitleSpinner = (Spinner) findViewById(R.id.activityTitleSpinner); actionTv = (TextView) findViewById(R.id.actionTv); notification = (LinearLayout) findViewById(R.id.notification); notifMsgTV = (TextView) findViewById(R.id.notifMsgTV); swipeView = (SwipeRefreshLayout) findViewById(R.id.swipe); } @Override public void onDataUpdate(HashSet<String> updates) { for (int i = 0; i < reviewCollectiontoBuild.size(); i++) { Content mContentBean = reviewCollectiontoBuild.get(i); if (mContentBean.getContentType() == ContentTypeEnum.DELETED) { reviewCollectiontoBuild.remove(mContentBean); } } HashMap<String, Content> mainContent = ContentParser.ContentMap; String authorId = application.getDataFromSharedPreferences(LFSAppConstants.ID); for (Content mContentBean : mainContent.values()) { if (mContentBean.getContentType() == ContentTypeEnum.PARENT) { if (mContentBean.getAuthorId().equals(authorId)) { Boolean flag = true; for (Content t : reviewCollectiontoBuild) { if (t.getAuthorId().equals(authorId)) { flag = false; } } if (flag) reviewCollectiontoBuild.add(0, mContentBean); break; } } } reviewListAdapter.notifyDataSetChanged(); ReviewInDetailActivity.notifyDatainDetail(); int oldCount = 0; if (reviewCollectiontoBuild != null) oldCount = reviewCollectiontoBuild.size(); List<Content> newList = new ArrayList(); for (Content t : mainContent.values()) { if (t.getContentType() == ContentTypeEnum.PARENT && t.getVisibility().equals("1")) { newList.add(t); } } if (newList.size() > 0) { if (newList.size() - oldCount > 0) { if ((newList.size() - oldCount) == 1) notifMsgTV.setText("" + (newList.size() - oldCount) + " New Review "); else { notifMsgTV.setText("" + (newList.size() - oldCount) + " New Reviews "); } notification.setVisibility(View.VISIBLE); YoYo.with(Techniques.DropOut) .duration(700) .playOn(findViewById(R.id.notification)); } else { notification.setVisibility(View.GONE); } } isReviewPosted(); } }