package com.amanse.anthony.fitcoinandroid; import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.JsonArrayRequest; import com.android.volley.toolbox.JsonObjectRequest; import com.android.volley.toolbox.Volley; import com.google.gson.Gson; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; import java.util.Arrays; /** * A simple {@link Fragment} subclass. */ public class LeaderboardsFragment extends Fragment { RequestQueue queue; Gson gson; String TAG = "FITNESS_LEADERBOARDS"; String BACKEND_URL = "https://anthony-blockchain.us-south.containers.mybluemix.net"; ArrayList<UserInfoModel> userInfoModels; RecyclerView recyclerView; TextView userStats, userPosition, status; Toast loadingToast; int numberOfUsersInStanding = 10; int totalNumberOfUsers = 0; LeaderboardAdapater adapter; public LeaderboardsFragment() { // Required empty public constructor } public static LeaderboardsFragment newInstance() { return new LeaderboardsFragment(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View rootView = inflater.inflate(R.layout.fragment_leaderboards, container,false); final ImageView userImage = rootView.findViewById(R.id.userImage); final TextView userName = rootView.findViewById(R.id.userName); userStats = rootView.findViewById(R.id.userStats); userPosition = rootView.findViewById(R.id.userPosition); status = rootView.findViewById(R.id.status); userName.setText("-"); userStats.setText("-"); userPosition.setText("-"); status.setText("-"); userInfoModels = new ArrayList<>(); loadingToast = Toast.makeText(rootView.getContext(),"Loading...",Toast.LENGTH_SHORT); LinearLayoutManager layoutManager = new LinearLayoutManager(rootView.getContext()); recyclerView = rootView.findViewById(R.id.leaderboardsList); DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(), layoutManager.getOrientation()); recyclerView.addItemDecoration(dividerItemDecoration); recyclerView.setHasFixedSize(true); recyclerView.setLayoutManager(layoutManager); recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (!recyclerView.canScrollVertically(1)) { if (totalNumberOfUsers != 0 && numberOfUsersInStanding < totalNumberOfUsers) { loadingToast.show(); numberOfUsersInStanding += 10; getLeaderboardTop(numberOfUsersInStanding); } } } }); adapter = new LeaderboardAdapater(rootView.getContext(), userInfoModels); recyclerView.setAdapter(adapter); gson = new Gson(); queue = Volley.newRequestQueue(rootView.getContext()); // initialize shared preferences - persistent data SharedPreferences sharedPreferences = ((AppCompatActivity) getActivity()).getSharedPreferences("shared_preferences_fitcoin", Context.MODE_PRIVATE); // get user info from shared prefrences if (sharedPreferences.contains("UserInfo")) { String userInfoJsonString = sharedPreferences.getString("UserInfo","error"); if (!userInfoJsonString.equals("error")) { UserInfoModel userInfoModel = gson.fromJson(userInfoJsonString,UserInfoModel.class); userImage.setImageBitmap(userInfoModel.getBitmap()); userName.setText(userInfoModel.getName()); } } // check for the userId if (sharedPreferences.contains("BlockchainUserId")) { String userId = sharedPreferences.getString("BlockchainUserId","error"); if (!userId.equals("error")) { getUserFromMongo(userId); } } getLeaderboardTop(numberOfUsersInStanding); return rootView; } public void getUserFromMongo(String userId) { JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, BACKEND_URL + "/registerees/info/" + userId , null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { UserInfoModel userInfoModel = gson.fromJson(response.toString(), UserInfoModel.class); userStats.setText(String.format("%s steps", String.valueOf(userInfoModel.getSteps()))); getUserPosition(String.valueOf(userInfoModel.getSteps())); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.d(TAG, "That didn't work!"); } }); queue.add(jsonObjectRequest); } public void getUserPosition(String steps) { JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, BACKEND_URL + "/leaderboard/position/steps/" + steps , null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { try { userPosition.setText(String.valueOf(response.getInt("userPosition"))); getStatus(response.getInt("userPosition")); } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.d(TAG, "That didn't work!"); } }); queue.add(jsonObjectRequest); } public void getLeaderboardTop(int number) { JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.GET, BACKEND_URL + "/leaderboard/top/" + String.valueOf(number) , null, new Response.Listener<JSONArray>() { @Override public void onResponse(JSONArray response) { UserInfoModel[] dataModels = gson.fromJson(response.toString(), UserInfoModel[].class); userInfoModels.clear(); userInfoModels.addAll(Arrays.asList(dataModels)); adapter.notifyDataSetChanged(); loadingToast.cancel(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.d(TAG, "That didn't work!"); } }); queue.add(jsonArrayRequest); } public void getStatus(final int position) { JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, BACKEND_URL + "/registerees/totalUsers" , null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { try { int totalUsers = response.getInt("count"); status.setText(String.format("You are position %d of %d", position, totalUsers)); totalNumberOfUsers = totalUsers; } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.d(TAG, "That didn't work!"); } }); queue.add(jsonObjectRequest); } }