From 5e4560e89e0b6c48e9be2d2729db0ac3bc897963 Mon Sep 17 00:00:00 2001 From: Jonas Heinrich Date: Tue, 10 Mar 2026 23:31:50 +0100 Subject: [PATCH] add bottomsheet navigation --- app/.gitignore | 1 - app/build.gradle | 29 --- app/proguard-rules.pro | 21 -- .../ExampleInstrumentedTest.java | 26 --- app/src/main/AndroidManifest.xml | 50 ----- app/src/main/ic_launcher-web.png | Bin 18362 -> 0 bytes .../nextcompanion/AsyncTaskCallbacks.java | 5 - .../hochi/nextcompanion/LoginActivity.java | 184 ------------------ .../hochi/nextcompanion/MainActivity.java | 175 ----------------- .../hochi/nextcompanion/RentActivity.java | 65 ------- .../hochi/nextcompanion/RequestHandler.java | 98 ---------- .../hochi/nextcompanion/ReturnActivity.java | 70 ------- .../main/res/drawable/ic_add_white_24dp.xml | 9 - app/src/main/res/layout/activity_login.xml | 78 -------- app/src/main/res/layout/activity_main.xml | 33 ---- app/src/main/res/layout/activity_rent.xml | 50 ----- app/src/main/res/layout/activity_return.xml | 62 ------ app/src/main/res/layout/content_main.xml | 24 --- app/src/main/res/menu/menu_main.xml | 15 -- .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 - .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 - app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 1903 -> 0 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 1935 -> 0 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 3275 -> 0 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 1147 -> 0 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 1187 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 1996 -> 0 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 2429 -> 0 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 2639 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 4399 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 3834 -> 0 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 4311 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 6908 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 5234 -> 0 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 6044 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 9776 -> 0 bytes app/src/main/res/values-de/strings.xml | 30 --- app/src/main/res/values/colors.xml | 6 - app/src/main/res/values/dimens.xml | 6 - .../res/values/ic_launcher_background.xml | 4 - app/src/main/res/values/strings.xml | 29 --- app/src/main/res/values/styles.xml | 20 -- .../hochi/nextcompanion/ExampleUnitTest.java | 17 -- build.gradle | 27 --- gradle.properties | 13 -- gradle/wrapper/gradle-wrapper.jar | Bin 54708 -> 0 bytes gradle/wrapper/gradle-wrapper.properties | 6 - gradlew | 172 ---------------- gradlew.bat | 84 -------- settings.gradle | 1 - src/main.rs | 115 ++++++----- 51 files changed, 65 insertions(+), 1470 deletions(-) delete mode 100644 app/.gitignore delete mode 100644 app/build.gradle delete mode 100644 app/proguard-rules.pro delete mode 100644 app/src/androidTest/java/com/example/hochi/nextcompanion/ExampleInstrumentedTest.java delete mode 100644 app/src/main/AndroidManifest.xml delete mode 100644 app/src/main/ic_launcher-web.png delete mode 100644 app/src/main/java/com/example/hochi/nextcompanion/AsyncTaskCallbacks.java delete mode 100644 app/src/main/java/com/example/hochi/nextcompanion/LoginActivity.java delete mode 100644 app/src/main/java/com/example/hochi/nextcompanion/MainActivity.java delete mode 100644 app/src/main/java/com/example/hochi/nextcompanion/RentActivity.java delete mode 100644 app/src/main/java/com/example/hochi/nextcompanion/RequestHandler.java delete mode 100644 app/src/main/java/com/example/hochi/nextcompanion/ReturnActivity.java delete mode 100644 app/src/main/res/drawable/ic_add_white_24dp.xml delete mode 100644 app/src/main/res/layout/activity_login.xml delete mode 100644 app/src/main/res/layout/activity_main.xml delete mode 100644 app/src/main/res/layout/activity_rent.xml delete mode 100644 app/src/main/res/layout/activity_return.xml delete mode 100644 app/src/main/res/layout/content_main.xml delete mode 100644 app/src/main/res/menu/menu_main.xml delete mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml delete mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/values-de/strings.xml delete mode 100644 app/src/main/res/values/colors.xml delete mode 100644 app/src/main/res/values/dimens.xml delete mode 100644 app/src/main/res/values/ic_launcher_background.xml delete mode 100644 app/src/main/res/values/strings.xml delete mode 100644 app/src/main/res/values/styles.xml delete mode 100644 app/src/test/java/com/example/hochi/nextcompanion/ExampleUnitTest.java delete mode 100644 build.gradle delete mode 100644 gradle.properties delete mode 100644 gradle/wrapper/gradle-wrapper.jar delete mode 100644 gradle/wrapper/gradle-wrapper.properties delete mode 100755 gradlew delete mode 100644 gradlew.bat delete mode 100644 settings.gradle diff --git a/app/.gitignore b/app/.gitignore deleted file mode 100644 index 796b96d..0000000 --- a/app/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/app/build.gradle b/app/build.gradle deleted file mode 100644 index 7cde814..0000000 --- a/app/build.gradle +++ /dev/null @@ -1,29 +0,0 @@ -apply plugin: 'com.android.application' - -android { - compileSdkVersion 28 - defaultConfig { - applicationId "com.example.hochi.nextcompanion" - minSdkVersion 15 - targetSdkVersion 28 - versionCode 9 - versionName "0.1.7.2" - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" - } - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'com.android.support:appcompat-v7:28.0.0' - implementation 'com.android.support.constraint:constraint-layout:1.1.3' - implementation 'com.android.support:design:28.0.0' - testImplementation 'junit:junit:4.12' - androidTestImplementation 'com.android.support.test:runner:1.0.2' - androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' -} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro deleted file mode 100644 index f1b4245..0000000 --- a/app/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile diff --git a/app/src/androidTest/java/com/example/hochi/nextcompanion/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/example/hochi/nextcompanion/ExampleInstrumentedTest.java deleted file mode 100644 index 2759dd6..0000000 --- a/app/src/androidTest/java/com/example/hochi/nextcompanion/ExampleInstrumentedTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.example.hochi.nextcompanion; - -import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; - -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.*; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getTargetContext(); - - assertEquals("com.example.hochi.nextcompanion", appContext.getPackageName()); - } -} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml deleted file mode 100644 index f15290c..0000000 --- a/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/ic_launcher-web.png b/app/src/main/ic_launcher-web.png deleted file mode 100644 index e96c6aa8fd71eb03c0aa721a8f85038a399f93ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18362 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 Bb6NlZ diff --git a/app/src/main/java/com/example/hochi/nextcompanion/AsyncTaskCallbacks.java b/app/src/main/java/com/example/hochi/nextcompanion/AsyncTaskCallbacks.java deleted file mode 100644 index 2099b15..0000000 --- a/app/src/main/java/com/example/hochi/nextcompanion/AsyncTaskCallbacks.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.example.hochi.nextcompanion; - -interface AsyncTaskCallbacks { - void onTaskComplete(T response); -} diff --git a/app/src/main/java/com/example/hochi/nextcompanion/LoginActivity.java b/app/src/main/java/com/example/hochi/nextcompanion/LoginActivity.java deleted file mode 100644 index 1ff8e6b..0000000 --- a/app/src/main/java/com/example/hochi/nextcompanion/LoginActivity.java +++ /dev/null @@ -1,184 +0,0 @@ -package com.example.hochi.nextcompanion; - -import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; -import android.annotation.TargetApi; - -import android.content.SharedPreferences; -import android.support.v7.app.AppCompatActivity; - -import android.os.Build; -import android.os.Bundle; -import android.text.TextUtils; -import android.view.KeyEvent; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.inputmethod.EditorInfo; -import android.widget.Button; -import android.widget.EditText; -import android.widget.TextView; - -import org.json.JSONObject; - - -/** - * A login screen that offers login via phone number/pin. - */ -public class LoginActivity extends AppCompatActivity implements AsyncTaskCallbacks { - - /** - * Keep track of the login task to ensure we can cancel it if requested. - */ - private RequestHandler mAuthTask = null; - - // UI references. - private TextView mPhoneView; - private EditText mPinView; - private View mProgressView; - private View mLoginFormView; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_login); - // Set up the login form. - mPhoneView = findViewById(R.id.phone); - - mPinView = findViewById(R.id.pin); - mPinView.setOnEditorActionListener(new TextView.OnEditorActionListener() { - @Override - public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) { - if (id == EditorInfo.IME_ACTION_DONE || id == EditorInfo.IME_NULL) { - attemptLogin(); - return true; - } - return false; - } - }); - - Button mPhoneSignInButton = findViewById(R.id.phone_sign_in_button); - mPhoneSignInButton.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View view) { - attemptLogin(); - } - }); - - mLoginFormView = findViewById(R.id.login_form); - mProgressView = findViewById(R.id.login_progress); - } - - /** - * Attempts to sign in or register the account specified by the login form. - * If there are form errors (invalid phone number, missing fields, etc.), the - * errors are presented and no actual login attempt is made. - */ - private void attemptLogin() { - if (mAuthTask != null) { - return; - } - - // Reset errors. - mPhoneView.setError(null); - mPinView.setError(null); - - // Store values at the time of the login attempt. - String phone = mPhoneView.getText().toString(); - String pin = mPinView.getText().toString(); - String[] credentials = { - "apikey=", getString(R.string.apikey), - "mobile=", mPhoneView.getText().toString(), - "pin=", mPinView.getText().toString() - }; - - boolean cancel = false; - View focusView = null; - - // Check for a valid pin, if the user entered one. - if (TextUtils.isEmpty(pin)) { - mPinView.setError(getString(R.string.error_field_required)); - focusView = mPinView; - cancel = true; - } - - // Check for a valid phone address. - if (TextUtils.isEmpty(phone)) { - mPhoneView.setError(getString(R.string.error_field_required)); - focusView = mPhoneView; - cancel = true; - } - - if (cancel) { - // There was an error; don't attempt login and focus the first - // form field with an error. - focusView.requestFocus(); - } else { - // Show a progress spinner, and kick off a background task to - // perform the user login attempt. - showProgress(true); - mAuthTask = new RequestHandler(this, "POST", - "api/login.json", credentials); - mAuthTask.execute((Void) null); - } - } - - /** - * Shows the progress UI and hides the login form. - */ - @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2) - private void showProgress(final boolean show) { - // On Honeycomb MR2 we have the ViewPropertyAnimator APIs, which allow - // for very easy animations. If available, use these APIs to fade-in - // the progress spinner. - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) { - int shortAnimTime = getResources().getInteger(android.R.integer.config_shortAnimTime); - - mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); - mLoginFormView.animate().setDuration(shortAnimTime).alpha( - show ? 0 : 1).setListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); - } - }); - - mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); - mProgressView.animate().setDuration(shortAnimTime).alpha( - show ? 1 : 0).setListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); - } - }); - } else { - // The ViewPropertyAnimator APIs are not available, so simply show - // and hide the relevant UI components. - mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); - mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); - } - } - - @Override - public void onTaskComplete(String response) { - //Callback called when RequestHandler finished request - if (!response.isEmpty()) { - try { - JSONObject jObject = new JSONObject(response); - JSONObject userObject = jObject.getJSONObject("user"); - String loginkey = userObject.getString("loginkey"); - SharedPreferences sharedPref = getSharedPreferences("persistence", MODE_PRIVATE); - SharedPreferences.Editor editor = sharedPref.edit(); - editor.putString("loginKey", loginkey); - editor.apply(); - } - catch (Exception e) { - e.printStackTrace(); - } - finish(); - } else { - mPinView.setError(getString(R.string.error_incorrect_pin)); - mPinView.requestFocus(); - } - } -} - diff --git a/app/src/main/java/com/example/hochi/nextcompanion/MainActivity.java b/app/src/main/java/com/example/hochi/nextcompanion/MainActivity.java deleted file mode 100644 index ee51d6e..0000000 --- a/app/src/main/java/com/example/hochi/nextcompanion/MainActivity.java +++ /dev/null @@ -1,175 +0,0 @@ -package com.example.hochi.nextcompanion; - -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.net.Uri; -import android.os.Bundle; -import android.support.design.widget.FloatingActionButton; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; -import android.view.View; -import android.view.Menu; -import android.view.MenuItem; -import android.widget.AdapterView; -import android.widget.ArrayAdapter; -import android.widget.ListView; -import android.widget.TextView; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.ArrayList; - -public class MainActivity extends AppCompatActivity implements AsyncTaskCallbacks { - private RequestHandler getBikesTask = null; - - @Override - protected void onCreate(Bundle savedInstanceState) { - //now this "every android activity" stuff - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - Toolbar toolbar = findViewById(R.id.toolbar); - setSupportActionBar(toolbar); - final Context context = this; - - //Floating Button - FloatingActionButton fab = findViewById(R.id.fab); - fab.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - Intent intent = new Intent(context, RentActivity.class); - startActivity(intent); - } - }); - } - - @Override - protected void onStart() { - super.onStart(); - //pre-condition: Is there a login key? - SharedPreferences sharedPref = getSharedPreferences("persistence", MODE_PRIVATE); - String defaultValue = "nokey"; - String loginKey = sharedPref.getString("loginKey", defaultValue); - //if not, go to LoginActivity - if (loginKey.equals("nokey")) { - Intent intent = new Intent(this, LoginActivity.class); - startActivity(intent); - } - else { - reloadBikeList(); - } - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - // Inflate the menu; this adds items to the action bar if it is present. - getMenuInflater().inflate(R.menu.menu_main, menu); - return true; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - // Handle action bar item clicks here. The action bar will - // automatically handle clicks on the Home/Up button, so long - // as you specify a parent activity in AndroidManifest.xml. - int id = item.getItemId(); - - - //noinspection SimplifiableIfStatement - if (id == R.id.action_logout) { - SharedPreferences sharedPref = getSharedPreferences("persistence", MODE_PRIVATE); - SharedPreferences.Editor editor = sharedPref.edit(); - editor.remove("loginKey"); - editor.apply(); - Intent intent = new Intent(this, LoginActivity.class); - startActivity(intent); - } - - if (id == R.id.action_map) { - Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.map_url))); - startActivity(browserIntent); - } - - return super.onOptionsItemSelected(item); - } - - protected void reloadBikeList() { - //get loginkey - SharedPreferences sharedPref = getSharedPreferences("persistence", MODE_PRIVATE); - String defaultValue = "nokey"; - String loginKey = sharedPref.getString("loginKey", defaultValue); - - String[] params = { - "apikey=", getString(R.string.apikey), - "loginkey=", loginKey - }; - - getBikesTask = new RequestHandler(this, "POST", - "api/getOpenRentals.json", params); - getBikesTask.execute((Void) null); - } - - @Override - public void onTaskComplete(String response) { - //Callback called when RequestHandler finished request - final Context context = this; - if (!response.isEmpty()) { - final ArrayList list = new ArrayList<>(); - try { - JSONObject jObject = new JSONObject(response); - JSONArray bikesArray = jObject.getJSONArray("rentalCollection"); - for (int i = 0; i < bikesArray.length(); i++) { - String entry; - JSONObject bike = bikesArray.getJSONObject(i); - entry = "Bike " + bike.getString("bike") - + " with lock code " + bike.getString("code"); - list.add(entry); - } - } catch (Exception e) { - e.printStackTrace(); - } - - //Create and fill list - final ListView listview = findViewById(R.id.listview); - final ArrayAdapter adapter = new ArrayAdapter<>(this, - android.R.layout.simple_list_item_1, list); - listview.setAdapter(adapter); - - //Print indicator if empty - TextView tv = findViewById(R.id.noBikes); - if(list.isEmpty()) tv.setVisibility(View.VISIBLE); - else tv.setVisibility(View.INVISIBLE); - - try { - final JSONObject jObject = new JSONObject(response); - final JSONArray bikesArray = jObject.getJSONArray("rentalCollection"); - listview.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView parent, final View view, int position, long id) { - Intent intent = new Intent(context, ReturnActivity.class); - try { - JSONObject bike = bikesArray.getJSONObject(position); - String bID = bike.getString("bike"); - String stID = bike.getString("start_place"); - String lockE = bike.getString("electric_lock"); - String[] bikeArray = {bID, stID, lockE}; - intent.putExtra("bike", bikeArray); - startActivity(intent); - } - catch (JSONException e) { - e.printStackTrace(); - } - } - - }); - } catch (JSONException e) { - e.printStackTrace(); - } - } - else { - //TODO: implement error handling - } - } -} diff --git a/app/src/main/java/com/example/hochi/nextcompanion/RentActivity.java b/app/src/main/java/com/example/hochi/nextcompanion/RentActivity.java deleted file mode 100644 index 4b1eb87..0000000 --- a/app/src/main/java/com/example/hochi/nextcompanion/RentActivity.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.example.hochi.nextcompanion; - -import android.content.Intent; -import android.content.SharedPreferences; -import android.net.Uri; -import android.support.v7.app.AppCompatActivity; -import android.os.Bundle; -import android.view.View; -import android.widget.Button; -import android.widget.TextView; - -import org.w3c.dom.Text; - -public class RentActivity extends AppCompatActivity implements AsyncTaskCallbacks { - private RequestHandler rentRequestTask = null; - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_rent); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - Button mRentSubmitButton = findViewById(R.id.rent_submit_button); - mRentSubmitButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - rentRequest(); - } - }); - - Intent intent = getIntent(); - Uri data = intent.getData(); - - if (data != null) { - String bikeID = data.toString().substring(15); - ((TextView) findViewById(R.id.bike_id)).setText(bikeID); - } - } - - void rentRequest() { - //Prepare request to rent bike - TextView mBikeInput; - mBikeInput = findViewById(R.id.bike_id); - String bikeID = mBikeInput.getText().toString(); - //get loginkey - SharedPreferences sharedPref = getSharedPreferences("persistence", MODE_PRIVATE); - String defaultValue = "nokey"; - String loginKey = sharedPref.getString("loginKey", defaultValue); - - String[] params = { - "apikey=", getString(R.string.apikey), - "loginkey=", loginKey, - "bike=", bikeID - }; - - rentRequestTask = new RequestHandler(this, "POST", - "api/rent.json", params); - rentRequestTask.execute((Void) null); - } - - @Override - public void onTaskComplete(String response) { - //get back to main activity - //TODO: *any* response handling - finish(); - } -} diff --git a/app/src/main/java/com/example/hochi/nextcompanion/RequestHandler.java b/app/src/main/java/com/example/hochi/nextcompanion/RequestHandler.java deleted file mode 100644 index 2476e63..0000000 --- a/app/src/main/java/com/example/hochi/nextcompanion/RequestHandler.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.example.hochi.nextcompanion; - -import android.os.AsyncTask; - -import java.io.BufferedReader; -import java.io.DataOutputStream; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.HttpURLConnection; -import java.net.URL; -import java.net.URLEncoder; - -public class RequestHandler extends AsyncTask { - - private String mHTTPmethod; - private String mEndpoint; - private AsyncTaskCallbacks callback; - private String[] mCredentials; - - RequestHandler(AsyncTaskCallbacks act, String HTTPmethod, - String endpoint, String[] credentials) { - mHTTPmethod = HTTPmethod; - mEndpoint = endpoint; - mCredentials = credentials; - callback = act; - } - - @Override - protected String doInBackground(Void... params) { - StringBuilder response = new StringBuilder(); - StringBuilder urlParameters = new StringBuilder(); - int i=0; - while (i { - private String[] bikeArray; - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_return); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - - - Intent intent = getIntent(); - bikeArray = intent.getStringArrayExtra("bike"); - - //if GPS and electric lock, show the instruction - TextView tv = findViewById(R.id.gps_info); - LinearLayout la = findViewById(R.id.return_form_container); - if(bikeArray[2].equals("true")) { - tv.setVisibility(View.VISIBLE); - la.setVisibility(View.INVISIBLE); - } - else { - la.setVisibility(View.VISIBLE); - tv.setVisibility(View.INVISIBLE); - Button mReturnSubmitButton = findViewById(R.id.return_submit_button); - mReturnSubmitButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - returnRequest(); - } - }); - } - } - void returnRequest() { - TextView mStationInput; - mStationInput = findViewById(R.id.return_station_id); - String stationID = mStationInput.getText().toString(); - //get loginkey - SharedPreferences sharedPref = getSharedPreferences("persistence", MODE_PRIVATE); - String defaultValue = "nokey"; - String loginKey = sharedPref.getString("loginKey", defaultValue); - - String[] params = { - "apikey=", getString(R.string.apikey), - "bike=", bikeArray[0], - "loginkey=", loginKey, - "station=", stationID, - "comment=", "" - }; - RequestHandler returnRequestTask = new RequestHandler(this, "POST", - "api/return.json", params); - returnRequestTask.execute((Void) null); - } - - @Override - public void onTaskComplete(String response) { - //get back to main activity - //TODO: *any* response handling - finish(); - } -} diff --git a/app/src/main/res/drawable/ic_add_white_24dp.xml b/app/src/main/res/drawable/ic_add_white_24dp.xml deleted file mode 100644 index b5b5ba4..0000000 --- a/app/src/main/res/drawable/ic_add_white_24dp.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml deleted file mode 100644 index de480af..0000000 --- a/app/src/main/res/layout/activity_login.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - -