From 2edf197670b3eb6b22085216abe5869fbca052d2 Mon Sep 17 00:00:00 2001 From: Shikha Gupta Date: Mon, 15 Jun 2020 12:18:16 +0530 Subject: [PATCH 01/29] Common code and FCM integration --- .gitignore | 20 ++ app/.gitignore | 1 + app/build.gradle | 47 +++ app/google-services.json | 40 +++ app/proguard-rules.pro | 21 ++ .../wocdriverapp/ExampleInstrumentedTest.java | 27 ++ app/src/main/AndroidManifest.xml | 54 ++++ .../kickstart/woc/wocdriverapp/AppConfig.java | 65 ++++ .../woc/wocdriverapp/AppConstant.java | 24 ++ .../kickstart/woc/wocdriverapp/AppMain.java | 44 +++ .../woc/wocdriverapp/MainActivity.java | 14 + .../wocdriverapp/network/NetworkClient.java | 25 ++ .../network/NetworkClientBuilder.java | 150 +++++++++ .../ui/activity/BaseActivity.java | 206 +++++++++++++ .../activity/CreateOrEditRiderActivity.java | 24 ++ .../ui/activity/MainActivity.java | 96 ++++++ .../ui/activity/NavigationScreenActivity.java | 94 ++++++ .../ui/activity/OTPValidationActivity.java | 287 ++++++++++++++++++ .../ui/activity/SmsBroadcastReceiver.java | 59 ++++ .../ui/activity/SplashActivity.java | 33 ++ .../activity/TermsAndConditionActivity.java | 48 +++ .../service/AppFirebaseMessagingService.java | 50 +++ .../woc/wocdriverapp/utils/AppUtils.java | 64 ++++ .../woc/wocdriverapp/utils/DateFormatter.java | 69 +++++ .../woc/wocdriverapp/utils/FileUtils.java | 25 ++ .../woc/wocdriverapp/utils/LogUtils.java | 58 ++++ .../utils/SharedPreferenceUtils.java | 120 ++++++++ .../drawable-v24/ic_launcher_foreground.xml | 30 ++ .../res/drawable/bg_blue_focused_edittext.xml | 19 ++ .../main/res/drawable/bg_blue_gradient.xml | 8 + .../main/res/drawable/bg_rounded_edittext.xml | 18 ++ .../res/drawable/bg_side_nav_bar_gradient.xml | 8 + .../main/res/drawable/bg_toolbar_gradient.xml | 10 + .../res/drawable/ic_launcher_background.xml | 170 +++++++++++ app/src/main/res/drawable/layerlist.xml | 9 + app/src/main/res/drawable/profilepic.jpeg | Bin 0 -> 2062 bytes .../main/res/drawable/rounded_button_blue.xml | 16 + .../main/res/drawable/rounded_button_grey.xml | 16 + .../layout/activity_create_or_edit_rider.xml | 162 ++++++++++ app/src/main/res/layout/activity_main.xml | 34 +++ .../res/layout/activity_navigation_screen.xml | 26 ++ .../res/layout/activity_otpvalidation.xml | 34 +++ app/src/main/res/layout/activity_splash.xml | 17 ++ .../layout/activity_terms_and_condition.xml | 34 +++ .../res/layout/app_bar_navigation_screen.xml | 20 ++ app/src/main/res/layout/app_toolbar.xml | 16 + .../res/layout/content_navigation_screen.xml | 11 + .../layout/nav_header_navigation_screen.xml | 41 +++ .../main/res/layout/view_logo_container.xml | 17 ++ .../main/res/layout/view_mobile_screen.xml | 65 ++++ .../res/layout/view_otp_input_container.xml | 58 ++++ app/src/main/res/layout/view_otp_screen.xml | 58 ++++ .../res/layout/view_term_condition_screen.xml | 57 ++++ .../activity_navigation_screen_drawer.xml | 39 +++ app/src/main/res/menu/navigation_screen.xml | 9 + .../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 0 -> 3593 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5339 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2636 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 3388 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4490 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 6895 bytes app/src/main/res/mipmap-xhdpi/location.png | Bin 0 -> 14776 bytes app/src/main/res/mipmap-xhdpi/logo.png | Bin 0 -> 14753 bytes app/src/main/res/mipmap-xhdpi/logo_header.png | Bin 0 -> 2816 bytes app/src/main/res/mipmap-xhdpi/menu.png | Bin 0 -> 137 bytes app/src/main/res/mipmap-xhdpi/searching.png | Bin 0 -> 2888 bytes app/src/main/res/mipmap-xhdpi/star.png | Bin 0 -> 1138 bytes app/src/main/res/mipmap-xhdpi/star_orange.png | Bin 0 -> 1194 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7909 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 11873 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10652 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 16570 bytes app/src/main/res/values/colors.xml | 11 + app/src/main/res/values/dimens.xml | 8 + app/src/main/res/values/drawables.xml | 8 + app/src/main/res/values/strings.xml | 25 ++ app/src/main/res/values/styles.xml | 23 ++ .../woc/wocdriverapp/ExampleUnitTest.java | 17 ++ build.gradle | 30 ++ gradle.properties | 20 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54329 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 172 +++++++++++ gradlew.bat | 84 +++++ settings.gradle | 2 + 87 files changed, 3183 insertions(+) create mode 100644 .gitignore create mode 100644 app/.gitignore create mode 100644 app/build.gradle create mode 100644 app/google-services.json create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/com/kickstart/woc/wocdriverapp/ExampleInstrumentedTest.java create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/java/com/kickstart/woc/wocdriverapp/AppConfig.java create mode 100644 app/src/main/java/com/kickstart/woc/wocdriverapp/AppConstant.java create mode 100644 app/src/main/java/com/kickstart/woc/wocdriverapp/AppMain.java create mode 100644 app/src/main/java/com/kickstart/woc/wocdriverapp/MainActivity.java create mode 100644 app/src/main/java/com/kickstart/woc/wocdriverapp/network/NetworkClient.java create mode 100644 app/src/main/java/com/kickstart/woc/wocdriverapp/network/NetworkClientBuilder.java create mode 100644 app/src/main/java/com/kickstart/woc/wocdriverapp/ui/activity/BaseActivity.java create mode 100644 app/src/main/java/com/kickstart/woc/wocdriverapp/ui/activity/CreateOrEditRiderActivity.java create mode 100644 app/src/main/java/com/kickstart/woc/wocdriverapp/ui/activity/MainActivity.java create mode 100644 app/src/main/java/com/kickstart/woc/wocdriverapp/ui/activity/NavigationScreenActivity.java create mode 100644 app/src/main/java/com/kickstart/woc/wocdriverapp/ui/activity/OTPValidationActivity.java create mode 100644 app/src/main/java/com/kickstart/woc/wocdriverapp/ui/activity/SmsBroadcastReceiver.java create mode 100644 app/src/main/java/com/kickstart/woc/wocdriverapp/ui/activity/SplashActivity.java create mode 100644 app/src/main/java/com/kickstart/woc/wocdriverapp/ui/activity/TermsAndConditionActivity.java create mode 100644 app/src/main/java/com/kickstart/woc/wocdriverapp/ui/service/AppFirebaseMessagingService.java create mode 100644 app/src/main/java/com/kickstart/woc/wocdriverapp/utils/AppUtils.java create mode 100644 app/src/main/java/com/kickstart/woc/wocdriverapp/utils/DateFormatter.java create mode 100644 app/src/main/java/com/kickstart/woc/wocdriverapp/utils/FileUtils.java create mode 100644 app/src/main/java/com/kickstart/woc/wocdriverapp/utils/LogUtils.java create mode 100644 app/src/main/java/com/kickstart/woc/wocdriverapp/utils/SharedPreferenceUtils.java create mode 100644 app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/bg_blue_focused_edittext.xml create mode 100644 app/src/main/res/drawable/bg_blue_gradient.xml create mode 100644 app/src/main/res/drawable/bg_rounded_edittext.xml create mode 100644 app/src/main/res/drawable/bg_side_nav_bar_gradient.xml create mode 100644 app/src/main/res/drawable/bg_toolbar_gradient.xml create mode 100644 app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/drawable/layerlist.xml create mode 100644 app/src/main/res/drawable/profilepic.jpeg create mode 100644 app/src/main/res/drawable/rounded_button_blue.xml create mode 100644 app/src/main/res/drawable/rounded_button_grey.xml create mode 100644 app/src/main/res/layout/activity_create_or_edit_rider.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/layout/activity_navigation_screen.xml create mode 100644 app/src/main/res/layout/activity_otpvalidation.xml create mode 100644 app/src/main/res/layout/activity_splash.xml create mode 100644 app/src/main/res/layout/activity_terms_and_condition.xml create mode 100644 app/src/main/res/layout/app_bar_navigation_screen.xml create mode 100644 app/src/main/res/layout/app_toolbar.xml create mode 100644 app/src/main/res/layout/content_navigation_screen.xml create mode 100644 app/src/main/res/layout/nav_header_navigation_screen.xml create mode 100644 app/src/main/res/layout/view_logo_container.xml create mode 100644 app/src/main/res/layout/view_mobile_screen.xml create mode 100644 app/src/main/res/layout/view_otp_input_container.xml create mode 100644 app/src/main/res/layout/view_otp_screen.xml create mode 100644 app/src/main/res/layout/view_term_condition_screen.xml create mode 100644 app/src/main/res/menu/activity_navigation_screen_drawer.xml create mode 100644 app/src/main/res/menu/navigation_screen.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xhdpi/location.png create mode 100644 app/src/main/res/mipmap-xhdpi/logo.png create mode 100644 app/src/main/res/mipmap-xhdpi/logo_header.png create mode 100644 app/src/main/res/mipmap-xhdpi/menu.png create mode 100644 app/src/main/res/mipmap-xhdpi/searching.png create mode 100644 app/src/main/res/mipmap-xhdpi/star.png create mode 100644 app/src/main/res/mipmap-xhdpi/star_orange.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/dimens.xml create mode 100644 app/src/main/res/values/drawables.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/styles.xml create mode 100644 app/src/test/java/com/kickstart/woc/wocdriverapp/ExampleUnitTest.java create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a265233 --- /dev/null +++ b/.gitignore @@ -0,0 +1,20 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +/.idea/caches/build_file_checksums.ser +.idea/ +logs +gen-external-apklibs +out + diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..62da9e5 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,47 @@ +apply plugin: 'com.android.application' +apply plugin: 'com.google.gms.google-services' + +android { + compileSdkVersion 29 + buildToolsVersion "29.0.3" + + defaultConfig { + applicationId "com.kickstart.woc.wocdriverapp" + minSdkVersion 19 + targetSdkVersion 29 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation 'androidx.appcompat:appcompat:1.0.0' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation 'com.squareup.retrofit2:retrofit:2.2.0' + implementation 'com.squareup.retrofit2:converter-gson:2.2.0' + implementation 'com.squareup.okhttp3:okhttp:3.6.0' + implementation 'com.squareup.okhttp3:logging-interceptor:3.6.0' + implementation 'com.google.code.gson:gson:2.4' + implementation 'com.squareup.picasso:picasso:2.71828' + implementation 'com.jakewharton:butterknife:8.5.1' + implementation 'de.hdodenhof:circleimageview:3.0.0' + implementation 'androidx.legacy:legacy-support-v4:1.0.0' + implementation 'com.google.android.material:material:1.0.0' + implementation 'com.google.firebase:firebase-core:16.0.9' + implementation 'com.google.firebase:firebase-analytics:17.2.2' + implementation 'com.google.firebase:firebase-messaging:20.2.0' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'androidx.test.ext:junit:1.1.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' +} diff --git a/app/google-services.json b/app/google-services.json new file mode 100644 index 0000000..9463c68 --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,40 @@ +{ + "project_info": { + "project_number": "588674654843", + "firebase_url": "https://wocdriverapp.firebaseio.com", + "project_id": "wocdriverapp", + "storage_bucket": "wocdriverapp.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:588674654843:android:5f48c943cebd34b9a9f8de", + "android_client_info": { + "package_name": "com.kickstart.woc.wocdriverapp" + } + }, + "oauth_client": [ + { + "client_id": "588674654843-ltuk4uk0nqemn1mlhdgs1e6ndc75mq02.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyC6Z9GBc6YrXGmc6n0NFC-mx8EXKIYI7mI" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "588674654843-ltuk4uk0nqemn1mlhdgs1e6ndc75mq02.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# 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/kickstart/woc/wocdriverapp/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/kickstart/woc/wocdriverapp/ExampleInstrumentedTest.java new file mode 100644 index 0000000..a1ccb79 --- /dev/null +++ b/app/src/androidTest/java/com/kickstart/woc/wocdriverapp/ExampleInstrumentedTest.java @@ -0,0 +1,27 @@ +package com.kickstart.woc.wocdriverapp; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.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.getInstrumentation().getTargetContext(); + + assertEquals("com.kickstart.woc.wocdriverapp", appContext.getPackageName()); + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..42244dc --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/kickstart/woc/wocdriverapp/AppConfig.java b/app/src/main/java/com/kickstart/woc/wocdriverapp/AppConfig.java new file mode 100644 index 0000000..99632ab --- /dev/null +++ b/app/src/main/java/com/kickstart/woc/wocdriverapp/AppConfig.java @@ -0,0 +1,65 @@ +package com.kickstart.woc.wocdriverapp; + +import android.os.Environment; + +import java.io.File; + + + +public class AppConfig { + private static final Host HOST_DEFAULT = Host.STAGING1; + private static final String DEFAULT_LOG_TAG = "WOCRiderApp"; + private static final String SHARED_PREF_NAME = "WOCRiderPref"; + private static final String BASE_FOLDER_NAME = "WOCRider"; + public static final String DATABASE_NAME = "WOCRiderDB"; + + public enum Host{ + STAGING1("https://jsonplaceholder.typicode.com"), + STAGING("http://ankuran-hack.ap-south-1.elasticbeanstalk.com"), + PRODUCTION("http://ankuran-hack.ap-south-1.elasticbeanstalk.com"); + + private final String url; + + private Host(final String url) + { + this.url=url; + } + + @Override + public String toString() { + return url; + } + } + + + + public static String getHostDefault() { + return HOST_DEFAULT.toString(); + } + + public static boolean isDevelopment() { + if(getHostDefault().equals(Host.PRODUCTION.toString())) + return false; + return true; + } + + public static boolean isLogEnabled() { + return isDevelopment(); + } + + public static String getDefaultLogTag() { + return DEFAULT_LOG_TAG; + } + + public static String getSharedPrefName() { + return SHARED_PREF_NAME; + } + + public static String getBaseFolderPath(){ + return Environment.getExternalStorageDirectory() + File.separator + BASE_FOLDER_NAME + File.separator; + } + + public static String getDatabaseName() { + return DATABASE_NAME; + } +} diff --git a/app/src/main/java/com/kickstart/woc/wocdriverapp/AppConstant.java b/app/src/main/java/com/kickstart/woc/wocdriverapp/AppConstant.java new file mode 100644 index 0000000..cfff0a8 --- /dev/null +++ b/app/src/main/java/com/kickstart/woc/wocdriverapp/AppConstant.java @@ -0,0 +1,24 @@ +package com.kickstart.woc.wocdriverapp; + +import android.os.Environment; + +import java.io.File; + +public class AppConstant { + public static final int CAMERA_REQUEST_CODE =1000 ; + public static final int REQ_USER_CONSENT = 1001; + private static final Object MAIN_FOLDER = "WOCDriver" ; + public static final Object APP_NAME = "WOCDriver" ; + + public static final String BASE_FOLDER = Environment.getExternalStorageDirectory() + File.separator + MAIN_FOLDER + File.separator; + public static int SPLASH_SCREEN_TIME_OUT=2000; + public static final int SMS_PERMISSION_CODE = 1002; + public static final String ACTION_SMS_RECEIVED="android.provider.Telephony.SMS_RECEIVED"; + public static final String URL_TERMS_N_CONDITION_WEBVIEW="https://developer.android.com/guide/webapps/webview"; + + + + + + +} diff --git a/app/src/main/java/com/kickstart/woc/wocdriverapp/AppMain.java b/app/src/main/java/com/kickstart/woc/wocdriverapp/AppMain.java new file mode 100644 index 0000000..f89a9ec --- /dev/null +++ b/app/src/main/java/com/kickstart/woc/wocdriverapp/AppMain.java @@ -0,0 +1,44 @@ +package com.kickstart.woc.wocdriverapp; + +import android.app.Application; +import android.content.Context; +import android.content.SharedPreferences; + +import com.kickstart.woc.wocdriverapp.network.NetworkClient; +import com.kickstart.woc.wocdriverapp.network.NetworkClientBuilder; + + +public class AppMain extends Application { + private static Context mContext; + private static NetworkClient sNetworkClient; + private static AppMain sApplicationInstance = null; + + public static AppMain getInstance() { + return sApplicationInstance; + } + + @Override + public void onCreate() { + super.onCreate(); + mContext = getApplicationContext(); + sApplicationInstance = this; + } + + + + public static SharedPreferences getSharedPreferences() { + return mContext.getSharedPreferences(AppConfig.getSharedPrefName(), MODE_PRIVATE); + } + + public static Context getAppMainContext() { + return mContext; + } + + public static NetworkClient getDefaultNetWorkClient() { + if (sNetworkClient == null) { + NetworkClientBuilder networkClientBuilder = new NetworkClientBuilder(mContext); + sNetworkClient = networkClientBuilder.getDefaultNetworkClient(); + } + return sNetworkClient; + } +} diff --git a/app/src/main/java/com/kickstart/woc/wocdriverapp/MainActivity.java b/app/src/main/java/com/kickstart/woc/wocdriverapp/MainActivity.java new file mode 100644 index 0000000..7c787d7 --- /dev/null +++ b/app/src/main/java/com/kickstart/woc/wocdriverapp/MainActivity.java @@ -0,0 +1,14 @@ +package com.kickstart.woc.wocdriverapp; + +import androidx.appcompat.app.AppCompatActivity; + +import android.os.Bundle; + +public class MainActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + } +} diff --git a/app/src/main/java/com/kickstart/woc/wocdriverapp/network/NetworkClient.java b/app/src/main/java/com/kickstart/woc/wocdriverapp/network/NetworkClient.java new file mode 100644 index 0000000..aa2a589 --- /dev/null +++ b/app/src/main/java/com/kickstart/woc/wocdriverapp/network/NetworkClient.java @@ -0,0 +1,25 @@ +package com.kickstart.woc.wocdriverapp.network; + + +import com.google.gson.JsonObject; + +import retrofit2.Call; +import retrofit2.http.Body; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Path; + +public interface NetworkClient { + String SEGMENT_WOCRIDER_APP = ""; + String SEGMENT_TODOS = "/todos"; + String SEGMENT_POSTS = "/posts"; + + + @GET(SEGMENT_WOCRIDER_APP +SEGMENT_TODOS+"/"+"{todoId}") + Call todos(@Path("todoId") String todoId); + + + @POST(SEGMENT_WOCRIDER_APP +SEGMENT_POSTS) + Call posts(@Body JsonObject jsonObject); + +} diff --git a/app/src/main/java/com/kickstart/woc/wocdriverapp/network/NetworkClientBuilder.java b/app/src/main/java/com/kickstart/woc/wocdriverapp/network/NetworkClientBuilder.java new file mode 100644 index 0000000..fbfe163 --- /dev/null +++ b/app/src/main/java/com/kickstart/woc/wocdriverapp/network/NetworkClientBuilder.java @@ -0,0 +1,150 @@ +package com.kickstart.woc.wocdriverapp.network; + +import android.content.Context; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.kickstart.woc.wocdriverapp.AppConfig; + +import java.security.cert.CertificateException; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +import okhttp3.CipherSuite; +import okhttp3.ConnectionSpec; +import okhttp3.Interceptor; +import okhttp3.OkHttpClient; +import okhttp3.TlsVersion; +import okhttp3.logging.HttpLoggingInterceptor; +import retrofit2.Converter; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; + +public class NetworkClientBuilder { + private Context mContext; + + public NetworkClientBuilder(Context context) { + mContext = context; + } + + private OkHttpClient getOkHttpClient(boolean isNativeClient) { + + if (isNativeClient) + return new OkHttpClient.Builder() + .sslSocketFactory(getSSLSocketFactory()) + .hostnameVerifier(getHostNameVerifier()) + .addInterceptor(getLoggingInterceptor()) + .connectTimeout(10, TimeUnit.SECONDS) + .readTimeout(10, TimeUnit.SECONDS) + .writeTimeout(10, TimeUnit.SECONDS) + .build(); + else + return new OkHttpClient.Builder() + .sslSocketFactory(getSSLSocketFactory()) + .hostnameVerifier(getHostNameVerifier()) + .addInterceptor(getLoggingInterceptor()) + .connectTimeout(10, TimeUnit.SECONDS) + .readTimeout(10, TimeUnit.SECONDS) + .writeTimeout(10, TimeUnit.SECONDS) + .build(); + + } + + private List getConnectionSpecs() { + ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.COMPATIBLE_TLS) + .tlsVersions(TlsVersion.TLS_1_2, TlsVersion.TLS_1_1, TlsVersion.TLS_1_0) + .cipherSuites( + CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, + CipherSuite.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, + CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, + CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA) + .build(); + return Collections.singletonList(spec); + } + + private HostnameVerifier getHostNameVerifier() { + return new HostnameVerifier() { + @Override + public boolean verify(String s, SSLSession sslSession) { + return true; + } + }; + } + + private SSLSocketFactory getSSLSocketFactory() { + // Create a trust manager that does not validate certificate chains + SSLSocketFactory sslSocketFactory = null; + try { + final TrustManager[] trustAllCerts = new TrustManager[]{ + new X509TrustManager() { + @Override + public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { + } + + @Override + public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { + } + + @Override + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + return new java.security.cert.X509Certificate[]{}; + } + } + }; + + // Install the all-trusting trust manager + final SSLContext sslContext = SSLContext.getInstance("SSL"); + sslContext.init(null, trustAllCerts, new java.security.SecureRandom()); + // Create an ssl socket factory with our all-trusting manager + sslSocketFactory = sslContext.getSocketFactory(); + + } catch (Exception e) { + e.printStackTrace(); + } + + return sslSocketFactory; + } + + + private Interceptor getLoggingInterceptor() { + HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); + loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); + return loggingInterceptor; + + } + + + + private Converter.Factory buildGsonConverterFactory() { + GsonBuilder gsonBuilder = new GsonBuilder(); +// gsonBuilder.registerTypeAdapter(Date.class, new DateFormatter()); +// gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES); + Gson myGson = gsonBuilder.create(); + return GsonConverterFactory.create(myGson); + } + + public NetworkClient getDefaultNetworkClient() { + return getNetworkClient(AppConfig.getHostDefault()); + } + + public NetworkClient getCustomNetworkClient(String baseUrl) { + return getNetworkClient(baseUrl); + } + + private NetworkClient getNetworkClient(String baseUrl) { + return new Retrofit.Builder() + .client(getOkHttpClient(true)) + .baseUrl(baseUrl) + .addConverterFactory(buildGsonConverterFactory()) + .build() + .create(NetworkClient.class); + } +} diff --git a/app/src/main/java/com/kickstart/woc/wocdriverapp/ui/activity/BaseActivity.java b/app/src/main/java/com/kickstart/woc/wocdriverapp/ui/activity/BaseActivity.java new file mode 100644 index 0000000..ba8340c --- /dev/null +++ b/app/src/main/java/com/kickstart/woc/wocdriverapp/ui/activity/BaseActivity.java @@ -0,0 +1,206 @@ +package com.kickstart.woc.wocdriverapp.ui.activity; + +import android.app.Activity; +import android.app.ProgressDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.os.Bundle; +import android.view.MenuItem; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.Toast; + +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentTransaction; + + +import com.kickstart.woc.wocdriverapp.R; +import com.kickstart.woc.wocdriverapp.utils.LogUtils; + +import butterknife.ButterKnife; + + + +public abstract class BaseActivity extends AppCompatActivity { + + protected String TAG; + private ProgressDialog mProgressDialog; + protected Toolbar mToolbar; + + + protected abstract int getContentViewId(); + + protected abstract void onCreateActivity(Bundle bundle); + + public BaseActivity() { + this.TAG = getClass().getSimpleName(); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + LogUtils.debug(this.TAG, "* onCreateActivity"); + setContentView(getContentViewId()); + ButterKnife.bind((Activity) this); + //TODO enable this for toolbar support + this.mToolbar = (Toolbar) ButterKnife.findById((Activity) this, (int) R.id.toolbar); + if (this.mToolbar != null) { + setSupportActionBar(this.mToolbar); + } + onCreateActivity(savedInstanceState); + } + + @Override + protected void onResume() { + super.onResume(); + LogUtils.debug(this.TAG, "* onResumeActivity"); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + LogUtils.debug(this.TAG, "* onDestroyActivity"); + } + + @Override + protected void onPause() { + super.onPause(); + LogUtils.debug(this.TAG, "* onPause"); + hideSoftKeyboard(); + } + + public void showToast(String text) { + if (text != null) { + Toast.makeText(this, text, Toast.LENGTH_LONG).show(); + LogUtils.debug(this.TAG, "toast: " + text); + } + } + + public void showToast(int res) { + showToast(getString(res)); + } + + protected void hideSoftKeyboard() { + if (getCurrentFocus() != null) { + ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); + } + } + @Override + public boolean onOptionsItemSelected(MenuItem item) { + int id = item.getItemId(); +// if (!(this instanceof MainActivity) && id == android.R.id.home) { +// onBackPressed(); +// } + return super.onOptionsItemSelected(item); + } + + + @Override + protected void onStart() { + super.onStart(); + } + + + @Override + protected void onStop() { + super.onStop(); + } + + protected void showProgressDialog(String s) { + if (this.mProgressDialog == null) { + this.mProgressDialog = new ProgressDialog(this); + this.mProgressDialog.setCancelable(false); + this.mProgressDialog.setIndeterminate(true); + this.mProgressDialog.setCanceledOnTouchOutside(false); + } + this.mProgressDialog.setMessage(s); + this.mProgressDialog.show(); + } + + protected void showFragment(Fragment fragment, int containerViewId, boolean isFirstFragmentInContainer) { + + if (isFirstFragmentInContainer) { + FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); + fragmentTransaction.add(containerViewId, fragment, null); + fragmentTransaction.commitAllowingStateLoss(); + } else { + String fragmentTag = fragment.getClass().getSimpleName(); + FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); + fragmentTransaction.replace(containerViewId, fragment, fragmentTag); + fragmentTransaction.addToBackStack(fragmentTag); + fragmentTransaction.commitAllowingStateLoss(); + } + } + + + protected void showProgressDialog(int res) { + showProgressDialog(getString(res)); + } + + protected Boolean getProgressDialogState() { + boolean z = this.mProgressDialog != null && this.mProgressDialog.isShowing(); + return Boolean.valueOf(z); + } + + protected void closeProgressDialog() { + if (this.mProgressDialog != null && this.mProgressDialog.isShowing()) { + this.mProgressDialog.dismiss(); + } + } + + + + protected void hideKeyboard(){ + View view = this.getCurrentFocus(); + if (view != null) { + InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(view.getWindowToken(), 0); + } + } + + +// public void showDatePicker(DatePickerFragment.DatePickerDialogListener dialogListener) { +// DialogFragment newFragment = new DatePickerFragment(); +// ((DatePickerFragment) newFragment).setListener(dialogListener); +// newFragment.show(getSupportFragmentManager(), "date picker"); +// } +// +// +//// +//// public void showResponseDialog(DisplayResponseDialog newResponseDialog) +//// { +//// if(mDisplayResponseDialog !=null && mDisplayResponseDialog.isShowing()) +//// mDisplayResponseDialog.dismiss(); +//// +//// mDisplayResponseDialog=newResponseDialog; +//// } + + + public void showInfoDialog(String title, String msg, DialogInterface.OnClickListener listener){ + new AlertDialog.Builder(this) + .setTitle(title) + .setMessage(msg) + .setPositiveButton("Ok", listener).show(); + } + + public void showProgressDialog() { + mProgressDialog = ProgressDialog.show(this, "Please wait ...", "Loading...", true); + mProgressDialog.setCancelable(false); + } + + public void hideProgressDialog() { + if (mProgressDialog != null) + mProgressDialog.dismiss(); + } + + + public void toogleView(View toShow, View toHide){ + toShow.setVisibility(View.VISIBLE); + toHide.setVisibility(View.GONE); + + } + +} diff --git a/app/src/main/java/com/kickstart/woc/wocdriverapp/ui/activity/CreateOrEditRiderActivity.java b/app/src/main/java/com/kickstart/woc/wocdriverapp/ui/activity/CreateOrEditRiderActivity.java new file mode 100644 index 0000000..42a3103 --- /dev/null +++ b/app/src/main/java/com/kickstart/woc/wocdriverapp/ui/activity/CreateOrEditRiderActivity.java @@ -0,0 +1,24 @@ +package com.kickstart.woc.wocdriverapp.ui.activity; + +import android.os.Bundle; + +import com.kickstart.woc.wocdriverapp.R; + + +public class CreateOrEditRiderActivity extends BaseActivity { + + @Override + protected int getContentViewId() { + return R.layout.activity_create_or_edit_rider; + } + + @Override + protected void onCreateActivity(Bundle bundle) { + initUI(); + } + + private void initUI() { + } + + +} diff --git a/app/src/main/java/com/kickstart/woc/wocdriverapp/ui/activity/MainActivity.java b/app/src/main/java/com/kickstart/woc/wocdriverapp/ui/activity/MainActivity.java new file mode 100644 index 0000000..bef9b97 --- /dev/null +++ b/app/src/main/java/com/kickstart/woc/wocdriverapp/ui/activity/MainActivity.java @@ -0,0 +1,96 @@ +package com.kickstart.woc.wocdriverapp.ui.activity; + +import android.os.Bundle; +import android.view.View; +import android.widget.Button; + +import androidx.appcompat.app.AppCompatActivity; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.kickstart.woc.wocdriverapp.AppMain; +import com.kickstart.woc.wocdriverapp.R; +import com.kickstart.woc.wocdriverapp.utils.LogUtils; + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +public class MainActivity extends AppCompatActivity implements View.OnClickListener { + Button mGetApiClick,mPostApiClick; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + mGetApiClick=findViewById(R.id.getApiCLick); + mGetApiClick.setOnClickListener(this); + + mPostApiClick=findViewById(R.id.postApiClick); + mPostApiClick.setOnClickListener(this); + } + + private void dummyGetCall(String todoId) { + LogUtils.debug("dummyGetCall", "fetchIssueDetails"); + + AppMain.getDefaultNetWorkClient().todos(todoId).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { +// if(response.code() == HTTP_CODE_SUCCESS){ +// setIncidentValues(response.body()); +// } + + LogUtils.debug("Response"); + LogUtils.debug(String.valueOf(response.code())); + LogUtils.debug(new Gson().toJson(response.body())); + } + + @Override + public void onFailure(Call call, Throwable t) { + //TODO: Show retrofit error dialog + LogUtils.debug("Network call onFailure get callv",new Gson().toJson(call)); + } + }); + + } + + + private void dummyPostCall(){ + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("title", "foo"); + jsonObject.addProperty("body", "bar"); + jsonObject.addProperty("userId", 1); + + AppMain.getDefaultNetWorkClient().posts(jsonObject).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { +// if(response.code() == HTTP_CODE_SUCCESS){ +// setIncidentValues(response.body()); +// } + LogUtils.debug("Network call OnResponse post call",new Gson().toJson(response)); + } + + @Override + public void onFailure(Call call, Throwable t) { + //TODO: Show retrofit error dialog + LogUtils.debug("Network call onFailure post call",new Gson().toJson(call)); + } + }); + } + + @Override + public void onClick(View v) { + switch (v.getId()){ + case R.id.getApiCLick: + dummyGetCall("1"); + break; + + case R.id.postApiClick: + dummyPostCall(); + break; + + + } + } +} + diff --git a/app/src/main/java/com/kickstart/woc/wocdriverapp/ui/activity/NavigationScreenActivity.java b/app/src/main/java/com/kickstart/woc/wocdriverapp/ui/activity/NavigationScreenActivity.java new file mode 100644 index 0000000..fb39367 --- /dev/null +++ b/app/src/main/java/com/kickstart/woc/wocdriverapp/ui/activity/NavigationScreenActivity.java @@ -0,0 +1,94 @@ +package com.kickstart.woc.wocdriverapp.ui.activity; + +import android.content.Intent; +import android.os.Bundle; +import android.view.MenuItem; + +import androidx.appcompat.app.ActionBarDrawerToggle; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; +import androidx.core.view.GravityCompat; +import androidx.drawerlayout.widget.DrawerLayout; + +import com.google.android.material.navigation.NavigationView; +import com.kickstart.woc.wocdriverapp.R; + + +public class NavigationScreenActivity extends AppCompatActivity + implements NavigationView.OnNavigationItemSelectedListener { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_navigation_screen); + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); + ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( + this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); + drawer.addDrawerListener(toggle); + toggle.syncState(); + + NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); + navigationView.setNavigationItemSelectedListener(this); + } + + @Override + public void onBackPressed() { + DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); + if (drawer.isDrawerOpen(GravityCompat.START)) { + drawer.closeDrawer(GravityCompat.START); + } else { + super.onBackPressed(); + } + } + +// @Override +// public boolean onCreateOptionsMenu(Menu menu) { +// // Inflate the menu; this adds items to the action bar if it is present. +// getMenuInflater().inflate(R.menu.navigation_screen, 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_settings) { +// return true; +// } + + return super.onOptionsItemSelected(item); + } + + @SuppressWarnings("StatementWithEmptyBody") + @Override + public boolean onNavigationItemSelected(MenuItem item) { + // Handle navigation view item clicks here. + int id = item.getItemId(); + + if (id == R.id.nav_camera) { + // Handle the camera action + Intent i=new Intent(NavigationScreenActivity.this, + CreateOrEditRiderActivity.class); + startActivity(i); + } else if (id == R.id.nav_gallery) { + + } else if (id == R.id.nav_manage) { + + } else if (id == R.id.nav_share) { + + } else if (id == R.id.nav_send) { + + } + + DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); + drawer.closeDrawer(GravityCompat.START); + return true; + } +} diff --git a/app/src/main/java/com/kickstart/woc/wocdriverapp/ui/activity/OTPValidationActivity.java b/app/src/main/java/com/kickstart/woc/wocdriverapp/ui/activity/OTPValidationActivity.java new file mode 100644 index 0000000..214aa95 --- /dev/null +++ b/app/src/main/java/com/kickstart/woc/wocdriverapp/ui/activity/OTPValidationActivity.java @@ -0,0 +1,287 @@ +package com.kickstart.woc.wocdriverapp.ui.activity; + + +import android.Manifest; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.PackageManager; +import android.os.Bundle; +import android.text.Editable; +import android.text.TextWatcher; +import android.util.DebugUtils; +import android.util.Log; +import android.view.KeyEvent; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.Button; +import android.widget.EditText; +import android.widget.LinearLayout; + +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; + +import com.google.android.gms.tasks.OnSuccessListener; +import com.google.firebase.iid.FirebaseInstanceId; +import com.google.firebase.iid.InstanceIdResult; +import com.kickstart.woc.wocdriverapp.R; +import com.kickstart.woc.wocdriverapp.utils.LogUtils; + +import static com.kickstart.woc.wocdriverapp.AppConstant.SMS_PERMISSION_CODE; + + +public class OTPValidationActivity extends BaseActivity implements View.OnClickListener, SmsBroadcastReceiver.SmsBroadcastReceiverListener { + + LinearLayout mMobileScreenContainer,mOTPScreenContainer; + Button mContinue,mConfirm; + SmsBroadcastReceiver smsBroadcastReceiver; + + private EditText editText1, editText2, editText3, editText4; + private EditText[] editTexts; + + @Override + protected int getContentViewId() { + return R.layout.activity_otpvalidation; + } + + + @Override + protected void onCreateActivity(Bundle bundle) { + initUI(); + fcm(); + registerBroadcastReceiver(); + checkForSmsPermission(); + } + + private void fcm() { + FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(OTPValidationActivity.this, new OnSuccessListener() { + @Override + public void onSuccess(InstanceIdResult instanceIdResult) { + String token = instanceIdResult.getToken(); + LogUtils.error("Shikha::FCM Token", token); + //TODO send this to server + //saveToken(token); + } + }); + } + + + private void checkForSmsPermission() { + if (!hasReadSmsPermission()) { + requestReadAndSendSmsPermission(); + } + } + + private void initUI() { + mMobileScreenContainer= findViewById(R.id.mobileScreenContainer); + mOTPScreenContainer= findViewById(R.id.otpScreenContainer); + + mContinue=findViewById(R.id.btnContinue); + mContinue.setOnClickListener(this); + + mConfirm=findViewById(R.id.btnConfirm); + mConfirm.setOnClickListener(this); + + + editText1 = (EditText) findViewById(R.id.etOPT1); + editText2 = (EditText) findViewById(R.id.etOPT2); + editText3 = (EditText) findViewById(R.id.etOPT3); + editText4 = (EditText) findViewById(R.id.etOPT4); + editTexts = new EditText[]{editText1, editText2, editText3, editText4}; + + editText1.addTextChangedListener(new PinTextWatcher(0)); + editText2.addTextChangedListener(new PinTextWatcher(1)); + editText3.addTextChangedListener(new PinTextWatcher(2)); + editText4.addTextChangedListener(new PinTextWatcher(3)); + + editText1.setOnKeyListener(new PinOnKeyListener(0)); + editText2.setOnKeyListener(new PinOnKeyListener(1)); + editText3.setOnKeyListener(new PinOnKeyListener(2)); + editText4.setOnKeyListener(new PinOnKeyListener(3)); + + } + + + @Override + public void onClick(View v) { + switch (v.getId()){ + case R.id.btnConfirm: + performConfirm(); + break; + + + case R.id.btnContinue: + performContinue(); + break; + } + } + + private void performContinue() { + toogleView(mOTPScreenContainer,mMobileScreenContainer); + } + + private void performConfirm() { + Intent navIntent = new Intent(OTPValidationActivity.this, NavigationScreenActivity.class); + startActivity(navIntent); + finish(); + } + + + + + public class PinTextWatcher implements TextWatcher { + + private int currentIndex; + private boolean isFirst = false, isLast = false; + private String newTypedString = ""; + + PinTextWatcher(int currentIndex) { + this.currentIndex = currentIndex; + + if (currentIndex == 0) + this.isFirst = true; + else if (currentIndex == editTexts.length - 1) + this.isLast = true; + } + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + newTypedString = s.subSequence(start, start + count).toString().trim(); + } + + @Override + public void afterTextChanged(Editable s) { + + String text = newTypedString; + + /* Detect paste event and set first char */ + if (text.length() > 1) + text = String.valueOf(text.charAt(0)); // TODO: We can fill out other EditTexts + + editTexts[currentIndex].removeTextChangedListener(this); + editTexts[currentIndex].setText(text); + editTexts[currentIndex].setSelection(text.length()); + editTexts[currentIndex].addTextChangedListener(this); + + if (text.length() == 1) + moveToNext(); + else if (text.length() == 0) + moveToPrevious(); + } + + private void moveToNext() { + if (!isLast) + editTexts[currentIndex + 1].requestFocus(); + + if (isAllEditTextsFilled() && isLast) { // isLast is optional + editTexts[currentIndex].clearFocus(); + hideKeyboard(); + } + } + + private void moveToPrevious() { + if (!isFirst) + editTexts[currentIndex - 1].requestFocus(); + } + + private boolean isAllEditTextsFilled() { + for (EditText editText : editTexts) + if (editText.getText().toString().trim().length() == 0) + return false; + return true; + } + + private void hideKeyboard() { + if (getCurrentFocus() != null) { + InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); + } + } + + } + + public class PinOnKeyListener implements View.OnKeyListener { + + private int currentIndex; + + PinOnKeyListener(int currentIndex) { + this.currentIndex = currentIndex; + } + + @Override + public boolean onKey(View v, int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_DEL && event.getAction() == KeyEvent.ACTION_DOWN) { + if (editTexts[currentIndex].getText().toString().isEmpty() && currentIndex != 0) + editTexts[currentIndex - 1].requestFocus(); + } + return false; + } + + } + + private boolean hasReadSmsPermission() { + return ContextCompat.checkSelfPermission(OTPValidationActivity.this, + Manifest.permission.READ_SMS) == PackageManager.PERMISSION_GRANTED && + ContextCompat.checkSelfPermission(OTPValidationActivity.this, + Manifest.permission.RECEIVE_SMS) == PackageManager.PERMISSION_GRANTED; + } + + private void requestReadAndSendSmsPermission() { + if (ActivityCompat.shouldShowRequestPermissionRationale(OTPValidationActivity.this, Manifest.permission.READ_SMS)) { + Log.d(TAG, "shouldShowRequestPermissionRationale(), no permission requested"); + return; + } + ActivityCompat.requestPermissions(OTPValidationActivity.this, new String[]{Manifest.permission.READ_SMS, Manifest.permission.RECEIVE_SMS}, + SMS_PERMISSION_CODE); + } + + @Override + public void onRequestPermissionsResult(int requestCode, + String permissions[], int[] grantResults) { + // For the requestCode, check if permission was granted or not. + switch (requestCode) { + case SMS_PERMISSION_CODE: { + for (int i = 0; i < permissions.length; i++) { + String permission = permissions[i]; + int grantResult = grantResults[i]; + + if (permission.equals(Manifest.permission.READ_SMS)) { + if (grantResult == PackageManager.PERMISSION_GRANTED) { + LogUtils.debug("SMS_PERMISSION_GRANTED"); + } else { + LogUtils.debug("SMS_PERMISSION_NOT_GRANTED"); + } + } + } + } + } + } + + + private void registerBroadcastReceiver() { + IntentFilter intentFilter = new IntentFilter(); + intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED"); + smsBroadcastReceiver = new SmsBroadcastReceiver(); + smsBroadcastReceiver.setSmsBroadcastReceiverListener(this); + registerReceiver(smsBroadcastReceiver, intentFilter); + } + + @Override + protected void onStop() { + super.onStop(); + unregisterReceiver(smsBroadcastReceiver); + } + + @Override + public void handleMsg(String message) { + //TODO populate in UI + LogUtils.debug("handleMsg:"+message); + } +} + + + diff --git a/app/src/main/java/com/kickstart/woc/wocdriverapp/ui/activity/SmsBroadcastReceiver.java b/app/src/main/java/com/kickstart/woc/wocdriverapp/ui/activity/SmsBroadcastReceiver.java new file mode 100644 index 0000000..67bfd47 --- /dev/null +++ b/app/src/main/java/com/kickstart/woc/wocdriverapp/ui/activity/SmsBroadcastReceiver.java @@ -0,0 +1,59 @@ +package com.kickstart.woc.wocdriverapp.ui.activity; + +import android.annotation.TargetApi; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.telephony.SmsMessage; +import android.util.Log; +import android.widget.Toast; + +import com.kickstart.woc.wocdriverapp.AppConstant; + +import java.util.Objects; + + + + +public class SmsBroadcastReceiver extends BroadcastReceiver { + private static final String TAG = SmsBroadcastReceiver.class.getSimpleName(); + public static final String pdu_type = "pdus"; + SmsBroadcastReceiverListener smsBroadcastReceiverListener; + public void setSmsBroadcastReceiverListener(SmsBroadcastReceiverListener smsBroadcastReceiverListener) { + this.smsBroadcastReceiverListener = smsBroadcastReceiverListener; + } + + @TargetApi(Build.VERSION_CODES.M) + @Override + public void onReceive(Context context, Intent intent) { + if (Objects.equals(intent.getAction(), AppConstant.ACTION_SMS_RECEIVED)) { + Bundle bundle = intent.getExtras(); + SmsMessage[] msgs; + String strMessage = ""; + String format = bundle.getString("format"); + Object[] pdus = (Object[]) bundle.get(pdu_type); + if (pdus != null) { + boolean isVersionM = (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M); + msgs = new SmsMessage[pdus.length]; + for (int i = 0; i < msgs.length; i++) { + if (isVersionM) { + msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i], format); + } else { + msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); + } + strMessage += " :" + msgs[i].getMessageBody() + "\n"; + Log.d(TAG, "onReceive: " + strMessage); + Toast.makeText(context, strMessage, Toast.LENGTH_LONG).show(); + smsBroadcastReceiverListener.handleMsg(strMessage); + } + } + } + } + + + public interface SmsBroadcastReceiverListener { + void handleMsg(String message); + } +} diff --git a/app/src/main/java/com/kickstart/woc/wocdriverapp/ui/activity/SplashActivity.java b/app/src/main/java/com/kickstart/woc/wocdriverapp/ui/activity/SplashActivity.java new file mode 100644 index 0000000..b0a74d0 --- /dev/null +++ b/app/src/main/java/com/kickstart/woc/wocdriverapp/ui/activity/SplashActivity.java @@ -0,0 +1,33 @@ +package com.kickstart.woc.wocdriverapp.ui.activity; + +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; + +import androidx.appcompat.app.AppCompatActivity; + +import com.kickstart.woc.wocdriverapp.AppConstant; +import com.kickstart.woc.wocdriverapp.R; + + +public class SplashActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_splash); + init(); + } + + private void init() { + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + Intent i=new Intent(SplashActivity.this, + OTPValidationActivity.class); + startActivity(i); + finish(); + } + }, AppConstant.SPLASH_SCREEN_TIME_OUT); + } +} diff --git a/app/src/main/java/com/kickstart/woc/wocdriverapp/ui/activity/TermsAndConditionActivity.java b/app/src/main/java/com/kickstart/woc/wocdriverapp/ui/activity/TermsAndConditionActivity.java new file mode 100644 index 0000000..e7bb348 --- /dev/null +++ b/app/src/main/java/com/kickstart/woc/wocdriverapp/ui/activity/TermsAndConditionActivity.java @@ -0,0 +1,48 @@ +package com.kickstart.woc.wocdriverapp.ui.activity; + + +import android.os.Bundle; +import android.view.View; +import android.webkit.WebView; +import android.widget.Button; + +import com.kickstart.woc.wocdriverapp.AppConstant; +import com.kickstart.woc.wocdriverapp.R; + + +public class TermsAndConditionActivity extends BaseActivity implements View.OnClickListener{ + + Button mBack; + WebView mTermsAndConditionsWebView; + + @Override + protected int getContentViewId() { + return R.layout.activity_terms_and_condition; + } + + @Override + protected void onCreateActivity(Bundle bundle) { + initUI(); + } + + + private void initUI() { + + mBack=findViewById(R.id.btnBack); + mBack.setOnClickListener(this); + + mTermsAndConditionsWebView=findViewById(R.id.wvTermAndCondition); + mTermsAndConditionsWebView.loadUrl(AppConstant.URL_TERMS_N_CONDITION_WEBVIEW); + + + } + + @Override + public void onClick(View v) { + switch (v.getId()){ + case R.id.btnBack: + finish(); + break; + } + } +} diff --git a/app/src/main/java/com/kickstart/woc/wocdriverapp/ui/service/AppFirebaseMessagingService.java b/app/src/main/java/com/kickstart/woc/wocdriverapp/ui/service/AppFirebaseMessagingService.java new file mode 100644 index 0000000..610fea3 --- /dev/null +++ b/app/src/main/java/com/kickstart/woc/wocdriverapp/ui/service/AppFirebaseMessagingService.java @@ -0,0 +1,50 @@ +package com.kickstart.woc.wocdriverapp.ui.service; + +import androidx.annotation.NonNull; + +import com.google.android.gms.tasks.OnCompleteListener; +import com.google.android.gms.tasks.Task; +import com.google.firebase.iid.FirebaseInstanceId; +import com.google.firebase.iid.InstanceIdResult; +import com.google.firebase.messaging.FirebaseMessagingService; +import com.google.firebase.messaging.RemoteMessage; +import com.kickstart.woc.wocdriverapp.utils.LogUtils; + +public class AppFirebaseMessagingService extends FirebaseMessagingService { + public static final String TAG=AppFirebaseMessagingService.class.getSimpleName(); + + public AppFirebaseMessagingService() { + super(); + } + + @Override + public void onMessageReceived(@NonNull RemoteMessage remoteMessage) { + super.onMessageReceived(remoteMessage); + LogUtils.debug(TAG,"onMessageReceived::"+remoteMessage.toString()); + } + + @Override + public void onDeletedMessages() { + super.onDeletedMessages(); + LogUtils.debug(TAG,"onDeletedMessages::"); + } + + @Override + public void onMessageSent(@NonNull String s) { + super.onMessageSent(s); + LogUtils.debug(TAG,"onMessageSent::"+s); + } + + @Override + public void onSendError(@NonNull String s, @NonNull Exception e) { + super.onSendError(s, e); + LogUtils.debug(TAG,"onSendError::"+s); + LogUtils.debug(TAG,"onSendError::"+e.getMessage()); + } + + @Override + public void onNewToken(@NonNull String s) { + super.onNewToken(s); + LogUtils.debug(TAG,"onNewToken::"+s); + } +} diff --git a/app/src/main/java/com/kickstart/woc/wocdriverapp/utils/AppUtils.java b/app/src/main/java/com/kickstart/woc/wocdriverapp/utils/AppUtils.java new file mode 100644 index 0000000..d04b4e5 --- /dev/null +++ b/app/src/main/java/com/kickstart/woc/wocdriverapp/utils/AppUtils.java @@ -0,0 +1,64 @@ +package com.kickstart.woc.wocdriverapp.utils; + +import android.content.Context; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; + +import com.kickstart.woc.wocdriverapp.AppMain; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.List; + + + +public class AppUtils { + + public static boolean isValidList(List list) { + if (list != null && list.size() > 0) + return true; + return false; + } + + public static boolean isConnectedToInternet() { + + ConnectivityManager connectivityManager = (ConnectivityManager) AppMain.getAppMainContext().getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); + + // Since NetworkInfo is null incase of no current network + boolean isNetworkConnected = false; + if (networkInfo != null) { + isNetworkConnected = networkInfo.isConnected(); + } + return isNetworkConnected; + } + + + public static String getCurrentDate(){ + Date currentTime = Calendar.getInstance().getTime(); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + String currentDate=dateFormat.format(currentTime); + return currentDate; + } + + public static String getReadableDate(String dateInString){ + + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); + SimpleDateFormat formatterOut = new SimpleDateFormat("dd MMM yyyy"); + try { + + Date date = formatter.parse(dateInString); + String readableDate=formatterOut.format(date); + return readableDate; + + } catch (ParseException e) { + e.printStackTrace(); + } + //TODO change this + return "15 May 2020"; + } + + +} diff --git a/app/src/main/java/com/kickstart/woc/wocdriverapp/utils/DateFormatter.java b/app/src/main/java/com/kickstart/woc/wocdriverapp/utils/DateFormatter.java new file mode 100644 index 0000000..2c97af4 --- /dev/null +++ b/app/src/main/java/com/kickstart/woc/wocdriverapp/utils/DateFormatter.java @@ -0,0 +1,69 @@ +package com.kickstart.woc.wocdriverapp.utils; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; +import com.google.gson.JsonPrimitive; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; + +import java.lang.reflect.Type; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TimeZone; + +public class DateFormatter implements JsonDeserializer, + JsonSerializer { + + private final DateFormat[] formats; + /** */ + public static String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'"; //$NON-NLS-1$ + /** */ + public static String DATE_FORMAT_V2_1 = "yyyy/MM/dd HH:mm:ss Z"; //$NON-NLS-1$ + /** */ + public static String DATE_FORMAT_V2_2 = "yyyy-MM-dd'T'HH:mm:ss"; //$NON-NLS-1$ + + public static String DATE_FORMAT_V2_3 = "yyyy-MM-dd"; //$NON-NLS-1$ + + /** + * Create date formatter + */ + public DateFormatter() { + formats = new DateFormat[4]; + formats[0] = new SimpleDateFormat(DATE_FORMAT); + formats[1] = new SimpleDateFormat(DATE_FORMAT_V2_1); + formats[2] = new SimpleDateFormat(DATE_FORMAT_V2_2); + formats[3] = new SimpleDateFormat(DATE_FORMAT_V2_3); + final TimeZone timeZone = TimeZone.getTimeZone("UTC"); //$NON-NLS-1$ + for (DateFormat format : formats) + format.setTimeZone(timeZone); + } + + public Date deserialize(JsonElement json, Type typeOfT, + JsonDeserializationContext context) throws JsonParseException { + JsonParseException exception = null; + final String value = json.getAsString(); + for (DateFormat format : formats) + try { + synchronized (format) { + return format.parse(value); + } + } catch (ParseException e) { + exception = new JsonParseException(e); + } + throw exception; + } + + public JsonElement serialize(Date date, Type type, + JsonSerializationContext context) { + final DateFormat primary = formats[0]; + String formatted; + synchronized (primary) { + formatted = primary.format(date); + } + return new JsonPrimitive(formatted); + } +} diff --git a/app/src/main/java/com/kickstart/woc/wocdriverapp/utils/FileUtils.java b/app/src/main/java/com/kickstart/woc/wocdriverapp/utils/FileUtils.java new file mode 100644 index 0000000..59630f2 --- /dev/null +++ b/app/src/main/java/com/kickstart/woc/wocdriverapp/utils/FileUtils.java @@ -0,0 +1,25 @@ +package com.kickstart.woc.wocdriverapp.utils; + +import android.content.Context; +import android.os.Environment; + +import com.kickstart.woc.wocdriverapp.AppConstant; + +import java.io.File; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; + + + +public class FileUtils { + + public static File createImageFile(Context context) throws IOException { + //TODO change storage directory and pass product id + String timeStamp = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); + String pictureFile = AppConstant.APP_NAME+"_" + timeStamp; + File storageDir =context.getExternalFilesDir(Environment.DIRECTORY_PICTURES); + File image = File.createTempFile(pictureFile, ".jpg", storageDir); + return image; + } +} diff --git a/app/src/main/java/com/kickstart/woc/wocdriverapp/utils/LogUtils.java b/app/src/main/java/com/kickstart/woc/wocdriverapp/utils/LogUtils.java new file mode 100644 index 0000000..d6376cf --- /dev/null +++ b/app/src/main/java/com/kickstart/woc/wocdriverapp/utils/LogUtils.java @@ -0,0 +1,58 @@ +package com.kickstart.woc.wocdriverapp.utils; + + +import com.kickstart.woc.wocdriverapp.AppConfig; + +public class LogUtils { + + public static String makeLogTag(Class cls) + { + return cls.getSimpleName(); + } + + + public static void debug(String tag, String text) { + if (tag == null) { + tag = AppConfig.getDefaultLogTag(); + } + if (AppConfig.isLogEnabled()) + android.util.Log.d(tag, text); + } + + public static void error(String tag, String text) { + if (tag == null) { + tag = AppConfig.getDefaultLogTag(); + } + if (AppConfig.isLogEnabled()) + android.util.Log.e(tag, text); + } + + public static void info(String tag, String text) { + if (tag == null) { + tag = AppConfig.getDefaultLogTag(); + } + if (AppConfig.isLogEnabled()) + android.util.Log.i(tag, text); + } + + public static void debug(String text) { + if (AppConfig.isLogEnabled()) + android.util.Log.d(AppConfig.getDefaultLogTag(), text); + } + + public static void error(String text) { + if (AppConfig.isLogEnabled()) + android.util.Log.e(AppConfig.getDefaultLogTag(), text); + } + + public static void info(String text) { + if (AppConfig.isLogEnabled()) + android.util.Log.i(AppConfig.getDefaultLogTag(), text); + } + + public static void warning(String tag, String s) { + if (AppConfig.isLogEnabled()) + android.util.Log.w(tag, s); + } +} + diff --git a/app/src/main/java/com/kickstart/woc/wocdriverapp/utils/SharedPreferenceUtils.java b/app/src/main/java/com/kickstart/woc/wocdriverapp/utils/SharedPreferenceUtils.java new file mode 100644 index 0000000..6784005 --- /dev/null +++ b/app/src/main/java/com/kickstart/woc/wocdriverapp/utils/SharedPreferenceUtils.java @@ -0,0 +1,120 @@ +package com.kickstart.woc.wocdriverapp.utils; + +import android.content.SharedPreferences; + + +import com.kickstart.woc.wocdriverapp.AppMain; + +import static android.os.Build.VERSION.SDK_INT; +import static android.os.Build.VERSION_CODES.GINGERBREAD; + +public class SharedPreferenceUtils { + private static SharedPreferenceUtils mInstance; + static SharedPreferences mSharedPreferences; + private static String defaultValue = ""; + + + private static SharedPreferences getSharedPref() { + mSharedPreferences = AppMain.getSharedPreferences(); + return mSharedPreferences; + + } + + private static String getStringValue(String key) { + mSharedPreferences = getSharedPref(); + String value = mSharedPreferences.getString(key, defaultValue); + return value; + } + + private static String getStringValue(String key, String defValue) { + mSharedPreferences = getSharedPref(); + String value = mSharedPreferences.getString(key, defValue); + return value; + } + + private static void putStringValue(String key, String value) { + mSharedPreferences = getSharedPref(); + SharedPreferences.Editor editor = mSharedPreferences.edit(); + editor.putString(key, value); + save(editor); + } + + private static long getLongValue(String key, long defValue) { + + mSharedPreferences = getSharedPref(); + long value = mSharedPreferences.getLong(key, defValue); + return value; + } + + private static void putLongValue(String key, long value) { + mSharedPreferences = getSharedPref(); + SharedPreferences.Editor editor = mSharedPreferences.edit(); + editor.putLong(key, value); + save(editor); + } + + private static void putBooleanValue(String key, boolean value) { + mSharedPreferences = getSharedPref(); + SharedPreferences.Editor editor = mSharedPreferences.edit(); + editor.putBoolean(key, value); + save(editor); + } + + private static boolean getBooleanValue(String key) { + + mSharedPreferences = getSharedPref(); + boolean result = mSharedPreferences.getBoolean(key, false); + return result; + } + + private static boolean getBooleanValue(String key, boolean defValue) { + + mSharedPreferences = getSharedPref(); + boolean result = mSharedPreferences.getBoolean(key, defValue); + return result; + } + + private static int getIntValue(String key) { + + mSharedPreferences = getSharedPref(); + int result = mSharedPreferences.getInt(key, 0); + return result; + } + + private static void putIntValue(String key, int value) { + mSharedPreferences = getSharedPref(); + SharedPreferences.Editor editor = mSharedPreferences.edit(); + editor.putInt(key, value); + save(editor); + } + + private static void removeKey(String key) { + mSharedPreferences = getSharedPref(); + SharedPreferences.Editor editor = mSharedPreferences.edit(); + editor.remove(key); + save(editor); + } + + private static boolean isEditorApplyAvailable() { + return SDK_INT >= GINGERBREAD; + } + + /** + * Save preferences in given editor + * + * @param editor + */ + private static void save(final SharedPreferences.Editor editor) { + /*commit() writes the data synchronously (blocking the thread its called from). + It then informs you about the success of the operation. + + apply() schedules the data to be written asynchronously. + It does not inform you about the success of the operation.*/ + + if (isEditorApplyAvailable()) + editor.apply(); + else + editor.commit(); + } + +} diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_blue_focused_edittext.xml b/app/src/main/res/drawable/bg_blue_focused_edittext.xml new file mode 100644 index 0000000..d9b0db5 --- /dev/null +++ b/app/src/main/res/drawable/bg_blue_focused_edittext.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_blue_gradient.xml b/app/src/main/res/drawable/bg_blue_gradient.xml new file mode 100644 index 0000000..6305888 --- /dev/null +++ b/app/src/main/res/drawable/bg_blue_gradient.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_rounded_edittext.xml b/app/src/main/res/drawable/bg_rounded_edittext.xml new file mode 100644 index 0000000..fc8fc09 --- /dev/null +++ b/app/src/main/res/drawable/bg_rounded_edittext.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_side_nav_bar_gradient.xml b/app/src/main/res/drawable/bg_side_nav_bar_gradient.xml new file mode 100644 index 0000000..6d50ea0 --- /dev/null +++ b/app/src/main/res/drawable/bg_side_nav_bar_gradient.xml @@ -0,0 +1,8 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_toolbar_gradient.xml b/app/src/main/res/drawable/bg_toolbar_gradient.xml new file mode 100644 index 0000000..25071bf --- /dev/null +++ b/app/src/main/res/drawable/bg_toolbar_gradient.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..0d025f9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/layerlist.xml b/app/src/main/res/drawable/layerlist.xml new file mode 100644 index 0000000..973b1e8 --- /dev/null +++ b/app/src/main/res/drawable/layerlist.xml @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/profilepic.jpeg b/app/src/main/res/drawable/profilepic.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..b5e9def50c4e06a3b16feffdbe474000226f5673 GIT binary patch literal 2062 zcmYL|2{>D67sqdsmZ5~(Oj<>ar3-WCGLdL3EjpvrHm0^AX|1&tRk5_z>eqJg^;0z{ zp~2S%Q>4Zc%ye`iq9YN-h;68)grbOD855+_bD!tj`@a9*d(Qtk&wICewuS(CD|1V8 z0D%Aigy;db`hi=3l!PQ&QbK;eyu7TetQ=Za9xW@279~&?3m!O#1+iEKO-)q=#iL3X zj2ceus1~HHt$pwdygvRbq9&|OL`X|Zqh--pIe9E}7<&kUAqaxE(@qe#vnUZ^c;^$| z(YAG1v?oe1wDkf2KLg$Z11N+#fCLdJ5V6Gq6h#J+D3Qreu}1=d+=~)v2J#{eKuI8_ zkSM8L1c5~D0r&35sGau2os;-nUH2P%uh6s`|EZ{ai6>CPe)@m=uuwyEQ~|LQpNawi z5`o$yQdB_ETtp2~+vC{{1QNud)J~t%Rp06ZWJDSgM1g<_P!BAreq=&yl-@MdC&AigX;;h+c0x-k`yLv&gwPaWjkKjt|zt7>CU@ zzndDXIqap896((QXfe@#b^v=NpwJ5fJJcq|;^2|$)SKyzFINIwW{U|4Vg4P9jL`>X z&DXl>(2?F3heiW&O6dZ-RZ3Xyaf}YnWZl`2f9mJW1ECH^hYD3)BY)%+1=7L`H%1KX z2Hdzlv-epY?YL7$o3x6Si@7QunxCxhVbC&`%D5Jd$}=Wb-K3^KIwffgL`ODqu29kf zR?2zT8{0dt@ZOgIY6aV;)PhfzGkl7SH3gRMbM{Zz?_oT?`J&Cu&}P=+-G7&?tN*Pm zI~Sl|$1HbcdOnO~H;e>JuQ|hB1E+l(>Go;hFi0m#W_pO>^5`>(MS8G+Y>}A$(=XBA z+ESSL_x}=boZ==Lwt$Sm1g!)yX{2)3;e3##km0?s1!Nr_T%`Qw;TCQC$a3>>+gi|6 zC5l%dCQbVZZ+cf|o`$SA@i)e<3bRrT`&YH*hh_vUzG=9JnA)fPvgm!=-DRrt{rap6 z+#kPi_jYe1ntXTS7)r73@x5IN!5AgA^;*|o4Z#iLPTcNt=(~1ad1*8+XVzk>wYz1b z=wZUU7vh2h>W3D=4O{M)&9}~Y5gg{A=cz7}#4@|}ETWEk5!;mVy%qmN+m5Nz~T`xw?EQHpSq#HzLeir3q4Eq2=RsEGgCBXAxvW7 znj`S7shIO}4ZI#1KHqr{G9n)}IM3o*RK!Qjgk&P#ylizaxvlT=jCX`Wiwg8#EgfL< ze1bFBIsME1!^{hF&zeV4<%F3#J|!q{m3z6vSfSkS!Z@cSLB?Nf1ov5tox!`PxG3AA@G?8c|HXOB zxd?DPjkZcgK96jWQYK6qBdzJkTy+hMT{c$n?O)<&<;PbIn>boyd3`FVO0Ujr_VsaxwLGnU2#!791%pPJ)wV^k`y%$zcP>6E zza})~b_PEkhr7h$Mp+lkwT_MAZxE>2$y0}=+U=W~Y6u^kbM3ldOx0672Ev?VoLzlX zJg|52zMCqd;NMO%{Hho;^D4ZdnZ@^(y}g#Lqm#off~e{0VbAV;a#k!ei(B7lbN^T` za?i_M;B{_dd>T*II%%lx{>>drclcgWEOxqd-gVf(rmM6VjwsuN!VUWUj!zlHdFj;~ zuxZ|ZT=Oa6U<>jb#*FQa=)0{Y{w%CG-g}1>V_wizbKr1A22c2C_8D-rZ%n&+QN@B?h@;H#z=b9aw=Gva0&B+^T!Z|3#(ME$%L z(y{dSlkD~QVyil8O6C0AJYgW$EY@i*BgjT+c&eUko=)d>Te$jon<8@TLv=v#1eK<) zHqbI{bw)i@kNF$xyUfJ=M{B`XD~@S2M?UZRi_&IPZ~p3zE$xP#jG=HL#U46aMoCJV zQ6wtYI*KNM0$u?qd6@)&Ri&~s5ER)NR$j~&W(Oe|OksR!_OiDXnHEDXQ)MW*>r5Sj zqPqK1+kc4u`e{ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/rounded_button_grey.xml b/app/src/main/res/drawable/rounded_button_grey.xml new file mode 100644 index 0000000..5ee0610 --- /dev/null +++ b/app/src/main/res/drawable/rounded_button_grey.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_create_or_edit_rider.xml b/app/src/main/res/layout/activity_create_or_edit_rider.xml new file mode 100644 index 0000000..b49ea54 --- /dev/null +++ b/app/src/main/res/layout/activity_create_or_edit_rider.xml @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +