Commit 4879d4b3 authored by Varun Patil's avatar Varun Patil

Revamp SettingsFragment to use PreferencesFragmentCompat

parent e2cedc42
......@@ -45,6 +45,7 @@ dependencies {
implementation "com.android.support:design:${supportLibVersion}"
implementation "com.android.support:exifinterface:${supportLibVersion}"
implementation "com.android.support:support-v4:${supportLibVersion}"
implementation "com.android.support:preference-v7:${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-places:${playServicesVersion}"
......
package app.insti.fragment;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceFragmentCompat;
import android.support.v7.preference.SwitchPreferenceCompat;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.Switch;
import android.widget.TextView;
import com.squareup.picasso.Picasso;
import app.insti.Constants;
import app.insti.R;
import app.insti.SessionManager;
import app.insti.Utils;
import app.insti.activity.LoginActivity;
import app.insti.activity.MainActivity;
import app.insti.api.EmptyCallback;
import app.insti.api.RetrofitInterface;
import app.insti.api.model.User;
import app.insti.api.request.UserShowContactPatchRequest;
......@@ -30,169 +21,145 @@ import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
/**
* A simple {@link Fragment} subclass.
*/
public class SettingsFragment extends Fragment {
User user;
public SettingsFragment() {
// Required empty public constructor
}
public class SettingsFragment extends PreferenceFragmentCompat {
SwitchPreferenceCompat showContactPref;
Preference profilePref;
Preference feedbackPref;
Preference aboutPref;
Preference logoutPref;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_settings, container, false);
}
@Override
public void onStart() {
super.onStart();
Toolbar toolbar = getActivity().findViewById(R.id.toolbar);
toolbar.setTitle("Settings");
Utils.setSelectedMenuItem(getActivity(), R.id.nav_settings);
Bundle bundle = getArguments();
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setPreferencesFromResource(R.xml.preferences, rootKey);
String userID = bundle.getString(Constants.USER_ID);
populateViews();
RetrofitInterface retrofitInterface = Utils.getRetrofitInterface();
retrofitInterface.getUser(Utils.getSessionIDHeader(), userID).enqueue(new Callback<User>() {
// Show contact number
showContactPref = (SwitchPreferenceCompat) findPreference("show_contact");
showContactPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public void onResponse(Call<User> call, Response<User> response) {
if (response.isSuccessful()) {
user = response.body();
populateUserCard();
setupContactSwitch(user);
}
public boolean onPreferenceChange(Preference preference, Object o) {
toggleShowContact((SwitchPreferenceCompat) preference, o);
return false;
}
});
// Update Profile
profilePref = findPreference("profile");
profilePref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public void onFailure(Call<User> call, Throwable t) {
public boolean onPreferenceClick(Preference preference) {
openWebURL("https://gymkhana.iitb.ac.in/sso/user");
return false;
}
});
}
private void setupContactSwitch(User user) {
final Switch showContactSwitch = getView().findViewById(R.id.show_contact_switch);
showContactSwitch.setVisibility(View.VISIBLE);
showContactSwitch.setChecked(user.getShowContactNumber());
showContactSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
// Feedback
feedbackPref = findPreference("feedback");
feedbackPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, final boolean isChecked) {
showContactSwitch.setEnabled(false);
RetrofitInterface retrofitInterface = Utils.getRetrofitInterface();
retrofitInterface.patchUserMe(Utils.getSessionIDHeader(), new UserShowContactPatchRequest(isChecked)).enqueue(new Callback<User>() {
@Override
public void onResponse(Call<User> call, Response<User> response) {
if (response.isSuccessful()) {
showContactSwitch.setEnabled(true);
} else {
showContactSwitch.setChecked(!isChecked);
showContactSwitch.setEnabled(true);
}
}
@Override
public void onFailure(Call<User> call, Throwable t) {
showContactSwitch.setChecked(!isChecked);
showContactSwitch.setEnabled(true);
}
});
public boolean onPreferenceClick(Preference preference) {
openWebURL("https://insti.app/feedback");
return false;
}
});
}
private void populateUserCard() {
if (getActivity() == null || getView() == null) {
return;
}
ImageView userProfilePictureImageView = getActivity().findViewById(R.id.user_card_avatar);
TextView userNameTextView = getActivity().findViewById(R.id.user_card_name);
Picasso.get()
.load(user.getUserProfilePictureUrl())
.resize(800, 0)
.placeholder(R.drawable.user_placeholder)
.into(userProfilePictureImageView);
userNameTextView.setText(user.getUserName());
// About
aboutPref = findPreference("about");
aboutPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
openAbout();
return false;
}
});
getView().findViewById(R.id.role_card_layout).setOnClickListener(new View.OnClickListener() {
// Logout
logoutPref = findPreference("logout");
logoutPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public void onClick(View v) {
UserFragment userFragment = UserFragment.newInstance(user.getUserID());
((MainActivity)getActivity()).updateFragment(userFragment);
public boolean onPreferenceClick(Preference preference) {
logout();
return false;
}
});
// Disable buttons if not logged in
final SessionManager sessionManager = new SessionManager(getContext());
if (!sessionManager.isLoggedIn()) {
showContactPref.setVisible(false);
logoutPref.setVisible(false);
}
}
private void populateViews() {
// Check if we exist
if (getActivity() == null || getView() == null) return;
@Override
public void onStart() {
super.onStart();
Button updateProfileButton = getView().findViewById(R.id.settings_update_profile);
Button feedbackButton = getView().findViewById(R.id.settings_feedback);
Button aboutButton = getView().findViewById(R.id.settings_about);
Button logoutButton = getView().findViewById(R.id.settings_logout);
// Set toolbar title
Toolbar toolbar = getActivity().findViewById(R.id.toolbar);
toolbar.setTitle("Settings");
Utils.setSelectedMenuItem(getActivity(), R.id.nav_settings);
updateProfileButton.setOnClickListener(new View.OnClickListener() {
// Get the user id
Bundle bundle = getArguments();
String userID = bundle.getString(Constants.USER_ID);
// Fill in the user
RetrofitInterface retrofitInterface = Utils.getRetrofitInterface();
retrofitInterface.getUser(Utils.getSessionIDHeader(), userID).enqueue(new EmptyCallback<User>() {
@Override
public void onClick(View v) {
openWebURL("https://gymkhana.iitb.ac.in/sso/user");
public void onResponse(Call<User> call, Response<User> response) {
if (response.isSuccessful()) {
User user = response.body();
showContactPref.setChecked(user.getShowContactNumber());
}
}
});
feedbackButton.setOnClickListener(new View.OnClickListener() {
}
public void toggleShowContact(final SwitchPreferenceCompat showContactPref, Object o) {
final boolean isChecked = (boolean) o;
showContactPref.setEnabled(false);
RetrofitInterface retrofitInterface = Utils.getRetrofitInterface();
retrofitInterface.patchUserMe(Utils.getSessionIDHeader(), new UserShowContactPatchRequest(isChecked)).enqueue(new Callback<User>() {
@Override
public void onClick(View v) {
openWebURL("https://insti.app/feedback");
public void onResponse(Call<User> call, Response<User> response) {
if (response.isSuccessful()) {
showContactPref.setChecked(isChecked);
showContactPref.setEnabled(true);
} else {
showContactPref.setChecked(!isChecked);
showContactPref.setEnabled(true);
}
}
});
aboutButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Utils.updateFragment(new AboutFragment(), getActivity());
public void onFailure(Call<User> call, Throwable t) {
showContactPref.setChecked(!isChecked);
showContactPref.setEnabled(true);
}
});
}
// Logged in user vs Guest
public void openAbout() {
Utils.updateFragment(new AboutFragment(), getActivity());
}
public void logout() {
final SessionManager sessionManager = new SessionManager(getContext());
if (sessionManager.isLoggedIn()) {
logoutButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
RetrofitInterface retrofitInterface = Utils.getRetrofitInterface();
retrofitInterface.logout(Utils.getSessionIDHeader()).enqueue(new Callback<Void>() {
@Override
public void onResponse(Call<Void> call, Response<Void> response) {
if (response.isSuccessful()) {
sessionManager.logout();
Utils.clearCookies(getActivity());
Intent intent = new Intent(getContext(), LoginActivity.class);
startActivity(intent);
getActivity().finish();
}
//Server Error
}
@Override
public void onFailure(Call<Void> call, Throwable t) {
//Network Error
}
});
RetrofitInterface retrofitInterface = Utils.getRetrofitInterface();
retrofitInterface.logout(Utils.getSessionIDHeader()).enqueue(new EmptyCallback<Void>() {
@Override
public void onResponse(Call<Void> call, Response<Void> response) {
if (response.isSuccessful()) {
sessionManager.logout();
Utils.clearCookies(getActivity());
Intent intent = new Intent(getContext(), LoginActivity.class);
startActivity(intent);
getActivity().finish();
}
});
} else {
logoutButton.setVisibility(View.GONE);
getView().findViewById(R.id.role_card_layout).setVisibility(View.GONE);
}
}
});
}
private void openWebURL(String URL) {
......
<vector android:height="36dp" android:tint="#767676"
android:viewportHeight="24.0" android:viewportWidth="24.0"
android:width="36dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M6.62,10.79c1.44,2.83 3.76,5.14 6.59,6.59l2.2,-2.2c0.27,-0.27 0.67,-0.36 1.02,-0.24 1.12,0.37 2.33,0.57 3.57,0.57 0.55,0 1,0.45 1,1V20c0,0.55 -0.45,1 -1,1 -9.39,0 -17,-7.61 -17,-17 0,-0.55 0.45,-1 1,-1h3.5c0.55,0 1,0.45 1,1 0,1.25 0.2,2.45 0.57,3.57 0.11,0.35 0.03,0.74 -0.25,1.02l-2.2,2.2z"/>
</vector>
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<SwitchPreferenceCompat
app:key="show_contact"
app:title="Show contact number"
app:summary="Toggle visibility on your profile"
android:icon="@drawable/ic_local_phone_gray_36dp"/>
<Preference
app:key="profile"
app:title="Update Profile"
app:summary="Update personal details on SSO"
android:icon="@drawable/baseline_account_circle_gray_36"/>
<Preference
app:key="feedback"
app:title="Send feedback"
app:summary="Report technical issues or suggest new features"
android:icon="@drawable/baseline_feedback_gray_36"/>
<Preference
app:key="about"
app:title="About"
app:summary="The InstiApp Team"
android:icon="@drawable/baseline_info_gray_36"/>
<Preference
app:key="logout"
app:title="Logout"
app:summary="Sign out of InstiApp"
android:icon="@drawable/baseline_exit_to_app_gray_36"/>
</PreferenceScreen>
\ No newline at end of file
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