// Path: app/src/main/java/com/mgilangjanuar/dev/goscele/base/BaseProvider.java
// public abstract class BaseProvider extends AsyncTask<String, Integer, List<Elements>> {
// 
//     protected Map<String, String> cookies = new HashMap<>();
// 
//     public BaseProvider() {
//         super();
//     }
// 
//     @Override
//     @Deprecated
//     protected List<Elements> doInBackground(String... params) {
//         List<Elements> results = new ArrayList<>();
//         int idx = 0;
//         try {
//             Connection.Response response = Jsoup.connect(url())
//                     .data(data())
//                     .method(method())
//                     .cookies(cookies())
//                     .execute();
//             cookies = response.cookies();
//             for (String param : params) {
//                 if (!TextUtils.isEmpty(param)) {
//                     results.add(response.parse().select(param));
//                 }
//                 publishProgress((int) ((double) (++idx / params.length)) * 100);
//             }
//         } catch (IOException e) {
//             e.printStackTrace();
//         }
//         return results;
//     }
// 
//     @Override
//     @Deprecated
//     protected void onProgressUpdate(Integer... values) {
//         super.onProgressUpdate(values);
//         onProgressUpdate(values[0]);
//     }
// 
//     public abstract void run();
// 
//     public abstract String url();
// 
//     public String[] data() {
//         return new String[0];
//     }
// 
//     public Connection.Method method() {
//         return Connection.Method.GET;
//     }
// 
//     public Map<String, String> cookies() {
//         return cookies;
//     }
// 
//     public void onProgressUpdate(Integer value) {
//     }
// }
// 
// Path: app/src/main/java/com/mgilangjanuar/dev/goscele/modules/auth/listener/AuthListener.java
// public interface AuthListener {
// 
//     ProgressDialog getProgressDialog();
// 
//     void onUsernameOrPasswordEmpty();
// 
//     void onConnectionFailed();
// 
//     void onWrongCredential(String error);
// 
//     void onSuccess();
// }
// 
// Path: app/src/main/java/com/mgilangjanuar/dev/goscele/modules/common/model/CookieModel.java
// @Table(name = "cookie")
// public class CookieModel extends BaseModel {
//     @Column(name = "key")
//     public String key;
// 
//     @Column(name = "value")
//     public String value;
// 
//     public static Map<String, String> getCookiesMap() {
//         Map<String, String> result = new HashMap<>();
//         List<CookieModel> list = new CookieModel().find().execute();
//         for (CookieModel cookieModel : list) {
//             result.put(cookieModel.key, cookieModel.value);
//         }
//         return result;
//     }
// }
// 
// Path: app/src/main/java/com/mgilangjanuar/dev/goscele/modules/common/model/UserModel.java
// @Table(name = "user")
// public class UserModel extends BaseModel {
// 
//     @Column(name = "name")
//     public String name;
// 
//     @Column(name = "username")
//     public String username;
// 
//     @Column(name = "password")
//     public String password;
// 
// }
// 
// Path: app/src/main/java/com/mgilangjanuar/dev/goscele/utils/Constant.java
// public class Constant {
//     // URL and routes
//     public static final String BASE_URL = "https://scele.cs.ui.ac.id/";
//     public static final String BASE_URL_SIAK = "https://academic.ui.ac.id/main/";
// 
//     public static final String ROUTE_LOGIN = "login/index.php";
//     public static final String ROUTE_LOGIN_SIAK = "Authentication/Index";
//     public static final String ROUTE_CHANGE_ROLE = "main/Authentication/ChangeRole";
// 
//     // Misc
//     public static final String URL = "url";
//     public static final String USER_AGENT = "User-Agent";
//     public static final String COOKIE = "cookie";
//     public static final int ASK_STORAGE_PERMISSION_CODE = 123;
//     public static final CharSequence LABEL = "label";
//     public static final String WIDGET_ACTION_DATA_CHANGE = "CHECK_LIST";
//     public static final String COURSE_NAME = "course name";
// }


import android.app.ProgressDialog;
import android.text.TextUtils;
import com.mgilangjanuar.dev.goscele.base.BaseProvider;
import com.mgilangjanuar.dev.goscele.modules.auth.listener.AuthListener;
import com.mgilangjanuar.dev.goscele.modules.common.model.CookieModel;
import com.mgilangjanuar.dev.goscele.modules.common.model.UserModel;
import com.mgilangjanuar.dev.goscele.utils.Constant;
import org.jsoup.Connection;
import org.jsoup.select.Elements;
import java.util.List;
            progressDialog.dismiss();
        }
        try {
            if (TextUtils.isEmpty(elementses.get(0).text())) {
                authListener.onSuccess();
                saveCookies();
                saveUser();
            } else {
                authListener.onWrongCredential(elementses.get(0).text());
            }
        } catch (Exception e) {
            authListener.onConnectionFailed();
        }
    }

    private void saveCookies() {
        for (String key : cookies.keySet()) {
            CookieModel cookieModel = new CookieModel().find().where("key = ?", key).executeSingle();
            if (cookieModel == null) {
                cookieModel = new CookieModel();
            }
            cookieModel.key = key;
            cookieModel.value = cookies.get(key);
            cookieModel.save();
        }
    }

    private void saveUser() {
        UserModel userModel = new UserModel().find().executeSingle();
        if (userModel == null) {
// Path: app/src/main/java/com/mgilangjanuar/dev/goscele/base/BaseProvider.java
// public abstract class BaseProvider extends AsyncTask<String, Integer, List<Elements>> {
// 
//     protected Map<String, String> cookies = new HashMap<>();
// 
//     public BaseProvider() {
//         super();
//     }
// 
//     @Override
//     @Deprecated
//     protected List<Elements> doInBackground(String... params) {
//         List<Elements> results = new ArrayList<>();
//         int idx = 0;
//         try {
//             Connection.Response response = Jsoup.connect(url())
//                     .data(data())
//                     .method(method())
//                     .cookies(cookies())
//                     .execute();
//             cookies = response.cookies();
//             for (String param : params) {
//                 if (!TextUtils.isEmpty(param)) {
//                     results.add(response.parse().select(param));
//                 }
//                 publishProgress((int) ((double) (++idx / params.length)) * 100);
//             }
//         } catch (IOException e) {
//             e.printStackTrace();
//         }
//         return results;
//     }
// 
//     @Override
//     @Deprecated
//     protected void onProgressUpdate(Integer... values) {
//         super.onProgressUpdate(values);
//         onProgressUpdate(values[0]);
//     }
// 
//     public abstract void run();
// 
//     public abstract String url();
// 
//     public String[] data() {
//         return new String[0];
//     }
// 
//     public Connection.Method method() {
//         return Connection.Method.GET;
//     }
// 
//     public Map<String, String> cookies() {
//         return cookies;
//     }
// 
//     public void onProgressUpdate(Integer value) {
//     }
// }
// 
// Path: app/src/main/java/com/mgilangjanuar/dev/goscele/modules/auth/listener/AuthListener.java
// public interface AuthListener {
// 
//     ProgressDialog getProgressDialog();
// 
//     void onUsernameOrPasswordEmpty();
// 
//     void onConnectionFailed();
// 
//     void onWrongCredential(String error);
// 
//     void onSuccess();
// }
// 
// Path: app/src/main/java/com/mgilangjanuar/dev/goscele/modules/common/model/CookieModel.java
// @Table(name = "cookie")
// public class CookieModel extends BaseModel {
//     @Column(name = "key")
//     public String key;
// 
//     @Column(name = "value")
//     public String value;
// 
//     public static Map<String, String> getCookiesMap() {
//         Map<String, String> result = new HashMap<>();
//         List<CookieModel> list = new CookieModel().find().execute();
//         for (CookieModel cookieModel : list) {
//             result.put(cookieModel.key, cookieModel.value);
//         }
//         return result;
//     }
// }
// 
// Path: app/src/main/java/com/mgilangjanuar/dev/goscele/modules/common/model/UserModel.java
// @Table(name = "user")
// public class UserModel extends BaseModel {
// 
//     @Column(name = "name")
//     public String name;
// 
//     @Column(name = "username")
//     public String username;
// 
//     @Column(name = "password")
//     public String password;
// 
// }
// 
// Path: app/src/main/java/com/mgilangjanuar/dev/goscele/utils/Constant.java
// public class Constant {
//     // URL and routes
//     public static final String BASE_URL = "https://scele.cs.ui.ac.id/";
//     public static final String BASE_URL_SIAK = "https://academic.ui.ac.id/main/";
// 
//     public static final String ROUTE_LOGIN = "login/index.php";
//     public static final String ROUTE_LOGIN_SIAK = "Authentication/Index";
//     public static final String ROUTE_CHANGE_ROLE = "main/Authentication/ChangeRole";
// 
//     // Misc
//     public static final String URL = "url";
//     public static final String USER_AGENT = "User-Agent";
//     public static final String COOKIE = "cookie";
//     public static final int ASK_STORAGE_PERMISSION_CODE = 123;
//     public static final CharSequence LABEL = "label";
//     public static final String WIDGET_ACTION_DATA_CHANGE = "CHECK_LIST";
//     public static final String COURSE_NAME = "course name";
// }


// Path: app/src/main/java/com/mgilangjanuar/dev/goscele/modules/auth/provider/AuthProvider.java
import android.app.ProgressDialog;
import android.text.TextUtils;
import com.mgilangjanuar.dev.goscele.base.BaseProvider;
import com.mgilangjanuar.dev.goscele.modules.auth.listener.AuthListener;
import com.mgilangjanuar.dev.goscele.modules.common.model.CookieModel;
import com.mgilangjanuar.dev.goscele.modules.common.model.UserModel;
import com.mgilangjanuar.dev.goscele.utils.Constant;
import org.jsoup.Connection;
import org.jsoup.select.Elements;
import java.util.List;

            progressDialog.dismiss();
        }
        try {
            if (TextUtils.isEmpty(elementses.get(0).text())) {
                authListener.onSuccess();
                saveCookies();
                saveUser();
            } else {
                authListener.onWrongCredential(elementses.get(0).text());
            }
        } catch (Exception e) {
            authListener.onConnectionFailed();
        }
    }

    private void saveCookies() {
        for (String key : cookies.keySet()) {
            CookieModel cookieModel = new CookieModel().find().where("key = ?", key).executeSingle();
            if (cookieModel == null) {
                cookieModel = new CookieModel();
            }
            cookieModel.key = key;
            cookieModel.value = cookies.get(key);
            cookieModel.save();
        }
    }

    private void saveUser() {
        UserModel userModel = new UserModel().find().executeSingle();
        if (userModel == null) {
            userModel = new UserModel();