From b548353ddc6187d54ccfbce11cbb8d3acd9fc1d0 Mon Sep 17 00:00:00 2001 From: Michelle Ferreirae Date: Fri, 22 Nov 2019 13:47:46 -0800 Subject: [PATCH 1/3] actually remove these damn caches, how did you survive with these all week --- .gitignore | 3 ++- .idea/caches/build_file_checksums.ser | Bin 537 -> 0 bytes .idea/caches/gradle_models.ser | Bin 248151 -> 0 bytes 3 files changed, 2 insertions(+), 1 deletion(-) delete mode 100644 .idea/caches/build_file_checksums.ser delete mode 100644 .idea/caches/gradle_models.ser diff --git a/.gitignore b/.gitignore index 07940e1..aa68de2 100644 --- a/.gitignore +++ b/.gitignore @@ -226,4 +226,5 @@ build/ dist/ node_modules/ aws-exports.js -awsconfiguration.json \ No newline at end of file +awsconfiguration.json +.idea/caches/ diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser deleted file mode 100644 index c6505fed0cce078a92b76578d20398ddfd37b3b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 537 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 Date: Mon, 25 Nov 2019 16:22:24 -0800 Subject: [PATCH 2/3] main code review --- .../com/javaawesome/tag/MainActivity.java | 60 ++------- .../com/javaawesome/tag/MapsActivity.java | 94 ++++---------- .../com/javaawesome/tag/SessionAdapter.java | 11 +- .../com/javaawesome/tag/ShowMeYourFace.java | 116 ++---------------- .../com/javaawesome/tag/picturePreview.java | 1 + .../tag/recycler_view_sessions.java | 97 +-------------- app/src/main/res/layout/activity_main.xml | 2 +- 7 files changed, 56 insertions(+), 325 deletions(-) diff --git a/app/src/main/java/com/javaawesome/tag/MainActivity.java b/app/src/main/java/com/javaawesome/tag/MainActivity.java index 00acfc5..cdd74a4 100644 --- a/app/src/main/java/com/javaawesome/tag/MainActivity.java +++ b/app/src/main/java/com/javaawesome/tag/MainActivity.java @@ -53,7 +53,8 @@ import static android.Manifest.permission.ACCESS_FINE_LOCATION; public class MainActivity extends AppCompatActivity implements SessionAdapter.OnSessionInteractionListener { - protected static String photoBucketPath = "https://javatag091c7e33ab0441e4bdf34cbdf68d2bd1-local.s3-us-west-2.amazonaws.com/"; + // final is a good idea for a variable like this that you don't ever want to accidentally change + protected static final String photoBucketPath = "https://javatag091c7e33ab0441e4bdf34cbdf68d2bd1-local.s3-us-west-2.amazonaws.com/"; private final String TAG = "javatag"; RecyclerView recyclerNearbySessions; SessionAdapter sessionAdapter; @@ -107,7 +108,7 @@ public void onError(Exception e) { sessions = new LinkedList<>(); // initialize recycler view to display nearby game sessions - // TODO: have recycler view filter sessions by distance to user + // I think this was completed with the call to filter--so this is an out of date comment. recyclerNearbySessions = findViewById(R.id.recycler_nearby_sessions); recyclerNearbySessions.setLayoutManager(new LinearLayoutManager(this)); this.sessionAdapter = new SessionAdapter(this.sessions, this); @@ -119,7 +120,6 @@ protected void onResume() { super.onResume(); Log.i(TAG, "onresume called"); if (checkGpsStatus()) { -// getCurrentUserLocation(); checkIfPlayerAlreadyExistInDatabase(); } else { buildAlertMessageNoGps(); @@ -127,10 +127,13 @@ protected void onResume() { } // Create new game session and go to map page - public void goToMap(View view) { + // Called when the new session button is tapped, so it should probably have a clearer name! + public void createAndGoToNewSession(View view) { // TODO: check if player already exist in the database + // didn't we check if the player existed in onResume? Why do we need to call it again now? + // Or is this just a leftover todo? EditText sessionName = findViewById(R.id.editText_session_name); - Log.i(TAG, "goToMap: "+sessionName.getText()); + Log.i(TAG, "createAndGoToNewSession: "+sessionName.getText()); if(sessionName.getText().length()>0) { CreateSessionInput input = CreateSessionInput.builder() .title(sessionName.getText().toString()) @@ -143,10 +146,7 @@ public void goToMap(View view) { @Override public void onResponse(@Nonnull Response response) { sessionId = response.data().createSession().id(); - Intent goToMapIntent = new Intent(MainActivity.this, MapsActivity.class); - goToMapIntent.putExtra("sessionId", sessionId); - goToMapIntent.putExtra("userID", playerId); - MainActivity.this.startActivity(goToMapIntent); + joinExistingGameSession(sessionId); } @Override @@ -164,14 +164,7 @@ public void goToUserPage(View view){ Intent goToUserPage = new Intent(this, UserProfile.class); this.startActivity(goToUserPage.putExtra("playerId",playerId)); } - - //////// TEST BUTTON ///// - public void onTestyClick(View view) { - startActivity(new Intent(MainActivity.this, NotificationActivity.class)); - } - - - + // dead code 💀 // Direct users to sign in page private void signInUser() { @@ -198,42 +191,15 @@ public void signoutCurrentUser(View view) { } // onclick method for button to join existing game sessions + // If you make this a bit more generic, it'll work for new sessions and existing ones! @Override - public void joinExistingGameSession(ListSessionsQuery.Item session) { + public void joinExistingGameSession(String sessionId) { Intent goToMapIntent = new Intent(this, MapsActivity.class); - goToMapIntent.putExtra("sessionId", session.id()); + goToMapIntent.putExtra("sessionId", sessionId); goToMapIntent.putExtra("userID", playerId); this.startActivity(goToMapIntent); } -// @Override -// public void addPlayerToChosenGame(final ListSessionsQuery.Item session) { -//// Query -// CreatePlayerInput playerInput = CreatePlayerInput.builder() -// .playerSessionId(session.id()) -// .isIt(false) -// .lat(currentUserLocation.latitude) -// .lon(currentUserLocation.longitude) -// .username(AWSMobileClient.getInstance().getUsername()) -// .build(); -// CreatePlayerMutation createPlayerMutation = CreatePlayerMutation.builder().input(playerInput).build(); -// awsAppSyncClient.mutate(createPlayerMutation).enqueue((new GraphQLCall.Callback() { -// @Override -// public void onResponse(@Nonnull Response response) { -// String userID = response.data().createPlayer().id(); -// Log.i(TAG, "player mutation happened! ... inside of a session mutation"); -// Intent goToMapIntent = new Intent(MainActivity.this, MapsActivity.class); -// goToMapIntent.putExtra("sessionId", session.id()); -// goToMapIntent.putExtra("userID", userID); -// Log.i("veach", session.id() + "\n" +userID); -// } -// @Override -// public void onFailure(@Nonnull ApolloException e) { -// Log.i(TAG, "mutation of player failed, boohoo!"); -// } -// })); -// } - // get all sessions private void queryAllSessions() { Log.i(TAG, "query all sessions"); diff --git a/app/src/main/java/com/javaawesome/tag/MapsActivity.java b/app/src/main/java/com/javaawesome/tag/MapsActivity.java index a34c40e..826a212 100644 --- a/app/src/main/java/com/javaawesome/tag/MapsActivity.java +++ b/app/src/main/java/com/javaawesome/tag/MapsActivity.java @@ -68,9 +68,7 @@ public class MapsActivity extends FragmentActivity implements OnMapReadyCallback GetSessionQuery.GetSession currentSession; LatLng startingPoint; - final static long REFRESHRATE = 3*1000; - final static int SUBJECT = 0; - Handler locationHandler; + // Lots of leftover, unused variables around in this code; I wish they'd been removed. LocationCallback mLocationCallback; private FusedLocationProviderClient mFusedLocationClient; final private int tagDistance = 50; @@ -81,6 +79,7 @@ public class MapsActivity extends FragmentActivity implements OnMapReadyCallback BitmapDescriptor playerpin; List players; private final String TAG = "javatag"; + // The inconsistency of playerID vs sessionId (in capitalization) is annoying. String playerID; Player player; String sessionId; @@ -113,15 +112,17 @@ protected void onCreate(Bundle savedInstanceState) { Log.i(TAG, "Session ID for map is: " + sessionId + "the player Id is " + playerID); associateUserWithSession(); - - // Pull user ID from MainActivity - // If player comes from the recyclerView it will come through as null so we will create a new player - // Else the player created the game and we will query the player object -// if (playerID == null) { -// createPlayer(); -// } else { -// queryForPlayerObject(); -// } + // so what this actually starts is: + // associateUserWithSession + // makes request to dynamo + // then calls queryForSelectedSession + // which simultaneously calls initializeMarkers and queryForPlayerObject + // queryForPlayerObject gets the current player's data, and sets it to be part of the players list + // initializeMarkers does the same exact work, and the current player should already be in that players list! + // this is why I was getting "two" players in my single player game! + // I think this is rendering the current player twice!!! + // But regardless, this is QUITE complicated and all kicked off by calling associateUserWithSession here; that feels + // like a lot of work for a method with such a short name! "renderGame" might be more accurate than "associateUserWithSession"! //Stuff doesn't start running until the map is ready in onMapReady(Map stuff) mLocationCallback = new LocationCallback() { @@ -133,7 +134,9 @@ public void onLocationResult(LocationResult locationResult) { return; } - updateMarkerAndCircleForAllPlayers(players); + // I think it's odd that we call this here, instead of when updates come in from + // our subscription to Dynamo. + updateMarkerAndCircleForAllPlayers(); sendUserLocationQuery(locationResult); } @@ -388,7 +391,8 @@ private LocationRequest getLocationRequest() { } // Creates markers and circles for each player in the list for that session - private void initializeMarkersAndCirclesForPlayers(List players) { + // Since this only ever operates on the instance variable, it doesn't need a param. + private void initializeMarkersAndCirclesForPlayers() { Log.i(TAG, "made it to initialized markers"); for(Player player: players) { Marker marker = mMap.addMarker(new MarkerOptions() @@ -424,8 +428,8 @@ private void initializeMarkersAndCirclesForPlayers(List players) { .strokeWidth(5)); } - - private void updateMarkerAndCircleForAllPlayers(List players) { + // Since this only ever operates on the instance variable, it doesn't need a parameter. + private void updateMarkerAndCircleForAllPlayers() { Log.i(TAG, "updating markers"); Log.i(TAG, "How many players? " + players.size()); @@ -451,15 +455,9 @@ private void updateMarkerAndCircleForAllPlayers(List players) { Log.i(TAG, "In the updateMarkerAndCircleForAllPlayers"); playersJustGotTagged.add(player); -// player.getMarker().setIcon(zombiepin); -// player.getCircle().setStrokeColor(itColor); - -// mMap.addCircle(player.getCircle()); + // This thing with a bunch of commented out lines with the occasional close curly + // brace in the middle is quite annoying! I'd prefer to just remove these lines. } -// else { -// player.getMarker().setIcon(playerpin); -// player.getCircle().setStrokeColor(notItColor); -// } } //TODO add the player instance is it update, only updates the player list so far for(Player player : players){ @@ -545,39 +543,6 @@ private void queryForSelectedSession(String sessionId) { .enqueue(getSessionCallBack); } - // Make a Player - private void createPlayer() { - Log.i(TAG, "Making a player with " + sessionId + " " + startingPoint.toString()); - CreatePlayerInput input = CreatePlayerInput.builder() - .playerSessionId(sessionId) - .lat(startingPoint.latitude) - .lon(startingPoint.longitude) - .username(AWSMobileClient.getInstance().getUsername()) - .isIt(false) - .build(); - CreatePlayerMutation createPlayerMutation = CreatePlayerMutation.builder().input(input).build(); - - awsAppSyncClient.mutate(createPlayerMutation).enqueue(new GraphQLCall.Callback() { - @Override - public void onResponse(@Nonnull Response response) { - Log.i(TAG, "made it to creating a new player"); - playerID = response.data().createPlayer().id(); - player = new Player(); - player.setId(playerID); - player.setIt(false); - player.setUsername(AWSMobileClient.getInstance().getUsername()); - List bananas = new LinkedList<>(); - bananas.add(startingPoint); - player.setLocations(bananas); - } - - @Override - public void onFailure(@Nonnull ApolloException e) { - Log.e(TAG, "couldn't make a new player"); - } - }); - } - // Query for Player private void queryForPlayerObject() { GetPlayerQuery query = GetPlayerQuery.builder().id(playerID).build(); @@ -642,13 +607,8 @@ public void onResponse(@Nonnull final Response response) { //once the session ID and starting loc are in place, then make the first player. queryForPlayerObject(); -// if (playerID == null) { -// createPlayer(); -// } else { -// queryForPlayerObject(); -// } - Log.i(TAG, "Made it to the after the if/else within getSessionCallBack"); + // there is no if/else here... this is defintitely an out of date comment //converting from GetSessionItems to players players = playerConverter(currentSession.players().items()); @@ -663,7 +623,7 @@ public void handleMessage(Message inputMessage){ } catch (InterruptedException e) { e.printStackTrace(); } - initializeMarkersAndCirclesForPlayers(players); + initializeMarkersAndCirclesForPlayers(); } }; @@ -685,10 +645,4 @@ private List playerConverter(List incomingList){ return outGoingList; }; - // TODO: Build onDestroy that deletes user data from DB -// @Override -// protected void onDestroy() { -// super.onDestroy(); -// } - } diff --git a/app/src/main/java/com/javaawesome/tag/SessionAdapter.java b/app/src/main/java/com/javaawesome/tag/SessionAdapter.java index 7a93f5d..df2173f 100644 --- a/app/src/main/java/com/javaawesome/tag/SessionAdapter.java +++ b/app/src/main/java/com/javaawesome/tag/SessionAdapter.java @@ -1,8 +1,6 @@ package com.javaawesome.tag; import android.content.DialogInterface; -import android.content.Intent; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -40,8 +38,7 @@ public void onClick(View view) { .setPositiveButton("Yes", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { -// listener.addPlayerToChosenGame(holder.session); - listener.joinExistingGameSession(holder.session); + listener.joinExistingGameSession(holder.session.id()); //TODO: Save the users ID to the database based on the session that they clicked } }) @@ -55,12 +52,10 @@ public static class SessionViewHolder extends RecyclerView.ViewHolder { ListSessionsQuery.Item session; TextView sessionTitle; -// TextView numberOfPlayers; public SessionViewHolder(@NonNull View itemView) { super(itemView); this.sessionTitle = itemView.findViewById(R.id.session_title); -// this.numberOfPlayers = itemView.findViewById(R.id.session_total_players); } } @@ -69,7 +64,6 @@ public void onBindViewHolder(@NonNull SessionAdapter.SessionViewHolder holder, i ListSessionsQuery.Item sessionAtPosition = this.sessions.get(position); holder.session = sessionAtPosition; holder.sessionTitle.setText(sessionAtPosition.title()); -// holder.numberOfPlayers.setText("Population: " + sessionAtPosition.players()); } @Override @@ -78,7 +72,6 @@ public int getItemCount() { } public static interface OnSessionInteractionListener { - public void joinExistingGameSession(ListSessionsQuery.Item session); -// public void addPlayerToChosenGame(ListSessionsQuery.Item session); + public void joinExistingGameSession(String sessionId); } } diff --git a/app/src/main/java/com/javaawesome/tag/ShowMeYourFace.java b/app/src/main/java/com/javaawesome/tag/ShowMeYourFace.java index 0df2782..6d366a3 100644 --- a/app/src/main/java/com/javaawesome/tag/ShowMeYourFace.java +++ b/app/src/main/java/com/javaawesome/tag/ShowMeYourFace.java @@ -1,20 +1,15 @@ package com.javaawesome.tag; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.camera.core.CameraX; import androidx.camera.core.ImageCapture; import androidx.camera.core.ImageCaptureConfig; -import androidx.camera.core.ImageProxy; import androidx.camera.core.Preview; import androidx.camera.core.PreviewConfig; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; - -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; import android.os.Environment; import android.Manifest; import android.content.Intent; @@ -23,16 +18,12 @@ import android.util.Log; import android.util.Size; import android.view.TextureView; -import android.view.View; -import android.widget.ImageView; import android.widget.Toast; -import com.amazonaws.amplify.generated.graphql.GetPlayerQuery; import com.amazonaws.amplify.generated.graphql.UpdatePlayerMutation; import com.amazonaws.mobile.client.AWSMobileClient; import com.amazonaws.mobile.config.AWSConfiguration; import com.amazonaws.mobileconnectors.appsync.AWSAppSyncClient; -import com.amazonaws.mobileconnectors.appsync.fetcher.AppSyncResponseFetchers; import com.amazonaws.mobileconnectors.s3.transferutility.TransferListener; import com.amazonaws.mobileconnectors.s3.transferutility.TransferObserver; import com.amazonaws.mobileconnectors.s3.transferutility.TransferState; @@ -53,25 +44,20 @@ public class ShowMeYourFace extends AppCompatActivity { + // weird to have the tag reference a single person! private static final String TAG = "ahren:javatag"; private static boolean upload = false; private ImageCapture imageCapture; final CameraX.LensFacing camera = CameraX.LensFacing.FRONT; -// set to absolute path eventualy +// set to absolute path eventually String profPicPath = null; // String s3path = null; - String userPhoto; AWSAppSyncClient mAWSAppSyncClient; // created by picSnap File profilePic = null; - - public static boolean isUpload() { - return upload; - } - public static void setUpload(boolean upload) { ShowMeYourFace.upload = upload; } @@ -105,9 +91,13 @@ protected void onCreate(Bundle savedInstanceState) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED){ + // This check isn't being used correctly at all! If the user should see an explanation + // of why the permission is necessary, you're instead silently logging and refusing to + // let them either accept or deny the permission. if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) { Log.i(TAG, "onCreate: permission not granted"); + // You should cite where this comes from! https://developer.android.com/training/permissions/requesting // Show an explanation to the user *asynchronously* -- don't block // this thread waiting for the user's response! After the user // sees the explanation, try again to request the permission. @@ -121,8 +111,6 @@ protected void onCreate(Bundle savedInstanceState) { //************************************ Setup Buttons ********************************************** FloatingActionButton picSnap = findViewById(R.id.picSnap); -// FloatingActionButton switchCamera = findViewById(R.id.fab_switch_camera);, -// FloatingActionButton fab_flash = findViewById(R.id.fab_flash); // ********************************** Setup Camera ********************************************** bindCamera(); @@ -130,7 +118,7 @@ protected void onCreate(Bundle savedInstanceState) { //*************************************** Shutter Button Action **************************************** picSnap.setOnClickListener(event -> { -// put picture localy in the phone +// put picture locally in the phone s3path = AWSMobileClient.getInstance().getUsername()+ "profilePic.png"; profilePic = new File(Environment.getExternalStorageDirectory() + "/" + s3path); // @@ -142,6 +130,7 @@ protected void onCreate(Bundle savedInstanceState) { public void onError( @NonNull ImageCapture.ImageCaptureError imageCaptureError, @NonNull String message, Throwable cause) { // TODO: insert your code here. + // please, really, do something if there is an error. } @Override @@ -156,61 +145,7 @@ public void onImageSaved(@NonNull File file) { }); }); - - -// @Override -// public void onClick(View view){ -// File file = new File(Environment.getExternalStorageDirectory() + "/" + System.currentTimeMillis() + ".png"); -// imageCapture.takePicture(file, new ImageCapture.OnImageSavedListener(){ -// @Override -// public void onImageSaved(@NonNull File file) { -// String msg = "Pic captured at " + file.getAbsolutePath(); -// Toast.makeText(getBaseContext(), msg,Toast.LENGTH_LONG).show(); -// } -// -// @Override -// public void onError(@NonNull ImageCapture.ImageCaptureError imageCaptureError, @NonNull String message, @Nullable Throwable cause) { -// } -// }); -// } -// ImageCaptureConfig imageCaptureConfig = new ImageCaptureConfig.Builder().setCaptureMode(ImageCapture.CaptureMode.MIN_LATENCY) -// .setTargetRotation(getWindowManager().getDefaultDisplay().getRotation()).build(); -// final ImageCapture imgCap = new ImageCapture(imageCaptureConfig); - - - - - - - - -//***************************** Turn Off / On Flash*********************************************** -// Adapted from Kotlin code at https://gabrieltanner.org/blog/android-camerax -// fab_flash.setOnClickListener(new View.OnClickListener() { -// @Override -// public void onClick(View view) { -// FlashMode flashMode = imageCapture.getFlashMode(); -// if (flashMode == FlashMode.ON) { -// imageCapture.setFlashMode(FlashMode.OFF); -// } else { -// imageCapture.setFlashMode(FlashMode.ON); -// } -// } -// }); - -// ******************* Changes the lens direction if the button is clicked **************************** - -// switchCamera.setOnClickListener(new View.OnClickListener() { -// @Override -// public void onClick(View view) { -// if (CameraX.LensFacing.FRONT == camera) { -// camera = CameraX.LensFacing.BACK; -// } else { -// camera[0] = CameraX.LensFacing.FRONT; -// } -// bindCamera(); -// } -// }); + // PLEASE get rid of the zombie code! } } @@ -222,8 +157,6 @@ private void bindCamera(){ final TextureView textureView = findViewById(R.id.view_finder); Size screen = new Size(textureView.getWidth(), textureView.getHeight()); //size of the screen - - PreviewConfig config = new PreviewConfig.Builder() .setLensFacing(camera) .setTargetResolution(screen) @@ -234,6 +167,9 @@ private void bindCamera(){ preview.setOnPreviewOutputUpdateListener(new Preview.OnPreviewOutputUpdateListener() { @Override public void onUpdated(@NonNull Preview.PreviewOutput previewOutput) { + // All of these "your code here"-style comments make it clear that this code came + // from an outside source, and that you didn't even read the code closely enough + // to notice that these comments were weird. // Your code here. For example, use textureView.setSurfaceTexture(previewOutput.getSurfaceTexture()); } @@ -248,7 +184,7 @@ public void onUpdated(@NonNull Preview.PreviewOutput previewOutput) { imageCapture = new ImageCapture(config2); -// Causes camera u=instance to only exist on this activity is started and destroyed on start and finish +// Causes camera instance to only exist on this activity is started and destroyed on start and finish CameraX.bindToLifecycle(this, imageCapture, preview); } @@ -316,31 +252,5 @@ public void onFailure(@Nonnull ApolloException e) { } }); } -// private void queryForPlayerObject(String playerId) { -// GetPlayerQuery query = GetPlayerQuery.builder().id(playerId).build(); -// mAWSAppSyncClient.query(query) -// .responseFetcher(AppSyncResponseFetchers.NETWORK_ONLY) -// .enqueue(new GraphQLCall.Callback() { -// @Override -// public void onResponse(@Nonnull Response response) { -// Log.i(TAG, "made it to making a query for player object"); -// userPhoto = response.data().getPlayer().Photo(profile pic); -// } -// -// @Override -// public void onFailure(@Nonnull ApolloException e) { -// -// } -// }); -// } } -//// **************** Checks to see if flash is present on the current camera and ********************* -// try { -// CameraInfo cameraInfo = CameraX.getCameraInfo(camera); -// LiveData isFlashAvailable = cameraInfo.isFlashAvailable(); -// fab_flash.setVisibility(isFlashAvailable.getValue() ? View.VISIBLE : View.INVISIBLE); -// } catch (CameraInfoUnavailableException e) { -// Log.w(TAG, "Cannot get flash available information", e); -// fab_flash.setVisibility(View.VISIBLE); -// } diff --git a/app/src/main/java/com/javaawesome/tag/picturePreview.java b/app/src/main/java/com/javaawesome/tag/picturePreview.java index 28a20d0..4b7a456 100644 --- a/app/src/main/java/com/javaawesome/tag/picturePreview.java +++ b/app/src/main/java/com/javaawesome/tag/picturePreview.java @@ -15,6 +15,7 @@ import com.google.android.material.floatingactionbutton.FloatingActionButton; +// Really odd that this class name doesn't use UpperCamelCase! public class picturePreview extends AppCompatActivity { @Override diff --git a/app/src/main/java/com/javaawesome/tag/recycler_view_sessions.java b/app/src/main/java/com/javaawesome/tag/recycler_view_sessions.java index 7525998..bc0ade3 100644 --- a/app/src/main/java/com/javaawesome/tag/recycler_view_sessions.java +++ b/app/src/main/java/com/javaawesome/tag/recycler_view_sessions.java @@ -10,101 +10,8 @@ import android.view.View; import android.view.ViewGroup; - -/** - * A simple {@link Fragment} subclass. - * Activities that contain this fragment must implement the - * {@link recycler_view_sessions.OnFragmentInteractionListener} interface - * to handle interaction events. - * Use the {@link recycler_view_sessions#newInstance} factory method to - * create an instance of this fragment. - */ +// why is this class named in snake_case, this is not python (hiss) +// also it appears that none of this code is used at all? so why does it exist? public class recycler_view_sessions extends Fragment { - // TODO: Rename parameter arguments, choose names that match - // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER - private static final String ARG_PARAM1 = "param1"; - private static final String ARG_PARAM2 = "param2"; - - // TODO: Rename and change types of parameters - private String mParam1; - private String mParam2; - - private OnFragmentInteractionListener mListener; - - public recycler_view_sessions() { - // Required empty public constructor - } - - /** - * Use this factory method to create a new instance of - * this fragment using the provided parameters. - * - * @param param1 Parameter 1. - * @param param2 Parameter 2. - * @return A new instance of fragment recycler_view_sessions. - */ - // TODO: Rename and change types and number of parameters - public static recycler_view_sessions newInstance(String param1, String param2) { - recycler_view_sessions fragment = new recycler_view_sessions(); - Bundle args = new Bundle(); - args.putString(ARG_PARAM1, param1); - args.putString(ARG_PARAM2, param2); - fragment.setArguments(args); - return fragment; - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - if (getArguments() != null) { - mParam1 = getArguments().getString(ARG_PARAM1); - mParam2 = getArguments().getString(ARG_PARAM2); - } - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_recycler_view_sessions, container, false); - } - - // TODO: Rename method, update argument and hook method into UI event - public void onButtonPressed(Uri uri) { - if (mListener != null) { - mListener.onFragmentInteraction(uri); - } - } - - @Override - public void onAttach(Context context) { - super.onAttach(context); - if (context instanceof OnFragmentInteractionListener) { - mListener = (OnFragmentInteractionListener) context; - } else { - throw new RuntimeException(context.toString() - + " must implement OnFragmentInteractionListener"); - } - } - - @Override - public void onDetach() { - super.onDetach(); - mListener = null; - } - /** - * This interface must be implemented by activities that contain this - * fragment to allow an interaction in this fragment to be communicated - * to the activity and potentially other fragments contained in that - * activity. - *

- * See the Android Training lesson Communicating with Other Fragments for more information. - */ - public interface OnFragmentInteractionListener { - // TODO: Update argument type and name - void onFragmentInteraction(Uri uri); - } } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index ab0136e..f23c7f8 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -39,7 +39,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="24dp" - android:onClick="goToMap" + android:onClick="createAndGoToNewSession" android:text="@string/start_new_game_button" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" From 3bed13ceb4295645c79876c8813d417d47af6315 Mon Sep 17 00:00:00 2001 From: Michelle Ferreirae Date: Mon, 25 Nov 2019 16:25:28 -0800 Subject: [PATCH 3/3] minor readme bits --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bfacb31..1ac76cc 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ## APK To download and play Zombie Tag click the zombie below -[![Build Status](https://github.com/JavaAwesome/JavaTag/blob/Dev/app/src/main/res/mipmap-hdpi/ic_launcher_round.png)](https://github.com/JavaAwesome/JavaTag/blob/Dev/zombietag.apk) +[![Download App](https://github.com/JavaAwesome/JavaTag/blob/Dev/app/src/main/res/mipmap-hdpi/ic_launcher_round.png)](https://github.com/JavaAwesome/JavaTag/blob/Dev/zombietag.apk) ## Team Members * Ahren Swett @@ -23,6 +23,8 @@ To make an android app where players can see one another on a map and tag one an ## Instructions to run the app on your phone + + ### Contribute No contribution guidelines at this point.