StudentAdapter.
java:
package [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
// Ensure this matches your package structure
import [Link].R;
import [Link];
public class StudentAdapter extends [Link]<[Link]> {
ArrayList<Student> studentItems;
Context context;
private OnItemClickListener onItemClickListener;
private OnItemLongClickListener onItemLongClickListener;
public interface OnItemClickListener {
void onClick(int position);
}
public interface OnItemLongClickListener {
void onLongClick(int position);
}
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
[Link] = onItemClickListener;
}
public void setOnItemLongClickListener(OnItemLongClickListener onItemLongClickListener) {
[Link] = onItemLongClickListener;
}
public StudentAdapter(Context context, ArrayList<Student> studentItems) {
[Link] = studentItems;
[Link] = context;
}
public static class StudentViewHolder extends [Link] {
TextView roll;
TextView name;
TextView status;
CardView cardView;
public StudentViewHolder(@NonNull View itemView, OnItemClickListener listener, OnItemLongClickListener longListener) {
super(itemView);
// MATCHING YOUR XML IDs EXACTLY:
roll = [Link]([Link].tv_roll_number);
name = [Link]([Link].tv_student_name);
status = [Link]([Link]); // Matches @+id/status
cardView = [Link]([Link]); // Matches @+id/cardView
[Link](v -> {
if (listener != null) {
[Link](getAdapterPosition());
}
});
[Link](v -> {
if (longListener != null) {
[Link](getAdapterPosition());
return true;
}
return false;
});
}
}
@NonNull
@Override
public StudentViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = [Link]([Link]()).inflate([Link].student_item, parent, false);
return new StudentViewHolder(view, onItemClickListener, onItemLongClickListener);
}
@Override
public void onBindViewHolder(@NonNull StudentViewHolder holder, int position) {
[Link]([Link](position).getRollNumber());
[Link]([Link](position).getName());
[Link]([Link](position).getStatus());
if ([Link](position).getStatus().equals("P")) {
[Link]([Link]("#ffffff")); // White
[Link]([Link]("#4CAF50")); // Green
} else {
[Link]([Link]("#ffcdd2")); // Red
[Link]([Link]);
}
}
@Override
public int getItemCount() {
return [Link]();
}
}
[Link]:
package [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link].R;
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
public class DashboardActivity extends AppCompatActivity {
FloatingActionButton fab;
RecyclerView recyclerView;
ClassAdapter classAdapter;
[Link] layoutManager;
ArrayList<ClassItem> classItems = new ArrayList<>();
EditText edtClassName;
EditText edtSubjectName;
// NEW: Database Helper
DatabaseHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
[Link](savedInstanceState);
setContentView([Link].activity_dashboard);
// Initialize Database
dbHelper = new DatabaseHelper(this);
fab = findViewById([Link].fab_add);
recyclerView = findViewById([Link]);
[Link](true);
layoutManager = new LinearLayoutManager(this);
[Link](layoutManager);
classAdapter = new ClassAdapter(this, classItems);
[Link](classAdapter);
// 1. Find the logout button
ImageButton logout = findViewById([Link]);
// 2. Set the click listener
[Link](v -> {
Intent intent = new Intent([Link], [Link]);
// THIS IS IMPORTANT: Clears the history so "Back" button doesn't work
[Link](Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();
});
[Link](position -> gotoItemActivity(position));
[Link](position -> gotoItemActivity(position));
// NEW: Long Click to Delete/Edit Class
[Link](position -> showUpdateDeleteDialog(position));
[Link](v -> showAddDialog());
// NEW: Load Data immediately when app opens
loadData();
}
// NEW: Method to read from Database and fill the list
private void loadData() {
[Link]();
Cursor cursor = [Link]();
while ([Link]()) {
// FIXED: Get the ID (Index 0)
long id = [Link](0);
String className = [Link](1);
String subjectName = [Link](2);
// FIXED: Pass the ID to the ClassItem
[Link](new ClassItem(id, className, subjectName));
}
[Link]();
}
private void showAddDialog() {
[Link] builder = new [Link](this);
View view = [Link](this).inflate([Link].dialog_add_class, null);
[Link](view);
AlertDialog dialog = [Link]();
[Link]();
edtClassName = [Link]([Link].edt_class_name);
edtSubjectName = [Link]([Link].edt_subject_name);
Button btnAdd = [Link]([Link].btn_add);
Button btnCancel = [Link]([Link].btn_cancel);
[Link](v -> {
String className = [Link]().toString();
String subjectName = [Link]().toString();
// NEW: Save to Database first
long status = [Link](className, subjectName);
if (status != -1) { // If save was successful
[Link](new ClassItem(status, className, subjectName));
[Link]();
[Link]();
}
});
[Link](v -> [Link]());
}
private void gotoItemActivity(int position) {
Intent intent = new Intent(this, [Link]);
// FIXED: Send the actual Database ID
[Link]("cid", [Link](position).getCid());
[Link]("className", [Link](position).getClassName());
[Link]("subjectName", [Link](position).getSubjectName());
[Link]("position", position);
startActivity(intent);
}
private void showUpdateDeleteDialog(int position) {
ClassItem classItem = [Link](position);
[Link] builder = new [Link](this);
[Link]("Options");
[Link]("What do you want to do with " + [Link]() + "?");
[Link]("Update", (dialog, which) -> showUpdateDialog(position));
[Link]("Delete", (dialog, which) -> deleteClass(position));
[Link]("Cancel", (dialog, which) -> [Link]());
[Link]();
}
private void deleteClass(int position) {
[Link]([Link](position).getCid());
[Link](position);
[Link](position);
}
private void showUpdateDialog(int position) {
[Link] builder = new [Link](this);
View view = [Link](this).inflate([Link].dialog_add_class, null);
[Link](view);
AlertDialog dialog = [Link]();
[Link]();
EditText edtClass = [Link]([Link].edt_class_name);
EditText edtSubject = [Link]([Link].edt_subject_name);
Button btnAdd = [Link]([Link].btn_add);
Button btnCancel = [Link]([Link].btn_cancel);
// Pre-fill data
[Link]([Link](position).getClassName());
[Link]([Link](position).getSubjectName());
[Link]("Update");
[Link](v -> {
String className = [Link]().toString();
String subjectName = [Link]().toString();
long cid = [Link](position).getCid();
[Link](cid, className, subjectName);
// Update List
[Link](position).setClassName(className);
[Link](position).setSubjectName(subjectName);
[Link](position);
[Link]();
});
[Link](v -> [Link]());
}
}
[Link]:
package [Link];
public class ClassItem {
private long cid; // NEW: Database ID
private String className;
private String subjectName;
// Update Constructor to accept ID
public ClassItem(long cid, String className, String subjectName) {
[Link] = cid;
[Link] = className;
[Link] = subjectName;
}
public long getCid() { return cid; } // NEW Getter
public void setCid(long cid) { [Link] = cid; }
public String getClassName() { return className; }
public void setClassName(String className) { [Link] = className; }
public String getSubjectName() { return subjectName; }
public void setSubjectName(String subjectName) { [Link] = subjectName; }
}
[Link]:
package [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
// Ensure this matches your package
import [Link].R;
public class ClassAdapter extends [Link]<[Link]> {
ArrayList<ClassItem> classItems;
Context context;
private OnItemClickListener onItemClickListener;
private OnItemLongClickListener onItemLongClickListener; // 1. Added Long Listener
public interface OnItemClickListener {
void onClick(int position);
}
public interface OnItemLongClickListener {
void onLongClick(int position);
}
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
[Link] = onItemClickListener;
}
public void setOnItemLongClickListener(OnItemLongClickListener onItemLongClickListener) {
[Link] = onItemLongClickListener;
}
public ClassAdapter(Context context, ArrayList<ClassItem> classItems) {
[Link] = classItems;
[Link] = context;
}
public static class ClassViewHolder extends [Link] {
TextView className;
TextView subjectName;
public ClassViewHolder(@NonNull View itemView, OnItemClickListener listener, OnItemLongClickListener longListener) {
super(itemView);
className = [Link]([Link].tv_class_name);
subjectName = [Link]([Link].tv_subject_name);
// Normal Click (Open Class)
[Link](v -> {
if (listener != null) {
[Link](getAdapterPosition());
}
});
// Long Click (Edit/Delete)
[Link](v -> {
if (longListener != null) {
[Link](getAdapterPosition());
return true;
}
return false;
});
}
}
@NonNull
@Override
public ClassViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = [Link]([Link]()).inflate([Link].class_item, parent, false);
return new ClassViewHolder(view, onItemClickListener, onItemLongClickListener);
}
@Override
public void onBindViewHolder(@NonNull ClassViewHolder holder, int position) {
[Link]([Link](position).getClassName());
[Link]([Link](position).getSubjectName());
}
@Override
public int getItemCount() {
return [Link]();
}
}
[Link]:
package [Link];
import [Link].R;
import [Link];
// We implement 'Serializable' so we can pass this Student object
// from one screen to another (e.g., clicking a student to see their full profile).
public class Student implements Serializable {
// 1. DATA FIELDS
private String sid; // Unique Database ID (e.g., "S101")
private String name; // Student Name
private String rollNumber; // Roll No (Display purpose)
private String parentPhone; // Feature: Call parent if absent
private String status; // "P" (Present), "A" (Absent), "L" (Late)
private boolean isExpanded; // UI Feature: To show/hide extra details in the list
// 2. CONSTRUCTOR
public Student(String sid, String name, String rollNumber, String parentPhone) {
[Link] = sid;
[Link] = name;
[Link] = rollNumber;
[Link] = parentPhone;
[Link] = "A"; // Default to Absent until marked otherwise
[Link] = false;
}
// 3. GETTERS AND SETTERS
public String getSid() { return sid; }
public void setSid(String sid) { [Link] = sid; }
public String getName() { return name; }
public void setName(String name) { [Link] = name; }
public String getRollNumber() { return rollNumber; }
public void setRollNumber(String rollNumber) { [Link] = rollNumber; }
public String getParentPhone() { return parentPhone; }
public void setParentPhone(String parentPhone) { [Link] = parentPhone; }
public String getStatus() { return status; }
public void setStatus(String status) { [Link] = status; }
// Helper for UI Checkbox (if you still want to use a simple checkbox)
public boolean isPresent() {
return "P".equals([Link]);
}
// UI Helper: Used to expand the row to show the "Call Parent" button
public boolean isExpanded() { return isExpanded; }
public void setExpanded(boolean expanded) { isExpanded = expanded; }
}
[Link]:
package [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link].R;
import [Link];
import [Link];
public class MainActivity extends AppCompatActivity {
TextInputEditText etUsername, etPassword, etClass; // Added etClass
TextInputLayout tilUsername, tilPassword, tilClass; // Added tilClass
Button btnLogin;
RadioGroup radioGroup;
DatabaseHelper dbHelper;
boolean isTeacher = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
[Link](savedInstanceState);
setContentView([Link].activity_main);
dbHelper = new DatabaseHelper(this);
etUsername = findViewById([Link]);
etPassword = findViewById([Link]);
// NEW: Find the Class inputs
etClass = findViewById([Link]);
tilClass = findViewById([Link]);
tilUsername = findViewById([Link]);
tilPassword = findViewById([Link]);
btnLogin = findViewById([Link]);
radioGroup = findViewById([Link]);
TextView tvRegister = findViewById([Link]);
[Link](v -> startActivity(new Intent(this, [Link])));
[Link]((group, checkedId) -> {
if (checkedId == [Link]) {
isTeacher = true;
[Link]("Username");
[Link]("Password");
[Link](129);
[Link]([Link]); // Hide Class for Teacher
} else {
isTeacher = false;
[Link]("Student Name");
[Link]("Roll Number");
[Link](2);
[Link]([Link]); // Show Class for Student
}
});
[Link](v -> {
String input1 = [Link]().toString(); // Name
String input2 = [Link]().toString(); // Password/Roll
String input3 = [Link]().toString(); // Class Name (New)
if (isTeacher) {
if ([Link](input1, input2)) {
startActivity(new Intent(this, [Link]));
} else {
[Link](this, "Invalid Credentials", Toast.LENGTH_SHORT).show();
}
} else {
// STUDENT LOGIN
if ([Link]() || [Link]() || [Link]()) {
[Link](this, "Enter Name, Roll No, and Class", Toast.LENGTH_SHORT).show();
return;
}
try {
int roll = [Link](input2);
Intent intent = new Intent(this, [Link]);
[Link]("NAME", input1);
[Link]("ROLL", roll);
[Link]("CLASS", input3); // Pass Class Name too
startActivity(intent);
} catch (NumberFormatException e) {
[Link](this, "Roll No must be a number", Toast.LENGTH_SHORT).show();
}
}
});
}
}
[Link]:
package [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
public class DatabaseHelper extends SQLiteOpenHelper {
// 1. Database Info
private static final int DATABASE_VERSION = 2; // Incremented version to force update
private static final String DATABASE_NAME = "[Link]";
private static final String S_STATUS = "STATUS"; // New Column
// 2. Table Names
private static final String TABLE_CLASS = "CLASS_TABLE";
private static final String TABLE_STUDENT = "STUDENT_TABLE";
// 3. Column Names - Class Table
private static final String C_ID = "_CID";
private static final String C_NAME = "CLASS_NAME";
private static final String C_SUBJECT = "SUBJECT_NAME";
// 4. Column Names - Student Table
private static final String S_ID = "_SID";
private static final String S_NAME = "STUDENT_NAME";
private static final String S_ROLL = "ROLL_NO";
private static final String S_CLASS_ID = "CLASS_ID";
private static final String TABLE_ATTENDANCE = "ATTENDANCE_TABLE";
private static final String A_ID = "_AID";
private static final String A_STUDENT_ID = "STUDENT_ID";
private static final String A_DATE = "DATE";
private static final String A_STATUS = "STATUS";
// 5. Create Table Queries
private static final String CREATE_TABLE_CLASS =
"CREATE TABLE " + TABLE_CLASS + "(" +
C_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
C_NAME + " TEXT NOT NULL," +
C_SUBJECT + " TEXT NOT NULL);";
// USER TABLE (For Teachers)
private static final String TABLE_USERS = "USER_TABLE";
private static final String U_ID = "_UID";
private static final String U_USERNAME = "USERNAME";
private static final String U_PASSWORD = "PASSWORD";
private static final String CREATE_TABLE_USERS =
"CREATE TABLE " + TABLE_USERS + "(" +
U_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
U_USERNAME + " TEXT NOT NULL UNIQUE," +
U_PASSWORD + " TEXT NOT NULL);";
private static final String CREATE_TABLE_STUDENT =
"CREATE TABLE " + TABLE_STUDENT + "(" +
S_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
S_NAME + " TEXT NOT NULL," +
S_ROLL + " INTEGER," +
S_CLASS_ID + " INTEGER NOT NULL," +
S_STATUS + " TEXT," + // We added this line
"FOREIGN KEY (" + S_CLASS_ID + ") REFERENCES " + TABLE_CLASS + "(" + C_ID + ")" +
");";
private static final String CREATE_TABLE_ATTENDANCE =
"CREATE TABLE " + TABLE_ATTENDANCE + "(" +
A_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
A_STUDENT_ID + " INTEGER NOT NULL," +
A_DATE + " TEXT NOT NULL," +
A_STATUS + " TEXT NOT NULL," +
"FOREIGN KEY (" + A_STUDENT_ID + ") REFERENCES " + TABLE_STUDENT + "(" + S_ID + ")" +
");";
public DatabaseHelper(@Nullable Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
[Link](CREATE_TABLE_CLASS);
[Link](CREATE_TABLE_STUDENT);
[Link](CREATE_TABLE_ATTENDANCE);
[Link](CREATE_TABLE_USERS);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
try {
[Link]("DROP TABLE IF EXISTS " + TABLE_CLASS);
[Link]("DROP TABLE IF EXISTS " + TABLE_STUDENT);
[Link]("DROP TABLE IF EXISTS " + TABLE_ATTENDANCE);
[Link]("DROP TABLE IF EXISTS " + TABLE_USERS);
onCreate(db);
} catch (SQLException e) {
[Link]();
}
}
// --- CRUD OPERATIONS ---
public long addClass(String className, String subjectName) {
SQLiteDatabase db = [Link]();
ContentValues values = new ContentValues();
[Link](C_NAME, className);
[Link](C_SUBJECT, subjectName);
return [Link](TABLE_CLASS, null, values);
}
public Cursor getClassTable() {
SQLiteDatabase db = [Link]();
return [Link]("SELECT * FROM " + TABLE_CLASS, null);
}
public long addStudent(long classId, String name, int roll) {
SQLiteDatabase db = [Link]();
ContentValues values = new ContentValues();
[Link](S_CLASS_ID, classId);
[Link](S_NAME, name);
[Link](S_ROLL, roll);
[Link](S_STATUS, "A"); // Default to Absent
return [Link](TABLE_STUDENT, null, values);
}
public Cursor getClassStudent(long classId) {
SQLiteDatabase db = [Link]();
return [Link](TABLE_STUDENT, null, S_CLASS_ID + "=?", new String[]{[Link](classId)}, null, null, S_ROLL);
}
// Method to update status (P or A)
public long updateStatus(long sid, String status) {
SQLiteDatabase db = [Link]();
ContentValues values = new ContentValues();
[Link](S_STATUS, status);
return [Link](TABLE_STUDENT, values, S_ID + "=?", new String[]{[Link](sid)});
}
public long addAttendance(long studentId, String date, String status) {
SQLiteDatabase db = [Link]();
ContentValues values = new ContentValues();
[Link](A_STUDENT_ID, studentId);
[Link](A_DATE, date);
[Link](A_STATUS, status);
// This command is magic: If a record exists for this student + date, UPDATE it.
// If not, INSERT a new one.
long id = [Link](TABLE_ATTENDANCE, values, A_STUDENT_ID + "=? AND " + A_DATE + "=?", new String[]{[Link](studentId),
date});
if (id == 0) {
id = [Link](TABLE_ATTENDANCE, null, values);
}
return id;
}
public String getStatus(long studentId, String date) {
SQLiteDatabase db = [Link]();
String status = null;
Cursor cursor = [Link](TABLE_ATTENDANCE, null, A_STUDENT_ID + "=? AND " + A_DATE + "=?", new String[]{[Link](studentId),
date}, null, null, null);
if ([Link]()) {
status = [Link]([Link](A_STATUS));
}
[Link]();
return status;
}
// 1. UPDATE STUDENT NAME
public void updateStudent(long sid, String name) {
SQLiteDatabase db = [Link]();
ContentValues values = new ContentValues();
[Link](S_NAME, name);
[Link](TABLE_STUDENT, values, S_ID + "=?", new String[]{[Link](sid)});
}
// 2. DELETE STUDENT
public void deleteStudent(long sid) {
SQLiteDatabase db = [Link]();
// Delete the student
[Link](TABLE_STUDENT, S_ID + "=?", new String[]{[Link](sid)});
// ALSO delete their attendance history (to keep database clean)
[Link](TABLE_ATTENDANCE, A_STUDENT_ID + "=?", new String[]{[Link](sid)});
}
// DELETE CLASS (And all students inside it)
public void deleteClass(long cid) {
SQLiteDatabase db = [Link]();
// 1. Delete Students assigned to this class
[Link](TABLE_STUDENT, S_CLASS_ID + "=?", new String[]{[Link](cid)});
// 2. Delete the Class itself
[Link](TABLE_CLASS, C_ID + "=?", new String[]{[Link](cid)});
}
// UPDATE CLASS NAME/SUBJECT
public void updateClass(long cid, String className, String subjectName) {
SQLiteDatabase db = [Link]();
ContentValues values = new ContentValues();
[Link](C_NAME, className);
[Link](C_SUBJECT, subjectName);
[Link](TABLE_CLASS, values, C_ID + "=?", new String[]{[Link](cid)});
}
// 1. COUNT PRESENT DAYS
public int countPresent(long sid) {
SQLiteDatabase db = [Link]();
// Count rows where Student ID matches AND Status is 'P'
Cursor cursor = [Link]("SELECT COUNT(*) FROM " + TABLE_ATTENDANCE + " WHERE " + A_STUDENT_ID + "=? AND " + A_STATUS +
"='P'", new String[]{[Link](sid)});
[Link]();
int count = [Link](0);
[Link]();
return count;
}
// 2. COUNT TOTAL DAYS ATTENDANCE TAKEN
public int countTotal(long sid) {
SQLiteDatabase db = [Link]();
// Count rows where Student ID matches
Cursor cursor = [Link]("SELECT COUNT(*) FROM " + TABLE_ATTENDANCE + " WHERE " + A_STUDENT_ID + "=?", new String[]
{[Link](sid)});
[Link]();
int count = [Link](0);
[Link]();
return count;
}
// --- TEACHER METHODS ---
public long addTeacher(String username, String password) {
SQLiteDatabase db = [Link]();
ContentValues values = new ContentValues();
[Link](U_USERNAME, username);
[Link](U_PASSWORD, password);
return [Link](TABLE_USERS, null, values);
}
public boolean checkTeacher(String username, String password) {
SQLiteDatabase db = [Link]();
Cursor cursor = [Link](TABLE_USERS, new String[]{U_ID},
U_USERNAME + "=? AND " + U_PASSWORD + "=?",
new String[]{username, password}, null, null, null);
boolean exists = ([Link]() > 0);
[Link]();
return exists;
}
// --- STUDENT METHOD (The "Best" Logic) ---
// Finds ALL classes where this student exists
public Cursor getStudentClasses(String name, int roll) {
SQLiteDatabase db = [Link]();
// Complex Query: Join Class Table and Student Table
// "Give me Class Name and Subject Name WHERE Student Name is X and Roll is Y"
String query = "SELECT C." + C_ID + ", C." + C_NAME + ", C." + C_SUBJECT +
" FROM " + TABLE_CLASS + " C " +
" JOIN " + TABLE_STUDENT + " S ON C." + C_ID + " = S." + S_CLASS_ID +
" WHERE S." + S_NAME + "=? AND S." + S_ROLL + "=?";
return [Link](query, new String[]{name, [Link](roll)});
}
// Get Student ID inside a specific class (helper for the result page)
public long getStudentIdInClass(long classId, String name, int roll) {
SQLiteDatabase db = [Link]();
Cursor cursor = [Link](TABLE_STUDENT, new String[]{S_ID},
S_CLASS_ID + "=? AND " + S_NAME + "=? AND " + S_ROLL + "=?",
new String[]{[Link](classId), name, [Link](roll)}, null, null, null);
if ([Link]()) {
long id = [Link](0);
[Link]();
return id;
}
return -1;
}
// NEW: Find a student in a SPECIFIC class
public Cursor getStudentByNameRollClass(String name, int roll, String className) {
SQLiteDatabase db = [Link]();
// Join Class and Student tables to check Class Name too
String query = "SELECT C." + C_ID + ", C." + C_NAME + ", C." + C_SUBJECT +
" FROM " + TABLE_CLASS + " C " +
" JOIN " + TABLE_STUDENT + " S ON C." + C_ID + " = S." + S_CLASS_ID +
" WHERE S." + S_NAME + "=? AND S." + S_ROLL + "=? AND C." + C_NAME + "=?";
return [Link](query, new String[]{name, [Link](roll), className});
}
}
[Link]:
package [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link].R;
public class RegisterActivity extends AppCompatActivity {
// 1. Declare Variables
EditText etUser, etPass;
Button btnRegister;
TextView tvLogin; // Variable for the "Login" text link
DatabaseHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
[Link](savedInstanceState);
setContentView([Link].activity_register);
// 2. Initialize Helper and Views
dbHelper = new DatabaseHelper(this);
etUser = findViewById([Link]);
etPass = findViewById([Link]);
btnRegister = findViewById([Link]);
tvLogin = findViewById([Link]); // Find the text view
// 3. LOGIC: Handle the "Back to Login" click
[Link](v -> {
finish(); // Closes this screen, revealing Login screen behind it
});
// 4. LOGIC: Handle Registration
[Link](v -> {
String user = [Link]().toString().trim();
String pass = [Link]().toString().trim();
// Check if empty
if([Link]() || [Link]()){
[Link](this, "Please fill all fields", Toast.LENGTH_SHORT).show();
return;
}
// Check if username is purely numbers
if ([Link]("[0-9]+")) {
[Link](this, "Username cannot be just numbers! Please use a name.", Toast.LENGTH_LONG).show();
return;
}
// Check length
if ([Link]() < 3) {
[Link](this, "Username must be at least 3 letters", Toast.LENGTH_SHORT).show();
return;
}
// Save to Database
long id = [Link](user, pass);
if(id > 0){
[Link](this, "Registered! Now Login.", Toast.LENGTH_SHORT).show();
finish(); // Close screen after success
} else {
[Link](this, "Registration Failed (User already exists)", Toast.LENGTH_SHORT).show();
}
});
}
}
[Link]:
package [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link]; // Import Toast
import [Link];
import [Link];
import [Link];
import [Link].R;
import [Link]; // Import FAB
import [Link];
public class StudentDashboardActivity extends AppCompatActivity {
RecyclerView recyclerView;
ClassAdapter adapter;
ArrayList<ClassItem> classItems = new ArrayList<>();
DatabaseHelper dbHelper;
String studentName;
int studentRoll;
String classNameInput; // New variable
@Override
protected void onCreate(Bundle savedInstanceState) {
[Link](savedInstanceState);
setContentView([Link].activity_dashboard);
// 1. HIDE THE PLUS BUTTON (Crucial Step!)
FloatingActionButton fab = findViewById([Link].fab_add);
[Link]([Link]);
dbHelper = new DatabaseHelper(this);
studentName = getIntent().getStringExtra("NAME");
studentRoll = getIntent().getIntExtra("ROLL", 0);
classNameInput = getIntent().getStringExtra("CLASS"); // Get Class Name
recyclerView = findViewById([Link]);
[Link](new LinearLayoutManager(this));
adapter = new ClassAdapter(this, classItems);
[Link](adapter);
// --- LOGOUT LOGIC ---
// 1. Find the button (It acts like an ImageButton)
View logout = findViewById([Link]);
// 2. Make it work
[Link](v -> {
Intent intent = new Intent(this, [Link]);
// Clear all history so they can't press "Back" to get in
[Link](Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();
});
[Link](position -> {
long classId = [Link](position).getCid();
String className = [Link](position).getClassName(); // Get Class Name
String subjectName = [Link](position).getSubjectName(); // Get Subject Name
long sid = [Link](classId, studentName, studentRoll);
Intent intent = new Intent(this, [Link]);
[Link]("SID", [Link](sid));
// NEW: Send Name and Class info to the next page
[Link]("SNAME", studentName);
[Link]("CNAME", className + " (" + subjectName + ")");
startActivity(intent);
});
loadStudentClasses();
}
private void loadStudentClasses() {
[Link]();
// Use the new SPECIFIC search (Name + Roll + Class)
Cursor cursor = [Link](studentName, studentRoll, classNameInput);
if ([Link]() == 0) {
[Link](this, "No record found! Check Class Name.", Toast.LENGTH_LONG).show();
}
while ([Link]()) {
long cid = [Link](0);
String className = [Link](1);
String subjectName = [Link](2);
[Link](new ClassItem(cid, className, subjectName));
}
[Link]();
}
}
[Link]:
package [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link].R;
public class StudentResultActivity extends AppCompatActivity {
TextView tvName, tvPercentage, tvStats, tvClassName;
DatabaseHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
[Link](savedInstanceState);
setContentView([Link].activity_student_result);
dbHelper = new DatabaseHelper(this);
tvName = findViewById([Link]);
tvClassName = findViewById([Link]); // New Text View
tvPercentage = findViewById([Link]);
tvStats = findViewById([Link]);
Button btnBack = findViewById([Link]);
// 1. Get Data passed from Dashboard
String sidStr = getIntent().getStringExtra("SID");
String sName = getIntent().getStringExtra("SNAME");
String cName = getIntent().getStringExtra("CNAME");
// 2. Set the static texts
[Link](sName); // Shows "Shahid" instead of "Student ID: 1"
[Link](cName); // Shows "12th (Maths)"
try {
long sid = [Link](sidStr);
loadStudentData(sid);
} catch (Exception e) {
[Link]("Error loading data");
}
// 3. THE FIX: Just finish() to go back to Dashboard
[Link](v -> finish());
}
private void loadStudentData(long sid) {
int present = [Link](sid);
int total = [Link](sid);
int percentage = 0;
if (total > 0) {
percentage = (present * 100) / total;
}
[Link](percentage + "%");
[Link]("Present: " + present + " / " + total + " Days");
}
}
[Link]:
package [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
// Check this import, ensure it matches your package
import [Link].R;
public class StudentActivity extends AppCompatActivity {
Toolbar toolbar;
private String className;
private String subjectName;
private int position;
private RecyclerView recyclerView;
private StudentAdapter adapter;
private [Link] layoutManager;
private ArrayList<Student> studentItems = new ArrayList<>();
private DatabaseHelper dbHelper;
private long cid;
private FloatingActionButton fab;
private String selectedDate;
@Override
protected void onCreate(Bundle savedInstanceState) {
[Link](savedInstanceState);
setContentView([Link].activity_student);
dbHelper = new DatabaseHelper(this);
Intent intent = getIntent();
className = [Link]("className");
subjectName = [Link]("subjectName");
position = [Link]("position", -1);
cid = [Link]("cid", -1);
// Default to today's date
Calendar calendar = [Link]();
selectedDate = [Link](Calendar.DAY_OF_MONTH) + "-" + ([Link]([Link])+1) + "-" + [Link]([Link]);
setToolbar();
recyclerView = findViewById([Link].student_recycler);
[Link](true);
layoutManager = new LinearLayoutManager(this);
[Link](layoutManager);
adapter = new StudentAdapter(this, studentItems);
[Link](adapter);
[Link](position -> changeStatus(position));
[Link](position -> changeStatus(position));
// NEW: Long click to Edit/Delete
[Link](position -> showUpdateDialog(position));
loadStatus();
fab = findViewById([Link].fab_add_student);
[Link](v -> showAddStudentDialog());
}
private void loadStatus() {
[Link]();
Cursor cursor = [Link](cid);
while ([Link]()) {
long id = [Link](0);
String name = [Link](1);
int roll = [Link](2);
// 1. Get status for the specific date (Visual Color)
String status = [Link](id, selectedDate);
// 2. NEW: Get Lifetime Stats (The Report Card)
int presentDays = [Link](id);
int totalDays = [Link](id);
// 3. Create a fancy subtitle
// Instead of just "101", it will say "Roll: 101 | P: 5/10"
String rollText = "Roll: " + roll + " | P: " + presentDays + "/" + totalDays;
// 4. Create Student with the new subtitle
Student student = new Student([Link](id), name, rollText, "");
// 5. Set the status manually
if (status != null) {
[Link](status);
} else {
[Link]("A");
}
[Link](student);
}
[Link]();
}
private void showAddStudentDialog() {
[Link] builder = new [Link](this);
View view = [Link](this).inflate([Link].dialog_add_student, null);
[Link](view);
AlertDialog dialog = [Link]();
[Link]();
EditText edtRoll = [Link]([Link].edt_roll_no);
EditText edtName = [Link]([Link].edt_student_name);
Button btnAdd = [Link]([Link].btn_add);
Button btnCancel = [Link]([Link].btn_cancel);
[Link](v -> {
String name = [Link]().toString();
String rollStr = [Link]().toString();
if ([Link]() || [Link]()) {
[Link](this, "Please enter details", Toast.LENGTH_SHORT).show();
return;
}
int roll = [Link](rollStr);
long sid = [Link](cid, name, roll);
if (sid != -1) {
[Link](new Student([Link](sid), name, [Link](roll), ""));
[Link]();
[Link]();
}
});
[Link](v -> [Link]());
}
private void setToolbar() {
toolbar = findViewById([Link]);
TextView title = [Link]([Link].title_toolbar);
TextView subtitle = [Link]([Link].subtitle_toolbar);
ImageButton back = [Link]([Link]);
ImageButton save = [Link]([Link]);
[Link](className);
[Link](selectedDate); // Show date
[Link](v -> onBackPressed());
[Link](v -> saveAttendance());
// When clicking the date, show the picker
[Link](v -> showDatePicker());
}
// THIS METHOD MUST BE OUTSIDE setToolbar
private void showDatePicker() {
Calendar calendar = [Link]();
int year = [Link]([Link]);
int month = [Link]([Link]);
int day = [Link](Calendar.DAY_OF_MONTH);
DatePickerDialog datePickerDialog = new DatePickerDialog(this, (view, year1, month1, dayOfMonth) -> {
month1 += 1; // Month is 0-indexed
selectedDate = dayOfMonth + "-" + month1 + "-" + year1;
// Update the toolbar text
TextView subtitle = [Link]([Link].subtitle_toolbar);
[Link](selectedDate);
// Reload database for this new date
loadStatus();
}, year, month, day);
[Link]();
}
private void changeStatus(int position) {
String status = [Link](position).getStatus();
if ([Link]("P")) {
status = "A";
} else {
status = "P";
}
[Link](position).setStatus(status);
[Link](position);
}
private void saveAttendance() {
for (Student student : studentItems) {
String status = [Link]();
long sid = [Link]([Link]());
// Save to history table
[Link](sid, selectedDate, status);
// Also update student table (optional, but harmless)
[Link](sid, status);
}
[Link](this, "Saved for " + selectedDate, Toast.LENGTH_SHORT).show();
}
private void showUpdateDialog(int position) {
Student student = [Link](position);
// Option 1: Delete
// Option 2: Update
[Link] builder = new [Link](this);
[Link]("Edit Student");
[Link]("What do you want to do with " + [Link]() + "?");
[Link]("Update", (dialog, which) -> showEditNameDialog(position));
[Link]("Delete", (dialog, which) -> deleteStudent(position));
[Link]("Cancel", (dialog, which) -> [Link]());
[Link]();
}
private void deleteStudent(int position) {
long sid = [Link]([Link](position).getSid());
[Link](sid);
[Link](position);
[Link](position);
}
private void showEditNameDialog(int position) {
[Link] builder = new [Link](this);
View view = [Link](this).inflate([Link].dialog_add_student, null);
[Link](view);
AlertDialog dialog = [Link]();
[Link]();
EditText edtName = [Link]([Link].edt_student_name);
EditText edtRoll = [Link]([Link].edt_roll_no);
Button btnAdd = [Link]([Link].btn_add);
Button btnCancel = [Link]([Link].btn_cancel);
//TextView title = [Link]([Link]); // You might need to add an ID to the title in XML
// Pre-fill existing data
[Link]([Link](position).getName());
[Link]([Link](position).getRollNumber());
[Link](false); // Let's disable roll no editing to keep it simple for now
[Link]("Update"); // Change button text
[Link](v -> {
String name = [Link]().toString();
if ([Link]()) {
[Link](this, "Name cannot be empty", Toast.LENGTH_SHORT).show();
return;
}
// Update Database
long sid = [Link]([Link](position).getSid());
[Link](sid, name);
// Update List
[Link](position).setName(name);
[Link](position);
[Link]();
});
[Link](v -> [Link]());
}
}