This commit is contained in:
ADITYA
2023-06-29 17:54:41 +05:30
commit 0242aa3b73
199 changed files with 10382 additions and 0 deletions

15
.gitignore vendored Normal file
View File

@@ -0,0 +1,15 @@
*.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
local.properties

3
.idea/.gitignore generated vendored Normal file
View File

@@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

6
.idea/compiler.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="11" />
</component>
</project>

17
.idea/deploymentTargetDropDown.xml generated Normal file
View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetDropDown">
<runningDeviceTargetSelectedWithDropDown>
<Target>
<type value="RUNNING_DEVICE_TARGET" />
<deviceKey>
<Key>
<type value="SERIAL_NUMBER" />
<value value="5203ae2be8ec4353" />
</Key>
</deviceKey>
</Target>
</runningDeviceTargetSelectedWithDropDown>
<timeTargetWasSelectedWithDropDown value="2023-06-29T11:46:37.575091600Z" />
</component>
</project>

19
.idea/gradle.xml generated Normal file
View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="testRunner" value="GRADLE" />
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
</GradleProjectSettings>
</option>
</component>
</project>

10
.idea/misc.xml generated Normal file
View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="Android Studio default JDK" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>

6
.idea/render.experimental.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RenderSettings">
<option name="showDecorations" value="true" />
</component>
</project>

1
app/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/build

64
app/build.gradle Normal file
View File

@@ -0,0 +1,64 @@
plugins {
id 'com.android.application'
}
android {
namespace 'com.ssb.simplitend'
compileSdk 33
defaultConfig {
applicationId "com.ssb.simplitend"
minSdk 23
targetSdk 33
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
buildFeatures{
viewBinding true
}
}
dependencies {
// Navigation component
def nav_version = "2.5.3"
// Java language implementation
implementation "androidx.navigation:navigation-fragment:$nav_version"
implementation "androidx.navigation:navigation-ui:$nav_version"
// circle indicator for viewpager
implementation 'me.relex:circleindicator:2.1.6'
// picasso
implementation 'com.squareup.picasso:picasso:2.8'
// Glide
implementation 'com.github.bumptech.glide:glide:4.15.1'
// lottie animations
def lottieVersion = "3.4.0"
implementation "com.airbnb.android:lottie:$lottieVersion"
implementation 'androidx.appcompat:appcompat:1.6.0'
implementation 'com.google.android.material:material:1.8.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}

21
app/proguard-rules.pro vendored Normal file
View File

@@ -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

View File

@@ -0,0 +1,26 @@
package com.ssb.simplitend;
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 <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("com.ssb.simplitend", appContext.getPackageName());
}
}

View File

@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.SimpliTend"
tools:targetApi="31">
<activity
android:name=".welcome.activities.WelcomeActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data
android:name="android.app.lib_name"
android:value="" />
</activity>
</application>
</manifest>

View File

@@ -0,0 +1,21 @@
package com.ssb.simplitend.apputils;
import android.app.Activity;
import android.content.Context;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
public abstract class AppUtil {
// closes keyboard
public static void closeKeyboard(Activity activity){
if (activity != null){
View view = activity.getCurrentFocus();
if (view != null) {
InputMethodManager imm = (InputMethodManager)activity.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}
}
}

View File

@@ -0,0 +1,30 @@
package com.ssb.simplitend.userprofile;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import com.ssb.simplitend.databinding.ProfileProgressFragmentBinding;
public class ProfileProgressFragment extends Fragment {
// view binding
protected ProfileProgressFragmentBinding binding;
public ProfileProgressFragment(){
// required empty const.
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = ProfileProgressFragmentBinding.inflate(inflater, container, false);
return binding.getRoot();
}
}

View File

@@ -0,0 +1,20 @@
package com.ssb.simplitend.welcome.activities;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import com.ssb.simplitend.databinding.ActivityWelcomeBinding;
public class WelcomeActivity extends AppCompatActivity {
// View binding
protected ActivityWelcomeBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityWelcomeBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
}
}

View File

@@ -0,0 +1,88 @@
package com.ssb.simplitend.welcome.fragments;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.navigation.Navigation;
import com.ssb.simplitend.R;
import com.ssb.simplitend.databinding.ChooseRoleFragmentBinding;
public class ChooseRoleFragment extends Fragment {
protected ChooseRoleFragmentBinding binding;
private static final String SELECTED_ROLE_KEY = "selected_role";
private static final int SENIOR = 1;
private static final int CAREGIVER = 2;
private int selected_role = SENIOR;
public ChooseRoleFragment(){
// required empty fragment
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = ChooseRoleFragmentBinding.inflate(inflater, container, false);
initViews(savedInstanceState);
clickEvents();
return binding.getRoot();
}
// registers all click listeners
private void clickEvents() {
binding.seniorRole.setOnClickListener(v -> {
makeRoleSelection(SENIOR);
Navigation.findNavController(v).navigate(R.id.action_chooseRoleFragment_to_signInSignUpFragment);
});
binding.caregiverRole.setOnClickListener(v -> makeRoleSelection(CAREGIVER));
}
// initialize views
private void initViews(Bundle savedInstanceState) {
// checking if any previous instance existed
if (savedInstanceState != null){
// previously instance existed
// thus, retrieving selected_role chosen
selected_role = savedInstanceState.getInt(SELECTED_ROLE_KEY, SENIOR);
}
// making the role selection
makeRoleSelection(selected_role);
}
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(SELECTED_ROLE_KEY, selected_role);
}
/*
makes the check for each role visible or invisible according to the selected role
*/
private void makeRoleSelection(int selectedRole){
selected_role = selectedRole;
if (selectedRole == SENIOR){
binding.seniorCheck.setVisibility(View.VISIBLE);
binding.caregiverCheck.setVisibility(View.GONE);
}else{
binding.caregiverCheck.setVisibility(View.VISIBLE);
binding.seniorCheck.setVisibility(View.GONE);
}
}
}

View File

@@ -0,0 +1,37 @@
package com.ssb.simplitend.welcome.fragments;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.lifecycle.Lifecycle;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import com.ssb.simplitend.welcome.fragments.onboardfragments.OnBoardOne;
import com.ssb.simplitend.welcome.fragments.onboardfragments.OnBoardThree;
import com.ssb.simplitend.welcome.fragments.onboardfragments.OnBoardTwo;
public class OnBoardPagerAdapter extends FragmentStateAdapter {
public OnBoardPagerAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle) {
super(fragmentManager, lifecycle);
}
@NonNull
@Override
public Fragment createFragment(int position) {
switch (position){
case 2:
return new OnBoardThree();
case 1:
return new OnBoardTwo();
default:
return new OnBoardOne();
}
}
@Override
public int getItemCount() {
return 3;
}
}

View File

@@ -0,0 +1,41 @@
package com.ssb.simplitend.welcome.fragments;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.navigation.Navigation;
import com.ssb.simplitend.R;
import com.ssb.simplitend.databinding.SignInFragmentBinding;
public class SignInFragment extends Fragment {
// view binding
protected SignInFragmentBinding binding;
public SignInFragment(){
// required empty constructor
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = SignInFragmentBinding.inflate(inflater, container, false);
clickEvents();
return binding.getRoot();
}
private void clickEvents() {
binding.forgotPin.setOnClickListener(v ->
Navigation.findNavController(v).navigate(R.id.action_signInFragment_to_forgotPinFragment));
}
}

View File

@@ -0,0 +1,58 @@
package com.ssb.simplitend.welcome.fragments;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.navigation.Navigation;
import com.ssb.simplitend.R;
import com.ssb.simplitend.databinding.SignInUpFragmentBinding;
public class SignInSignUpFragment extends Fragment {
// view binding
protected SignInUpFragmentBinding binding;
protected OnBoardPagerAdapter onBoardPagerAdapter;
public SignInSignUpFragment(){
// required empty constructor
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = SignInUpFragmentBinding.inflate(inflater, container, false);
initViews();
clickEvents();
return binding.getRoot();
}
private void clickEvents() {
// log in
binding.login.setOnClickListener(v ->
Navigation.findNavController(v).navigate(R.id.action_signInSignUpFragment_to_signInFragment)
);
// register
binding.register.setOnClickListener(v ->
Navigation.findNavController(v).navigate(R.id.action_signInSignUpFragment_to_howToSetUpFragment)
);
}
private void initViews() {
onBoardPagerAdapter = new OnBoardPagerAdapter(getChildFragmentManager(), getLifecycle());
binding.viewPager.setAdapter(onBoardPagerAdapter);
binding.circleIndicator.setViewPager(binding.viewPager);
}
}

View File

@@ -0,0 +1,49 @@
package com.ssb.simplitend.welcome.fragments;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.navigation.Navigation;
import com.ssb.simplitend.R;
import com.ssb.simplitend.databinding.WelcomeFragmentBinding;
public class WelcomeFragment extends Fragment {
// view binding
protected WelcomeFragmentBinding binding;
public WelcomeFragment(){
// required empty const.
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = WelcomeFragmentBinding.inflate(inflater, container, false);
initViews(savedInstanceState);
clickEvents();
return binding.getRoot();
}
// Initialize views
private void initViews(Bundle savedInstanceState) {
}
// Register click events
private void clickEvents(){
binding.nextBtn.setOnClickListener(v ->
Navigation.findNavController(v)
.navigate(R.id.action_welcomeFragment_to_chooseRoleFragment)
);
}
}

View File

@@ -0,0 +1,50 @@
package com.ssb.simplitend.welcome.fragments.contacts;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.navigation.Navigation;
import com.ssb.simplitend.R;
import com.ssb.simplitend.databinding.AddContactFragmentBinding;
public class AddContactFragment extends Fragment {
// view binding
protected AddContactFragmentBinding binding;
public AddContactFragment(){
// required empty const.
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = AddContactFragmentBinding.inflate(inflater, container, false);
clickEvents();
return binding.getRoot();
}
private void clickEvents() {
binding.static1.setOnClickListener(v ->
Navigation.findNavController(v).navigate(R.id.action_addContactFragment_to_contactInfoFragment)
);
binding.static2.setOnClickListener(v ->
Navigation.findNavController(v).navigate(R.id.action_addContactFragment_to_contactListFragment)
);
binding.nextBtn.setOnClickListener(v ->
Navigation.findNavController(v).navigate(R.id.action_addContactFragment_to_profileProgressFragment)
);
}
}

View File

@@ -0,0 +1,30 @@
package com.ssb.simplitend.welcome.fragments.contacts;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import com.ssb.simplitend.databinding.ContactInfoFragmentBinding;
public class ContactInfoFragment extends Fragment {
// view binding
protected ContactInfoFragmentBinding binding;
public ContactInfoFragment(){
// required empty const.
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = ContactInfoFragmentBinding.inflate(inflater, container, false);
return binding.getRoot();
}
}

View File

@@ -0,0 +1,81 @@
package com.ssb.simplitend.welcome.fragments.contacts;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.ListAdapter;
import androidx.recyclerview.widget.RecyclerView;
import com.ssb.simplitend.databinding.ContactViewHolderBinding;
import com.ssb.simplitend.welcome.fragments.contacts.mvvm.Contact;
public class ContactListAdapter extends ListAdapter<Contact, ContactListAdapter.ContactViewHolder> {
private OnContactClickListener contactClickListener;
private static final DiffUtil.ItemCallback<Contact> DIFF_UTIL = new DiffUtil.ItemCallback<Contact>() {
@Override
public boolean areItemsTheSame(@NonNull Contact oldItem, @NonNull Contact newItem) {
return oldItem.name.equals(newItem.name);
}
@Override
public boolean areContentsTheSame(@NonNull Contact oldItem, @NonNull Contact newItem) {
return oldItem.equals(newItem);
}
};
public ContactListAdapter(){
super(DIFF_UTIL);
}
@NonNull
@Override
public ContactViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ContactViewHolderBinding binding = ContactViewHolderBinding.inflate(LayoutInflater.from(parent.getContext()));
return new ContactViewHolder(binding);
}
@Override
public void onBindViewHolder(@NonNull ContactViewHolder holder, int position) {
holder.setData(getItem(position));
holder.binding.getRoot().setOnClickListener(v -> {
if (contactClickListener != null){
contactClickListener.onClick(getItem(position));
}
});
}
public void setContactClickListener(OnContactClickListener contactClickListener) {
this.contactClickListener = contactClickListener;
}
public static class ContactViewHolder extends RecyclerView.ViewHolder{
private final ContactViewHolderBinding binding;
public ContactViewHolder(ContactViewHolderBinding binding){
super(binding.getRoot());
this.binding = binding;
}
public void setData(Contact contact){
binding.name.setText(contact.name);
// static
binding.initial.setText(contact.name.substring(0, 1).toUpperCase());
}
}
@FunctionalInterface
public interface OnContactClickListener{
void onClick(Contact contact);
}
}

View File

@@ -0,0 +1,119 @@
package com.ssb.simplitend.welcome.fragments.contacts;
import static com.ssb.simplitend.welcome.fragments.contacts.CreateContactFragment.CONTACT_KEY;
import static com.ssb.simplitend.welcome.fragments.contacts.CreateContactFragment.TO_EDIT_KEY;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
import androidx.navigation.Navigation;
import androidx.recyclerview.widget.LinearLayoutManager;
import com.ssb.simplitend.R;
import com.ssb.simplitend.databinding.ContactListFragmentBinding;
import com.ssb.simplitend.welcome.fragments.contacts.mvvm.Contact;
import com.ssb.simplitend.welcome.fragments.contacts.mvvm.ContactViewModel;
import java.util.ArrayList;
public class ContactListFragment extends Fragment {
private static final String TAG = "aditya";
// view binding
protected ContactListFragmentBinding binding;
protected ContactListAdapter contactListAdapter;
protected ContactViewModel contactViewModel;
protected ActivityResultLauncher<String> permissionLauncher;
public ContactListFragment() {
// required empty const.
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = ContactListFragmentBinding.inflate(inflater, container, false);
initializeViews();
clickEvents();
return binding.getRoot();
}
private void clickEvents() {
binding.backBtn.setOnClickListener(v -> Navigation.findNavController(v).popBackStack());
binding.createContact.setOnClickListener(v ->
{
Bundle arguments = new Bundle();
arguments.putBoolean(TO_EDIT_KEY, false);
Navigation.findNavController(v).navigate(R.id.action_contactListFragment_to_createContactFragment, arguments);
}
);
contactListAdapter.setContactClickListener(contact ->
{
Bundle bundle = new Bundle();
bundle.putBoolean(TO_EDIT_KEY, true);
bundle.putSerializable(CONTACT_KEY, contact);
Navigation.findNavController(binding.getRoot()).navigate(R.id.action_contactListFragment_to_createContactFragment, bundle);
}
);
}
private void initializeViews() {
// initiating recycler view for contact list
contactListAdapter = new ContactListAdapter();
binding.contactRv.setLayoutManager(new LinearLayoutManager(requireContext()));
binding.contactRv.setAdapter(contactListAdapter);
permissionLauncher = registerForActivityResult(new ActivityResultContracts.RequestPermission(),
granted -> {
if (granted) {
// user granted the READ_CONTACT permission
loadContacts();
} else {
// user denied the permission
// TODO: 28-06-2023
}
}
);
loadContacts();
}
/*
loads user's local contacts
*/
private void loadContacts() {
if (requireActivity().checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
permissionLauncher.launch(Manifest.permission.READ_CONTACTS);
return;
}
contactViewModel = new ViewModelProvider(this).get(ContactViewModel.class);
Log.d(TAG, "initializeViews: viewmodel " + contactViewModel);
contactListAdapter.submitList(contactViewModel.getContactList());
}
}

View File

@@ -0,0 +1,204 @@
package com.ssb.simplitend.welcome.fragments.contacts;
import android.animation.Animator;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.navigation.Navigation;
import androidx.vectordrawable.graphics.drawable.Animatable2Compat;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.DataSource;
import com.bumptech.glide.load.engine.GlideException;
import com.bumptech.glide.load.resource.gif.GifDrawable;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.target.Target;
import com.google.android.material.bottomsheet.BottomSheetDialog;
import com.ssb.simplitend.R;
import com.ssb.simplitend.databinding.CreateEditContactFragmentBinding;
import com.ssb.simplitend.databinding.DecisionBottomsheetBinding;
import com.ssb.simplitend.databinding.DoneBottomsheetBinding;
import com.ssb.simplitend.welcome.fragments.contacts.mvvm.Contact;
public class CreateContactFragment extends Fragment {
// view binding
protected CreateEditContactFragmentBinding binding;
// arguments keys
public static final String TO_EDIT_KEY = "to_edit";
public static final String CONTACT_KEY = "contact_key";
// flag if current instance is to edit or create contact
boolean to_edit;
public CreateContactFragment() {
// required empty const.
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = CreateEditContactFragmentBinding.inflate(inflater, container, false);
initializeViews();
clickEvents();
return binding.getRoot();
}
private void clickEvents() {
binding.nextBtn.setOnClickListener(v -> {
if (to_edit){
// editing existing contact
showSaveEditDecision();
}else {
// saving new contact
gotoAddContactFragment();
}
});
}
private void showSaveEditDecision() {
DecisionBottomsheetBinding binding = DecisionBottomsheetBinding.inflate(getLayoutInflater());
BottomSheetDialog bsd = new BottomSheetDialog(requireContext(), R.style.BottomSheetDialog);
bsd.setContentView(binding.getRoot());
binding.text.setText(getString(R.string.make_changes));
binding.positiveBtn.setText(getString(R.string.yes));
binding.negativeBtn.setText(getString(R.string.no));
binding.negativeBtn.setOnClickListener(v -> bsd.dismiss());
binding.positiveBtn.setOnClickListener(v -> {
bsd.dismiss();
showDoneBottomSheet();
});
bsd.show();
}
private void showDoneBottomSheet() {
DoneBottomsheetBinding binding = DoneBottomsheetBinding.inflate(getLayoutInflater());
BottomSheetDialog bsd = new BottomSheetDialog(requireContext(), R.style.BottomSheetDialog);
bsd.setContentView(binding.getRoot());
bsd.setCancelable(false);
binding.text.setText(getString(R.string.changes_successful));
binding.anim.addAnimatorListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(@NonNull Animator animation) {
}
@Override
public void onAnimationEnd(@NonNull Animator animation) {
bsd.dismiss();
gotoAddContactFragment();
}
@Override
public void onAnimationCancel(@NonNull Animator animation) {
}
@Override
public void onAnimationRepeat(@NonNull Animator animation) {
}
});
bsd.show();
}
private void gotoAddContactFragment(){
Navigation.findNavController(binding.getRoot())
.navigate(R.id.action_createContactFragment_to_addContactFragment);
}
private void showSOSDecision() {
DecisionBottomsheetBinding binding = DecisionBottomsheetBinding.inflate(getLayoutInflater());
BottomSheetDialog bsd = new BottomSheetDialog(requireContext(), R.style.BottomSheetDialog);
bsd.setContentView(binding.getRoot());
binding.text.setText(getString(R.string.make_sos));
binding.positiveBtn.setText(getString(R.string.yes));
binding.negativeBtn.setText(getString(R.string.no));
binding.negativeBtn.setOnClickListener(v -> {
bsd.dismiss();
this.binding.sosCheck.setChecked(false);
});
binding.positiveBtn.setOnClickListener(v -> {
bsd.dismiss();
this.binding.sosCheck.setChecked(true);
});
bsd.show();
}
private void initializeViews() {
Bundle bundle = getArguments();
if (bundle != null){
to_edit = bundle.getBoolean(TO_EDIT_KEY, false);
if (to_edit){
setLayoutDetails(getString(R.string.edit_contact), getString(R.string.change_photo), getString(R.string.save));
Contact contact = (Contact) bundle.getSerializable(CONTACT_KEY);
setDetails(contact);
}else{
setLayoutDetails(getString(R.string.create_contact), getString(R.string.add_photo), getString(R.string.create_contact));
}
}
binding.sosCheck.setOnCheckedChangeListener((buttonView, isChecked) -> {
if (isChecked){
showSOSDecision();
}
});
}
private void setDetails(Contact contact) {
binding.name.setText(contact.name);
binding.phoneNumber.setText(contact.phoneNumber);
binding.email.setText(contact.email);
binding.relationship.setText(contact.relationship);
}
public void setLayoutDetails(String title, String photo_title, String btn_txt){
binding.title.setText(title);
binding.photoTv.setText(photo_title);
binding.nextBtn.setText(btn_txt);
}
}

View File

@@ -0,0 +1,44 @@
package com.ssb.simplitend.welcome.fragments.contacts.mvvm;
import java.io.Serializable;
import java.util.Objects;
public class Contact implements Serializable {
public String name, imageUri, phoneNumber, relationship, email;
public Contact(){}
public Contact(String name){
this.name = name;
}
public Contact(String name, String phoneNumber){
this.name = name;
this.phoneNumber = phoneNumber;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Contact contact = (Contact) o;
return name.equals(contact.name) && Objects.equals(imageUri, contact.imageUri) && phoneNumber.equals(contact.phoneNumber) && Objects.equals(relationship, contact.relationship) && Objects.equals(email, contact.email);
}
@Override
public int hashCode() {
return Objects.hash(name, imageUri, phoneNumber, relationship, email);
}
@Override
public String toString() {
return "Contact{" +
"name='" + name + '\'' +
", imageUri='" + imageUri + '\'' +
", phoneNumber='" + phoneNumber + '\'' +
", relationship='" + relationship + '\'' +
", email='" + email + '\'' +
'}';
}
}

View File

@@ -0,0 +1,29 @@
package com.ssb.simplitend.welcome.fragments.contacts.mvvm;
import android.app.Application;
import android.content.Context;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.ViewModel;
import java.util.ArrayList;
public class ContactViewModel extends AndroidViewModel {
private final ArrayList<Contact> contactList;
private final UserContactRepository contactRepository;
public ContactViewModel(Application application){
super(application);
this.contactRepository = new UserContactRepository();
this.contactList = this.contactRepository.getContactList(application.getApplicationContext());
}
public ArrayList<Contact> getContactList() {
return contactList;
}
public UserContactRepository getContactRepository() {
return contactRepository;
}
}

View File

@@ -0,0 +1,63 @@
package com.ssb.simplitend.welcome.fragments.contacts.mvvm;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.provider.ContactsContract;
import android.util.Log;
import com.ssb.simplitend.welcome.fragments.contacts.mvvm.Contact;
import java.util.ArrayList;
import java.util.HashSet;
public class UserContactRepository {
private static final String[] PROJECTION = new String[]{
ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER
};
public UserContactRepository(){}
public ArrayList<Contact> getContactList(Context context) {
final ArrayList<Contact> contactList = new ArrayList<>();
ContentResolver cr = context.getContentResolver();
Cursor cursor = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, PROJECTION, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC");
if (cursor != null) {
// To avoid duplicate phone numbers
HashSet<String> mobileNoSet = new HashSet<String>();
try {
final int nameIndex = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
final int numberIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
Log.d("aditya", "getContactList: " + cursor.getColumnCount());
String name, number, photoUri;
while (cursor.moveToNext()) {
name = cursor.getString(nameIndex);
number = cursor.getString(numberIndex);
// avoiding duplicate phone number
number = number.replace(" ", "");
if (!mobileNoSet.contains(number)) {
contactList.add(new Contact(name, number));
mobileNoSet.add(number);
}
}
} finally {
cursor.close();
}
}
return contactList;
}
}

View File

@@ -0,0 +1,40 @@
package com.ssb.simplitend.welcome.fragments.forgotpin;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.navigation.Navigation;
import com.ssb.simplitend.databinding.ChangePinFragmentBinding;
public class ChangePinFragment extends Fragment {
// view binding
protected ChangePinFragmentBinding binding;
public ChangePinFragment(){
// required empty const.
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = ChangePinFragmentBinding.inflate(inflater, container, false);
clickEvents();
return binding.getRoot();
}
private void clickEvents() {
binding.backBtn.setOnClickListener(v -> Navigation.findNavController(v).popBackStack());
}
}

View File

@@ -0,0 +1,156 @@
package com.ssb.simplitend.welcome.fragments.forgotpin;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.navigation.Navigation;
import com.ssb.simplitend.R;
import com.ssb.simplitend.apputils.AppUtil;
import com.ssb.simplitend.databinding.CheckMailFragmentBinding;
public class CheckMailFragment extends Fragment {
// view binding
protected CheckMailFragmentBinding binding;
public CheckMailFragment() {
// required empty const.
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = CheckMailFragmentBinding.inflate(inflater, container, false);
initViews();
clickEvents();
return binding.getRoot();
}
private void initViews() {
initOTPBoxes();
}
/*
setting text change listener for every edit text for otp
*/
private void initOTPBoxes() {
binding.otp1.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (!s.toString().trim().isEmpty()) {
binding.otp2.requestFocus();
}
// check if all otp boxes are filled
}
});
binding.otp2.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (!s.toString().trim().isEmpty()) {
binding.otp3.requestFocus();
} else {
binding.otp1.requestFocus();
}
// check if all otp boxes are filled
}
});
binding.otp3.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (!s.toString().trim().isEmpty()) {
binding.otp4.requestFocus();
} else {
binding.otp2.requestFocus();
}
// check if all otp boxes are filled
}
});
binding.otp4.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (!s.toString().trim().isEmpty()) {
// last otp inserted
AppUtil.closeKeyboard(getActivity());
} else {
binding.otp3.requestFocus();
}
// check if all otp boxes are filled
}
});
}
private void clickEvents() {
binding.backBtn.setOnClickListener(v -> Navigation.findNavController(v).popBackStack());
binding.submit.setOnClickListener(v ->
Navigation.findNavController(v).navigate(R.id.action_checkMailFragment_to_changePinFragment));
}
}

View File

@@ -0,0 +1,43 @@
package com.ssb.simplitend.welcome.fragments.forgotpin;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.navigation.Navigation;
import com.ssb.simplitend.R;
import com.ssb.simplitend.databinding.ForgotPinFragmentBinding;
public class ForgotPinFragment extends Fragment {
protected ForgotPinFragmentBinding binding;
public ForgotPinFragment(){
// required empty constructor
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = ForgotPinFragmentBinding.inflate(inflater, container, false);
clickEvents();
return binding.getRoot();
}
private void clickEvents() {
binding.backBtn.setOnClickListener(v ->
Navigation.findNavController(v).popBackStack());
binding.submit.setOnClickListener(v ->
Navigation.findNavController(v).navigate(R.id.action_forgotPinFragment_to_checkMailFragment));
}
}

View File

@@ -0,0 +1,30 @@
package com.ssb.simplitend.welcome.fragments.onboardfragments;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import com.ssb.simplitend.databinding.OnboardOneFragmentBinding;
public class OnBoardOne extends Fragment {
// view binding
protected OnboardOneFragmentBinding binding;
public OnBoardOne(){
// required empty constructor
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = OnboardOneFragmentBinding.inflate(inflater, container, false);
return binding.getRoot();
}
}

View File

@@ -0,0 +1,31 @@
package com.ssb.simplitend.welcome.fragments.onboardfragments;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import com.ssb.simplitend.databinding.OnboardOneFragmentBinding;
import com.ssb.simplitend.databinding.OnboardThreeFragmentBinding;
public class OnBoardThree extends Fragment {
// view binding
protected OnboardThreeFragmentBinding binding;
public OnBoardThree(){
// required empty constructor
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = OnboardThreeFragmentBinding.inflate(inflater, container, false);
return binding.getRoot();
}
}

View File

@@ -0,0 +1,31 @@
package com.ssb.simplitend.welcome.fragments.onboardfragments;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import com.ssb.simplitend.databinding.OnboardOneFragmentBinding;
import com.ssb.simplitend.databinding.OnboardTwoFragmentBinding;
public class OnBoardTwo extends Fragment {
// view binding
protected OnboardTwoFragmentBinding binding;
public OnBoardTwo(){
// required empty constructor
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = OnboardTwoFragmentBinding.inflate(inflater, container, false);
return binding.getRoot();
}
}

View File

@@ -0,0 +1,44 @@
package com.ssb.simplitend.welcome.fragments.register;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.navigation.Navigation;
import com.ssb.simplitend.R;
import com.ssb.simplitend.databinding.CreatePinFragmentBinding;
public class CreatePinFragment extends Fragment {
// view binding
protected CreatePinFragmentBinding binding;
public CreatePinFragment(){
// required empty const.
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = CreatePinFragmentBinding.inflate(inflater, container, false);
clickEvents();
return binding.getRoot();
}
private void clickEvents() {
binding.backBtn.setOnClickListener(v -> Navigation.findNavController(v).popBackStack());
binding.setPin.setOnClickListener(v ->
Navigation.findNavController(v).navigate(R.id.action_createPinFragment_to_thankYouFragment)
);
}
}

View File

@@ -0,0 +1,34 @@
package com.ssb.simplitend.welcome.fragments.register;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.navigation.Navigation;
import com.ssb.simplitend.R;
import com.ssb.simplitend.databinding.HowToSetUpFragmentBinding;
public class HowToSetUpFragment extends Fragment {
// view binding
protected HowToSetUpFragmentBinding binding;
public HowToSetUpFragment(){
// required empty const.
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = HowToSetUpFragmentBinding.inflate(inflater, container, false);
binding.nextBtn.setOnClickListener(v -> Navigation.findNavController(v).navigate(R.id.action_howToSetUpFragment_to_registerFragment));
return binding.getRoot();
}
}

View File

@@ -0,0 +1,44 @@
package com.ssb.simplitend.welcome.fragments.register;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.navigation.Navigation;
import com.ssb.simplitend.R;
import com.ssb.simplitend.databinding.LocationFragmentBinding;
public class LocationFragment extends Fragment {
// view binding
protected LocationFragmentBinding binding;
public LocationFragment(){
// required empty const.
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = LocationFragmentBinding.inflate(inflater, container, false);
clickEvents();
return binding.getRoot();
}
private void clickEvents() {
binding.backBtn.setOnClickListener(v -> Navigation.findNavController(v).popBackStack());
binding.submit.setOnClickListener(v ->
Navigation.findNavController(v).navigate(R.id.action_locationFragment_to_createPinFragment)
);
}
}

View File

@@ -0,0 +1,42 @@
package com.ssb.simplitend.welcome.fragments.register;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.navigation.Navigation;
import com.ssb.simplitend.R;
import com.ssb.simplitend.databinding.RegisterFragmentBinding;
public class RegisterFragment extends Fragment {
protected RegisterFragmentBinding binding;
public RegisterFragment(){
// required empty const.
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = RegisterFragmentBinding.inflate(inflater, container, false);
clickEvents();
return binding.getRoot();
}
private void clickEvents() {
binding.backBtn.setOnClickListener(v -> Navigation.findNavController(v).popBackStack());
binding.nextBtn.setOnClickListener(v ->
Navigation.findNavController(v).navigate(R.id.action_registerFragment_to_locationFragment));
}
}

View File

@@ -0,0 +1,54 @@
package com.ssb.simplitend.welcome.fragments.register;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.navigation.Navigation;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.squareup.picasso.Picasso;
import com.ssb.simplitend.R;
import com.ssb.simplitend.databinding.LocationFragmentBinding;
import com.ssb.simplitend.databinding.ThankYouFragmentBinding;
public class ThankYouFragment extends Fragment {
// view binding
protected ThankYouFragmentBinding binding;
public ThankYouFragment(){
// required empty const.
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = ThankYouFragmentBinding.inflate(inflater, container, false);
initializeViews(savedInstanceState);
clickEvents();
return binding.getRoot();
}
private void initializeViews(Bundle savedInstanceState) {
}
private void clickEvents() {
binding.backBtn.setOnClickListener(v -> Navigation.findNavController(v).popBackStack());
binding.proceed.setOnClickListener(v ->
Navigation.findNavController(v).navigate(R.id.action_thankYouFragment_to_contactListFragment)
);
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_user_outline_bg"/>
<item android:drawable="@drawable/ic_dob_outline"
android:gravity="center"
/>
</layer-list>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_user_outline_bg"/>
<item android:drawable="@drawable/ic_email_outline"
android:gravity="center"
/>
</layer-list>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_user_outline_bg"/>
<item android:drawable="@drawable/ic_phone_outline"
android:gravity="center"
/>
</layer-list>

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@@ -0,0 +1,30 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
<aapt:attr name="android:fillColor">
<gradient
android:endX="85.84757"
android:endY="92.4963"
android:startX="42.9492"
android:startY="49.59793"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
android:strokeWidth="1"
android:strokeColor="#00000000" />
</vector>

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="ring"
android:thickness="5dp"
android:innerRadius="0dp"
android:useLevel="false">
<solid android:color="@color/color_accent"/>
</shape>

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

View File

@@ -0,0 +1,13 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="12.414dp"
android:height="22.828dp"
android:viewportWidth="12.414"
android:viewportHeight="22.828">
<path
android:pathData="M11,21.414 L1,11.414 11,1.414"
android:strokeLineJoin="round"
android:strokeWidth="2"
android:fillColor="#00000000"
android:strokeColor="#000"
android:strokeLineCap="round"/>
</vector>

View File

@@ -0,0 +1,23 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="25dp"
android:height="25dp"
android:viewportWidth="25"
android:viewportHeight="25">
<path
android:pathData="M3,0L22,0A3,3 0,0 1,25 3L25,22A3,3 0,0 1,22 25L3,25A3,3 0,0 1,0 22L0,3A3,3 0,0 1,3 0z"
android:strokeWidth="1"
android:fillColor="#fff"
android:strokeColor="#00000000"/>
<path
android:pathData="M3,0.5L22,0.5A2.5,2.5 0,0 1,24.5 3L24.5,22A2.5,2.5 0,0 1,22 24.5L3,24.5A2.5,2.5 0,0 1,0.5 22L0.5,3A2.5,2.5 0,0 1,3 0.5z"
android:strokeWidth="1"
android:fillColor="#00000000"
android:strokeColor="#c9e0fb"/>
<path
android:pathData="M18.465,8.898l-8.2,8.2L6.535,13.372"
android:strokeLineJoin="round"
android:strokeWidth="1"
android:fillColor="#00000000"
android:strokeColor="#2c2c2c"
android:strokeLineCap="round"/>
</vector>

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid
android:color="#EBF3FC"/>
<corners
android:radius="10dp"/>
<stroke android:width="1dp"
android:color="#C9E0FB"/>
</shape>

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/white"/>
<stroke android:color="#C9E0FB"
android:width="1dp"/>
<corners android:radius="5dp"/>
</shape>

View File

@@ -0,0 +1,16 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="20dp"
android:height="20dp"
android:viewportWidth="20"
android:viewportHeight="20">
<path
android:pathData="M20,10A10,10 0,1 1,10 0,10 10,0 0,1 20,10Z"
android:fillColor="#008f5d"/>
<path
android:pathData="M15.556,6.667l-7.778,7.778L4.444,11.111"
android:strokeLineJoin="round"
android:strokeWidth="1.5"
android:fillColor="#00000000"
android:strokeColor="#fff"
android:strokeLineCap="round"/>
</vector>

View File

@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="60dp"
android:height="60dp"
android:viewportWidth="60"
android:viewportHeight="60">
<path
android:pathData="M30,30m-30,0a30,30 0,1 1,60 0a30,30 0,1 1,-60 0"
android:fillColor="#aee0ff"/>
</vector>

View File

@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="35dp"
android:height="35dp"
android:viewportWidth="35"
android:viewportHeight="35">
<path
android:pathData="M21.135,24.433a6.671,6.671 0,0 0,6.542 -6.793,6.671 6.671,0 0,0 -6.542,-6.793 6.671,6.671 0,0 0,-6.542 6.793A6.678,6.678 0,0 0,21.135 24.433ZM21.135,12.357a5.188,5.188 0,0 1,5.088 5.283,5.091 5.091,0 1,1 -10.176,0 5.194,5.194 0,0 1,5.088 -5.283ZM11.686,12.357L5.871,12.357v-1.51h5.815ZM17.501,28.957L17.501,27.452L30.584,27.452a1.484,1.484 0,0 0,1.454 -1.51v-15.1a1.484,1.484 0,0 0,-1.454 -1.51L28.403,9.332a2.227,2.227 0,0 1,-2.181 -2.264,0.741 0.741,0 0,0 -0.727,-0.755L16.774,6.313a0.741,0.741 0,0 0,-0.727 0.755,2.227 2.227,0 0,1 -2.181,2.264L10.232,9.332L10.232,7.828L7.325,7.828v1.51L4.417,9.338a1.484,1.484 0,0 0,-1.454 1.51L2.963,22.924L1.51,22.924L1.51,10.847A2.968,2.968 0,0 1,4.417 7.828L5.871,7.828L5.871,6.319h5.815v1.51h2.181a0.741,0.741 0,0 0,0.727 -0.755A2.227,2.227 0,0 1,16.774 4.809h8.722a2.227,2.227 0,0 1,2.181 2.264,0.741 0.741,0 0,0 0.727,0.755h2.181a2.968,2.968 0,0 1,2.907 3.019v15.1a2.968,2.968 0,0 1,-2.907 3.019ZM8.779,33.487L7.325,33.487v-6.04L1.51,27.447L1.51,25.943L7.325,25.943L7.325,19.909L8.778,19.909v6.038h5.815v1.508L8.778,27.455Z"
android:fillColor="#005f9a"/>
</vector>

View File

@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#000000"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M4,8h4L8,4L4,4v4zM10,20h4v-4h-4v4zM4,20h4v-4L4,16v4zM4,14h4v-4L4,10v4zM10,14h4v-4h-4v4zM16,4v4h4L20,4h-4zM10,8h4L14,4h-4v4zM16,14h4v-4h-4v4zM16,20h4v-4h-4v4z"/>
</vector>

View File

@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#000000"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M19,4h-1V2h-2v2H8V2H6v2H5C3.89,4 3.01,4.9 3.01,6L3,20c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2V6C21,4.9 20.1,4 19,4zM19,20H5V10h14V20zM9,14H7v-2h2V14zM13,14h-2v-2h2V14zM17,14h-2v-2h2V14zM9,18H7v-2h2V18zM13,18h-2v-2h2V18zM17,18h-2v-2h2V18z"/>
</vector>

View File

@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#000000"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M13,8c0,-2.21 -1.79,-4 -4,-4S5,5.79 5,8s1.79,4 4,4S13,10.21 13,8zM11,8c0,1.1 -0.9,2 -2,2S7,9.1 7,8s0.9,-2 2,-2S11,6.9 11,8zM1,18v2h16v-2c0,-2.66 -5.33,-4 -8,-4S1,15.34 1,18zM3,18c0.2,-0.71 3.3,-2 6,-2c2.69,0 5.78,1.28 6,2H3zM20,15v-3h3v-2h-3V7h-2v3h-3v2h3v3H20z"/>
</vector>

View File

@@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="20dp"
android:height="20dp"
android:viewportWidth="20"
android:viewportHeight="20">
<path
android:pathData="M19.333,2.669L13.267,2.669a3.333,3.333 0,0 0,-6.533 0L0.667,2.669a0.667,0.667 0,1 0,0 1.333L19.333,4.002a0.667,0.667 0,1 0,0 -1.333ZM10,1.336a2,2 0,0 1,1.88 1.333L8.12,2.669A2,2 0,0 1,10 1.336ZM16.92,5.389a0.665,0.665 0,1 0,0.413 0.613,0.7 0.7,0 0,0 -0.193,-0.473A0.667,0.667 0,0 0,16.92 5.389ZM16.667,8.002a0.667,0.667 0,0 0,-0.667 0.667v2a0.667,0.667 0,0 0,1.333 0v-2A0.667,0.667 0,0 0,16.667 8.002ZM16.667,12.668a0.667,0.667 0,0 0,-0.667 0.667L16,18a0.667,0.667 0,0 1,-0.667 0.667L4.667,18.667A0.667,0.667 0,0 1,4 18v-12a0.667,0.667 0,0 0,-1.333 0v12a2,2 0,0 0,2 2L15.333,20a2,2 0,0 0,2 -2L17.333,13.334A0.667,0.667 0,0 0,16.667 12.668Z"
android:fillColor="#231815"/>
<path
android:pathData="M7.31,15.364v-8.746a0.673,0.673 0,0 0,-1.346 0v8.746a0.673,0.673 0,0 0,1.346 0ZM10.674,15.364v-8.746a0.673,0.673 0,0 0,-1.345 0v8.746a0.673,0.673 0,0 0,1.345 0ZM14.038,15.364v-8.746a0.673,0.673 0,0 0,-1.345 0v8.746a0.673,0.673 0,0 0,1.345 0Z"
android:fillColor="#231815"/>
</vector>

View File

@@ -0,0 +1,34 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="21dp"
android:height="21dp"
android:viewportWidth="21"
android:viewportHeight="21">
<path
android:pathData="M2.5,3.5L18.5,3.5A2,2 0,0 1,20.5 5.5L20.5,18.5A2,2 0,0 1,18.5 20.5L2.5,20.5A2,2 0,0 1,0.5 18.5L0.5,5.5A2,2 0,0 1,2.5 3.5z"
android:strokeLineJoin="round"
android:strokeWidth="1"
android:fillColor="#00000000"
android:strokeColor="#5b5b5b"
android:strokeLineCap="round"/>
<path
android:pathData="M15.163,0.5L15.163,5.467"
android:strokeLineJoin="round"
android:strokeWidth="1"
android:fillColor="#00000000"
android:strokeColor="#5b5b5b"
android:strokeLineCap="round"/>
<path
android:pathData="M6.365,0.5L6.365,5.467"
android:strokeLineJoin="round"
android:strokeWidth="1"
android:fillColor="#00000000"
android:strokeColor="#5b5b5b"
android:strokeLineCap="round"/>
<path
android:pathData="M0.5,9.978L20.203,9.978"
android:strokeLineJoin="round"
android:strokeWidth="1"
android:fillColor="#00000000"
android:strokeColor="#5b5b5b"
android:strokeLineCap="round"/>
</vector>

View File

@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#000000"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M9,16.2L4.8,12l-1.4,1.4L9,19 21,7l-1.4,-1.4L9,16.2z"/>
</vector>

View File

@@ -0,0 +1,27 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="21.5dp"
android:height="21.5dp"
android:viewportWidth="21.5"
android:viewportHeight="21.5">
<path
android:pathData="M12.626,2.277 L3.949,11.498A3.242,3.242 0,0 0,3.239 13.016l-0.391,3.438a1.617,1.617 0,0 0,1.976 1.878l3.4,-0.584a3.031,3.031 0,0 0,1.469 -0.8l8.677,-9.221c1.5,-1.592 2.177,-3.406 -0.159,-5.624C15.892,-0.089 14.127,0.689 12.626,2.277Z"
android:strokeLineJoin="round"
android:strokeWidth="1.5"
android:fillColor="#00000000"
android:strokeColor="#131313"
android:strokeLineCap="round"/>
<path
android:pathData="M11.715,4.427a5.324,5.324 0,0 0,4.622 4.608"
android:strokeLineJoin="round"
android:strokeWidth="1.5"
android:fillColor="#00000000"
android:strokeColor="#131313"
android:strokeLineCap="round"/>
<path
android:pathData="M0.75,20.75L20.75,20.75"
android:strokeLineJoin="round"
android:strokeWidth="1.5"
android:fillColor="#00000000"
android:strokeColor="#131313"
android:strokeLineCap="round"/>
</vector>

Some files were not shown because too many files have changed in this diff Show More