From 7c7b48d9ac85760d5362f8947d348547d471895a Mon Sep 17 00:00:00 2001 From: iliass-dahman Date: Fri, 17 Feb 2023 15:51:44 +0100 Subject: [PATCH 1/2] updated style --- MobileApp/app/src/main/AndroidManifest.xml | 12 +- .../com/qrcodecopier/qrscanner/Config.java | 6 + .../qrcodecopier/qrscanner/MainActivity.java | 86 ++-------- .../qrscanner/RedirectionActivity.java | 159 ++++++++++++++++++ .../app/src/main/res/drawable/qr_code.png | Bin 0 -> 1433 bytes .../app/src/main/res/drawable/qr_img.png | Bin 0 -> 14808 bytes .../app/src/main/res/layout/activity_main.xml | 67 ++++---- .../main/res/layout/activity_redirection.xml | 63 +++++++ .../app/src/main/res/values-night/themes.xml | 8 +- MobileApp/app/src/main/res/values/colors.xml | 6 + MobileApp/app/src/main/res/values/strings.xml | 3 + MobileApp/app/src/main/res/values/themes.xml | 2 +- 12 files changed, 298 insertions(+), 114 deletions(-) create mode 100644 MobileApp/app/src/main/java/com/qrcodecopier/qrscanner/Config.java create mode 100644 MobileApp/app/src/main/java/com/qrcodecopier/qrscanner/RedirectionActivity.java create mode 100644 MobileApp/app/src/main/res/drawable/qr_code.png create mode 100644 MobileApp/app/src/main/res/drawable/qr_img.png create mode 100644 MobileApp/app/src/main/res/layout/activity_redirection.xml diff --git a/MobileApp/app/src/main/AndroidManifest.xml b/MobileApp/app/src/main/AndroidManifest.xml index 0176b25..e76e9e1 100644 --- a/MobileApp/app/src/main/AndroidManifest.xml +++ b/MobileApp/app/src/main/AndroidManifest.xml @@ -1,18 +1,23 @@ + + + @@ -22,10 +27,11 @@ - + android:theme="@style/zxing_CaptureTheme" /> \ No newline at end of file diff --git a/MobileApp/app/src/main/java/com/qrcodecopier/qrscanner/Config.java b/MobileApp/app/src/main/java/com/qrcodecopier/qrscanner/Config.java new file mode 100644 index 0000000..f84fa03 --- /dev/null +++ b/MobileApp/app/src/main/java/com/qrcodecopier/qrscanner/Config.java @@ -0,0 +1,6 @@ +package com.qrcodecopier.qrscanner; + +public class Config { + + public static final String SERVER_URL = "http://192.168.45.24:8080/api"; +} diff --git a/MobileApp/app/src/main/java/com/qrcodecopier/qrscanner/MainActivity.java b/MobileApp/app/src/main/java/com/qrcodecopier/qrscanner/MainActivity.java index 56b1a6d..0d12eeb 100644 --- a/MobileApp/app/src/main/java/com/qrcodecopier/qrscanner/MainActivity.java +++ b/MobileApp/app/src/main/java/com/qrcodecopier/qrscanner/MainActivity.java @@ -4,7 +4,9 @@ import androidx.appcompat.app.AppCompatActivity; import android.app.AlertDialog; +import android.content.Context; import android.content.DialogInterface; +import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; @@ -28,19 +30,19 @@ public class MainActivity extends AppCompatActivity { - Button scanBtn,submitBtn; + Button scanBtn; + + Context context; String token; - EditText urlInput, server; ActivityResultLauncher barLaucher = registerForActivityResult(new ScanContract(), result-> { if(result.getContents() !=null) { token = result.getContents(); - Log.i("TOKEN", "token: "+token); - urlInput.setVisibility(View.VISIBLE); - submitBtn.setVisibility(View.VISIBLE); - server.setVisibility(View.VISIBLE); - scanBtn.setVisibility(View.GONE); + + Intent intent = new Intent(context, RedirectionActivity.class); + intent.putExtra("token",token); + context.startActivity(intent); }else { token = null; @@ -51,14 +53,9 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); + context = this; scanBtn = findViewById(R.id.scanbtn); - submitBtn = findViewById(R.id.submit); - urlInput = findViewById(R.id.urlInput); - server = findViewById(R.id.server); - submitBtn.setVisibility(View.GONE); - urlInput.setVisibility(View.GONE); - server.setVisibility(View.GONE); scanBtn.setOnClickListener(new View.OnClickListener() { @Override @@ -67,14 +64,7 @@ public void onClick(View view) { } }); - submitBtn.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - if (urlInput.getText().toString().length() != 0){ //needs improvement - sendUrl(urlInput.getText().toString()); - } - } - }); + } private void scanQrCode() @@ -86,61 +76,7 @@ private void scanQrCode() barLaucher.launch(options); } - private void sendUrl(String url){ - if (token != null && server.getText().toString().length() != 0){ - MyTask task = new MyTask(); - task.execute(url); - }else { - Toast.makeText(getApplicationContext(),"Error",Toast.LENGTH_LONG); - } - - - } - private class MyTask extends AsyncTask { - protected String doInBackground(String... params) { - String responseBody; - try { - URL endpoint = new URL("http://"+server.getText().toString()+"/api"); - HttpURLConnection connection = (HttpURLConnection) endpoint.openConnection(); - connection.setRequestMethod("POST"); - connection.setRequestProperty("Content-Type", "application/json"); - connection.setDoOutput(true); - - String requestBody = "{\"token\":\"" + token + "\", \"url\":\"" + params[0] + "\"}"; - - OutputStream outputStream = connection.getOutputStream(); - outputStream.write(requestBody.getBytes()); - outputStream.flush(); - outputStream.close(); - - int responseCode = connection.getResponseCode(); - if (responseCode == HttpURLConnection.HTTP_OK) { - InputStream inputStream = connection.getInputStream(); - responseBody = readStream(inputStream); - inputStream.close(); - } else { - responseBody = "HTTP Error: " + responseCode; - } - connection.disconnect(); - } catch (Exception e) { - responseBody = e.toString(); - } - return responseBody; - } - private String readStream(InputStream inputStream) throws IOException { - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - byte[] buffer = new byte[1024]; - int bytesRead = 0; - while ((bytesRead = inputStream.read(buffer)) != -1) { - outputStream.write(buffer, 0, bytesRead); - } - return outputStream.toString(); - } - protected void onPostExecute(String result) { - Log.i("received", "message: "+result); - } - } } \ No newline at end of file diff --git a/MobileApp/app/src/main/java/com/qrcodecopier/qrscanner/RedirectionActivity.java b/MobileApp/app/src/main/java/com/qrcodecopier/qrscanner/RedirectionActivity.java new file mode 100644 index 0000000..d00f02e --- /dev/null +++ b/MobileApp/app/src/main/java/com/qrcodecopier/qrscanner/RedirectionActivity.java @@ -0,0 +1,159 @@ +package com.qrcodecopier.qrscanner; + +import androidx.appcompat.app.AppCompatActivity; + +import android.graphics.Color; +import android.os.AsyncTask; +import android.os.Bundle; +import android.util.Log; +import android.util.Pair; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TextView; +import android.widget.Toast; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; + +public class RedirectionActivity extends AppCompatActivity { + + Button submitBtn; + EditText urlInput; + + TextView alertText, resultText; + + String token; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_redirection); + + submitBtn = findViewById(R.id.submit); + urlInput = findViewById(R.id.urlInput); + alertText = findViewById(R.id.alertmsg); + resultText = findViewById(R.id.resultmsg); + + + if (getIntent().hasExtra("token")){ + processToken(getIntent().getStringExtra("token")); + }else { + processToken(null); + } + + submitBtn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String input = urlInput.getText().toString(); + if (input.length() != 0){ //needs improvement + if (verifyUrl(input)) + sendUrl(input); + } + } + }); + } + + private void showResult(String msg,boolean positive){ + resultText.setText(msg); + if (positive){ + resultText.setTextColor(Color.BLACK); + resultText.setBackgroundColor(Color.parseColor("#89FC00")); + }else { + resultText.setTextColor(Color.WHITE); + resultText.setBackgroundColor(Color.parseColor("#DC0073")); + } + } + private boolean verifyUrl(String url){ + String regex = "^((http|https)://)?(www\\.)?[a-zA-Z0-9]+(\\.[a-zA-Z]{2,})+(/.*)?$"; + if (url.matches(regex)) + return true; + return false; + } + private void processToken(String token){ + String positiveMsg="We have the token, you can continue !"; + String negativeMsg="The token maybe not be correct, it is recommanded to go back and scan the right Qr Code"; + if (token == null || notAsExpected(token)){ + this.token = null; + alertText.setText(negativeMsg); + alertText.setTextColor(Color.WHITE); + alertText.setBackgroundColor(Color.parseColor("#DC0073")); + }else{ + this.token = token; + alertText.setText(positiveMsg); + alertText.setTextColor(Color.BLACK); + alertText.setBackgroundColor(Color.parseColor("#89FC00")); + } + } + + private boolean notAsExpected(String token){ + if (!token.contains(" ;)({}:")){ + return false; + } + return true; + } + private void sendUrl(String url){ + if (token != null){ + MyTask task = new MyTask(); + task.execute(url); + }else { + String error= "Error: No token included"; + showResult(error,false); + } + + + } + private class MyTask extends AsyncTask> { + protected Pair doInBackground(String... params) { + String responseBody; + Boolean succes = true; + try { + URL endpoint = new URL(Config.SERVER_URL); + HttpURLConnection connection = (HttpURLConnection) endpoint.openConnection(); + connection.setRequestMethod("POST"); + connection.setRequestProperty("Content-Type", "application/json"); + connection.setDoOutput(true); + + String requestBody = "{\"token\":\"" + token + "\", \"url\":\"" + params[0] + "\"}"; + + OutputStream outputStream = connection.getOutputStream(); + outputStream.write(requestBody.getBytes()); + outputStream.flush(); + outputStream.close(); + + int responseCode = connection.getResponseCode(); + if (responseCode == HttpURLConnection.HTTP_OK) { + InputStream inputStream = connection.getInputStream(); + responseBody="Done. "; + responseBody += readStream(inputStream); + inputStream.close(); + } else { + responseBody = "HTTP Error: " + responseCode; + succes = false; + } + connection.disconnect(); + } catch (Exception e) { + responseBody = e.toString(); + succes = false; + + } + return new Pair<>(responseBody,succes); + } + private String readStream(InputStream inputStream) throws IOException { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + int bytesRead = 0; + while ((bytesRead = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); + } + return outputStream.toString(); + } + protected void onPostExecute(Pair result) { + showResult(result.first,result.second); + } + } +} \ No newline at end of file diff --git a/MobileApp/app/src/main/res/drawable/qr_code.png b/MobileApp/app/src/main/res/drawable/qr_code.png new file mode 100644 index 0000000000000000000000000000000000000000..4485fedab6c4458f754f2241f6bede006eaea2e3 GIT binary patch literal 1433 zcmV;K1!nq*P)Px#32;bRa{vG=O8@{YO97=lmZ<;$03J|GR7Kj_+DC9q z+S=ON+uIr?GTYnRnVq64G(k*MUKSxQ!#0SJ00009bW%=JOaLW4^A2Opnx*%WWB>pJ z?@2^KRA}Dqn>%ycFbsfUsdh6u_IdZ?yvy-r@8r~5ocsX|zTS1~kRjeO^sbk!gRYML zZDl#OC<-7c5=b%xiz>kh9wb0YJP$$NgHf)$(W5a~#HeutdX#`w;*Ae_;6N^9(jM(dhIrBz?MgPV z!C%ideM2yrWaH>Dw35gjeGe_=+7&&3)-rKJw^KB&ZU|O1sczs<2d)y}PzSD(2Kp8} z<=TcGfVWI6=&?UKGNS_;-DtLkPD0SJ2|a`$Ss2hs7&@lWfsNLh4NT^N7zuEhN7G1v zv(fct18bve%?1YVp-LA+j}i_vY!LL2g{;^gaCTz7BZ0LOYaI!!omlHgU~(UbBLQxG zR2l(peN-9&Zhcf50d{?yH3IDVIBNt<{_VrCl+D@MT#gz>vRU`jZy|34_vVpSd zL&Lt=N8T5`A1ccR%Bt6>Sv7lGH_S@eKsgZI;0)*-cOyVK5JxoeyXX}S{Af6$2NLK_ zi5^Oz7bW`E_(|oPkM2{yC(xY|JvO4Z+F;l333ODV6C--3xhVafK*uH8tV7*rWA}iX z2;jpUMU(gVv<}qb_XDFl1^QM7-7U~#JKE*iv_7C#dmk7L1scTAgjtufj0lsRPg_yQS86 z)xMIj?}%J1Pzy7CElAooy$+$4llq?|?Ym1Z%=CSszQ$9YXT-v6*mCJky>A`>kn8J@ zjGmAij$ri0X`7@DnWG&ay|`@$mb61}Pu|*sj@@>fql2?|u5gC}?(GbFrr4*B5Y@!2)r_=5K$9bVHynTB}d6W)t-P%tC_s{{oH zmg9=HVPhqfNjSe=73`+sjoBkU<(k9B0TS7Q-Ttz$h3Nf74bgKZTAb5yUeSF{boZ^2 zI0REqBok%?(|iPzlO$8B1QWpo)7QBCNC!(5|ENFTFlnm3Jp@m|UQk|hiNJ=uNF@{r3r9(BBNDUM_Tkzm=AWU-cHiJ3#u zWR2XWFix?3t%+xReCXJVpvjA@d}#{Q8c9PZ^5FXBd3S nP&8h)d|BsSF_pS|7wG>7@^B^=mYX|w00000NkvXXu0mjfJo2Y^ literal 0 HcmV?d00001 diff --git a/MobileApp/app/src/main/res/drawable/qr_img.png b/MobileApp/app/src/main/res/drawable/qr_img.png new file mode 100644 index 0000000000000000000000000000000000000000..368072b226c76fbef9bb3f1fa64ea55163582209 GIT binary patch literal 14808 zcmXYY1yoee`!^PyQc}{jbT}oSAt(Pt43SbLT#1CSG4xjR>C>9}5eMNJIUlAr{sH^!+=9`{=$VVuwrw3+v%y zeQmJHeUV*Ql3h@eT}YBmP?AGflIwq|ngPHeBr!XGasS){ID{mb1Yg{z)6>W7LK4$+ z=d%l!_oV5$3wA;A>FHB;VJTKYiMja;4q=J^U~`xEqGtXp-m{!B2@2lhr{~UQ=kK}B z7Z>kl<}c?KE|>%*c_o$R=Fg{R&!^|l=jP7D6*ca8rxz~bQmRaCy>%eA$(e8k4MTN9 ztC6uEo`Lc0-HUl8?V(Y*nfVRAuaiw}yrPpzWmWZGN9AT0wB4I@cXxNM)ZTSvV`IbD z*H_H|lAeS5wzsEm<|L!4hiYyOjEKz0E383|C~6yoM&<~~DqA=}9X%q(Ca0R(4tfUG zE$l}|Mo;;rw2zLC64SnZ8ruh3HuVmyTRTmQy|C`?ACOb?bMy!Yi7ROsW~%7Msp^|I zwascnioJspq?A+-4sJ}WdxT^mfnggl$rX`tiHcg`XJ_XY_P$atp#sthIzaK)uU}zx z^(uPtB^BQb%eq7rR6ydgF0O9ch5*FOLQYlFD=0xxGyLG-x~RO%0Ai}9YoKRh8Ix4u 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 literal 0 HcmV?d00001 diff --git a/MobileApp/app/src/main/res/layout/activity_main.xml b/MobileApp/app/src/main/res/layout/activity_main.xml index 853d5bf..f5ac100 100644 --- a/MobileApp/app/src/main/res/layout/activity_main.xml +++ b/MobileApp/app/src/main/res/layout/activity_main.xml @@ -1,46 +1,51 @@ - -