0% found this document useful (0 votes)
8 views24 pages

Java Files

The document contains Java code for an attendance application, including classes for managing students and classes, as well as user interfaces for displaying and interacting with this data. Key components include the StudentAdapter and ClassAdapter for RecyclerView implementations, and DashboardActivity for managing class data with options to add, update, or delete classes. The MainActivity handles user authentication and navigation within the app.

Uploaded by

shahidshaikh6298
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
8 views24 pages

Java Files

The document contains Java code for an attendance application, including classes for managing students and classes, as well as user interfaces for displaying and interacting with this data. Key components include the StudentAdapter and ClassAdapter for RecyclerView implementations, and DashboardActivity for managing class data with options to add, update, or delete classes. The MainActivity handles user authentication and navigation within the app.

Uploaded by

shahidshaikh6298
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd

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]());
}
}

You might also like