Error om.appsnipp.niasbaratepresensi.welcome_activity cannot be cast to com.appsnipp.niasbaratepresensi.DashboardActivity

233 Views Asked by At

I made an automatic login on Android, the code is below. But I get this error:


E/AndroidRuntime: FATAL EXCEPTION: main Process: com.appsnipp.nbpresensi, PID: 14850 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.appsnipp.nbpresensi/com.appsnipp.niasbaratepresensi.welcome_activity}: java.lang.ClassCastException: com.appsnipp.niasbaratepresensi.welcome_activity cannot be cast to com.appsnipp.niasbaratepresensi.DashboardActivity at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3454) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3593) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:140) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:96) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2126) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loop(Looper.java:264) at android.app.ActivityThread.main(ActivityThread.java:7684) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:980) Caused by: java.lang.ClassCastException: com.appsnipp.niasbaratepresensi.welcome_activity cannot be cast to com.appsnipp.niasbaratepresensi.DashboardActivity at com.appsnipp.niasbaratepresensi.SessionManager.checkLogin(SessionManager.java:51) at com.appsnipp.niasbaratepresensi.welcome_activity.onCreate(welcome_activity.java:19) at android.app.Activity.performCreate(Activity.java:7817) at android.app.Activity.performCreate(Activity.java:7806) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1306) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3424) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3593)  at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)  at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:140)  at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:96)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2126)  at android.os.Handler.dispatchMessage(Handler.java:107)  at android.os.Looper.loop(Looper.java:264)  at android.app.ActivityThread.main(ActivityThread.java:7684)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:980)  I/Process: Sending signal. PID: 14850 SIG: 9 Process 14850 terminated.


This my welcome activity code:

 public class welcome_activity extends AppCompatActivity {
        SessionManager sessionManager;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_welcome);
    
            sessionManager = new SessionManager(this);
            sessionManager.checkLogin();
    
            HashMap<String, String> user = sessionManager.getUserDetail();
            String mNip = user.get(sessionManager.NIP);
            if (mNip.equals(mNip)) {
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        Intent intent = new Intent(welcome_activity.this, DashboardActivity.class);
                        startActivity(intent);
                        finish();
                    }
                }, 2000);
            } else {
                Intent intent = new Intent(welcome_activity.this, LoginActivity.class);
                startActivity(intent);
                finish();
            }
        }
    }

And this is my session manager:

public class SessionManager {
    SharedPreferences sharedPreferences;
    public SharedPreferences.Editor editor;
    public Context context;
    int PRIVATE_MODE = 0;

    private static final String PREF_NAME = "LOGIN";
    private static final String LOGIN = "IS_LOGIN";
    public static final String NM_LENGKAP = "NM_LENGKAP";
    public static final String NIP = "NIP";
    public static final String PASSWORD = "PASSWORD";
    public static final String JABATAN = "JABATAN";
    public static final String OPD = "OPD";
    public static final String GAMBAR = "GAMBAR";

    public SessionManager(Context context) {
        this.context = context;
        sharedPreferences = context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
        editor = sharedPreferences.edit();
    }

    public void createSession(String nm_lengkap, String nip, String password, String jabatan,String opd,String gambar) {
        editor.putBoolean(LOGIN, true);
        editor.putString(NM_LENGKAP, nm_lengkap);
        editor.putString(NIP, nip);
        editor.putString(PASSWORD, password);
        editor.putString(JABATAN, jabatan);
        editor.putString(OPD, opd);
        editor.putString(GAMBAR, gambar);
        editor.apply();

    }

    public boolean isLoggin() {
        return sharedPreferences.getBoolean(LOGIN, false);
    }

    public void checkLogin() {
        if (!this.isLoggin()) {
            Intent i = new Intent(context, LoginActivity.class);
            context.startActivity(i);
            ((DashboardActivity) context).finish();
        }
        if (!this.isLoggin()) {
            Intent i = new Intent(context, LoginActivity.class);
            context.startActivity(i);
            ((welcome_activity) context).finish();
        }
        if (!this.isLoggin()) {
            Intent i = new Intent(context, LoginActivity.class);
            context.startActivity(i);
            ((Absen_Activity1) context).finish();
        }
        if (!this.isLoggin()) {
            Intent i = new Intent(context, LoginActivity.class);
            context.startActivity(i);
            ((Absen_Activity2) context).finish();
        }
        if (!this.isLoggin()) {
            Intent i = new Intent(context, LoginActivity.class);
            context.startActivity(i);
            ((UbahPwd) context).finish();
        }
        if (!this.isLoggin()) {
            Intent i = new Intent(context, LoginActivity.class);
            context.startActivity(i);
            ((Lihat_Absen1) context).finish();
        }
        if (!this.isLoggin()) {
            Intent i = new Intent(context, LoginActivity.class);
            context.startActivity(i);
            ((Lihat_Absen2) context).finish();
        }
        if (!this.isLoggin()) {
            Intent i = new Intent(context, LoginActivity.class);
            context.startActivity(i);
            ((Sudah_Activity) context).finish();
        }
        if (!this.isLoggin()) {
            Intent i = new Intent(context, LoginActivity.class);
            context.startActivity(i);
            ((ProfileActivity) context).finish();
        }
    }

    public HashMap<String, String> getUserDetail() {
        HashMap<String, String> user = new HashMap<>();
        user.put(NM_LENGKAP, sharedPreferences.getString(NM_LENGKAP, null));
        user.put(NIP, sharedPreferences.getString(NIP, null));
        user.put(PASSWORD, sharedPreferences.getString(PASSWORD, null));
        user.put(JABATAN, sharedPreferences.getString(JABATAN, null));
        user.put(OPD, sharedPreferences.getString(OPD, null));
        user.put(GAMBAR, sharedPreferences.getString(GAMBAR , null));
        return user;
    }

    public void logout() {
        editor.clear();
        editor.commit();
        Intent i = new Intent(context, LoginActivity.class);
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(i);
    }
}

Could someone tell me what is going on?

1

There are 1 best solutions below

5
Abdullah Z Khan On

You're initializing SessionManager with welcome_activity context, but casting it to DashboardActivity context. That's why it is failing.

Don't finish a context from within SessionManager (return a value, use it to finish inside calling activity)

Your checkLogin function is boilerplate and has unsafe casting. You can try this:

In SessionManager:

public boolean checkLogin(){
     return !this.isLoggin();
}

In activity:

        sessionManager = new SessionManager(this);
        if(!sessionManager.checkLogin()){
            Intent i = new Intent(context, LoginActivity.class);
            context.startActivity(i);
            finish();
            return;
         }