From 884e29a1ee6493f781feebe34794cfe202906081 Mon Sep 17 00:00:00 2001 From: Sagi Dayan Date: Wed, 6 Jul 2016 20:30:51 +0300 Subject: [PATCH] Added automatic login - if user exists --- .../sagi/thesocialnotework/LoginActivity.java | 6 + .../sagi/thesocialnotework/MainActivity.java | 2 +- .../thesocialnotework/PersonalFragment.java | 159 ++++++++++++------ .../thesocialnotework/SplashActivity.java | 15 +- app/src/main/res/drawable/date_icon.png | Bin 0 -> 7280 bytes app/src/main/res/drawable/location_icon.png | Bin 0 -> 5175 bytes app/src/main/res/drawable/time_icon.png | Bin 0 -> 17654 bytes app/src/main/res/layout/note_view_full.xml | 31 ++-- 8 files changed, 146 insertions(+), 67 deletions(-) create mode 100644 app/src/main/res/drawable/date_icon.png create mode 100644 app/src/main/res/drawable/location_icon.png create mode 100644 app/src/main/res/drawable/time_icon.png diff --git a/app/src/main/java/com/android_app/matan/ara/sagi/thesocialnotework/LoginActivity.java b/app/src/main/java/com/android_app/matan/ara/sagi/thesocialnotework/LoginActivity.java index 42f504f..ad816fb 100644 --- a/app/src/main/java/com/android_app/matan/ara/sagi/thesocialnotework/LoginActivity.java +++ b/app/src/main/java/com/android_app/matan/ara/sagi/thesocialnotework/LoginActivity.java @@ -1,6 +1,8 @@ package com.android_app.matan.ara.sagi.thesocialnotework; +import android.content.Context; import android.content.Intent; +import android.content.SharedPreferences; import android.support.annotation.NonNull; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; @@ -111,6 +113,10 @@ public class LoginActivity extends AppCompatActivity implements View.OnClickList try { if(!response.isNull("user")) { Log.e(TAG, "onLoginSuccess => user exist"); // TODO: REMOVE console + SharedPreferences sharedPref = self.getSharedPreferences(MainActivity.LOCAL_DATA_TSN, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = sharedPref.edit(); + editor.putString("UserId", response.getJSONObject("user").getString("id")); + editor.commit(); Intent personalSpaceActivity = new Intent(LoginActivity.this, MainActivity.class); Bundle loginUserBundle = new Bundle(); loginUserBundle.putString("user_id", response.getJSONObject("user").getString("id")); diff --git a/app/src/main/java/com/android_app/matan/ara/sagi/thesocialnotework/MainActivity.java b/app/src/main/java/com/android_app/matan/ara/sagi/thesocialnotework/MainActivity.java index 8a2c2c8..6ef19cb 100644 --- a/app/src/main/java/com/android_app/matan/ara/sagi/thesocialnotework/MainActivity.java +++ b/app/src/main/java/com/android_app/matan/ara/sagi/thesocialnotework/MainActivity.java @@ -19,7 +19,7 @@ import android.view.MenuItem; public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { - + public static final String LOCAL_DATA_TSN = "TSN_DATA_STORE"; protected final String TAG = "[TSN / MainActivity]"; protected String userId; private GPSUtils gpsUtils; diff --git a/app/src/main/java/com/android_app/matan/ara/sagi/thesocialnotework/PersonalFragment.java b/app/src/main/java/com/android_app/matan/ara/sagi/thesocialnotework/PersonalFragment.java index c6d4dcf..eba67a9 100644 --- a/app/src/main/java/com/android_app/matan/ara/sagi/thesocialnotework/PersonalFragment.java +++ b/app/src/main/java/com/android_app/matan/ara/sagi/thesocialnotework/PersonalFragment.java @@ -1,8 +1,10 @@ package com.android_app.matan.ara.sagi.thesocialnotework; import android.Manifest; +import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; +import android.content.DialogInterface; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Bundle; @@ -16,11 +18,14 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; +import android.widget.AdapterView; import android.widget.Button; import android.widget.CompoundButton; import android.widget.EditText; +import android.widget.ImageButton; import android.widget.ListView; import android.widget.Switch; +import android.widget.TextView; import android.widget.Toast; import com.android.volley.Response; @@ -69,25 +74,24 @@ public class PersonalFragment extends Fragment { this.noteList = (ListView) view.findViewById(R.id.ps_list_listview); - gpsUtils = ((MainActivity)getActivity()).getGPSUtils(); + gpsUtils = ((MainActivity) getActivity()).getGPSUtils(); gpsUtils.getLocation(); listOfNotes = new ArrayList<>(); noteListAdapter = new ListAdapter(getContext(), listOfNotes); noteList.setAdapter(noteListAdapter); -// new HeavyWorker(this).execute(); + noteList.setOnItemClickListener(new ItemClickedListener()); MainActivity.showLoadingDialog(getActivity(), "Fetching..", "getting your notes"); getAllNotes(); //https://thesocialnotework-api.appspot.com/api/note/all?uid= // The New "Add Button" - FloatingActionButton fab = (FloatingActionButton)view.findViewById(R.id.fab); + FloatingActionButton fab = (FloatingActionButton) view.findViewById(R.id.fab); fab.setOnClickListener(addNewNoteDialog); return view; } - @Override public void onAttach(Context context) { super.onAttach(context); @@ -100,9 +104,9 @@ public class PersonalFragment extends Fragment { // mListener = null; } - public void getAllNotes(){ - Log.d(TAG, "url: "+BASE_URL + "/note/all?uid="+userId); - VolleyUtilSingleton.getInstance(getActivity()).get(BASE_URL + "/note/all?uid="+userId, getNotesSuccessListener, genericErrorListener); + public void getAllNotes() { + Log.d(TAG, "url: " + BASE_URL + "/note/all?uid=" + userId); + VolleyUtilSingleton.getInstance(getActivity()).get(BASE_URL + "/note/all?uid=" + userId, getNotesSuccessListener, genericErrorListener); } private View.OnClickListener addNewNoteDialog = new View.OnClickListener() { @@ -138,16 +142,14 @@ public class PersonalFragment extends Fragment { public void onClick(View v) { //title too short - if (newTitle.getText().length() == 0) - { + if (newTitle.getText().length() == 0) { Toast toast = Toast.makeText(getActivity(), "Title too short.", Toast.LENGTH_LONG); toast.show(); return; } //title too long - if (newTitle.getText().length() > 20) - { + if (newTitle.getText().length() > 20) { Toast toast = Toast.makeText(getActivity(), "Title too long.\n Use up to 20 notes.", Toast.LENGTH_LONG); toast.show(); return; @@ -169,7 +171,7 @@ public class PersonalFragment extends Fragment { } catch (Exception e) { - Log.d(TAG, "saveBtn: "+e.toString()); + Log.d(TAG, "saveBtn: " + e.toString()); } //send request and close dialog @@ -202,21 +204,6 @@ public class PersonalFragment extends Fragment { JSONObject noteObject = response.getJSONObject("note"); time.setTime(noteObject.getLong("created_at")); addNoteFromJsonObj(noteObject, time); - -// Note addNote = new Note( -// noteObject.getString("id"), -// Float.parseFloat(noteObject.getJSONObject("location").getString("lat")), -// Float.parseFloat(noteObject.getJSONObject("location").getString("lng")), -// noteObject.getJSONObject("location").getString("address"), -// noteObject.getString("title"), -// noteObject.getString("body"), -// time.toString(), -// noteObject.getBoolean("is_public"), -// noteObject.getInt("likes"), -// jsonArrayToStringArray(noteObject.getJSONArray("tags")) -// ); -// -// listOfNotes.add(addNote); noteList.setAdapter(noteListAdapter); } catch (Exception e) { Log.e(TAG, "newNoteSuccess:" + e.getMessage()); @@ -239,7 +226,7 @@ public class PersonalFragment extends Fragment { Response.Listener getNotesSuccessListener = new Response.Listener() { @Override public void onResponse(JSONObject response) { - Log.d(TAG,"getNotesSuccessListener: "+response.toString()); + Log.d(TAG, "getNotesSuccessListener: " + response.toString()); MainActivity.dismissLoadingDialog(); try { //need to get all notes and add to listOfNotes @@ -250,19 +237,6 @@ public class PersonalFragment extends Fragment { time.setTime(noteObject.getLong("created_at")); addNoteFromJsonObj(noteObject, time); -// Note addNote = new Note( -// noteObject.getString("id"), -// Float.parseFloat(noteObject.getJSONObject("location").getString("lat")), -// Float.parseFloat(noteObject.getJSONObject("location").getString("lng")), -// noteObject.getJSONObject("location").getString("address"), -// noteObject.getString("title"), -// noteObject.getString("body"), -// time.toString(), -// noteObject.getBoolean("is_public"), -// noteObject.getInt("likes"), -// jsonArrayToStringArray(noteObject.getJSONArray("tags")) -// ); -// listOfNotes.add(addNote); } noteList.setAdapter(noteListAdapter); } catch (Exception e) { @@ -277,7 +251,7 @@ public class PersonalFragment extends Fragment { Response.ErrorListener getNotesErrorListener = new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { - Log.d(TAG,"getNotesErrorListener: "+error.getMessage()); + Log.d(TAG, "getNotesErrorListener: " + error.getMessage()); MainActivity.dismissLoadingDialog(); } }; @@ -286,29 +260,33 @@ public class PersonalFragment extends Fragment { Response.ErrorListener genericErrorListener = new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { - Log.d(TAG,"genericErrorListener"); + Log.d(TAG, "genericErrorListener"); MainActivity.dismissLoadingDialog(); error.printStackTrace(); } }; - - private ArrayList jsonArrayToStringArray(JSONArray jArray){ + private ArrayList jsonArrayToStringArray(JSONArray jArray) { ArrayList stringArray = new ArrayList(); - for(int i = 0, count = jArray.length(); i< count; i++) - { + for (int i = 0, count = jArray.length(); i < count; i++) { try { JSONObject jsonObject = jArray.getJSONObject(i); stringArray.add(jsonObject.toString()); - } - catch (JSONException e) { + } catch (JSONException e) { e.printStackTrace(); } } return stringArray; } + Response.Listener deleteNoteSuccessListener = new Response.Listener() { + @Override + public void onResponse(JSONObject response) { + Log.d(TAG, "deleteNoteSuccessListener: " + response.toString()); + } + }; + private void addNoteFromJsonObj(JSONObject noteObject, Date time) throws JSONException { Note addNote = new Note( noteObject.getString("id"), @@ -326,4 +304,87 @@ public class PersonalFragment extends Fragment { } + // click on listView item + class ItemClickedListener implements AdapterView.OnItemClickListener { + @Override + public void onItemClick(AdapterView parent, View view, final int position, long id) { + //create and configure dialog + final Note note = listOfNotes.get(position); + final Dialog noteViewDialog = new Dialog(getActivity()); + noteViewDialog.setContentView(R.layout.note_display_full); + noteViewDialog.setTitle("You wrote..."); + + WindowManager.LayoutParams lp = new WindowManager.LayoutParams(); + lp.copyFrom(noteViewDialog.getWindow().getAttributes()); + lp.width = WindowManager.LayoutParams.MATCH_PARENT; + lp.height = WindowManager.LayoutParams.MATCH_PARENT; + noteViewDialog.show(); +// dialog.getWindow().setAttributes(lp); + + + //get note_view_full layout elements + final TextView title = (TextView) noteViewDialog.findViewById(R.id.ndf_title_textview); + final TextView body = (TextView) noteViewDialog.findViewById(R.id.ndf_body_textview); + final TextView time = (TextView) noteViewDialog.findViewById(R.id.ndf_time_textview); + final TextView location = (TextView) noteViewDialog.findViewById(R.id.ndf_address_textview); + final TextView likes = (TextView) noteViewDialog.findViewById(R.id.ndf_likes_textview); + final TextView tags = (TextView) noteViewDialog.findViewById(R.id.ndf_tags_textview); + final TextView permission = (TextView) noteViewDialog.findViewById(R.id.ndf_permission_textview); + final ImageButton deleteBtn = (ImageButton) noteViewDialog.findViewById(R.id.ndf_delete_imagebutton); + + + title.setText(note.getTitle()); + body.setText(note.getBody()); + time.setText(note.getTimestamp()); + location.setText("Tags: " + note.getAddress()); + likes.setText("Likes: " + note.getLikes()); + tags.setText(note.getTags().toString()); + permission.setText("Permission: " + (note.isPublic() ? "Public" : "Private")); + + deleteBtn.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + //Put up the Yes/No message box + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder + .setTitle("Delete Note") + .setMessage("Are you sure you want to delete the note?") + .setIcon(android.R.drawable.ic_dialog_alert) + .setPositiveButton("Yes", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + //Yes button clicked, do something + Toast.makeText(getActivity(), "Item Deleted!", + Toast.LENGTH_SHORT).show(); + //TODO send delete + JSONObject delNote = new JSONObject(); + try { + delNote.put("uid", userId); + delNote.put("nid", note.getId()); + VolleyUtilSingleton.getInstance(getActivity()).post(BASE_URL + "/note/delete", delNote, deleteNoteSuccessListener, genericErrorListener); + listOfNotes.remove(position); + + } catch (JSONException e) { + Toast.makeText(getActivity(), "Something went wrong.\n Failed to delete note...", Toast.LENGTH_LONG).show(); + e.printStackTrace(); + } + noteList.setAdapter(noteListAdapter); + noteViewDialog.dismiss(); + } + }) + .setNegativeButton("No", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + //Yes button clicked, do something + Toast.makeText(getActivity(), "Note still here!", + Toast.LENGTH_SHORT).show(); + noteViewDialog.dismiss(); + } + }) //Do nothing on no + .show(); + } + }); + + } + + + } + } diff --git a/app/src/main/java/com/android_app/matan/ara/sagi/thesocialnotework/SplashActivity.java b/app/src/main/java/com/android_app/matan/ara/sagi/thesocialnotework/SplashActivity.java index 8794643..ca6dbb9 100644 --- a/app/src/main/java/com/android_app/matan/ara/sagi/thesocialnotework/SplashActivity.java +++ b/app/src/main/java/com/android_app/matan/ara/sagi/thesocialnotework/SplashActivity.java @@ -1,6 +1,8 @@ package com.android_app.matan.ara.sagi.thesocialnotework; +import android.content.Context; import android.content.Intent; +import android.content.SharedPreferences; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.graphics.drawable.DrawableWrapper; @@ -31,6 +33,9 @@ public class SplashActivity extends AppCompatActivity { } else { background.setImageDrawable( getResources().getDrawable(rand_splash())); } + SharedPreferences sharedPref = this.getSharedPreferences(MainActivity.LOCAL_DATA_TSN, Context.MODE_PRIVATE); + final String userId = sharedPref.getString("UserId", null); + Thread timerThread = new Thread(){ public void run(){ try{ @@ -38,7 +43,15 @@ public class SplashActivity extends AppCompatActivity { }catch(InterruptedException e){ e.printStackTrace(); }finally{ - startActivity(new Intent(SplashActivity.this, LoginActivity.class)); + if(userId == null){ + startActivity(new Intent(SplashActivity.this, LoginActivity.class)); + }else{ + Intent personalSpaceActivity = new Intent(SplashActivity.this, MainActivity.class); + Bundle loginUserBundle = new Bundle(); + loginUserBundle.putString("user_id", userId); + personalSpaceActivity.putExtras(loginUserBundle); + startActivity(personalSpaceActivity); + } finish(); } } diff --git a/app/src/main/res/drawable/date_icon.png b/app/src/main/res/drawable/date_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c91d9f5041750277f3e1b3d82ac063be60a3a5f5 GIT binary patch literal 7280 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 F{|8IiwEh49 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/location_icon.png b/app/src/main/res/drawable/location_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e3bcb079770196b45ddaa4b1ae23a46775170baa GIT binary patch literal 5175 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 QZ3qIUmn@B{4P4{?2TJOXfB*mh literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/time_icon.png b/app/src/main/res/drawable/time_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..05f664ee62ddd28a2f72544a1f28a6c4ec622fb8 GIT binary patch literal 17654 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 - - + + + + - \ No newline at end of file