├── app
├── .gitignore
├── app-release.apk
├── src
│ ├── main
│ │ ├── res
│ │ │ ├── drawable-hdpi
│ │ │ │ ├── ic_add.png
│ │ │ │ ├── ic_check.png
│ │ │ │ ├── ic_error.png
│ │ │ │ ├── ic_save.png
│ │ │ │ ├── ic_file_upload.png
│ │ │ │ ├── ic_account_circle.png
│ │ │ │ ├── ic_action_database.png
│ │ │ │ ├── ic_play_for_work.png
│ │ │ │ ├── ic_system_update_alt.png
│ │ │ │ └── ic_action_calendar_day.png
│ │ │ ├── drawable-mdpi
│ │ │ │ ├── ic_add.png
│ │ │ │ ├── ic_check.png
│ │ │ │ ├── ic_error.png
│ │ │ │ ├── ic_save.png
│ │ │ │ ├── ic_file_upload.png
│ │ │ │ ├── ic_account_circle.png
│ │ │ │ ├── ic_action_database.png
│ │ │ │ ├── ic_play_for_work.png
│ │ │ │ ├── ic_system_update_alt.png
│ │ │ │ └── ic_action_calendar_day.png
│ │ │ ├── drawable-xhdpi
│ │ │ │ ├── ic_add.png
│ │ │ │ ├── ic_save.png
│ │ │ │ ├── ic_check.png
│ │ │ │ ├── ic_error.png
│ │ │ │ ├── ic_file_upload.png
│ │ │ │ ├── ic_account_circle.png
│ │ │ │ ├── ic_play_for_work.png
│ │ │ │ ├── ic_action_database.png
│ │ │ │ ├── ic_action_calendar_day.png
│ │ │ │ └── ic_system_update_alt.png
│ │ │ ├── drawable-xxhdpi
│ │ │ │ ├── ic_add.png
│ │ │ │ ├── ic_check.png
│ │ │ │ ├── ic_error.png
│ │ │ │ ├── ic_save.png
│ │ │ │ ├── ic_file_upload.png
│ │ │ │ ├── ic_play_for_work.png
│ │ │ │ ├── ic_account_circle.png
│ │ │ │ ├── ic_action_database.png
│ │ │ │ ├── ic_system_update_alt.png
│ │ │ │ └── ic_action_calendar_day.png
│ │ │ ├── drawable-xxxhdpi
│ │ │ │ ├── ic_add.png
│ │ │ │ ├── ic_save.png
│ │ │ │ ├── ic_check.png
│ │ │ │ ├── ic_error.png
│ │ │ │ ├── ic_file_upload.png
│ │ │ │ ├── ic_account_circle.png
│ │ │ │ ├── ic_play_for_work.png
│ │ │ │ ├── ic_action_database.png
│ │ │ │ ├── ic_system_update_alt.png
│ │ │ │ └── ic_action_calendar_day.png
│ │ │ ├── mipmap-hdpi
│ │ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-mdpi
│ │ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xhdpi
│ │ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xxxhdpi
│ │ │ │ └── ic_launcher.png
│ │ │ ├── values
│ │ │ │ ├── ids.xml
│ │ │ │ ├── colors.xml
│ │ │ │ ├── dimens.xml
│ │ │ │ ├── drawables.xml
│ │ │ │ ├── styles.xml
│ │ │ │ └── strings.xml
│ │ │ ├── xml
│ │ │ │ └── file_paths.xml
│ │ │ ├── drawable
│ │ │ │ ├── border.xml
│ │ │ │ └── side_nav_bar.xml
│ │ │ ├── drawable-v21
│ │ │ │ ├── ic_menu_send.xml
│ │ │ │ ├── ic_menu_slideshow.xml
│ │ │ │ ├── ic_menu_gallery.xml
│ │ │ │ ├── ic_menu_manage.xml
│ │ │ │ ├── ic_menu_camera.xml
│ │ │ │ └── ic_menu_share.xml
│ │ │ ├── values-v21
│ │ │ │ └── styles.xml
│ │ │ ├── menu
│ │ │ │ ├── main.xml
│ │ │ │ └── activity_main_drawer.xml
│ │ │ ├── values-w820dp
│ │ │ │ └── dimens.xml
│ │ │ ├── layout
│ │ │ │ ├── fragment_next_rents.xml
│ │ │ │ ├── fragment_blank.xml
│ │ │ │ ├── fragment_order_car_available.xml
│ │ │ │ ├── activity_main.xml
│ │ │ │ ├── item_photo.xml
│ │ │ │ ├── fragment_my_account.xml
│ │ │ │ ├── content_main.xml
│ │ │ │ ├── nav_header_main.xml
│ │ │ │ ├── item_car.xml
│ │ │ │ ├── fragment_manage_db.xml
│ │ │ │ ├── app_bar_main.xml
│ │ │ │ ├── fragment_order.xml
│ │ │ │ ├── fragment_order_dates.xml
│ │ │ │ ├── fragment_order_details.xml
│ │ │ │ ├── fragment_cars_list.xml
│ │ │ │ ├── item_rent.xml
│ │ │ │ ├── fragment_customer_details_edit.xml
│ │ │ │ ├── fragment_add_car.xml
│ │ │ │ ├── fragment_add_tarrif.xml
│ │ │ │ └── activity_car.xml
│ │ │ └── values-iw
│ │ │ │ └── strings.xml
│ │ ├── java
│ │ │ └── rothkoff
│ │ │ │ └── baruch
│ │ │ │ └── cars
│ │ │ │ ├── carslist
│ │ │ │ ├── ForCarsPager.java
│ │ │ │ └── CarsPagerAdapter.java
│ │ │ │ ├── ForUseMainActivity.java
│ │ │ │ ├── TarrifsAdapter.java
│ │ │ │ ├── MyFragment.java
│ │ │ │ ├── RentsAdapter.java
│ │ │ │ ├── CarHolder.java
│ │ │ │ ├── RentHolder.java
│ │ │ │ ├── order
│ │ │ │ ├── OrderDetailsFragment.java
│ │ │ │ ├── CarAvailableFragment.java
│ │ │ │ ├── MainOrderFragment.java
│ │ │ │ └── DatesFragment.java
│ │ │ │ ├── PhotosAdapter.java
│ │ │ │ ├── Tarrif.java
│ │ │ │ ├── MyAccountFragment.java
│ │ │ │ ├── UploadService.java
│ │ │ │ ├── PhotoHolder.java
│ │ │ │ ├── ManageDBFragment.java
│ │ │ │ ├── B.java
│ │ │ │ ├── BlankFragment.java
│ │ │ │ ├── Customer.java
│ │ │ │ ├── NextRentsFragment.java
│ │ │ │ ├── OrderFragment.java
│ │ │ │ ├── Rent.java
│ │ │ │ ├── Car.java
│ │ │ │ ├── AddCarFragment.java
│ │ │ │ ├── CustomerDetailsEditFragment.java
│ │ │ │ ├── AddTarrifFragment.java
│ │ │ │ └── MyUploadService.java
│ │ └── AndroidManifest.xml
│ ├── test
│ │ └── java
│ │ │ └── rothkoff
│ │ │ └── baruch
│ │ │ └── cars
│ │ │ └── ExampleUnitTest.java
│ └── androidTest
│ │ └── java
│ │ └── rothkoff
│ │ └── baruch
│ │ └── cars
│ │ └── ApplicationTest.java
├── proguard-rules.pro
├── build.gradle
└── google-services.json
├── settings.gradle
├── .gitattributes
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── .idea
├── copyright
│ └── profiles_settings.xml
├── vcs.xml
├── modules.xml
├── runConfigurations.xml
├── compiler.xml
├── gradle.xml
└── misc.xml
├── .gitignore
├── bitbucket-pipelines.yml
├── gradle.properties
├── gradlew.bat
└── gradlew
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
--------------------------------------------------------------------------------
/app/app-release.apk:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/baruchiro/Cars/master/app/app-release.apk
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | *.java filter=lfs diff=lfs merge=lfs -text
2 | *.xml filter=lfs diff=lfs merge=lfs -text
3 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/baruchiro/Cars/master/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/.idea/copyright/profiles_settings.xml:
--------------------------------------------------------------------------------
1 |
create custom PagerAdapter for show Cars in One Fragment and Tab for Tarrif
22 | * 23 | *Fragment or Activity that want to show this ViewPager 24 | * , must implement "ForCarsAvailable". 25 | * mainFragment Parameter should be 'this' (Fragment or Activity).
26 | * 27 | * @param fm Fragment Manager (Child) 28 | * @param mainFragment Object implement ForCarsAvailable 29 | * @param tarrifsUid The uid of Tarrifs that you want to show 30 | */ 31 | public CarsPagerAdapter(FragmentManager fm, 32 | ForCarsPager mainFragment, 33 | List10 | * this Method get two Calendar objects and check if his date (31/12/2016) is compering 11 | *
12 | * @param oneCal Calendar Object 13 | * @param twoCal Calendar object 14 | * @return 'true' if Day, Month, Year is ==. else false. 15 | */ 16 | public static boolean CompareWithYearMonthDay(Calendar oneCal, Calendar twoCal) { 17 | return 18 | oneCal.get(Calendar.DAY_OF_MONTH) == twoCal.get(Calendar.DAY_OF_MONTH) 19 | && oneCal.get(Calendar.MONTH) == twoCal.get(Calendar.MONTH) 20 | && oneCal.get(Calendar.YEAR) == twoCal.get(Calendar.YEAR); 21 | } 22 | 23 | public static Calendar getCalenderWithOnlyDate(Calendar calendar) { 24 | calendar.set(Calendar.HOUR_OF_DAY, 0); 25 | calendar.set(Calendar.MINUTE, 0); 26 | calendar.set(Calendar.SECOND, 0); 27 | calendar.set(Calendar.MILLISECOND, 0); 28 | return calendar; 29 | } 30 | 31 | public static long getLongWithOnlyDate(long date){ 32 | Calendar c = Calendar.getInstance(); 33 | c.setTimeInMillis(date); 34 | return getCalenderWithOnlyDate(c).getTimeInMillis(); 35 | } 36 | 37 | public static double getNumberOfDays(Calendar dateStart, Calendar dateEnd) { 38 | return (dateEnd.getTimeInMillis() - dateStart.getTimeInMillis()) / Constants.DAY_IN_MILISECONDS + 1; 39 | } 40 | 41 | public static final class Keys { 42 | public static final String CARS = "cars"; 43 | public static final String CUSTOMERS ="customers"; 44 | public static final String FIRST_NAME = "firstName"; 45 | public static final String LAST_NAME ="lastName"; 46 | public static final String DATE_OF_BIRTH ="dateOfBirth"; 47 | public static final String UID = "uid"; 48 | public static final String ID_NUMBER = "IDnumber"; 49 | public static final String CAR_NUMBER = "carNumber"; 50 | public static final String BRAND = "brand"; 51 | public static final String COLOR = "color"; 52 | public static final String IS_YOUNG = "isYoung"; 53 | public static final String SIZE = "size"; 54 | public static final String PARK_LOCATION = "parkLocation"; 55 | public static final String TARIFF_UID = "tariffUid"; 56 | public static final String CUSTOMER = "CUSTOMER"; 57 | 58 | public static final String TARIFFS = "tariffs"; 59 | public static final String NAME = "name"; 60 | public static final String PRICE = "price"; 61 | public static final String SEAT_COUNT = "seatCount"; 62 | public static final String ENGINE_CAPACITY = "engineCapacity"; 63 | public static final String YOUNG_PRICE = "youngPrice"; 64 | public static final String RENTS = "rents"; 65 | public static final String DATE_START = "dateStart"; 66 | public static final String IMAGES = "images"; 67 | public static final String MAKOT = "makot"; 68 | public static final String PDF = "pdf"; 69 | public static final String VERSION = "version"; 70 | } 71 | 72 | public class Constants { 73 | public static final String mainPreference="rothkoff.baruch.cars.MAIN_PREFERENCE"; 74 | public static final String FIRST_LAUNCH = "rothkoff.baruch.cars.MAIN_PREFERENCE.FIRST_LAUNCH"; 75 | public static final String ANY_FRAGMENT = "rothkoff.baruch.cars.ANY_FRAGMENT"; 76 | public static final long YEAR_IN_MILISECONDS = 31556952000L; 77 | public static final long DAY_IN_MILISECONDS = 86400000L; 78 | public static final java.lang.String FRAGMENT_TITLE = "rothkoff.baruch.cars.FRAGMENT_TITLE"; 79 | public static final int YOUNG_AGE = 24; 80 | public static final String FIREBASE_STORAGE_URL = "https://firebasestorage.googleapis.com/v0/b/cars-ab1f8.appspot.com/o/"; 81 | //"gs://cars-ab1f8.appspot.com"; 82 | //public static final String FIREBASE_FOLDER = "%2F"; 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /app/src/main/java/rothkoff/baruch/cars/BlankFragment.java: -------------------------------------------------------------------------------- 1 | package rothkoff.baruch.cars; 2 | 3 | import android.content.Context; 4 | import android.net.Uri; 5 | import android.os.Bundle; 6 | import android.support.v4.app.Fragment; 7 | import android.view.LayoutInflater; 8 | import android.view.View; 9 | import android.view.ViewGroup; 10 | 11 | 12 | /** 13 | * A simple {@link Fragment} subclass. 14 | * Activities that contain this fragment must implement the 15 | * {@link BlankFragment.OnFragmentInteractionListener} interface 16 | * to handle interaction events. 17 | * Use the {@link BlankFragment#newInstance} factory method to 18 | * create an instance of this fragment. 19 | */ 20 | public class BlankFragment extends Fragment { 21 | // TODO: Rename parameter arguments, choose names that match 22 | // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER 23 | private static final String ARG_PARAM1 = "param1"; 24 | private static final String ARG_PARAM2 = "param2"; 25 | 26 | // TODO: Rename and change types of parameters 27 | private String mParam1; 28 | private String mParam2; 29 | 30 | private OnFragmentInteractionListener mListener; 31 | 32 | public BlankFragment() { 33 | // Required empty public constructor 34 | } 35 | 36 | /** 37 | * Use this factory method to create a new instance of 38 | * this fragment using the provided parameters. 39 | * 40 | * @param param1 Parameter 1. 41 | * @param param2 Parameter 2. 42 | * @return A new instance of fragment BlankFragment. 43 | */ 44 | // TODO: Rename and change types and number of parameters 45 | public static BlankFragment newInstance(String param1, String param2) { 46 | BlankFragment fragment = new BlankFragment(); 47 | Bundle args = new Bundle(); 48 | args.putString(ARG_PARAM1, param1); 49 | args.putString(ARG_PARAM2, param2); 50 | fragment.setArguments(args); 51 | return fragment; 52 | } 53 | 54 | @Override 55 | public void onCreate(Bundle savedInstanceState) { 56 | super.onCreate(savedInstanceState); 57 | if (getArguments() != null) { 58 | mParam1 = getArguments().getString(ARG_PARAM1); 59 | mParam2 = getArguments().getString(ARG_PARAM2); 60 | } 61 | } 62 | 63 | @Override 64 | public View onCreateView(LayoutInflater inflater, ViewGroup container, 65 | Bundle savedInstanceState) { 66 | // Inflate the layout for this fragment 67 | return inflater.inflate(R.layout.fragment_blank, container, false); 68 | } 69 | 70 | // TODO: Rename method, update argument and hook method into UI event 71 | public void onButtonPressed(Uri uri) { 72 | if (mListener != null) { 73 | mListener.onFragmentInteraction(uri); 74 | } 75 | } 76 | 77 | @Override 78 | public void onAttach(Context context) { 79 | super.onAttach(context); 80 | if (context instanceof OnFragmentInteractionListener) { 81 | mListener = (OnFragmentInteractionListener) context; 82 | } else { 83 | throw new RuntimeException(context.toString() 84 | + " must implement OnFragmentInteractionListener"); 85 | } 86 | } 87 | 88 | @Override 89 | public void onDetach() { 90 | super.onDetach(); 91 | mListener = null; 92 | } 93 | 94 | /** 95 | * This interface must be implemented by activities that contain this 96 | * fragment to allow an interaction in this fragment to be communicated 97 | * to the activity and potentially other fragments contained in that 98 | * activity. 99 | *
100 | * See the Android Training lesson Communicating with Other Fragments for more information.
103 | */
104 | public interface OnFragmentInteractionListener {
105 | // TODO: Update argument type and name
106 | void onFragmentInteraction(Uri uri);
107 | }
108 | }
109 |
--------------------------------------------------------------------------------
/app/src/main/java/rothkoff/baruch/cars/Customer.java:
--------------------------------------------------------------------------------
1 | package rothkoff.baruch.cars;
2 |
3 | import android.content.res.Resources;
4 |
5 | import java.util.Date;
6 | import java.util.HashMap;
7 | import java.util.LinkedList;
8 | import java.util.List;
9 | import java.util.Map;
10 |
11 | public class Customer {
12 | private String uid;
13 | private String IDnumber = "";
14 | private String firstName = "";
15 | private String lastName = "";
16 | private long dateOfBirth = 0L;
17 | private boolean manager = false;
18 | private List
";
129 | etBrand.setHighlightColor(COLOR_ERROR);
130 | }
131 | if (color.matches("")) {
132 | errorMessage += getString(R.string.error_color) + "
";
133 | etColor.setHighlightColor(COLOR_ERROR);
134 | }
135 | if (parkLocation.matches("")) {
136 | errorMessage += getString(R.string.error_parklocation) + "
";
137 | etParkLocation.setHighlightColor(COLOR_ERROR);
138 | }
139 | if (carNumber.matches("")) {
140 | errorMessage += getString(R.string.error_carnumber) + "
";
141 | etCarNumber.setHighlightColor(COLOR_ERROR);
142 | }
143 | if (tarrif==null)
144 | errorMessage += getString(R.string.error_select_tarrif) + "
";
145 |
146 | if (errorMessage.equals("")) {
147 | errorFields.setVisibility(View.GONE);
148 | etBrand.setHighlightColor(COLOR_HEADING);
149 | etColor.setHighlightColor(COLOR_HEADING);
150 | etParkLocation.setHighlightColor(COLOR_HEADING);
151 | etCarNumber.setHighlightColor(COLOR_HEADING);
152 | return true;
153 | }
154 |
155 | errorFields.setVisibility(View.VISIBLE);
156 | errorFields.setText(Html.fromHtml(errorMessage));
157 | return false;
158 | }
159 |
160 | @Override
161 | public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
162 | if (databaseError == null) {
163 | mainActivity.ReplaceFragment(ManageDBFragment.newInstance());
164 | Toast.makeText(getContext(),R.string.success,Toast.LENGTH_LONG).show();
165 | updatingDialog.dismiss();
166 | } else {
167 | updatingDialog.dismiss();
168 | Snackbar.make(fab, R.string.error_when_updating_details, Snackbar.LENGTH_INDEFINITE)
169 | .setAction(R.string.retry, new View.OnClickListener() {
170 | @Override
171 | public void onClick(View view) {
172 | if (Validate()) SaveCarDetails();
173 | }
174 | })
175 | .show();
176 | }
177 | }
178 |
179 | @Override
180 | public void setTitle() {
181 | getActivity().setTitle(R.string.addcar_title);
182 | }
183 |
184 | @Override
185 | public void setDrawerMenuItemChecked(Menu menu) {
186 | menu.findItem(R.id.nav_managedb).setChecked(true);
187 | }
188 |
189 | @Override
190 | public void onItemSelected(AdapterView> adapterView, View view, int i, long l) {
191 | this.tarrif = (Tarrif) adapterView.getSelectedItem();
192 | }
193 |
194 | @Override
195 | public void onNothingSelected(AdapterView> adapterView) {
196 |
197 | }
198 | }
199 |
--------------------------------------------------------------------------------
/app/src/main/java/rothkoff/baruch/cars/CustomerDetailsEditFragment.java:
--------------------------------------------------------------------------------
1 | package rothkoff.baruch.cars;
2 |
3 |
4 | import android.app.DatePickerDialog;
5 | import android.app.ProgressDialog;
6 | import android.os.Bundle;
7 | import android.support.design.widget.FloatingActionButton;
8 | import android.support.design.widget.Snackbar;
9 | import android.support.v4.app.Fragment;
10 | import android.text.Html;
11 | import android.view.LayoutInflater;
12 | import android.view.Menu;
13 | import android.view.View;
14 | import android.view.ViewGroup;
15 | import android.widget.DatePicker;
16 | import android.widget.EditText;
17 | import android.widget.TextView;
18 |
19 | import com.google.firebase.database.DatabaseError;
20 | import com.google.firebase.database.DatabaseReference;
21 | import com.google.firebase.database.FirebaseDatabase;
22 |
23 | import java.text.SimpleDateFormat;
24 | import java.util.Calendar;
25 |
26 |
27 | /**
28 | * A simple {@link Fragment} subclass.
29 | */
30 | public class CustomerDetailsEditFragment extends MyFragment
31 | implements View.OnClickListener, DatabaseReference.CompletionListener,
32 | DatePickerDialog.OnDateSetListener {
33 |
34 | private static int COLOR_ERROR;
35 | private static int COLOR_HEADING;
36 | private ProgressDialog updatingDialog;
37 | private EditText etFirstName, etLastName, etDateOfBirth, etID;
38 | private FloatingActionButton fab;
39 | private TextView errorFields;
40 |
41 | private String errorMessage;
42 | private String firstName;
43 | private String lastName;
44 | private String IDnumber;
45 | private Calendar dateOfBirth;
46 | private SimpleDateFormat simpleDateFormat;
47 | private DatePickerDialog datePickerDialog;
48 |
49 | public CustomerDetailsEditFragment() {
50 | // Required empty public constructor
51 | }
52 |
53 | public static CustomerDetailsEditFragment newInstance() {
54 | CustomerDetailsEditFragment fragment = new CustomerDetailsEditFragment();
55 |
56 | return fragment;
57 | }
58 |
59 | @Override
60 | public View onCreateView(LayoutInflater inflater, ViewGroup container,
61 | Bundle savedInstanceState) {
62 |
63 | View view = inflater.inflate(R.layout.fragment_customer_details_edit, container, false);
64 |
65 | InitMembers(view);
66 | BehaviorMembers();
67 |
68 | return view;
69 | }
70 |
71 | private void InitMembers(View view) {
72 | etFirstName = (EditText) view.findViewById(R.id.frag_details_edit_firstname);
73 | etLastName = (EditText) view.findViewById(R.id.frag_details_edit_lastname);
74 | etDateOfBirth = (EditText) view.findViewById(R.id.frag_details_edit_dateofbirth);
75 | etID = (EditText) view.findViewById(R.id.frag_details_edit_idnumber);
76 | dateOfBirth = Calendar.getInstance();
77 | simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy");
78 | datePickerDialog =new DatePickerDialog(getContext(),this,0,0,0);
79 |
80 | errorFields = (TextView) view.findViewById(R.id.frag_details_error);
81 |
82 | fab = (FloatingActionButton) view.findViewById(R.id.frag_details_fab);
83 |
84 | updatingDialog = new ProgressDialog(getContext());
85 | }
86 |
87 | private void BehaviorMembers() {
88 | if (B.customer.getDateOfBirth()==0L) dateOfBirth.add(Calendar.YEAR,-18);
89 | else dateOfBirth.setTimeInMillis(B.customer.getDateOfBirth());
90 |
91 | DateMembers(dateOfBirth.get(Calendar.YEAR),
92 | dateOfBirth.get(Calendar.MONTH),
93 | dateOfBirth.get(Calendar.DAY_OF_MONTH));
94 |
95 | etFirstName.setText(B.customer.getFirstName());
96 | etLastName.setText(B.customer.getLastName());
97 | etID.setText(B.customer.getIDnumber());
98 |
99 | etDateOfBirth.setText(simpleDateFormat.format(dateOfBirth.getTime()));
100 | etDateOfBirth.setOnFocusChangeListener(new View.OnFocusChangeListener() {
101 | @Override
102 | public void onFocusChange(View view, boolean b) {
103 | if (b) {
104 | if (!datePickerDialog.isShowing()) datePickerDialog.show();
105 | } else {
106 | if (datePickerDialog.isShowing()) datePickerDialog.dismiss();
107 | }
108 | }
109 | });
110 |
111 | errorFields.setTextColor(COLOR_ERROR);
112 |
113 | fab.setOnClickListener(this);
114 |
115 | updatingDialog.setMessage(getString(R.string.send_data_to_server));
116 | }
117 |
118 | private void DateMembers(int year,int month,int day){
119 | datePickerDialog.updateDate(year, month, day);
120 | dateOfBirth.set(year, month, day);
121 | etDateOfBirth.setText(simpleDateFormat.format(dateOfBirth.getTime()));
122 | }
123 |
124 | @Override
125 | public void onClick(View view) {
126 | if (Validate()) SaveCustomerDetails();
127 | }
128 |
129 | private void SaveCustomerDetails() {
130 | updatingDialog.show();
131 |
132 | B.customer.setFirstName(firstName);
133 | B.customer.setLastName(lastName);
134 | B.customer.setDateOfBirth(dateOfBirth.getTimeInMillis());
135 | B.customer.setIDnumber(IDnumber);
136 |
137 | FirebaseDatabase.getInstance().getReference(B.Keys.CUSTOMERS).child(B.customer.getUid())
138 | .updateChildren(B.customer.getMapForUpdate(), this);
139 | updatingDialog.setMessage(getString(R.string.wait_to_ok_from_server));
140 | }
141 |
142 | private boolean Validate() {
143 | errorMessage = "";
144 | firstName = etFirstName.getText().toString();
145 | lastName = etLastName.getText().toString();
146 | IDnumber = etID.getText().toString();
147 | Calendar age18 = Calendar.getInstance();
148 | age18.add(Calendar.YEAR,-18);
149 |
150 | if (firstName.matches("")) {
151 | errorMessage += getString(R.string.error_firstname) + "
";
152 | etFirstName.setHighlightColor(COLOR_ERROR);
153 | }
154 | if (lastName.matches("")) {
155 | errorMessage += getString(R.string.error_lastname) + "
";
156 | etLastName.setHighlightColor(COLOR_ERROR);
157 | }
158 | if (dateOfBirth.compareTo(age18)>0){
159 | errorMessage+=getString(R.string.error_age)+"
";
160 | etDateOfBirth.setHighlightColor(COLOR_ERROR);
161 | }
162 | if (IDnumber.matches("")) {
163 | errorMessage += getString(R.string.error_idnumber) + "
";
164 | etID.setHighlightColor(COLOR_ERROR);
165 | }
166 |
167 | if (errorMessage.equals("")) {
168 | errorFields.setVisibility(View.GONE);
169 | etFirstName.setHighlightColor(COLOR_HEADING);
170 | etLastName.setHighlightColor(COLOR_HEADING);
171 | etID.setHighlightColor(COLOR_HEADING);
172 | etDateOfBirth.setHighlightColor(COLOR_HEADING);
173 | return true;
174 | }
175 |
176 | errorFields.setVisibility(View.VISIBLE);
177 | errorFields.setText(Html.fromHtml(errorMessage));
178 | return false;
179 | }
180 |
181 | @Override
182 | public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
183 | if (databaseError == null) {
184 | mainActivity.ReplaceFragment(MyAccountFragment.newInstance());
185 | updatingDialog.dismiss();
186 | } else {
187 | updatingDialog.dismiss();
188 | Snackbar.make(fab, R.string.error_when_updating_details, Snackbar.LENGTH_INDEFINITE)
189 | .setAction(R.string.retry, new View.OnClickListener() {
190 | @Override
191 | public void onClick(View view) {
192 | if (Validate()) SaveCustomerDetails();
193 | }
194 | })
195 | .show();
196 | }
197 | }
198 |
199 | @Override
200 | public void onDateSet(DatePicker datePicker, int i, int i1, int i2) {
201 | DateMembers(i,i1,i2);
202 | }
203 |
204 | @Override
205 | public void setTitle() {
206 | getActivity().setTitle(R.string.customer_details_edit);
207 | }
208 |
209 | @Override
210 | public void setDrawerMenuItemChecked(Menu menu) {
211 | menu.findItem(R.id.nav_myaccount).setChecked(true);
212 | }
213 | }
214 |
--------------------------------------------------------------------------------
/app/src/main/java/rothkoff/baruch/cars/AddTarrifFragment.java:
--------------------------------------------------------------------------------
1 | package rothkoff.baruch.cars;
2 |
3 |
4 | import android.app.ProgressDialog;
5 | import android.os.Bundle;
6 | import android.support.annotation.NonNull;
7 | import android.support.design.widget.FloatingActionButton;
8 | import android.support.design.widget.Snackbar;
9 | import android.support.v4.app.Fragment;
10 | import android.text.Html;
11 | import android.view.LayoutInflater;
12 | import android.view.Menu;
13 | import android.view.View;
14 | import android.view.ViewGroup;
15 | import android.widget.EditText;
16 | import android.widget.TextView;
17 | import android.widget.Toast;
18 |
19 | import com.google.firebase.database.DatabaseError;
20 | import com.google.firebase.database.DatabaseReference;
21 | import com.google.firebase.database.FirebaseDatabase;
22 |
23 |
24 | /**
25 | * A simple {@link Fragment} subclass.
26 | */
27 | public class AddTarrifFragment extends MyFragment implements DatabaseReference.CompletionListener {
28 | public static final String NEW_TARRIF = "NEW_TARRIF";
29 |
30 | private ProgressDialog updatingDialog;
31 |
32 | private EditText etName, etPrice, etSeatCount, etEngineCapacity, etYoungPrice;
33 | private FloatingActionButton fab;
34 | private TextView errorFields;
35 |
36 | private String uid;
37 | private String name;
38 | private double price;
39 | private int seatCount;
40 | private int engineCapacity;
41 | private double youngPrice;
42 |
43 | public AddTarrifFragment() {
44 | }
45 |
46 | public static AddTarrifFragment newInstance(@NonNull String uid) {
47 | AddTarrifFragment fragment = new AddTarrifFragment();
48 |
49 | Bundle args = new Bundle();
50 | args.putString(B.Keys.UID, uid);
51 | fragment.setArguments(args);
52 |
53 | return fragment;
54 | }
55 |
56 | @Override
57 | public View onCreateView(LayoutInflater inflater, ViewGroup container,
58 | Bundle savedInstanceState) {
59 | View view = inflater.inflate(R.layout.fragment_add_tarrif, container, false);
60 |
61 | InitMembers(view);
62 | BehavoirMembers();
63 |
64 | return view;
65 | }
66 |
67 | private void InitMembers(View view) {
68 | etName = (EditText) view.findViewById(R.id.frag_addtarrif_edit_name);
69 | etPrice = (EditText) view.findViewById(R.id.frag_addtarrif_edit_price);
70 | etSeatCount = (EditText) view.findViewById(R.id.frag_addtarrif_edit_seatcount);
71 | etEngineCapacity = (EditText) view.findViewById(R.id.frag_addtarrif_edit_enginecapacity);
72 | etYoungPrice = (EditText) view.findViewById(R.id.frag_addtarrif_edit_youngPrice);
73 |
74 | errorFields = (TextView) view.findViewById(R.id.frag_addtarrif_error);
75 |
76 | fab = (FloatingActionButton) view.findViewById(R.id.frag_addtarrif_fab);
77 |
78 | updatingDialog = new ProgressDialog(getContext());
79 |
80 | if (getArguments().getString(B.Keys.UID) != null)
81 | uid = getArguments().getString(B.Keys.UID);
82 | else
83 | throw new NullPointerException("Argument 'UID' not found. use static method 'newInstance' to create this fragment");
84 | }
85 |
86 | private void BehavoirMembers() {
87 | errorFields.setTextColor(COLOR_ERROR);
88 | fab.setOnClickListener(new View.OnClickListener() {
89 | @Override
90 | public void onClick(View view) {
91 | updatingDialog.show();
92 | if (Validate()) SaveTarrifDetails();
93 | else updatingDialog.dismiss();
94 | }
95 | });
96 | updatingDialog.setMessage(getString(R.string.send_data_to_server));
97 | }
98 |
99 | private void SaveTarrifDetails() {
100 |
101 | Tarrif tarrif = new Tarrif(name, price, seatCount, engineCapacity, youngPrice);
102 |
103 | if (uid.equals(NEW_TARRIF)) {
104 | uid = FirebaseDatabase.getInstance().getReference(B.Keys.TARIFFS).push().getKey();
105 | tarrif.setUid(uid);
106 | }
107 | FirebaseDatabase.getInstance().getReference(B.Keys.TARIFFS).child(tarrif.getUid())
108 | .updateChildren(tarrif.getMapForUpdate(), this);
109 | updatingDialog.setMessage(getString(R.string.wait_to_ok_from_server));
110 | }
111 |
112 | private boolean Validate() {
113 | String errorMessage = "";
114 | try {
115 | name = etName.getText().toString();
116 |
117 | price = -1;
118 | if (!etPrice.getText().toString().matches("") && etPrice.getText().toString().trim().length() > 0)
119 | price = Double.parseDouble(etPrice.getText().toString());
120 |
121 | seatCount = -1;
122 | if (!etSeatCount.getText().toString().matches("") && etSeatCount.getText().toString().trim().length() > 0)
123 | seatCount = Integer.parseInt(etSeatCount.getText().toString());
124 |
125 | engineCapacity = -1;
126 | if (!etEngineCapacity.getText().toString().matches("") && etEngineCapacity.getText().toString().trim().length() > 0)
127 | engineCapacity = Integer.parseInt(etEngineCapacity.getText().toString());
128 |
129 | youngPrice = -1;
130 | if (!etYoungPrice.getText().toString().matches("") && etYoungPrice.getText().toString().trim().length() > 0)
131 | youngPrice = Double.parseDouble(etYoungPrice.getText().toString());
132 |
133 |
134 | if (name.matches("")) {
135 | errorMessage += getString(R.string.error_name) + "
";
136 | etName.setHighlightColor(COLOR_ERROR);
137 | }
138 | if (price <= 0) {
139 | errorMessage += getString(R.string.error_price) + "
";
140 | etPrice.setHighlightColor(COLOR_ERROR);
141 | }
142 | if (seatCount <= 0) {
143 | errorMessage += getString(R.string.error_seatcount) + "
";
144 | etSeatCount.setHighlightColor(COLOR_ERROR);
145 | }
146 | if (engineCapacity <= 0) {
147 | errorMessage += getString(R.string.error_enginecapacity) + "
";
148 | etEngineCapacity.setHighlightColor(COLOR_ERROR);
149 | }
150 | if (youngPrice < 0) {
151 | errorMessage += getString(R.string.error_youngprice) + "
";
152 | etYoungPrice.setHighlightColor(COLOR_ERROR);
153 | }
154 |
155 | if (errorMessage.equals("")) {
156 | errorFields.setVisibility(View.GONE);
157 | etName.setHighlightColor(COLOR_HEADING);
158 | etPrice.setHighlightColor(COLOR_HEADING);
159 | etSeatCount.setHighlightColor(COLOR_HEADING);
160 | etEngineCapacity.setHighlightColor(COLOR_HEADING);
161 | etYoungPrice.setHighlightColor(COLOR_HEADING);
162 | return true;
163 | }
164 |
165 | errorFields.setVisibility(View.VISIBLE);
166 | errorFields.setText(Html.fromHtml(errorMessage));
167 | return false;
168 |
169 | } catch (NumberFormatException e) {
170 | Snackbar.make(fab, R.string.error_with_some_numbers, Snackbar.LENGTH_LONG).show();
171 | return false;
172 | }
173 | }
174 |
175 | @Override
176 | public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
177 | if (databaseError == null) {
178 | mainActivity.ReplaceFragment(ManageDBFragment.newInstance());
179 | Toast.makeText(getContext(), R.string.success, Toast.LENGTH_LONG).show();
180 | updatingDialog.dismiss();
181 | } else {
182 | updatingDialog.dismiss();
183 | Snackbar.make(fab, R.string.error_when_updating_details, Snackbar.LENGTH_INDEFINITE)
184 | .setAction(R.string.retry, new View.OnClickListener() {
185 | @Override
186 | public void onClick(View view) {
187 | if (Validate()) SaveTarrifDetails();
188 | }
189 | })
190 | .show();
191 | }
192 | }
193 |
194 | @Override
195 | public void setTitle() {
196 | getActivity().setTitle(R.string.addtarrif_title);
197 | }
198 |
199 | @Override
200 | public void setDrawerMenuItemChecked(Menu menu) {
201 | menu.findItem(R.id.nav_managedb).setChecked(true);
202 | }
203 | }
204 |
--------------------------------------------------------------------------------
/app/src/main/java/rothkoff/baruch/cars/MyUploadService.java:
--------------------------------------------------------------------------------
1 | package rothkoff.baruch.cars;
2 |
3 | import android.app.NotificationManager;
4 | import android.app.PendingIntent;
5 | import android.app.Service;
6 | import android.content.Context;
7 | import android.content.Intent;
8 | import android.net.Uri;
9 | import android.os.IBinder;
10 | import android.support.annotation.NonNull;
11 | import android.support.annotation.Nullable;
12 | import android.support.v4.app.NotificationCompat;
13 | import android.support.v4.content.LocalBroadcastManager;
14 | import android.util.Log;
15 |
16 | import com.google.android.gms.tasks.OnFailureListener;
17 | import com.google.android.gms.tasks.OnSuccessListener;
18 | import com.google.firebase.storage.FirebaseStorage;
19 | import com.google.firebase.storage.StorageReference;
20 | import com.google.firebase.storage.UploadTask;
21 |
22 | /**
23 | * Service to handle uploading files to Firebase Storage.
24 | */
25 | public class MyUploadService extends Service {
26 |
27 | /**
28 | * Intent Actions
29 | **/
30 | public static final String ACTION_UPLOAD = "action_upload";
31 | public static final String UPLOAD_COMPLETED = "upload_completed";
32 | public static final String UPLOAD_ERROR = "upload_error";
33 | /**
34 | * Intent Extras
35 | **/
36 | public static final String EXTRA_CAR = "extra_car";
37 | public static final String EXTRA_FILE_URI = "extra_file_uri";
38 | public static final String EXTRA_DOWNLOAD_URL = "extra_download_url";
39 | public static final String EXTRA_DETAILS = "extra_details";
40 | private static final String TAG = "MyUploadService";
41 | private static final int NOTIF_ID_DOWNLOAD = 0;
42 | private int mNumTasks = 0;
43 | // [START declare_ref]
44 | private StorageReference mStorageRef;
45 | // [END declare_ref]
46 |
47 | /*public static IntentFilter getIntentFilter() {
48 | IntentFilter filter = new IntentFilter();
49 | filter.addAction(UPLOAD_COMPLETED);
50 | filter.addAction(UPLOAD_ERROR);
51 |
52 | return filter;
53 | }*/
54 |
55 | @Override
56 | public void onCreate() {
57 | super.onCreate();
58 |
59 | // [START get_storage_ref]
60 | mStorageRef = FirebaseStorage.getInstance().getReference();
61 | // [END get_storage_ref]
62 | }
63 |
64 | @Nullable
65 | @Override
66 | public IBinder onBind(Intent intent) {
67 | return null;
68 | }
69 |
70 | @Override
71 | public int onStartCommand(Intent intent, int flags, int startId) {
72 | Log.d(TAG, "onStartCommand:" + intent + ":" + startId);
73 | if (ACTION_UPLOAD.equals(intent.getAction())) {
74 | Uri fileUri = intent.getParcelableExtra(EXTRA_FILE_URI);
75 | String details = intent.getStringExtra(EXTRA_DETAILS);
76 | Car car = intent.getParcelableExtra(EXTRA_CAR);
77 | uploadFromUri(fileUri, details, car);
78 | }
79 |
80 | return START_REDELIVER_INTENT;
81 | }
82 | // [END upload_from_uri]
83 |
84 | // [START upload_from_uri]
85 | private void uploadFromUri(final Uri fileUri, final String details, final Car car) {
86 | Log.d(TAG, "uploadFromUri:src:" + fileUri.toString());
87 |
88 | // [START_EXCLUDE]
89 | taskStarted();
90 | showUploadProgressNotification();
91 | // [END_EXCLUDE]
92 |
93 | // [START get_child_ref]
94 | // Get a reference to store file at photos/