This is the Part 5 of “Build a Social Media App on Android Studio” tutorial, and we are going to cover the following functionalities in this article:
- We are going to add blogs by any user. Here we are going to work in AddBlogs Fragment where the user will be adding a blog with a title, description, and an image related to that blogs.
- If the user doesn’t write any of the titles or descriptions then we will be showing an error.
Step By Step Implementation
Step 1: Working with the fragment_add_blogs.xml file
On this page will be the having two EditText to enter the title and description and an image view in which the user will be selecting an image. Navigate to the app > res > layout > fragment_add_blogs.xml and add the below code to that file. Below is the code for the fragment_add_blogs.xml file.
XML
<? xml version = "1.0" encoding = "utf-8" ?> < ScrollView android:layout_width = "match_parent" android:layout_height = "match_parent" tools:context = ".AddBlogsFragment" > < LinearLayout android:layout_width = "match_parent" android:layout_height = "wrap_content" android:layout_margin = "2dp" android:orientation = "vertical" > < EditText android:id = "@+id/ptitle" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:background = "@drawable/edit" android:hint = "Enter Title" android:minHeight = "80dp" android:padding = "10dp" android:singleLine = "true" /> < ImageView android:id = "@+id/imagep" android:layout_width = "match_parent" android:layout_height = "200dp" android:layout_marginTop = "15dp" android:background = "@drawable/edit" android:src = "@drawable/ic_images" /> < EditText android:id = "@+id/pdes" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:layout_marginTop = "15dp" android:background = "@drawable/edit" android:gravity = "start" android:hint = "Enter Description" android:inputType = "textCapSentences|textMultiLine" android:minHeight = "120dp" android:padding = "10dp" android:singleLine = "true" /> < Button android:id = "@+id/pupload" style = "@style/Widget.AppCompat.Button.Colored" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:layout_gravity = "end" android:layout_marginTop = "20sp" android:text = "Upload" android:textAlignment = "center" /> </ LinearLayout > </ ScrollView > |
Step 2: Working with the AddBlogsFragment.java file
Go to the AddBlogsFragment.java file and refer to the following code. Below is the code for the AddBlogsFragment.java file. Comments are added inside the code to understand the code in more detail.
Java
package com.example.socialmediaapp; import android.Manifest; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.ContentValues; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import com.google.android.gms.tasks.OnFailureListener; import com.google.android.gms.tasks.OnSuccessListener; import com.google.android.gms.tasks.Task; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.database.DataSnapshot; import com.google.firebase.database.DatabaseError; import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase; import com.google.firebase.database.Query; import com.google.firebase.database.ValueEventListener; import com.google.firebase.storage.FirebaseStorage; import com.google.firebase.storage.StorageReference; import com.google.firebase.storage.UploadTask; import java.io.ByteArrayOutputStream; import java.util.HashMap; /** * A simple {@link Fragment} subclass. */ public class AddBlogsFragment extends Fragment { public AddBlogsFragment() { // Required empty public constructor } FirebaseAuth firebaseAuth; EditText title, des; private static final int CAMERA_REQUEST = 100 ; private static final int STORAGE_REQUEST = 200 ; String cameraPermission[]; String storagePermission[]; ProgressDialog pd; ImageView image; String edititle, editdes, editimage; private static final int IMAGEPICK_GALLERY_REQUEST = 300 ; private static final int IMAGE_PICKCAMERA_REQUEST = 400 ; Uri imageuri = null ; String name, email, uid, dp; DatabaseReference databaseReference; Button upload; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment firebaseAuth = FirebaseAuth.getInstance(); View view = inflater.inflate(R.layout.fragment_add_blogs, container, false ); title = view.findViewById(R.id.ptitle); des = view.findViewById(R.id.pdes); image = view.findViewById(R.id.imagep); upload = view.findViewById(R.id.pupload); pd = new ProgressDialog(getContext()); pd.setCanceledOnTouchOutside( false ); Intent intent = getActivity().getIntent(); // Retrieving the user data like name ,email and profile pic using query databaseReference = FirebaseDatabase.getInstance().getReference( "Users" ); Query query = databaseReference.orderByChild( "email" ).equalTo(email); query.addValueEventListener( new ValueEventListener() { @Override public void onDataChange( @NonNull DataSnapshot dataSnapshot) { for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) { name = dataSnapshot1.child( "name" ).getValue().toString(); email = "" + dataSnapshot1.child( "email" ).getValue(); dp = "" + dataSnapshot1.child( "image" ).getValue().toString(); } } @Override public void onCancelled( @NonNull DatabaseError databaseError) { } }); // Initialising camera and storage permission cameraPermission = new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}; storagePermission = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}; // After click on image we will be selecting an image image.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { showImagePicDialog(); } }); // Now we will upload out blog upload.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { String titl = "" + title.getText().toString().trim(); String description = "" + des.getText().toString().trim(); // If empty set error if (TextUtils.isEmpty(titl)) { title.setError( "Title Cant be empty" ); Toast.makeText(getContext(), "Title can't be left empty" , Toast.LENGTH_LONG).show(); return ; } // If empty set error if (TextUtils.isEmpty(description)) { des.setError( "Description Cant be empty" ); Toast.makeText(getContext(), "Description can't be left empty" , Toast.LENGTH_LONG).show(); return ; } // If empty show error if (imageuri == null ) { Toast.makeText(getContext(), "Select an Image" , Toast.LENGTH_LONG).show(); return ; } else { uploadData(titl, description); } } }); return view; } private void showImagePicDialog() { String options[] = { "Camera" , "Gallery" }; AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); builder.setTitle( "Pick Image From" ); builder.setItems(options, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // check for the camera and storage permission if // not given the request for permission if (which == 0 ) { if (!checkCameraPermission()) { requestCameraPermission(); } else { pickFromCamera(); } } else if (which == 1 ) { if (!checkStoragePermission()) { requestStoragePermission(); } else { pickFromGallery(); } } } }); builder.create().show(); } // check for storage permission private Boolean checkStoragePermission() { boolean result = ContextCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) == (PackageManager.PERMISSION_GRANTED); return result; } // if not given then request for permission after that check if request is given or not public void onRequestPermissionsResult( int requestCode, @NonNull String[] permissions, @NonNull int [] grantResults) { switch (requestCode) { case CAMERA_REQUEST: { if (grantResults.length > 0 ) { boolean camera_accepted = grantResults[ 0 ] == PackageManager.PERMISSION_GRANTED; boolean writeStorageaccepted = grantResults[ 1 ] == PackageManager.PERMISSION_GRANTED; // if request access given the pick data if (camera_accepted && writeStorageaccepted) { pickFromCamera(); } else { Toast.makeText(getContext(), "Please Enable Camera and Storage Permissions" , Toast.LENGTH_LONG).show(); } } } // function end break ; case STORAGE_REQUEST: { if (grantResults.length > 0 ) { boolean writeStorageaccepted = grantResults[ 0 ] == PackageManager.PERMISSION_GRANTED; // if request access given the pick data if (writeStorageaccepted) { pickFromGallery(); } else { Toast.makeText(getContext(), "Please Enable Storage Permissions" , Toast.LENGTH_LONG).show(); } } } break ; } } // request for permission to write data into storage private void requestStoragePermission() { requestPermissions(storagePermission, STORAGE_REQUEST); } // check camera permission to click picture using camera private Boolean checkCameraPermission() { boolean result = ContextCompat.checkSelfPermission(getContext(), Manifest.permission.CAMERA) == (PackageManager.PERMISSION_GRANTED); boolean result1 = ContextCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) == (PackageManager.PERMISSION_GRANTED); return result && result1; } // request for permission to click photo using camera in app private void requestCameraPermission() { requestPermissions(cameraPermission, CAMERA_REQUEST); } // if access is given then pick image from camera and then put // the imageuri in intent extra and pass to startactivityforresult private void pickFromCamera() { ContentValues contentValues = new ContentValues(); contentValues.put(MediaStore.Images.Media.TITLE, "Temp_pic" ); contentValues.put(MediaStore.Images.Media.DESCRIPTION, "Temp Description" ); imageuri = getActivity().getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues); Intent camerIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); camerIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageuri); startActivityForResult(camerIntent, IMAGE_PICKCAMERA_REQUEST); } // if access is given then pick image from gallery private void pickFromGallery() { Intent galleryIntent = new Intent(Intent.ACTION_PICK); galleryIntent.setType( "image/*" ); startActivityForResult(galleryIntent, IMAGEPICK_GALLERY_REQUEST); } // Upload the value of blog data into firebase private void uploadData( final String titl, final String description) { // show the progress dialog box pd.setMessage( "Publishing Post" ); pd.show(); final String timestamp = String.valueOf(System.currentTimeMillis()); String filepathname = "Posts/" + "post" + timestamp; Bitmap bitmap = ((BitmapDrawable) image.getDrawable()).getBitmap(); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100 , byteArrayOutputStream); byte [] data = byteArrayOutputStream.toByteArray(); // initialising the storage reference for updating the data StorageReference storageReference1 = FirebaseStorage.getInstance().getReference().child(filepathname); storageReference1.putBytes(data).addOnSuccessListener( new OnSuccessListener<UploadTask.TaskSnapshot>() { @Override public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { // getting the url of image uploaded Task<Uri> uriTask = taskSnapshot.getStorage().getDownloadUrl(); while (!uriTask.isSuccessful()) ; String downloadUri = uriTask.getResult().toString(); if (uriTask.isSuccessful()) { // if task is successful the update the data into firebase HashMap<Object, String> hashMap = new HashMap<>(); hashMap.put( "uid" , uid); hashMap.put( "uname" , name); hashMap.put( "uemail" , email); hashMap.put( "udp" , dp); hashMap.put( "title" , titl); hashMap.put( "description" , description); hashMap.put( "uimage" , downloadUri); hashMap.put( "ptime" , timestamp); hashMap.put( "plike" , "0" ); hashMap.put( "pcomments" , "0" ); // set the data into firebase and then empty the title ,description and image data DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference( "Posts" ); databaseReference.child(timestamp).setValue(hashMap) .addOnSuccessListener( new OnSuccessListener<Void>() { @Override public void onSuccess(Void aVoid) { pd.dismiss(); Toast.makeText(getContext(), "Published" , Toast.LENGTH_LONG).show(); title.setText( "" ); des.setText( "" ); image.setImageURI( null ); imageuri = null ; startActivity( new Intent(getContext(), DashboardActivity. class )); getActivity().finish(); } }).addOnFailureListener( new OnFailureListener() { @Override public void onFailure( @NonNull Exception e) { pd.dismiss(); Toast.makeText(getContext(), "Failed" , Toast.LENGTH_LONG).show(); } }); } } }).addOnFailureListener( new OnFailureListener() { @Override public void onFailure( @NonNull Exception e) { pd.dismiss(); Toast.makeText(getContext(), "Failed" , Toast.LENGTH_LONG).show(); } }); } // Here we are getting data from image @Override public void onActivityResult( int requestCode, int resultCode, @Nullable Intent data) { if (resultCode == getActivity().RESULT_OK) { if (requestCode == IMAGEPICK_GALLERY_REQUEST) { imageuri = data.getData(); image.setImageURI(imageuri); } if (requestCode == IMAGE_PICKCAMERA_REQUEST) { image.setImageURI(imageuri); } } super .onActivityResult(requestCode, resultCode, data); } } |
Output:
After successfully adding the data in the blog the data will be shown in the firebase like the following:
For all the drawable file used in this article please refer to this link: https://drive.google.com/drive/folders/1M_knOH_ugCuwSP5nkYzeD4dRp-Honzbe?usp=sharing
Below is the file structure after performing these operations: