Proyectos de Subversion Android Microlearning - Inconcert

Rev

Rev 14 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

package com.cesams.twogetskills.inconcert.fragment;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;

import androidx.cardview.widget.CardView;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Handler;
import android.text.Html;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.RatingBar;
import android.widget.TextView;
import android.widget.Toast;

import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.model.GlideUrl;
import com.bumptech.glide.load.model.LazyHeaders;
import com.bumptech.glide.request.RequestOptions;
import com.cesams.twogetskills.inconcert.Configuration;
import com.cesams.twogetskills.inconcert.Constants;
import com.cesams.twogetskills.inconcert.R;
import com.cesams.twogetskills.inconcert.activity.MainActivity;
import com.cesams.twogetskills.inconcert.adapter.CommentListViewAdapter;
import com.cesams.twogetskills.inconcert.dao.CapsuleDao;
import com.cesams.twogetskills.inconcert.dao.ProgressDao;
import com.cesams.twogetskills.inconcert.entity.Capsule;
import com.cesams.twogetskills.inconcert.entity.Progress;
import com.cesams.twogetskills.inconcert.library.Http;
import com.cesams.twogetskills.inconcert.library.MD5;
import com.cesams.twogetskills.inconcert.skeleton.IReloadData;
import com.cesams.twogetskills.inconcert.skeleton.ITwoGetSkills;
import com.google.android.material.tabs.TabLayout;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Random;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit;

import okhttp3.Call;
import okhttp3.FormBody;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;


public class CapsuleDetail extends Fragment implements CommentListViewAdapter.ClickListener {

    private ITwoGetSkills iTwoGetSkills;  Capsule capsula;  Progress progreso;
    TextView nombrecapsula, descripcion, puntuacion, comentarios, porcentaje,docomments;
    ImageView capsuleImage; ProgressBar mProgressbar;     private DecimalFormat mDecimalFormat; CardView tarjeta;
    TabLayout tabscapsule; RecyclerView listadecomentarios; EditText comentar; Button comentarBoton, continuar; RatingBar ratinglevel;
    CommentListViewAdapter adapter;     ArrayList<HashMap<String, String>> commentList;


    public CapsuleDetail() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_capsule_detail, container, false);

        iTwoGetSkills = (ITwoGetSkills) getActivity();
        ratinglevel = view.findViewById(R.id.ratingBar); continuar= view.findViewById(R.id.continuarbutton); tarjeta= view.findViewById(R.id.cardView3);
        capsuleImage = view.findViewById(R.id.imageView4); mProgressbar= view.findViewById(R.id.progressBar3);
        nombrecapsula = view.findViewById(R.id.textView19); descripcion = view.findViewById(R.id.textView20);
        comentarios = view.findViewById(R.id.textView21); puntuacion = view.findViewById(R.id.textView22);
        porcentaje = view.findViewById(R.id.textView17); mDecimalFormat = new DecimalFormat("#.##");
        tabscapsule = view.findViewById(R.id.tabLayout2); listadecomentarios = view.findViewById(R.id.recyclerView);
        comentar = view.findViewById(R.id.editTextComentar); comentarBoton = view.findViewById(R.id.button4); docomments=view.findViewById(R.id.textView23);

        commentList = new ArrayList<>();
        adapter = new CommentListViewAdapter(getContext(),commentList);

        GridLayoutManager layoutcomments = new GridLayoutManager(getContext(),1,GridLayoutManager.VERTICAL, false);
        listadecomentarios.setLayoutManager(layoutcomments);
        listadecomentarios.setAdapter(adapter);

        adapter.setClickListener(this);

        loaddata();


        comentar.setOnFocusChangeListener((v, hasFocus) -> {

            if(hasFocus){

                tarjeta.setVisibility(View.GONE);
            }
            else
            {
                tarjeta.setVisibility(View.VISIBLE);
                iTwoGetSkills.hideKeyboard(v);
            }
        });

        continuar.setOnClickListener(v -> iTwoGetSkills.invokeFragment(Constants.IDX_FRAGMENT_SLIDES));

        tabscapsule.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                int position = tab.getPosition();

                if (position == 0) {
                    descripcion.setVisibility(View.VISIBLE);
                    descripcion.setText(Html.fromHtml(capsula.getDescription(), Html.FROM_HTML_MODE_COMPACT));
                    listadecomentarios.setVisibility(View.GONE);
                    comentar.setVisibility(View.GONE);
                    comentarBoton.setVisibility(View.GONE);  ratinglevel.setVisibility(View.VISIBLE);
                    ratinglevel.setEnabled(false);
                    docomments.setVisibility(View.GONE);


                } else if (position == 1) {
                    descripcion.setVisibility(View.GONE);
                    listadecomentarios.setVisibility(View.VISIBLE);
                    comentar.setVisibility(View.GONE);
                    ratinglevel.setVisibility(View.GONE);
                    if(capsula.getTotal_comments()==0)
                    {
                        descripcion.setVisibility(View.VISIBLE);
                        descripcion.setText(R.string.no_comments);
                    }

                    comentarBoton.setVisibility(View.GONE);
                    docomments.setVisibility(View.GONE);

                    loadComments();

                } else if (position == 2) {
                    descripcion.setVisibility(View.GONE);
                    listadecomentarios.setVisibility(View.GONE);
                    comentar.setVisibility(View.VISIBLE);
                    comentarBoton.setVisibility(View.VISIBLE); ratinglevel.setVisibility(View.VISIBLE);
                    ratinglevel.setEnabled(true);
                    docomments.setVisibility(View.VISIBLE);

                }
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });

        comentarBoton.setOnClickListener(v -> {

            if(progreso != null) {
            if(progreso.getProgress() >0)
            {
                Toast.makeText(getActivity().getApplicationContext(), "Enviando tu comentario..", Toast.LENGTH_SHORT).show();

                String bodyComment = comentar.getText().toString();
                String rating = String.valueOf(ratinglevel.getRating());

               // Log.e("La added_on"," "+capsula.getAddedOn());
                //Enviamos el comentario de la capsula
                addComment(capsula.getUuid(),
                        bodyComment,rating, capsula.getAddedOn());
            }

            }
            else{
                Toast.makeText(getActivity().getApplicationContext(), "Toma tiempo para ver esta cápsula antes de comentar", Toast.LENGTH_SHORT).show();
            }
        });

        return view;
}

    private final Handler taskHandler = new android.os.Handler();

    private final Runnable repeatativeTaskRunnable = new Runnable() {
        public void run() {
                    loadComments();
                    Log.e("Ando","cargando comentarios");
        }
    };

    void startHandler() {
        taskHandler.postDelayed(repeatativeTaskRunnable, 5 * 1000);
    }

    void stopHandler() {
        taskHandler.removeCallbacks(repeatativeTaskRunnable);
    }

    public void loadComments(){

        commentList.clear();

        if(iTwoGetSkills.isConnectedInternet()) {
            try {
                TimeZone timeZone = TimeZone.getTimeZone("UTC");
                Calendar calendar = Calendar.getInstance(timeZone);
                int created = (int) (calendar.getTimeInMillis() / 1000);

                Random random = new Random(created);
                int rand = 1000 + random.nextInt(8999);

                String secret = MD5.generar(iTwoGetSkills.getPreference().getPassword() + ':' + created + ':' + rand);

                Http http = new Http(getActivity().getCacheDir(), iTwoGetSkills.getPreference().getDeviceUuid(), secret, created, rand);
                OkHttpClient client = http.getHttpClient(false);

                Request request = new Request.Builder()
                        .url(Configuration.URL_COMMENTS + capsula.getUuid())
                        .build();


                Call call = client.newCall(request);
                call.enqueue(new okhttp3.Callback() {
                    public void onResponse(Call call, Response response)
                            throws IOException {
                        Log.d("TAG", "Response :  " + response.body().toString());

                        processResponseSyncToServer(response.body().string());
                        stopHandler();
                    }

                    public void onFailure(Call call, IOException e) {
                        Log.d("Tag", "Error :  " + e.getMessage());
                        startHandler();
                    }
                });
            } catch (Exception e) {
                Log.e("Exception load"," comentarios"+e);
            }
        }
        else
        {
            descripcion.setVisibility(View.VISIBLE);
            descripcion.setText("No tienes conexión en este momento");
            startHandler();
        }


    }


    public void addComment(String capsuleUuid, String bodycomment, String rating, String added_on)
    {
        //Preparo el numero
        rating= rating.substring(0,1);

        if(iTwoGetSkills.isConnectedInternet()) {
            try {
                TimeZone timeZone = TimeZone.getTimeZone("UTC");
                Calendar calendar = Calendar.getInstance(timeZone);
                int created = (int) (calendar.getTimeInMillis() / 1000);

                Random random = new Random(created);
                int rand = 1000 + random.nextInt(8999);

                String secret = MD5.generar(iTwoGetSkills.getPreference().getPassword() + ':' + created + ':' + rand);

                Http http = new Http(getActivity().getCacheDir(), iTwoGetSkills.getPreference().getDeviceUuid(), secret, created, rand);
                OkHttpClient client = http.getHttpClient(false);

                RequestBody formBody = new FormBody.Builder()
                        .add("comment", bodycomment)
                        .add("rating", rating)
                        .add("added_on",added_on)
                        .build();

                Request request = new Request.Builder()
                        .url(Configuration.URL_COMMENTS + capsuleUuid + "/add")
                        .post(formBody)
                        .build();


                Call call = client.newCall(request);
                call.enqueue(new okhttp3.Callback() {
                    public void onResponse(Call call, Response response)
                            throws IOException {
                        Log.d("TAG", "Response :  " + response.body().toString());

                        processResponseSyncToServer(response.body().string());
                    }

                    public void onFailure(Call call, IOException e) {
                        Log.d("Tag", "Error :  " + e.getMessage());

                    }
                });
            } catch (Exception e) {
            }
        }else
        {
            Toast.makeText(getActivity().getApplicationContext(), "En este momento no tienes conexión para enviar el comentario", Toast.LENGTH_SHORT).show();
        }
    }


    private void processResponseSyncToServer(String dataString)
    {
        boolean success = false;
        long sync_id = 0;
        JSONArray comentariosarray;

        try {
            JSONObject objJSON = new JSONObject(dataString);
            success = objJSON.has("success") ? objJSON.getBoolean("success")  : false;
            if(success  && objJSON.has("data")) {
                JSONObject jsonObjectData = objJSON.getJSONObject("data");

                Log.e("Respuesta server:", jsonObjectData.toString());


                if(jsonObjectData.has("message"))
                {

                    if(jsonObjectData.getString("message").equals("El comentario ha sido borrado con éxito"))
                    {
                        requireActivity().runOnUiThread(() -> Toast.makeText(requireActivity().getApplicationContext(), "¡Comentario eliminado, cargando comentarios..!", Toast.LENGTH_SHORT).show());
                        loadComments();
                    }
                    else {
                        requireActivity().runOnUiThread(() -> Toast.makeText(requireActivity().getApplicationContext(), "¡Comentario enviado, cargando comentarios..!", Toast.LENGTH_SHORT).show());
                        requireActivity().runOnUiThread(this::loaddata);
                        requireActivity().runOnUiThread(() -> tabscapsule.selectTab(tabscapsule.getTabAt(1), true));
                        requireActivity().runOnUiThread(() -> comentar.setText(""));

                    }
                }

                if(jsonObjectData.has("comments"))
                {
                    //getActivity().runOnUiThread(() -> Toast.makeText(getActivity().getApplicationContext(), "Hay comentarios nuevos", Toast.LENGTH_SHORT).show());


                    comentariosarray = jsonObjectData.getJSONArray("comments");
                    Log.e("Comentarios",""+comentariosarray);

                    for(int i = 0; i < comentariosarray.length(); i++)
                    {
                        JSONObject objects = comentariosarray.getJSONObject(i);
                        HashMap<String, String> m_li;
                        m_li = new HashMap<>();
                        m_li.put("user", objects.getString("fullname"));
                        m_li.put("body", objects.getString("comment"));
                        m_li.put("fecha", objects.getString("date"));
                        m_li.put("rating", objects.getString("rating"));
                        m_li.put("image", objects.getString("image"));
                        m_li.put("urldelete", objects.getString("link_delete"));

                        commentList.add(m_li);


                    }

                    Log.e("Lista de comentarios"," "+commentList.toString());
                  getActivity().runOnUiThread(new Runnable() {
                      @Override
                      public void run() {
                          if(commentList.size() >0)
                          {
                              adapter.notifyDataSetChanged();
                              descripcion.setVisibility(View.GONE);
                          }
                      }
                  });

                }


                JSONObject capsule_update= jsonObjectData.getJSONObject("capsule");

                CapsuleDao updatecapsule = iTwoGetSkills.getDatabase().getCapsuleDao();
                updatecapsule.updateByUuid(capsula.getUuid(),capsule_update.getString("total_comments"),capsule_update.getString("total_rating"));


            }
            else
            {
                Log.e("Ocurrio un problema",objJSON.toString());
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onHiddenChanged(boolean hidden) {
        super.onHiddenChanged(hidden);

        if(!hidden) {

            requireActivity().runOnUiThread(() -> {

                loaddata();
                tabscapsule.selectTab(tabscapsule.getTabAt(0), true);


            });


        }
    }

    public void loaddata(){

    CapsuleDao capsuleDao = iTwoGetSkills.getDatabase().getCapsuleDao();
    ProgressDao progressDao = iTwoGetSkills.getDatabase().getProgressDao();

    progreso = progressDao.selectByCapsuleUuid(iTwoGetSkills.getCapsuleUuidActive());


    capsula = capsuleDao.selectByUuid(iTwoGetSkills.getCapsuleUuidActive());


    nombrecapsula.setText(capsula.getName()); descripcion.setText(Html.fromHtml(capsula.getDescription(), Html.FROM_HTML_MODE_COMPACT));
    comentarios.setText("Comentarios: "+capsula.getTotal_comments()); puntuacion.setText("Puntuación: "+capsula.getTotal_rating());
    ratinglevel.setMax(5); ratinglevel.setRating(capsula.getTotal_rating());
    ratinglevel.setEnabled(false);
    if(progreso != null) {
        mProgressbar.setMax(progreso.getTotalSlides());
        mProgressbar.setProgress(progreso.getViewSlides());
        porcentaje.setText(mDecimalFormat.format(progreso.getProgress()) + " %");
    }
    else
    {
        mProgressbar.setMax(100);
        mProgressbar.setProgress(0);
        porcentaje.setText("0%");
    }
    iTwoGetSkills.setTitleActionBar(capsula.getName());

    TimeZone timeZone = TimeZone.getTimeZone("UTC");
    Calendar calendar = Calendar.getInstance(timeZone);
    TimeZone tz = calendar.getTimeZone();
    int created =  (int) (calendar.getTimeInMillis() / 1000);

    Random random = new Random(created);
    int rand = 1000 + random.nextInt(8999);


    String deviceUuid = iTwoGetSkills.getPreference().getDeviceUuid();
    String password =  iTwoGetSkills.getPreference().getPassword();


    String secret = MD5.generar(password + ':' +  created + ':' + rand);

    GlideUrl url = new GlideUrl(capsula.getImage(), new LazyHeaders.Builder()
            .addHeader(Constants.HTTP_HEADER_ACCEPT, Constants.HTTP_HEADER_ACCEPT_VALUE)
            .addHeader(Constants.HTTP_HEADER_SECURITY_TOKEN, deviceUuid)
            .addHeader(Constants.HTTP_HEADER_SECURITY_SECRET, secret)
            .addHeader(Constants.HTTP_HEADER_SECURITY_CREATED, String.valueOf(created))
            .addHeader(Constants.HTTP_HEADER_SECURITY_RAND, String.valueOf(rand))
            .build());

    RequestOptions options = new RequestOptions()
            .diskCacheStrategy(DiskCacheStrategy.ALL);

    Glide.with(getContext()).load(url)
            .thumbnail()
            .apply(options)
            .into(capsuleImage);

}

    @Override
    public void onResume() {
        super.onResume();
        loaddata();
    }

    @Override
    public void onItemClick(int position, View v) {

        Log.e("On", "click");
        if (iTwoGetSkills.isConnectedInternet()) {

            AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity());
            alertDialogBuilder.setMessage("¿Deseas eliminar este comentario?");
            alertDialogBuilder.setPositiveButton("Si, eliminarlo",
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface arg0, int arg1) {

                            String urldelete = commentList.get(position).get("urldelete");
                            String user = commentList.get(position).get("user");

                            if (user.equals(iTwoGetSkills.getPreference().getFirstName() + " " + iTwoGetSkills.getPreference().getLastName())) {
                                try {
                                    TimeZone timeZone = TimeZone.getTimeZone("UTC");
                                    Calendar calendar = Calendar.getInstance(timeZone);
                                    int created = (int) (calendar.getTimeInMillis() / 1000);

                                    Random random = new Random(created);
                                    int rand = 1000 + random.nextInt(8999);

                                    String secret = MD5.generar(iTwoGetSkills.getPreference().getPassword() + ':' + created + ':' + rand);

                                    Http http = new Http(getActivity().getCacheDir(), iTwoGetSkills.getPreference().getDeviceUuid(), secret, created, rand);
                                    OkHttpClient client = http.getHttpClient(false);


                                    RequestBody formBody = new FormBody.Builder()
                                            .add("", "")
                                            .build();
                                    assert urldelete != null;
                                    Request request = new Request.Builder()
                                            .url(urldelete).post(formBody)
                                            .build();


                                    Call call = client.newCall(request);
                                    call.enqueue(new okhttp3.Callback() {
                                        public void onResponse(Call call, Response response)
                                                throws IOException {
                                            Log.d("TAG", "Response :  " + response.body().toString());

                                            processResponseSyncToServer(response.body().string());
                                        }

                                        public void onFailure(Call call, IOException e) {
                                            Log.d("Tag", "Error :  " + e.getMessage());
                                        }
                                    });
                                } catch (Exception e) {
                                }
                            } else {
                                Log.e("No es mi ", " comentario");
                            }


                        }
                    });


            alertDialogBuilder.setNegativeButton("No", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {

                }
            });
            AlertDialog alertDialog = alertDialogBuilder.create();
            alertDialog.show();
            alertDialog.getButton(alertDialog.BUTTON_POSITIVE).setTextColor(getResources().getColor(R.color.design_default_color_error, null));
            alertDialog.getButton(alertDialog.BUTTON_NEGATIVE).setTextColor(getResources().getColor(R.color.colorTextColor, null));

            alertDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
                @Override
                public void onDismiss(DialogInterface dialogInterface) {


                }
            });

        }
        else
        {
            Toast.makeText(requireActivity().getApplicationContext(), "No tienes conexión en este momento para ver los detalles.", Toast.LENGTH_SHORT).show();
        }
    }
}