0

Please help me

    public class ProductDetailsActivity extends AppCompatActivity {

    public static  boolean running_wishlist_query = false;
    public static  boolean running_rating_query = false;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_product_details);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayShowTitleEnabled(false);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);


        productID = getIntent().getStringExtra("PRODUCT_ID");



        inititalRating = -1;


        firebaseFirestore = FirebaseFirestore.getInstance();

        final List<String> productImages = new ArrayList<>();


        firebaseFirestore.collection("PRODUCTS").document(productID)
                .get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                        if (task.isSuccessful()) {
                            documentSnapshot = task.getResult();

                            for (long x = 1; x < documentSnapshot.getLong("no_of_product_images") + 1; x++) {
                                productImages.add(documentSnapshot.getString("product_image_" + x));
                            }
                            ProductImagesAdapter productImagesAdapter = new ProductImagesAdapter(productImages);
                            productImagesViewPager.setAdapter(productImagesAdapter);

                            productTitle.setText(documentSnapshot.getString("product_title"));
                            averageRatingMiniView.setText(String.valueOf(documentSnapshot.get("average_rating")));
                            totalRatingMiniView.setText("(" + documentSnapshot.getLong("total_ratings") + ")ratings");
                            productPrice.setText("TK." + documentSnapshot.getString("product_price") + "/-");
                            cuttedPrice.setText("TK." + documentSnapshot.getString("cutted_price") + "/-");
                            if (documentSnapshot.getBoolean("COD")) {
                                codIndicator.setVisibility(View.VISIBLE);
                                tvCodIndicator.setVisibility(View.VISIBLE);
                            } else {
                                codIndicator.setVisibility(View.INVISIBLE);
                                tvCodIndicator.setVisibility(View.INVISIBLE);
                            }
                            rewardTitle.setText(documentSnapshot.getLong("free_coupens") + documentSnapshot.getString("free_coupen_title"));
                            rewardBody.setText(documentSnapshot.getString("free_coupen_body"));
                            if (documentSnapshot.getBoolean("use_tab_layout")) {
                                productDetailsTabsContainer.setVisibility(View.VISIBLE);
                                productDetailsOnlyContainer.setVisibility(View.GONE);
                                productDescription = documentSnapshot.getString("product_description");
                                productOtherDetails = documentSnapshot.getString("product_other_details");

                                for (long x = 1; x < documentSnapshot.getLong("total_spec_titles") + 1; x++) {
                                    productSpecificationModelList.add(new ProductSpecificationModel(0, documentSnapshot.getString("spec_title_" + x)));
                                    for (long y = 1; y < documentSnapshot.getLong("spec_title_" + x + "_total_fields") + 1; y++) {
                                        productSpecificationModelList.add(new ProductSpecificationModel(1, documentSnapshot.getString("spec_title_" + x + "_field_" + y + "_name"),
                                                documentSnapshot.getString("spec_title_" + x + "_field_" + y + "_value")));
                                    }
                                }
                            } else {
                                productDetailsTabsContainer.setVisibility(View.GONE);
                                productDetailsOnlyContainer.setVisibility(View.GONE);
                                productOnlyDescriptionBody.setText(documentSnapshot.getString("product_description"));
                            }
                            totalRatings.setText(documentSnapshot.getLong("total_ratings") + " ratings");

                            for (int x = 0; x < 5; x++) {
                                TextView rating = (TextView) ratingsNumberContainer.getChildAt(x);
                                rating.setText(String.valueOf(documentSnapshot.getLong((5 - x) + "_star")));

                                ProgressBar progressBar = (ProgressBar) ratingsProgressbarContainer.getChildAt(x);
                                int maxProgress = Integer.parseInt(String.valueOf(documentSnapshot.getLong("total_ratings")));
                                progressBar.setMax(maxProgress);
                                progressBar.setProgress(Integer.parseInt(String.valueOf(documentSnapshot.getLong((5 - x) + "_star"))));

                            }
                            totalRatingsFigure.setText(String.valueOf(documentSnapshot.getLong("total_ratings")));
                            averageRating.setText(String.valueOf(documentSnapshot.get("average_rating")));
                            productDetailsViewPager.setAdapter(new ProductDetailsAdapter(getSupportFragmentManager(), productDescription, productOtherDetails, productSpecificationModelList, productDetailsTabLayout.getTabCount()));

                            if(currentUser != null) {
                                if(DBqueries.myRating.size() == 0){
                                        DBqueries.loadRatingList(ProductDetailsActivity.this);
                                }
                                if (DBqueries.wishList.size() == 0) {
                                    DBqueries.loadWishList(ProductDetailsActivity.this, loadingDialog,false);
                                } else {
                                    loadingDialog.dismiss();
                                }
                            }else{
                                loadingDialog.dismiss();
                            }

                            if(DBqueries.myRatedIds.contains(productID)){
                                int index = DBqueries.myRatedIds.indexOf(productID);
                                inititalRating = Integer.parseInt(String.valueOf(DBqueries.myRating.get(index)));
                                setRating(inititalRating);
                            }

                            if(DBqueries.wishList.contains(productID)){
                                ALREADY_ADDED_TO_WISHLIST = true;
                                addToWishlistBtn.setSupportImageTintList(ColorStateList.valueOf(getResources().getColor(R.color.colorPrimary)));
                            }else {
                                addToWishlistBtn.setSupportImageTintList(ColorStateList.valueOf(Color.parseColor("#9e9e9e")));
                                ALREADY_ADDED_TO_WISHLIST = false;
                            }

                        } else {
                            loadingDialog.dismiss();
                            String error = task.getException().getMessage();
                            Toast.makeText(ProductDetailsActivity.this, error, Toast.LENGTH_SHORT).show();
                        }
                    }
                });


        //////rating layout
        rateNowContainer = findViewById(R.id.rate_now_container);
        for(int x = 0; x< 6;x++){
            rateNowContainer.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {
                @Override
                public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {
                    final int starPosition = (int) ratingBar.getRating();
                    if(currentUser == null){
                        signInDialog.show();
                    }else {
                        if(!running_rating_query){
                            running_rating_query = true;
                            setRating(starPosition);
                            Map<String, Object> updateRating = new HashMap<>();
                            //int initialTestRating  = Integer.parseInt(String.valueOf(documentSnapshot.getLong("rating_" + finalX)));
                            if(DBqueries.myRatedIds.contains(productID)){

                                updateRating.put(inititalRating+"_star", documentSnapshot.getLong(inititalRating+"_star") - 1); // -1
                                updateRating.put(starPosition+"_star", documentSnapshot.getLong(starPosition+"_star")+ 1); // +1
                                updateRating.put("average_rating",String.valueOf(calculateAverageRating()));

                            }else {
                                updateRating.put(starPosition+ "_star", documentSnapshot.getLong(starPosition+ "_star")+1);
                                updateRating.put("total_ratings", documentSnapshot.getLong("total_ratings")+1);
                                updateRating.put("average_rating", String.valueOf(calculateAverageRating()));

                            }

                            firebaseFirestore.collection("PRODUCTS").document(productID)
                                    .update(updateRating).addOnCompleteListener(new OnCompleteListener<Void>() {
                                @Override
                                public void onComplete(@NonNull Task<Void> task) {
                                    if (task.isSuccessful()) {


                                        Map<String, Object> rating = new HashMap<>();
                                        if(DBqueries.myRatedIds.contains(productID)){
                                            rating.put("rating_"+DBqueries.myRatedIds.indexOf(productID),starPosition);
                                        }else {
                                            rating.put("list_size", DBqueries.myRatedIds.size() + 1);
                                            rating.put("product_ID_" + DBqueries.myRatedIds.size(), productID);
                                            rating.put("rating_" + DBqueries.myRatedIds.size(), (long) starPosition);
                                        }

                                        firebaseFirestore.collection("USERS").document(currentUser.getUid()).collection("USER_DATA").document("MY_RATINGS")
                                                .update(rating).addOnCompleteListener(new OnCompleteListener<Void>() {
                                            @Override
                                            public void onComplete(@NonNull Task<Void> task) {
                                                if (task.isSuccessful()) {

                                                    if(DBqueries.myRatedIds.contains(productID)){

                                                        DBqueries.myRating.set(DBqueries.myRatedIds.indexOf(productID), (long) starPosition);

                                                        TextView oldRating = (TextView) ratingsNumberContainer.getChildAt(5 - inititalRating);
                                                        TextView finalRating = (TextView) ratingsNumberContainer.getChildAt(5 - starPosition);

                                                        oldRating.setText(String.valueOf(Integer.parseInt(oldRating.getText().toString())-1));
                                                        finalRating.setText(String.valueOf(Integer.parseInt(finalRating.getText().toString()) + 1));



                                                    }else {
                                                        DBqueries.myRatedIds.add(productID);
                                                        DBqueries.myRating.add((long) starPosition);

                                                        TextView rating = (TextView) ratingsNumberContainer.getChildAt(5 - starPosition);
                                                        rating.setText(String.valueOf(Integer.parseInt(rating.getText().toString()) + 1));


                                                        totalRatingMiniView.setText("(" + (documentSnapshot.getLong("total_ratings")) + ")ratings");
                                                        totalRatings.setText(documentSnapshot.getLong("total_ratings") + " ratings");
                                                        totalRatingsFigure.setText(String.valueOf(documentSnapshot.getLong("total_ratings")));



                                                        Toast.makeText(ProductDetailsActivity.this, "Thank you ! for rating", Toast.LENGTH_SHORT).show();
                                                    }

                                                    averageRating.setText(String.valueOf(calculateAverageRating()));
                                                    averageRatingMiniView.setText(String.valueOf(calculateAverageRating()));

                                                    for (int x = 0; x < 5; x++) {
                                                        TextView ratingfigures = (TextView) ratingsNumberContainer.getChildAt(x);

                                                        ProgressBar progressBar = (ProgressBar) ratingsProgressbarContainer.getChildAt(x);
                                                        if(!DBqueries.myRatedIds.contains(productID)) {
                                                            int maxProgress = Integer.parseInt(String.valueOf(documentSnapshot.getLong("total_ratings")));
                                                            progressBar.setMax(maxProgress);
                                                        }
                                                        progressBar.setProgress(Integer.parseInt(ratingfigures.getText().toString()));

                                                    }


                                                } else {
                                                    setRating(inititalRating);
                                                    String error = task.getException().getMessage();
                                                    Toast.makeText(ProductDetailsActivity.this, error, Toast.LENGTH_SHORT).show();
                                                }
                                                running_rating_query = false;
                                            }
                                        });

                                    } else {
                                        running_rating_query = false;
                                        setRating(inititalRating);
                                        String error = task.getException().getMessage();
                                        Toast.makeText(ProductDetailsActivity.this, error, Toast.LENGTH_SHORT).show();
                                    }
                                }
                            });

                        }
                    }
                }
            });
        }
        //////rating layout

    }

    @Override
    protected void onStart() {
        super.onStart();
        currentUser = FirebaseAuth.getInstance().getCurrentUser();
        if(currentUser == null){
            coupenRedemptionLayout.setVisibility(View.GONE);
        }else {
            coupenRedemptionLayout.setVisibility(View.VISIBLE);
        }

        if(currentUser != null) {
            if(DBqueries.myRating.size() == 0){
                DBqueries.loadRatingList(ProductDetailsActivity.this);
            }
            if (DBqueries.wishList.size() == 0) {
                DBqueries.loadWishList(ProductDetailsActivity.this, loadingDialog,false);
            } else {
                loadingDialog.dismiss();
            }
        }else{
            loadingDialog.dismiss();
        }

        if(DBqueries.myRatedIds.contains(productID)){
            int index = DBqueries.myRatedIds.indexOf(productID);
            inititalRating = Integer.parseInt(String.valueOf(DBqueries.myRating.get(index)));
            setRating(inititalRating);
        }

        if(DBqueries.wishList.contains(productID)){
            ALREADY_ADDED_TO_WISHLIST = true;
            addToWishlistBtn.setSupportImageTintList(getResources().getColorStateList(R.color.colorPrimary));
        }else{
            ALREADY_ADDED_TO_WISHLIST = false;
            addToWishlistBtn.setSupportImageTintList(ColorStateList.valueOf(Color.parseColor("#9e9e9e")));
        }

    }


    public static void setRating(int starPosition) {
        rateNowContainer.setRating(starPosition);

    }

    private float calculateAverageRating(){
        float totalStars = documentSnapshot.getLong("1_star")*1 +
                documentSnapshot.getLong("2_star")*2 +
                documentSnapshot.getLong("3_star")*3 +
                documentSnapshot.getLong("4_star")*4 +

        if(documentSnapshot.getLong("total_ratings") != null && totalStars != 0){
            return totalStars / documentSnapshot.getLong("total_ratings");
        }else {
            return 0;
        }
    }   
}

This is error

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.gabwire.mymall, PID: 3985 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.gabwire.mymall/com.gabwire.mymall.ProductDetailsActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Long com.google.firebase.firestore.DocumentSnapshot.getLong(java.lang.String)' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2327) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2392) at android.app.ActivityThread.access$800(ActivityThread.java:153) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1305) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5305) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Long com.google.firebase.firestore.DocumentSnapshot.getLong(java.lang.String)' on a null object reference at com.gabwire.mymall.ProductDetailsActivity$4.onRatingChanged(ProductDetailsActivity.java:372) at android.widget.RatingBar.dispatchRatingChange(RatingBar.java:319) at android.widget.RatingBar.onProgressRefresh(RatingBar.java:262) at android.widget.ProgressBar.doRefreshProgress(ProgressBar.java:1262) at android.widget.ProgressBar.refreshProgress(ProgressBar.java:1274) at android.widget.ProgressBar.setProgress(ProgressBar.java:1321) at android.widget.ProgressBar.setProgress(ProgressBar.java:1302) at android.widget.RatingBar.setRating(RatingBar.java:198) at com.gabwire.mymall.ProductDetailsActivity.setRating(ProductDetailsActivity.java:633) at com.gabwire.mymall.ProductDetailsActivity.onStart(ProductDetailsActivity.java:609) at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1236) at android.app.Activity.performStart(Activity.java:6006) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2290) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2392)  at android.app.ActivityThread.access$800(ActivityThread.java:153)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1305)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:135)  at android.app.ActivityThread.main(ActivityThread.java:5305)  at java.lang.reflect.Method.invoke(Native Method)  at java.lang.reflect.Method.invoke(Method.java:372)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)  I/Process: Sending signal. PID: 3985 SIG: 9

Abirul Alam
  • 5
  • 1
  • 3

1 Answers1

0

Even when the document doesn't exist, the task will still be successful.

You need to check if the document snapshot exists.

firebaseFirestore.collection("PRODUCTS").document(productID)
        .get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                if (task.isSuccessful()) {
                    documentSnapshot = task.getResult();
                    if (documentSnapshot.exists()) {
                        ...

See the documentation on getting a document.

Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807