<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Chaitanya Kannan</title>
    <description>The latest articles on DEV Community by Chaitanya Kannan (@chaitanya_kannan).</description>
    <link>https://dev.to/chaitanya_kannan</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3054791%2F3034a1e8-b065-4f3f-908c-e84836dda0e3.png</url>
      <title>DEV Community: Chaitanya Kannan</title>
      <link>https://dev.to/chaitanya_kannan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/chaitanya_kannan"/>
    <language>en</language>
    <item>
      <title>TravelBooking</title>
      <dc:creator>Chaitanya Kannan</dc:creator>
      <pubDate>Wed, 16 Apr 2025 08:12:26 +0000</pubDate>
      <link>https://dev.to/chaitanya_kannan/travelbooking-15k4</link>
      <guid>https://dev.to/chaitanya_kannan/travelbooking-15k4</guid>
      <description>&lt;p&gt;// MainActivity.java&lt;/p&gt;

&lt;p&gt;package com.example.travelbookingapp;&lt;/p&gt;

&lt;p&gt;import androidx.annotation.NonNull;&lt;br&gt;
import androidx.appcompat.app.AppCompatActivity;&lt;br&gt;
import androidx.fragment.app.Fragment;&lt;br&gt;
import androidx.fragment.app.FragmentManager;&lt;br&gt;
import androidx.fragment.app.FragmentPagerAdapter;&lt;br&gt;
import androidx.viewpager.widget.ViewPager;&lt;/p&gt;

&lt;p&gt;import android.content.ContentValues;&lt;br&gt;
import android.content.Context;&lt;br&gt;
import android.content.SharedPreferences;&lt;br&gt;
import android.database.Cursor;&lt;br&gt;
import android.database.sqlite.SQLiteDatabase;&lt;br&gt;
import android.database.sqlite.SQLiteOpenHelper;&lt;br&gt;
import android.os.Bundle;&lt;br&gt;
import android.view.LayoutInflater;&lt;br&gt;
import android.view.Menu;&lt;br&gt;
import android.view.MenuItem;&lt;br&gt;
import android.view.View;&lt;br&gt;
import android.view.ViewGroup;&lt;br&gt;
import android.widget.AdapterView;&lt;br&gt;
import android.widget.ArrayAdapter;&lt;br&gt;
import android.widget.BaseAdapter;&lt;br&gt;
import android.widget.Button;&lt;br&gt;
import android.widget.CheckBox;&lt;br&gt;
import android.widget.DatePicker;&lt;br&gt;
import android.widget.EditText;&lt;br&gt;
import android.widget.LinearLayout;&lt;br&gt;
import android.widget.ListView;&lt;br&gt;
import android.widget.PopupMenu;&lt;br&gt;
import android.widget.RadioButton;&lt;br&gt;
import android.widget.RadioGroup;&lt;br&gt;
import android.widget.Spinner;&lt;br&gt;
import android.widget.TextView;&lt;br&gt;
import android.widget.TimePicker;&lt;br&gt;
import android.widget.Toast;&lt;/p&gt;

&lt;p&gt;import com.google.android.material.tabs.TabLayout;&lt;/p&gt;

&lt;p&gt;import java.text.SimpleDateFormat;&lt;br&gt;
import java.util.ArrayList;&lt;br&gt;
import java.util.Calendar;&lt;br&gt;
import java.util.Date;&lt;br&gt;
import java.util.List;&lt;br&gt;
import java.util.Locale;&lt;/p&gt;

&lt;p&gt;public class MainActivity extends AppCompatActivity {&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;private static final String PREFS_NAME = "TravelAppPrefs";
private static final String LOGGED_IN_USER = "loggedInUser";

private ViewPager viewPager;
private TabLayout tabLayout;
private DatabaseHelper dbHelper;
private boolean isLoggedIn = false;
private String currentUsername = "";

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

    dbHelper = new DatabaseHelper(this);

    // Check if user is already logged in
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
    currentUsername = settings.getString(LOGGED_IN_USER, "");
    isLoggedIn = !currentUsername.isEmpty();

    // Initialize views
    if (isLoggedIn) {
        setupLoggedInView();
    } else {
        setupLoginView();
    }
}

private void setupLoginView() {
    setContentView(R.layout.activity_main);

    final EditText etUsername = findViewById(R.id.etUsername);
    final EditText etPassword = findViewById(R.id.etPassword);
    Button btnLogin = findViewById(R.id.btnLogin);
    Button btnSignup = findViewById(R.id.btnSignup);

    btnLogin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String username = etUsername.getText().toString().trim();
            String password = etPassword.getText().toString().trim();

            if (username.isEmpty() || password.isEmpty()) {
                Toast.makeText(MainActivity.this, "All fields are required", Toast.LENGTH_SHORT).show();
                return;
            }

            if (dbHelper.checkUser(username, password)) {
                // Save login state
                saveLoginState(username);

                // Setup logged in view
                currentUsername = username;
                isLoggedIn = true;
                setupLoggedInView();
            } else {
                Toast.makeText(MainActivity.this, "Invalid credentials", Toast.LENGTH_SHORT).show();
            }
        }
    });

    btnSignup.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String username = etUsername.getText().toString().trim();
            String password = etPassword.getText().toString().trim();

            if (username.isEmpty() || password.isEmpty()) {
                Toast.makeText(MainActivity.this, "All fields are required", Toast.LENGTH_SHORT).show();
                return;
            }

            if (dbHelper.checkUserExists(username)) {
                Toast.makeText(MainActivity.this, "Username already exists", Toast.LENGTH_SHORT).show();
                return;
            }

            if (dbHelper.addUser(username, password)) {
                Toast.makeText(MainActivity.this, "User registered successfully", Toast.LENGTH_SHORT).show();

                // Save login state
                saveLoginState(username);

                // Setup logged in view
                currentUsername = username;
                isLoggedIn = true;
                setupLoggedInView();
            } else {
                Toast.makeText(MainActivity.this, "Registration failed", Toast.LENGTH_SHORT).show();
            }
        }
    });
}

private void setupLoggedInView() {
    setContentView(R.layout.activity_main);

    viewPager = findViewById(R.id.viewPager);
    tabLayout = findViewById(R.id.tabLayout);

    // Set up ViewPager with TabLayout
    setupViewPager();
    tabLayout.setupWithViewPager(viewPager);
}

private void setupViewPager() {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(new BookTicketFragment(), "Book Ticket");
    adapter.addFragment(new BookingsFragment(), "My Bookings");
    adapter.addFragment(new ProfileFragment(), "Profile");
    viewPager.setAdapter(adapter);
}

private void saveLoginState(String username) {
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
    SharedPreferences.Editor editor = settings.edit();
    editor.putString(LOGGED_IN_USER, username);
    editor.apply();
}

private void clearLoginState() {
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
    SharedPreferences.Editor editor = settings.edit();
    editor.remove(LOGGED_IN_USER);
    editor.apply();
}

// Fragment adapter for ViewPager
class ViewPagerAdapter extends FragmentPagerAdapter {
    private final List&amp;lt;Fragment&amp;gt; fragmentList = new ArrayList&amp;lt;&amp;gt;();
    private final List&amp;lt;String&amp;gt; fragmentTitleList = new ArrayList&amp;lt;&amp;gt;();

    public ViewPagerAdapter(FragmentManager manager) {
        super(manager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
    }

    @NonNull
    @Override
    public Fragment getItem(int position) {
        return fragmentList.get(position);
    }

    @Override
    public int getCount() {
        return fragmentList.size();
    }

    public void addFragment(Fragment fragment, String title) {
        fragmentList.add(fragment);
        fragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return fragmentTitleList.get(position);
    }
}

// BookTicket Fragment
public static class BookTicketFragment extends Fragment {
    private boolean isTicketBooked = false;
    private String bookingDetails = "";

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        if (isTicketBooked) {
            return inflateTicketDetailsView(inflater, container);
        } else {
            return inflateBookingFormView(inflater, container);
        }
    }

    private View inflateBookingFormView(LayoutInflater inflater, ViewGroup container) {
        View view = inflater.inflate(R.layout.fragment_book_ticket, container, false);

        final EditText etName = view.findViewById(R.id.etName);
        final EditText etAge = view.findViewById(R.id.etAge);
        final DatePicker datePicker = view.findViewById(R.id.datePicker);
        final TimePicker timePicker = view.findViewById(R.id.timePicker);
        final Spinner spinnerSeatType = view.findViewById(R.id.spinnerSeatType);
        final CheckBox checkboxMeal = view.findViewById(R.id.checkboxMeal);
        final CheckBox checkboxLuggage = view.findViewById(R.id.checkboxLuggage);
        final RadioGroup radioGroupClass = view.findViewById(R.id.radioGroupClass);
        final Button btnOptions = view.findViewById(R.id.btnOptions);
        final Button btnSubmit = view.findViewById(R.id.btnSubmit);

        // Setup spinner for seat type
        ArrayAdapter&amp;lt;CharSequence&amp;gt; adapter = ArrayAdapter.createFromResource(
                getContext(),
                R.array.seat_types,
                android.R.layout.simple_spinner_item
        );
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinnerSeatType.setAdapter(adapter);

        // Setup popup menu for additional options
        btnOptions.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                PopupMenu popup = new PopupMenu(getContext(), v);
                popup.getMenuInflater().inflate(R.menu.booking_options_menu, popup.getMenu());

                popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        Toast.makeText(getContext(), "Selected: " + item.getTitle(), Toast.LENGTH_SHORT).show();
                        return true;
                    }
                });

                popup.show();
            }
        });

        // Submit booking
        btnSubmit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String name = etName.getText().toString().trim();
                String ageStr = etAge.getText().toString().trim();

                if (name.isEmpty() || ageStr.isEmpty()) {
                    Toast.makeText(getContext(), "Please enter name and age", Toast.LENGTH_SHORT).show();
                    return;
                }

                int age = Integer.parseInt(ageStr);

                // Get selected date
                Calendar calendar = Calendar.getInstance();
                calendar.set(datePicker.getYear(), datePicker.getMonth(), datePicker.getDayOfMonth());
                Date date = calendar.getTime();
                SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy", Locale.US);
                String dateStr = dateFormat.format(date);

                // Get selected time
                int hour = timePicker.getCurrentHour();
                int minute = timePicker.getCurrentMinute();
                String timeStr = String.format(Locale.US, "%02d:%02d", hour, minute);

                // Get seat type
                String seatType = spinnerSeatType.getSelectedItem().toString();

                // Get additional options
                boolean hasMeal = checkboxMeal.isChecked();
                boolean hasLuggage = checkboxLuggage.isChecked();

                // Get class
                int selectedRadioId = radioGroupClass.getCheckedRadioButtonId();
                RadioButton radioButton = view.findViewById(selectedRadioId);
                String travelClass = radioButton != null ? radioButton.getText().toString() : "Economy";

                // Create booking details
                bookingDetails = "Name: " + name + "\n" +
                        "Age: " + age + "\n" +
                        "Date: " + dateStr + "\n" +
                        "Time: " + timeStr + "\n" +
                        "Seat Type: " + seatType + "\n" +
                        "Class: " + travelClass + "\n" +
                        "Meal Included: " + (hasMeal ? "Yes" : "No") + "\n" +
                        "Extra Luggage: " + (hasLuggage ? "Yes" : "No");

                // Save to database
                DatabaseHelper dbHelper = new DatabaseHelper(getContext());
                MainActivity activity = (MainActivity) getActivity();
                String username = activity.currentUsername;

                long bookingId = dbHelper.addBooking(username, name, age, dateStr, timeStr, 
                        seatType, travelClass, hasMeal, hasLuggage);

                if (bookingId != -1) {
                    Toast.makeText(getContext(), "Booking successful", Toast.LENGTH_SHORT).show();
                    isTicketBooked = true;

                    // Reload the fragment with ticket details view
                    ViewGroup viewGroup = (ViewGroup) view.getParent();
                    viewGroup.removeView(view);
                    View newView = inflateTicketDetailsView(getLayoutInflater(), viewGroup);
                    viewGroup.addView(newView);
                } else {
                    Toast.makeText(getContext(), "Booking failed", Toast.LENGTH_SHORT).show();
                }
            }
        });

        registerForContextMenu(view.findViewById(R.id.tvContextMenu));

        return view;
    }

    private View inflateTicketDetailsView(LayoutInflater inflater, ViewGroup container) {
        View view = inflater.inflate(R.layout.fragment_ticket_details, container, false);

        TextView tvTicketDetails = view.findViewById(R.id.tvTicketDetails);
        Button btnBack = view.findViewById(R.id.btnBack);

        tvTicketDetails.setText(bookingDetails);

        btnBack.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                isTicketBooked = false;

                // Reload the fragment with booking form view
                ViewGroup viewGroup = (ViewGroup) view.getParent();
                if (viewGroup != null) {
                    viewGroup.removeView(view);
                    View newView = inflateBookingFormView(getLayoutInflater(), viewGroup);
                    viewGroup.addView(newView);
                }
            }
        });

        return view;
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu_info:
                Toast.makeText(getContext(), "Travel information", Toast.LENGTH_SHORT).show();
                return true;
            case R.id.menu_help:
                Toast.makeText(getContext(), "Help center", Toast.LENGTH_SHORT).show();
                return true;
            default:
                return super.onContextItemSelected(item);
        }
    }
}

// Bookings Fragment
public static class BookingsFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_bookings, container, false);

        ListView listView = view.findViewById(R.id.listViewBookings);
        DatabaseHelper dbHelper = new DatabaseHelper(getContext());
        MainActivity activity = (MainActivity) getActivity();
        String username = activity.currentUsername;

        List&amp;lt;Booking&amp;gt; bookings = dbHelper.getBookings(username);
        BookingsAdapter adapter = new BookingsAdapter(getContext(), bookings);
        listView.setAdapter(adapter);

        return view;
    }

    private static class BookingsAdapter extends BaseAdapter {
        private Context context;
        private List&amp;lt;Booking&amp;gt; bookings;

        public BookingsAdapter(Context context, List&amp;lt;Booking&amp;gt; bookings) {
            this.context = context;
            this.bookings = bookings;
        }

        @Override
        public int getCount() {
            return bookings.size();
        }

        @Override
        public Object getItem(int position) {
            return bookings.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if (convertView == null) {
                convertView = LayoutInflater.from(context).inflate(R.layout.item_booking, parent, false);
            }

            TextView tvName = convertView.findViewById(R.id.tvBookingName);
            TextView tvDate = convertView.findViewById(R.id.tvBookingDate);
            TextView tvDetails = convertView.findViewById(R.id.tvBookingDetails);

            Booking booking = bookings.get(position);
            tvName.setText(booking.name);
            tvDate.setText(booking.date + " at " + booking.time);
            tvDetails.setText("Class: " + booking.travelClass + ", Seat: " + booking.seatType);

            return convertView;
        }
    }
}

// Profile Fragment
public static class ProfileFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_profile, container, false);

        TextView tvUsername = view.findViewById(R.id.tvUsername);
        Button btnLogout = view.findViewById(R.id.btnLogout);

        MainActivity activity = (MainActivity) getActivity();
        tvUsername.setText("Welcome, " + activity.currentUsername);

        btnLogout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MainActivity activity = (MainActivity) getActivity();
                activity.clearLoginState();
                activity.isLoggedIn = false;
                activity.currentUsername = "";
                activity.setupLoginView();
            }
        });

        return view;
    }
}

// DatabaseHelper class for SQLite operations
public static class DatabaseHelper extends SQLiteOpenHelper {

    private static final String DATABASE_NAME = "TravelBooking.db";
    private static final int DATABASE_VERSION = 1;

    // User table
    private static final String TABLE_USERS = "users";
    private static final String COLUMN_USER_ID = "id";
    private static final String COLUMN_USER_USERNAME = "username";
    private static final String COLUMN_USER_PASSWORD = "password";

    // Booking table
    private static final String TABLE_BOOKINGS = "bookings";
    private static final String COLUMN_BOOKING_ID = "id";
    private static final String COLUMN_BOOKING_USERNAME = "username";
    private static final String COLUMN_BOOKING_NAME = "name";
    private static final String COLUMN_BOOKING_AGE = "age";
    private static final String COLUMN_BOOKING_DATE = "date";
    private static final String COLUMN_BOOKING_TIME = "time";
    private static final String COLUMN_BOOKING_SEAT_TYPE = "seat_type";
    private static final String COLUMN_BOOKING_CLASS = "travel_class";
    private static final String COLUMN_BOOKING_MEAL = "has_meal";
    private static final String COLUMN_BOOKING_LUGGAGE = "has_luggage";

    // Create table queries
    private static final String CREATE_TABLE_USERS =
            "CREATE TABLE " + TABLE_USERS + "("
                    + COLUMN_USER_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
                    + COLUMN_USER_USERNAME + " TEXT UNIQUE,"
                    + COLUMN_USER_PASSWORD + " TEXT"
                    + ")";

    private static final String CREATE_TABLE_BOOKINGS =
            "CREATE TABLE " + TABLE_BOOKINGS + "("
                    + COLUMN_BOOKING_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
                    + COLUMN_BOOKING_USERNAME + " TEXT,"
                    + COLUMN_BOOKING_NAME + " TEXT,"
                    + COLUMN_BOOKING_AGE + " INTEGER,"
                    + COLUMN_BOOKING_DATE + " TEXT,"
                    + COLUMN_BOOKING_TIME + " TEXT,"
                    + COLUMN_BOOKING_SEAT_TYPE + " TEXT,"
                    + COLUMN_BOOKING_CLASS + " TEXT,"
                    + COLUMN_BOOKING_MEAL + " INTEGER,"
                    + COLUMN_BOOKING_LUGGAGE + " INTEGER"
                    + ")";

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // Create tables
        db.execSQL(CREATE_TABLE_USERS);
        db.execSQL(CREATE_TABLE_BOOKINGS);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Drop older tables if existed
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_USERS);
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_BOOKINGS);

        // Create tables again
        onCreate(db);
    }

    // Add a new user
    public boolean addUser(String username, String password) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();

        values.put(COLUMN_USER_USERNAME, username);
        values.put(COLUMN_USER_PASSWORD, password);

        // Insert row
        long id = db.insert(TABLE_USERS, null, values);
        db.close();

        return id != -1;
    }

    // Check if user exists
    public boolean checkUserExists(String username) {
        SQLiteDatabase db = this.getReadableDatabase();

        String[] columns = {COLUMN_USER_ID};
        String selection = COLUMN_USER_USERNAME + " = ?";
        String[] selectionArgs = {username};

        Cursor cursor = db.query(
                TABLE_USERS,
                columns,
                selection,
                selectionArgs,
                null,
                null,
                null
        );

        int count = cursor.getCount();
        cursor.close();
        db.close();

        return count &amp;gt; 0;
    }

    // Check user credentials
    public boolean checkUser(String username, String password) {
        SQLiteDatabase db = this.getReadableDatabase();

        String[] columns = {COLUMN_USER_ID};
        String selection = COLUMN_USER_USERNAME + " = ? AND " + COLUMN_USER_PASSWORD + " = ?";
        String[] selectionArgs = {username, password};

        Cursor cursor = db.query(
                TABLE_USERS,
                columns,
                selection,
                selectionArgs,
                null,
                null,
                null
        );

        int count = cursor.getCount();
        cursor.close();
        db.close();

        return count &amp;gt; 0;
    }

    // Add a new booking
    public long addBooking(String username, String name, int age, String date, String time,
                          String seatType, String travelClass, boolean hasMeal, boolean hasLuggage) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();

        values.put(COLUMN_BOOKING_USERNAME, username);
        values.put(COLUMN_BOOKING_NAME, name);
        values.put(COLUMN_BOOKING_AGE, age);
        values.put(COLUMN_BOOKING_DATE, date);
        values.put(COLUMN_BOOKING_TIME, time);
        values.put(COLUMN_BOOKING_SEAT_TYPE, seatType);
        values.put(COLUMN_BOOKING_CLASS, travelClass);
        values.put(COLUMN_BOOKING_MEAL, hasMeal ? 1 : 0);
        values.put(COLUMN_BOOKING_LUGGAGE, hasLuggage ? 1 : 0);

        // Insert row
        long id = db.insert(TABLE_BOOKINGS, null, values);
        db.close();

        return id;
    }

    // Get all bookings for a user
    public List&amp;lt;Booking&amp;gt; getBookings(String username) {
        List&amp;lt;Booking&amp;gt; bookings = new ArrayList&amp;lt;&amp;gt;();

        String selectQuery = "SELECT * FROM " + TABLE_BOOKINGS + 
                           " WHERE " + COLUMN_BOOKING_USERNAME + " = ?" +
                           " ORDER BY " + COLUMN_BOOKING_ID + " DESC";

        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, new String[]{username});

        if (cursor.moveToFirst()) {
            do {
                Booking booking = new Booking();
                booking.id = cursor.getInt(cursor.getColumnIndex(COLUMN_BOOKING_ID));
                booking.name = cursor.getString(cursor.getColumnIndex(COLUMN_BOOKING_NAME));
                booking.age = cursor.getInt(cursor.getColumnIndex(COLUMN_BOOKING_AGE));
                booking.date = cursor.getString(cursor.getColumnIndex(COLUMN_BOOKING_DATE));
                booking.time = cursor.getString(cursor.getColumnIndex(COLUMN_BOOKING_TIME));
                booking.seatType = cursor.getString(cursor.getColumnIndex(COLUMN_BOOKING_SEAT_TYPE));
                booking.travelClass = cursor.getString(cursor.getColumnIndex(COLUMN_BOOKING_CLASS));
                booking.hasMeal = cursor.getInt(cursor.getColumnIndex(COLUMN_BOOKING_MEAL)) == 1;
                booking.hasLuggage = cursor.getInt(cursor.getColumnIndex(COLUMN_BOOKING_LUGGAGE)) == 1;

                bookings.add(booking);
            } while (cursor.moveToNext());
        }

        cursor.close();
        db.close();

        return bookings;
    }
}

// Booking model class
public static class Booking {
    public int id;
    public String name;
    public int age;
    public String date;
    public String time;
    public String seatType;
    public String travelClass;
    public boolean hasMeal;
    public boolean hasLuggage;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br&gt;

    xmlns:app="http://schemas.android.com/apk/res-auto"&lt;br&gt;
    xmlns:tools="http://schemas.android.com/tools"&lt;br&gt;
    android:layout_width="match_parent"&lt;br&gt;
    android:layout_height="match_parent"&lt;br&gt;
    android:orientation="vertical"&lt;br&gt;
    tools:context=".MainActivity"&amp;gt;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!-- Login/Signup View --&amp;gt;
&amp;lt;LinearLayout
    android:id="@+id/loginLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    android:padding="16dp"&amp;gt;

    &amp;lt;TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Travel Booking App"
        android:textSize="24sp"
        android:textStyle="bold"
        android:layout_marginBottom="32dp"/&amp;gt;

    &amp;lt;EditText
        android:id="@+id/etUsername"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Username"
        android:inputType="text"
        android:layout_marginBottom="16dp"/&amp;gt;

    &amp;lt;EditText
        android:id="@+id/etPassword"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Password"
        android:inputType="textPassword"
        android:layout_marginBottom="24dp"/&amp;gt;

    &amp;lt;LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"&amp;gt;

        &amp;lt;Button
            android:id="@+id/btnLogin"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Login"
            android:layout_marginRight="8dp"/&amp;gt;

        &amp;lt;Button
            android:id="@+id/btnSignup"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Sign Up"
            android:layout_marginLeft="8dp"/&amp;gt;
    &amp;lt;/LinearLayout&amp;gt;
&amp;lt;/LinearLayout&amp;gt;

&amp;lt;!-- TabLayout View (shown after login) --&amp;gt;
&amp;lt;com.google.android.material.tabs.TabLayout
    android:id="@+id/tabLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:tabGravity="fill"
    app:tabMode="fixed"
    android:visibility="gone"/&amp;gt;

&amp;lt;androidx.viewpager.widget.ViewPager
    android:id="@+id/viewPager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:visibility="gone"/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br&gt;

    android:layout_width="match_parent"&lt;br&gt;
    android:layout_height="match_parent"&amp;gt;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="16dp"&amp;gt;

    &amp;lt;TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Book Your Ticket"
        android:textSize="20sp"
        android:textStyle="bold"
        android:layout_marginBottom="16dp"/&amp;gt;

    &amp;lt;EditText
        android:id="@+id/etName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Name"
        android:inputType="textPersonName"
        android:layout_marginBottom="12dp"/&amp;gt;

    &amp;lt;EditText
        android:id="@+id/etAge"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Age"
        android:inputType="number"
        android:layout_marginBottom="16dp"/&amp;gt;

    &amp;lt;TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Travel Date:"
        android:textStyle="bold"
        android:layout_marginBottom="8dp"/&amp;gt;

    &amp;lt;!-- fragment_book_ticket.xml (continued) --&amp;gt;
    &amp;lt;DatePicker
        android:id="@+id/datePicker"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:datePickerMode="spinner"
        android:calendarViewShown="false"
        android:layout_marginBottom="16dp"/&amp;gt;

    &amp;lt;TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Travel Time:"
        android:textStyle="bold"
        android:layout_marginBottom="8dp"/&amp;gt;

    &amp;lt;TimePicker
        android:id="@+id/timePicker"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:timePickerMode="spinner"
        android:layout_marginBottom="16dp"/&amp;gt;

    &amp;lt;TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Seat Type:"
        android:textStyle="bold"
        android:layout_marginBottom="8dp"/&amp;gt;

    &amp;lt;Spinner
        android:id="@+id/spinnerSeatType"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="16dp"/&amp;gt;

    &amp;lt;TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Travel Class:"
        android:textStyle="bold"
        android:layout_marginBottom="8dp"/&amp;gt;

    &amp;lt;RadioGroup
        android:id="@+id/radioGroupClass"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginBottom="16dp"&amp;gt;

        &amp;lt;RadioButton
            android:id="@+id/radioEconomy"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Economy"
            android:checked="true"/&amp;gt;

        &amp;lt;RadioButton
            android:id="@+id/radioBusiness"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Business"
            android:layout_marginStart="16dp"/&amp;gt;

        &amp;lt;RadioButton
            android:id="@+id/radioFirstClass"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="First Class"
            android:layout_marginStart="16dp"/&amp;gt;
    &amp;lt;/RadioGroup&amp;gt;

    &amp;lt;TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Additional Options:"
        android:textStyle="bold"
        android:layout_marginBottom="8dp"/&amp;gt;

    &amp;lt;CheckBox
        android:id="@+id/checkboxMeal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Include Meal"/&amp;gt;

    &amp;lt;CheckBox
        android:id="@+id/checkboxLuggage"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Extra Luggage"
        android:layout_marginBottom="16dp"/&amp;gt;

    &amp;lt;TextView
        android:id="@+id/tvContextMenu"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Long press for more information"
        android:padding="8dp"
        android:background="#E0E0E0"
        android:gravity="center"
        android:layout_marginBottom="16dp"/&amp;gt;

    &amp;lt;LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginBottom="16dp"&amp;gt;

        &amp;lt;Button
            android:id="@+id/btnOptions"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="More Options"
            android:layout_marginEnd="8dp"/&amp;gt;

        &amp;lt;Button
            android:id="@+id/btnSubmit"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="Submit"
            android:layout_marginStart="8dp"/&amp;gt;
    &amp;lt;/LinearLayout&amp;gt;
&amp;lt;/LinearLayout&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br&gt;

    android:layout_width="match_parent"&lt;br&gt;
    android:layout_height="match_parent"&lt;br&gt;
    android:orientation="vertical"&lt;br&gt;
    android:padding="16dp"&amp;gt;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Booking Confirmed"
    android:textSize="20sp"
    android:textStyle="bold"
    android:layout_marginBottom="16dp"/&amp;gt;

&amp;lt;androidx.cardview.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="24dp"&amp;gt;

    &amp;lt;LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="16dp"&amp;gt;

        &amp;lt;TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Ticket Details"
            android:textStyle="bold"
            android:textSize="16sp"
            android:layout_marginBottom="8dp"/&amp;gt;

        &amp;lt;TextView
            android:id="@+id/tvTicketDetails"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="14sp"
            android:lineSpacingExtra="4dp"/&amp;gt;
    &amp;lt;/LinearLayout&amp;gt;
&amp;lt;/androidx.cardview.widget.CardView&amp;gt;

&amp;lt;Button
    android:id="@+id/btnBack"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Book Another Ticket"/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br&gt;

    android:layout_width="match_parent"&lt;br&gt;
    android:layout_height="match_parent"&lt;br&gt;
    android:orientation="vertical"&lt;br&gt;
    android:padding="16dp"&amp;gt;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="My Bookings"
    android:textSize="20sp"
    android:textStyle="bold"
    android:layout_marginBottom="16dp"/&amp;gt;

&amp;lt;ListView
    android:id="@+id/listViewBookings"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:divider="#CCCCCC"
    android:dividerHeight="1dp"/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br&gt;

    android:layout_width="match_parent"&lt;br&gt;
    android:layout_height="match_parent"&lt;br&gt;
    android:orientation="vertical"&lt;br&gt;
    android:padding="16dp"&lt;br&gt;
    android:gravity="center"&amp;gt;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="My Profile"
    android:textSize="20sp"
    android:textStyle="bold"
    android:layout_marginBottom="32dp"/&amp;gt;

&amp;lt;TextView
    android:id="@+id/tvUsername"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="18sp"
    android:layout_marginBottom="48dp"/&amp;gt;

&amp;lt;Button
    android:id="@+id/btnLogout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Logout"/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br&gt;

    android:layout_width="match_parent"&lt;br&gt;
    android:layout_height="wrap_content"&lt;br&gt;
    android:orientation="vertical"&lt;br&gt;
    android:padding="12dp"&amp;gt;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;TextView
    android:id="@+id/tvBookingName"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="16sp"
    android:textStyle="bold"
    android:layout_marginBottom="4dp"/&amp;gt;

&amp;lt;TextView
    android:id="@+id/tvBookingDate"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="14sp"
    android:layout_marginBottom="4dp"/&amp;gt;

&amp;lt;TextView
    android:id="@+id/tvBookingDetails"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="14sp"/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br&gt;
&lt;/p&gt;
&lt;br&gt;
    
        android:id="@+id/menu_insurance"&lt;br&gt;
        android:title="Travel Insurance" /&amp;gt;&lt;br&gt;
    
        android:id="@+id/menu_pickup"&lt;br&gt;
        android:title="Airport Pickup" /&amp;gt;&lt;br&gt;
    
        android:id="@+id/menu_special"&lt;br&gt;
        android:title="Special Assistance" /&amp;gt;&lt;br&gt;




&lt;p&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br&gt;
&lt;/p&gt;
&lt;br&gt;
    
        android:id="@+id/menu_info"&lt;br&gt;
        android:title="Travel Information" /&amp;gt;&lt;br&gt;
    
        android:id="@+id/menu_help"&lt;br&gt;
        android:title="Help Center" /&amp;gt;&lt;br&gt;




&lt;p&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br&gt;
&lt;br&gt;
    &lt;br&gt;
        Window&lt;br&gt;
        Middle&lt;br&gt;
        Aisle&lt;br&gt;
        Extra Legroom&lt;br&gt;
    &lt;br&gt;
&lt;/p&gt;

&lt;p&gt;dependencies {&lt;br&gt;
    // ... other dependencies&lt;br&gt;
    implementation 'androidx.cardview:cardview:1.0.0'&lt;br&gt;
    implementation 'com.google.android.material:material:1.3.0'&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;strings.xml&lt;br&gt;
&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br&gt;
&lt;br&gt;
    Travel Booking App&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;This error is occurring because you're trying to use R.id.menu_info in a switch statement, but it's not being recognized as a constant expression. This is happening because the context menu is not properly connected to your fragment.&lt;br&gt;
Let's fix this by modifying your BookTicketFragment class to properly handle the context menu. Here's what we need to change:&lt;/p&gt;

&lt;p&gt;First, we need to register the context menu with the fragment's view&lt;br&gt;
Then, we need to provide proper implementation of the onCreateContextMenu method&lt;br&gt;
Finally, we need to fix the onContextItemSelected method&lt;br&gt;
// BookTicket Fragment&lt;br&gt;
public static class BookTicketFragment extends Fragment {&lt;br&gt;
    private boolean isTicketBooked = false;&lt;br&gt;
    private String bookingDetails = "";&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    if (isTicketBooked) {
        return inflateTicketDetailsView(inflater, container);
    } else {
        return inflateBookingFormView(inflater, container);
    }
}

private View inflateBookingFormView(LayoutInflater inflater, ViewGroup container) {
    View view = inflater.inflate(R.layout.fragment_book_ticket, container, false);

    // All other initialization code remains the same

    // Register context menu
    TextView tvContextMenu = view.findViewById(R.id.tvContextMenu);
    registerForContextMenu(tvContextMenu);

    return view;
}

// Add this method to create the context menu
@Override
public void onCreateContextMenu(android.view.ContextMenu menu, View v, android.view.ContextMenu.ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    android.view.MenuInflater inflater = getActivity().getMenuInflater();
    inflater.inflate(R.menu.context_menu, menu);
}

// Modify this method to handle the menu item selection
@Override
public boolean onContextItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.menu_info:
            Toast.makeText(getContext(), "Travel information", Toast.LENGTH_SHORT).show();
            return true;
        case R.id.menu_help:
            Toast.makeText(getContext(), "Help center", Toast.LENGTH_SHORT).show();
            return true;
        default:
            return super.onContextItemSelected(item);
    }
}

// The rest of your code remains the same
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;


&lt;p&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br&gt;&lt;br&gt;
&lt;/p&gt;
&lt;br&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    android:id="@+id/menu_info"&amp;lt;br&amp;gt;
    android:title="Travel Information" /&amp;amp;gt;&amp;lt;br&amp;gt;

    android:id="@+id/menu_help"&amp;lt;br&amp;gt;
    android:title="Help Center" /&amp;amp;gt;&amp;lt;br&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>tbhelp</category>
      <category>tbahelp</category>
    </item>
  </channel>
</rss>
