From 9ad6d6657150e074fa83815096e952a2bff47cbe Mon Sep 17 00:00:00 2001 From: shaikhkalim1930 Date: Wed, 25 Jun 2025 10:02:11 +0530 Subject: [PATCH 1/2] updated to newest version of android --- app/build.gradle | 4 +- app/src/main/AndroidManifest.xml | 19 + .../ConnectX/Activity/mainChatActivity.java | 549 ++++++------------ .../Activity/uploadProfileActivity.java | 69 +-- .../Strong/ConnectX/Utilities/APIService.java | 7 +- app/src/main/res/drawable/round_corner.xml | 2 +- .../main/res/layout/sample_audiorecieve.xml | 42 +- app/src/main/res/layout/sample_audiosend.xml | 42 +- app/src/main/res/values/colors.xml | 1 + gradle/wrapper/gradle-wrapper.properties | 4 +- 10 files changed, 273 insertions(+), 466 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index cbe1716..02a7b72 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -51,8 +51,8 @@ dependencies { implementation 'com.google.firebase:firebase-auth:22.0.0' implementation 'com.google.firebase:firebase-perf:20.3.3' - implementation 'com.devlomi.record-view:record-view:2.0.1' - implementation 'com.github.JagarYousef:ChatVoicePlayer:1.0.7' + //implementation 'com.devlomi.record-view:record-view:2.0.1' + //implementation 'com.github.JagarYousef:ChatVoicePlayer:1.0.7' implementation 'com.github.bumptech.glide:glide:4.15.1' implementation 'de.hdodenhof:circleimageview:3.1.0' implementation 'com.squareup.retrofit2:retrofit:2.3.0' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index add242a..7ad2851 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,10 @@ + + @@ -11,6 +15,21 @@ + + + + + + + + + + + + + messageModels = new ArrayList<>(); final messageAdaptor messageAdaptor = new messageAdaptor(messageModels, this); - int count = messageModels.size(); database = FirebaseDatabase.getInstance(); - /*Getting Token From Specific User*/ database.getReference("Users").child(YourID).addListenerForSingleValueEvent(new ValueEventListener() { - @Override - public void onDataChange(@NonNull DataSnapshot snapshot) { - for (DataSnapshot dataSnapshot : snapshot.getChildren()) { - if (Objects.equals(dataSnapshot.getKey(), "Token")) { - Token = dataSnapshot.getValue(String.class); - } - } - } - - @Override - public void onCancelled(@NonNull DatabaseError error) { - + @Override public void onDataChange(@NonNull DataSnapshot snapshot) { + Token = snapshot.child("Token").getValue(String.class); } + @Override public void onCancelled(@NonNull DatabaseError error) {} }); - //Showing Message - showMessage(messageAdaptor, messageModels, count); - - //Checking Room available to show seen message & Active Status - database.getReference().child("Users").child(MineId).child("ChatRoom").child(YourID).addValueEventListener(new ValueEventListener() { - @SuppressLint("SetTextI18n") - @Override - public void onDataChange(@NonNull DataSnapshot snapshot) { - for (DataSnapshot dataSnapshot : snapshot.getChildren()) { - /*ChatRoom*/ - if (Objects.equals(dataSnapshot.getKey(), "chatRoom")) { - String room = dataSnapshot.getValue(String.class); - assert room != null; - if (room.equals("1")) { - seen = 1; - BindMainChat.ActiveStatus.setText("Active Now"); - // seenInit(); - } else { - seen = 0; - BindMainChat.ActiveStatus.setText(null); - } - /*Typing*/ - } else if (Objects.requireNonNull(dataSnapshot.getKey()).equals("Typing")) { - String typing = dataSnapshot.getValue(String.class); - assert typing != null; - if (typing.length() != 0) { - BindMainChat.ActiveStatus.setVisibility(View.GONE); - BindMainChat.TypingStatus.setVisibility(View.VISIBLE); - } else { - BindMainChat.TypingStatus.setVisibility(View.GONE); - BindMainChat.ActiveStatus.setVisibility(View.VISIBLE); + showMessage(messageAdaptor, messageModels, messageModels.size()); + + database.getReference().child("Users").child(MineId).child("ChatRoom").child(YourID) + .addValueEventListener(new ValueEventListener() { + @SuppressLint("SetTextI18n") + @Override public void onDataChange(@NonNull DataSnapshot snapshot) { + for (DataSnapshot dataSnapshot : snapshot.getChildren()) { + String key = dataSnapshot.getKey(); + String value = dataSnapshot.getValue(String.class); + if ("chatRoom".equals(key)) { + seen = "1".equals(value) ? 1 : 0; + BindMainChat.ActiveStatus.setText(seen == 1 ? "Active Now" : null); + } else if ("Typing".equals(key)) { + boolean isTyping = value != null && value.length() != 0; + BindMainChat.TypingStatus.setVisibility(isTyping ? View.VISIBLE : View.GONE); + BindMainChat.ActiveStatus.setVisibility(isTyping ? View.GONE : View.VISIBLE); + } } - } - } - } - - @Override - public void onCancelled(@NonNull DatabaseError error) { - - } - }); + @Override public void onCancelled(@NonNull DatabaseError error) {} + }); - //Sending the message and storing in the database initSendMessage(); - - // MESSAGE TYPING SHOW TYPING ON ACTIVE STATUS OPTION initTyping(); - - BindMainChat.mainchatbackButton.setOnClickListener(view -> { + BindMainChat.mainchatbackButton.setOnClickListener(v -> { BindMainChat.TypeMessage.setText(null); setRoom("0"); onBackPressed(); }); - BindMainChat.constraint.setOnClickListener(view -> { + BindMainChat.constraint.setOnClickListener(v -> { Intent intent = new Intent(this, UserDataShow.class); intent.putExtra("Image", YourImage); intent.putExtra("username", YourName); startActivity(intent); }); - // OPTION MENU FOR DELETING AND SOME OTHER STUFF initOption(); - /*BindMainChat.audioRecord.setListenForRecord(false); - AudioRecordButton();*/ - BindMainChat.videCallButton.setOnClickListener(v -> { Intent intent = new Intent(this, VideoCallOutgoing.class); intent.putExtra("Uid", YourID); @@ -203,111 +153,109 @@ public void onCancelled(@NonNull DatabaseError error) { }); BindMainChat.chooseImage.setOnClickListener(view -> { - Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); - /* intent.setType("image/* video/*"); - intent.setType("image/*"); - intent.setAction(ACTION_GET_CONTENT);*/ - if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { - FileChooser.launch(Intent.createChooser(intent, "Select Image To Send")); - } else - ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQ_IMAGE); + checkAndRequestImagePermission(); }); BindMainChat.swipeRefresh.setOnRefreshListener(() -> { - showMessage(messageAdaptor, messageModels, count); + showMessage(messageAdaptor, messageModels, messageModels.size()); BindMainChat.swipeRefresh.setRefreshing(false); }); database.getReference().keepSynced(true); - } + private void checkAndRequestImagePermission() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_MEDIA_IMAGES) + != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_MEDIA_IMAGES}, REQ_IMAGE); + } else launchImagePicker(); + } else { + if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) + != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQ_IMAGE); + } else launchImagePicker(); + } + } - //ResultLauncher - private final ActivityResultLauncher FileChooser = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { - if (result.getResultCode() == RESULT_OK) { - Intent data = result.getData(); - assert data != null; - Uri filePath = data.getData(); - /*String mimeType = getContentResolver().getType(filePath); - if (mimeType.startsWith("image/")) { - }*/ - BindMainChat.progressUpload.setVisibility(View.VISIBLE); - BindMainChat.chooseImage.setVisibility(View.INVISIBLE); - database = FirebaseDatabase.getInstance(); - StoreRef = FirebaseStorage.getInstance().getReference(); - long milliTime = System.currentTimeMillis(); - - //Reference of ImagePics - StoreRef = StoreRef.child("Media").child("ImagePics").child(MineId).child(YourID).child(Long.toString(milliTime)); - try { - Bitmap bmp = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath); - ByteArrayOutputStream bas = new ByteArrayOutputStream(); - bmp.compress(Bitmap.CompressFormat.JPEG, 50, bas); - byte[] byteData = bas.toByteArray(); - - Toast.makeText(this, "Sending Image", Toast.LENGTH_SHORT).show(); - StoreRef.putBytes(byteData).addOnSuccessListener(success -> { - Task ImageUrl = success.getStorage().getDownloadUrl(); - ImageUrl.addOnCompleteListener(path -> { - if (path.isSuccessful()) { - String url = path.getResult().toString(); - message conversation = new message(MineId, url, "ImagePics"); - conversation.setTimeStamp(new Date().getTime()); - if (seen == 1) { - conversation.setSeen("yes"); - } else { - conversation.setSeen("no"); - sendNotification(Token, "It's A Picture"); - } - BindMainChat.progressUpload.setVisibility(View.INVISIBLE); - BindMainChat.chooseImage.setVisibility(View.VISIBLE); - // Feeding AudioMessage to Sender and Receiver Database - database.getReference().child("Users").child(MineId).child("Chats").child(YourID).push().setValue(conversation).addOnSuccessListener(e -> database.getReference().child("Users").child(YourID).child("Chats").child(MineId).push().setValue(conversation)); + private void launchImagePicker() { + Intent intent = new Intent(ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); + FileChooser.launch(Intent.createChooser(intent, "Select Image To Send")); + } - } - }); - }); + private final ActivityResultLauncher FileChooser = registerForActivityResult( + new ActivityResultContracts.StartActivityForResult(), result -> { + if (result.getResultCode() == RESULT_OK && result.getData() != null) { + Uri filePath = result.getData().getData(); + if (filePath == null) return; - } catch (IOException e) { - BindMainChat.progressUpload.setVisibility(View.INVISIBLE); - BindMainChat.chooseImage.setVisibility(View.VISIBLE); - Toast.makeText(this, e.getLocalizedMessage(), Toast.LENGTH_SHORT).show(); + BindMainChat.progressUpload.setVisibility(View.VISIBLE); + BindMainChat.chooseImage.setVisibility(View.INVISIBLE); + StoreRef = FirebaseStorage.getInstance().getReference() + .child("Media").child("ImagePics") + .child(MineId).child(YourID) + .child(String.valueOf(System.currentTimeMillis())); + + try { + Bitmap bmp = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath); + ByteArrayOutputStream bas = new ByteArrayOutputStream(); + bmp.compress(Bitmap.CompressFormat.JPEG, 50, bas); + byte[] byteData = bas.toByteArray(); + + StoreRef.putBytes(byteData).addOnSuccessListener(success -> { + Task urlTask = success.getStorage().getDownloadUrl(); + urlTask.addOnCompleteListener(task -> { + if (task.isSuccessful()) { + String url = Objects.requireNonNull(task.getResult()).toString(); + message conversation = new message(MineId, url, "ImagePics"); + conversation.setTimeStamp(new Date().getTime()); + conversation.setSeen(seen == 1 ? "yes" : "no"); + if (seen == 0) sendNotification(Token, "📷 Image"); + + database.getReference().child("Users").child(MineId) + .child("Chats").child(YourID).push().setValue(conversation) + .addOnSuccessListener(e -> database.getReference() + .child("Users").child(YourID) + .child("Chats").child(MineId) + .push().setValue(conversation)); + + BindMainChat.progressUpload.setVisibility(View.INVISIBLE); + BindMainChat.chooseImage.setVisibility(View.VISIBLE); + } + }); + }); + + } catch (IOException e) { + BindMainChat.progressUpload.setVisibility(View.INVISIBLE); + BindMainChat.chooseImage.setVisibility(View.VISIBLE); + Toast.makeText(this, e.getLocalizedMessage(), Toast.LENGTH_SHORT).show(); + } + } } - - } - }); + ); public void sendNotification(String userToken, String YourMessage) { SharedPreferences shared = getSharedPreferences("ConnectX", MODE_PRIVATE); String MineName = shared.getString(Constants.KEY_USERNAME, ""); String MineID = shared.getString(Constants.KEY_ID, ""); String MineImage = shared.getString(Constants.CHAT_USER_IMAGE, ""); - Data data = new Data(MineName, YourMessage, MineImage, MineID); NotificationSender sender = new NotificationSender(data, userToken); apiService.sendNotification(sender).enqueue(new Callback() { - @Override - public void onResponse(@NonNull Call call, @NonNull Response response) { - if (response.code() == 200) { - assert response.body() != null; - if (response.body().success != 1) { - Toast.makeText(mainChatActivity.this, response.body().success + " Error Sending Notification", Toast.LENGTH_SHORT).show(); - } - } + @Override public void onResponse(@NonNull Call call, @NonNull Response response) { + if (response.code() == 200 && response.body() != null && response.body().success != 1) + Toast.makeText(mainChatActivity.this, "Error Sending Notification", Toast.LENGTH_SHORT).show(); } - - @Override - public void onFailure(@NonNull Call call, @NonNull Throwable t) { + @Override public void onFailure(@NonNull Call call, @NonNull Throwable t) { Toast.makeText(mainChatActivity.this, t.getLocalizedMessage(), Toast.LENGTH_SHORT).show(); } }); - } - //SET ROOM VALUE TO 1 WHILE PRESENT IN THIS ACTIVITY private void setRoom(String value) { - reference = FirebaseDatabase.getInstance().getReference().child("Users").child(YourID).child("ChatRoom").child(MineId); + reference = FirebaseDatabase.getInstance().getReference() + .child("Users").child(YourID) + .child("ChatRoom").child(MineId); HashMap map = new HashMap<>(); map.put("chatRoom", value); reference.updateChildren(map); @@ -315,50 +263,36 @@ private void setRoom(String value) { } private void showMessage(messageAdaptor messageAdaptor, ArrayList messageModels, int count) { - //Showing Messages - assert MineId != null; - database.getReference().child("Users").child(MineId).child("Chats").child(YourID).addValueEventListener(new ValueEventListener() { - - @SuppressLint("NotifyDataSetChanged") - @Override - public void onDataChange(@NonNull DataSnapshot snapshot) { - messageModels.clear(); - for (DataSnapshot dataSnapshot : snapshot.getChildren()) { - message model = dataSnapshot.getValue(message.class); - messageModels.add(model); - if (count == 0) { + database.getReference().child("Users").child(MineId) + .child("Chats").child(YourID) + .addValueEventListener(new ValueEventListener() { + @SuppressLint("NotifyDataSetChanged") + @Override public void onDataChange(@NonNull DataSnapshot snapshot) { + messageModels.clear(); + for (DataSnapshot dataSnapshot : snapshot.getChildren()) { + message model = dataSnapshot.getValue(message.class); + messageModels.add(model); + } messageAdaptor.notifyDataSetChanged(); - } else { - // Getting Shown the last message when open the chat section - messageAdaptor.notifyItemRangeChanged(messageModels.size(), messageModels.size()); + BindMainChat.mainChatRecyclerView.setAdapter(messageAdaptor); BindMainChat.mainChatRecyclerView.smoothScrollToPosition(messageModels.size() - 1); } - BindMainChat.mainChatRecyclerView.setAdapter(messageAdaptor); - } - } - - @SuppressLint("NotifyDataSetChanged") - @Override - public void onCancelled(@NonNull DatabaseError error) { - Toast.makeText(mainChatActivity.this, error.getMessage(), Toast.LENGTH_SHORT).show(); - messageAdaptor.notifyDataSetChanged(); - } - - }); - + @Override public void onCancelled(@NonNull DatabaseError error) { + Toast.makeText(mainChatActivity.this, error.getMessage(), Toast.LENGTH_SHORT).show(); + messageAdaptor.notifyDataSetChanged(); + } + }); } private void initTyping() { - DatabaseReference refer = FirebaseDatabase.getInstance().getReference().child("Users").child(YourID).child("ChatRoom").child(MineId); + DatabaseReference refer = FirebaseDatabase.getInstance().getReference() + .child("Users").child(YourID) + .child("ChatRoom").child(MineId); HashMap hashmap = new HashMap<>(); BindMainChat.TypeMessage.addTextChangedListener(new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { + @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} - } - - @Override - public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { + @Override public void onTextChanged(CharSequence charSequence, int start, int before, int count) { if (charSequence.length() != 0) { hashmap.put("Typing", charSequence.toString()); BindMainChat.chooseImage.setVisibility(View.INVISIBLE); @@ -372,12 +306,8 @@ public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { refer.keepSynced(true); } - @Override - public void afterTextChanged(Editable editable) { - - } + @Override public void afterTextChanged(Editable s) {} }); - } @SuppressLint("NonConstantResourceId") @@ -387,240 +317,93 @@ private void initOption() { MenuInflater inflater = popupMenu.getMenuInflater(); inflater.inflate(R.menu.option, popupMenu.getMenu()); popupMenu.show(); - popupMenu.setOnMenuItemClickListener(menuItem -> { - switch (menuItem.getItemId()) { - case R.id.report: - Toast.makeText(getApplicationContext(), "You Clicked on Report", Toast.LENGTH_SHORT).show(); - return true; - case R.id.block: - Toast.makeText(getApplicationContext(), "You Clicked on Block", Toast.LENGTH_SHORT).show(); - return true; - case R.id.deleteChat: - deleteChat(); - return false; - default: - return false; + if (menuItem.getItemId() == R.id.report) { + Toast.makeText(getApplicationContext(), "You Clicked on Report", Toast.LENGTH_SHORT).show(); + return true; + } else if (menuItem.getItemId() == R.id.block) { + Toast.makeText(getApplicationContext(), "You Clicked on Block", Toast.LENGTH_SHORT).show(); + return true; + } else if (menuItem.getItemId() == R.id.deleteChat) { + deleteChat(); + return false; } + return false; }); }); } private void initSendMessage() { BindMainChat.sendButton.setOnClickListener(view -> { - String message = Objects.requireNonNull(BindMainChat.TypeMessage.getText()).toString().trim(); - if (!message.equals("")) { - message conversation = new message(MineId, message); - conversation.setTimeStamp(new Date().getTime()); - if (seen == 1) { - conversation.setSeen("yes"); - } else { - conversation.setSeen("no"); - sendNotification(Token, message); - } - BindMainChat.TypeMessage.setText(null); - - // Feeding Message to Sender and Receiver Database - FirebaseDatabase.getInstance().getReference().child("Users").child(MineId).child("Chats").child(YourID).push().setValue(conversation).addOnSuccessListener(e -> database.getReference().child("Users").child(YourID).child("Chats").child(MineId).push().setValue(conversation).addOnFailureListener(e1 -> Toast.makeText(mainChatActivity.this, e1.getLocalizedMessage(), Toast.LENGTH_SHORT).show())).addOnFailureListener(e -> Toast.makeText(mainChatActivity.this, e.getLocalizedMessage(), Toast.LENGTH_SHORT).show()); + String messageText = Objects.requireNonNull(BindMainChat.TypeMessage.getText()).toString().trim(); + if (messageText.equals("")) return; + message conversation = new message(MineId, messageText); + conversation.setTimeStamp(new Date().getTime()); + if (seen == 1) conversation.setSeen("yes"); + else { + conversation.setSeen("no"); + sendNotification(Token, messageText); } + BindMainChat.TypeMessage.setText(null); + FirebaseDatabase.getInstance().getReference() + .child("Users").child(MineId).child("Chats").child(YourID) + .push().setValue(conversation) + .addOnSuccessListener(e -> database.getReference() + .child("Users").child(YourID).child("Chats").child(MineId) + .push().setValue(conversation)) + .addOnFailureListener(e -> Toast.makeText(mainChatActivity.this, e.getLocalizedMessage(), Toast.LENGTH_SHORT).show()); }); } public void deleteChat() { - StorageReference StoreRef = FirebaseStorage.getInstance().getReference().child("/Media/ImagePics/3AbizhbGLuYwQ1sWE5Av6OBV3di2/DP8DPJnZeMXk0rNhe6ngqxmNT122"); + StorageReference StoreRef = FirebaseStorage.getInstance().getReference() + .child("/Media/ImagePics/3AbizhbGLuYwQ1sWE5Av6OBV3di2/DP8DPJnZeMXk0rNhe6ngqxmNT122"); StoreRef.listAll().onSuccessTask(listResult -> { for (StorageReference item : listResult.getItems()) { item.delete().addOnSuccessListener(unused -> { database.getReference().child("Users").child(MineId).child("Chats").child(YourID).removeValue(); - Toast.makeText(mainChatActivity.this, "Chat Deleted Successfully", Toast.LENGTH_SHORT).show(); + Toast.makeText(this, "Chat Deleted Successfully", Toast.LENGTH_SHORT).show(); onBackPressed(); - }).addOnFailureListener(e -> Toast.makeText(mainChatActivity.this, "Can't Delete this Chat. " + e.getLocalizedMessage(), Toast.LENGTH_SHORT).show()); + }).addOnFailureListener(e -> Toast.makeText(this, "Can't Delete this Chat. " + e.getLocalizedMessage(), Toast.LENGTH_SHORT).show()); } return null; }).addOnFailureListener(e -> { - if (e.getLocalizedMessage().equals("Continuation returned null")) { + if ("Continuation returned null".equals(e.getLocalizedMessage())) { database.getReference().child("Users").child(MineId).child("Chats").child(YourID).removeValue(); - Toast.makeText(mainChatActivity.this, "Chat Deleted Successfully", Toast.LENGTH_SHORT).show(); + Toast.makeText(this, "Chat Deleted Successfully", Toast.LENGTH_SHORT).show(); onBackPressed(); } }); } - @Override - protected void onPause() { + @Override protected void onPause() { super.onPause(); - DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Users").child(YourID).child("ChatRoom").child(MineId); - HashMap hashMap = new HashMap<>(); - hashMap.put("Typing", ""); - reference.updateChildren(hashMap); - reference.keepSynced(true); + DatabaseReference ref = FirebaseDatabase.getInstance() + .getReference().child("Users").child(YourID) + .child("ChatRoom").child(MineId); + ref.updateChildren(new HashMap(){{ put("Typing",""); }}); + ref.keepSynced(true); setRoom("0"); } - @Override - protected void onDestroy() { + @Override protected void onDestroy() { super.onDestroy(); setRoom("0"); } - @Override - protected void onResume() { + @Override protected void onResume() { super.onResume(); setRoom("1"); } - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull @NotNull String[] permissions, @NonNull @NotNull int[] grantResults) { + @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); - // IMAGE ON PERMISSION if (requestCode == REQ_IMAGE) { - if (grantResults.length > 0 && grantResults[0] != PackageManager.PERMISSION_GRANTED) { - Toast.makeText(this, "Permission Denied. Please Allow Permission By App Info", Toast.LENGTH_SHORT).show(); - return; - } else { - Intent intent = new Intent(ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); - FileChooser.launch(Intent.createChooser(intent, "Select Image To Send")); - } - } - } - - /* private boolean isRecordingOk() { - return ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED; - } - - private void requestRecording() { - ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, 8080); - } - - private void sendAudioMessage(String audioPath) { - long milliTime = System.currentTimeMillis(); - - StorageReference firebaseAudioPath = FirebaseStorage.getInstance().getReference(); - firebaseAudioPath = firebaseAudioPath.child("Media").child("RecordAudio").child(YourID).child(Long.toString(milliTime)); - Uri uri = Uri.fromFile(new File(audioPath)); - firebaseAudioPath.putFile(uri).addOnSuccessListener(success -> { - Task audioUrl = success.getStorage().getDownloadUrl(); - audioUrl.addOnCompleteListener(path -> { - if (path.isSuccessful()) { - String url = path.getResult().toString(); - - message conversation = new message(MineId, url, "RecordAudio"); - conversation.setTimeStamp(new Date().getTime()); - BindMainChat.TypeMessage.setText(null); - - // Feeding AudioMessage to Sender and Receiver Database - database.getReference().child("Users").child(MineId).child("Chats").child(YourID).push().setValue(conversation).addOnSuccessListener(e -> database.getReference().child("Users").child(YourID).child("Chats").child(MineId).push().setValue(conversation)); - } - }); - }); - } - - private void AudioRecordButton() { - BindMainChat.audioRecord.setRecordView(BindMainChat.recordView); - BindMainChat.recordView.setSmallMicColor(Color.parseColor("#2196F3")); - BindMainChat.recordView.setSmallMicIcon(R.drawable.microphone); - BindMainChat.recordView.setLessThanSecondAllowed(false); - BindMainChat.recordView.setSoundEnabled(false); - - - BindMainChat.audioRecord.setOnClickListener(view -> { - //Create Folder - if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { - if (isRecordingOk()) { - BindMainChat.audioRecord.setListenForRecord(true); - Toast.makeText(this, "Ready..? Hold The Button..", Toast.LENGTH_SHORT).show(); - createDirectory(); - RecordAudio(); - } else requestRecording(); - } else { - askPermissionTOWrite(); - } - }); - } - - private void RecordAudio() { - File AudioFile = new File(CreateFile()); - MediaRecorder mediaRecorder = new MediaRecorder(); - mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); - mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); - mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB); - mediaRecorder.setOutputFile(AudioFile.getPath()); - - BindMainChat.recordView.setOnRecordListener(new OnRecordListener() { - @Override - public void onStart() { - try { - mediaRecorder.prepare(); - mediaRecorder.start(); - } catch (IOException exception) { - exception.printStackTrace(); - } - BindMainChat.TypeMessage.setVisibility(View.INVISIBLE); - BindMainChat.sendButton.setVisibility(View.INVISIBLE); - BindMainChat.recordView.setVisibility(View.VISIBLE); - } - - @Override - public void onCancel() { - mediaRecorder.reset(); - mediaRecorder.release(); - if (AudioFile.exists()) AudioFile.delete(); - Toast.makeText(mainChatActivity.this, "Canceled...", Toast.LENGTH_SHORT).show(); - - BindMainChat.TypeMessage.setVisibility(View.VISIBLE); - BindMainChat.recordView.setVisibility(View.INVISIBLE); - BindMainChat.audioRecord.setListenForRecord(false); - - } - - @Override - public void onFinish(long recordTime) { - mediaRecorder.stop(); - mediaRecorder.release(); - sendAudioMessage(AudioFile.getPath()); - BindMainChat.TypeMessage.setVisibility(View.VISIBLE); - BindMainChat.recordView.setVisibility(View.INVISIBLE); - BindMainChat.audioRecord.setListenForRecord(false); - - } - - @Override - public void onLessThanSecond() { - mediaRecorder.reset(); - mediaRecorder.release(); - if (AudioFile.exists()) AudioFile.delete(); - BindMainChat.TypeMessage.setVisibility(View.VISIBLE); - BindMainChat.recordView.setVisibility(View.INVISIBLE); - BindMainChat.audioRecord.setListenForRecord(false); - } - }); - } - - private String CreateFile() { - String Name = +System.currentTimeMillis() + ".mp3"; - File file = new File(Environment.getExternalStoragePublicDirectory("Music") + File.separator + "PersonalChat", Name); - // Toast.makeText(this, file.getPath(), Toast.LENGTH_SHORT).show(); - return file.getPath(); - } - - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull @NotNull String[] permissions, @NonNull @NotNull int[] grantResults) { - - if (requestCode == WRITE_REQUEST_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - createDirectory(); + launchImagePicker(); } else { - Toast.makeText(this, "Permission Denied", Toast.LENGTH_SHORT).show(); + Toast.makeText(this, "Permission Denied. Please Allow Permission By App Info", Toast.LENGTH_SHORT).show(); } } - super.onRequestPermissionsResult(requestCode, permissions, grantResults); } - - private void createDirectory() { - new File(Environment.getExternalStoragePublicDirectory("Music"), "PersonalChat"); - } - - private void askPermissionTOWrite() { - ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, WRITE_REQUEST_CODE); - }*/ -} \ No newline at end of file +} diff --git a/app/src/main/java/com/Strong/ConnectX/Activity/uploadProfileActivity.java b/app/src/main/java/com/Strong/ConnectX/Activity/uploadProfileActivity.java index e44ae82..c5a3d97 100644 --- a/app/src/main/java/com/Strong/ConnectX/Activity/uploadProfileActivity.java +++ b/app/src/main/java/com/Strong/ConnectX/Activity/uploadProfileActivity.java @@ -11,6 +11,8 @@ import android.view.View; import android.widget.Toast; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; @@ -29,16 +31,13 @@ public class uploadProfileActivity extends AppCompatActivity { ActivityProfileBinding BindProfile; - //Uri Indicates where the image wil be picked from! private Uri filePath; - - //Request Code - private final int PICK_IMAGE_REQUEST = 22; - //Firebase Instance StorageReference storageReference; private FirebaseAuth mAuth; String username, email, pass, id; + private ActivityResultLauncher imagePickerLauncher; + @Override protected void onCreate(Bundle savedInstanceState) { mAuth = FirebaseAuth.getInstance(); @@ -46,14 +45,33 @@ protected void onCreate(Bundle savedInstanceState) { BindProfile = ActivityProfileBinding.inflate(getLayoutInflater()); setContentView(BindProfile.getRoot()); + // Retrieve data from intent username = getIntent().getStringExtra(Constants.KEY_USERNAME); email = getIntent().getStringExtra(Constants.KEY_EMAIL); pass = getIntent().getStringExtra(Constants.KEY_PASSWORD); id = getIntent().getStringExtra(Constants.KEY_ID); - BindProfile.newProfileImage.setOnClickListener(view -> SelectImage()); + // Initialize ActivityResultLauncher + imagePickerLauncher = registerForActivityResult( + new ActivityResultContracts.StartActivityForResult(), + result -> { + if (result.getResultCode() == RESULT_OK && result.getData() != null) { + filePath = result.getData().getData(); + try { + BindProfile.pickImage.setVisibility(View.INVISIBLE); + Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath); + BindProfile.newProfileImage.setImageBitmap(bitmap); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + ); + // Image selection + BindProfile.newProfileImage.setOnClickListener(view -> SelectImage()); + // Upload button BindProfile.uploadProfile.setOnClickListener(view -> { try { uploadImage(); @@ -67,24 +85,7 @@ private void SelectImage() { Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(ACTION_GET_CONTENT); - startActivityForResult(createChooser(intent, "Select Image From Here"), PICK_IMAGE_REQUEST); - } - - @Override - protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) { - //get The Uri of Data - filePath = data.getData(); - //Setting image on imageview using bitmap - try { - BindProfile.pickImage.setVisibility(View.INVISIBLE); - Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath); - BindProfile.newProfileImage.setImageBitmap(bitmap); - } catch (IOException e) { - e.printStackTrace(); - } - } + imagePickerLauncher.launch(createChooser(intent, "Select Image From Here")); } private void uploadImage() throws IOException { @@ -92,7 +93,6 @@ private void uploadImage() throws IOException { showToast("Uploading Profile Pic"); visibility(true); - //Storing Image String to The Database FirebaseDatabase database = FirebaseDatabase.getInstance(); storageReference = FirebaseStorage.getInstance().getReference(); @@ -103,7 +103,6 @@ private void uploadImage() throws IOException { mAuth.createUserWithEmailAndPassword(email, pass).addOnCompleteListener(task -> { if (task.isSuccessful()) { - String id = Objects.requireNonNull(mAuth.getCurrentUser()).getUid(); storageReference = storageReference.child("ProfileImages/" + id); @@ -118,26 +117,23 @@ private void uploadImage() throws IOException { database.getReference().child("Users").child(id).setValue(hashMap); showToast("Image Uploaded!"); }); + showToast("Welcome " + username + " PersonalChat."); Intent intent = new Intent(uploadProfileActivity.this, recentActivity.class); startActivity(intent); }).addOnFailureListener(e -> { visibility(false); - showToast("Failed" + e.getMessage()); + showToast("Failed: " + e.getMessage()); }); } else { - // Registration failed showToast(Objects.requireNonNull(task.getException()).getMessage()); } }); + } else { + showToast("Please select an image first."); } } - @Override - public void onBackPressed() { - super.onBackPressed(); - } - private void showToast(String message) { Toast.makeText(this, message, Toast.LENGTH_SHORT).show(); } @@ -151,4 +147,9 @@ private void visibility(boolean key) { BindProfile.uploadProfile.setVisibility(View.VISIBLE); } } -} \ No newline at end of file + + @Override + public void onBackPressed() { + super.onBackPressed(); + } +} diff --git a/app/src/main/java/com/Strong/ConnectX/Utilities/APIService.java b/app/src/main/java/com/Strong/ConnectX/Utilities/APIService.java index 49d8932..7287529 100644 --- a/app/src/main/java/com/Strong/ConnectX/Utilities/APIService.java +++ b/app/src/main/java/com/Strong/ConnectX/Utilities/APIService.java @@ -1,4 +1,7 @@ -package com.Strong.personalchat.Utilities; +package com.Strong.ConnectX.Utilities; + +import com.Strong.ConnectX.Utilities.MyResponse; +import com.Strong.ConnectX.Utilities.NotificationSender; import retrofit2.Call; import retrofit2.http.Body; @@ -6,7 +9,7 @@ import retrofit2.http.POST; public interface APIService { - @Headers({"Content-Type:application/json", "YOUR_FCM_KEY"}) + @Headers({"Content-Type:application/json", "FCM_KEY"}) @POST("fcm/send") Call sendNotification(@Body NotificationSender body); diff --git a/app/src/main/res/drawable/round_corner.xml b/app/src/main/res/drawable/round_corner.xml index 75a15f9..fb86d4a 100644 --- a/app/src/main/res/drawable/round_corner.xml +++ b/app/src/main/res/drawable/round_corner.xml @@ -1,5 +1,5 @@ - + diff --git a/app/src/main/res/layout/sample_audiorecieve.xml b/app/src/main/res/layout/sample_audiorecieve.xml index 328713d..e58a84a 100644 --- a/app/src/main/res/layout/sample_audiorecieve.xml +++ b/app/src/main/res/layout/sample_audiorecieve.xml @@ -17,27 +17,27 @@ app:layout_constraintTop_toTopOf="parent" tools:ignore="MissingConstraints"> - + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/sample_audiosend.xml b/app/src/main/res/layout/sample_audiosend.xml index aa9dd59..d3eb735 100644 --- a/app/src/main/res/layout/sample_audiosend.xml +++ b/app/src/main/res/layout/sample_audiosend.xml @@ -17,27 +17,27 @@ app:layout_constraintTop_toTopOf="parent"> - + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index bcdc7f0..240192d 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -9,6 +9,7 @@ #FF018786 #FF000000 #FFFFFF + #FFFFFF #FFFFF0 #FFFFE0 #FFFF00 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 6a215b4..c90183a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Tue Jan 11 05:35:23 IST 2022 +#Wed Jun 25 07:29:44 IST 2025 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME From a5b8287b9f95d1d62cf8e81dd83c2b79aab89163 Mon Sep 17 00:00:00 2001 From: shaikhkalim1930 Date: Wed, 25 Jun 2025 10:02:42 +0530 Subject: [PATCH 2/2] added the delete icon --- app/src/main/res/drawable/recv_ic_delete.xml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 app/src/main/res/drawable/recv_ic_delete.xml diff --git a/app/src/main/res/drawable/recv_ic_delete.xml b/app/src/main/res/drawable/recv_ic_delete.xml new file mode 100644 index 0000000..2024f76 --- /dev/null +++ b/app/src/main/res/drawable/recv_ic_delete.xml @@ -0,0 +1,5 @@ + + + + +