package com.chehanr.yako; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Bundle; import android.support.v4.app.ActivityCompat; import android.support.v7.app.AppCompatActivity; import android.telephony.TelephonyManager; import android.util.Log; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView; import android.widget.EditText; import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import com.afollestad.materialdialogs.MaterialDialog; import com.parse.DeleteCallback; import com.parse.FindCallback; import com.parse.GetCallback; import com.parse.LogOutCallback; import com.parse.ParseAnalytics; import com.parse.ParseException; import com.parse.ParseInstallation; import com.parse.ParseObject; import com.parse.ParsePush; import com.parse.ParseQuery; import com.parse.ParseUser; import com.parse.SaveCallback; import java.util.ArrayList; import java.util.List; import java.util.UUID; public class MainActivity extends AppCompatActivity { private ParseUser mCurrentUser; private List<ParseUser> mUserFriends; private FriendListViewAdapter mFriendAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ParseAnalytics.trackAppOpenedInBackground(getIntent()); isUserAuthenticated(); if (mCurrentUser != null) { registerPushNotification(); loadFriendList(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle item selection switch (item.getItemId()) { case R.id.add_user: addFriend(); return true; case R.id.logout: //unregisterDevice(); ParseUser.logOutInBackground(new LogOutCallback() { public void done(ParseException e) { if (e == null) { ParseInstallation.getCurrentInstallation().deleteInBackground(); Intent intent = new Intent(getBaseContext(), AuthenticationActivity.class).addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); } else { //somethingWentWrong(); } } }); isUserAuthenticated(); return true; case R.id.settings: Intent settings = new Intent(MainActivity.this, SettingsActivity.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivityForResult(settings, 0); return true; default: return super.onOptionsItemSelected(item); } } // If user is not authenticated, take them to the AuthenticationActivity private void isUserAuthenticated() { // Check if user is authenticated mCurrentUser = ParseUser.getCurrentUser(); if (mCurrentUser == null) { startActivity(new Intent(this, AuthenticationActivity.class).addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_TASK)); finish(); } } private void addFriend() { final RelativeLayout container = (RelativeLayout) findViewById(R.id.add_user_container); final EditText input = (EditText) findViewById(R.id.add_user_input); final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); if (container.isShown()) { container.setVisibility(View.GONE); input.setText(""); imm.hideSoftInputFromWindow(container.getWindowToken(), 0); } else { container.setVisibility(View.VISIBLE); input.requestFocus(); imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0); } input.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == EditorInfo.IME_ACTION_DONE) { container.setVisibility(View.GONE); imm.hideSoftInputFromWindow(container.getWindowToken(), 0); final String friend = v.getText().toString().toLowerCase(); if (v.getText().toString().isEmpty()) { input.setText(""); Toast.makeText(getBaseContext(), getString(R.string.error_user_empty), Toast.LENGTH_LONG).show(); } else { // Query to see if user exists ParseQuery<ParseUser> query = ParseUser.getQuery(); query.whereEqualTo("username", friend); query.getFirstInBackground(new GetCallback<ParseUser>() { @Override public void done(final ParseUser parseUser, ParseException e) { if (parseUser == null) { Toast.makeText(getBaseContext(), getString(R.string.error_user_does_not_exist), Toast.LENGTH_LONG).show(); } else { // Save the friend relationship to Parse input.setText(""); ParseObject query = new ParseObject("Friend"); query.put("user", mCurrentUser); query.put("friend", friend); query.saveInBackground(new SaveCallback() { @Override public void done(ParseException e) { if (e == null) { mUserFriends.add(parseUser); mFriendAdapter.notifyDataSetChanged(); } else { Toast.makeText(getBaseContext(), getString(R.string.error_oops), Toast.LENGTH_LONG).show(); Log.d("errorParse", e.getMessage()); } } }); } } }); } } return false; } }); } private void loadFriendList() { final ListView listview = (ListView) findViewById(R.id.listView); listview.setOnItemClickListener(new FriendClickListener()); listview.setOnItemLongClickListener(new FriendLongClickListener()); mUserFriends = new ArrayList<>(); mFriendAdapter = new FriendListViewAdapter(getBaseContext(), mUserFriends); final ParseQuery<ParseObject> query = ParseQuery.getQuery("Friend"); query.whereEqualTo("user", mCurrentUser); final ParseQuery<ParseUser> userQuery = ParseUser.getQuery(); userQuery.whereMatchesKeyInQuery("username", "friend", query); userQuery.setCachePolicy(ParseQuery.CachePolicy.CACHE_THEN_NETWORK); userQuery.findInBackground(new FindCallback<ParseUser>() { @Override public void done(List<ParseUser> parseUsers, ParseException e) { if (parseUsers == null) { //Toast.makeText(getBaseContext(), getString(R.string.error_oops), // Toast.LENGTH_LONG).show(); Log.d("error", getString(R.string.error_oops)); } else { mUserFriends = parseUsers; mFriendAdapter = new FriendListViewAdapter(getBaseContext(), mUserFriends); listview.setAdapter(mFriendAdapter); mFriendAdapter.notifyDataSetChanged(); } } }); } // Associate the device with a user public void registerPushNotification() { if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { // READ_PHONE_STATE permission has not been granted. ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.READ_PHONE_STATE}, 1); } else { // READ_PHONE_STATE permission is already been granted. final TelephonyManager tm = (TelephonyManager) getBaseContext().getSystemService(Context.TELEPHONY_SERVICE); final String tmDevice, tmSerial, androidId; tmDevice = "" + tm.getDeviceId(); tmSerial = "" + tm.getSimSerialNumber(); androidId = "" + android.provider.Settings.Secure.getString(getContentResolver(), android.provider.Settings.Secure.ANDROID_ID); final UUID deviceUuid = new UUID(androidId.hashCode(), ((long) tmDevice.hashCode() << 32) | tmSerial.hashCode()); final String deviceId = deviceUuid.toString(); ParseInstallation installation = ParseInstallation.getCurrentInstallation(); installation.put("user", mCurrentUser); installation.put("uniqueId", deviceId); installation.saveInBackground(); } } /* // Clear the device_id field in the core public void unregisterDevice() { ParseUser user = ParseUser.getCurrentUser(); user.remove("device_id"); user.saveInBackground(new SaveCallback() { public void done(com.parse.ParseException e) { if (e == null) { Log.d("save", "device_id cleared"); } else { Log.d("save", "device_id clearing failed"); } } }); } */ // Listener for ListView item clicks private class FriendClickListener implements AdapterView.OnItemClickListener { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { int clicks = 0; clicks++; if (clicks >= 5) { view.setEnabled(false); } else { // Create our Installation query ParseQuery pushQuery = ParseInstallation.getQuery(); pushQuery.whereEqualTo("user", mUserFriends.get(position)); // Send push notification to query ParsePush push = new ParsePush(); push.setQuery(pushQuery); // Set our Installation query push.setMessage(mCurrentUser.getUsername()); push.sendInBackground(); Log.d("push", "push sent to:" + mUserFriends.get(position).getUsername()); } } } // Listener for ListView item clicks private class FriendLongClickListener implements AdapterView.OnItemLongClickListener { @Override public boolean onItemLongClick(AdapterView<?> parent, final View view, final int position, long id) { new MaterialDialog.Builder(MainActivity.this) .title("Remove" + " " + mUserFriends.get(position).getUsername().toUpperCase() + "?") .content("Do you really want to remove" + " " + mUserFriends.get(position).getUsername().toUpperCase() + " " + "from your friends list?") .positiveText(R.string.dialog_yes) .negativeText(R.string.dialog_no) .callback(new MaterialDialog.ButtonCallback() { @Override public void onPositive(MaterialDialog dialog) { ParseQuery<ParseObject> query = ParseQuery.getQuery("Friend"); query.whereEqualTo("user", mCurrentUser); query.findInBackground(new FindCallback<ParseObject>() { @Override public void done(final List<ParseObject> user, ParseException e) { user.get(position).deleteInBackground(new DeleteCallback() { @Override public void done(ParseException e) { if (e == null) { Toast.makeText(getBaseContext(), "You removed" + " " + mUserFriends.get(position).getUsername().toUpperCase(), Toast.LENGTH_LONG).show(); mUserFriends.remove(position); mFriendAdapter.notifyDataSetChanged(); } else { Toast.makeText(getBaseContext(), "Couldn't remove" + " " + mUserFriends.get(position).getUsername().toUpperCase() + ", try again." + e.toString(), Toast.LENGTH_LONG).show(); } } }); } }); } @Override public void onNegative(MaterialDialog dialog) { } }) .show(); return true; } } }