package bg.mentormate.academy.radarapp.fragments; import android.annotation.TargetApi; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; import com.parse.DeleteCallback; import com.parse.GetCallback; import com.parse.ParseException; import com.parse.ParseImageView; import com.parse.ParseObject; import com.parse.ParseQuery; import com.parse.SaveCallback; import java.util.ArrayList; import bg.mentormate.academy.radarapp.Constants; import bg.mentormate.academy.radarapp.R; import bg.mentormate.academy.radarapp.activities.EditProfileActivity; import bg.mentormate.academy.radarapp.activities.EditRoomActivity; import bg.mentormate.academy.radarapp.activities.FollowActivity; import bg.mentormate.academy.radarapp.activities.MainActivity; import bg.mentormate.academy.radarapp.activities.ProfileActivity; import bg.mentormate.academy.radarapp.data.LocalDb; import bg.mentormate.academy.radarapp.models.Follow; import bg.mentormate.academy.radarapp.models.Room; import bg.mentormate.academy.radarapp.models.User; import bg.mentormate.academy.radarapp.tools.NotificationHelper; import bg.mentormate.academy.radarapp.views.FollowButton; import bg.mentormate.academy.radarapp.views.RoomItem; /** * Created by tl on 08.02.15. */ public class ProfileFragment extends Fragment implements View.OnClickListener { private static final String USER_ID = "USER_ID"; /** * The fragment argument representing the section number for this * fragment. */ private static final String ARG_SECTION_NUMBER = "section_number"; /** * Returns a new instance of this fragment for the given section * number. */ public static ProfileFragment newInstance(int sectionNumber) { ProfileFragment fragment = new ProfileFragment(); Bundle args = new Bundle(); args.putInt(ARG_SECTION_NUMBER, sectionNumber); fragment.setArguments(args); return fragment; } private LocalDb mLocalDb; private User mUser; private Room mMyRoom; private boolean mIsCurrentUser; private Follow mFollow; private LinearLayout mLlFollowing; private LinearLayout mLlFollower; private TextView mTvFollowingCount; private TextView mTvFollowerCount; private ParseImageView mPivBigAvatar; private RoomItem mRiMyRoom; private Button mBtnCreate; private Button mBtnEditRoom; private Button mBtnDestroy; private Button mBtnEditProfile; private FollowButton mFbFollow; private ProgressBar mProgressBar; public ProfileFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_profile, container, false); initData(); initViews(rootView); return rootView; } private void initData() { String id = getArguments().getString(USER_ID); mLocalDb = LocalDb.getInstance(); mUser = mLocalDb.getCurrentUser(); mFollow = mUser.getFollow(); mIsCurrentUser = id == null || mUser.getObjectId().equals(id); if (!mIsCurrentUser) { ParseQuery query = new ParseQuery(Constants.USER_TABLE); try { mUser = (User) query.get(id); mFollow = mUser.getFollow(); } catch (ParseException e) { NotificationHelper.alert(getActivity(), getString(R.string.dialog_error_title), e.getMessage()); } } mMyRoom = mUser.getRoom(); } private void initViews(View rootView) { mLlFollowing = (LinearLayout) rootView.findViewById(R.id.llFollowing); mLlFollower = (LinearLayout) rootView.findViewById(R.id.llFollower); mTvFollowingCount = (TextView) rootView.findViewById(R.id.tvFollowingCount); mTvFollowerCount = (TextView) rootView.findViewById(R.id.tvFollowerCount); mPivBigAvatar = (ParseImageView) rootView.findViewById(R.id.pivBigAvatar); mRiMyRoom = (RoomItem) rootView.findViewById(R.id.riMyRoom); mBtnCreate = (Button) rootView.findViewById(R.id.btnCreate); mBtnEditRoom = (Button) rootView.findViewById(R.id.btnEditRoom); mBtnDestroy = (Button) rootView.findViewById(R.id.btnDestroy); mBtnEditProfile = (Button) rootView.findViewById(R.id.btnEditProfile); mFbFollow = (FollowButton) rootView.findViewById(R.id.fbFollow); mProgressBar = (ProgressBar) rootView.findViewById(R.id.progressBar); mLlFollowing.setOnClickListener(this); mLlFollower.setOnClickListener(this); mBtnEditProfile.setOnClickListener(this); mBtnCreate.setOnClickListener(this); mBtnEditRoom.setOnClickListener(this); mBtnDestroy.setOnClickListener(this); mFollow.fetchIfNeededInBackground(new GetCallback<ParseObject>() { @Override public void done(ParseObject parseObject, ParseException e) { mTvFollowingCount.setText(mFollow.getFollowings().size() + ""); mTvFollowerCount.setText(mFollow.getFollowers().size() + ""); } }); mFbFollow.setData(LocalDb.getInstance().getCurrentUser(), mUser); } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); if (getActivity() instanceof MainActivity) { ((MainActivity) getActivity()).onSectionAttached( getArguments().getInt(ARG_SECTION_NUMBER), mUser.getUsername()); } else if (getActivity() instanceof ProfileActivity) { ((ProfileActivity) getActivity()).getSupportActionBar().setTitle(mUser.getUsername()); } } @TargetApi(Build.VERSION_CODES.JELLY_BEAN) @Override public void onResume() { super.onResume(); mPivBigAvatar.setParseFile(mUser.getAvatar()); if (mUser.getAvatar() != null) { mPivBigAvatar.loadInBackground(); } else { mPivBigAvatar.setBackground(getResources().getDrawable(R.drawable.ic_avatar)); } if (mMyRoom != null) { mMyRoom.fetchIfNeededInBackground(new GetCallback<ParseObject>() { @Override public void done(ParseObject room, ParseException e) { if (e == null) { mRiMyRoom.setData(LocalDb.getInstance().getCurrentUser(), mMyRoom); } } }); } setRoomUIElementsVisibility(); } private void setRoomUIElementsVisibility() { if (!mIsCurrentUser) { mBtnEditProfile.setVisibility(View.GONE); mFbFollow.setVisibility(View.VISIBLE); mBtnEditRoom.setVisibility(View.GONE); mBtnDestroy.setVisibility(View.GONE); mBtnCreate.setVisibility(View.GONE); } if (mMyRoom != null) { roomCreatedVisibility(); } else { roomNotCreatedVisibility(); } } private void roomCreatedVisibility() { mRiMyRoom.setVisibility(View.VISIBLE); if (mIsCurrentUser) { mBtnCreate.setVisibility(View.GONE); mBtnEditRoom.setVisibility(View.VISIBLE); mBtnDestroy.setVisibility(View.VISIBLE); } } private void roomNotCreatedVisibility() { mRiMyRoom.setVisibility(View.INVISIBLE); if (mIsCurrentUser) { mBtnCreate.setVisibility(View.VISIBLE); mBtnDestroy.setVisibility(View.GONE); mBtnEditRoom.setVisibility(View.GONE); } } @Override public void onClick(View v) { int id = v.getId(); switch (id) { case R.id.llFollowing: goToFollowingPage(Constants.FOLLOWING); break; case R.id.llFollower: goToFollowingPage(Constants.FOLLOWER); break; case R.id.btnEditProfile: goToEditProfile(); break; case R.id.btnCreate: onCreateClicked(); break; case R.id.btnEditRoom: goToEditRoom(); break; case R.id.btnDestroy: onDestroyClicked(); break; } } private void goToFollowingPage(String state) { Intent followingIntent = new Intent(getActivity(), FollowActivity.class); followingIntent.putExtra(Constants.CATEGORY, state); followingIntent.putExtra(USER_ID, mUser.getObjectId()); startActivity(followingIntent); } private void goToEditRoom() { Intent editRoomIntent = new Intent(getActivity(), EditRoomActivity.class); startActivity(editRoomIntent); } private void onCreateClicked() { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); LayoutInflater inflater = getActivity().getLayoutInflater(); final View dvCreateRoom = inflater.inflate(R.layout.dialog_create_room, null); final EditText etName = (EditText) dvCreateRoom.findViewById(R.id.etRoomName); final EditText etPassKey = (EditText) dvCreateRoom.findViewById(R.id.etPassKey); builder.setView(dvCreateRoom) .setTitle(getString(R.string.create_room_title)) .setPositiveButton(getString(R.string.make_room_btn), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { String name = etName.getText().toString().trim(); String passKey = etPassKey.getText().toString().trim(); createRoom(name, passKey); } }) .setNegativeButton(getString(R.string.cancel_btn), null); AlertDialog dialog = builder.create(); dialog.show(); } private void createRoom(String name, String passKey) { if (name.isEmpty() || passKey.isEmpty()) { NotificationHelper.alert(getActivity(), getString(R.string.dialog_error_title), getString(R.string.create_room_invalid_inputs_message)); } else { if (mMyRoom == null && !mUser.containsKey(Constants.USER_COL_ROOM)) { showProgressBar(); mMyRoom = new Room(); mMyRoom.setName(name); mMyRoom.setPassKey(passKey); mMyRoom.setCreatedBy(mUser); mMyRoom.setUsers(new ArrayList<User>()); mMyRoom.saveInBackground(new SaveCallback() { @Override public void done(ParseException e) { hideProgressBar(); if (e == null) { mRiMyRoom.setData(mUser, mMyRoom); // managing UI elements setRoomUIElementsVisibility(); mUser.setRoom(mMyRoom); mUser.saveInBackground(new SaveCallback() { @Override public void done(ParseException e) { if (e != null) { showErrorAlert(e); } } }); } else { showErrorAlert(e); } } }); } } } private void onDestroyClicked() { if (mUser.containsKey(Constants.USER_COL_ROOM)) { showProgressBar(); mUser.remove(Constants.USER_COL_ROOM); mMyRoom.deleteInBackground(new DeleteCallback() { @Override public void done(ParseException e) { if (e == null) { mMyRoom = null; mUser.saveInBackground(new SaveCallback() { @Override public void done(ParseException e) { hideProgressBar(); if (e == null) { setRoomUIElementsVisibility(); } else { showErrorAlert(e); } } }); } else { hideProgressBar(); showErrorAlert(e); } } }); } } private void showErrorAlert(ParseException e) { NotificationHelper.alert(getActivity(), getString(R.string.dialog_error_title), e.getMessage()); } private void hideProgressBar() { mProgressBar.setVisibility(View.GONE); } private void showProgressBar() { mProgressBar.setVisibility(View.VISIBLE); } private void goToEditProfile() { Intent editIntent = new Intent(getActivity(), EditProfileActivity.class); startActivity(editIntent); } }