diff --git a/Lambdas/Lists/List/src/List.java b/Lambdas/Lists/List/src/List.java index 659a212..30cd7da 100644 --- a/Lambdas/Lists/List/src/List.java +++ b/Lambdas/Lists/List/src/List.java @@ -87,10 +87,6 @@ public class List { this.uiPosition = uiPosition; } - public ItemEntry[] getEntries() { - return entries.toArray(new ItemEntry[entries.size()]); - } - public void addItemEntry(ItemEntry entry) { entries.add(entry); } diff --git a/Lambdas/Lists/List/test/TestListDelete.java b/Lambdas/Lists/List/test/TestListDelete.java index d021fee..2dd7490 100644 --- a/Lambdas/Lists/List/test/TestListDelete.java +++ b/Lambdas/Lists/List/test/TestListDelete.java @@ -1,16 +1,14 @@ -import org.junit.Test; -import org.mockito.Mock; +import org.junit.jupiter.api.Test; import org.mockito.Mockito; -import static org.mockito.Mockito.*; - - import java.security.AccessControlException; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; +import static org.mockito.Mockito.when; + public class TestListDelete { diff --git a/Lambdas/Lists/List/test/TestListGetter.java b/Lambdas/Lists/List/test/TestListGetter.java index eae7862..9d01db0 100644 --- a/Lambdas/Lists/List/test/TestListGetter.java +++ b/Lambdas/Lists/List/test/TestListGetter.java @@ -1,6 +1,5 @@ -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.mockito.Mockito; -import org.mockito.Mockito.*; import java.sql.SQLException; import java.sql.Timestamp; diff --git a/Lambdas/Lists/Picture/src/PictureGetter.java b/Lambdas/Lists/Picture/src/PictureGetter.java index 33a331f..79da9e2 100644 --- a/Lambdas/Lists/Picture/src/PictureGetter.java +++ b/Lambdas/Lists/Picture/src/PictureGetter.java @@ -19,10 +19,14 @@ public class PictureGetter implements CallHandler { @Override public Object conductAction(Map bodyMap, HashMap queryMap, String cognitoID) throws SQLException { PreparedStatement statement = connection.prepareStatement(GET_ITEM); - if (!queryMap.containsKey("id") || !queryMap.get("id").toString().equals("profile")) { - throw new IllegalArgumentException("Only profile pictures are currently supported."); + if (!queryMap.containsKey("id")) { + throw new IllegalArgumentException("Must have id set."); + } + if (queryMap.get("id").equals("profile")) { + statement.setString(1, cognitoID); + } else { + statement.setString(1, queryMap.get("id")); } - statement.setString(1, cognitoID); System.out.println(statement); ResultSet queryResults = statement.executeQuery(); queryResults.first(); diff --git a/Lambdas/Lists/User/src/UserGetter.java b/Lambdas/Lists/User/src/UserGetter.java index 5f00ef2..b9b8c3a 100644 --- a/Lambdas/Lists/User/src/UserGetter.java +++ b/Lambdas/Lists/User/src/UserGetter.java @@ -28,6 +28,9 @@ public class UserGetter implements CallHandler { System.out.println(userPoolId); ListUsersRequest checkRequest = new ListUsersRequest().withUserPoolId(userPoolId); Object emailObject = bodyMap.get("emailToCheck"); + if (queryMap.get("id") != null && queryMap.get("id").contains("@")) { + emailObject = queryMap.get("id"); + } String attributeToGet = "sub"; if (emailObject != null) { checkRequest.setFilter("email=\"" + emailObject.toString() +"\""); diff --git a/Listify/.idea/gradle.xml b/Listify/.idea/gradle.xml index 7ce9e9b..c2e3d64 100644 --- a/Listify/.idea/gradle.xml +++ b/Listify/.idea/gradle.xml @@ -4,15 +4,12 @@ diff --git a/Listify/.idea/misc.xml b/Listify/.idea/misc.xml index 82f7cd8..d5d35ec 100644 --- a/Listify/.idea/misc.xml +++ b/Listify/.idea/misc.xml @@ -1,6 +1,6 @@ - + diff --git a/Listify/app/src/main/AndroidManifest.xml b/Listify/app/src/main/AndroidManifest.xml index 2dabe96..60ad567 100644 --- a/Listify/app/src/main/AndroidManifest.xml +++ b/Listify/app/src/main/AndroidManifest.xml @@ -3,6 +3,7 @@ package="com.example.listify"> + @@ -56,6 +57,14 @@ + + + + + + + + \ No newline at end of file diff --git a/Listify/app/src/main/java/com/example/listify/AuthManager.java b/Listify/app/src/main/java/com/example/listify/AuthManager.java index 2573157..31f2991 100644 --- a/Listify/app/src/main/java/com/example/listify/AuthManager.java +++ b/Listify/app/src/main/java/com/example/listify/AuthManager.java @@ -9,7 +9,6 @@ import com.amplifyframework.auth.result.AuthResetPasswordResult; import com.amplifyframework.auth.result.AuthSignInResult; import com.amplifyframework.auth.result.AuthSignUpResult; import com.amplifyframework.core.Amplify; -import com.example.listify.data.ListShare; import com.example.listify.data.User; import org.json.JSONException; import org.json.JSONObject; @@ -63,11 +62,6 @@ public class AuthManager { public String getEmail(Requestor requestor) { if (email == null) { - try { - requestor.putObject(new ListShare(285, "nmerz@icloud.com", 210, -1, null)); - } catch (JSONException jsonException) { - jsonException.printStackTrace(); - } SynchronousReceiver userSynchronousReceiver = new SynchronousReceiver<>(); requestor.getObject("", User.class, userSynchronousReceiver); try { diff --git a/Listify/app/src/main/java/com/example/listify/ConfirmShareView.java b/Listify/app/src/main/java/com/example/listify/ConfirmShareView.java new file mode 100644 index 0000000..35e837c --- /dev/null +++ b/Listify/app/src/main/java/com/example/listify/ConfirmShareView.java @@ -0,0 +1,114 @@ +package com.example.listify; + +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.view.View; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.TextView; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import com.example.listify.data.ListShare; +import com.example.listify.data.Picture; +import com.example.listify.data.User; +import org.json.JSONException; + +import java.io.*; +import java.util.Properties; + +import static com.example.listify.MainActivity.am; + +public class ConfirmShareView extends AppCompatActivity { + @Override + public void onCreate(@Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.share_confirmation); + System.out.println("Got to confirm view"); + TextView shareeEmailView = findViewById(R.id.shareeEmailView); + final String shareeEmail = (String) getIntent().getSerializableExtra("shareeEmail"); + final Integer listID = (Integer) getIntent().getSerializableExtra("listID"); + + shareeEmailView.setText(shareeEmail); + Properties configs = new Properties(); + try { + configs = AuthManager.loadProperties(this, "android.resource://" + getPackageName() + "/raw/auths.json"); + } catch (IOException | JSONException e) { + e.printStackTrace(); + } + Requestor requestor = new Requestor(am, configs.getProperty("apiKey")); + SynchronousReceiver profilePictureReceiver = new SynchronousReceiver<>(); + SynchronousReceiver userReceiver = new SynchronousReceiver<>(); + ImageView profilePictureView = findViewById(R.id.otherProfilePicture); + try { + requestor.getObject(shareeEmail, User.class, userReceiver); + String shareeID = userReceiver.await().getCognitoID(); + requestor.getObject(shareeID, Picture.class, profilePictureReceiver); + profilePictureView.setImageURI(Uri.fromFile(saveImage(profilePictureReceiver.await().getBase64EncodedImage(), "shareeProfilePicture"))); + } catch (Exception e) { + e.printStackTrace(); + } + Button confirmShare = (Button) findViewById(R.id.confirmShare); + Button cancelShare = (Button) findViewById(R.id.cancelShare); + + confirmShare.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + ListShare listShare = new ListShare(listID, shareeEmail, "Read, Write, Delete, Share", null); + try { + requestor.putObject(listShare); + } + catch(Exception e) { + e.printStackTrace(); + } + Intent data = new Intent(); + data.putExtra("listID", listID); + data.putExtra("shareeEmail", shareeEmail); + setResult(RESULT_OK,data); + finish(); + + } + }); + + cancelShare.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + //TODO: return to prior view + setResult(RESULT_CANCELED,null); + finish(); } + }); + + } + + //From: https://stackoverflow.com/questions/30005815/convert-encoded-base64-image-to-file-object-in-android + public File saveImage(final String imageData, String prefix) throws IOException { + final byte[] imgBytesData = android.util.Base64.decode(imageData, + android.util.Base64.DEFAULT); + + final File file = File.createTempFile(prefix, null, this.getCacheDir()); + final FileOutputStream fileOutputStream; + try { + fileOutputStream = new FileOutputStream(file); + } catch (FileNotFoundException e) { + e.printStackTrace(); + return null; + } + + final BufferedOutputStream bufferedOutputStream = new BufferedOutputStream( + fileOutputStream); + try { + bufferedOutputStream.write(imgBytesData); + } catch (IOException e) { + e.printStackTrace(); + return null; + } finally { + try { + bufferedOutputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return file; + } +} diff --git a/Listify/app/src/main/java/com/example/listify/ListSharees.java b/Listify/app/src/main/java/com/example/listify/ListSharees.java index 464214c..81494bc 100644 --- a/Listify/app/src/main/java/com/example/listify/ListSharees.java +++ b/Listify/app/src/main/java/com/example/listify/ListSharees.java @@ -1,6 +1,7 @@ package com.example.listify; import android.content.Context; +import android.content.Intent; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -29,6 +30,8 @@ public class ListSharees extends AppCompatActivity implements Requestor.Receiver ArrayList lShareeEntries = new ArrayList<>(); ArrayList lShareeEmails = new ArrayList<>(); + private final int CONFIRM_REQUEST_CODE = 1; + @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -55,20 +58,31 @@ public class ListSharees extends AppCompatActivity implements Requestor.Receiver public void onClick(View v) { EditText sharedEmailText = (EditText) findViewById(R.id.editTextShareeEmail); String sharedEmail = sharedEmailText.getText().toString(); - ListShare listShare = new ListShare(listID, sharedEmail, "Read, Write, Delete, Share", null); - try { - requestor.putObject(listShare); - lShareeEntries.add(listShare); - lShareeEmails.add(sharedEmail); - myAdapter.notifyDataSetChanged(); - } - catch(Exception e) { - e.printStackTrace(); - } + Intent confirmIntent = new Intent(ListSharees.this, ConfirmShareView.class); + confirmIntent.putExtra("listID", listID); + confirmIntent.putExtra("shareeEmail", sharedEmail); + startActivityForResult(confirmIntent, CONFIRM_REQUEST_CODE); + } }); } + public void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == CONFIRM_REQUEST_CODE) { + if (resultCode == RESULT_OK) { + Integer listID = data.getIntExtra("listID", -1); + String shareeEmail = data.getStringExtra("shareeEmail"); + ListShare listShare = new ListShare(listID, shareeEmail, "Read, Write, Delete, Share", null); + lShareeEntries.add(listShare); + lShareeEmails.add(shareeEmail); + myAdapter.notifyDataSetChanged(); + + } else { //resultCode == RESULT_CANCELED + + } + } + } + @Override public void acceptDelivery(Object delivered) { ListShare sharee = (ListShare) delivered; diff --git a/Listify/app/src/main/java/com/example/listify/MainActivity.java b/Listify/app/src/main/java/com/example/listify/MainActivity.java index 096db85..d4658a1 100644 --- a/Listify/app/src/main/java/com/example/listify/MainActivity.java +++ b/Listify/app/src/main/java/com/example/listify/MainActivity.java @@ -1,9 +1,13 @@ package com.example.listify; +import android.Manifest; import android.app.AlertDialog; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; import android.database.Cursor; +import android.location.Location; +import android.location.LocationManager; import android.net.Uri; import android.os.Bundle; import android.os.Environment; @@ -20,6 +24,7 @@ import android.widget.TextView; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; +import androidx.core.app.ActivityCompat; import androidx.core.content.FileProvider; import androidx.drawerlayout.widget.DrawerLayout; import androidx.navigation.NavController; @@ -61,7 +66,7 @@ public class MainActivity extends AppCompatActivity implements CreateListDialogF protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if(showSplash) { + if (showSplash) { showSplash = false; new Handler().postDelayed(new Runnable() { @@ -73,12 +78,39 @@ public class MainActivity extends AppCompatActivity implements CreateListDialogF }, 1); } - if(am.getUserToken().equals("")) { + if (am.getUserToken().equals("")) { am.nullify(); Intent intent = new Intent(MainActivity.this, LoginPage.class); startActivity(intent); } + LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); + if(checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { + Log.d("CHECKING", "WORKS"); + } else { + ActivityCompat.requestPermissions( + this, + new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, + 0 + ); + } + Location location; + + while(true) { + try { + location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); + break; + } catch(java.lang.SecurityException e) { + //User clicked delete + } + } + + if(location != null) { + double longitude = location.getLongitude(); + double latitude = location.getLatitude(); + } + + //------------------------------Auth Testing---------------------------------------------// boolean testAuth = false; @@ -184,7 +216,7 @@ public class MainActivity extends AppCompatActivity implements CreateListDialogF ImageView profilePictureView = navigationView.getHeaderView(0).findViewById(R.id.imageViewProfilePicture); try { requestor.getObject("profile", Picture.class, profilePictureReceiver); - profilePictureView.setImageURI(Uri.fromFile(saveImage(profilePictureReceiver.await().getBase64EncodedImage()))); + profilePictureView.setImageURI(Uri.fromFile(saveImage(profilePictureReceiver.await().getBase64EncodedImage(), "profilePicture"))); } catch (Exception e) { e.printStackTrace(); } @@ -241,11 +273,11 @@ public class MainActivity extends AppCompatActivity implements CreateListDialogF } //From: https://stackoverflow.com/questions/30005815/convert-encoded-base64-image-to-file-object-in-android - private File saveImage(final String imageData) throws IOException { + public File saveImage(final String imageData, String prefix) throws IOException { final byte[] imgBytesData = android.util.Base64.decode(imageData, android.util.Base64.DEFAULT); - final File file = File.createTempFile("profilePicture", null, this.getCacheDir()); + final File file = File.createTempFile(prefix, null, this.getCacheDir()); final FileOutputStream fileOutputStream; try { fileOutputStream = new FileOutputStream(file); diff --git a/Listify/app/src/main/java/com/example/listify/adapter/ShoppingListsSwipeableAdapter.java b/Listify/app/src/main/java/com/example/listify/adapter/ShoppingListsSwipeableAdapter.java index 5280061..18d86a2 100644 --- a/Listify/app/src/main/java/com/example/listify/adapter/ShoppingListsSwipeableAdapter.java +++ b/Listify/app/src/main/java/com/example/listify/adapter/ShoppingListsSwipeableAdapter.java @@ -1,28 +1,19 @@ package com.example.listify.adapter; import android.app.Activity; -import android.app.AlertDialog; import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; -import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; - import com.chauthai.swipereveallayout.SwipeRevealLayout; import com.chauthai.swipereveallayout.ViewBinderHelper; -import com.example.listify.AuthManager; -import com.example.listify.ListPage; -import com.example.listify.ListSharees; -import com.example.listify.R; -import com.example.listify.Requestor; +import com.example.listify.*; import com.example.listify.data.List; import com.example.listify.data.ListShare; - import org.json.JSONException; import java.io.IOException; diff --git a/Listify/app/src/main/res/layout/share_confirmation.xml b/Listify/app/src/main/res/layout/share_confirmation.xml new file mode 100644 index 0000000..17bf12b --- /dev/null +++ b/Listify/app/src/main/res/layout/share_confirmation.xml @@ -0,0 +1,73 @@ + + + + + + + + + + +