From a3104d7c98a48da7b43b00ec880278efeac8ab5c Mon Sep 17 00:00:00 2001 From: JHM69 Date: Fri, 10 May 2024 08:30:49 -0700 Subject: [PATCH] app structure updated, posting into forum working --- android-app/app/src/main/AndroidManifest.xml | 7 +- .../app/src/main/assets/video_loading_bg.svg | 2 +- .../adapters/CommentsAdapter.java | 2 +- .../adapters/FriendRequestAdapter.java | 6 +- .../adapters/IssueViewHolder.java | 698 ++++++++++++++++++ .../adapters/NotificationsAdapter.java | 4 +- .../dncc_eco_sync/adapters/PlayerAdapter.java | 2 +- .../adapters/PostViewHolder.java | 7 +- .../dncc_eco_sync/adapters/ResultAdapter.java | 2 +- .../dncc_eco_sync/adapters/UsersAdapter.java | 6 +- .../searchFriends/SearchFriendAdapter.java | 2 +- .../viewFriends/ViewFriendAdapter.java | 10 +- .../messege/Adapter/UserAdapter.java | 6 +- .../messege/activity/MessageActivity.java | 6 +- .../dncc_eco_sync/models/Issue.java | 71 ++ .../dncc_eco_sync/models/Users.java | 83 ++- .../MyFireBaseMessagingService.java | 12 +- .../dncc_eco_sync/service/UploadService.java | 6 +- .../ui/activities/MainActivity.java | 81 +- .../dncc_eco_sync/ui/activities/MapView.java | 4 +- .../ui/activities/account/EditProfile.java | 2 +- .../ui/activities/account/LoginActivity.java | 10 +- .../activities/account/RegisterActivity.java | 84 +-- .../ui/activities/friends/FriendProfile.java | 4 +- .../notification/ImagePreviewSave.java | 4 +- .../ui/activities/post/CommentsActivity.java | 10 +- .../ui/activities/post/WhoLikedActivity.java | 2 +- .../ui/activities/quiz/PlayQuiz.java | 2 +- .../ui/activities/quiz/QuizBattle.java | 6 +- .../ui/activities/quiz/Ranking.java | 2 +- .../ui/activities/quiz/ResultActivity.java | 4 +- .../dncc_eco_sync/ui/fragment/Dashboard.java | 13 +- .../dncc_eco_sync/ui/fragment/Home.java | 2 +- .../dncc_eco_sync/ui/fragment/Issue.java | 226 ++++++ .../dncc_eco_sync/ui/fragment/PostMenu.java | 2 +- .../ui/fragment/ProfileFragment.java | 2 +- .../dncc_eco_sync/ui/fragment/Quiz.java | 2 +- .../ui/fragment/SavedFragment.java | 2 +- .../dncc_eco_sync/utils/NotificationUtil.java | 2 +- .../app/src/main/res/drawable/head.png | Bin 0 -> 216493 bytes .../drawable/ic_location_on_black_24dp.xml | 2 +- .../main/res/layout/activity_edit_profile.xml | 2 +- .../layout/activity_image_preview_save.xml | 2 +- .../src/main/res/layout/activity_login.xml | 2 +- .../main/res/layout/activity_main_drawer.xml | 2 +- .../app/src/main/res/layout/activity_map.xml | 9 +- .../src/main/res/layout/activity_message.xml | 2 +- .../res/layout/activity_notifications.xml | 2 +- .../res/layout/activity_post_comments.xml | 2 +- .../main/res/layout/activity_quiz_battle.xml | 2 +- .../src/main/res/layout/activity_register.xml | 2 +- .../src/main/res/layout/activity_result.xml | 2 +- .../src/main/res/layout/activity_splash.xml | 27 +- .../src/main/res/layout/frag_friend_req.xml | 2 +- .../app/src/main/res/layout/frag_home.xml | 2 +- .../app/src/main/res/layout/frag_issue.xml | 1 + .../src/main/res/layout/frag_view_friends.xml | 2 +- .../src/main/res/layout/fragmengt_about.xml | 2 +- .../app/src/main/res/layout/fragment_quiz.xml | 4 +- .../app/src/main/res/layout/item_comment.xml | 2 +- .../src/main/res/layout/item_feed_post.xml | 2 +- .../app/src/main/res/layout/item_friend.xml | 2 +- .../src/main/res/layout/item_friend_added.xml | 2 +- .../src/main/res/layout/item_friend_req.xml | 2 +- .../app/src/main/res/layout/item_issue.xml | 213 ++++++ .../src/main/res/layout/item_notification.xml | 2 +- .../src/main/res/layout/item_quiz_profile.xml | 2 +- .../app/src/main/res/layout/item_result.xml | 2 +- .../app/src/main/res/layout/item_user.xml | 2 +- .../src/main/res/layout/item_user_liked.xml | 2 +- .../app/src/main/res/layout/ranking.xml | 2 +- .../main/res/layout/send_message_fragment.xml | 4 +- .../app/src/main/res/values/arrays.xml | 83 ++- .../app/src/main/res/values/colors.xml | 10 +- .../app/src/main/res/values/strings.xml | 10 +- android-app/app/src/main/res/values/theme.xml | 2 +- ...ity_splash_xml_constraintlayout5_scene.xml | 2 +- 77 files changed, 1560 insertions(+), 255 deletions(-) create mode 100644 android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/IssueViewHolder.java create mode 100644 android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/models/Issue.java create mode 100644 android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/fragment/Issue.java create mode 100644 android-app/app/src/main/res/drawable/head.png create mode 100644 android-app/app/src/main/res/layout/frag_issue.xml create mode 100644 android-app/app/src/main/res/layout/item_issue.xml diff --git a/android-app/app/src/main/AndroidManifest.xml b/android-app/app/src/main/AndroidManifest.xml index 8f16884..d9afe3d 100644 --- a/android-app/app/src/main/AndroidManifest.xml +++ b/android-app/app/src/main/AndroidManifest.xml @@ -18,11 +18,11 @@ + @@ -102,7 +103,7 @@ + android:resource="@drawable/logo_round" /> diff --git a/android-app/app/src/main/assets/video_loading_bg.svg b/android-app/app/src/main/assets/video_loading_bg.svg index f12ea60..7a03fd5 100644 --- a/android-app/app/src/main/assets/video_loading_bg.svg +++ b/android-app/app/src/main/assets/video_loading_bg.svg @@ -61,7 +61,7 @@ - + diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/CommentsAdapter.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/CommentsAdapter.java index 8057b14..1db4e1a 100644 --- a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/CommentsAdapter.java +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/CommentsAdapter.java @@ -1 +1 @@ -package com.quantum_guys.dncc_eco_sync.adapters; import android.annotation.SuppressLint; import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import com.afollestad.materialdialogs.MaterialDialog; import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; import com.github.marlonlom.utilities.timeago.TimeAgo; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; import com.google.firebase.firestore.FirebaseFirestore; import com.quantum_guys.dncc_eco_sync.R; import com.quantum_guys.dncc_eco_sync.models.Comment; import com.quantum_guys.dncc_eco_sync.ui.activities.friends.FriendProfile; import com.quantum_guys.dncc_eco_sync.utils.MathView; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import de.hdodenhof.circleimageview.CircleImageView; import es.dmoral.toasty.Toasty; public class CommentsAdapter extends RecyclerView.Adapter { private final List commentList; private final Context context; private final boolean isOwner; int lastPosition = -1; private FirebaseFirestore mFirestore; private FirebaseUser mCurrentUser; int comment_count; public CommentsAdapter(List commentList, Context context, boolean owner, int comment_count) { this.commentList = commentList; this.context = context; this.isOwner = owner; this.comment_count = comment_count; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { mFirestore = FirebaseFirestore.getInstance(); mCurrentUser = FirebaseAuth.getInstance().getCurrentUser(); View view = LayoutInflater.from(context).inflate(R.layout.item_comment, parent, false); return new ViewHolder(view); } @Override public long getItemId(int position) { return position; } @Override public int getItemViewType(int position) { return position; } @Override public void onBindViewHolder(@NonNull final ViewHolder holder, @SuppressLint("RecyclerView") int position) { Animation animation = AnimationUtils.loadAnimation(context, (position > lastPosition) ? R.anim.up_from_bottom : R.anim.down_from_top); holder.itemView.startAnimation(animation); lastPosition = position; if (isOwner) { enableDeletion(holder, position); } else { if (commentList.get(position).getId().equals(mCurrentUser.getUid())) { enableDeletion(holder, position); } } holder.username.setText(commentList.get(position).getUsername()); holder.username.setOnClickListener(v -> context.startActivity(new Intent(context, FriendProfile.class).putExtra("f_id", commentList.get(holder.getAdapterPosition()).getId()))); holder.image.setOnClickListener(v -> context.startActivity(new Intent(context, FriendProfile.class).putExtra("f_id", commentList.get(holder.getAdapterPosition()).getId()))); Glide.with(context) .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_logo)) .load(commentList.get(position).getImage()) .into(holder.image); holder.comment.setDisplayText(commentList.get(position).getComment()); String timeAgo = TimeAgo.using(Long.parseLong(commentList.get(position).getTimestamp())); holder.timestamp.setText(timeAgo); try { mFirestore.collection("Users") .document(commentList.get(position).getId()) .get() .addOnSuccessListener(documentSnapshot -> { try { if (!Objects.equals(documentSnapshot.getString("username"), commentList.get(holder.getAdapterPosition()).getUsername()) && !Objects.equals(documentSnapshot.getString("image"), commentList.get(holder.getAdapterPosition()).getImage())) { Map commentMap = new HashMap<>(); commentMap.put("username", documentSnapshot.getString("username")); commentMap.put("image", documentSnapshot.getString("image")); mFirestore.collection("Posts") .document(commentList.get(holder.getAdapterPosition()).getPost_id()) .collection("Comments") .document(commentList.get(holder.getAdapterPosition()).getCommentId()) .update(commentMap) .addOnSuccessListener(aVoid -> Log.i("comment_update", "success")) .addOnFailureListener(e -> Log.i("comment_update", "failure")); holder.username.setText(documentSnapshot.getString("username")); Glide.with(context) .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_logo)) .load(documentSnapshot.getString("image")) .into(holder.image); } else if (!Objects.equals(documentSnapshot.getString("username"), commentList.get(holder.getAdapterPosition()).getUsername())) { Map commentMap = new HashMap<>(); commentMap.put("username", documentSnapshot.getString("username")); mFirestore.collection("Posts") .document(commentList.get(holder.getAdapterPosition()).getPost_id()) .collection("Comments") .document(commentList.get(holder.getAdapterPosition()).getCommentId()) .update(commentMap) .addOnSuccessListener(aVoid -> Log.i("comment_update", "success")) .addOnFailureListener(e -> Log.i("comment_update", "failure")); holder.username.setText(documentSnapshot.getString("username")); } else if (!Objects.equals(documentSnapshot.getString("image"), commentList.get(holder.getAdapterPosition()).getImage())) { Map commentMap = new HashMap<>(); commentMap.put("image", documentSnapshot.getString("image")); mFirestore.collection("Posts") .document(commentList.get(holder.getAdapterPosition()).getPost_id()) .collection("Comments") .document(commentList.get(holder.getAdapterPosition()).getCommentId()) .update(commentMap) .addOnSuccessListener(aVoid -> Log.i("comment_update", "success")) .addOnFailureListener(e -> Log.i("comment_update", "failure")); Glide.with(context) .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_logo)) .load(documentSnapshot.getString("image")) .into(holder.image); } } catch (Exception e) { e.printStackTrace(); } }) .addOnFailureListener(e -> Log.e("Error", e.getMessage())); } catch (Exception ex) { Log.w("error", "fastscrolled", ex); } } @SuppressLint("NotifyDataSetChanged") private void enableDeletion(final ViewHolder holder, int pos) { holder.delete.setVisibility(View.VISIBLE); holder.delete.setAlpha(0.0f); holder.delete.animate() .alpha(1.0f) .start(); holder.delete.setOnClickListener(v -> new MaterialDialog.Builder(context) .title("Delete comment") .content("Are you sure do you want to delete your comment?") .positiveText("Yes") .negativeText("No") .onPositive((dialog, which) -> { dialog.dismiss(); final ProgressDialog progressDialog = new ProgressDialog(context); progressDialog.setMessage("Deleting comment..."); progressDialog.setIndeterminate(true); progressDialog.show(); String postId = commentList.get(holder.getAdapterPosition()).getPost_id(); mFirestore.collection("Posts") .document(postId) .collection("Comments") .document(commentList.get(holder.getAdapterPosition()).getCommentId()) .delete() .addOnSuccessListener(aVoid -> { commentList.remove(holder.getAdapterPosition()); deleteCount(postId); Toasty.success(context, "Comment deleted", Toasty.LENGTH_SHORT, true).show(); notifyDataSetChanged(); progressDialog.dismiss(); }) .addOnFailureListener(e -> { progressDialog.dismiss(); Toasty.error(context, "Error deleting comment: " + e.getLocalizedMessage(), Toasty.LENGTH_SHORT, true).show(); Log.w("Error", "delete comment", e); }); }) .onNegative((dialog, which) -> dialog.dismiss()) .show()); } private void deleteCount( String postId) { try { comment_count = comment_count-1; HashMap scoreMap = new HashMap<>(); scoreMap.put("comment_count", comment_count); mFirestore.collection("Posts") .document(postId) .update(scoreMap).addOnSuccessListener(aVoid -> { }); } catch (Exception ignored) { } } @Override public int getItemCount() { return commentList.size(); } public static class ViewHolder extends RecyclerView.ViewHolder { private final CircleImageView image; private final TextView username; private final TextView timestamp; private final ImageView delete; final MathView comment; public ViewHolder(View itemView) { super(itemView); image = itemView.findViewById(R.id.comment_user_image); username = itemView.findViewById(R.id.comment_username); comment = itemView.findViewById(R.id.comment_text); timestamp = itemView.findViewById(R.id.comment_timestamp); delete = itemView.findViewById(R.id.delete); } } } \ No newline at end of file +package com.quantum_guys.dncc_eco_sync.adapters; import android.annotation.SuppressLint; import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import com.afollestad.materialdialogs.MaterialDialog; import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; import com.github.marlonlom.utilities.timeago.TimeAgo; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; import com.google.firebase.firestore.FirebaseFirestore; import com.quantum_guys.dncc_eco_sync.R; import com.quantum_guys.dncc_eco_sync.models.Comment; import com.quantum_guys.dncc_eco_sync.ui.activities.friends.FriendProfile; import com.quantum_guys.dncc_eco_sync.utils.MathView; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import de.hdodenhof.circleimageview.CircleImageView; import es.dmoral.toasty.Toasty; public class CommentsAdapter extends RecyclerView.Adapter { private final List commentList; private final Context context; private final boolean isOwner; int lastPosition = -1; private FirebaseFirestore mFirestore; private FirebaseUser mCurrentUser; int comment_count; public CommentsAdapter(List commentList, Context context, boolean owner, int comment_count) { this.commentList = commentList; this.context = context; this.isOwner = owner; this.comment_count = comment_count; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { mFirestore = FirebaseFirestore.getInstance(); mCurrentUser = FirebaseAuth.getInstance().getCurrentUser(); View view = LayoutInflater.from(context).inflate(R.layout.item_comment, parent, false); return new ViewHolder(view); } @Override public long getItemId(int position) { return position; } @Override public int getItemViewType(int position) { return position; } @Override public void onBindViewHolder(@NonNull final ViewHolder holder, @SuppressLint("RecyclerView") int position) { Animation animation = AnimationUtils.loadAnimation(context, (position > lastPosition) ? R.anim.up_from_bottom : R.anim.down_from_top); holder.itemView.startAnimation(animation); lastPosition = position; if (isOwner) { enableDeletion(holder, position); } else { if (commentList.get(position).getId().equals(mCurrentUser.getUid())) { enableDeletion(holder, position); } } holder.username.setText(commentList.get(position).getUsername()); holder.username.setOnClickListener(v -> context.startActivity(new Intent(context, FriendProfile.class).putExtra("f_id", commentList.get(holder.getAdapterPosition()).getId()))); holder.image.setOnClickListener(v -> context.startActivity(new Intent(context, FriendProfile.class).putExtra("f_id", commentList.get(holder.getAdapterPosition()).getId()))); Glide.with(context) .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) .load(commentList.get(position).getImage()) .into(holder.image); holder.comment.setDisplayText(commentList.get(position).getComment()); String timeAgo = TimeAgo.using(Long.parseLong(commentList.get(position).getTimestamp())); holder.timestamp.setText(timeAgo); try { mFirestore.collection("Users") .document(commentList.get(position).getId()) .get() .addOnSuccessListener(documentSnapshot -> { try { if (!Objects.equals(documentSnapshot.getString("username"), commentList.get(holder.getAdapterPosition()).getUsername()) && !Objects.equals(documentSnapshot.getString("image"), commentList.get(holder.getAdapterPosition()).getImage())) { Map commentMap = new HashMap<>(); commentMap.put("username", documentSnapshot.getString("username")); commentMap.put("image", documentSnapshot.getString("image")); mFirestore.collection("Posts") .document(commentList.get(holder.getAdapterPosition()).getPost_id()) .collection("Comments") .document(commentList.get(holder.getAdapterPosition()).getCommentId()) .update(commentMap) .addOnSuccessListener(aVoid -> Log.i("comment_update", "success")) .addOnFailureListener(e -> Log.i("comment_update", "failure")); holder.username.setText(documentSnapshot.getString("username")); Glide.with(context) .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) .load(documentSnapshot.getString("image")) .into(holder.image); } else if (!Objects.equals(documentSnapshot.getString("username"), commentList.get(holder.getAdapterPosition()).getUsername())) { Map commentMap = new HashMap<>(); commentMap.put("username", documentSnapshot.getString("username")); mFirestore.collection("Posts") .document(commentList.get(holder.getAdapterPosition()).getPost_id()) .collection("Comments") .document(commentList.get(holder.getAdapterPosition()).getCommentId()) .update(commentMap) .addOnSuccessListener(aVoid -> Log.i("comment_update", "success")) .addOnFailureListener(e -> Log.i("comment_update", "failure")); holder.username.setText(documentSnapshot.getString("username")); } else if (!Objects.equals(documentSnapshot.getString("image"), commentList.get(holder.getAdapterPosition()).getImage())) { Map commentMap = new HashMap<>(); commentMap.put("image", documentSnapshot.getString("image")); mFirestore.collection("Posts") .document(commentList.get(holder.getAdapterPosition()).getPost_id()) .collection("Comments") .document(commentList.get(holder.getAdapterPosition()).getCommentId()) .update(commentMap) .addOnSuccessListener(aVoid -> Log.i("comment_update", "success")) .addOnFailureListener(e -> Log.i("comment_update", "failure")); Glide.with(context) .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) .load(documentSnapshot.getString("image")) .into(holder.image); } } catch (Exception e) { e.printStackTrace(); } }) .addOnFailureListener(e -> Log.e("Error", e.getMessage())); } catch (Exception ex) { Log.w("error", "fastscrolled", ex); } } @SuppressLint("NotifyDataSetChanged") private void enableDeletion(final ViewHolder holder, int pos) { holder.delete.setVisibility(View.VISIBLE); holder.delete.setAlpha(0.0f); holder.delete.animate() .alpha(1.0f) .start(); holder.delete.setOnClickListener(v -> new MaterialDialog.Builder(context) .title("Delete comment") .content("Are you sure do you want to delete your comment?") .positiveText("Yes") .negativeText("No") .onPositive((dialog, which) -> { dialog.dismiss(); final ProgressDialog progressDialog = new ProgressDialog(context); progressDialog.setMessage("Deleting comment..."); progressDialog.setIndeterminate(true); progressDialog.show(); String postId = commentList.get(holder.getAdapterPosition()).getPost_id(); mFirestore.collection("Posts") .document(postId) .collection("Comments") .document(commentList.get(holder.getAdapterPosition()).getCommentId()) .delete() .addOnSuccessListener(aVoid -> { commentList.remove(holder.getAdapterPosition()); deleteCount(postId); Toasty.success(context, "Comment deleted", Toasty.LENGTH_SHORT, true).show(); notifyDataSetChanged(); progressDialog.dismiss(); }) .addOnFailureListener(e -> { progressDialog.dismiss(); Toasty.error(context, "Error deleting comment: " + e.getLocalizedMessage(), Toasty.LENGTH_SHORT, true).show(); Log.w("Error", "delete comment", e); }); }) .onNegative((dialog, which) -> dialog.dismiss()) .show()); } private void deleteCount( String postId) { try { comment_count = comment_count-1; HashMap scoreMap = new HashMap<>(); scoreMap.put("comment_count", comment_count); mFirestore.collection("Posts") .document(postId) .update(scoreMap).addOnSuccessListener(aVoid -> { }); } catch (Exception ignored) { } } @Override public int getItemCount() { return commentList.size(); } public static class ViewHolder extends RecyclerView.ViewHolder { private final CircleImageView image; private final TextView username; private final TextView timestamp; private final ImageView delete; final MathView comment; public ViewHolder(View itemView) { super(itemView); image = itemView.findViewById(R.id.comment_user_image); username = itemView.findViewById(R.id.comment_username); comment = itemView.findViewById(R.id.comment_text); timestamp = itemView.findViewById(R.id.comment_timestamp); delete = itemView.findViewById(R.id.delete); } } } \ No newline at end of file diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/FriendRequestAdapter.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/FriendRequestAdapter.java index d500863..4be1c9f 100644 --- a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/FriendRequestAdapter.java +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/FriendRequestAdapter.java @@ -71,7 +71,7 @@ public void onBindViewHolder(@NonNull final ViewHolder holder, int position) { holder.name.setText(usersList.get(position).getName()); Glide.with(context) - .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_logo_icon)) + .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) .load(usersList.get(position).getImage()) .into(holder.image); @@ -109,7 +109,7 @@ public void onBindViewHolder(@NonNull final ViewHolder holder, int position) { holder.name.setText(documentSnapshot.getString("name")); Glide.with(context) - .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_logo)) + .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) .load(documentSnapshot.getString("image")) .into(holder.image); @@ -155,7 +155,7 @@ public void onBindViewHolder(@NonNull final ViewHolder holder, int position) { Glide.with(context) - .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_logo_icon)) + .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) .load(documentSnapshot.getString("image")) .into(holder.image); diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/IssueViewHolder.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/IssueViewHolder.java new file mode 100644 index 0000000..fe744b5 --- /dev/null +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/IssueViewHolder.java @@ -0,0 +1,698 @@ +package com.quantum_guys.dncc_eco_sync.adapters; + +import static com.quantum_guys.dncc_eco_sync.ui.activities.MainActivity.ADMIN_UID_LIST; +import static com.quantum_guys.dncc_eco_sync.ui.activities.MainActivity.userId; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.app.ActivityOptions; +import android.app.ProgressDialog; +import android.content.Context; +import android.content.Intent; +import android.os.AsyncTask; +import android.os.Build; +import android.os.Handler; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.RequiresApi; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.fragment.app.FragmentActivity; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.LifecycleOwner; +import androidx.lifecycle.ViewModelProviders; +import androidx.recyclerview.widget.RecyclerView; +import androidx.viewpager.widget.ViewPager; + +import com.afollestad.materialdialogs.MaterialDialog; +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.RequestOptions; +import com.github.ivbaranov.mfb.MaterialFavoriteButton; +import com.github.marlonlom.utilities.timeago.TimeAgo; +import com.google.android.material.bottomsheet.BottomSheetDialog; +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.auth.FirebaseUser; +import com.google.firebase.database.DataSnapshot; +import com.google.firebase.database.DatabaseError; +import com.google.firebase.database.FirebaseDatabase; +import com.google.firebase.database.ValueEventListener; +import com.google.firebase.firestore.CollectionReference; +import com.google.firebase.firestore.FirebaseFirestore; +import com.google.firebase.storage.FirebaseStorage; +import com.google.firebase.storage.StorageReference; +import com.quantum_guys.dncc_eco_sync.R; +import com.quantum_guys.dncc_eco_sync.models.Issue; +import com.quantum_guys.dncc_eco_sync.models.MultipleImage; +import com.quantum_guys.dncc_eco_sync.models.Notification; +import com.quantum_guys.dncc_eco_sync.notification.APIService; +import com.quantum_guys.dncc_eco_sync.notification.Client; +import com.quantum_guys.dncc_eco_sync.notification.MyResponse; +import com.quantum_guys.dncc_eco_sync.notification.NotificationSender; +import com.quantum_guys.dncc_eco_sync.ui.activities.friends.FriendProfile; +import com.quantum_guys.dncc_eco_sync.ui.activities.post.CommentsActivity; +import com.quantum_guys.dncc_eco_sync.ui.activities.post.WhoLikedActivity; +import com.quantum_guys.dncc_eco_sync.ui.fragment.Home; +import com.quantum_guys.dncc_eco_sync.ui.fragment.PostMenu; +import com.quantum_guys.dncc_eco_sync.utils.MathView; +import com.quantum_guys.dncc_eco_sync.viewmodel.UserViewModel; +import com.tbuonomo.viewpagerdotsindicator.DotsIndicator; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Timer; +import java.util.TimerTask; + +import de.hdodenhof.circleimageview.CircleImageView; +import es.dmoral.toasty.Toasty; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +@SuppressWarnings("ConstantConditions") +public class IssueViewHolder extends RecyclerView.ViewHolder { + private final FirebaseFirestore mFirestore; + private final FirebaseUser mCurrentUser; + private final CircleImageView user_image; + private final TextView user_name; + private final TextView timestamp; + private final TextView institute_dept, likes_count; + CollectionReference IssueDb = FirebaseFirestore.getInstance().collection("Issues"); + private final MathView Issue_desc; + + private final MaterialFavoriteButton sav_button; + private final MaterialFavoriteButton like_btn; + private final MaterialFavoriteButton stat_btn; + private final ConstraintLayout pager_layout; + private final RelativeLayout indicator_holder; + private final ImageView delete; + private final ImageView menu; + private final ViewPager pager; + private final DotsIndicator indicator2; + int position; + final Button see_more; + private Context context; + private boolean isOwner; + private boolean alreadyLiked=false; + private Activity activity; + private View mView; + int IssueLikes; + + public IssueViewHolder(@NonNull View holder) { + super(holder); + FirebaseAuth mAuth = FirebaseAuth.getInstance(); + mFirestore = FirebaseFirestore.getInstance(); + mCurrentUser = mAuth.getCurrentUser(); + user_image = holder.findViewById(R.id.post_user_image); + like_btn = holder.findViewById(R.id.like_button); + stat_btn = holder.findViewById(R.id.stat_button); + user_name = holder.findViewById(R.id.post_username); + institute_dept = holder.findViewById(R.id.dept_institute); + likes_count = holder.findViewById(R.id.like_count); + timestamp = holder.findViewById(R.id.post_timestamp); + Issue_desc = holder.findViewById(R.id.post_desc); + pager = holder.findViewById(R.id.pager); + pager_layout = holder.findViewById(R.id.pager_layout); + see_more = holder.findViewById(R.id.share_button); + delete = holder.findViewById(R.id.delete_button); + sav_button = holder.findViewById(R.id.save_button); + indicator2 = holder.findViewById(R.id.indicator); + indicator_holder = holder.findViewById(R.id.indicator_holder); + menu = holder.findViewById(R.id.menu_button); + } + + private int updateLike(String IssueId, String IssueerId) { + try { + if(!alreadyLiked){ + IssueLikes++; + try { + Map likeMap = new HashMap<>(); + likeMap.put("liked", true); + IssueDb.document(IssueId) + .collection("Liked_Users") + .document(mCurrentUser.getUid()) + .set(likeMap) + .addOnSuccessListener(aVoid -> { + alreadyLiked=true; + UserViewModel userViewModel = ViewModelProviders.of((FragmentActivity) context).get(UserViewModel.class); + userViewModel.user.observe((LifecycleOwner) context, users -> { + Notification notification = new Notification(IssueId, + IssueerId, + users.getUsername(), + users.getImage(), + "Liked your Issue", + String.valueOf(System.currentTimeMillis()) + , "like" + , IssueId, false + ); + addToNotification(IssueerId, notification); + }); + }) + .addOnFailureListener(e -> Log.e("Error like", e.getMessage())); + } catch (Exception ignored) { + } + }else{ + IssueLikes--; + try { + mFirestore.collection("Issues") + .document(IssueId) + .collection("Liked_Users") + .document(mCurrentUser.getUid()) + .delete() + .addOnSuccessListener(aVoid -> { + alreadyLiked=false; + //holder.like_count.setText(String.valueOf(Integer.parseInt(holder.like_count.getText().toString())-1)); + //Toast.makeText(context, "Unliked Issue '" + Issue.IssueId, Toast.LENGTH_SHORT).show(); + }) + .addOnFailureListener(e -> Log.e("Error unlike", e.getMessage())); + } catch (Exception ignored) { + } + } + likes_count.setText(String.valueOf(IssueLikes)); + mFirestore.collection("Issues").document(IssueId).update("liked_count", IssueLikes).addOnSuccessListener(aVoid -> { + }); + } catch (NullPointerException ignored) { + + } + return IssueLikes; + } + + @RequiresApi(api = Build.VERSION_CODES.R) + @SuppressLint({"ResourceType", "SetTextI18n"}) + public void bind(Issue Issue, final IssueViewHolder holder, int position, BottomSheetDialog mmBottomSheetDialog, View statsheetView, boolean approved) { + Log.d("Approved", approved+" "); + context = Home.context; + this.position = position; + this.IssueLikes = Issue.getLiked_count(); + getLikeandFav(Issue); + user_name.setText(Issue.getName()); + user_name.setOnClickListener(v -> { + context.startActivity(new Intent(context, FriendProfile.class).putExtra("f_id", Issue.getUserId())); + }); + + likes_count.setText(String.valueOf(Issue.getLiked_count())); + + try { + if (Issue.getInstitute() == null) { + holder.institute_dept.setText(Issue.getDept()); + } else if (Issue.getDept() == null) { + holder.institute_dept.setText(Issue.getInstitute()); + } else { + holder.institute_dept.setText(Issue.getDept() + ", " + Issue.getInstitute()); + } + }catch (Exception j){ + holder.institute_dept.setText(Issue.getDept()); + } + + //Issue_desc.setDisplayText(Issue.getDescription()); + stat_btn.setOnFavoriteChangeListener((buttonView, favorite) -> { + + mmBottomSheetDialog.show(); + + final ProgressBar pbar = statsheetView.findViewById(R.id.pbar); + final LinearLayout main = statsheetView.findViewById(R.id.main); + final LinearLayout loveL = statsheetView.findViewById(R.id.love); + final LinearLayout saveL = statsheetView.findViewById(R.id.save); + final TextView smile = statsheetView.findViewById(R.id.smiles); + final TextView comments = statsheetView.findViewById(R.id.comments); + final TextView save = statsheetView.findViewById(R.id.saves); + + pbar.setVisibility(View.VISIBLE); + main.setVisibility(View.GONE); + IssueDb.document(Issue.getPostId()) + .collection("Liked_Users") + .get() + .addOnSuccessListener(queryDocumentSnapshots -> { + + smile.setText(String.format(Home.context.getString(R.string.s_peopl_have_smiled_for_this_post), queryDocumentSnapshots.size())); + loveL.setOnClickListener(view -> view.getContext().startActivity(new Intent(view.getContext(), WhoLikedActivity.class).putExtra("IssueId", Issue.getPostId()).putExtra("type", "Liked_Users"))); + + IssueDb.document(Issue.getPostId()) + .collection("Saved_Users") + .get() + .addOnSuccessListener(queryDocumentSnapshots1 -> { + save.setText(String.format(Home.context.getString(R.string.s_peopl_have_saved_this_post), queryDocumentSnapshots1.size())); + saveL.setOnClickListener(view -> view.getContext().startActivity(new Intent(view.getContext(), WhoLikedActivity.class).putExtra("IssueId", Issue.getPostId()).putExtra("type", "Saved_Users"), ActivityOptions.makeSceneTransitionAnimation((Activity) context).toBundle())); + pbar.setVisibility(View.GONE); + main.setVisibility(View.VISIBLE); + + }) + .addOnFailureListener(Throwable::printStackTrace); + + IssueDb.document(Issue.getPostId()) + .collection("Comments") + .get() + .addOnSuccessListener(queryDocumentSnapshots1 -> { + comments.setText(String.format(Home.context.getString(R.string.s_peopl_have_commented_this_post), queryDocumentSnapshots1.size())); + pbar.setVisibility(View.GONE); + main.setVisibility(View.VISIBLE); + + }) + .addOnFailureListener(Throwable::printStackTrace); + + }) + .addOnFailureListener(Throwable::printStackTrace); + + }); + Glide.with(Home.context) + .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.placeholder)) + .load(Issue.getUserimage()) + .into(holder.user_image); + + String timeAgo = TimeAgo.using(Long.parseLong(Issue.getTimestamp())); + timestamp.setText(timeAgo); + try { + String descc = Issue.getDescription(); + Issue_desc.setDisplayText((descc.length() > 597) ? descc.substring(0, 600) + "..." : descc); + if(descc.contains("video_loading_bg.svg")){ + Issue_desc.setDisplayText((descc.length() > 1497) ? descc.substring(0, 1500) + "..." : descc); + } + if (Issue.getImage_count() == 0) { + pager_layout.setVisibility(View.GONE); + } else if (Issue.getImage_count() == 1) { + pager_layout.setVisibility(View.VISIBLE); + ArrayList multipleImages = new ArrayList<>(); + PostPhotosAdapter photosAdapter = new PostPhotosAdapter(Home.context, activity, multipleImages, false, Issue.getPostId(), like_btn, Issue.getUserId(), approved); + setUrls(multipleImages, photosAdapter, Issue); + pager.setAdapter(photosAdapter); + indicator_holder.setVisibility(View.GONE); + photosAdapter.notifyDataSetChanged(); + pager_layout.setVisibility(View.VISIBLE); + Issue_desc.setVisibility(View.VISIBLE); + } else { + ArrayList multipleImages = new ArrayList<>(); + PostPhotosAdapter photosAdapter = new PostPhotosAdapter(Home.context, activity, multipleImages, false, Issue.getPostId(), like_btn, Issue.getUserId(), approved); + setUrls(multipleImages, photosAdapter, Issue); + + pager.setAdapter(photosAdapter); + photosAdapter.notifyDataSetChanged(); + indicator2.setDotsClickable(true); + indicator2.setViewPager(pager); + + final Handler handler = new Handler(); + final Runnable slide = () -> { + if (pager.getCurrentItem() == multipleImages.size()) { + pager.setCurrentItem(0, true); + return; + } + pager.setCurrentItem(pager.getCurrentItem() + 1, true); + }; + Timer slideTimer = new Timer(); + slideTimer.schedule(new TimerTask() { + @Override + public void run() { + handler.post(slide); + } + }, 100000, 100000); + + + pager_layout.setVisibility(View.VISIBLE); + indicator_holder.setVisibility(View.VISIBLE); + } + } catch (NullPointerException ignored) { + + } + try { + setupViews(Issue); + } catch (Exception ignored) { + } + menu.setOnClickListener(view -> { + FragmentManager fragmentManager = ((FragmentActivity) context).getSupportFragmentManager(); + new PostMenu(Issue.getPostId(), Issue.getName()).show(fragmentManager, ""); + + }); + + if (Issue.getUserId().equals(mCurrentUser.getUid()) || ADMIN_UID_LIST.contains(mCurrentUser.getUid())) { + isOwner = true; + delete.setVisibility(View.VISIBLE); + delete.setOnClickListener(v -> new MaterialDialog.Builder(Home.context) + .title("Delete Issue") + .content("Are you sure do you want to delete this Issue?") + .positiveText("Yes") + .negativeText("No") + .onPositive((dialog, which) -> { + + final ProgressDialog pdialog = new ProgressDialog(Home.context); + pdialog.setMessage("Please wait..."); + pdialog.setIndeterminate(true); + pdialog.setCancelable(false); + pdialog.setCanceledOnTouchOutside(false); + pdialog.show(); + + dialog.dismiss(); + IssueDb + .document(Issue.getPostId()) + .delete() + .addOnSuccessListener(aVoid -> { + + + if (!TextUtils.isEmpty(Issue.getImage_url_0())) { + StorageReference img = FirebaseStorage.getInstance() + .getReferenceFromUrl(Issue.getImage_url_0()); + img.delete().addOnSuccessListener(aVoid1 -> + { + pdialog.dismiss(); + Log.i("Issue Image", "deleted"); + }) + .addOnFailureListener(e -> Log.e("Issue Image", e.getLocalizedMessage())); + } + + pdialog.show(); + if (!TextUtils.isEmpty(Issue.getImage_url_1())) { + StorageReference img = FirebaseStorage.getInstance() + .getReferenceFromUrl(Issue.getImage_url_1()); + img.delete().addOnSuccessListener(aVoid12 -> { + pdialog.dismiss(); + Log.i("Issue Image", "deleted"); + }) + .addOnFailureListener(e -> Log.e("Issue Image", e.getLocalizedMessage())); + } + + pdialog.show(); + if (!TextUtils.isEmpty(Issue.getImage_url_2())) { + StorageReference img = FirebaseStorage.getInstance() + .getReferenceFromUrl(Issue.getImage_url_2()); + img.delete().addOnSuccessListener(aVoid13 -> { + pdialog.dismiss(); + Log.i("Issue Image", "deleted"); + }) + .addOnFailureListener(e -> Log.e("Issue Image", e.getLocalizedMessage())); + } + + pdialog.show(); + if (!TextUtils.isEmpty(Issue.getImage_url_3())) { + StorageReference img = FirebaseStorage.getInstance() + .getReferenceFromUrl(Issue.getImage_url_3()); + img.delete().addOnSuccessListener(aVoid14 -> { + pdialog.dismiss(); + Log.i("Issue Image", "deleted"); + }) + .addOnFailureListener(e -> Log.e("Issue Image", e.getLocalizedMessage())); + } + + pdialog.show(); + if (!TextUtils.isEmpty(Issue.getImage_url_4())) { + StorageReference img = FirebaseStorage.getInstance() + .getReferenceFromUrl(Issue.getImage_url_4()); + img.delete().addOnSuccessListener(aVoid15 -> { + pdialog.dismiss(); + Log.i("Issue Image", "deleted"); + }) + .addOnFailureListener(e -> Log.e("Issue Image", e.getLocalizedMessage())); + } + + pdialog.show(); + if (!TextUtils.isEmpty(Issue.getImage_url_5())) { + StorageReference img = FirebaseStorage.getInstance() + .getReferenceFromUrl(Issue.getImage_url_5()); + img.delete().addOnSuccessListener(aVoid16 -> { + pdialog.dismiss(); + Log.i("Issue Image", "deleted"); + }) + .addOnFailureListener(e -> Log.e("Issue Image", e.getLocalizedMessage())); + } + + pdialog.show(); + if (!TextUtils.isEmpty(Issue.getImage_url_6())) { + StorageReference img = FirebaseStorage.getInstance() + .getReferenceFromUrl(Issue.getImage_url_6()); + img.delete().addOnSuccessListener(aVoid17 -> { + pdialog.dismiss(); + Log.i("Issue Image", "deleted"); + }) + .addOnFailureListener(e -> Log.e("Issue Image", e.getLocalizedMessage())); + } + + Toasty.success(context, "Issue deleted", Toasty.LENGTH_SHORT, true).show(); + + pdialog.dismiss(); + + + }) + .addOnFailureListener(e -> { + pdialog.dismiss(); + Log.e("error", e.getLocalizedMessage()); + }); + + }) + .onNegative((dialog, which) -> dialog.dismiss()).show()); + + } else { + isOwner = false; + holder.delete.setVisibility(View.GONE); + } + try { + mFirestore.collection("Users") + .document(Issue.getUserId()) + .get() + .addOnSuccessListener(documentSnapshot -> { + try { + if (!documentSnapshot.getString("image").equals(Issue.getUserimage())) { + Map IssueMap = new HashMap<>(); + IssueMap.put("name", documentSnapshot.getString("name")); + IssueMap.put("userimage", documentSnapshot.getString("image")); + + IssueDb.document(Issue.getPostId()) + .update(IssueMap) + .addOnSuccessListener(aVoid -> Log.i("Issue_update", "success")) + .addOnFailureListener(e -> Log.i("Issue_update", "failure")); + + user_name.setText(documentSnapshot.getString("name")); + + Glide.with(Home.context) + .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) + .load(documentSnapshot.getString("image")) + .into(user_image); + } else if (!Objects.equals(documentSnapshot.getString("userId"), Issue.getUserId())) { + Map IssueMap = new HashMap<>(); + IssueMap.put("name", documentSnapshot.getString("name")); + IssueDb.document(Issue.getPostId()) + .update(IssueMap) + .addOnSuccessListener(aVoid -> Log.i("Issue_update", "success")) + .addOnFailureListener(e -> Log.i("Issue_update", "failure")); + + user_name.setText(documentSnapshot.getString("name")); + + } else if (!Objects.equals(documentSnapshot.getString("image"), Issue.getUserimage())) { + + Map IssueMap = new HashMap<>(); + IssueMap.put("userimage", documentSnapshot.getString("image")); + + IssueDb.document(Issue.getPostId()) + .update(IssueMap) + .addOnSuccessListener(aVoid -> Log.i("Issue_update", "success")) + .addOnFailureListener(e -> Log.i("Issue_update", "failure")); + + Glide.with(Home.context) + .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) + .load(documentSnapshot.getString("image")) + .into(user_image); + + } + + } catch (Exception e) { + e.printStackTrace(); + } + }) + .addOnFailureListener(e -> Log.e("Error", e.getMessage())); + } catch (Exception ex) { + Log.w("error", "fastscrolled", ex); + } + + see_more.setOnClickListener(view -> context.startActivity(new Intent(Home.context, CommentsActivity.class).putExtra("Issue", Issue).putExtra("owner", isOwner).putExtra("approveStatus", approved).putExtra("alreadyLiked", alreadyLiked) , ActivityOptions.makeSceneTransitionAnimation((Activity) context).toBundle())); + + holder.itemView.setOnClickListener(view -> context.startActivity(new Intent(Home.context, CommentsActivity.class).putExtra("Issue", Issue).putExtra("owner", isOwner).putExtra("approveStatus", approved).putExtra("alreadyLiked", alreadyLiked) , ActivityOptions.makeSceneTransitionAnimation((Activity) context).toBundle())); + + } + + @SuppressLint("SetTextI18n") + private void setupViews(Issue Issue) { + + try { + getLikeandFav(Issue); + } catch (NullPointerException ignored) { + + } + user_name.setText(Issue.getName()); + + institute_dept.setText(Issue.getDept() + ", " + Issue.getInstitute()); + + Glide.with(Home.context) + .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.placeholder)) + .load(Issue.getUserimage()) + .into(user_image); + String timeAgo = TimeAgo.using(Long.parseLong(Issue.getTimestamp())); + timestamp.setText(timeAgo); + } + + @SuppressLint("ClickableViewAccessibility") + + + private void setUrls(ArrayList multipleImages, PostPhotosAdapter photosAdapter, Issue Issue) { + String url0, url1, url2, url3, url4, url5, url6; + url0 = Issue.getImage_url_0(); + url1 = Issue.getImage_url_1(); + url2 = Issue.getImage_url_2(); + url3 = Issue.getImage_url_3(); + url4 = Issue.getImage_url_4(); + url5 = Issue.getImage_url_5(); + url6 = Issue.getImage_url_6(); + + if (!TextUtils.isEmpty(url0)) { + MultipleImage image = new MultipleImage(url0); + multipleImages.add(image); + photosAdapter.notifyDataSetChanged(); + Log.i("url0", url0); + } + + if (!TextUtils.isEmpty(url1)) { + MultipleImage image = new MultipleImage(url1); + multipleImages.add(image); + photosAdapter.notifyDataSetChanged(); + Log.i("url1", url1); + } + + if (!TextUtils.isEmpty(url2)) { + MultipleImage image = new MultipleImage(url2); + multipleImages.add(image); + photosAdapter.notifyDataSetChanged(); + Log.i("url2", url2); + } + + if (!TextUtils.isEmpty(url3)) { + MultipleImage image = new MultipleImage(url3); + multipleImages.add(image); + photosAdapter.notifyDataSetChanged(); + Log.i("url3", url3); + } + + if (!TextUtils.isEmpty(url4)) { + MultipleImage image = new MultipleImage(url4); + multipleImages.add(image); + photosAdapter.notifyDataSetChanged(); + Log.i("url4", url4); + } + + if (!TextUtils.isEmpty(url5)) { + MultipleImage image = new MultipleImage(url5); + multipleImages.add(image); + photosAdapter.notifyDataSetChanged(); + Log.i("url5", url5); + } + + if (!TextUtils.isEmpty(url6)) { + MultipleImage image = new MultipleImage(url6); + multipleImages.add(image); + photosAdapter.notifyDataSetChanged(); + Log.i("ur6", url6); + } + + + } + + private void addToNotification(String admin_id, Notification notification) { + if (!admin_id.equals(userId)) { + mFirestore.collection("Users") + .document(admin_id) + .collection("Info_Notifications").document(notification.getId()) + .set(notification) + .addOnSuccessListener(documentReference -> new SendNotificationAsyncTask(notification).execute()) + .addOnFailureListener(e -> Log.e("Error", e.getLocalizedMessage())); + } + } + + private void getLikeandFav(Issue Issue) { + try { + IssueDb.document(Issue.getPostId()) + .collection("Liked_Users") + .document(userId) + .get() + .addOnSuccessListener(documentSnapshot -> { + try { + if (documentSnapshot.exists()) { + alreadyLiked = true; + like_btn.setFavorite(true, false); + } + }catch (Exception ignored){ + + } + like_btn.setOnFavoriteChangeListener((buttonView, favorite) -> { + Issue.setLike_count(updateLike(Issue.getPostId(), Issue.getUserId())); + }); + }) + .addOnFailureListener(e -> Log.e("Error Like", e.getMessage())); + } catch (NullPointerException ignored) { + + } + + try { + IssueDb.document(Issue.getPostId()) + .collection("Saved_Users") + .document(mCurrentUser.getUid()) + .get() + .addOnSuccessListener(documentSnapshot -> { + + if (documentSnapshot.exists()) { + boolean fav = documentSnapshot.getBoolean("Saved"); + + sav_button.setFavorite(fav, false); + } else { + Log.e("Fav", "No document found"); + + } + + }) + .addOnFailureListener(e -> Log.e("Error Fav", e.getMessage())); + } catch (NullPointerException ignored) { + } + + } + + private static class SendNotificationAsyncTask extends AsyncTask { + final APIService apiService; + final Notification notification; + + private SendNotificationAsyncTask(Notification notification) { + this.notification = notification; + apiService = Client.getClient("https://fcm.googleapis.com/").create(APIService.class); + } + + @Override + protected Void doInBackground(Void... jk) { + FirebaseDatabase.getInstance().getReference().child("Tokens").child(notification.getNotifyTo()).child("token").addListenerForSingleValueEvent(new ValueEventListener() { + @Override + public void onDataChange(@NonNull DataSnapshot dataSnapshot) { + String usertoken = dataSnapshot.getValue(String.class); + NotificationSender sender = new NotificationSender(notification, usertoken); + apiService.sendNotifcation(sender).enqueue(new Callback() { + @Override + public void onResponse(@NonNull Call call, @NonNull Response response) { + + } + + @Override + public void onFailure(@NonNull Call call, @NonNull Throwable t) { + + } + }); + } + + @Override + public void onCancelled(@NonNull DatabaseError databaseError) { + + } + }); + return null; + } + } + +} \ No newline at end of file diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/NotificationsAdapter.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/NotificationsAdapter.java index 6b5e31b..1f8242d 100644 --- a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/NotificationsAdapter.java +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/NotificationsAdapter.java @@ -87,7 +87,7 @@ public void onBindViewHolder(@NonNull final ViewHolder holder, int position) { Notification notification = notificationsList.get(position); Glide.with(context) - .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_logo)) + .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) .load(notification.getImage()) .into(holder.image); @@ -122,7 +122,7 @@ public void onBindViewHolder(@NonNull final ViewHolder holder, int position) { holder.type_image.setImageResource(R.drawable.ic_image_post_black); break; default: - holder.type_image.setImageResource(R.drawable.ic_logo); + holder.type_image.setImageResource(R.drawable.logo_round); break; } diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/PlayerAdapter.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/PlayerAdapter.java index d17c0a3..303c002 100644 --- a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/PlayerAdapter.java +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/PlayerAdapter.java @@ -74,7 +74,7 @@ public void onBindViewHolder(@NonNull final ViewHolder holder, int position) { int score = (int) users.getScore(); holder.level.setText(String.valueOf(getLevelNum(score))); Glide.with(context) - .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_logo)) + .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) .load(users.getImage()) .into(holder.image); final String userid = users.getId(); diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/PostViewHolder.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/PostViewHolder.java index 1ca1e6c..1914507 100644 --- a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/PostViewHolder.java +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/PostViewHolder.java @@ -475,7 +475,7 @@ public void run() { user_name.setText(documentSnapshot.getString("name")); Glide.with(Home.context) - .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_logo)) + .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) .load(documentSnapshot.getString("image")) .into(user_image); } else if (!Objects.equals(documentSnapshot.getString("userId"), post.getUserId())) { @@ -493,14 +493,13 @@ public void run() { Map postMap = new HashMap<>(); postMap.put("userimage", documentSnapshot.getString("image")); - postDb - .document(post.getPostId()) + postDb.document(post.getPostId()) .update(postMap) .addOnSuccessListener(aVoid -> Log.i("post_update", "success")) .addOnFailureListener(e -> Log.i("post_update", "failure")); Glide.with(Home.context) - .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_logo)) + .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) .load(documentSnapshot.getString("image")) .into(user_image); diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/ResultAdapter.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/ResultAdapter.java index 57e675a..058a556 100644 --- a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/ResultAdapter.java +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/ResultAdapter.java @@ -1 +1 @@ -package com.quantum_guys.dncc_eco_sync.adapters; import static com.quantum_guys.dncc_eco_sync.ui.activities.MainActivity.userId; import android.annotation.SuppressLint; import android.app.Activity; import android.app.ActivityOptions; import android.content.Context; import android.content.Intent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.fragment.app.FragmentActivity; import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.ViewModelProviders; import androidx.recyclerview.widget.RecyclerView; import com.afollestad.materialdialogs.MaterialDialog; import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; import com.github.marlonlom.utilities.timeago.TimeAgo; import com.google.firebase.database.FirebaseDatabase; import com.google.firebase.firestore.FirebaseFirestore; import com.quantum_guys.dncc_eco_sync.R; import com.quantum_guys.dncc_eco_sync.ui.activities.quiz.QuizBattle; import com.quantum_guys.dncc_eco_sync.ui.activities.quiz.Result; import com.quantum_guys.dncc_eco_sync.ui.activities.quiz.ResultActivity; import com.quantum_guys.dncc_eco_sync.viewmodel.BattleViewModel; import com.quantum_guys.dncc_eco_sync.viewmodel.ResultViewModel; import com.quantum_guys.dncc_eco_sync.viewmodel.UserViewModel; import java.util.List; import java.util.Objects; import de.hdodenhof.circleimageview.CircleImageView; import es.dmoral.toasty.Toasty; public class ResultAdapter extends RecyclerView.Adapter { public static final int JUST_STARTED = -1; public static final int OFFLINE_STARTED = -2; public static final int JUST_IN = -3; public static final int IN_STARTED = -4; public static final int COMPLETED = -5; private final List results; private final Context context; boolean visitor = false; int lastPosition = -1; boolean canDelete = false; public ResultAdapter(List results, Context context, boolean visitor) { this.results = results; this.context = context; this.visitor = visitor; } @NonNull @Override public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_result, viewGroup, false); return new MyViewHolder(view); } @SuppressLint({"SetTextI18n", "UseCompatLoadingForColorStateLists"}) @Override public void onBindViewHolder(@NonNull MyViewHolder holder, int i) { Animation animation = AnimationUtils.loadAnimation(context, (i > lastPosition) ? R.anim.up_from_bottom : R.anim.down_from_top); holder.itemView.startAnimation(animation); lastPosition = i; //int lastPosition = -1; //my - sender //other - receiver boolean play = false; boolean result = false; boolean offline = false; Result model = results.get(i); setUserData(holder.myImg, holder.myName, holder.thisLevel, userId, true); String timeAgo = TimeAgo.using(Long.parseLong(model.getTimestamp())); if (model.getAction() == JUST_STARTED) { result = true; holder.linearLayout.setBackgroundTintList(context.getResources().getColorStateList(R.color.your_invites)); holder.mySc.setText(String.valueOf(model.getMyScore())); holder.infoTv.setText("You challenged in " + model.getTopic() + " " + timeAgo); holder.othSc.setText("-"); setUserData(holder.otherImg, holder.otherName, holder.otherLevel, model.getOtherUid(), false); } else if (model.getAction() == OFFLINE_STARTED) { play = true; offline = true; holder.linearLayout.setBackgroundTintList(context.getResources().getColorStateList(R.color.pending)); holder.mySc.setText(String.valueOf(model.getMyScore())); holder.infoTv.setText("You started a match in " + model.getTopic() + " " + timeAgo); holder.othSc.setText("-"); setUserData(holder.otherImg, holder.otherName, holder.otherLevel, model.getOtherUid(), false); } else if (model.getAction() == COMPLETED) { result = true; holder.linearLayout.setBackgroundTintList(context.getResources().getColorStateList(R.color.completed)); holder.mySc.setText(String.valueOf(model.getMyScore())); holder.infoTv.setText("Completed a match in " + model.getTopic() + " " + timeAgo); holder.othSc.setText(String.valueOf(model.getOtherScore())); setUserData(holder.otherImg, holder.otherName, holder.otherLevel, model.getOtherUid(), false); } else if (model.getAction() == JUST_IN) { play = true; holder.linearLayout.setBackgroundTintList(context.getResources().getColorStateList(R.color.invite)); holder.othSc.setText("?"); holder.infoTv.setText("Invited you in " + model.getTopic() + " " + timeAgo); holder.mySc.setText("-"); setUserData(holder.otherImg, holder.otherName, holder.otherLevel, model.getOtherUid(), false); } else if (model.getAction() == IN_STARTED) { play = true; offline = true; holder.linearLayout.setBackgroundTintList(context.getResources().getColorStateList(R.color.my_pending)); holder.othSc.setText("?"); holder.infoTv.setText("Accepted but not Completed " + model.getTopic() + " " + timeAgo); holder.mySc.setText(String.valueOf(model.getMyScore())); setUserData(holder.otherImg, holder.otherName, holder.otherLevel, model.getMyUid(), false); } holder.itemView.setOnLongClickListener(view -> { ResultViewModel resultViewModel = ViewModelProviders.of((FragmentActivity) context).get(ResultViewModel.class); BattleViewModel battleVM = ViewModelProviders.of((FragmentActivity) context).get(BattleViewModel.class); new MaterialDialog.Builder(context) .title("Clear this Result") .content("Are you sure do you want to delete this Result?") .positiveText("Yes") .negativeText("No") .onPositive((dialog, which) -> { if (System.currentTimeMillis() - Long.parseLong(model.getTimestamp()) >= 86400000) { canDelete = true; } if (model.getAction() == COMPLETED || model.getAction() == OFFLINE_STARTED || canDelete) { FirebaseDatabase.getInstance().getReference().child("Result").child(userId).child(model.getBattleId()).removeValue().addOnCompleteListener(task -> { resultViewModel.delete(model); battleVM.delete(model.getBattleId()); Toasty.success(context, "Deleted", Toast.LENGTH_SHORT).show(); notifyDataSetChanged(); }); } else { Toasty.error(context, "You can't delete it right now. Complete the battle first. Or wait at least 24h to get delete access.", Toast.LENGTH_SHORT).show(); } } ) .show(); return false; }); boolean finalResult = result; boolean finalOffline = offline; boolean finalPlay = play; holder.itemView.setOnClickListener(view -> { if (finalPlay && finalOffline) { Intent intent = new Intent(context, QuizBattle.class); intent.putExtra("ofo", model.getBattleId()); context.startActivity(intent, ActivityOptions.makeSceneTransitionAnimation((Activity)context).toBundle()); } else if (finalResult) { Intent intent = new Intent(context, ResultActivity.class); intent.putExtra("resultId", model.getBattleId()); context.startActivity(intent, ActivityOptions.makeSceneTransitionAnimation((Activity)context).toBundle()); } else if (finalPlay) { Intent intent = new Intent(context, QuizBattle.class); intent.putExtra("battleId", model.getBattleId()); context.startActivity(intent, ActivityOptions.makeSceneTransitionAnimation((Activity)context).toBundle()); } }); } @Override public int getItemCount() { return results.size(); } private void setUserData(ImageView proPic, TextView name, TextView level, String uid, boolean me) { try { if (me) { UserViewModel userViewModel = ViewModelProviders.of((FragmentActivity) context).get(UserViewModel.class); userViewModel.user.observe((LifecycleOwner) context, me1 -> { name.setText(me1.getUsername()); level.setText(String.valueOf(getLevelNum((int) me1.getScore()))); Glide.with(context) .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_logo)) .load(me1.getImage()) .into(proPic); }); } else { FirebaseFirestore.getInstance().collection("Users") .document(uid) .get() .addOnSuccessListener(documentSnapshot -> { try { level.setText(String.valueOf(getLevelNum(Objects.requireNonNull(documentSnapshot.getLong("score")).intValue()))); name.setText(documentSnapshot.getString("username")); } catch (Exception ignored) { } Glide.with(context) .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_logo)) .load(documentSnapshot.getString("image")) .into(proPic); }); } } catch (NullPointerException ignored) { } } public int getLevelNum(int score) { final int level; if (score <= 500) { level = 1; } else if (score <= 1000) { level = 2; } else if (score <= 1500) { level = 3; } else if (score <= 2000) { level = 4; } else if (score <= 2500) { level = 5; } else if (score <= 3500) { level = 6; } else if (score <= 5000) { level = 7; } else { level = -1; } return level; } public static class MyViewHolder extends RecyclerView.ViewHolder { public final View mView; public final CircleImageView myImg; public final CircleImageView otherImg; public final TextView myName; public final TextView otherName; public final TextView infoTv; public final TextView mySc; public final TextView othSc; public final TextView thisLevel; public final TextView otherLevel; final ConstraintLayout linearLayout; public MyViewHolder(View itemView) { super(itemView); mView = itemView; myImg = mView.findViewById(R.id.thisUserImage); otherImg = mView.findViewById(R.id.otherUserImage); thisLevel = mView.findViewById(R.id.ThislevelTv); otherLevel = mView.findViewById(R.id.otherlevelTv); myName = mView.findViewById(R.id.thisUserName); otherName = mView.findViewById(R.id.otherUserName); infoTv = mView.findViewById(R.id.ivz); mySc = mView.findViewById(R.id.myScore); othSc = mView.findViewById(R.id.otherScore); linearLayout = mView.findViewById(R.id.linearLayout4); } } /* * -1 -> JUST_STARTED -> Result * -2 -> OFFLINE_STARTED -> Play * -3 -> JUST_IN -> Play * -4 -> IN_STARTED -> Play * -5 -5 COMPLETED -> Result * */ } \ No newline at end of file +package com.quantum_guys.dncc_eco_sync.adapters; import static com.quantum_guys.dncc_eco_sync.ui.activities.MainActivity.userId; import android.annotation.SuppressLint; import android.app.Activity; import android.app.ActivityOptions; import android.content.Context; import android.content.Intent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.fragment.app.FragmentActivity; import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.ViewModelProviders; import androidx.recyclerview.widget.RecyclerView; import com.afollestad.materialdialogs.MaterialDialog; import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; import com.github.marlonlom.utilities.timeago.TimeAgo; import com.google.firebase.database.FirebaseDatabase; import com.google.firebase.firestore.FirebaseFirestore; import com.quantum_guys.dncc_eco_sync.R; import com.quantum_guys.dncc_eco_sync.ui.activities.quiz.QuizBattle; import com.quantum_guys.dncc_eco_sync.ui.activities.quiz.Result; import com.quantum_guys.dncc_eco_sync.ui.activities.quiz.ResultActivity; import com.quantum_guys.dncc_eco_sync.viewmodel.BattleViewModel; import com.quantum_guys.dncc_eco_sync.viewmodel.ResultViewModel; import com.quantum_guys.dncc_eco_sync.viewmodel.UserViewModel; import java.util.List; import java.util.Objects; import de.hdodenhof.circleimageview.CircleImageView; import es.dmoral.toasty.Toasty; public class ResultAdapter extends RecyclerView.Adapter { public static final int JUST_STARTED = -1; public static final int OFFLINE_STARTED = -2; public static final int JUST_IN = -3; public static final int IN_STARTED = -4; public static final int COMPLETED = -5; private final List results; private final Context context; boolean visitor = false; int lastPosition = -1; boolean canDelete = false; public ResultAdapter(List results, Context context, boolean visitor) { this.results = results; this.context = context; this.visitor = visitor; } @NonNull @Override public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_result, viewGroup, false); return new MyViewHolder(view); } @SuppressLint({"SetTextI18n", "UseCompatLoadingForColorStateLists"}) @Override public void onBindViewHolder(@NonNull MyViewHolder holder, int i) { Animation animation = AnimationUtils.loadAnimation(context, (i > lastPosition) ? R.anim.up_from_bottom : R.anim.down_from_top); holder.itemView.startAnimation(animation); lastPosition = i; //int lastPosition = -1; //my - sender //other - receiver boolean play = false; boolean result = false; boolean offline = false; Result model = results.get(i); setUserData(holder.myImg, holder.myName, holder.thisLevel, userId, true); String timeAgo = TimeAgo.using(Long.parseLong(model.getTimestamp())); if (model.getAction() == JUST_STARTED) { result = true; holder.linearLayout.setBackgroundTintList(context.getResources().getColorStateList(R.color.your_invites)); holder.mySc.setText(String.valueOf(model.getMyScore())); holder.infoTv.setText("You challenged in " + model.getTopic() + " " + timeAgo); holder.othSc.setText("-"); setUserData(holder.otherImg, holder.otherName, holder.otherLevel, model.getOtherUid(), false); } else if (model.getAction() == OFFLINE_STARTED) { play = true; offline = true; holder.linearLayout.setBackgroundTintList(context.getResources().getColorStateList(R.color.pending)); holder.mySc.setText(String.valueOf(model.getMyScore())); holder.infoTv.setText("You started a match in " + model.getTopic() + " " + timeAgo); holder.othSc.setText("-"); setUserData(holder.otherImg, holder.otherName, holder.otherLevel, model.getOtherUid(), false); } else if (model.getAction() == COMPLETED) { result = true; holder.linearLayout.setBackgroundTintList(context.getResources().getColorStateList(R.color.completed)); holder.mySc.setText(String.valueOf(model.getMyScore())); holder.infoTv.setText("Completed a match in " + model.getTopic() + " " + timeAgo); holder.othSc.setText(String.valueOf(model.getOtherScore())); setUserData(holder.otherImg, holder.otherName, holder.otherLevel, model.getOtherUid(), false); } else if (model.getAction() == JUST_IN) { play = true; holder.linearLayout.setBackgroundTintList(context.getResources().getColorStateList(R.color.invite)); holder.othSc.setText("?"); holder.infoTv.setText("Invited you in " + model.getTopic() + " " + timeAgo); holder.mySc.setText("-"); setUserData(holder.otherImg, holder.otherName, holder.otherLevel, model.getOtherUid(), false); } else if (model.getAction() == IN_STARTED) { play = true; offline = true; holder.linearLayout.setBackgroundTintList(context.getResources().getColorStateList(R.color.my_pending)); holder.othSc.setText("?"); holder.infoTv.setText("Accepted but not Completed " + model.getTopic() + " " + timeAgo); holder.mySc.setText(String.valueOf(model.getMyScore())); setUserData(holder.otherImg, holder.otherName, holder.otherLevel, model.getMyUid(), false); } holder.itemView.setOnLongClickListener(view -> { ResultViewModel resultViewModel = ViewModelProviders.of((FragmentActivity) context).get(ResultViewModel.class); BattleViewModel battleVM = ViewModelProviders.of((FragmentActivity) context).get(BattleViewModel.class); new MaterialDialog.Builder(context) .title("Clear this Result") .content("Are you sure do you want to delete this Result?") .positiveText("Yes") .negativeText("No") .onPositive((dialog, which) -> { if (System.currentTimeMillis() - Long.parseLong(model.getTimestamp()) >= 86400000) { canDelete = true; } if (model.getAction() == COMPLETED || model.getAction() == OFFLINE_STARTED || canDelete) { FirebaseDatabase.getInstance().getReference().child("Result").child(userId).child(model.getBattleId()).removeValue().addOnCompleteListener(task -> { resultViewModel.delete(model); battleVM.delete(model.getBattleId()); Toasty.success(context, "Deleted", Toast.LENGTH_SHORT).show(); notifyDataSetChanged(); }); } else { Toasty.error(context, "You can't delete it right now. Complete the battle first. Or wait at least 24h to get delete access.", Toast.LENGTH_SHORT).show(); } } ) .show(); return false; }); boolean finalResult = result; boolean finalOffline = offline; boolean finalPlay = play; holder.itemView.setOnClickListener(view -> { if (finalPlay && finalOffline) { Intent intent = new Intent(context, QuizBattle.class); intent.putExtra("ofo", model.getBattleId()); context.startActivity(intent, ActivityOptions.makeSceneTransitionAnimation((Activity)context).toBundle()); } else if (finalResult) { Intent intent = new Intent(context, ResultActivity.class); intent.putExtra("resultId", model.getBattleId()); context.startActivity(intent, ActivityOptions.makeSceneTransitionAnimation((Activity)context).toBundle()); } else if (finalPlay) { Intent intent = new Intent(context, QuizBattle.class); intent.putExtra("battleId", model.getBattleId()); context.startActivity(intent, ActivityOptions.makeSceneTransitionAnimation((Activity)context).toBundle()); } }); } @Override public int getItemCount() { return results.size(); } private void setUserData(ImageView proPic, TextView name, TextView level, String uid, boolean me) { try { if (me) { UserViewModel userViewModel = ViewModelProviders.of((FragmentActivity) context).get(UserViewModel.class); userViewModel.user.observe((LifecycleOwner) context, me1 -> { name.setText(me1.getUsername()); level.setText(String.valueOf(getLevelNum((int) me1.getScore()))); Glide.with(context) .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) .load(me1.getImage()) .into(proPic); }); } else { FirebaseFirestore.getInstance().collection("Users") .document(uid) .get() .addOnSuccessListener(documentSnapshot -> { try { level.setText(String.valueOf(getLevelNum(Objects.requireNonNull(documentSnapshot.getLong("score")).intValue()))); name.setText(documentSnapshot.getString("username")); } catch (Exception ignored) { } Glide.with(context) .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) .load(documentSnapshot.getString("image")) .into(proPic); }); } } catch (NullPointerException ignored) { } } public int getLevelNum(int score) { final int level; if (score <= 500) { level = 1; } else if (score <= 1000) { level = 2; } else if (score <= 1500) { level = 3; } else if (score <= 2000) { level = 4; } else if (score <= 2500) { level = 5; } else if (score <= 3500) { level = 6; } else if (score <= 5000) { level = 7; } else { level = -1; } return level; } public static class MyViewHolder extends RecyclerView.ViewHolder { public final View mView; public final CircleImageView myImg; public final CircleImageView otherImg; public final TextView myName; public final TextView otherName; public final TextView infoTv; public final TextView mySc; public final TextView othSc; public final TextView thisLevel; public final TextView otherLevel; final ConstraintLayout linearLayout; public MyViewHolder(View itemView) { super(itemView); mView = itemView; myImg = mView.findViewById(R.id.thisUserImage); otherImg = mView.findViewById(R.id.otherUserImage); thisLevel = mView.findViewById(R.id.ThislevelTv); otherLevel = mView.findViewById(R.id.otherlevelTv); myName = mView.findViewById(R.id.thisUserName); otherName = mView.findViewById(R.id.otherUserName); infoTv = mView.findViewById(R.id.ivz); mySc = mView.findViewById(R.id.myScore); othSc = mView.findViewById(R.id.otherScore); linearLayout = mView.findViewById(R.id.linearLayout4); } } /* * -1 -> JUST_STARTED -> Result * -2 -> OFFLINE_STARTED -> Play * -3 -> JUST_IN -> Play * -4 -> IN_STARTED -> Play * -5 -5 COMPLETED -> Result * */ } \ No newline at end of file diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/UsersAdapter.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/UsersAdapter.java index d240b5d..6b55e29 100644 --- a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/UsersAdapter.java +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/UsersAdapter.java @@ -84,7 +84,7 @@ public void onBindViewHolder(@NonNull final ViewHolder holder, @SuppressLint("Re holder.name.setText(usersList.get(position).getName()); Glide.with(context) - .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_logo)) + .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) .load(usersList.get(position).getImage()) .into(holder.image); @@ -112,7 +112,7 @@ public void onBindViewHolder(@NonNull final ViewHolder holder, @SuppressLint("Re holder.name.setText(documentSnapshot.getString("name")); Glide.with(context) - .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_logo)) + .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) .load(documentSnapshot.getString("image")) .into(holder.image); @@ -148,7 +148,7 @@ public void onBindViewHolder(@NonNull final ViewHolder holder, @SuppressLint("Re Glide.with(context) - .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_logo)) + .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) .load(documentSnapshot.getString("image")) .into(holder.image); diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/searchFriends/SearchFriendAdapter.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/searchFriends/SearchFriendAdapter.java index e1ad356..6bfab3d 100644 --- a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/searchFriends/SearchFriendAdapter.java +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/searchFriends/SearchFriendAdapter.java @@ -81,7 +81,7 @@ public void onBindViewHolder(@NonNull final ViewHolder holder, int position) { try { Glide.with(context) - .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_logo)) + .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) .load(friends.getImage()) .into(holder.image); } catch (NullPointerException ignored) { diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/viewFriends/ViewFriendAdapter.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/viewFriends/ViewFriendAdapter.java index 6ade0e4..15cfecc 100644 --- a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/viewFriends/ViewFriendAdapter.java +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/adapters/viewFriends/ViewFriendAdapter.java @@ -90,7 +90,7 @@ public void onBindViewHolder(final ViewHolder holder, final int position) { // holder.institute.setText(usersList.get(position).getDept()+", "+usersList.get(position).getInstitute()); Glide.with(context) - .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_logo_icon)) + .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) .load(usersList.get(position).getImage()) .into(holder.image); @@ -123,7 +123,7 @@ public void onBindViewHolder(final ViewHolder holder, final int position) { holder.institute.setText(usersList.get(position).getDept() + ", " + usersList.get(position).getInstitute()); Glide.with(context) - .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_logo_icon)) + .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) .load(documentSnapshot.getString("image")) .into(holder.image); @@ -165,7 +165,7 @@ public void onBindViewHolder(final ViewHolder holder, final int position) { holder.name.setText(documentSnapshot.getString("name")); Glide.with(context) - .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_logo_icon)) + .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) .load(documentSnapshot.getString("image")) .into(holder.image); @@ -188,7 +188,7 @@ public void onBindViewHolder(final ViewHolder holder, final int position) { holder.institute.setText(usersList.get(position).getDept() + ", " + usersList.get(position).getInstitute()); Glide.with(context) - .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_logo_icon)) + .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) .load(documentSnapshot.getString("image")) .into(holder.image); @@ -224,7 +224,7 @@ public void onBindViewHolder(final ViewHolder holder, final int position) { Glide.with(context) - .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_logo_icon)) + .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) .load(documentSnapshot.getString("image")) .into(holder.image); diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/messege/Adapter/UserAdapter.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/messege/Adapter/UserAdapter.java index 78a5ac6..4e9bb8d 100644 --- a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/messege/Adapter/UserAdapter.java +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/messege/Adapter/UserAdapter.java @@ -58,12 +58,12 @@ public void onBindViewHolder(@NonNull ViewHolder holder, int position) { final Users user = mUsers.get(position); holder.username.setText(user.getName()); if (user.getImage().equals("default")) { - holder.profile_image.setImageResource(R.drawable.ic_logo); + holder.profile_image.setImageResource(R.drawable.logo_round); } else { try { - Glide.with(mContext).load(user.getImage()).placeholder(R.drawable.ic_logo).into(holder.profile_image); + Glide.with(mContext).load(user.getImage()).placeholder(R.drawable.logo_round).into(holder.profile_image); } catch (ArrayIndexOutOfBoundsException ignored) { - holder.profile_image.setImageDrawable(mContext.getDrawable(R.drawable.ic_logo)); + holder.profile_image.setImageDrawable(mContext.getDrawable(R.drawable.logo_round)); } } diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/messege/activity/MessageActivity.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/messege/activity/MessageActivity.java index cb4e5c4..229e6b1 100644 --- a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/messege/activity/MessageActivity.java +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/messege/activity/MessageActivity.java @@ -199,12 +199,12 @@ public void onTextChanged(CharSequence s, int start, try { username.setText(name); if (Objects.equals(image, "")) { - profile_image.setImageResource(R.drawable.ic_logo); + profile_image.setImageResource(R.drawable.logo_round); } else { try { - Glide.with(getApplicationContext()).load(image).placeholder(R.drawable.ic_logo).into(profile_image); + Glide.with(getApplicationContext()).load(image).placeholder(R.drawable.logo_round).into(profile_image); } catch (ArrayIndexOutOfBoundsException ignored) { - profile_image.setImageDrawable(getResources().getDrawable(R.drawable.ic_logo)); + profile_image.setImageDrawable(getResources().getDrawable(R.drawable.logo_round)); } } readMesagges(fuser, userid, image); diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/models/Issue.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/models/Issue.java new file mode 100644 index 0000000..ae78611 --- /dev/null +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/models/Issue.java @@ -0,0 +1,71 @@ +package com.quantum_guys.dncc_eco_sync.models; + +public class Issue extends Post{ + + String states = "Pending"; // Pending, Resolved, Processing + String issueType; // + + boolean isAnonymous; + + float lat, lon; + String address; + + + public Issue(String postId, String userId, String name, String timestamp, String likes, String favourites, String description, String username, String institute, String dept, String userimage, int image_count, String image_url_0, String image_url_1, String image_url_2, String image_url_3, String image_url_4, String image_url_5, String image_url_6, int liked_count, int comment_count, String states, String issueType, boolean isAnonymous, float lat, float lon, String address) { + super(postId, userId, name, timestamp, likes, favourites, description, username, institute, dept, userimage, image_count, image_url_0, image_url_1, image_url_2, image_url_3, image_url_4, image_url_5, image_url_6, liked_count, comment_count); + this.states = states; + this.issueType = issueType; + this.isAnonymous = isAnonymous; + this.lat = lat; + this.lon = lon; + this.address = address; + } + + public String getStates() { + return states; + } + + public void setStates(String states) { + this.states = states; + } + + public String getIssueType() { + return issueType; + } + + public void setIssueType(String issueType) { + this.issueType = issueType; + } + + public boolean isAnonymous() { + return isAnonymous; + } + + public void setAnonymous(boolean anonymous) { + isAnonymous = anonymous; + } + + public float getLat() { + return lat; + } + + public void setLat(float lat) { + this.lat = lat; + } + + public float getLon() { + return lon; + } + + public void setLon(float lon) { + this.lon = lon; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } +} diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/models/Users.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/models/Users.java index e94727d..9b61cbb 100644 --- a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/models/Users.java +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/models/Users.java @@ -16,13 +16,15 @@ public class Users implements Serializable { @PrimaryKey() @NonNull String id; - long score, lastTimestamp, win, lose, draw, reward, type; - private String name, image, institute, dept, email, bio, username, location; + long score, lastTimestamp, win, lose, draw, reward, type, lat, lon; + private String name, image, institute, dept, email, bio, username, location, ward, gender, address, number; + + @Ignore public Users() { } - + @Ignore public Users(@NonNull String id, long score, long lastTimestamp, long win, long lose, long draw, long reward, long type, String name, String image, String institute, String dept, String email, String bio, String username, String location) { this.id = id; this.score = score; @@ -42,6 +44,32 @@ public Users(@NonNull String id, long score, long lastTimestamp, long win, long this.location = location; } + + public Users(@NonNull String id, long score, long lastTimestamp, long win, long lose, long draw, long reward, long type, long lat, long lon, String name, String image, String institute, String dept, String email, String bio, String username, String location, String ward, String gender, String address, String number) { + this.id = id; + this.score = score; + this.lastTimestamp = lastTimestamp; + this.win = win; + this.lose = lose; + this.draw = draw; + this.reward = reward; + this.type = type; + this.lat = lat; + this.lon = lon; + this.name = name; + this.image = image; + this.institute = institute; + this.dept = dept; + this.email = email; + this.bio = bio; + this.username = username; + this.location = location; + this.ward = ward; + this.gender = gender; + this.address = address; + this.number = number; + } + @NonNull public String getId() { return id; @@ -170,4 +198,53 @@ public long getType() { public void setType(long type) { this.type = type; } + + + public long getLat() { + return lat; + } + + public void setLat(long lat) { + this.lat = lat; + } + + public long getLon() { + return lon; + } + + public void setLon(long lon) { + this.lon = lon; + } + + public String getWard() { + return ward; + } + + public void setWard(String ward) { + this.ward = ward; + } + + public String getGender() { + return gender; + } + + public void setGender(String gender) { + this.gender = gender; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getNumber() { + return number; + } + + public void setNumber(String number) { + this.number = number; + } } diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/notification/MyFireBaseMessagingService.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/notification/MyFireBaseMessagingService.java index 4f92694..bca897a 100644 --- a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/notification/MyFireBaseMessagingService.java +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/notification/MyFireBaseMessagingService.java @@ -29,8 +29,8 @@ public class MyFireBaseMessagingService extends FirebaseMessagingService { public void onMessageReceived(@NonNull RemoteMessage remoteMessage) { super.onMessageReceived(remoteMessage); - int icon = R.drawable.ic_logo_icon; - String name = "ত্বারক"; + int icon = R.drawable.logo_round; + String name = "স্বচ্ছ ঢাকা"; String type = remoteMessage.getData().get("type"); String title = remoteMessage.getData().get("username"); String message = remoteMessage.getData().get("message"); @@ -64,13 +64,13 @@ public void onMessageReceived(@NonNull RemoteMessage remoteMessage) { break; case "play_result": name = "Battle Results"; - icon = (R.drawable.ic_logo_icon); + icon = (R.drawable.logo_round); break; case "post": icon = (R.drawable.ic_image_post_black); break; default: - icon = (R.drawable.ic_logo_icon); + icon = (R.drawable.logo_round); break; } @@ -85,7 +85,7 @@ void showNotification(int icon, String title, String message, String id, String NotificationChannel channel = new NotificationChannel(id, name, NotificationManager.IMPORTANCE_HIGH); - channel.setDescription("ত্বারক notifications. Add friends, Lighting posts, Playing battle quiz etc"); + channel.setDescription("স্বচ্ছ ঢাকা notifications. Add friends, Lighting posts, Playing battle quiz etc"); mNotificationManager.createNotificationChannel(channel); } NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(getApplicationContext(), id) @@ -96,7 +96,7 @@ void showNotification(int icon, String title, String message, String id, String .setContentTitle(title) .setContentText(message) .setSmallIcon(icon) - .setLargeIcon(BitmapFactory.decodeResource(this.getResources(), R.drawable.ic_logo)); + .setLargeIcon(BitmapFactory.decodeResource(this.getResources(), R.drawable.logo_round)); if(type.equals("chat")){ Intent intent = new Intent(getApplicationContext(), MessageActivity.class); diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/service/UploadService.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/service/UploadService.java index f277471..a99b5dc 100644 --- a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/service/UploadService.java +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/service/UploadService.java @@ -179,7 +179,7 @@ private void uploadImages(final int notification_id, final int index, final List notifyProgress(notification_id , - "ত্বারক" + "স্বচ্ছ ঢাকা" , "Uploading " + count + " posts" , getApplicationContext() , @@ -199,7 +199,7 @@ private void uploadPost(int notification_id, String currentUser_id, String descr if (count == 1) { notifyProgress(notification_id , - "ত্বারক" + "স্বচ্ছ ঢাকা" , "Uploading post.." , getApplicationContext() , @@ -300,7 +300,7 @@ private void uploadPost(int notification_id, String currentUser_id, String descr public void sendMessage(int notification_id, String sender, final String receiver, Uri image, String userid, String fuser) { notifyProgress(notification_id, - "ত্বারক", + "স্বচ্ছ ঢাকা", "Sending attachment..", getApplicationContext(), 0, diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/MainActivity.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/MainActivity.java index 53784a5..03abbad 100644 --- a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/MainActivity.java +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/MainActivity.java @@ -11,6 +11,7 @@ import android.content.res.TypedArray; import android.graphics.Color; import android.graphics.drawable.Drawable; +import android.location.Location; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; @@ -38,6 +39,7 @@ import com.afollestad.materialdialogs.MaterialDialog; import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; +import com.google.android.gms.location.LocationListener; import com.google.android.gms.tasks.Task; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; @@ -57,7 +59,6 @@ import com.quantum_guys.dncc_eco_sync.ui.activities.account.EditProfile; import com.quantum_guys.dncc_eco_sync.ui.activities.account.LoginActivity; import com.quantum_guys.dncc_eco_sync.ui.activities.friends.SearchUsersActivity; -import com.quantum_guys.dncc_eco_sync.ui.activities.post.SinglePostView; import com.quantum_guys.dncc_eco_sync.ui.activities.quiz.Ranking; import com.quantum_guys.dncc_eco_sync.ui.fragment.Dashboard; import com.quantum_guys.dncc_eco_sync.ui.fragment.FriendsFragment; @@ -81,7 +82,7 @@ /** * Created by jhm69 */ -public class MainActivity extends AppCompatActivity implements DrawerAdapter.OnItemSelectedListener { +public class MainActivity extends AppCompatActivity implements DrawerAdapter.OnItemSelectedListener, LocationListener { private static final int POS_DASHBOARD = 0; private static final int RANKING = 1; private static final int POS_FRIENDS = 2; @@ -94,7 +95,7 @@ public class MainActivity extends AppCompatActivity implements DrawerAdapter.OnI public static String userId; public static boolean inHome=true; - List admins = Arrays.asList("admin1", "admin2", "admin3"); + public static List ADMIN_UID_LIST = Arrays.asList("LTH3jvZ0JOcmirB3WxMP9tHz5eB3", "admin2", "admin3"); public TextView username; public TextView rewardTv; private long rewardCount; @@ -257,6 +258,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { .addOnCompleteListener(Task::isSuccessful); } askPermission(); + userId = currentuser.getUid(); runOnUiThread(() -> { slidingRootNav = new SlidingRootNavBuilder(MainActivity.this) @@ -269,7 +271,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { screenIcons = loadScreenIcons(); screenTitles = loadScreenTitles(); - if (admins.contains(userId)) { + if (ADMIN_UID_LIST.contains(userId)) { adapter = new DrawerAdapter(Arrays.asList( createItemFor(POS_DASHBOARD).setChecked(true), createItemFor(RANKING), @@ -300,24 +302,6 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { }); } - private void askPermission() { - Dexter.withActivity(this) - .withPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE, - Manifest.permission.READ_EXTERNAL_STORAGE - ) - .withListener(new MultiplePermissionsListener() { - @Override - public void onPermissionsChecked(MultiplePermissionsReport report) { - // Toasty.info(MainActivity.this, "You have denied some permissions permanently, if the app force close try granting permission from settings.", Toasty.LENGTH_LONG,true).show(); - } - - @Override - public void onPermissionRationaleShouldBeShown(List permissions, PermissionToken token) { - token.continuePermissionRequest(); - } - }).check(); - } - public void logout() { HashMap scoreMap = new HashMap<>(); scoreMap.put("lastTimestamp", System.currentTimeMillis()); @@ -374,7 +358,7 @@ private void setUserProfile() { username.setText(nam); rewardCount = me.getReward(); Glide.with(MainActivity.this) - .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_logo)) + .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) .load(imag) .into(imageView); rewardTv.setText(me.getReward() + " XP"); @@ -486,12 +470,12 @@ public void onItemSelected(int position) { case ABOUT_APP: inHome = false; - startActivity(new Intent(getApplicationContext(), SinglePostView.class).putExtra("post_id", "about_app")); + startActivity(new Intent(getApplicationContext(), MapView.class).putExtra("post_id", "about_app")); return; case WEB: inHome = true; - Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://tarok.tech")); + Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://3.208.28.247:3000")); startActivity(browserIntent); return; @@ -502,7 +486,7 @@ public void onItemSelected(int position) { /* case POS_SHARE: try { - doSocialShare("Share to get 20 XP", "Check out ত্বারক! Prove your skills by taking part in one to one battle of knowledge!", "https://play.google.com/store/apps/details?id=" + BuildConfig.APPLICATION_ID); + doSocialShare("Share to get 20 XP", "Check out স্বচ্ছ ঢাকা! Prove your skills by taking part in one to one battle of knowledge!", "https://play.google.com/store/apps/details?id=" + BuildConfig.APPLICATION_ID); slidingRootNav.closeMenu(true); } catch (Exception e) { e.printStackTrace(); @@ -584,4 +568,49 @@ public void showFragment(Fragment fragment) { .commit(); mCurrentFragment = fragment; } + + @Override + public void onLocationChanged(@NonNull Location location) { + Toast.makeText( + this, + "Location Access Granted", + Toast.LENGTH_SHORT + ).show(); + + HashMap mapData = new HashMap<>(); + mapData.put("lat", location.getLatitude()); + mapData.put("lon", location.getLatitude()); + mapData.put("bearing", location.getBearing()); + firestore.collection("Users") + .document(userId) + .update(mapData).addOnSuccessListener(aVoid -> { + }); + + } + + + + private void askPermission() { + + + + Dexter.withActivity(this) + .withPermissions( + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_EXTERNAL_STORAGE + ) + .withListener(new MultiplePermissionsListener() { + @Override + public void onPermissionsChecked(MultiplePermissionsReport report) { + // Toasty.info(RegisterActivity.this, "You have denied some permissions permanently, if the app force close try granting permission from settings.", Toasty.LENGTH_LONG, true).show(); + } + + @Override + public void onPermissionRationaleShouldBeShown(List permissions, PermissionToken token) { + token.continuePermissionRequest(); + } + }) + .check(); + } } \ No newline at end of file diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/MapView.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/MapView.java index 66eacbb..f2077a5 100644 --- a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/MapView.java +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/MapView.java @@ -272,7 +272,7 @@ private void updateCamera(LatLng current, float bearing) { ).show(); MarkerOptions options = new MarkerOptions(); options.position(current); - options.icon(bitmapDescriptorFromVector(this, R.drawable.truck_small)); + options.icon(bitmapDescriptorFromVector(this, R.drawable.ic_location_on_black_24dp)); options.flat(true); options.anchor(0.5f, 0.5f); @@ -334,7 +334,7 @@ public void onMapReady(@NonNull GoogleMap googleMap) { map = googleMap; map.setTrafficEnabled(false); map.setBuildingsEnabled(true); - updateCamera(new LatLng(23.7088742, 90.4111186), 0); + updateCamera(new LatLng(23.72866, 90.396453), 0); } @Override diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/account/EditProfile.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/account/EditProfile.java index 66ac740..7266dd9 100644 --- a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/account/EditProfile.java +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/account/EditProfile.java @@ -1 +1 @@ -package com.quantum_guys.dncc_eco_sync.ui.activities.account; import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; import static com.quantum_guys.dncc_eco_sync.ui.activities.MainActivity.userId; import android.Manifest; import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Bitmap; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.transition.Fade; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.Spinner; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatDelegate; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.lifecycle.ViewModelProviders; import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; import com.google.android.material.textfield.TextInputLayout; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.firestore.DocumentReference; import com.google.firebase.firestore.FirebaseFirestore; import com.google.firebase.storage.FirebaseStorage; import com.google.firebase.storage.StorageReference; import com.karumi.dexter.Dexter; import com.karumi.dexter.MultiplePermissionsReport; import com.karumi.dexter.PermissionToken; import com.karumi.dexter.listener.PermissionRequest; import com.karumi.dexter.listener.multi.MultiplePermissionsListener; import com.quantum_guys.dncc_eco_sync.R; import com.quantum_guys.dncc_eco_sync.models.Users; import com.quantum_guys.dncc_eco_sync.repository.UserRepository; import com.quantum_guys.dncc_eco_sync.ui.activities.MainActivity; import com.quantum_guys.dncc_eco_sync.ui.activities.notification.ImagePreviewSave; import com.quantum_guys.dncc_eco_sync.viewmodel.UserViewModel; import com.yalantis.ucrop.UCrop; import java.io.File; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import de.hdodenhof.circleimageview.CircleImageView; import es.dmoral.toasty.Toasty; public class EditProfile extends AppCompatActivity { private static final int PICK_IMAGE = 100; private static final int POST_IMAGE = 154; public int type = -1; public Uri imageUri = Uri.parse("android.resource://com.quantum_guys.dncc_eco_sync/" + R.drawable.ic_logo); public StorageReference storageReference; public ProgressDialog mDialog; public String name_, email_, institute_, dept_, location_; UserViewModel userViewModel; TextInputLayout deptT; ConstraintLayout groupL; Spinner spinner_class; Spinner spinner_groups; Spinner spinner_zila; private FirebaseAuth mAuth; private EditText name, email, institute, dept, bio; private CircleImageView profile_image; private void askPermission() { Dexter.withActivity(this) .withPermissions( Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE ) .withListener(new MultiplePermissionsListener() { @Override public void onPermissionsChecked(MultiplePermissionsReport report) { // Toasty.info(RegisterActivity.this, "You have denied some permissions permanently, if the app force close try granting permission from settings.", Toasty.LENGTH_LONG, true).show(); } @Override public void onPermissionRationaleShouldBeShown(List permissions, PermissionToken token) { token.continuePermissionRequest(); } }) .check(); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SharedPreferences sharedPreferences = getSharedPreferences("Theme", Context.MODE_PRIVATE); String themeName = sharedPreferences.getString("ThemeName", "Default"); if (themeName.equalsIgnoreCase("TealTheme")) { setTheme(R.style.TealTheme); } else if (themeName.equalsIgnoreCase("VioleteTheme")) { setTheme(R.style.VioleteTheme); } else if (themeName.equalsIgnoreCase("PinkTheme")) { setTheme(R.style.PinkTheme); } else if (themeName.equalsIgnoreCase("DelRio")) { setTheme(R.style.DelRio); } else if (themeName.equalsIgnoreCase("DarkTheme")) { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); setTheme(R.style.Dark); } else if (themeName.equalsIgnoreCase("Lynch")) { setTheme(R.style.Lynch); } else { setTheme(R.style.AppTheme); } setContentView(R.layout.activity_edit_profile); askPermission(); userViewModel = ViewModelProviders.of(this).get(UserViewModel.class); mAuth = FirebaseAuth.getInstance(); storageReference = FirebaseStorage.getInstance().getReference().child("images"); name = findViewById(R.id.name); email = findViewById(R.id.email); institute = findViewById(R.id.institute_name); dept = findViewById(R.id.dept_name); bio = findViewById(R.id.bioTv); deptT = findViewById(R.id.deptName); groupL = findViewById(R.id.lyGiftList); List levels = Arrays.asList(getResources().getStringArray(R.array.class_level)); List groups = Arrays.asList(getResources().getStringArray(R.array.hsc_group)); List zila = Arrays.asList(getResources().getStringArray(R.array.bd_districts)); spinner_class = findViewById(R.id.spinner_class_level); spinner_groups = findViewById(R.id.spinner_group); spinner_zila = findViewById(R.id.spinner_zila); ArrayAdapter spinnerArrayAdapter_type = new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, levels); spinner_class.setAdapter(spinnerArrayAdapter_type); ArrayAdapter spinnerArrayAdapter_groups = new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, groups); spinner_groups.setAdapter(spinnerArrayAdapter_groups); ArrayAdapter spinnerArrayAdapter_zila = new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, zila); spinner_zila.setAdapter(spinnerArrayAdapter_zila); userViewModel.user.observe(this, users -> { name.setText(users.getName()); institute.setText(users.getInstitute()); email.setText(users.getEmail()); setSpinText(spinner_zila, users.getLocation()); spinner_class.setSelection((int) users.getType()); type = (int) users.getType(); if (users.getType() == 1 || users.getType() == 2) { groupL.setVisibility(View.VISIBLE); setSpinText(spinner_groups, users.getDept()); } else { dept.setVisibility(View.VISIBLE); dept.setText(users.getDept()); } bio.setText(users.getBio()); Glide.with(this) .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_logo_icon)) .load(users.getImage()) .into(profile_image); profile_image.setOnLongClickListener(v -> { startActivity(new Intent(getApplicationContext(), ImagePreviewSave.class) .putExtra("url", users.getImage())); return false; }); }); findViewById(R.id.setPro).setOnClickListener(view -> updatePro()); spinner_class.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { public void onItemSelected(AdapterView parent, View view, int position, long id) { type = position; if (position == 0) { deptT.setVisibility(View.VISIBLE); groupL.setVisibility(View.GONE); } else if (position == 1 || position == 2) { deptT.setVisibility(View.GONE); groupL.setVisibility(View.VISIBLE); } else { deptT.setVisibility(View.GONE); groupL.setVisibility(View.GONE); } } public void onNothingSelected(AdapterView parent) { type = -1; } }); spinner_zila.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { public void onItemSelected(AdapterView parent, View view, int position, long id) { location_ = zila.get(position); } public void onNothingSelected(AdapterView parent) { location_ = ""; } }); spinner_groups.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { public void onItemSelected(AdapterView parent, View view, int position, long id) { dept_ = groups.get(position); } public void onNothingSelected(AdapterView parent) { dept_ = ""; } }); mDialog = new ProgressDialog(this); mDialog.setMessage("Please wait.."); mDialog.setIndeterminate(true); mDialog.setCanceledOnTouchOutside(false); mDialog.setCancelable(false); Button register = findViewById(R.id.button); profile_image = findViewById(R.id.profile_image); Fade fade = new Fade(); fade.excludeTarget(findViewById(R.id.layout), true); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { fade.excludeTarget(android.R.id.statusBarBackground, true); fade.excludeTarget(android.R.id.navigationBarBackground, true); getWindow().setEnterTransition(fade); getWindow().setExitTransition(fade); } register.setOnClickListener(view -> updateUser()); } private void updateUser() { Users users = new UserRepository(getApplication()).getUser(); final ProgressDialog dialog = new ProgressDialog(this); dialog.setIndeterminate(true); dialog.setCancelable(false); dialog.setCanceledOnTouchOutside(false); dialog.setMessage("Updating Details...."); final DocumentReference userDocument = FirebaseFirestore.getInstance().collection("Users").document(Objects.requireNonNull(mAuth.getUid())); /* if (!Objects.requireNonNull(email.getText()).toString().equals(users.getEmail())) { new MaterialDialog.Builder(this) .title("Email changed") .content("It seems that you have changed your email, re-enter your password to change.") .inputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD) .input("Password", "", new MaterialDialog.InputCallback() { @Override public void onInput(@NonNull MaterialDialog mdialog, CharSequence input) { if (!input.toString().equals("pass")) { dialog.dismiss(); mdialog.show(); Toasty.error(getApplicationContext(), "Invalid password", Toasty.LENGTH_SHORT, true).show(); } else { mdialog.dismiss(); final FirebaseUser currentuser = mAuth.getCurrentUser(); credential = EmailAuthProvider .getCredential(currentuser.getEmail(), input.toString()); currentuser.reauthenticate(credential) .addOnCompleteListener(new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { currentuser.updateEmail(email.getText().toString()).addOnCompleteListener(new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { if (task.isSuccessful()) { currentuser.sendEmailVerification().addOnSuccessListener(new OnSuccessListener() { @Override public void onSuccess(Void aVoid) { Map userMap = new HashMap<>(); userMap.put("email", email.getText().toString()); FirebaseFirestore.getInstance().collection("Users") .document(mAuth.getCurrentUser().getUid()) .update(userMap) .addOnSuccessListener(new OnSuccessListener() { @Override public void onSuccess(Void aVoid) { dialog.dismiss(); users.setEmail(email.getText().toString()); userViewModel.insert(users); Toasty.success(getApplicationContext(), "Verification email sent.", Toasty.LENGTH_SHORT, true).show(); dialog.dismiss(); } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { dialog.dismiss(); Log.e("Update", "failed: " + e.getLocalizedMessage()); } }); } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { dialog.dismiss(); Log.e("Error", e.getLocalizedMessage()); dialog.dismiss(); } }); } else { Log.e("Update email error", task.getException().getMessage() + ".."); dialog.dismiss(); } } }); } }); } } }) .positiveText("Done") .onPositive(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog mdialog, @NonNull DialogAction which) { dialog.show(); } }) .negativeText("Don't change my email") .onNegative(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog mdialog, @NonNull DialogAction which) { dialog.dismiss(); } }) .cancelable(false) .canceledOnTouchOutside(false) .show(); } */ dialog.show(); if (!name.getText().toString().equals(users.getName())) { users.setName(name.getText().toString()); users.setUsername(getNickName(name.getText().toString())); } if (!bio.getText().toString().equals(users.getBio())) { users.setBio(bio.getText().toString()); } if (!spinner_zila.getSelectedItem().toString().equals(users.getLocation())) { users.setLocation(spinner_zila.getSelectedItem().toString()); } if (!institute.getText().toString().equals(users.getInstitute())) { users.setInstitute(institute.getText().toString()); } type = spinner_class.getSelectedItemPosition(); Log.d("Level", String.valueOf(type)); users.setType(type); if (type == 2 || type == 3) { if (!spinner_groups.getSelectedItem().toString().equals(users.getDept())) { users.setDept(dept_); } } else { if (!dept.getText().toString().equals(users.getDept())) { users.setDept(dept.getText().toString()); } } userDocument.set(users).addOnCompleteListener(task -> { userViewModel.insert(users); Toasty.success(getApplicationContext(), "Successfully Updated", Toast.LENGTH_SHORT).show(); startActivity(new Intent(getApplicationContext(), MainActivity.class)); dialog.dismiss(); }).addOnFailureListener(e -> { Toasty.error(EditProfile.this, "Failed", Toast.LENGTH_SHORT).show(); dialog.dismiss(); }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(data!=null){ if (requestCode == PICK_IMAGE) { Uri imageUri = Objects.requireNonNull(data).getData(); UCrop.Options options = new UCrop.Options(); options.setCompressionFormat(Bitmap.CompressFormat.PNG); options.setCompressionQuality(36); options.setShowCropGrid(true); options.setCircleDimmedLayer(true); options.withAspectRatio(1,1); UCrop.of(Objects.requireNonNull(imageUri), Uri.fromFile(new File(this.getCacheDir(), "profile_image_boq" + System.currentTimeMillis() + ".png"))) .withOptions(options) .start(this, POST_IMAGE); } if (requestCode == POST_IMAGE) { Uri imageUri = UCrop.getOutput(data); Uri newImage = Uri.fromFile(new File(String.valueOf(imageUri))); profile_image.setImageURI(imageUri); final ProgressDialog mDialog = new ProgressDialog(this); mDialog.setIndeterminate(true); mDialog.setMessage("Updating..."); mDialog.setCancelable(false); mDialog.setCanceledOnTouchOutside(false); mDialog.show(); Toasty.info(getApplicationContext(), "Updating Image...", Toasty.LENGTH_LONG, true).show(); final StorageReference user_profile = FirebaseStorage.getInstance().getReference().child("images").child(userId + ".png"); user_profile.putFile(Objects.requireNonNull(newImage)).addOnCompleteListener(task -> { if (task.isSuccessful()) { final DocumentReference userDocument = FirebaseFirestore.getInstance().collection("Users").document(userId); user_profile.getDownloadUrl().addOnSuccessListener(uri -> { Map map = new HashMap<>(); map.put("image", uri.toString()); userDocument.update(map) .addOnSuccessListener(aVoid -> { userViewModel.updateUserImage(uri.toString()); mDialog.dismiss(); Toasty.success(getApplicationContext(), "Successfully changed Profile image", Toasty.LENGTH_LONG, true).show(); }) .addOnFailureListener(e -> mDialog.dismiss()); }).addOnFailureListener(e -> mDialog.dismiss()); } else { mDialog.dismiss(); Log.e("Error", "listen", task.getException()); } }); } } } public String getNickName(String fullname_) { String[] arr = fullname_.split(" ", 2); return arr[0]; } public void setSpinText(Spinner spin, String text) { for (int i = 0; i < spin.getAdapter().getCount(); i++) { if (spin.getAdapter().getItem(i).toString().contains(text)) { spin.setSelection(i); } } } public void skipNow(View view) { finish(); startActivity(new Intent(getApplicationContext(), MainActivity.class).setFlags(FLAG_ACTIVITY_NEW_TASK)); } private void updatePro() { Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, "Select Profile Picture"), PICK_IMAGE); } } \ No newline at end of file +package com.quantum_guys.dncc_eco_sync.ui.activities.account; import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; import static com.quantum_guys.dncc_eco_sync.ui.activities.MainActivity.userId; import android.Manifest; import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Bitmap; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.transition.Fade; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.Spinner; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatDelegate; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.lifecycle.ViewModelProviders; import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; import com.google.android.material.textfield.TextInputLayout; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.firestore.DocumentReference; import com.google.firebase.firestore.FirebaseFirestore; import com.google.firebase.storage.FirebaseStorage; import com.google.firebase.storage.StorageReference; import com.karumi.dexter.Dexter; import com.karumi.dexter.MultiplePermissionsReport; import com.karumi.dexter.PermissionToken; import com.karumi.dexter.listener.PermissionRequest; import com.karumi.dexter.listener.multi.MultiplePermissionsListener; import com.quantum_guys.dncc_eco_sync.R; import com.quantum_guys.dncc_eco_sync.models.Users; import com.quantum_guys.dncc_eco_sync.repository.UserRepository; import com.quantum_guys.dncc_eco_sync.ui.activities.MainActivity; import com.quantum_guys.dncc_eco_sync.ui.activities.notification.ImagePreviewSave; import com.quantum_guys.dncc_eco_sync.viewmodel.UserViewModel; import com.yalantis.ucrop.UCrop; import java.io.File; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import de.hdodenhof.circleimageview.CircleImageView; import es.dmoral.toasty.Toasty; public class EditProfile extends AppCompatActivity { private static final int PICK_IMAGE = 100; private static final int POST_IMAGE = 154; public int type = -1; public Uri imageUri = Uri.parse("android.resource://com.quantum_guys.dncc_eco_sync/" + R.drawable.logo_round); public StorageReference storageReference; public ProgressDialog mDialog; public String name_, email_, dept_, address_, gender_, ward_, number_; UserViewModel userViewModel; TextInputLayout deptT; ConstraintLayout groupL; Spinner spinner_genders; Spinner spinner_wards; Spinner spinner_zila; private FirebaseAuth mAuth; private EditText name, email, address, bio, number; private CircleImageView profile_image; private void askPermission() { Dexter.withActivity(this) .withPermissions( Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE ) .withListener(new MultiplePermissionsListener() { @Override public void onPermissionsChecked(MultiplePermissionsReport report) { // Toasty.info(RegisterActivity.this, "You have denied some permissions permanently, if the app force close try granting permission from settings.", Toasty.LENGTH_LONG, true).show(); } @Override public void onPermissionRationaleShouldBeShown(List permissions, PermissionToken token) { token.continuePermissionRequest(); } }) .check(); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SharedPreferences sharedPreferences = getSharedPreferences("Theme", Context.MODE_PRIVATE); String themeName = sharedPreferences.getString("ThemeName", "Default"); if (themeName.equalsIgnoreCase("TealTheme")) { setTheme(R.style.TealTheme); } else if (themeName.equalsIgnoreCase("VioleteTheme")) { setTheme(R.style.VioleteTheme); } else if (themeName.equalsIgnoreCase("PinkTheme")) { setTheme(R.style.PinkTheme); } else if (themeName.equalsIgnoreCase("DelRio")) { setTheme(R.style.DelRio); } else if (themeName.equalsIgnoreCase("DarkTheme")) { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); setTheme(R.style.Dark); } else if (themeName.equalsIgnoreCase("Lynch")) { setTheme(R.style.Lynch); } else { setTheme(R.style.AppTheme); } setContentView(R.layout.activity_edit_profile); askPermission(); userViewModel = ViewModelProviders.of(this).get(UserViewModel.class); mAuth = FirebaseAuth.getInstance(); storageReference = FirebaseStorage.getInstance().getReference().child("images"); name = findViewById(R.id.name); email = findViewById(R.id.email); number = findViewById(R.id.number); address = findViewById(R.id.address); bio = findViewById(R.id.bioTv); List wards = Arrays.asList(getResources().getStringArray(R.array.wards)); List genders = Arrays.asList(getResources().getStringArray(R.array.genders)); spinner_wards = findViewById(R.id.spinner_class_level); spinner_genders = findViewById(R.id.spinner_group); ArrayAdapter spinnerArrayAdapter_type = new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, wards); spinner_wards.setAdapter(spinnerArrayAdapter_type); ArrayAdapter spinnerArrayAdapter_groups = new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, genders); spinner_genders.setAdapter(spinnerArrayAdapter_groups); userViewModel.user.observe(this, this::onChanged); findViewById(R.id.setPro).setOnClickListener(view -> updatePro()); spinner_genders.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { public void onItemSelected(AdapterView parent, View view, int position, long id) { gender_ = genders.get(position); } public void onNothingSelected(AdapterView parent) { gender_ = ""; } }); spinner_wards.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { public void onItemSelected(AdapterView parent, View view, int position, long id) { ward_ = wards.get(position); } public void onNothingSelected(AdapterView parent) { ward_ = ""; } }); mDialog = new ProgressDialog(this); mDialog.setMessage("Please wait.."); mDialog.setIndeterminate(true); mDialog.setCanceledOnTouchOutside(false); mDialog.setCancelable(false); Button register = findViewById(R.id.button); profile_image = findViewById(R.id.profile_image); Fade fade = new Fade(); fade.excludeTarget(findViewById(R.id.layout), true); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { fade.excludeTarget(android.R.id.statusBarBackground, true); fade.excludeTarget(android.R.id.navigationBarBackground, true); getWindow().setEnterTransition(fade); getWindow().setExitTransition(fade); } register.setOnClickListener(view -> updateUser()); } private void updateUser() { Users users = new UserRepository(getApplication()).getUser(); final ProgressDialog dialog = new ProgressDialog(this); dialog.setIndeterminate(true); dialog.setCancelable(false); dialog.setCanceledOnTouchOutside(false); dialog.setMessage("Updating Details...."); final DocumentReference userDocument = FirebaseFirestore.getInstance().collection("Users").document(Objects.requireNonNull(mAuth.getUid())); dialog.show(); if (!name.getText().toString().equals(users.getName())) { users.setName(name.getText().toString()); users.setUsername(getNickName(name.getText().toString())); } if (!bio.getText().toString().equals(users.getBio())) { users.setBio(bio.getText().toString()); } if (!address.getText().toString().equals(users.getInstitute())) { users.setAddress(address.getText().toString()); } if (!number.getText().toString().equals(users.getInstitute())) { users.setName(number.getText().toString()); } userDocument.set(users).addOnCompleteListener(task -> { userViewModel.insert(users); Toasty.success(getApplicationContext(), "Successfully Updated", Toast.LENGTH_SHORT).show(); startActivity(new Intent(getApplicationContext(), MainActivity.class)); dialog.dismiss(); }).addOnFailureListener(e -> { Toasty.error(EditProfile.this, "Failed", Toast.LENGTH_SHORT).show(); dialog.dismiss(); }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(data!=null){ if (requestCode == PICK_IMAGE) { Uri imageUri = Objects.requireNonNull(data).getData(); UCrop.Options options = new UCrop.Options(); options.setCompressionFormat(Bitmap.CompressFormat.PNG); options.setCompressionQuality(36); options.setShowCropGrid(true); options.setCircleDimmedLayer(true); options.withAspectRatio(1,1); UCrop.of(Objects.requireNonNull(imageUri), Uri.fromFile(new File(this.getCacheDir(), "profile_image_boq" + System.currentTimeMillis() + ".png"))) .withOptions(options) .start(this, POST_IMAGE); } if (requestCode == POST_IMAGE) { Uri imageUri = UCrop.getOutput(data); Uri newImage = Uri.fromFile(new File(String.valueOf(imageUri))); profile_image.setImageURI(imageUri); final ProgressDialog mDialog = new ProgressDialog(this); mDialog.setIndeterminate(true); mDialog.setMessage("Updating..."); mDialog.setCancelable(false); mDialog.setCanceledOnTouchOutside(false); mDialog.show(); Toasty.info(getApplicationContext(), "Updating Image...", Toasty.LENGTH_LONG, true).show(); final StorageReference user_profile = FirebaseStorage.getInstance().getReference().child("images").child(userId + ".png"); user_profile.putFile(Objects.requireNonNull(newImage)).addOnCompleteListener(task -> { if (task.isSuccessful()) { final DocumentReference userDocument = FirebaseFirestore.getInstance().collection("Users").document(userId); user_profile.getDownloadUrl().addOnSuccessListener(uri -> { Map map = new HashMap<>(); map.put("image", uri.toString()); userDocument.update(map) .addOnSuccessListener(aVoid -> { userViewModel.updateUserImage(uri.toString()); mDialog.dismiss(); Toasty.success(getApplicationContext(), "Successfully changed Profile image", Toasty.LENGTH_LONG, true).show(); }) .addOnFailureListener(e -> mDialog.dismiss()); }).addOnFailureListener(e -> mDialog.dismiss()); } else { mDialog.dismiss(); Log.e("Error", "listen", task.getException()); } }); } } } public String getNickName(String fullname_) { String[] arr = fullname_.split(" ", 2); return arr[0]; } public void setSpinText(Spinner spin, String text) { for (int i = 0; i < spin.getAdapter().getCount(); i++) { if (spin.getAdapter().getItem(i).toString().contains(text)) { spin.setSelection(i); } } } public void skipNow(View view) { finish(); startActivity(new Intent(getApplicationContext(), MainActivity.class).setFlags(FLAG_ACTIVITY_NEW_TASK)); } private void updatePro() { Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, "Select Profile Picture"), PICK_IMAGE); } private void onChanged(Users users) { name.setText(users.getName()); address.setText(users.getAddress()); number.setText(users.getNumber()); email.setText(users.getEmail()); type = (int) users.getType(); bio.setText(users.getBio()); Glide.with(this) .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) .load(users.getImage()) .into(profile_image); profile_image.setOnLongClickListener(v -> { startActivity(new Intent(getApplicationContext(), ImagePreviewSave.class) .putExtra("url", users.getImage())); return false; }); } } \ No newline at end of file diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/account/LoginActivity.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/account/LoginActivity.java index 8ff13a9..d9562f0 100644 --- a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/account/LoginActivity.java +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/account/LoginActivity.java @@ -442,11 +442,17 @@ void createNew(FirebaseUser user) { } String dept = ""; String location = ""; - String bio = "Hi, I am a ত্বারক user"; - Users user1 = new Users(user.getUid(), 500, System.currentTimeMillis(), + String bio = ""; + Users user1 = new Users(user.getUid(), 100, System.currentTimeMillis(), 0, 0, 0, 100, 3, name, Objects.requireNonNull(image), institute, dept, email, bio, getNickName(name), location); + user1.setNumber(user.getPhoneNumber()); + user1.setAddress(""); + user1.setGender(""); + user1.setWard(""); + user1.setLat(0); + user1.setLon(0); FirebaseFirestore.getInstance().collection("Users").document(user.getUid()).set(user1).addOnCompleteListener(task -> { Intent intent = new Intent(getApplicationContext(), MainActivity.class).putExtra("sss", "sss"); diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/account/RegisterActivity.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/account/RegisterActivity.java index 5a0fe5c..d0daad9 100644 --- a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/account/RegisterActivity.java +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/account/RegisterActivity.java @@ -22,7 +22,6 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatDelegate; -import androidx.constraintlayout.widget.ConstraintLayout; import com.google.android.material.textfield.TextInputLayout; import com.google.firebase.auth.FirebaseAuth; @@ -34,10 +33,9 @@ import com.karumi.dexter.PermissionToken; import com.karumi.dexter.listener.PermissionRequest; import com.karumi.dexter.listener.multi.MultiplePermissionsListener; -import com.yalantis.ucrop.UCrop; - import com.quantum_guys.dncc_eco_sync.R; import com.quantum_guys.dncc_eco_sync.utils.AnimationUtil; +import com.yalantis.ucrop.UCrop; import java.io.File; import java.util.Arrays; @@ -54,12 +52,13 @@ public class RegisterActivity extends AppCompatActivity { private static final int PICK_IMAGE = 100; public int type = -1; - public Uri imageUri = Uri.parse("android.resource://com.quantum_guys.dncc_eco_sync/" + R.drawable.ic_logo); + public Uri imageUri = Uri.parse("android.resource://com.quantum_guys.dncc_eco_sync/" + R.drawable.logo); public StorageReference storageReference; public ProgressDialog mDialog; - public String name_, pass_, email_, institute_, dept_, location_; + public String name_, pass_, mobile_, email_, address_, ward_, gender_; + TextInputLayout deptT; - private EditText name, email, institute, dept, password; + private EditText name, email, institute, password, number, address; private CircleImageView profile_image; private FirebaseAuth mAuth; private FirebaseFirestore firebaseFirestore; @@ -124,72 +123,48 @@ protected void onCreate(Bundle savedInstanceState) { firebaseFirestore = FirebaseFirestore.getInstance(); name = findViewById(R.id.name); email = findViewById(R.id.email); - institute = findViewById(R.id.institute_name); - dept = findViewById(R.id.dept_name); + number = findViewById(R.id.number); + address = findViewById(R.id.address); password = findViewById(R.id.password); - deptT = findViewById(R.id.deptName); - ConstraintLayout groupL = findViewById(R.id.lyGiftList); - - List levels = Arrays.asList(getResources().getStringArray(R.array.class_level)); - List groups = Arrays.asList(getResources().getStringArray(R.array.hsc_group)); - List zila = Arrays.asList(getResources().getStringArray(R.array.bd_districts)); + + List wards = Arrays.asList(getResources().getStringArray(R.array.wards)); + List genders = Arrays.asList(getResources().getStringArray(R.array.genders)); Spinner spinner_class = findViewById(R.id.spinner_class_level); - Spinner spinner_groups = findViewById(R.id.spinner_group); - Spinner spinner_zila = findViewById(R.id.spinner_zila); - + Spinner spinner_groups = findViewById(R.id.spinner_group); + ArrayAdapter spinnerArrayAdapter_type = new ArrayAdapter<>(this, - android.R.layout.simple_spinner_dropdown_item, levels); + android.R.layout.simple_spinner_dropdown_item, wards); spinner_class.setAdapter(spinnerArrayAdapter_type); ArrayAdapter spinnerArrayAdapter_groups = new ArrayAdapter<>(this, - android.R.layout.simple_spinner_dropdown_item, groups); + android.R.layout.simple_spinner_dropdown_item, genders); spinner_groups.setAdapter(spinnerArrayAdapter_groups); - ArrayAdapter spinnerArrayAdapter_zila = new ArrayAdapter<>(this, - android.R.layout.simple_spinner_dropdown_item, zila); - spinner_zila.setAdapter(spinnerArrayAdapter_zila); - - - spinner_class.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - public void onItemSelected(AdapterView parent, View view, int position, long id) { - type = position; - if (position == 0) { - deptT.setVisibility(View.VISIBLE); - groupL.setVisibility(View.GONE); - } else if (position == 1 || position == 2) { - deptT.setVisibility(View.GONE); - groupL.setVisibility(View.VISIBLE); - } else { - deptT.setVisibility(View.GONE); - groupL.setVisibility(View.GONE); - } - } + + - public void onNothingSelected(AdapterView parent) { - type = -1; - } - }); + - spinner_zila.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + spinner_groups.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { public void onItemSelected(AdapterView parent, View view, int position, long id) { - location_ = zila.get(position); + gender_ = genders.get(position); } public void onNothingSelected(AdapterView parent) { - location_ = ""; + gender_ = ""; } }); - spinner_groups.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + spinner_class.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { public void onItemSelected(AdapterView parent, View view, int position, long id) { - dept_ = groups.get(position); + ward_ = wards.get(position); } public void onNothingSelected(AdapterView parent) { - dept_ = ""; + ward_ = ""; } }); @@ -215,8 +190,7 @@ public void onNothingSelected(AdapterView parent) { register.setOnClickListener(view -> { name_ = name.getText().toString(); - institute_ = institute.getText().toString(); - dept_ = dept.getText().toString(); + address_ = institute.getText().toString(); email_ = email.getText().toString(); pass_ = password.getText().toString(); mDialog.show(); @@ -279,14 +253,14 @@ private void registerUser() { Map userMap = new HashMap<>(); userMap.put("id", userUid); userMap.put("name", name_); - userMap.put("institute", institute_); - userMap.put("dept", dept_); + userMap.put("address", address_); userMap.put("image", uri.toString()); userMap.put("email", email_); + userMap.put("gender", gender_); + userMap.put("ward", ward_); userMap.put("bio", getString(R.string.default_bio)); userMap.put("username", getNickName(name_)); - userMap.put("location", location_); - userMap.put("score", 500); + userMap.put("score", 100); userMap.put("win", 0); userMap.put("lose", 0); userMap.put("draw", 0); @@ -333,7 +307,7 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { options.setCompressionQuality(70); options.setShowCropGrid(true); - UCrop.of(imageUri, Uri.fromFile(new File(getCacheDir(), "study_forum_user_profile_picture.png"))) + UCrop.of(imageUri, Uri.fromFile(new File(getCacheDir(), "dncc_user_profile_picture.png"))) .withAspectRatio(1, 1) .withOptions(options) .start(this); diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/friends/FriendProfile.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/friends/FriendProfile.java index 82be2f4..0b44018 100644 --- a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/friends/FriendProfile.java +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/friends/FriendProfile.java @@ -309,7 +309,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, } Glide.with(requireActivity()) - .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_logo)) + .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) .load(friend_image) .into(profile_pic); } catch (NullPointerException ignored) { @@ -971,7 +971,7 @@ public boolean onOptionsItemSelected(MenuItem item) { } }else if(item.getItemId() == R.id.copy){ if(id!=null && namee != null && imagee != null) { - String text = "https://tarok.tech/user/"+id; + String text = "http://3.208.28.247:3000/user/"+id; setClipboard(getApplicationContext(), text); } } diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/notification/ImagePreviewSave.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/notification/ImagePreviewSave.java index d62284d..1887819 100644 --- a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/notification/ImagePreviewSave.java +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/notification/ImagePreviewSave.java @@ -67,7 +67,7 @@ public void onReceive(Context ctxt, Intent intent) { android.app.Notification notification; notification = mBuilder .setAutoCancel(true) - .setContentTitle("ত্বারক") + .setContentTitle("স্বচ্ছ ঢাকা") .setColorized(true) .setColor(Color.parseColor("#2591FC")) .setSmallIcon(R.drawable.ic_file_download_accent_24dp) @@ -198,7 +198,7 @@ private void downloadImage(final String ImageURI) { DownloadManager.Request request = new DownloadManager.Request(Uri.parse(ImageURI)); request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE); request.setAllowedOverRoaming(true); - request.setTitle("ত্বারক"); + request.setTitle("স্বচ্ছ ঢাকা"); request.setDescription("Downloading image..."); request.setVisibleInDownloadsUi(true); request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "/battle_of_quiz Images/" + "/dt_" + System.currentTimeMillis() + ".jpeg"); diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/post/CommentsActivity.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/post/CommentsActivity.java index e26f439..5b8d724 100644 --- a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/post/CommentsActivity.java +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/post/CommentsActivity.java @@ -1,5 +1,6 @@ package com.quantum_guys.dncc_eco_sync.ui.activities.post; +import static com.quantum_guys.dncc_eco_sync.ui.activities.MainActivity.ADMIN_UID_LIST; import static com.quantum_guys.dncc_eco_sync.ui.activities.post.PostText.getSaltString; import android.annotation.SuppressLint; @@ -88,10 +89,7 @@ @RequiresApi(api = Build.VERSION_CODES.R) public class CommentsActivity extends AppCompatActivity { - @SuppressLint("NewApi") - private final Set ADMIN_UID_LIST = Set.of( - "0h9MvJiFvFWRBiOoHzUcGlqJe2m2", "eSW24hxmW6YmbaInd2OlrsWx0Rw1" - ); + String user_id, post_id; MathView post_desc; TextView likeCount, saveCount; @@ -292,7 +290,7 @@ void setUpData(Post post){ getComments(mProgress); Glide.with(getApplicationContext()) - .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_logo)) + .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) .load(me.getImage()) .into(myImage); } @@ -382,7 +380,7 @@ public void run() { .document(user_id) .get() .addOnSuccessListener(documentSnapshot -> Glide.with(getApplicationContext()) - .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_logo)) + .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) .load(documentSnapshot.getString("image")) .into(user_image)) .addOnFailureListener(e -> Log.e("error", e.getLocalizedMessage())); diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/post/WhoLikedActivity.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/post/WhoLikedActivity.java index 82d083f..69c3ddd 100644 --- a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/post/WhoLikedActivity.java +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/post/WhoLikedActivity.java @@ -1 +1 @@ -package com.quantum_guys.dncc_eco_sync.ui.activities.post; import static com.quantum_guys.dncc_eco_sync.ui.activities.MainActivity.userId; import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.transition.Explode; import android.transition.Fade; import android.util.AndroidRuntimeException; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatDelegate; import androidx.appcompat.widget.Toolbar; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; import com.google.firebase.firestore.DocumentChange; import com.google.firebase.firestore.FirebaseFirestore; import com.quantum_guys.dncc_eco_sync.R; import com.quantum_guys.dncc_eco_sync.models.Player; import com.quantum_guys.dncc_eco_sync.ui.activities.friends.FriendProfile; import java.util.ArrayList; import java.util.List; import es.dmoral.toasty.Toasty; public class WhoLikedActivity extends AppCompatActivity { @SuppressLint({"CheckResult", "NotifyDataSetChanged"}) @Override protected void onCreate(Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS); getWindow().setEnterTransition(new Explode()); getWindow().setExitTransition(new Fade()); super.onCreate(savedInstanceState); SharedPreferences sharedPreferences = getSharedPreferences("Theme", Context.MODE_PRIVATE); String themeName = sharedPreferences.getString("ThemeName", "Default"); if (themeName.equalsIgnoreCase("TealTheme")) { setTheme(R.style.TealTheme); } else if (themeName.equalsIgnoreCase("VioleteTheme")) { setTheme(R.style.VioleteTheme); } else if (themeName.equalsIgnoreCase("PinkTheme")) { setTheme(R.style.PinkTheme); } else if (themeName.equalsIgnoreCase("DelRio")) { setTheme(R.style.DelRio); } else if (themeName.equalsIgnoreCase("DarkTheme")) { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); setTheme(R.style.Dark); } else if (themeName.equalsIgnoreCase("Lynch")) { setTheme(R.style.Lynch); } else { setTheme(R.style.AppTheme); } setContentView(R.layout.activity_who_liked); Toolbar toolbar = findViewById(R.id.toolbar3); ProgressBar loading = findViewById(R.id.progressBar4); RecyclerView recyclerView = findViewById(R.id.liked_list); RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext()); recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext())); recyclerView.setLayoutManager(layoutManager); recyclerView.setHasFixedSize(true); String postId = getIntent().getStringExtra("postId"); String type = getIntent().getStringExtra("type"); List playerList = new ArrayList<>(); if (type.equals("Liked_Users")) { toolbar.setTitle("people who Liked this post"); } else { toolbar.setTitle("people who Saved this post"); } try { FirebaseFirestore.getInstance().collection("Posts") .document(postId) .collection(type) .get() .addOnSuccessListener(queryDocumentSnapshots -> { for (final DocumentChange doc : queryDocumentSnapshots.getDocumentChanges()) { FirebaseFirestore.getInstance().collection("Users") .document(doc.getDocument().getId()) .get() .addOnSuccessListener(documentSnapshot -> { try { Player player = new Player(doc.getDocument().getId(), documentSnapshot.getString("name"), documentSnapshot.getString("image"), documentSnapshot.getLong("score"), documentSnapshot.getLong("lastTimestamp")); playerList.add(player); UserAdapterw jhu = new UserAdapterw(playerList, getApplicationContext()); recyclerView.setAdapter(jhu); jhu.notifyDataSetChanged(); loading.setVisibility(View.GONE); } catch (NullPointerException ignored) { } }); } }); } catch (NullPointerException ignored) { Toasty.error(getApplicationContext(), "Failed to load", Toasty.LENGTH_LONG, false); } } } class UserAdapterw extends RecyclerView.Adapter { private final List playerList; private final Context context; private String check, otherUid; public UserAdapterw(List playerList, Context context) { this.playerList = playerList; this.context = context; } @NonNull @Override public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_user_liked, viewGroup, false); return new MyViewHolder(view); } @SuppressLint("SetTextI18n") @Override public void onBindViewHolder(@NonNull MyViewHolder viewHolder, int i) { try { final Player player = playerList.get(i); if (!player.getId().equals(userId)) { viewHolder.nameTV.setText(player.getName()); } else { viewHolder.nameTV.setText("You"); } viewHolder.levelTv.setText(String.valueOf(getLevelNum((int) player.getScore()))); viewHolder.itemView.setOnClickListener(view -> { if (!player.getId().equals(userId)) { context.startActivity(new Intent(context, FriendProfile.class).putExtra("f_id", player.getId()).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); } }); Glide.with(context) .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_logo)) .load(player.getImage()) .into(viewHolder.image); } catch (AndroidRuntimeException ignored) { } } @Override public int getItemCount() { return playerList.size(); } public Integer getLevelNum(int score) { final int level; if (score <= 500) { level = 1; } else if (score <= 1000) { level = 2; } else if (score <= 1500) { level = 3; } else if (score <= 2000) { level = 4; } else if (score <= 2500) { level = 5; } else if (score <= 3500) { level = 6; } else if (score <= 5000) { level = 7; } else { level = -1; } return level; } public static class MyViewHolder extends RecyclerView.ViewHolder { final TextView nameTV; final ImageView image; final TextView levelTv; public MyViewHolder(View itemView) { super(itemView); nameTV = itemView.findViewById(R.id.name); image = itemView.findViewById(R.id.image); levelTv = itemView.findViewById(R.id.levelTv); } } } \ No newline at end of file +package com.quantum_guys.dncc_eco_sync.ui.activities.post; import static com.quantum_guys.dncc_eco_sync.ui.activities.MainActivity.userId; import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.transition.Explode; import android.transition.Fade; import android.util.AndroidRuntimeException; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatDelegate; import androidx.appcompat.widget.Toolbar; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; import com.google.firebase.firestore.DocumentChange; import com.google.firebase.firestore.FirebaseFirestore; import com.quantum_guys.dncc_eco_sync.R; import com.quantum_guys.dncc_eco_sync.models.Player; import com.quantum_guys.dncc_eco_sync.ui.activities.friends.FriendProfile; import java.util.ArrayList; import java.util.List; import es.dmoral.toasty.Toasty; public class WhoLikedActivity extends AppCompatActivity { @SuppressLint({"CheckResult", "NotifyDataSetChanged"}) @Override protected void onCreate(Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS); getWindow().setEnterTransition(new Explode()); getWindow().setExitTransition(new Fade()); super.onCreate(savedInstanceState); SharedPreferences sharedPreferences = getSharedPreferences("Theme", Context.MODE_PRIVATE); String themeName = sharedPreferences.getString("ThemeName", "Default"); if (themeName.equalsIgnoreCase("TealTheme")) { setTheme(R.style.TealTheme); } else if (themeName.equalsIgnoreCase("VioleteTheme")) { setTheme(R.style.VioleteTheme); } else if (themeName.equalsIgnoreCase("PinkTheme")) { setTheme(R.style.PinkTheme); } else if (themeName.equalsIgnoreCase("DelRio")) { setTheme(R.style.DelRio); } else if (themeName.equalsIgnoreCase("DarkTheme")) { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); setTheme(R.style.Dark); } else if (themeName.equalsIgnoreCase("Lynch")) { setTheme(R.style.Lynch); } else { setTheme(R.style.AppTheme); } setContentView(R.layout.activity_who_liked); Toolbar toolbar = findViewById(R.id.toolbar3); ProgressBar loading = findViewById(R.id.progressBar4); RecyclerView recyclerView = findViewById(R.id.liked_list); RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext()); recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext())); recyclerView.setLayoutManager(layoutManager); recyclerView.setHasFixedSize(true); String postId = getIntent().getStringExtra("postId"); String type = getIntent().getStringExtra("type"); List playerList = new ArrayList<>(); if (type.equals("Liked_Users")) { toolbar.setTitle("people who Liked this post"); } else { toolbar.setTitle("people who Saved this post"); } try { FirebaseFirestore.getInstance().collection("Posts") .document(postId) .collection(type) .get() .addOnSuccessListener(queryDocumentSnapshots -> { for (final DocumentChange doc : queryDocumentSnapshots.getDocumentChanges()) { FirebaseFirestore.getInstance().collection("Users") .document(doc.getDocument().getId()) .get() .addOnSuccessListener(documentSnapshot -> { try { Player player = new Player(doc.getDocument().getId(), documentSnapshot.getString("name"), documentSnapshot.getString("image"), documentSnapshot.getLong("score"), documentSnapshot.getLong("lastTimestamp")); playerList.add(player); UserAdapterw jhu = new UserAdapterw(playerList, getApplicationContext()); recyclerView.setAdapter(jhu); jhu.notifyDataSetChanged(); loading.setVisibility(View.GONE); } catch (NullPointerException ignored) { } }); } }); } catch (NullPointerException ignored) { Toasty.error(getApplicationContext(), "Failed to load", Toasty.LENGTH_LONG, false); } } } class UserAdapterw extends RecyclerView.Adapter { private final List playerList; private final Context context; private String check, otherUid; public UserAdapterw(List playerList, Context context) { this.playerList = playerList; this.context = context; } @NonNull @Override public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_user_liked, viewGroup, false); return new MyViewHolder(view); } @SuppressLint("SetTextI18n") @Override public void onBindViewHolder(@NonNull MyViewHolder viewHolder, int i) { try { final Player player = playerList.get(i); if (!player.getId().equals(userId)) { viewHolder.nameTV.setText(player.getName()); } else { viewHolder.nameTV.setText("You"); } viewHolder.levelTv.setText(String.valueOf(getLevelNum((int) player.getScore()))); viewHolder.itemView.setOnClickListener(view -> { if (!player.getId().equals(userId)) { context.startActivity(new Intent(context, FriendProfile.class).putExtra("f_id", player.getId()).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); } }); Glide.with(context) .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) .load(player.getImage()) .into(viewHolder.image); } catch (AndroidRuntimeException ignored) { } } @Override public int getItemCount() { return playerList.size(); } public Integer getLevelNum(int score) { final int level; if (score <= 500) { level = 1; } else if (score <= 1000) { level = 2; } else if (score <= 1500) { level = 3; } else if (score <= 2000) { level = 4; } else if (score <= 2500) { level = 5; } else if (score <= 3500) { level = 6; } else if (score <= 5000) { level = 7; } else { level = -1; } return level; } public static class MyViewHolder extends RecyclerView.ViewHolder { final TextView nameTV; final ImageView image; final TextView levelTv; public MyViewHolder(View itemView) { super(itemView); nameTV = itemView.findViewById(R.id.name); image = itemView.findViewById(R.id.image); levelTv = itemView.findViewById(R.id.levelTv); } } } \ No newline at end of file diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/quiz/PlayQuiz.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/quiz/PlayQuiz.java index ffba373..4e8cd91 100644 --- a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/quiz/PlayQuiz.java +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/quiz/PlayQuiz.java @@ -132,7 +132,7 @@ protected void onBindViewHolder(@NonNull PlayerAdapter.ViewHolder holder, int po int score = (int) user.getScore(); holder.level.setText(String.valueOf(score)); Glide.with(Objects.requireNonNull(getContext())) - .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_logo_icon)) + .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) .load(user.getImage()) .into(holder.image); diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/quiz/QuizBattle.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/quiz/QuizBattle.java index 3ef8a9a..b913d54 100644 --- a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/quiz/QuizBattle.java +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/quiz/QuizBattle.java @@ -181,7 +181,7 @@ private void playQuestion(final View view, final int value, final String data) { if (list.get(position).getImg().length() > 10) { mcqImg.setVisibility(View.VISIBLE); Glide.with(getApplicationContext()) - .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_main_logo_png)) + .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) .load(list.get(position).getImg()) .into(mcqImg); } else { @@ -949,7 +949,7 @@ private void setUserData(ImageView proPic, TextView name, TextView level, String name.setText(MyName); setLevelByScore(level, (int) user.getScore()); Glide.with(getApplicationContext()) - .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_logo)) + .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) .load(MyImage) .into(proPic); } else { @@ -962,7 +962,7 @@ private void setUserData(ImageView proPic, TextView name, TextView level, String setLevelByScore(level, Integer.parseInt(String.valueOf(documentSnapshot.getLong("score")))); hisImage = documentSnapshot.getString("image"); Glide.with(getApplicationContext()) - .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_logo)) + .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) .load(hisImage) .into(proPic); }); diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/quiz/Ranking.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/quiz/Ranking.java index 7502054..ff9c362 100644 --- a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/quiz/Ranking.java +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/quiz/Ranking.java @@ -1 +1 @@ -package com.quantum_guys.dncc_eco_sync.ui.activities.quiz; import static com.quantum_guys.dncc_eco_sync.ui.activities.MainActivity.userId; import android.annotation.SuppressLint; import android.graphics.Color; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProviders; import androidx.paging.PagedList; import androidx.recyclerview.widget.DefaultItemAnimator; import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; import com.firebase.ui.firestore.paging.FirestorePagingAdapter; import com.firebase.ui.firestore.paging.FirestorePagingOptions; import com.firebase.ui.firestore.paging.LoadingState; import com.github.marlonlom.utilities.timeago.TimeAgo; import com.google.android.material.chip.Chip; import com.google.android.material.chip.ChipGroup; import com.google.firebase.firestore.FirebaseFirestore; import com.google.firebase.firestore.Query; import com.quantum_guys.dncc_eco_sync.R; import com.quantum_guys.dncc_eco_sync.ui.activities.friends.FriendProfile; import com.quantum_guys.dncc_eco_sync.viewmodel.UserViewModel; import java.util.Objects; import de.hdodenhof.circleimageview.CircleImageView; /** * Created by jhm69 */ public class Ranking extends Fragment { String institu, area, sub, typ; String tag = "All"; private FirebaseFirestore firestore; long t; private RecyclerView mRecyclerView; private SwipeRefreshLayout refreshLayout; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.ranking, container, false); } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); firestore = FirebaseFirestore.getInstance(); mRecyclerView = view.findViewById(R.id.messageList); refreshLayout = view.findViewById(R.id.refreshLayout); UserViewModel userViewModel = ViewModelProviders.of(requireActivity()).get(UserViewModel.class); Chip location = view.findViewById(R.id.location); Chip institute = view.findViewById(R.id.sub); Chip subject = view.findViewById(R.id.institute); Chip type = view.findViewById(R.id.type); userViewModel.user.observe(getActivity(), users -> { area = users.getLocation(); t = users.getType(); typ = getType(t); institu = users.getInstitute(); sub = users.getDept(); if (area.equals("")) { location.setVisibility(View.GONE); } else { location.setText(area); } if (sub.equals("")) { subject.setVisibility(View.GONE); } else { subject.setText(sub); } if (institu.equals("")) { institute.setVisibility(View.GONE); } else { institute.setText(institu); } if (typ.equals("")) { type.setVisibility(View.GONE); } else { type.setText(typ); } }); mRecyclerView.setItemAnimator(new DefaultItemAnimator()); mRecyclerView.setLayoutManager(new LinearLayoutManager(view.getContext())); mRecyclerView.setHasFixedSize(true); mRecyclerView.addItemDecoration(new DividerItemDecoration(view.getContext(), DividerItemDecoration.VERTICAL)); setupAdapter(tag); ChipGroup chipGroup = view.findViewById(R.id.filter_chip_SS_group); chipGroup.setOnCheckedChangeListener((group, checkedId) -> { try { Chip c = view.findViewById(checkedId); tag = c.getText().toString(); setupAdapter(tag); } catch (NullPointerException ignored) { } }); refreshLayout.setOnRefreshListener(() -> setupAdapter(tag)); } private void setupAdapter(String tag) { PagedList.Config config = new PagedList.Config.Builder() .setEnablePlaceholders(false) .setPrefetchDistance(5) .setPageSize(10) .build(); Query mQuery = firestore.collection("Users") .orderBy("score", Query.Direction.DESCENDING); if (tag.equals("All")) { mQuery = firestore.collection("Users") .orderBy("score", Query.Direction.DESCENDING); } else if (tag.equals(typ)) { mQuery = firestore.collection("Users").whereEqualTo("type", t) .orderBy("score", Query.Direction.DESCENDING); } else if (tag.equals(area)) { mQuery = firestore.collection("Users") .orderBy("score", Query.Direction.DESCENDING).whereEqualTo("location", area); } else if (tag.equals(institu)) { mQuery = firestore.collection("Users") .orderBy("score", Query.Direction.DESCENDING).whereEqualTo("institute", institu); } else if (tag.equals(sub)) { mQuery = firestore.collection("Users") .orderBy("score", Query.Direction.DESCENDING).whereEqualTo("dept", sub); } FirestorePagingOptions options = new FirestorePagingOptions.Builder() .setLifecycleOwner(this) .setQuery(mQuery, config, Player.class) .build(); FirestorePagingAdapter mAdapter = new FirestorePagingAdapter(options) { @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = getLayoutInflater().inflate(R.layout.item_quiz_profile, parent, false); return new ViewHolder(view); } @SuppressLint({"SetTextI18n", "UseCompatLoadingForColorStateLists"}) @Override protected void onBindViewHolder(@NonNull ViewHolder holder, int position, @NonNull Player user) { requireView().findViewById(R.id.default_item).setVisibility(View.GONE); holder.name.setText(user.getName()); // if(user.getDept().length() > 1 && user.getInstitute().length() > 1) { // holder.institute.setText(user.getDept() + ", " + user.getInstitute()); // }else if (user.getDept().length()<2) { // holder.institute.setText(user.getInstitute()); // } else if (user.getInstitute().length()<2) { // holder.institute.setText(user.getDept()); // } // if(user.getDept().length()<1 && user.getInstitute().length() < 1){ // holder.institute.setVisibility(View.GONE); // } int score = (int) user.getScore(); holder.rank.setVisibility(View.VISIBLE); holder.level.setText(String.valueOf(score)); if (user.getId().equals(userId)) { holder.name.setText("You"); holder.back.setBackgroundColor(Color.parseColor("#DCDCFB")); }else{ holder.back.setBackgroundColor(Color.parseColor("#ffffff")); } holder.time.setText(getTimeText(user.getLastTimestamp())); holder.rank.setText(String.valueOf(position + 1)); Glide.with(requireContext()) .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_logo)) .load(user.getImage()) .into(holder.image); holder.mView.setOnClickListener(view -> FriendProfile.startActivity(getContext(), user.getId())); } @Override protected void onError(@NonNull Exception e) { super.onError(e); Log.e("MainActivity", e.getMessage()); } @Override protected void onLoadingStateChanged(@NonNull LoadingState state) { switch (state) { case LOADING_INITIAL: case LOADING_MORE: refreshLayout.setRefreshing(true); break; case LOADED: if (getItemCount() == 0) { requireView().findViewById(R.id.default_item).setVisibility(View.VISIBLE); } refreshLayout.setRefreshing(false); break; case ERROR: Toast.makeText( getActivity(), "Error Occurred!", Toast.LENGTH_SHORT ).show(); refreshLayout.setRefreshing(false); break; case FINISHED: refreshLayout.setRefreshing(false); break; } } }; mRecyclerView.setAdapter(mAdapter); } private String getTimeText(long lastTimestamp) { String time = TimeAgo.using(lastTimestamp); time = time.replaceAll("just now", "now") .replaceAll(" minutes", "m") .replaceAll(" minute", "1m") .replaceAll("about", "") .replaceAll(" hours", "h") .replaceAll(" hour", "1h") .replaceAll(" an", "") .replaceAll("a ", "1 ") .replaceAll(" ago", "") .replaceAll("yesterday", "1d") .replaceAll(" days", "d") .replaceAll(" day", "1d"); return time; } public static class ViewHolder extends RecyclerView.ViewHolder { final View mView; final CircleImageView image; final TextView name; final TextView institute; final TextView level; final TextView rank, time; final ConstraintLayout back; public ViewHolder(View itemView) { super(itemView); mView = itemView; image = mView.findViewById(R.id.image); name = mView.findViewById(R.id.name); institute = mView.findViewById(R.id.institute); level = mView.findViewById(R.id.levelCount); rank = mView.findViewById(R.id.rank); back = mView.findViewById(R.id.back); time = mView.findViewById(R.id.textView4); } } String getType(long t) { if (t == 0) return "bsc"; if (t == 1) return "hsc"; if (t == 2) return "ssc"; else return "bsc"; } } \ No newline at end of file +package com.quantum_guys.dncc_eco_sync.ui.activities.quiz; import static com.quantum_guys.dncc_eco_sync.ui.activities.MainActivity.userId; import android.annotation.SuppressLint; import android.graphics.Color; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProviders; import androidx.paging.PagedList; import androidx.recyclerview.widget.DefaultItemAnimator; import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; import com.firebase.ui.firestore.paging.FirestorePagingAdapter; import com.firebase.ui.firestore.paging.FirestorePagingOptions; import com.firebase.ui.firestore.paging.LoadingState; import com.github.marlonlom.utilities.timeago.TimeAgo; import com.google.android.material.chip.Chip; import com.google.android.material.chip.ChipGroup; import com.google.firebase.firestore.FirebaseFirestore; import com.google.firebase.firestore.Query; import com.quantum_guys.dncc_eco_sync.R; import com.quantum_guys.dncc_eco_sync.ui.activities.friends.FriendProfile; import com.quantum_guys.dncc_eco_sync.viewmodel.UserViewModel; import java.util.Objects; import de.hdodenhof.circleimageview.CircleImageView; /** * Created by jhm69 */ public class Ranking extends Fragment { String institu, area, sub, typ; String tag = "All"; private FirebaseFirestore firestore; long t; private RecyclerView mRecyclerView; private SwipeRefreshLayout refreshLayout; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.ranking, container, false); } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); firestore = FirebaseFirestore.getInstance(); mRecyclerView = view.findViewById(R.id.messageList); refreshLayout = view.findViewById(R.id.refreshLayout); UserViewModel userViewModel = ViewModelProviders.of(requireActivity()).get(UserViewModel.class); Chip location = view.findViewById(R.id.location); Chip institute = view.findViewById(R.id.sub); Chip subject = view.findViewById(R.id.institute); Chip type = view.findViewById(R.id.type); userViewModel.user.observe(getActivity(), users -> { area = users.getLocation(); t = users.getType(); typ = getType(t); institu = users.getInstitute(); sub = users.getDept(); if (area.equals("")) { location.setVisibility(View.GONE); } else { location.setText(area); } if (sub.equals("")) { subject.setVisibility(View.GONE); } else { subject.setText(sub); } if (institu.equals("")) { institute.setVisibility(View.GONE); } else { institute.setText(institu); } if (typ.equals("")) { type.setVisibility(View.GONE); } else { type.setText(typ); } }); mRecyclerView.setItemAnimator(new DefaultItemAnimator()); mRecyclerView.setLayoutManager(new LinearLayoutManager(view.getContext())); mRecyclerView.setHasFixedSize(true); mRecyclerView.addItemDecoration(new DividerItemDecoration(view.getContext(), DividerItemDecoration.VERTICAL)); setupAdapter(tag); ChipGroup chipGroup = view.findViewById(R.id.filter_chip_SS_group); chipGroup.setOnCheckedChangeListener((group, checkedId) -> { try { Chip c = view.findViewById(checkedId); tag = c.getText().toString(); setupAdapter(tag); } catch (NullPointerException ignored) { } }); refreshLayout.setOnRefreshListener(() -> setupAdapter(tag)); } private void setupAdapter(String tag) { PagedList.Config config = new PagedList.Config.Builder() .setEnablePlaceholders(false) .setPrefetchDistance(5) .setPageSize(10) .build(); Query mQuery = firestore.collection("Users") .orderBy("score", Query.Direction.DESCENDING); if (tag.equals("All")) { mQuery = firestore.collection("Users") .orderBy("score", Query.Direction.DESCENDING); } else if (tag.equals(typ)) { mQuery = firestore.collection("Users").whereEqualTo("type", t) .orderBy("score", Query.Direction.DESCENDING); } else if (tag.equals(area)) { mQuery = firestore.collection("Users") .orderBy("score", Query.Direction.DESCENDING).whereEqualTo("location", area); } else if (tag.equals(institu)) { mQuery = firestore.collection("Users") .orderBy("score", Query.Direction.DESCENDING).whereEqualTo("institute", institu); } else if (tag.equals(sub)) { mQuery = firestore.collection("Users") .orderBy("score", Query.Direction.DESCENDING).whereEqualTo("dept", sub); } FirestorePagingOptions options = new FirestorePagingOptions.Builder() .setLifecycleOwner(this) .setQuery(mQuery, config, Player.class) .build(); FirestorePagingAdapter mAdapter = new FirestorePagingAdapter(options) { @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = getLayoutInflater().inflate(R.layout.item_quiz_profile, parent, false); return new ViewHolder(view); } @SuppressLint({"SetTextI18n", "UseCompatLoadingForColorStateLists"}) @Override protected void onBindViewHolder(@NonNull ViewHolder holder, int position, @NonNull Player user) { requireView().findViewById(R.id.default_item).setVisibility(View.GONE); holder.name.setText(user.getName()); // if(user.getDept().length() > 1 && user.getInstitute().length() > 1) { // holder.institute.setText(user.getDept() + ", " + user.getInstitute()); // }else if (user.getDept().length()<2) { // holder.institute.setText(user.getInstitute()); // } else if (user.getInstitute().length()<2) { // holder.institute.setText(user.getDept()); // } // if(user.getDept().length()<1 && user.getInstitute().length() < 1){ // holder.institute.setVisibility(View.GONE); // } int score = (int) user.getScore(); holder.rank.setVisibility(View.VISIBLE); holder.level.setText(String.valueOf(score)); if (user.getId().equals(userId)) { holder.name.setText("You"); holder.back.setBackgroundColor(Color.parseColor("#DCDCFB")); }else{ holder.back.setBackgroundColor(Color.parseColor("#ffffff")); } holder.time.setText(getTimeText(user.getLastTimestamp())); holder.rank.setText(String.valueOf(position + 1)); Glide.with(requireContext()) .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) .load(user.getImage()) .into(holder.image); holder.mView.setOnClickListener(view -> FriendProfile.startActivity(getContext(), user.getId())); } @Override protected void onError(@NonNull Exception e) { super.onError(e); Log.e("MainActivity", e.getMessage()); } @Override protected void onLoadingStateChanged(@NonNull LoadingState state) { switch (state) { case LOADING_INITIAL: case LOADING_MORE: refreshLayout.setRefreshing(true); break; case LOADED: if (getItemCount() == 0) { requireView().findViewById(R.id.default_item).setVisibility(View.VISIBLE); } refreshLayout.setRefreshing(false); break; case ERROR: Toast.makeText( getActivity(), "Error Occurred!", Toast.LENGTH_SHORT ).show(); refreshLayout.setRefreshing(false); break; case FINISHED: refreshLayout.setRefreshing(false); break; } } }; mRecyclerView.setAdapter(mAdapter); } private String getTimeText(long lastTimestamp) { String time = TimeAgo.using(lastTimestamp); time = time.replaceAll("just now", "now") .replaceAll(" minutes", "m") .replaceAll(" minute", "1m") .replaceAll("about", "") .replaceAll(" hours", "h") .replaceAll(" hour", "1h") .replaceAll(" an", "") .replaceAll("a ", "1 ") .replaceAll(" ago", "") .replaceAll("yesterday", "1d") .replaceAll(" days", "d") .replaceAll(" day", "1d"); return time; } public static class ViewHolder extends RecyclerView.ViewHolder { final View mView; final CircleImageView image; final TextView name; final TextView institute; final TextView level; final TextView rank, time; final ConstraintLayout back; public ViewHolder(View itemView) { super(itemView); mView = itemView; image = mView.findViewById(R.id.image); name = mView.findViewById(R.id.name); institute = mView.findViewById(R.id.institute); level = mView.findViewById(R.id.levelCount); rank = mView.findViewById(R.id.rank); back = mView.findViewById(R.id.back); time = mView.findViewById(R.id.textView4); } } String getType(long t) { if (t == 0) return "bsc"; if (t == 1) return "hsc"; if (t == 2) return "ssc"; else return "bsc"; } } \ No newline at end of file diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/quiz/ResultActivity.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/quiz/ResultActivity.java index 1293481..caa28d4 100644 --- a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/quiz/ResultActivity.java +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/activities/quiz/ResultActivity.java @@ -191,7 +191,7 @@ private void setUserData(ImageView proPic, TextView name, TextView level, String name.setText(me1.getUsername()); setLevelByScore(level, (int) me1.getScore()); Glide.with(getApplicationContext()) - .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_logo)) + .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) .load(me1.getImage()) .into(proPic); }); @@ -204,7 +204,7 @@ private void setUserData(ImageView proPic, TextView name, TextView level, String try { setLevelByScore(level, Integer.parseInt(String.valueOf(documentSnapshot.getLong("score")))); Glide.with(getApplicationContext()) - .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_logo)) + .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) .load(documentSnapshot.getString("image")) .into(proPic); }catch (Exception ignored){ diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/fragment/Dashboard.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/fragment/Dashboard.java index 0d9c23e..7e17e9e 100644 --- a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/fragment/Dashboard.java +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/fragment/Dashboard.java @@ -29,8 +29,6 @@ import com.google.firebase.firestore.DocumentChange; import com.google.firebase.firestore.FirebaseFirestore; import com.google.firebase.firestore.Query; - -import org.apache.commons.lang3.builder.ReflectionToStringBuilder; import com.quantum_guys.dncc_eco_sync.R; import com.quantum_guys.dncc_eco_sync.messege.model.Chat; import com.quantum_guys.dncc_eco_sync.models.Notification; @@ -41,6 +39,8 @@ import com.quantum_guys.dncc_eco_sync.viewmodel.ResultViewModel; import com.quantum_guys.dncc_eco_sync.viewmodel.UserViewModel; +import org.apache.commons.lang3.builder.ReflectionToStringBuilder; + import java.util.List; import java.util.Objects; @@ -51,7 +51,7 @@ public class Dashboard extends Fragment { private final int[] tabIcons = { R.drawable.ic_multiline_chart_black_24dp, - R.drawable.ic_flash_on_black_24dp, + R.drawable.ic_prop, R.drawable.ic_question_answer_black_24dp, R.drawable.ic_notifications_black_24dp }; @@ -73,14 +73,13 @@ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Override public void onViewCreated(@NonNull final View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - tabLayout = Objects.requireNonNull(getView()).findViewById(R.id.tabLayout); + tabLayout = requireView().findViewById(R.id.tabLayout); ViewPager viewPager = getView().findViewById(R.id.view_pager); adapter = new TabAdapter(requireActivity().getSupportFragmentManager(), getActivity()); adapter.addFragment(new Home(), "Post", tabIcons[0]); - adapter.addFragment(new Quiz(), "Quiz", tabIcons[1]); - adapter.addFragment(new ChatsFragment(), "Chat", tabIcons[2]); - adapter.addFragment(new NotificationFragment(), "Notif", tabIcons[3]); + adapter.addFragment(new Issue(), "Issue", tabIcons[1]); + adapter.addFragment(new NotificationFragment(), "Notification", tabIcons[3]); viewPager.setAdapter(adapter); for (int i = 0; i < tabLayout.getTabCount(); i++) { diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/fragment/Home.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/fragment/Home.java index 705cfe6..b67cdd6 100644 --- a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/fragment/Home.java +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/fragment/Home.java @@ -202,7 +202,7 @@ public void startPickImage() { .limit(7) .showCamera(true) .enableLog(true) - .imageDirectory("ত্বারক") + .imageDirectory("স্বচ্ছ ঢাকা") .start(123); } diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/fragment/Issue.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/fragment/Issue.java new file mode 100644 index 0000000..bbbc199 --- /dev/null +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/fragment/Issue.java @@ -0,0 +1,226 @@ +package com.quantum_guys.dncc_eco_sync.ui.fragment; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.os.Parcelable; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.Animation; +import android.view.animation.AnimationUtils; +import android.widget.LinearLayout; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.paging.PagedList; +import androidx.recyclerview.widget.DefaultItemAnimator; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + +import com.esafirm.imagepicker.features.ImagePicker; +import com.esafirm.imagepicker.model.Image; +import com.firebase.ui.firestore.paging.FirestorePagingAdapter; +import com.firebase.ui.firestore.paging.FirestorePagingOptions; +import com.firebase.ui.firestore.paging.LoadingState; +import com.google.android.material.bottomsheet.BottomSheetDialog; +import com.google.android.material.chip.Chip; +import com.google.android.material.chip.ChipGroup; +import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton; +import com.google.firebase.firestore.FirebaseFirestore; +import com.google.firebase.firestore.FirebaseFirestoreSettings; +import com.google.firebase.firestore.Query; +import com.quantum_guys.dncc_eco_sync.R; +import com.quantum_guys.dncc_eco_sync.adapters.PostViewHolder; +import com.quantum_guys.dncc_eco_sync.models.Images; +import com.quantum_guys.dncc_eco_sync.models.Post; +import com.quantum_guys.dncc_eco_sync.ui.activities.post.PostImage; +import com.quantum_guys.dncc_eco_sync.ui.activities.post.PostText; + +import java.util.ArrayList; +import java.util.List; + +public class Issue extends Fragment { + + @SuppressLint("StaticFieldLeak") + public static Context context; + private final List imagesList = new ArrayList<>(); + String tag = "All"; + int lastPosition = -1; + private RecyclerView mPostsRecyclerView; + private FirebaseFirestore mFirestore; + private View statsheetView; + private BottomSheetDialog mmBottomSheetDialog; + SwipeRefreshLayout mSwipeRefreshLayout; + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + return inflater.inflate(R.layout.frag_issue, container, false); + } + + @SuppressLint("InflateParams") + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + context = getContext(); + ExtendedFloatingActionButton button = view.findViewById(R.id.soihefawiw); + mSwipeRefreshLayout = view.findViewById(R.id.swf); + FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder() + .setPersistenceEnabled(true) + .build(); + mFirestore = FirebaseFirestore.getInstance(); + mFirestore.setFirestoreSettings(settings); + statsheetView = requireActivity().getLayoutInflater().inflate(R.layout.stat_bottom_sheet_dialog, null); + mmBottomSheetDialog = new BottomSheetDialog(view.getContext()); + mmBottomSheetDialog.setContentView(statsheetView); + mmBottomSheetDialog.setCanceledOnTouchOutside(true); + mPostsRecyclerView = view.findViewById(R.id.posts_recyclerview); + BottomSheetDialog mBottomSheetDialog = new BottomSheetDialog(context); + View sheetView = getLayoutInflater().inflate(R.layout.bottom_sheet_dialog, null); + mBottomSheetDialog.setContentView(sheetView); + + LinearLayout text_post = sheetView.findViewById(R.id.text_post); + LinearLayout photo_post = sheetView.findViewById(R.id.image_post); + + text_post.setOnClickListener(V -> { + mBottomSheetDialog.dismiss(); + PostText.startActivity(context); + }); + + photo_post.setOnClickListener(view1 -> { + mBottomSheetDialog.dismiss(); + startPickImage(); + }); + + mPostsRecyclerView.setItemAnimator(new DefaultItemAnimator()); + mPostsRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); + mPostsRecyclerView.setHasFixedSize(true); + setupAdapter(tag); + mSwipeRefreshLayout.setOnRefreshListener(() -> setupAdapter(tag)); + ChipGroup chipGroup = view.findViewById(R.id.filter_chip_SS_group); + chipGroup.setOnCheckedChangeListener((group, checkedId) -> { + try { + Chip c = view.findViewById(checkedId); + tag = c.getText().toString(); + setupAdapter(tag); + } catch (NullPointerException ignored) { + + } + }); + + button.setOnClickListener(view12 -> mBottomSheetDialog.show()); + } + + private void setupAdapter(String tag) { + mSwipeRefreshLayout.setRefreshing(true); + PagedList.Config config = new PagedList.Config.Builder() + .setEnablePlaceholders(false) + .setPrefetchDistance(6) + .setPageSize(15) + .build(); + Query mQuery; + if (tag.equals("All")) { + mQuery = mFirestore.collection("Issues").orderBy("timestamp", Query.Direction.DESCENDING); + } else { + mQuery = mFirestore.collection("Issues").orderBy("timestamp", Query.Direction.DESCENDING).whereEqualTo("tag", tag); + } + + FirestorePagingOptions options = new FirestorePagingOptions.Builder() + .setLifecycleOwner(this) + .setQuery(mQuery, config, com.quantum_guys.dncc_eco_sync.models.Issue.class) + .build(); + + FirestorePagingAdapter mAdapter = new FirestorePagingAdapter(options) { + @NonNull + @Override + public PostViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = getLayoutInflater().inflate(R.layout.item_feed_post, parent, false); + return new PostViewHolder(view); + } + + @Override + protected void onBindViewHolder(@NonNull PostViewHolder holder, int position, @NonNull com.quantum_guys.dncc_eco_sync.models.Issue post) { + Animation animation = AnimationUtils.loadAnimation(getActivity(), + (position > lastPosition) ? R.anim.up_from_bottom + : R.anim.down_from_top); + holder.itemView.startAnimation(animation); + lastPosition = position; + mSwipeRefreshLayout.setRefreshing(false); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + holder.bind(post, holder, position, mmBottomSheetDialog, statsheetView, true); + } + } + + @Override + protected void onError(@NonNull Exception e) { + super.onError(e); + Log.e("MainActivity", e.getMessage()); + } + + @Override + protected void onLoadingStateChanged(@NonNull LoadingState state) { + switch (state) { + case LOADING_INITIAL: + case LOADING_MORE: + // refreshLayout.setRefreshing(true); + break; + + case LOADED: + + case FINISHED: + //refreshLayout.setRefreshing(false); + break; + + case ERROR: + Toast.makeText( + getActivity(), + "Error Occurred!", + Toast.LENGTH_SHORT + ).show(); + + //refreshLayout.setRefreshing(false); + break; + } + } + + }; + mPostsRecyclerView.setAdapter(mAdapter); + + } + + public void startPickImage() { + ImagePicker.create(this) + .folderMode(true) + .toolbarFolderTitle("Folder") + .toolbarImageTitle("Tap to select") + .includeVideo(false) + .multi() + .limit(7) + .showCamera(true) + .enableLog(true) + .imageDirectory("স্বচ্ছ ঢাকা") + .start(456); + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (data != null) { + if (requestCode == 456) { + imagesList.clear(); + List pickedImages = ImagePicker.getImages(data); + for (Image image : pickedImages) { + imagesList.add(new Images(image.getName(), image.getPath(), image.getPath(), image.getId())); + } + Intent intent = new Intent(getActivity(), PostImage.class); + intent.putParcelableArrayListExtra("imagesList", (ArrayList) imagesList); + startActivity(intent); + } + } + } +} diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/fragment/PostMenu.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/fragment/PostMenu.java index 92b8d14..fcb5c83 100644 --- a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/fragment/PostMenu.java +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/fragment/PostMenu.java @@ -1 +1 @@ -package com.quantum_guys.dncc_eco_sync.ui.fragment; import static com.quantum_guys.dncc_eco_sync.ui.activities.MainActivity.userId; import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.Nullable; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; import com.google.firebase.firestore.FirebaseFirestore; import com.quantum_guys.dncc_eco_sync.BuildConfig; import com.quantum_guys.dncc_eco_sync.R; import com.quantum_guys.dncc_eco_sync.ui.activities.MainActivity; import java.util.HashMap; public class PostMenu extends BottomSheetDialogFragment { String post, name; public PostMenu(String post, String name) { this.post=post; this.name=name; } @SuppressLint({"UseCompatLoadingForDrawables", "SimpleDateFormat", "SetTextI18n"}) @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View v = inflater.inflate(R.layout.post_menu, container, false); TextView show = v.findViewById(R.id.textView14); Button share = v.findViewById(R.id.share); Button copy = v.findViewById(R.id.copy); Button report = v.findViewById(R.id.report); show.setText(name+"'s Post"); copy.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String text = "https://tarok.tech/post/"+post; setClipboard(getContext(), text); } }); share.setOnClickListener(view -> { try { Intent shareIntent = new Intent(Intent.ACTION_SEND); shareIntent.setType("text/plain"); shareIntent.putExtra(Intent.EXTRA_SUBJECT, name+"'s Post on Accelerator-ত্বারক"); String link = name+"'s Post on Accelerator-ত্বারক\n" + "https://tarok.tech/post/"+post; String shareMessage = link + "\n \n Install the app here: https://play.google.com/store/apps/details?id=" + BuildConfig.APPLICATION_ID +"\n\n"; shareIntent.putExtra(Intent.EXTRA_TEXT, shareMessage); startActivity(Intent.createChooser(shareIntent, "choose one")); } catch(Exception ignored) { } }); report.setOnClickListener(view -> { HashMap re = new HashMap<>(); re.put("postId", post); re.put("userId", userId); re.put("timestamp", System.currentTimeMillis()); FirebaseFirestore.getInstance().collection("Reports").document(String.valueOf(System.currentTimeMillis())).set(re); Toast.makeText(getContext(), "Your Report Submitted to Admin Review", Toast.LENGTH_SHORT).show(); }); return v; } @SuppressLint("ObsoleteSdkInt") private void setClipboard(Context context, String text) { if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) { android.text.ClipboardManager clipboard = (android.text.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); clipboard.setText(text); } else { android.content.ClipboardManager clipboard = (android.content.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); android.content.ClipData clip = android.content.ClipData.newPlainText("Copied Text", text); clipboard.setPrimaryClip(clip); } Toast.makeText(context, "Post link copied", Toast.LENGTH_SHORT).show(); } public void setTheme(String name) { SharedPreferences preferences = requireContext().getSharedPreferences("Theme", Context.MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); editor.putString("ThemeName", name); editor.apply(); requireActivity().finish(); startActivity(new Intent(getContext(), MainActivity.class)); } } \ No newline at end of file +package com.quantum_guys.dncc_eco_sync.ui.fragment; import static com.quantum_guys.dncc_eco_sync.ui.activities.MainActivity.userId; import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.Nullable; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; import com.google.firebase.firestore.FirebaseFirestore; import com.quantum_guys.dncc_eco_sync.BuildConfig; import com.quantum_guys.dncc_eco_sync.R; import com.quantum_guys.dncc_eco_sync.ui.activities.MainActivity; import java.util.HashMap; public class PostMenu extends BottomSheetDialogFragment { String post, name; public PostMenu(String post, String name) { this.post=post; this.name=name; } @SuppressLint({"UseCompatLoadingForDrawables", "SimpleDateFormat", "SetTextI18n"}) @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View v = inflater.inflate(R.layout.post_menu, container, false); TextView show = v.findViewById(R.id.textView14); Button share = v.findViewById(R.id.share); Button copy = v.findViewById(R.id.copy); Button report = v.findViewById(R.id.report); show.setText(name+"'s Post"); copy.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String text = "https://3.208.28.247.com/post/"+post; setClipboard(getContext(), text); } }); share.setOnClickListener(view -> { try { Intent shareIntent = new Intent(Intent.ACTION_SEND); shareIntent.setType("text/plain"); shareIntent.putExtra(Intent.EXTRA_SUBJECT, name+"'s Post on স্বচ্ছ ঢাকা"); String link = name+"'s Post on স্বচ্ছ ঢাকা\n" + "http://3.208.28.247:3000/post/"+post; String shareMessage = link + "\n \n Install the app here: https://play.google.com/store/apps/details?id=" + BuildConfig.APPLICATION_ID +"\n\n"; shareIntent.putExtra(Intent.EXTRA_TEXT, shareMessage); startActivity(Intent.createChooser(shareIntent, "choose one")); } catch(Exception ignored) { } }); report.setOnClickListener(view -> { HashMap re = new HashMap<>(); re.put("postId", post); re.put("userId", userId); re.put("timestamp", System.currentTimeMillis()); FirebaseFirestore.getInstance().collection("Reports").document(String.valueOf(System.currentTimeMillis())).set(re); Toast.makeText(getContext(), "Your Report Submitted to Admin Review", Toast.LENGTH_SHORT).show(); }); return v; } @SuppressLint("ObsoleteSdkInt") private void setClipboard(Context context, String text) { if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) { android.text.ClipboardManager clipboard = (android.text.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); clipboard.setText(text); } else { android.content.ClipboardManager clipboard = (android.content.ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); android.content.ClipData clip = android.content.ClipData.newPlainText("Copied Text", text); clipboard.setPrimaryClip(clip); } Toast.makeText(context, "Post link copied", Toast.LENGTH_SHORT).show(); } public void setTheme(String name) { SharedPreferences preferences = requireContext().getSharedPreferences("Theme", Context.MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); editor.putString("ThemeName", name); editor.apply(); requireActivity().finish(); startActivity(new Intent(getContext(), MainActivity.class)); } } \ No newline at end of file diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/fragment/ProfileFragment.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/fragment/ProfileFragment.java index f08b6e9..e1dd4d5 100644 --- a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/fragment/ProfileFragment.java +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/fragment/ProfileFragment.java @@ -149,7 +149,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, setLevelByScore(levelTv, (int) users.getScore()); setUpChartData(pieChart, users.getWin(), users.getLose(), users.getDraw()); Glide.with(rootView.getContext()) - .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_logo_icon)) + .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) .load(users.getImage()) .into(profile_pic); profile_pic.setOnClickListener(v -> rootView.getContext().startActivity(new Intent(rootView.getContext(), ImagePreviewSave.class) diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/fragment/Quiz.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/fragment/Quiz.java index 6b9fd8f..69bfa68 100644 --- a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/fragment/Quiz.java +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/fragment/Quiz.java @@ -289,7 +289,7 @@ private void loadProfileData() { // setUpChartData(pieChart, win, lose, draw); nameTV.setText(name); Glide.with(requireActivity()) - .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_logo)) + .setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo_round)) .load(image) .into(pro_pic); scoreTV.setText("Score: " + score); diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/fragment/SavedFragment.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/fragment/SavedFragment.java index f16e47e..4446874 100644 --- a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/fragment/SavedFragment.java +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/ui/fragment/SavedFragment.java @@ -1 +1 @@ -package com.quantum_guys.dncc_eco_sync.ui.fragment; import android.annotation.SuppressLint; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProviders; import androidx.recyclerview.widget.DefaultItemAnimator; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import com.google.android.material.bottomsheet.BottomSheetDialog; import com.google.firebase.database.annotations.Nullable; import com.quantum_guys.dncc_eco_sync.R; import com.quantum_guys.dncc_eco_sync.adapters.PostViewHolder; import com.quantum_guys.dncc_eco_sync.models.Post; import com.quantum_guys.dncc_eco_sync.viewmodel.PostViewModel; import java.util.ArrayList; import java.util.List; import java.util.Objects; public class SavedFragment extends Fragment { List postList; PostViewModel postViewModel; private RecyclerView mRecyclerView; private View statsheetView; private BottomSheetDialog mmBottomSheetDialog; private SwipeRefreshLayout refreshLayout; private View rootView; public SavedFragment() { } @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { rootView = inflater.inflate(R.layout.fragment_saved, container, false); return rootView; } @SuppressLint({"SetTextI18n", "UseCompatLoadingForDrawables", "InflateParams"}) @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); postList = new ArrayList<>(); postViewModel = ViewModelProviders.of(requireActivity()).get(PostViewModel.class); statsheetView = requireActivity().getLayoutInflater().inflate(R.layout.stat_bottom_sheet_dialog, null); mmBottomSheetDialog = new BottomSheetDialog(rootView.getContext()); mmBottomSheetDialog.setContentView(statsheetView); mmBottomSheetDialog.setCanceledOnTouchOutside(true); refreshLayout = rootView.findViewById(R.id.refreshLayout); TextView title = rootView.findViewById(R.id.default_title); TextView text = rootView.findViewById(R.id.default_text); ImageView image = rootView.findViewById(R.id.imageview); image.setImageDrawable(getResources().getDrawable(R.drawable.ic_logo)); title.setText("No saved posts found"); text.setText("Save some post from Timeline to view here."); PostPhotosAdapter postPhotosAdapter = new PostPhotosAdapter(postList); mRecyclerView = rootView.findViewById(R.id.recyclerView); mRecyclerView.setItemAnimator(new DefaultItemAnimator()); mRecyclerView.setLayoutManager(new LinearLayoutManager(rootView.getContext(), LinearLayoutManager.VERTICAL, false)); mRecyclerView.setHasFixedSize(true); postViewModel.posts.observe(requireActivity(), posts -> { postList = posts; postPhotosAdapter.postListNow = postList; mRecyclerView.setAdapter(postPhotosAdapter); postPhotosAdapter.notifyDataSetChanged(); }); //mAdapter_v19 = new PostsAdapter(postList, rootView.getContext(), getActivity(), mmBottomSheetDialog, statsheetView, false); // mRecyclerView.addItemDecoration(new DividerItemDecoration(rootView.getContext(), DividerItemDecoration.VERTICAL)); //mRecyclerView.setAdapter(mAdapter_v19); refreshLayout.setOnRefreshListener(() -> refreshLayout.setVisibility(View.GONE)); } class PostPhotosAdapter extends RecyclerView.Adapter { private List postListNow; public PostPhotosAdapter(List post) { this.postListNow = post; } @NonNull @Override public PostViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = getLayoutInflater().inflate(R.layout.item_feed_post, parent, false); return new PostViewHolder(view); } @Override public void onBindViewHolder(@NonNull PostViewHolder holder, int position) { try { Post post1 = postListNow.get(position); holder.bind(post1, holder, position, mmBottomSheetDialog, statsheetView, true); } catch (IndexOutOfBoundsException ignored) { } } @Override public int getItemCount() { return postList.size(); } } } \ No newline at end of file +package com.quantum_guys.dncc_eco_sync.ui.fragment; import android.annotation.SuppressLint; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProviders; import androidx.recyclerview.widget.DefaultItemAnimator; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import com.google.android.material.bottomsheet.BottomSheetDialog; import com.google.firebase.database.annotations.Nullable; import com.quantum_guys.dncc_eco_sync.R; import com.quantum_guys.dncc_eco_sync.adapters.PostViewHolder; import com.quantum_guys.dncc_eco_sync.models.Post; import com.quantum_guys.dncc_eco_sync.viewmodel.PostViewModel; import java.util.ArrayList; import java.util.List; import java.util.Objects; public class SavedFragment extends Fragment { List postList; PostViewModel postViewModel; private RecyclerView mRecyclerView; private View statsheetView; private BottomSheetDialog mmBottomSheetDialog; private SwipeRefreshLayout refreshLayout; private View rootView; public SavedFragment() { } @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { rootView = inflater.inflate(R.layout.fragment_saved, container, false); return rootView; } @SuppressLint({"SetTextI18n", "UseCompatLoadingForDrawables", "InflateParams"}) @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); postList = new ArrayList<>(); postViewModel = ViewModelProviders.of(requireActivity()).get(PostViewModel.class); statsheetView = requireActivity().getLayoutInflater().inflate(R.layout.stat_bottom_sheet_dialog, null); mmBottomSheetDialog = new BottomSheetDialog(rootView.getContext()); mmBottomSheetDialog.setContentView(statsheetView); mmBottomSheetDialog.setCanceledOnTouchOutside(true); refreshLayout = rootView.findViewById(R.id.refreshLayout); TextView title = rootView.findViewById(R.id.default_title); TextView text = rootView.findViewById(R.id.default_text); ImageView image = rootView.findViewById(R.id.imageview); image.setImageDrawable(getResources().getDrawable(R.drawable.logo_round)); title.setText("No saved posts found"); text.setText("Save some post from Timeline to view here."); PostPhotosAdapter postPhotosAdapter = new PostPhotosAdapter(postList); mRecyclerView = rootView.findViewById(R.id.recyclerView); mRecyclerView.setItemAnimator(new DefaultItemAnimator()); mRecyclerView.setLayoutManager(new LinearLayoutManager(rootView.getContext(), LinearLayoutManager.VERTICAL, false)); mRecyclerView.setHasFixedSize(true); postViewModel.posts.observe(requireActivity(), posts -> { postList = posts; postPhotosAdapter.postListNow = postList; mRecyclerView.setAdapter(postPhotosAdapter); postPhotosAdapter.notifyDataSetChanged(); }); //mAdapter_v19 = new PostsAdapter(postList, rootView.getContext(), getActivity(), mmBottomSheetDialog, statsheetView, false); // mRecyclerView.addItemDecoration(new DividerItemDecoration(rootView.getContext(), DividerItemDecoration.VERTICAL)); //mRecyclerView.setAdapter(mAdapter_v19); refreshLayout.setOnRefreshListener(() -> refreshLayout.setVisibility(View.GONE)); } class PostPhotosAdapter extends RecyclerView.Adapter { private List postListNow; public PostPhotosAdapter(List post) { this.postListNow = post; } @NonNull @Override public PostViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = getLayoutInflater().inflate(R.layout.item_feed_post, parent, false); return new PostViewHolder(view); } @Override public void onBindViewHolder(@NonNull PostViewHolder holder, int position) { try { Post post1 = postListNow.get(position); holder.bind(post1, holder, position, mmBottomSheetDialog, statsheetView, true); } catch (IndexOutOfBoundsException ignored) { } } @Override public int getItemCount() { return postList.size(); } } } \ No newline at end of file diff --git a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/utils/NotificationUtil.java b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/utils/NotificationUtil.java index fadd5b7..ab1b613 100644 --- a/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/utils/NotificationUtil.java +++ b/android-app/app/src/main/java/com/quantum_guys/dncc_eco_sync/utils/NotificationUtil.java @@ -64,7 +64,7 @@ public void showNotificationMessage(String timeStamp, final String user_image, f return; // notification icon - final int icon = R.drawable.ic_logo_icon; + final int icon = R.drawable.logo_round; int requestID = (int) System.currentTimeMillis(); diff --git a/android-app/app/src/main/res/drawable/head.png b/android-app/app/src/main/res/drawable/head.png new file mode 100644 index 0000000000000000000000000000000000000000..14c2b3e544d55f6795aa53f97b66939c7956b118 GIT binary patch literal 216493 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

mC}2Xsf#LO(%1bT=v<+~EseEz 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

#e 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 \ No newline at end of file diff --git a/android-app/app/src/main/res/layout/activity_edit_profile.xml b/android-app/app/src/main/res/layout/activity_edit_profile.xml index 7f938e2..2e618c6 100644 --- a/android-app/app/src/main/res/layout/activity_edit_profile.xml +++ b/android-app/app/src/main/res/layout/activity_edit_profile.xml @@ -1 +1 @@ -