DEV Community

Sanskar Singh
Sanskar Singh

Posted on

Movie Review

//main_activity.java

package com.example.moviereview;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.*;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    private EditText movieNameEditText, movieYearEditText, movieReviewEditText;
    private RatingBar movieRatingBar;
    private Button saveReviewButton, viewReviewsButton;
    private TextView detailsHeaderTextView, movieDetailsTextView;
    private ScrollView movieDetailsScrollView;
    private LinearLayout addReviewLayout;

    private SQLiteDatabase database;

    private static final String DATABASE_NAME = "MovieReviews";
    private static final String TABLE_REVIEWS = "reviews";
    private static final String COLUMN_NAME = "name";
    private static final String COLUMN_YEAR = "year";
    private static final String COLUMN_RATING = "rating";
    private static final String COLUMN_REVIEW = "review";

    private boolean isInViewMode = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        movieNameEditText = findViewById(R.id.movieNameEditText);
        movieYearEditText = findViewById(R.id.movieYearEditText);
        movieReviewEditText = findViewById(R.id.movieReviewEditText);
        movieRatingBar = findViewById(R.id.movieRatingBar);
        saveReviewButton = findViewById(R.id.saveReviewButton);
        viewReviewsButton = findViewById(R.id.viewReviewsButton);
        detailsHeaderTextView = findViewById(R.id.detailsHeaderTextView);
        movieDetailsTextView = findViewById(R.id.movieDetailsTextView);
        movieDetailsScrollView = findViewById(R.id.movieDetailsScrollView);
        addReviewLayout = findViewById(R.id.addReviewLayout);

        database = openOrCreateDatabase(DATABASE_NAME, MODE_PRIVATE, null);

        database.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_REVIEWS + " (" +
                "id INTEGER PRIMARY KEY AUTOINCREMENT, " +
                COLUMN_NAME + " TEXT UNIQUE, " +
                COLUMN_YEAR + " INTEGER, " +
                COLUMN_RATING + " REAL, " +
                COLUMN_REVIEW + " TEXT)");

        saveReviewButton.setOnClickListener(v -> saveMovieReview());
        viewReviewsButton.setOnClickListener(v -> toggleViewMode());
    }

    private void saveMovieReview() {
        String name = movieNameEditText.getText().toString().trim();
        String yearStr = movieYearEditText.getText().toString().trim();
        String review = movieReviewEditText.getText().toString().trim();
        float rating = movieRatingBar.getRating();

        if (name.isEmpty() || yearStr.isEmpty()) {
            Toast.makeText(this, "Please enter movie name and year", Toast.LENGTH_SHORT).show();
            return;
        }

        try {
            int year = Integer.parseInt(yearStr);

            ContentValues values = new ContentValues();
            values.put(COLUMN_NAME, name);
            values.put(COLUMN_YEAR, year);
            values.put(COLUMN_RATING, rating);
            values.put(COLUMN_REVIEW, review);

            long id = database.insertWithOnConflict(TABLE_REVIEWS, null, values, SQLiteDatabase.CONFLICT_REPLACE);

            if (id == -1) {
                Toast.makeText(this, "Error saving review", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(this, "Review saved", Toast.LENGTH_SHORT).show();
            }

            movieNameEditText.setText("");
            movieYearEditText.setText("");
            movieReviewEditText.setText("");
            movieRatingBar.setRating(0);

        } catch (NumberFormatException e) {
            Toast.makeText(this, "Invalid year", Toast.LENGTH_SHORT).show();
        }
    }

    private void toggleViewMode() {
        isInViewMode = !isInViewMode;

        if (isInViewMode) {
            addReviewLayout.setVisibility(View.GONE);
            detailsHeaderTextView.setVisibility(View.VISIBLE);
            movieDetailsScrollView.setVisibility(View.VISIBLE);
            viewReviewsButton.setText("Add Review");
            displayAllReviews();
        } else {
            addReviewLayout.setVisibility(View.VISIBLE);
            detailsHeaderTextView.setVisibility(View.GONE);
            movieDetailsScrollView.setVisibility(View.GONE);
            viewReviewsButton.setText("View Reviews");
        }
    }

    private void displayAllReviews() {
        Cursor cursor = database.rawQuery("SELECT * FROM " + TABLE_REVIEWS + " ORDER BY " + COLUMN_NAME, null);
        StringBuilder builder = new StringBuilder();

        if (cursor.moveToFirst()) {
            do {
                String name = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_NAME));
                int year = cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_YEAR));
                float rating = cursor.getFloat(cursor.getColumnIndexOrThrow(COLUMN_RATING));
                String review = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_REVIEW));

                builder.append("🎬 ").append(name).append(" (").append(year).append(")\n");
                builder.append("⭐ Rating: ").append(rating).append("/5\n");
                builder.append("📝 Review: ").append(review).append("\n\n");
            } while (cursor.moveToNext());
        } else {
            builder.append("No reviews found.");
        }

        cursor.close();
        movieDetailsTextView.setText(builder.toString());
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        database.close();
    }
}

Enter fullscreen mode Exit fullscreen mode

//mainactivity.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    tools:context=".MainActivity">

    <!-- App Title -->
    <TextView
        android:id="@+id/appTitleTextView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Movie Review"
        android:textSize="24sp"
        android:textStyle="bold"
        android:gravity="center"
        android:layout_marginBottom="16dp" />

    <!-- Add Review Section -->
    <LinearLayout
        android:id="@+id/addReviewLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_below="@id/appTitleTextView">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Movie Name:"
            android:textStyle="bold" />

        <EditText
            android:id="@+id/movieNameEditText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="Enter movie name"
            android:minHeight="48dp"
            android:inputType="text"
            android:layout_marginBottom="8dp" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Year:"
            android:textStyle="bold" />

        <EditText
            android:id="@+id/movieYearEditText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="Enter release year"
            android:minHeight="48dp"
            android:inputType="number"
            android:maxLength="4"
            android:layout_marginBottom="8dp" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Rating:"
            android:textStyle="bold" />

        <RatingBar
            android:id="@+id/movieRatingBar"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:numStars="5"
            android:stepSize="0.5"
            android:layout_marginBottom="8dp"
            android:contentDescription="Rate movie from 1 to 5 stars" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Review:"
            android:textStyle="bold" />

        <EditText
            android:id="@+id/movieReviewEditText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="Write your review"
            android:minHeight="96dp"
            android:inputType="textMultiLine"
            android:gravity="top|start"
            android:padding="8dp"
            android:layout_marginBottom="16dp" />

        <Button
            android:id="@+id/saveReviewButton"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Save Review"
            android:minHeight="48dp" />
    </LinearLayout>

    <!-- View Reviews Header -->
    <TextView
        android:id="@+id/detailsHeaderTextView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="All Reviews"
        android:textSize="18sp"
        android:textStyle="bold"
        android:layout_below="@id/addReviewLayout"
        android:layout_marginTop="16dp"
        android:layout_marginBottom="8dp"
        android:visibility="gone" />

    <!-- Scrollable Review Display -->
    <ScrollView
        android:id="@+id/movieDetailsScrollView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/detailsHeaderTextView"
        android:layout_above="@id/viewReviewsButton"
        android:layout_marginBottom="8dp"
        android:visibility="gone">

        <TextView
            android:id="@+id/movieDetailsTextView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="8dp"
            android:background="#F0F0F0"
            android:textSize="16sp" />
    </ScrollView>

    <!-- Toggle Button -->
    <Button
        android:id="@+id/viewReviewsButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="View Reviews"
        android:minHeight="48dp"
        android:layout_alignParentBottom="true" />
</RelativeLayout>

Enter fullscreen mode Exit fullscreen mode

Top comments (1)

Collapse
 
barzilophes profile image
barzilophes

Nice setup! Thinking of integrating Torrentio stremio with a similar review app for streaming support. Your code structure is inspiring! 🔥

Some comments may only be visible to logged-in visitors. Sign in to view all comments.