//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();
}
}
//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>
Top comments (1)
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.