I am currently trying to make an app that would allow you to log into your account and view whatever data needs to be displayed.
I am not using webview but instead, for displaying information I will be parsing data from HTML and then working from there, extracting data that I need to display. I will post code from my app below.
What I need help with is figuring out how to log into the website with my app.
Basically, steps would look like that:
1.Enter Username
2.Enter Password
3.Press Login Button
4.Send Username&Password to the website
5.If - website returns "Successful login", proceed and parse next page from HTML, Else - display "Wrong username or password"
However, I have no idea how to make my app log in, or at least input data in the website's login fields so that I can at least get a response in some way.
I am very new to this, so please, at least point me in the right direction so that I can figure it out. Thank you very much.
package com.example.app;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
public class MainActivity extends AppCompatActivity {
String data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView LoginTitle = findViewById(R.id.tvLoginTitle);
EditText Username = findViewById(R.id.etUsername);
EditText Password = findViewById(R.id.etPass);
Button Login = findViewById(R.id.btLogin);
Login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Parse().execute();
Intent intent = new Intent(MainActivity.this,UserAccount.class);
intent.putExtra("data",data);
startActivity(intent);
}
});
}
public class Parse extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... voids) {
try {
Document WebPage = Jsoup.connect("https://myurl").get();
Log.d("data", WebPage.toString());
data=WebPage.toString();
} catch(Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
//Used in guide, however, my implementation of the app doesn't seem to need this.
}
}
}
Here is the solution to this:
class HTTPRequest implements Runnable {
private URL url;
private User user;
private Handler handler;
private String cookie;
//**REDEFINED CONSTRUCTOR
HTTPRequest(Handler in_handler, User in_user) {
try {
url = new URL("https://yoururl.com");
handler = in_handler;
user = in_user;
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
@Override
public void run() {
try {
//**Preparing to open connection
//**Using POST method
//**Enabling Input & Output
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
//**Setting Headers to send with POST request
conn.setRequestProperty("Accept", "text/html");
conn.setRequestProperty("Accept", "text/xml");
conn.setRequestProperty("Cookie", "upassword=" + user.getPasswordHashed() + "; ulogin=" + user.getUsername());
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("charset", "UTF-8");
conn.setRequestProperty("User-Agent", "Mozilla/5.0");
//**READING RESPONSE FROM THE SERVER:
//**IF LOGIN WAS SUCCESSFUL, SEND MESSAGE WITH XML DATA BACK TO UI THREAD, ELSE SEND NULL TO UI THREAD
BufferedReader input = new BufferedReader(new InputStreamReader(conn.getInputStream()));
if (isLoginSuccess(input)) {
StringBuilder response = new StringBuilder();
String tempString;
while ((tempString = input.readLine()) != null) {
response.append(tempString);
}
input.close();
conn.disconnect();
Message msg = Message.obtain();
msg.obj = response.toString();
handler.sendMessage(msg);
} else if (!isLoginSuccess(input)) {
input.close();
conn.disconnect();
Message msg = Message.obtain();
msg.obj = "Wrong";
handler.sendMessage(msg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
//**LOGIN IS SUCCESSFUL WHEN THE RESPONSE'S FIRST LINE EQUALS XML DECLARATION
//**RETURNS TRUE IF THAT IS THE CASE, MEANING YOU HAVE SUCCESSFULLY LOGGED IN
private boolean isLoginSuccess(BufferedReader input) throws IOException {
String LoginSuccess = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
String response = input.readLine();
return response.equals(LoginSuccess);
}
}
MainActivity.java:
public class MainActivity extends AppCompatActivity {
public static final String EXTRA_MESSAGE = "Message 1";
public static final String EXTRA_MESSAGE_2 = "Message 2";
Handler mainHandler;
Thread thread;
User user;
EditText etUsername;
EditText etPassword;
CheckBox cbRememberMe;
Button btLogin;
SharedPreferences preferences;
SharedPreferences.Editor SPEditor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTheme(R.style.LoginPageTheme);
setContentView(R.layout.activity_main);
//**DECLARATION OF SHARED PREFERENCES
preferences = getApplicationContext().getSharedPreferences("Preferences", MODE_PRIVATE);
SPEditor = preferences.edit();
SPEditor.apply();
//**HANDLER INSTANTIATING AND HANDLING MESSAGES FROM HTTPRequest
mainHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(@NonNull Message msg) {
String message = msg.obj.toString();
thread.interrupt();
if (!message.equals("Wrong")) {
if (cbRememberMe.isChecked()) {
user.RememberLoginSuccess(preferences);
}
Intent intent = new Intent(getApplicationContext(), ProfilePageActivity.class);
intent.putExtra(EXTRA_MESSAGE, message);
intent.putExtra(EXTRA_MESSAGE_2, user);
startActivity(intent);
finish();
} else {
etUsername.setError("Wrong username or password");
etUsername.setText("");
etPassword.setText("");
}
}
};
etUsername = findViewById(R.id.et_username);
etPassword = findViewById(R.id.et_password);
cbRememberMe = findViewById(R.id.cb_rememberMe);
btLogin = findViewById(R.id.bt_login);
btLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String temp_user = etUsername.getText().toString();
String temp_pass = etPassword.getText().toString();
if (!TextUtils.isEmpty(temp_user) && !TextUtils.isEmpty(temp_pass)) {
user = new User(etUsername.getText().toString(), etPassword.getText().toString());
thread = new Thread(new HTTPRequest(mainHandler, user));
thread.start();
} else {
etUsername.setError("Please, fill-out the form");
etUsername.setText("");
etPassword.setText("");
}
}
});
}
}