From 1d9a56c17633ca2d8d91da08a3572eb6a0b1b676 Mon Sep 17 00:00:00 2001 From: Stefan Hagemann Date: Wed, 24 Oct 2018 10:49:14 +0200 Subject: [PATCH 1/6] Add avg price to scan If you press "+1" it will add with the avg price of the textview --- app/build.gradle | 16 +- .../ContinuousCaptureActivity.java | 8 +- .../PartkeeprScannrApplication.java | 1 + .../partkeeprscannrapp/SendLogActivity.java | 2 - .../partkeeprscannrapp/SettingsActivity.java | 4 + app/src/main/res/layout/activity_scan.xml | 227 +++++++++++------- build.gradle | 3 +- 7 files changed, 163 insertions(+), 98 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 698fb8d..b5cfe0f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.application' android { compileSdkVersion 23 - buildToolsVersion "23.0.3" + buildToolsVersion "27.0.3" defaultConfig { applicationId "com.drobisch.partkeeprscannrapp" @@ -20,13 +20,13 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - testCompile 'junit:junit:4.12' - compile 'com.android.support:appcompat-v7:23.+' - compile 'com.android.support:design:23.+' + implementation fileTree(dir: 'libs', include: ['*.jar']) + testImplementation 'junit:junit:4.12' + implementation 'com.android.support:appcompat-v7:23.4.0' + implementation 'com.android.support:design:23.4.0' - compile 'com.journeyapps:zxing-android-embedded:3.4.0' - debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3.1' - releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1' + implementation 'com.journeyapps:zxing-android-embedded:3.6.0' + debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.3.1' + releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1' } diff --git a/app/src/main/java/com/drobisch/partkeeprscannrapp/ContinuousCaptureActivity.java b/app/src/main/java/com/drobisch/partkeeprscannrapp/ContinuousCaptureActivity.java index 3c4c7bd..69946fe 100644 --- a/app/src/main/java/com/drobisch/partkeeprscannrapp/ContinuousCaptureActivity.java +++ b/app/src/main/java/com/drobisch/partkeeprscannrapp/ContinuousCaptureActivity.java @@ -43,6 +43,7 @@ public class ContinuousCaptureActivity extends Activity { private TextView mPartNameView; private TextView mPartStockView; private TextView mPartLocationView; + private EditText mAVGPriceField; @@ -95,6 +96,7 @@ protected void onCreate(Bundle savedInstanceState) { mPartNameView = (TextView) findViewById(R.id.partName); mPartLocationView = (TextView) findViewById(R.id.partLocation); mPartStockView = (TextView) findViewById(R.id.partStock); + mAVGPriceField = (EditText) findViewById(R.id.avgPrice) ; mPartNameView.setText(""); mPartLocationView.setText(""); @@ -120,6 +122,7 @@ public void onClick(View view) { barcodeView = (DecoratedBarcodeView) findViewById(R.id.barcode_scanner); barcodeView.setStatusText(""); barcodeView.decodeContinuous(callback); + } private void updatePartInfo(int partID) { @@ -130,7 +133,7 @@ private void updatePartInfo(int partID) { private void addStock() { Log.d("CaptureActivity", "addStock"); if(mPartPartID != -1) { - ApiPartTask task = new ApiPartTask(mUser, mPassword, mServer, mPartPartID,"addStock", "quantity=1&price=0&comment="); + ApiPartTask task = new ApiPartTask(mUser, mPassword, mServer, mPartPartID,"addStock", "quantity=1&price=" + mAVGPriceField.getText().toString() + "&comment="); task.execute((Void) null); } } @@ -270,6 +273,7 @@ public class ApiPartTask extends AsyncTask { private Integer mPartStock = 0; private String mPartLocation = ""; private Integer mPartID; + private double mPartAvgPrice = 0; private Boolean error = false; private String errorString; @@ -337,6 +341,7 @@ protected Boolean doInBackground(Void... params) { JSONObject jsonStorage = json.getJSONObject("storageLocation"); mPartLocation = (String) jsonStorage.get("name"); mPartStock = json.getInt("stockLevel"); + mPartAvgPrice = json.getDouble("averagePrice"); } catch (JSONException e) { e.printStackTrace(); error = true; @@ -351,6 +356,7 @@ protected void onPostExecute(final Boolean success) { mPartLocationView.setText(mPartLocation); mPartStockView.setText(mPartStock.toString()); mPartPartID = mPartID; + mAVGPriceField.setText(String.valueOf(Math.round(mPartAvgPrice *100.0) /100.0)); if(error == true) { mPartPartID = -1; Toast infoToast = Toast.makeText(getApplicationContext(),errorString,Toast.LENGTH_SHORT); diff --git a/app/src/main/java/com/drobisch/partkeeprscannrapp/PartkeeprScannrApplication.java b/app/src/main/java/com/drobisch/partkeeprscannrapp/PartkeeprScannrApplication.java index 448bab2..739f4f6 100644 --- a/app/src/main/java/com/drobisch/partkeeprscannrapp/PartkeeprScannrApplication.java +++ b/app/src/main/java/com/drobisch/partkeeprscannrapp/PartkeeprScannrApplication.java @@ -12,6 +12,7 @@ */ public class PartkeeprScannrApplication extends Application { public void onCreate () { + super.onCreate(); // Setup handler for uncaught exceptions. Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { @Override diff --git a/app/src/main/java/com/drobisch/partkeeprscannrapp/SendLogActivity.java b/app/src/main/java/com/drobisch/partkeeprscannrapp/SendLogActivity.java index 004442e..a155338 100644 --- a/app/src/main/java/com/drobisch/partkeeprscannrapp/SendLogActivity.java +++ b/app/src/main/java/com/drobisch/partkeeprscannrapp/SendLogActivity.java @@ -1,9 +1,7 @@ package com.drobisch.partkeeprscannrapp; import android.app.Activity; -import android.support.v7.app.AppCompatActivity; import android.os.Bundle; -import android.view.View; import android.view.Window; import android.widget.TextView; diff --git a/app/src/main/java/com/drobisch/partkeeprscannrapp/SettingsActivity.java b/app/src/main/java/com/drobisch/partkeeprscannrapp/SettingsActivity.java index 662b3f6..2420cd9 100644 --- a/app/src/main/java/com/drobisch/partkeeprscannrapp/SettingsActivity.java +++ b/app/src/main/java/com/drobisch/partkeeprscannrapp/SettingsActivity.java @@ -3,12 +3,16 @@ import android.content.SharedPreferences; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; + + import android.os.Bundle; import android.view.MenuItem; import android.view.View; import android.widget.AutoCompleteTextView; import android.widget.Button; +import static android.content.Context.MODE_PRIVATE; + public class SettingsActivity extends AppCompatActivity { private AutoCompleteTextView mServerView; diff --git a/app/src/main/res/layout/activity_scan.xml b/app/src/main/res/layout/activity_scan.xml index 6107236..ac3151a 100644 --- a/app/src/main/res/layout/activity_scan.xml +++ b/app/src/main/res/layout/activity_scan.xml @@ -1,137 +1,192 @@ + android:layout_width="fill_parent" + android:layout_height="13dp" + android:layout_weight="0.4"> + + android:layout_alignParentBottom="true" + android:layout_alignParentLeft="true" + android:layout_alignParentStart="true"> + - + android:layout_width="fill_parent" + android:layout_height="0dp" + android:layout_weight="0.30"> + + + + + - + android:orientation="vertical" + android:shrinkColumns="1" + android:stretchColumns="2"> + + + + android:layout_weight="1" + android:padding="5dip"> + + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_margin="5dp" + android:text="Part:" + android:textColor="#000" /> + + android:id="@+id/partName" + android:layout_width="wrap_content" + android:layout_height="76dp" + android:layout_margin="5dp" + android:text="Part" + android:textColor="#000" /> + android:id="@+id/tableRow2" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_weight="1" + android:padding="5dip"> + + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_margin="5dp" + android:text="Location:" + android:textColor="#000" /> + + android:id="@+id/partLocation" + android:layout_width="wrap_content" + android:layout_height="58dp" + android:layout_margin="5dp" + android:text="Location" + android:textColor="#000" /> + + + + android:layout_margin="5dp" + android:text="Stock:" + android:textColor="#000" /> + + android:id="@+id/partStock" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_margin="5dp" + android:text="Stock" + android:textColor="#000" /> + + + + > + + android:id="@+id/textView2" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Avg Price:" + android:textColor="#000" /> + + + - + + + + + - + android:orientation="vertical" + android:stretchColumns="0"> + + android:id="@+id/tableRowButton1" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_weight="1"> + + /> + + android:id="@+id/tableRowButton2" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_weight="1"> + + android:id="@+id/removeStock_button" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:src="@drawable/ic_exposure_minus_1_24dp" /> - \ No newline at end of file + diff --git a/build.gradle b/build.gradle index 77ce66e..63db7bf 100644 --- a/build.gradle +++ b/build.gradle @@ -3,9 +3,10 @@ buildscript { repositories { jcenter() + google() } dependencies { - classpath 'com.android.tools.build:gradle:2.1.3' + classpath 'com.android.tools.build:gradle:3.1.4' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files From 0c9e23f78de8c6d85e343ea55906fda58a447fea Mon Sep 17 00:00:00 2001 From: Christopher Teutsch Date: Wed, 24 Oct 2018 12:13:09 +0200 Subject: [PATCH 2/6] Layout adjustments --- app/src/main/res/layout/activity_scan.xml | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/layout/activity_scan.xml b/app/src/main/res/layout/activity_scan.xml index ac3151a..0cbabc3 100644 --- a/app/src/main/res/layout/activity_scan.xml +++ b/app/src/main/res/layout/activity_scan.xml @@ -122,24 +122,29 @@ android:id="@+id/tableRow4" android:layout_width="match_parent" android:layout_height="match_parent" - android:padding="5dip">> + android:padding="5dip" + > + android:textColor="#000" + android:layout_gravity="center_vertical" + /> + android:textAlignment="center" /> From 4745669381aafbec8a8f1e27c75ec6e2a03e35f6 Mon Sep 17 00:00:00 2001 From: Stefan Hagemann Date: Thu, 25 Oct 2018 13:35:54 +0200 Subject: [PATCH 3/6] Add Alert Dialog for error messages. Changed HTTP Error String for 404 and 401 --- app/build.gradle | 16 +++---- .../ContinuousCaptureActivity.java | 42 +++++++++++++++---- app/src/main/res/values/strings.xml | 19 +++++++++ build.gradle | 3 +- 4 files changed, 63 insertions(+), 17 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 698fb8d..b5cfe0f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.application' android { compileSdkVersion 23 - buildToolsVersion "23.0.3" + buildToolsVersion "27.0.3" defaultConfig { applicationId "com.drobisch.partkeeprscannrapp" @@ -20,13 +20,13 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - testCompile 'junit:junit:4.12' - compile 'com.android.support:appcompat-v7:23.+' - compile 'com.android.support:design:23.+' + implementation fileTree(dir: 'libs', include: ['*.jar']) + testImplementation 'junit:junit:4.12' + implementation 'com.android.support:appcompat-v7:23.4.0' + implementation 'com.android.support:design:23.4.0' - compile 'com.journeyapps:zxing-android-embedded:3.4.0' - debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3.1' - releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1' + implementation 'com.journeyapps:zxing-android-embedded:3.6.0' + debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.3.1' + releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1' } diff --git a/app/src/main/java/com/drobisch/partkeeprscannrapp/ContinuousCaptureActivity.java b/app/src/main/java/com/drobisch/partkeeprscannrapp/ContinuousCaptureActivity.java index 3c4c7bd..1846b2c 100644 --- a/app/src/main/java/com/drobisch/partkeeprscannrapp/ContinuousCaptureActivity.java +++ b/app/src/main/java/com/drobisch/partkeeprscannrapp/ContinuousCaptureActivity.java @@ -1,10 +1,12 @@ package com.drobisch.partkeeprscannrapp; import android.app.Activity; +import android.content.DialogInterface; import android.net.ConnectivityManager; import android.os.AsyncTask; import android.os.Bundle; import android.os.Message; +import android.support.v7.app.AlertDialog; import android.util.Base64; import android.util.Log; import android.util.Pair; @@ -273,6 +275,7 @@ public class ApiPartTask extends AsyncTask { private Boolean error = false; private String errorString; + ApiPartTask(String user, String password, String server, int partID, String command, String json) { mUser = user; mPassword = password; @@ -316,12 +319,26 @@ protected Boolean doInBackground(Void... params) { else { if(httpcon != null) { - error = true; - errorString = "Connection failed with http-code " + httpcon.getResponseCode(); + + switch (httpcon.getResponseCode()) + { + case 401: + error = true; + errorString = getString(R.string.error_incorrect_password_user); + break; + case 404: + error = true; + errorString = getString(R.string.error_part_not_exists); + break; + default: + error = true; + errorString = getString(R.string.error_http_long); + break; + } } else { error = true; - errorString = "Connection failed"; + errorString = getString(R.string.error_connection_long); } } } @@ -329,6 +346,7 @@ protected Boolean doInBackground(Void... params) { catch (IOException e1) { e1.printStackTrace(); error = true; + errorString = getString(R.string.error_server_connect_failed); } try { @@ -353,11 +371,7 @@ protected void onPostExecute(final Boolean success) { mPartPartID = mPartID; if(error == true) { mPartPartID = -1; - Toast infoToast = Toast.makeText(getApplicationContext(),errorString,Toast.LENGTH_SHORT); - //specify the toast display position exact parent layout center. no x or y offset - infoToast.setGravity(Gravity.BOTTOM,0,390); - infoToast.show(); - + openMessageBox("Error", errorString); } } @@ -365,5 +379,17 @@ protected void onPostExecute(final Boolean success) { protected void onCancelled() { } + + + protected void openMessageBox(String headline, String message) + { + AlertDialog.Builder builder = new AlertDialog.Builder(ContinuousCaptureActivity.this); + builder.setMessage(message).setTitle(headline); + builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int id) {}}); + AlertDialog dialog = builder.create(); + dialog.show(); + } + + } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fac6588..9c81ff5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -13,8 +13,27 @@ This user is invalid This password is too short This password is incorrect + Wrong username or password! + Unauthorized This field is required + + Not found + This part does not exists + + Connection error + The connection failed! + + HTTP Error + Connection failed with http-code + Failed to connect to server + + + "Contacts permissions are needed for providing email completions." Settings Partkeepr App - Settings + + + + diff --git a/build.gradle b/build.gradle index 77ce66e..63db7bf 100644 --- a/build.gradle +++ b/build.gradle @@ -3,9 +3,10 @@ buildscript { repositories { jcenter() + google() } dependencies { - classpath 'com.android.tools.build:gradle:2.1.3' + classpath 'com.android.tools.build:gradle:3.1.4' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files From 0e3e7a1c8ccf73be061655edea620a4af19572ea Mon Sep 17 00:00:00 2001 From: Stefan Hagemann Date: Thu, 25 Oct 2018 13:52:52 +0200 Subject: [PATCH 4/6] Changed build config --- app/build.gradle | 16 ++++++++-------- build.gradle | 3 ++- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 698fb8d..b5cfe0f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.application' android { compileSdkVersion 23 - buildToolsVersion "23.0.3" + buildToolsVersion "27.0.3" defaultConfig { applicationId "com.drobisch.partkeeprscannrapp" @@ -20,13 +20,13 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - testCompile 'junit:junit:4.12' - compile 'com.android.support:appcompat-v7:23.+' - compile 'com.android.support:design:23.+' + implementation fileTree(dir: 'libs', include: ['*.jar']) + testImplementation 'junit:junit:4.12' + implementation 'com.android.support:appcompat-v7:23.4.0' + implementation 'com.android.support:design:23.4.0' - compile 'com.journeyapps:zxing-android-embedded:3.4.0' - debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3.1' - releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1' + implementation 'com.journeyapps:zxing-android-embedded:3.6.0' + debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.3.1' + releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1' } diff --git a/build.gradle b/build.gradle index 77ce66e..63db7bf 100644 --- a/build.gradle +++ b/build.gradle @@ -3,9 +3,10 @@ buildscript { repositories { jcenter() + google() } dependencies { - classpath 'com.android.tools.build:gradle:2.1.3' + classpath 'com.android.tools.build:gradle:3.1.4' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files From fc51e903acedcd525cc517c22921a197f3129080 Mon Sep 17 00:00:00 2001 From: Stefan Hagemann Date: Fri, 26 Oct 2018 11:15:24 +0200 Subject: [PATCH 5/6] Fixed the configuration storage --- .../com/drobisch/partkeeprscannrapp/MainActivity.java | 11 ++++++----- .../drobisch/partkeeprscannrapp/SettingsActivity.java | 2 ++ 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/drobisch/partkeeprscannrapp/MainActivity.java b/app/src/main/java/com/drobisch/partkeeprscannrapp/MainActivity.java index 4a23a40..0387e53 100644 --- a/app/src/main/java/com/drobisch/partkeeprscannrapp/MainActivity.java +++ b/app/src/main/java/com/drobisch/partkeeprscannrapp/MainActivity.java @@ -105,14 +105,13 @@ public void onClick(View view) { mLoginFormView = findViewById(R.id.login_form); mProgressView = findViewById(R.id.login_progress); - SharedPreferences.Editor editor = getSharedPreferences(getString(R.string.pref_name), MODE_PRIVATE).edit(); - editor.clear(); - editor.commit(); - SharedPreferences prefs = getSharedPreferences(getString(R.string.pref_name), MODE_PRIVATE); String user = prefs.getString(getString(R.string.pref_key_user), getString(R.string.pref_default_user)); + String user_pass = prefs.getString(getString(R.string.pref_key_password), getString(R.string.pref_default_user)); + mUserView.setText(user); - mPasswordView.setText("admin"); + mPasswordView.setText(user_pass); + } @@ -193,8 +192,10 @@ private void doLogin() { // perform the user login attempt. SharedPreferences.Editor editor = getSharedPreferences(getString(R.string.pref_name), MODE_PRIVATE).edit(); editor.putString(getString(R.string.pref_key_user), mUserView.getText().toString()); + editor.putString(getString(R.string.pref_key_password), mPasswordView.getText().toString()); editor.commit(); + showProgress(true); mAuthTask = new UserLoginTask(email, password); mAuthTask.execute((Void) null); diff --git a/app/src/main/java/com/drobisch/partkeeprscannrapp/SettingsActivity.java b/app/src/main/java/com/drobisch/partkeeprscannrapp/SettingsActivity.java index 662b3f6..f4b40b9 100644 --- a/app/src/main/java/com/drobisch/partkeeprscannrapp/SettingsActivity.java +++ b/app/src/main/java/com/drobisch/partkeeprscannrapp/SettingsActivity.java @@ -34,6 +34,7 @@ public void onClick(View view) { } }); + SharedPreferences prefs = getSharedPreferences(getString(R.string.pref_name), MODE_PRIVATE); String server = prefs.getString(getString(R.string.pref_key_server), getString(R.string.pref_default_server)); mServerView.setText(server); @@ -43,6 +44,7 @@ public void saveSettings() { SharedPreferences.Editor editor = getSharedPreferences(getString(R.string.pref_name), MODE_PRIVATE).edit(); editor.putString(getString(R.string.pref_key_server), mServerView.getText().toString()); editor.commit(); + finish(); } public boolean onOptionsItemSelected(MenuItem item){ From 788ce85dd83a5905de990c25c26228938506d5f8 Mon Sep 17 00:00:00 2001 From: Stefan Hagemann Date: Fri, 26 Oct 2018 12:31:40 +0200 Subject: [PATCH 6/6] Add credential checkup on pressing login --- .../ContinuousCaptureActivity.java | 66 +-------------- .../partkeeprscannrapp/MainActivity.java | 81 ++++++++++++++++-- .../drobisch/partkeeprscannrapp/httpCon.java | 84 +++++++++++++++++++ app/src/main/res/values/strings.xml | 1 + 4 files changed, 161 insertions(+), 71 deletions(-) create mode 100644 app/src/main/java/com/drobisch/partkeeprscannrapp/httpCon.java diff --git a/app/src/main/java/com/drobisch/partkeeprscannrapp/ContinuousCaptureActivity.java b/app/src/main/java/com/drobisch/partkeeprscannrapp/ContinuousCaptureActivity.java index a54af52..eee0f1c 100644 --- a/app/src/main/java/com/drobisch/partkeeprscannrapp/ContinuousCaptureActivity.java +++ b/app/src/main/java/com/drobisch/partkeeprscannrapp/ContinuousCaptureActivity.java @@ -199,70 +199,6 @@ private boolean checkInternetConenction() { return false; } - private Pair doHttpConnection(String urlStr, String user, String password, String json) { - InputStream in = null; - HttpURLConnection httpConn = null; - String restURI = urlStr; // "http://" + urlStr + "/api/parts/1/addStock"; - int resCode = -1; - - try { - URL url = new URL(restURI); - URLConnection urlConn = url.openConnection(); - - if (!(urlConn instanceof HttpURLConnection)) { - throw new IOException("URL is not an Http URL"); - } - - String userToken= user + ":" + password; - byte[] data = userToken.getBytes("UTF-8"); - String encode = Base64.encodeToString(data, Base64.NO_WRAP); - httpConn = (HttpURLConnection) urlConn; - httpConn.setAllowUserInteraction(false); - httpConn.setInstanceFollowRedirects(true); - httpConn.setRequestMethod("PUT"); - httpConn.setRequestProperty("Authorization", "Basic " + encode); - httpConn.setRequestProperty("Content-Type","application/x-www-form-urlencoded; charset=UTF-8"); - - httpConn.setRequestProperty("Content-length", json.getBytes().length + ""); - httpConn.setDoInput(true); - httpConn.setDoOutput(true); - httpConn.setUseCaches(false); - - OutputStream outputStream = httpConn.getOutputStream(); - outputStream.write(json.getBytes("UTF-8")); - outputStream.close(); - - httpConn.connect(); - - resCode = httpConn.getResponseCode(); - - boolean redirect = false; - - if (resCode != HttpURLConnection.HTTP_OK) { - if (resCode == HttpURLConnection.HTTP_MOVED_TEMP - || resCode == HttpURLConnection.HTTP_MOVED_PERM - || resCode == HttpURLConnection.HTTP_SEE_OTHER) - redirect = true; - - } - - if (resCode == HttpURLConnection.HTTP_OK) { - in = httpConn.getInputStream(); - Log.d("LoginActivity","Successful URL-connection" + String.valueOf(resCode)); - } - else { - Log.d("LoginActivity","Error URL-connection" + String.valueOf(resCode)); - return Pair.create(null,httpConn); - } - } - catch (MalformedURLException e) { - e.printStackTrace(); - } - catch (IOException e) { - e.printStackTrace(); - } - return Pair.create(in,httpConn); - } public class ApiPartTask extends AsyncTask { private final String mUser; @@ -303,7 +239,7 @@ protected Boolean doInBackground(Void... params) { String restURL = mServer + "/api/parts/" + mPartID.toString(); if(mCommand != "") restURL += "/" + mCommand; - httpResult = doHttpConnection(restURL,mUser,mPassword,mJson); + httpResult = httpCon.doHttpConnection(restURL,mUser,mPassword,mJson); in = httpResult.first; httpcon = httpResult.second; /*Bundle b = new Bundle(); diff --git a/app/src/main/java/com/drobisch/partkeeprscannrapp/MainActivity.java b/app/src/main/java/com/drobisch/partkeeprscannrapp/MainActivity.java index 0387e53..37e575a 100644 --- a/app/src/main/java/com/drobisch/partkeeprscannrapp/MainActivity.java +++ b/app/src/main/java/com/drobisch/partkeeprscannrapp/MainActivity.java @@ -6,6 +6,7 @@ import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; +import android.net.ConnectivityManager; import android.support.annotation.NonNull; import android.support.design.widget.Snackbar; import android.support.v7.app.AppCompatActivity; @@ -22,6 +23,7 @@ import android.provider.ContactsContract; import android.text.TextUtils; import android.util.Log; +import android.util.Pair; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; @@ -32,6 +34,9 @@ import android.widget.EditText; import android.widget.TextView; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; import java.util.ArrayList; import java.util.List; @@ -195,7 +200,6 @@ private void doLogin() { editor.putString(getString(R.string.pref_key_password), mPasswordView.getText().toString()); editor.commit(); - showProgress(true); mAuthTask = new UserLoginTask(email, password); mAuthTask.execute((Void) null); @@ -328,6 +332,7 @@ public class UserLoginTask extends AsyncTask { private final String mEmail; private final String mPassword; + int error=-1; UserLoginTask(String email, String password) { mEmail = email; @@ -338,7 +343,37 @@ public class UserLoginTask extends AsyncTask { protected Boolean doInBackground(Void... params) { // TODO: attempt authentication against a network service. - try { + SharedPreferences prefs = getSharedPreferences(getString(R.string.pref_name), MODE_PRIVATE); + String server = prefs.getString(getString(R.string.pref_key_server), getString(R.string.pref_default_server)); + HttpURLConnection httpcon = null; + + if (!checkInternetConenction()) + { + return false; + } + + Pair httpResult = httpCon.doHttpConnection(server + "/api/users/login" , mEmail,mPassword,"[]","GET"); + httpcon = httpResult.second; + + try + { + if (httpcon.getResponseCode() > 199 && httpcon.getResponseCode() < 300) + { + return true; + } + else + { + error = httpcon.getResponseCode(); + return false; + } + } + catch (IOException e1) { + e1.printStackTrace(); + return false; + } + + + /*try { // Simulate network access. Thread.sleep(2000); } catch (InterruptedException e) { @@ -351,10 +386,10 @@ protected Boolean doInBackground(Void... params) { // Account exists, return true if the password matches. return pieces[1].equals(mPassword); } - } + }*/ // TODO: register the new account here. - return true; + //return true; } @Override @@ -372,8 +407,23 @@ protected void onPostExecute(final Boolean success) { startActivity(intent); Log.d("onPostExecute",mUserView.getText().toString()); } else { - mPasswordView.setError(getString(R.string.error_incorrect_password)); - mPasswordView.requestFocus(); + + switch (error) + { + case 401: + mPasswordView.setError(getString(R.string.error_incorrect_password_user)); + mPasswordView.requestFocus(); + break; + case 500-599: + mPasswordView.setError(getString(R.string.error_server_connect_failed)); + mPasswordView.requestFocus(); + break; + default: + mPasswordView.setError(getString(R.string.error_unknown)); + mPasswordView.requestFocus(); + break; + + } } } @@ -383,5 +433,24 @@ protected void onCancelled() { showProgress(false); } } + + private boolean checkInternetConenction() { + // get Connectivity Manager object to check connection + ConnectivityManager connec =(ConnectivityManager)getSystemService(getBaseContext().CONNECTIVITY_SERVICE); + + // Check for network connections + if ( connec.getNetworkInfo(0).getState() == android.net.NetworkInfo.State.CONNECTED || + + connec.getNetworkInfo(0).getState() == android.net.NetworkInfo.State.CONNECTING || + connec.getNetworkInfo(1).getState() == android.net.NetworkInfo.State.CONNECTING || + connec.getNetworkInfo(1).getState() == android.net.NetworkInfo.State.CONNECTED ) { + return true; + }else if ( + connec.getNetworkInfo(0).getState() == android.net.NetworkInfo.State.DISCONNECTED || + connec.getNetworkInfo(1).getState() == android.net.NetworkInfo.State.DISCONNECTED ) { + return false; + } + return false; + } } diff --git a/app/src/main/java/com/drobisch/partkeeprscannrapp/httpCon.java b/app/src/main/java/com/drobisch/partkeeprscannrapp/httpCon.java new file mode 100644 index 0000000..14ce49e --- /dev/null +++ b/app/src/main/java/com/drobisch/partkeeprscannrapp/httpCon.java @@ -0,0 +1,84 @@ +package com.drobisch.partkeeprscannrapp; + +import android.util.Base64; +import android.util.Log; +import android.util.Pair; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; + +public class httpCon { + public static Pair doHttpConnection(String urlStr, String user, String password, String json) { + return doHttpConnection(urlStr,user,password,json,"PUT"); + } + + public static Pair doHttpConnection(String urlStr, String user, String password, String json, String type) { + InputStream in = null; + HttpURLConnection httpConn = null; + String restURI = urlStr; // "http://" + urlStr + "/api/parts/1/addStock"; + int resCode = -1; + + try { + URL url = new URL(restURI); + URLConnection urlConn = url.openConnection(); + + if (!(urlConn instanceof HttpURLConnection)) { + throw new IOException("URL is not an Http URL"); + } + + String userToken= user + ":" + password; + byte[] data = userToken.getBytes("UTF-8"); + String encode = Base64.encodeToString(data, Base64.NO_WRAP); + httpConn = (HttpURLConnection) urlConn; + httpConn.setAllowUserInteraction(false); + httpConn.setInstanceFollowRedirects(true); + httpConn.setRequestMethod(type); + httpConn.setRequestProperty("Authorization", "Basic " + encode); + httpConn.setRequestProperty("Content-Type","application/x-www-form-urlencoded; charset=UTF-8"); + + httpConn.setRequestProperty("Content-length", json.getBytes().length + ""); + httpConn.setDoInput(true); + httpConn.setDoOutput(true); + httpConn.setUseCaches(false); + + OutputStream outputStream = httpConn.getOutputStream(); + outputStream.write(json.getBytes("UTF-8")); + outputStream.close(); + + httpConn.connect(); + + resCode = httpConn.getResponseCode(); + + boolean redirect = false; + + if (resCode != HttpURLConnection.HTTP_OK) { + if (resCode == HttpURLConnection.HTTP_MOVED_TEMP + || resCode == HttpURLConnection.HTTP_MOVED_PERM + || resCode == HttpURLConnection.HTTP_SEE_OTHER) + redirect = true; + + } + + if (resCode == HttpURLConnection.HTTP_OK) { + in = httpConn.getInputStream(); + Log.d("LoginActivity","Successful URL-connection" + String.valueOf(resCode)); + } + else { + Log.d("LoginActivity","Error URL-connection" + String.valueOf(resCode)); + return Pair.create(null,httpConn); + } + } + catch (MalformedURLException e) { + e.printStackTrace(); + } + catch (IOException e) { + e.printStackTrace(); + } + return Pair.create(in,httpConn); + } +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9c81ff5..bbff895 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -26,6 +26,7 @@ HTTP Error Connection failed with http-code Failed to connect to server + A unknown error occurred