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;
}
}
}