Commit 784db3f1 authored by Sajal Narang's avatar Sajal Narang Committed by GitHub

Merge pull request #229 from wncc/nss

Add complaints, fix #201
parents be1e1159 2d066a06
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
</value> </value>
</option> </option>
</component> </component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" /> <output url="file://$PROJECT_DIR$/build/classes" />
</component> </component>
<component name="ProjectType"> <component name="ProjectType">
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
<module fileurl="file://$PROJECT_DIR$/IITB-App.iml" filepath="$PROJECT_DIR$/IITB-App.iml" /> <module fileurl="file://$PROJECT_DIR$/IITB-App.iml" filepath="$PROJECT_DIR$/IITB-App.iml" />
<module fileurl="file://$PROJECT_DIR$/IITBApp.iml" filepath="$PROJECT_DIR$/IITBApp.iml" /> <module fileurl="file://$PROJECT_DIR$/IITBApp.iml" filepath="$PROJECT_DIR$/IITBApp.iml" />
<module fileurl="file://$PROJECT_DIR$/InstiApp.iml" filepath="$PROJECT_DIR$/InstiApp.iml" /> <module fileurl="file://$PROJECT_DIR$/InstiApp.iml" filepath="$PROJECT_DIR$/InstiApp.iml" />
<module fileurl="file://$PROJECT_DIR$/InstiApp2.iml" filepath="$PROJECT_DIR$/InstiApp2.iml" />
<module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" /> <module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
</modules> </modules>
</component> </component>
......
...@@ -29,6 +29,8 @@ ext { ...@@ -29,6 +29,8 @@ ext {
picassoVersion = '2.71828' picassoVersion = '2.71828'
circleImageViewVersion = '2.2.0' circleImageViewVersion = '2.2.0'
markwonVersion = '1.0.6' markwonVersion = '1.0.6'
tagViewVersion = '1.3'
circleIndicatorVersion = '1.2.2@aar'
} }
dependencies { dependencies {
...@@ -37,7 +39,9 @@ dependencies { ...@@ -37,7 +39,9 @@ dependencies {
implementation "com.android.support:design:${supportLibVersion}" implementation "com.android.support:design:${supportLibVersion}"
implementation "com.android.support:exifinterface:${supportLibVersion}" implementation "com.android.support:exifinterface:${supportLibVersion}"
implementation "com.android.support:support-v4:${supportLibVersion}" implementation "com.android.support:support-v4:${supportLibVersion}"
implementation "com.google.android.gms:play-services-maps:${playServicesVersion}"
implementation "com.google.android.gms:play-services-location:${playServicesVersion}" implementation "com.google.android.gms:play-services-location:${playServicesVersion}"
implementation "com.google.android.gms:play-services-places:${playServicesVersion}"
implementation "com.squareup.retrofit2:retrofit:${retrofitVersion}" implementation "com.squareup.retrofit2:retrofit:${retrofitVersion}"
implementation "com.squareup.retrofit2:converter-gson:${retrofitVersion}" implementation "com.squareup.retrofit2:converter-gson:${retrofitVersion}"
implementation "com.squareup.okhttp3:okhttp:${okhttpVersion}" implementation "com.squareup.okhttp3:okhttp:${okhttpVersion}"
...@@ -46,5 +50,7 @@ dependencies { ...@@ -46,5 +50,7 @@ dependencies {
implementation "com.android.support:cardview-v7:${supportLibVersion}" implementation "com.android.support:cardview-v7:${supportLibVersion}"
implementation "de.hdodenhof:circleimageview:${circleImageViewVersion}" implementation "de.hdodenhof:circleimageview:${circleImageViewVersion}"
implementation "ru.noties:markwon:${markwonVersion}" implementation "ru.noties:markwon:${markwonVersion}"
implementation "com.github.Cutta:TagView:${tagViewVersion}"
implementation "me.relex:circleindicator:${circleIndicatorVersion}"
} }
apply plugin: 'com.google.gms.google-services' apply plugin: 'com.google.gms.google-services'
...@@ -23,6 +23,10 @@ ...@@ -23,6 +23,10 @@
android:name="com.google.android.gms.version" android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" /> android:value="@integer/google_play_services_version" />
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="@string/google_maps_api_key" />
<!-- FCM styling --> <!-- FCM styling -->
<meta-data <meta-data
android:name="com.google.firebase.messaging.default_notification_icon" android:name="com.google.firebase.messaging.default_notification_icon"
......
package app.insti;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ProgressBar;
/**
* Created by Shivam Sharma on 13-08-2018.
*/
public class ComplaintDescriptionAutoCompleteTextView extends android.support.v7.widget.AppCompatAutoCompleteTextView {
private static final int MESSAGE_TEXT_CHANGED = 100;
private static final int DEFAULT_AUTOCOMPLETE_DELAY = 750;
private int mAutoCompleteDelay = DEFAULT_AUTOCOMPLETE_DELAY;
private ProgressBar mLoadingIndicator;
private final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
ComplaintDescriptionAutoCompleteTextView.super.performFiltering((CharSequence) msg.obj, msg.arg1);
}
};
public ComplaintDescriptionAutoCompleteTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setLoadingIndicator(ProgressBar progressBar) {
mLoadingIndicator = progressBar;
}
public void setAutoCompleteDelay(int autoCompleteDelay) {
mAutoCompleteDelay = autoCompleteDelay;
}
@Override
protected void performFiltering(CharSequence text, int keyCode) {
if (mLoadingIndicator != null) {
mLoadingIndicator.setVisibility(View.VISIBLE);
}
mHandler.removeMessages(MESSAGE_TEXT_CHANGED);
mHandler.sendMessageDelayed(mHandler.obtainMessage(MESSAGE_TEXT_CHANGED, text), mAutoCompleteDelay);
}
@Override
public void onFilterComplete(int count) {
if (mLoadingIndicator != null) {
mLoadingIndicator.setVisibility(View.GONE);
}
super.onFilterComplete(count);
}
}
package app.insti;
/**
* Created by Shivam Sharma on 13-08-2018.
*/
public class ComplaintTag {
private String name;
public ComplaintTag(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
...@@ -5,6 +5,7 @@ public class Constants { ...@@ -5,6 +5,7 @@ public class Constants {
public static final int MY_PERMISSIONS_REQUEST_ACCESS_LOCATION = 2; public static final int MY_PERMISSIONS_REQUEST_ACCESS_LOCATION = 2;
public static final int MY_PERMISSIONS_REQUEST_LOCATION = 3; public static final int MY_PERMISSIONS_REQUEST_LOCATION = 3;
public static final int RESULT_LOAD_IMAGE = 11; public static final int RESULT_LOAD_IMAGE = 11;
public static final int REQUEST_CAMERA_INT_ID = 101;
public static final String NOTIFICATIONS_RESPONSE_JSON = "notifications_json"; public static final String NOTIFICATIONS_RESPONSE_JSON = "notifications_json";
public static final String EVENT_ID = "event_id"; public static final String EVENT_ID = "event_id";
public static final String EVENT_LATITUDE = "event_latitude"; public static final String EVENT_LATITUDE = "event_latitude";
...@@ -19,6 +20,7 @@ public class Constants { ...@@ -19,6 +20,7 @@ public class Constants {
public static final String IS_LOGGED_IN = "IsLoggedIn"; public static final String IS_LOGGED_IN = "IsLoggedIn";
public static final String GCM_ID = "GcmId"; public static final String GCM_ID = "GcmId";
public static final String CURRENT_USER = "current_user"; public static final String CURRENT_USER = "current_user";
public static final String CURRENT_USER_PROFILE_PICTURE = "current_user_profile_picture";
public static final String SESSION_ID = "session_id"; public static final String SESSION_ID = "session_id";
public static final int STATUS_GOING = 2; public static final int STATUS_GOING = 2;
public static final int STATUS_INTERESTED = 1; public static final int STATUS_INTERESTED = 1;
......
...@@ -55,11 +55,11 @@ import app.insti.api.model.Role; ...@@ -55,11 +55,11 @@ import app.insti.api.model.Role;
import app.insti.api.model.User; import app.insti.api.model.User;
import app.insti.api.request.UserFCMPatchRequest; import app.insti.api.request.UserFCMPatchRequest;
import app.insti.fragment.BackHandledFragment; import app.insti.fragment.BackHandledFragment;
import app.insti.fragment.BodyFragment;
import app.insti.fragment.CalendarFragment; import app.insti.fragment.CalendarFragment;
import app.insti.fragment.EventFragment; import app.insti.fragment.ComplaintsFragment;
import app.insti.fragment.ExploreFragment; import app.insti.fragment.ExploreFragment;
import app.insti.fragment.FeedFragment; import app.insti.fragment.FeedFragment;
import app.insti.fragment.FileComplaintFragment;
import app.insti.fragment.MapFragment; import app.insti.fragment.MapFragment;
import app.insti.fragment.MessMenuFragment; import app.insti.fragment.MessMenuFragment;
import app.insti.fragment.NewsFragment; import app.insti.fragment.NewsFragment;
...@@ -79,6 +79,7 @@ import static app.insti.Constants.DATA_TYPE_PT; ...@@ -79,6 +79,7 @@ import static app.insti.Constants.DATA_TYPE_PT;
import static app.insti.Constants.DATA_TYPE_USER; import static app.insti.Constants.DATA_TYPE_USER;
import static app.insti.Constants.FCM_BUNDLE_NOTIFICATION_ID; import static app.insti.Constants.FCM_BUNDLE_NOTIFICATION_ID;
import static app.insti.Constants.MY_PERMISSIONS_REQUEST_ACCESS_LOCATION; import static app.insti.Constants.MY_PERMISSIONS_REQUEST_ACCESS_LOCATION;
import static app.insti.Constants.MY_PERMISSIONS_REQUEST_LOCATION;
import static app.insti.Constants.MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE; import static app.insti.Constants.MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE;
import static app.insti.Constants.RESULT_LOAD_IMAGE; import static app.insti.Constants.RESULT_LOAD_IMAGE;
...@@ -525,6 +526,15 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On ...@@ -525,6 +526,15 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
updateFragment(mapFragment); updateFragment(mapFragment);
break; break;
case R.id.nav_complaint:
if (session.isLoggedIn()) {
ComplaintsFragment complaintsFragment = new ComplaintsFragment();
updateFragment(complaintsFragment);
} else {
Toast.makeText(this, Constants.LOGIN_MESSAGE, Toast.LENGTH_LONG).show();
}
break;
case R.id.nav_settings: case R.id.nav_settings:
SettingsFragment settingsFragment = new SettingsFragment(); SettingsFragment settingsFragment = new SettingsFragment();
updateFragment(settingsFragment); updateFragment(settingsFragment);
...@@ -567,6 +577,10 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On ...@@ -567,6 +577,10 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
bundle.putString(Constants.USER_HOSTEL, session.isLoggedIn() && currentUser.getHostel() != null ? currentUser.getHostel() : "1"); bundle.putString(Constants.USER_HOSTEL, session.isLoggedIn() && currentUser.getHostel() != null ? currentUser.getHostel() : "1");
if (fragment instanceof SettingsFragment && session.isLoggedIn()) if (fragment instanceof SettingsFragment && session.isLoggedIn())
bundle.putString(Constants.USER_ID, currentUser.getUserID()); bundle.putString(Constants.USER_ID, currentUser.getUserID());
if (fragment instanceof ComplaintsFragment && session.isLoggedIn()){
bundle.putString(Constants.USER_ID, currentUser.getUserID());
bundle.putString(Constants.CURRENT_USER_PROFILE_PICTURE, currentUser.getUserProfilePictureUrl());
}
fragment.setArguments(bundle); fragment.setArguments(bundle);
FragmentManager manager = getSupportFragmentManager(); FragmentManager manager = getSupportFragmentManager();
if (fragment instanceof FeedFragment) if (fragment instanceof FeedFragment)
...@@ -599,6 +613,17 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On ...@@ -599,6 +613,17 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
Toast toast = Toast.makeText(MainActivity.this, "Need Permission", Toast.LENGTH_SHORT); Toast toast = Toast.makeText(MainActivity.this, "Need Permission", Toast.LENGTH_SHORT);
toast.show(); toast.show();
} }
break;
case MY_PERMISSIONS_REQUEST_LOCATION:
Log.i(TAG, "Permission request captured");
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.i(TAG, "Permission Granted");
FileComplaintFragment.getMainActivity().getMapReady();
} else {
Log.i(TAG, "Permission Cancelled");
Toast toast = Toast.makeText(MainActivity.this, "Need Permission", Toast.LENGTH_SHORT);
toast.show();
}
} }
} }
......
package app.insti.adapter;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.PopupMenu;
import android.widget.TextView;
import android.widget.Toast;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
import java.util.List;
import app.insti.R;
import app.insti.Utils;
import app.insti.api.RetrofitInterface;
import app.insti.api.model.Venter;
import app.insti.utils.DateTimeUtil;
import de.hdodenhof.circleimageview.CircleImageView;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
/**
* Created by Shivam Sharma on 23-09-2018.
*/
public class CommentsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final String TAG = CommentsAdapter.class.getSimpleName();
private Context context;
private LayoutInflater inflater;
private String sessionId, userId;
private Fragment fragment;
private TextView textViewCommentLabel;
private List<Venter.Comment> commentList = new ArrayList<>();
public CommentsAdapter(Context context, String sessionId, String userId, Fragment fragment) {
this.context = context;
this.sessionId = sessionId;
this.userId = userId;
inflater = LayoutInflater.from(context);
this.fragment =fragment;
}
public class CommentsViewHolder extends RecyclerView.ViewHolder {
private CardView cardView;
private CircleImageView circleImageView;
private TextView textViewName;
private TextView textViewCommentTime;
private TextView textViewComment;
private final RetrofitInterface retrofitInterface = Utils.getRetrofitInterface();
CommentsViewHolder(View itemView) {
super(itemView);
cardView = itemView.findViewById(R.id.cardViewComment);
textViewName = itemView.findViewById(R.id.textViewUserComment);
textViewComment = itemView.findViewById(R.id.textViewComment);
textViewCommentTime = itemView.findViewById(R.id.textViewTime);
circleImageView = itemView.findViewById(R.id.circleImageViewUserImage);
}
private void bindHolder(final int position) {
final Venter.Comment comment = commentList.get(position);
try {
String profileUrl = comment.getUser().getUserProfilePictureUrl();
Log.i(TAG, "PROFILE URL: " + profileUrl);
Picasso.get().load(profileUrl).placeholder(R.drawable.user_placeholder).into(circleImageView);
} catch (Exception e) {
e.printStackTrace();
}
try {
textViewName.setText(comment.getUser().getUserName());
String time = DateTimeUtil.getDate(comment.getTime());
Log.i(TAG, "time: " + time);
textViewCommentTime.setText(time);
textViewComment.setText(comment.getText());
} catch (Exception e) {
e.printStackTrace();
}
cardView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(final View v) {
PopupMenu popupMenu = new PopupMenu(context, cardView);
if (!(comment.getUser().getUserID().equals(userId))) {
popupMenu.inflate(R.menu.comments_options_secondary_menu);
} else {
popupMenu.inflate(R.menu.comment_options_primary_menu);
}
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.copy_comment_option:
ClipboardManager clipboardManager = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clipData = ClipData.newPlainText("Text Copied", textViewComment.getText().toString());
if (clipboardManager != null) {
clipboardManager.setPrimaryClip(clipData);
}
Toast.makeText(context, "Comment Copied", Toast.LENGTH_SHORT).show();
break;
case R.id.delete_comment_option:
retrofitInterface.deleteComment("sessionid=" + sessionId, comment.getId()).enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
if (response.isSuccessful()) {
commentList.remove(position);
notifyDataSetChanged();
notifyItemRemoved(position);
notifyItemRangeChanged(position, commentList.size() - position);
textViewCommentLabel.setText("Comments (" + commentList.size() + ")");
} else {
Toast.makeText(context, "You can't delete this comment", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<String> call, Throwable t) {
Log.i(TAG, " failure in deleting: " + t.toString());
}
});
break;
default:
clipboardManager = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
clipData = ClipData.newPlainText("Text Copied", textViewComment.getText().toString());
if (clipboardManager != null) {
clipboardManager.setPrimaryClip(clipData);
}
Toast.makeText(context, "Comment Copied", Toast.LENGTH_SHORT).show();
break;
}
return true;
}
});
popupMenu.show();
return true;
}
});
}
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.comments_card, parent, false);
final CommentsViewHolder commentsViewHolder = new CommentsViewHolder(view);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Utils.openUserFragment(commentList.get(commentsViewHolder.getAdapterPosition()).getUser(), fragment.getActivity());
}
});
return commentsViewHolder;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if (holder instanceof CommentsViewHolder) {
((CommentsViewHolder) holder).bindHolder(position);
}
}
@Override
public int getItemCount() {
return commentList.size();
}
public void setCommentList(List<Venter.Comment> commentList, TextView textViewCommentLabel) {
this.commentList = commentList;
this.textViewCommentLabel = textViewCommentLabel;
}
}
\ No newline at end of file
package app.insti.adapter;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import app.insti.fragment.ComplaintDetailsFragment;
/**
* Created by Shivam Sharma on 19-09-2018.
*/
public class ComplaintDetailsPagerAdapter extends FragmentPagerAdapter {
private String sessionid, complaintid, userid, userProfileUrl;
public ComplaintDetailsPagerAdapter(FragmentManager fm, String sessionid, String complaintid, String userid, String userProfileUrl) {
super(fm);
this.sessionid = sessionid;
this.complaintid = complaintid;
this.userid = userid;
this.userProfileUrl = userProfileUrl;
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return ComplaintDetailsFragment.getInstance(sessionid, complaintid, userid, userProfileUrl);
/*
For version 2:
case 1:
return RelevantComplaintsFragment.getInstance(sessionid, userid);
*/
default:
return ComplaintDetailsFragment.getInstance(sessionid, complaintid, userid, userProfileUrl);
}
}
@Override
public CharSequence getPageTitle(int position) {
if (position == 0) {
return "Complaint Details";
} else {
return "Relevant Complaints";
}
}
@Override
public int getCount() {
return 1;
}
}
package app.insti.adapter;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import app.insti.fragment.ComplaintsHomeFragment;
import app.insti.fragment.ComplaintsMeFragment;
/**
* Created by Shivam Sharma on 15-08-2018.
*/
public class ComplaintFragmentViewPagerAdapter extends FragmentStatePagerAdapter {
private String userID, sessionID, userProfileUrl;
public ComplaintFragmentViewPagerAdapter(FragmentManager fm,String userID, String sessionID, String userProfileUrl) {
super(fm);
this.userID = userID;
this.sessionID = sessionID;
this.userProfileUrl = userProfileUrl;
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return ComplaintsHomeFragment.getInstance(sessionID, userID, userProfileUrl);
case 1:
return ComplaintsMeFragment.getInstance(sessionID,userID, userProfileUrl);
default:
return ComplaintsHomeFragment.getInstance(sessionID, userID, userProfileUrl);
}
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
if (position == 0) {
return "Home";
} else {
return "Me";
}
}
@Override
public int getCount() {
return 2;
}
}
This diff is collapsed.
package app.insti.adapter;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v4.view.PagerAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
import java.util.List;
import app.insti.R;
import app.insti.api.model.Venter;
/**
* Created by Shivam Sharma on 25-09-2018.
*/
public class ImageViewPagerAdapter extends PagerAdapter {
private List<String> images = new ArrayList<>();
public Context context;
public LayoutInflater inflater;
public ImageViewPagerAdapter(Context context, List<String> images)
{
this.context = context;
this.images = images;
inflater= (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public ImageViewPagerAdapter(Context context, Venter.Complaint detailedComplaint)
{
this.context = context;
inflater= (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
for (String image: detailedComplaint.getImages()){
images.add(image);
}
}
@Override
public int getCount() {
if (images.size() == 0)
return 1;
else
return images.size();
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
return view.equals(o);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
@Override
public Object instantiateItem(ViewGroup view, int position)
{
View imageLayout = inflater.inflate(R.layout.slidingimages_layout, view, false);
assert imageLayout != null;
final ImageView imageView = imageLayout.findViewById(R.id.slidingImageView);
if (images.size() != 0)
Picasso.get().load(images.get(position)).into(imageView);
else
Picasso.get().load(R.drawable.baseline_photo_size_select_actual_black_48).resize(500,500).into(imageView);
view.addView(imageLayout, 0);
return imageLayout;
}
}
\ No newline at end of file
package app.insti.adapter;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
import java.util.List;
import app.insti.R;
import app.insti.Utils;
import app.insti.api.model.User;
import de.hdodenhof.circleimageview.CircleImageView;
public class UpVotesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final String TAG = CommentsAdapter.class.getSimpleName();
private LayoutInflater inflater;
private Fragment fragment;
private List<User> userList = new ArrayList<>();
public UpVotesAdapter(Fragment fragment, Context context) {
inflater = LayoutInflater.from(context);
this.fragment = fragment;
}
public class UpVotesViewHolder extends RecyclerView.ViewHolder {
private CardView cardView;
private CircleImageView circleImageView;
private TextView textViewName;
UpVotesViewHolder(View itemView) {
super(itemView);
cardView = itemView.findViewById(R.id.cardViewUpVote);
textViewName = itemView.findViewById(R.id.textViewUserUpVoteName);
circleImageView = itemView.findViewById(R.id.circleImageViewUserUpVoteImage);
cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Utils.openUserFragment(userList.get(getAdapterPosition()), fragment.getActivity());
}
});
}
private void bindHolder(final int position) {
final User user = userList.get(position);
try {
String profileUrl = user.getUserProfilePictureUrl();
Log.i(TAG, "PROFILE URL: " + profileUrl);
Picasso.get().load(profileUrl).placeholder(R.drawable.user_placeholder).into(circleImageView);
textViewName.setText(user.getUserName());
} catch (Exception e) {
e.printStackTrace();
}
}
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = inflater.inflate(R.layout.vote_up_card, viewGroup, false);
return new UpVotesViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
if (viewHolder instanceof UpVotesViewHolder) {
((UpVotesViewHolder) viewHolder).bindHolder(i);
}
}
@Override
public int getItemCount() {
return userList.size();
}
public void setUpVoteList(List<User> userList) {
this.userList = userList;
}
}
\ No newline at end of file
package app.insti.adapter; package app.insti.adapter;
import android.content.Context; import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater; import android.view.LayoutInflater;
...@@ -20,7 +21,6 @@ import app.insti.api.model.User; ...@@ -20,7 +21,6 @@ import app.insti.api.model.User;
public class UserAdapter extends RecyclerView.Adapter<UserAdapter.ViewHolder> { public class UserAdapter extends RecyclerView.Adapter<UserAdapter.ViewHolder> {
private List<User> userList; private List<User> userList;
private Context context;
private Fragment fragment; private Fragment fragment;
public UserAdapter(List<User> userList, Fragment mFragment) { public UserAdapter(List<User> userList, Fragment mFragment) {
...@@ -28,9 +28,10 @@ public class UserAdapter extends RecyclerView.Adapter<UserAdapter.ViewHolder> { ...@@ -28,9 +28,10 @@ public class UserAdapter extends RecyclerView.Adapter<UserAdapter.ViewHolder> {
fragment = mFragment; fragment = mFragment;
} }
@NonNull
@Override @Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
context = parent.getContext(); Context context = parent.getContext();
View v = LayoutInflater.from(context) View v = LayoutInflater.from(context)
.inflate(R.layout.feed_card, parent, false); .inflate(R.layout.feed_card, parent, false);
final ViewHolder postViewHolder = new ViewHolder(v); final ViewHolder postViewHolder = new ViewHolder(v);
...@@ -46,7 +47,7 @@ public class UserAdapter extends RecyclerView.Adapter<UserAdapter.ViewHolder> { ...@@ -46,7 +47,7 @@ public class UserAdapter extends RecyclerView.Adapter<UserAdapter.ViewHolder> {
} }
@Override @Override
public void onBindViewHolder(ViewHolder holder, int position) { public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
User user = userList.get(position); User user = userList.get(position);
holder.userName.setText(user.getUserName()); holder.userName.setText(user.getUserName());
if (user.getCurrentRole() == null || user.getCurrentRole().equals("")) { if (user.getCurrentRole() == null || user.getCurrentRole().equals("")) {
...@@ -72,15 +73,15 @@ public class UserAdapter extends RecyclerView.Adapter<UserAdapter.ViewHolder> { ...@@ -72,15 +73,15 @@ public class UserAdapter extends RecyclerView.Adapter<UserAdapter.ViewHolder> {
} }
public class ViewHolder extends RecyclerView.ViewHolder { public class ViewHolder extends RecyclerView.ViewHolder {
public TextView userName; private TextView userName;
public TextView role; private TextView role;
public ImageView image; public ImageView image;
public ViewHolder(View itemView) { public ViewHolder(View itemView) {
super(itemView); super(itemView);
userName = (TextView) itemView.findViewById(R.id.object_title); userName = itemView.findViewById(R.id.object_title);
role = (TextView) itemView.findViewById(R.id.object_subtitle); role = itemView.findViewById(R.id.object_subtitle);
image = (ImageView) itemView.findViewById(R.id.object_picture); image = itemView.findViewById(R.id.object_picture);
} }
} }
} }
package app.insti.api;
import android.util.Log;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapView;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
/**
* Created by Shivam Sharma on 13-08-2018.
* <p>
* This API updates the Google Map when the location is added.
*/
public class LocationAPIUtils {
private static final String TAG = LocationAPIUtils.class.getSimpleName();
private GoogleMap googleMap;
private MapView mMapView;
public LocationAPIUtils(GoogleMap googleMap, MapView mMapView) {
this.googleMap = googleMap;
this.mMapView = mMapView;
}
public void callGoogleToShowLocationOnMap( final LatLng location, final String name, final String address, final int cursor) {
mMapView.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap mMap) {
googleMap = mMap;
if (cursor != 0) {
googleMap.clear();
}
googleMap.addMarker(new MarkerOptions().position(location).title(name).snippet(address));
CameraPosition cameraPosition = new CameraPosition.Builder().target(location).zoom(17).build();
googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
Log.i(TAG, "curser = " + cursor);
}
});
}
}
\ No newline at end of file
...@@ -11,10 +11,14 @@ import app.insti.api.model.Notification; ...@@ -11,10 +11,14 @@ import app.insti.api.model.Notification;
import app.insti.api.model.PlacementBlogPost; import app.insti.api.model.PlacementBlogPost;
import app.insti.api.model.TrainingBlogPost; import app.insti.api.model.TrainingBlogPost;
import app.insti.api.model.User; import app.insti.api.model.User;
import app.insti.api.model.Venter;
import app.insti.api.model.Venue; import app.insti.api.model.Venue;
import app.insti.api.request.CommentCreateRequest;
import app.insti.api.request.ComplaintCreateRequest;
import app.insti.api.request.EventCreateRequest; import app.insti.api.request.EventCreateRequest;
import app.insti.api.request.ImageUploadRequest; import app.insti.api.request.ImageUploadRequest;
import app.insti.api.request.UserFCMPatchRequest; import app.insti.api.request.UserFCMPatchRequest;
import app.insti.api.response.ComplaintCreateResponse;
import app.insti.api.response.EventCreateResponse; import app.insti.api.response.EventCreateResponse;
import app.insti.api.response.ExploreResponse; import app.insti.api.response.ExploreResponse;
import app.insti.api.response.ImageUploadResponse; import app.insti.api.response.ImageUploadResponse;
...@@ -22,10 +26,12 @@ import app.insti.api.response.LoginResponse; ...@@ -22,10 +26,12 @@ import app.insti.api.response.LoginResponse;
import app.insti.api.response.NewsFeedResponse; import app.insti.api.response.NewsFeedResponse;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.http.Body; import retrofit2.http.Body;
import retrofit2.http.DELETE;
import retrofit2.http.GET; import retrofit2.http.GET;
import retrofit2.http.Header; import retrofit2.http.Header;
import retrofit2.http.PATCH; import retrofit2.http.PATCH;
import retrofit2.http.POST; import retrofit2.http.POST;
import retrofit2.http.PUT;
import retrofit2.http.Path; import retrofit2.http.Path;
import retrofit2.http.Query; import retrofit2.http.Query;
...@@ -107,4 +113,29 @@ public interface RetrofitInterface { ...@@ -107,4 +113,29 @@ public interface RetrofitInterface {
@GET("search") @GET("search")
Call<ExploreResponse> search(@Header("Cookie") String sessionID, @Query("query") String query); Call<ExploreResponse> search(@Header("Cookie") String sessionID, @Query("query") String query);
@GET("venter/complaints")
Call<List<Venter.Complaint>> getAllComplaints(@Header("Cookie") String sessionId);
@GET("venter/complaints?filter=me")
Call<List<Venter.Complaint>> getUserComplaints(@Header("Cookie") String sessionId);
@GET("venter/complaints/{complaintId}")
Call<Venter.Complaint> getComplaint(@Header("Cookie") String sessionId, @Path("complaintId") String complaintId);
@GET("venter/complaints/{complaintId}/upvote")
Call<Venter.Complaint> upVote(@Header("Cookie") String sessionId, @Path("complaintId") String complaintId, @Query("action") int count);
@POST("venter/complaints")
Call<ComplaintCreateResponse> postComplaint(@Header("Cookie") String sessionId, @Body ComplaintCreateRequest complaintCreateRequest);
@POST("venter/complaints/{complaintId}/comments")
Call<Venter.Comment> postComment(@Header("Cookie") String sessionId, @Path("complaintId") String commentId, @Body CommentCreateRequest commentCreateRequest);
@PUT("venter/comments/{commentId}")
Call<Venter.Comment> updateComment(@Header("Cookie") String sessionId, @Path("commentId") String commentId, @Body CommentCreateRequest commentCreateRequest);
@DELETE("venter/comments/{commentId}")
Call<String> deleteComment(@Header("Cookie") String sessionId, @Path("commentId") String commentId);
} }
package app.insti.api.model;
import android.support.annotation.NonNull;
import com.google.gson.annotations.SerializedName;
import java.util.List;
/**
* Created by Shivam Sharma on 04-09-2018.
*/
public class Venter {
public static class Complaint{
@SerializedName("id")
private String complaintID;
@SerializedName("created_by")
private User complaintCreatedBy;
@SerializedName("description")
private String description;
@SerializedName("report_date")
private String complaintReportDate;
@SerializedName("status")
private String status;
@SerializedName("latitude")
private Float latitude;
@SerializedName("longitude")
private Float longitude;
@SerializedName("location_description")
private String locationDescription;
@SerializedName("tags")
private List<TagUri> tags;
@SerializedName("users_up_voted")
private List<User> usersUpVoted;
@SerializedName("images")
private List<String> images;
@SerializedName("comments")
private List<Comment> comment;
private int voteCount;
@NonNull
public String getComplaintID() {
return complaintID;
}
public void setComplaintID(@NonNull String complaintID) {
this.complaintID = complaintID;
}
public User getComplaintCreatedBy() {
return complaintCreatedBy;
}
public void setComplaintCreatedBy(User complaintCreatedBy) {
this.complaintCreatedBy = complaintCreatedBy;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getComplaintReportDate() {
return complaintReportDate;
}
public void setComplaintReportDate(String complaintReportDate) {
this.complaintReportDate = complaintReportDate;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public Float getLatitude() {
return latitude;
}
public void setLatitude(Float latitude) {
this.latitude = latitude;
}
public Float getLongitude() {
return longitude;
}
public void setLongitude(Float longitude) {
this.longitude = longitude;
}
public String getLocationDescription() {
return locationDescription;
}
public void setLocationDescription(String locationDescription) {
this.locationDescription = locationDescription;
}
public List<TagUri> getTags() {
return tags;
}
public void setTags(List<TagUri> tags) {
this.tags = tags;
}
public List<User> getUsersUpVoted() {
return usersUpVoted;
}
public void setUsersUpVoted(List<User> usersUpVoted) {
this.usersUpVoted = usersUpVoted;
}
public List<String> getImages() {
return images;
}
public void setImages(List<String> images) {
this.images = images;
}
public List<Comment> getComment() {
return comment;
}
public void setComment(List<Comment> comment) {
this.comment = comment;
}
public int getVoteCount() {
return voteCount;
}
public void setVoteCount(int voteCount) {
this.voteCount = voteCount;
}
}
public static class TagUri {
@SerializedName("id")
private String id;
@SerializedName("tag_uri")
private String tagUri;
@NonNull
public String getId() {
return id;
}
public void setId(@NonNull String id) {
this.id = id;
}
public String getTagUri() {
return tagUri;
}
public void setTagUri(String tagUri) {
this.tagUri = tagUri;
}
}
public static class Comment {
@SerializedName("id")
private String id;
@SerializedName("time")
private String time;
@SerializedName("text")
private String text;
@SerializedName("commented_by")
private User commented_by;
@NonNull
public String getId() {
return id;
}
public void setId(@NonNull String id) {
this.id = id;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public User getUser() {
return commented_by;
}
public void setUser(User commented_by) {
this.commented_by = commented_by;
}
}
}
package app.insti.api.request;
import com.google.gson.annotations.SerializedName;
/**
* Created by Shivam Sharma on 21-09-2018.
*/
public class CommentCreateRequest {
@SerializedName("text")
private String text;
public CommentCreateRequest(String text) {
this.text = text;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
package app.insti.api.request;
import com.google.gson.annotations.SerializedName;
import java.util.List;
/**
* Created by Shivam Sharma on 18-09-2018.
*/
public class ComplaintCreateRequest {
@SerializedName("description")
private String complaintDescription;
@SerializedName("location_description")
private String complaintLocation;
@SerializedName("latitude")
private Float complaintLatitude;
@SerializedName("longitude")
private Float complaintLongitude;
@SerializedName("tags")
private List<String> tags;
@SerializedName("images")
private List<String> images;
public ComplaintCreateRequest(String complaintDescription, String complaintLocation, Float complaintLatitude, Float complaintLongitude, List<String> tags, List<String> images) {
this.complaintDescription = complaintDescription;
this.complaintLocation = complaintLocation;
this.complaintLatitude = complaintLatitude;
this.complaintLongitude = complaintLongitude;
this.tags = tags;
this.images = images;
}
public String getComplaintDescription() {
return complaintDescription;
}
public void setComplaintDescription(String complaintDescription) {
this.complaintDescription = complaintDescription;
}
public String getComplaintLocation() {
return complaintLocation;
}
public void setComplaintLocation(String complaintLocation) {
this.complaintLocation = complaintLocation;
}
public Float getComplaintLatitude() {
return complaintLatitude;
}
public void setComplaintLatitude(Float complaintLatitude) {
this.complaintLatitude = complaintLatitude;
}
public Float getComplaintLongitude() {
return complaintLongitude;
}
public void setComplaintLongitude(Float complaintLongitude) {
this.complaintLongitude = complaintLongitude;
}
public List<String> getTags() {
return tags;
}
public void setTags(List<String> tags) {
this.tags = tags;
}
public List<String> getImages() {
return images;
}
public void setImages(List<String> images) {
this.images = images;
}
}
package app.insti.api.response;
/**
* Created by Shivam Sharma on 18-09-2018.
*/
public class ComplaintCreateResponse {
private String result;
private String complaintId;
public ComplaintCreateResponse(String result, String complaintId) {
this.result = result;
this.complaintId = complaintId;
}
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
public String getComplaintId() {
return complaintId;
}
public void setComplaintId(String complaintId) {
this.complaintId = complaintId;
}
}
package app.insti.fragment;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.AppBarLayout;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.Objects;
import app.insti.R;
import app.insti.Utils;
import app.insti.adapter.ComplaintDetailsPagerAdapter;
import app.insti.api.RetrofitInterface;
import app.insti.api.model.User;
import app.insti.api.model.Venter;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class ComplaintFragment extends Fragment {
private static final String TAG = ComplaintFragment.class.getSimpleName();
private TabLayout slidingTabLayout;
private ViewPager viewPager;
private View mview;
private String complaintId, sessionID, userId, userProfileUrl;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_complaint, container, false);
slidingTabLayout = view.findViewById(R.id.sliding_tab_layout);
this.mview = view;
return view;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Bundle bundle = getArguments();
if (bundle != null) {
complaintId = bundle.getString("id");
sessionID = bundle.getString("sessionId");
userId = bundle.getString("userId");
userProfileUrl = bundle.getString("userProfileUrl");
callServerToGetDetailedComplaint();
}
}
private void callServerToGetDetailedComplaint() {
RetrofitInterface retrofitInterface = Utils.getRetrofitInterface();
retrofitInterface.getComplaint("sessionid=" + sessionID, complaintId).enqueue(new Callback<Venter.Complaint>() {
@Override
public void onResponse(Call<Venter.Complaint> call, Response<Venter.Complaint> response) {
if (response.body() != null) {
Venter.Complaint complaint = response.body();
if (complaint != null) {
for (User currentUser : complaint.getUsersUpVoted()) {
if (currentUser.getUserID().equals(userId)) {
complaint.setVoteCount(1);
} else {
complaint.setVoteCount(0);
}
}
}
initTabViews(complaint);
//Make progress circle gone After loading
getActivity().findViewById(R.id.loadingPanel).setVisibility(View.GONE);
}
}
@Override
public void onFailure(Call<Venter.Complaint> call, Throwable t) {
if (t != null) {
Log.i(TAG, "error and t = " + t.toString());
}
}
});
}
private void initTabViews(final Venter.Complaint detailedComplaint) {
try {
if (detailedComplaint != null) {
viewPager = mview.findViewById(R.id.tab_viewpager_details);
if (viewPager != null) {
Log.i(TAG, "viewPager != null");
ComplaintDetailsPagerAdapter complaintDetailsPagerAdapter = new ComplaintDetailsPagerAdapter(getChildFragmentManager(), sessionID, complaintId, userId, userProfileUrl);
viewPager.setAdapter(complaintDetailsPagerAdapter);
slidingTabLayout.setupWithViewPager(viewPager);
slidingTabLayout.post(new Runnable() {
@Override
public void run() {
int tablLayoutWidth = slidingTabLayout.getWidth();
DisplayMetrics metrics = new DisplayMetrics();
Objects.requireNonNull(getActivity()).getWindowManager().getDefaultDisplay().getMetrics(metrics);
int deviceWidth = metrics.widthPixels;
if (tablLayoutWidth <= deviceWidth) {
final TypedArray styledAttributes = Objects.requireNonNull(ComplaintFragment.this.getActivity()).getTheme().obtainStyledAttributes(
new int[]{android.R.attr.actionBarSize});
styledAttributes.recycle();
//Replace second parameter to mActionBarSize = (int) styledAttributes.getDimension(0, 0) after adding "Relevant Complaints"
AppBarLayout.LayoutParams layoutParams = new AppBarLayout.LayoutParams(AppBarLayout.LayoutParams.MATCH_PARENT,
0);
slidingTabLayout.setLayoutParams(layoutParams);
slidingTabLayout.setTabMode(TabLayout.MODE_FIXED);
slidingTabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
} else {
slidingTabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
}
}
});
slidingTabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
//on Tab Unselected
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
//on Tab Reselected
}
});
ComplaintDetailsFragment complaintDetailsFragment = (ComplaintDetailsFragment) getChildFragmentManager().findFragmentByTag(
"android:switcher:" + R.id.tab_viewpager_details + ":0"
);
if (complaintDetailsFragment != null)
complaintDetailsFragment.setDetailedComplaint(detailedComplaint);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
\ No newline at end of file
package app.insti.fragment;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.support.design.widget.AppBarLayout;
import android.support.design.widget.CollapsingToolbarLayout;
import android.support.design.widget.TabLayout;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.ViewPager;
import android.support.v7.widget.Toolbar;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import app.insti.Constants;
import app.insti.R;
import app.insti.adapter.ComplaintFragmentViewPagerAdapter;
public class ComplaintsFragment extends BaseFragment {
private String userID, userProfileUrl;
private TabLayout slidingTabLayout;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_complaints, container, false);
Toolbar toolbar = getActivity().findViewById(R.id.toolbar);
toolbar.setTitle("Complaints/Suggestions");
Bundle bundle = getArguments();
userID = bundle.getString(Constants.USER_ID);
userProfileUrl = bundle.getString(Constants.CURRENT_USER_PROFILE_PICTURE);
CollapsingToolbarLayout collapsingToolbarLayout = view.findViewById(R.id.collapsing_toolbar);
collapsingToolbarLayout.setTitleEnabled(false);
ViewPager viewPager = view.findViewById(R.id.tab_viewpager);
slidingTabLayout = view.findViewById(R.id.sliding_tab_layout);
Button buttonVentIssues = view.findViewById(R.id.buttonVentIssues);
buttonVentIssues.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FileComplaintFragment fileComplaintFragment = new FileComplaintFragment();
fileComplaintFragment.setArguments(getArguments());
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.framelayout_for_fragment, fileComplaintFragment, fileComplaintFragment.getTag());
fragmentTransaction.addToBackStack("Complaint Fragment").commit();
}
});
slidingTabLayout = view.findViewById(R.id.sliding_tab_layout);
if (viewPager != null) {
setupViewPager(viewPager);
}
return view;
}
private void setupViewPager(final ViewPager viewPager) {
viewPager.setAdapter(new ComplaintFragmentViewPagerAdapter(getChildFragmentManager(), userID, getArguments().getString(Constants.SESSION_ID), userProfileUrl));
slidingTabLayout.setupWithViewPager(viewPager);
slidingTabLayout.post(new Runnable() {
@Override
public void run() {
int tabLayoutWidth = slidingTabLayout.getWidth();
DisplayMetrics metrics = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
int deviceWidth = metrics.widthPixels;
if (tabLayoutWidth <= (deviceWidth + 1)) {
final TypedArray styledAttributes = getActivity().getTheme().obtainStyledAttributes(
new int[]{android.R.attr.actionBarSize}
);
int mActionBarSize = (int) styledAttributes.getDimension(0, 0);
styledAttributes.recycle();
AppBarLayout.LayoutParams layoutParams = new AppBarLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
mActionBarSize);
slidingTabLayout.setLayoutParams(layoutParams);
slidingTabLayout.setTabMode(TabLayout.MODE_FIXED);
slidingTabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
} else {
slidingTabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
}
}
});
slidingTabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
//On Tab Unselected
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
//On Tab Reselected
}
});
viewPager.setOffscreenPageLimit(3);
}
}
package app.insti.fragment;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.List;
import app.insti.R;
import app.insti.Utils;
import app.insti.adapter.ComplaintsAdapter;
import app.insti.api.RetrofitInterface;
import app.insti.api.model.Venter;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class ComplaintsHomeFragment extends Fragment {
private ComplaintsAdapter homeListAdapter;
private SwipeRefreshLayout swipeContainer;
private static String TAG = ComplaintsHomeFragment.class.getSimpleName();
private boolean isCalled = false;
private TextView error_message_home;
private static String sID, uID, uProfileUrl;
public static ComplaintsHomeFragment getInstance(String sessionID, String userID, String userProfileUrl) {
sID = sessionID;
uID = userID;
uProfileUrl = userProfileUrl;
return new ComplaintsHomeFragment();
}
@Override
public void onStart() {
super.onStart();
swipeContainer.post(new Runnable() {
@Override
public void run() {
swipeContainer.setRefreshing(true);
callServerToGetNearbyComplaints();
}
});
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_complaints_home, container, false);
RecyclerView recyclerViewHome = view.findViewById(R.id.recyclerViewHome);
homeListAdapter = new ComplaintsAdapter(getActivity(), sID, uID, uProfileUrl);
swipeContainer = view.findViewById(R.id.swipeContainer);
error_message_home = view.findViewById(R.id.error_message_home);
LinearLayoutManager llm = new LinearLayoutManager(getActivity());
recyclerViewHome.setLayoutManager(llm);
recyclerViewHome.setHasFixedSize(true);
recyclerViewHome.setAdapter(homeListAdapter);
swipeContainer.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
callServerToGetNearbyComplaints();
}
});
swipeContainer.setColorSchemeResources(R.color.colorPrimary);
if (!isCalled) {
swipeContainer.post(new Runnable() {
@Override
public void run() {
swipeContainer.setRefreshing(true);
callServerToGetNearbyComplaints();
}
});
isCalled = true;
}
return view;
}
private void callServerToGetNearbyComplaints() {
try {
RetrofitInterface retrofitInterface = Utils.getRetrofitInterface();
retrofitInterface.getAllComplaints("sessionid=" + sID).enqueue(new Callback<List<Venter.Complaint>>() {
@Override
public void onResponse(@NonNull Call<List<Venter.Complaint>> call, @NonNull Response<List<Venter.Complaint>> response) {
if (response.body() != null && !(response.body().isEmpty())) {
Log.i(TAG, "response.body != null");
Log.i(TAG, "response: " + response.body());
initialiseRecyclerView(response.body());
swipeContainer.setRefreshing(false);
} else {
Log.i(TAG, "response.body is empty");
error_message_home.setVisibility(View.VISIBLE);
error_message_home.setText(getString(R.string.no_complaints));
swipeContainer.setRefreshing(false);
}
}
@Override
public void onFailure(@NonNull Call<List<Venter.Complaint>> call, @NonNull Throwable t) {
Log.i(TAG, "failure" + t.toString());
swipeContainer.setRefreshing(false);
error_message_home.setVisibility(View.VISIBLE);
}
});
} catch (Exception e) {
e.printStackTrace();
swipeContainer.setRefreshing(false);
}
}
private void initialiseRecyclerView(List<Venter.Complaint> list) {
homeListAdapter.setcomplaintList(list);
homeListAdapter.notifyDataSetChanged();
}
}
package app.insti.fragment;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.List;
import app.insti.R;
import app.insti.Utils;
import app.insti.adapter.ComplaintsAdapter;
import app.insti.api.RetrofitInterface;
import app.insti.api.model.Venter;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class ComplaintsMeFragment extends Fragment {
private static String uID, sID, uProfileUrl;
private ComplaintsAdapter meListAdapter;
private TextView error_message_me;
private SwipeRefreshLayout swipeContainer;
private static String TAG = ComplaintsMeFragment.class.getSimpleName();
private boolean isCalled = false;
public static ComplaintsMeFragment getInstance(String sessionID, String userID, String userProfileUrl) {
sID = sessionID;
uID = userID;
uProfileUrl = userProfileUrl;
return new ComplaintsMeFragment();
}
@Override
public void onStart() {
super.onStart();
swipeContainer.post(new Runnable() {
@Override
public void run() {
swipeContainer.setRefreshing(true);
getMeItems();
}
});
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_complaints_me, container, false);
RecyclerView recyclerViewMe = view.findViewById(R.id.recyclerViewMe);
meListAdapter = new ComplaintsAdapter(getActivity(), sID, uID, uProfileUrl);
swipeContainer = view.findViewById(R.id.swipeContainer);
error_message_me = view.findViewById(R.id.error_message_me);
LinearLayoutManager llm = new LinearLayoutManager(getActivity());
recyclerViewMe.setLayoutManager(llm);
recyclerViewMe.setHasFixedSize(true);
recyclerViewMe.setAdapter(meListAdapter);
swipeContainer.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
getMeItems();
}
});
swipeContainer.setColorSchemeColors(getResources().getColor(R.color.colorPrimary));
if (!isCalled) {
swipeContainer.post(new Runnable() {
@Override
public void run() {
swipeContainer.setRefreshing(true);
getMeItems();
}
});
isCalled = true;
}
return view;
}
private void getMeItems() {
callServerToGetMyComplaints();
}
private void callServerToGetMyComplaints() {
try {
RetrofitInterface retrofitInterface = Utils.getRetrofitInterface();
retrofitInterface.getUserComplaints("sessionid=" + sID).enqueue(new Callback<List<Venter.Complaint>>() {
@Override
public void onResponse(@NonNull Call<List<Venter.Complaint>> call, @NonNull Response<List<Venter.Complaint>> response) {
if (response.body() != null && !(response.body().isEmpty())) {
Log.i(TAG, "response.body != null");
Log.i(TAG, "response: " + response.body());
initialiseRecyclerView(response.body());
swipeContainer.setRefreshing(false);
} else {
error_message_me.setVisibility(View.VISIBLE);
error_message_me.setText(getString(R.string.no_complaints));
swipeContainer.setRefreshing(false);
}
}
@Override
public void onFailure(@NonNull Call<List<Venter.Complaint>> call, @NonNull Throwable t) {
Log.i(TAG, "failure" + t.toString());
swipeContainer.setRefreshing(false);
error_message_me.setVisibility(View.VISIBLE);
}
});
} catch (Exception e) {
e.printStackTrace();
swipeContainer.setRefreshing(false);
}
}
private void initialiseRecyclerView(List<Venter.Complaint> list) {
meListAdapter.setcomplaintList(list);
meListAdapter.notifyDataSetChanged();
}
}
package app.insti.utils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;
public class DateTimeUtil {
public static String getDate(String dtStart) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'+05:30'");
try {
Date date = format.parse(dtStart);
Date now = new Date();
long diff = System.currentTimeMillis() - date.getTime();
long seconds = TimeUnit.MILLISECONDS.toSeconds(now.getTime() - date.getTime());
long minutes = TimeUnit.MILLISECONDS.toMinutes(now.getTime() - date.getTime());
long hours = TimeUnit.MILLISECONDS.toHours(now.getTime() - date.getTime());
if (seconds <= 0) {
return "now";
} else if (seconds < 60 && seconds > 1) {
return seconds + " seconds ago";
} else if (minutes == 1) {
return " 1 minute ago";
} else if (minutes < 60 && minutes > 1) {
return minutes + " minutes ago";
} else if (hours == 1) {
return "an hour ago";
} else if (hours < 24 && hours > 1) {
return hours + " hours ago";
} else {
long days = Math.round(diff / (24.0 * 60 * 60 * 1000));
if (days == 0)
return "today";
else if (days == 1)
return "yesterday";
else if (days == 1)
return "a day ago";
else if (days < 14)
return days + " days ago";
else if (days < 30)
if ((int) (days / 7) == 1)
return "a week ago";
else
return ((int) (days / 7)) + " weeks ago";
else if (days < 365)
if ((int) (days / 30) == 1)
return ((int) (days / 30)) + " month ago";
else
return ((int) (days / 30)) + " months ago";
else
if ((int) (days / 365) == 1)
return "a year ago";
else
return ((int) (days / 365)) + " years ago";
}
} catch (ParseException e) {
e.printStackTrace();
}
return "";
}
}
\ No newline at end of file
package app.insti.utils;
/**
* Created by Shivam Sharma on 13-08-2018.
*/
public class TagCategories {
public static final String[] CATEGORIES = new String[]{
"Used Flexes",
"Plastic Bottles (in Hostel messes)",
"Placards on Trees",
"Request for donation of clothes",
"Other donations",
"Cattle Issues",
"Autorickshaws",
"Potholes in Roads",
"Broken stormwater drains",
"Desilting - lakes",
"Flooding of roads and footpaths",
"Damaged footbaths",
"Garbage issues",
"Illegal posters and boardings",
"Manholes",
"Streetlights issues",
"Sewage drains issues",
"Toilets infrastructural issues",
"Fencing issues",
"Security issues",
"Infrastructural defaults in the academic area",
"Cycle pooling issues",
"Water coolers & Aqua Guards",
"Mess menu complaints",
"PHO cleaning complaints",
"PHO cleaning complaints",
"Hostel common room complaints",
"Hostel Stationary shop complaints"
};
}
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:innerRadius="0dp"
android:shape="ring"
android:thicknessRatio="2"
android:useLevel="false" >
<solid
android:color="@android:color/black"/>
<stroke
android:width="1dp"
android:color="@android:color/white" />
</shape>
\ No newline at end of file
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M4,12l1.41,1.41L11,7.83V20h2V7.83l5.58,5.59L20,12l-8,-8 -8,8z"/>
</vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M21.99,4c0,-1.1 -0.89,-2 -1.99,-2L4,2c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h14l4,4 -0.01,-18zM18,14L6,14v-2h12v2zM18,11L6,11L6,9h12v2zM18,8L6,8L6,6h12v2z"/>
</vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M20,2L4,2c-1.1,0 -1.99,0.9 -1.99,2L2,22l4,-4h14c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM13,14h-2v-2h2v2zM13,10h-2L11,6h2v4z"/>
</vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M2.01,21L23,12 2.01,3 2,10l15,2 -15,2z"/>
</vector>
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="20dp"/>
<padding android:left="10dp" android:right="10dp"/>
<stroke android:width="1dp" android:color="@color/colorPrimary"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/cardViewComment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="vertical"
android:layout_margin="5dp"
android:padding="10dp"
app:cardUseCompatPadding="true"
app:cardBackgroundColor="@color/colorWhite"
app:cardCornerRadius="0dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp"
android:orientation="horizontal">
<de.hdodenhof.circleimageview.CircleImageView
android:id="@+id/circleImageViewUserImage"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_gravity="center"
android:scaleType="centerCrop" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="12dp"
android:layout_marginRight="12dp"
android:layout_weight="3"
android:orientation="vertical">
<TextView
android:id="@+id/textViewUserComment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="User Name"
android:textColor="@android:color/black"
android:textSize="18sp" />
<TextView
android:id="@+id/textViewTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Time of Comment" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/textViewComment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:scrollHorizontally="true"
android:text="Comment"
android:textSize="16sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</android.support.v7.widget.CardView>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:id="@+id/cardView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_gravity="center"
android:layout_margin="5dp"
card_view:cardBackgroundColor="@color/colorWhite"
card_view:cardCornerRadius="0dp"
card_view:cardElevation="5dp"
card_view:cardUseCompatPadding="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="15dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="4">
<TextView
android:id="@+id/textViewUserName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="4"
android:text="User"
android:textColor="@android:color/black"
android:textSize="16sp"
android:textStyle="bold" />
<TextView
android:id="@+id/textViewStatus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingHorizontal="10dp"
android:text="status"
android:textColor="@android:color/black"
android:textSize="16sp"
android:textStyle="bold"
android:background="@drawable/customborder" />
</LinearLayout>
<TextView
android:id="@+id/textViewReportDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="report date"
android:textColor="@color/colorGray"
android:textSize="14sp" />
<TextView
android:id="@+id/textViewLocation"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="location"
android:textColor="@color/colorGray"
android:textSize="14sp" />
<View
android:layout_width="match_parent"
android:layout_height="10dp" />
<TextView
android:id="@+id/textViewDescription"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="location"
android:textColor="@android:color/black"
android:textSize="14sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:orientation="horizontal"
android:layout_gravity="center_horizontal"
android:paddingStart="50dp"
android:paddingEnd="20dp"
android:weightSum="2"
android:background="@drawable/customborder">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:weightSum="2">
<ImageButton
android:id="@+id/buttonVotes"
style="@style/Widget.AppCompat.Button.Borderless"
android:layout_width="10dp"
android:layout_height="40dp"
android:layout_weight="1"
android:src="@drawable/baseline_arrow_upward_24" />
<TextView
android:id="@+id/text_votes"
android:layout_width="20dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center_vertical"
android:text="23"
android:textColor="@color/secondaryTextColor"/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:weightSum="2">
<ImageButton
android:id="@+id/buttonComments"
style="@style/Widget.AppCompat.Button.Borderless"
android:layout_width="10dp"
android:layout_height="40dp"
android:layout_weight="1"
android:src="@drawable/baseline_comment_24" />
<TextView
android:id="@+id/text_comments"
android:layout_width="20dp"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:textColor="@color/secondaryTextColor"
android:layout_weight="1"
android:text="12"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</android.support.v7.widget.CardView>
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment