Professional Documents
Culture Documents
Saas
Saas
Saas
עבודת גמר – תכנון ותכנות מערכות בטלפונים ניידים תחת מערכת הפעלה Android
1
Talentder - אורי ריבלוב
תוכן עניינים
4.................................................................................................................................................. מבוא
4.................................................................................................................................... הרקע לפרויקט
5.............................................................................................................................................. :סקרים
6........................................................................................................................................... :סקר שוק
7........................................................................................................................................... :חידושים
7............................................................................................................................... :אתגרים מרכזיים
8................................................................................................ מבנה הפרויקט \ ארכיטקטורת הפרויקט
9...................................................................................................................................... מסכי פרויקט
9............................................................................................................................ Activity_splash
11 ........................................................................................................................... activity_log_in
13 ......................................................................................................................... activity_sign_up
16 ..............................................................................................................................activity_main
18 ................................................................................................................. activity_profile_page
20 ......................................................................................................... activity_profile_page_edit
24 ............................................................................................................. activity_resume_viewer
25 ................................................................................................ activity_company_Profile_page
27 .................................................................................................. activity_company_profile_edit
30 ......................................................................................................................... activity_add_job
32 ....................................................................................................................... activity_job_view
33 ................................................................................................. activity_company_browse_jobs
35 ..................................................................................................................... chats_users_layout
36 ...................................................................................................................... activity_my_chats
38 .......................................................................................................................... message_layout
39 ............................................................................................................................... activity_chat
42 ................................................................................................................. activity_job_browser
47 .......................................................................................................... activity_internet_problem
48 ........................................................................................................................................... מחלקות
48 .................................................................................................................. ServiceManager.java
2
Talentder - אורי ריבלוב
49 ................................................................................................... NetworkChangeReceiver.java
50 .............................................................................................................................. Message.java
51 ...................................................................................................................................... Job.java
52 .................................................................................................................................... User.java
53 .......................................................................................................................... jobAdapter.java
54 ....................................................................................................................... UserAdapter.java
55 ................................................................................................................. MessageAdapter.java
56 ...................................................................................................................... : קבצים+ בסיס נתונים
56 ..............................................................................................................FireBaseAuthentication
56 ...................................................................................................... FireBase Realtime Database
58 ......................................................................................................................... FireBaseStorage
60 ................................................................................................................................ מדריך למשתמש
66 .......................................................................................................................................... רפלקציה
67 ...................................................................................................................................... ביבליוגרפיה
68 ............................................................................................................................................ נספחים
3
אורי ריבלוב Talentder -
מבוא
מסמך זה יתאר על אופן פיתוח האפליקציה" " Talentderבסביבת אנדרואיד סטודיו .המסמך יכלול את
הפרקים :מבנה הפרויקט ,מדריך למשתמש ,מדריך למתכנת ,מסכי האפליקציה )תיאור והסבר על מטרתם(,
בסיס הנתונים ועל אופן שמירת הנתונים.
הרקע לפרויקט
עם תחילת שנת הלימודים האחרונה שלי ,והצורך להגיש פרויקט בדמות אפליקציית אנדרואיד שתשקף את
הכישורים שלי על מנת לקבל את 5היחידות האלו ,חשבתי על רעיון פשוט.
” “Talentderהיא אפליקציה פשוטה למציאת עבודה .האפלקציה מאפשרת הירשמות קלה למערכת ומרכזת
את כל מקומות העבודה הפוטנציאליים במקום אחד ומקשרת בין מחפשי עבודה למעסיקים באפליקציה
פשוטה וקלה להבנה.
במיוחד לאור מגפת הקורונה אשר פגעה בכולנו בשלוש השנים האחרונות ,הרבה מאוד אנשים לצערנו איבדו
את עבודתם לרבים מאנשים אלו ישנם ילדים והוצאות שוטפות שלא עצרו ולכן בזמן הזה במיוחד האפלקציה
שבניתי תיתן אפשרות לאנשים אלו למצוא עבודה ביעילות ובמהירות.
בנוסף הרבה מאוד בני נוער בגילאי 16-18מחפשים עבודות מזדמנות בכדי לחסוך כסף בחופשים ובסופי שבוע
ומכיוון שרוב בני הנוער נמצאים זמן רב מיומם בטלפון ולכן אני מאמין שאפלקציה למציאת עבודה
תהיה פופולרית במיוחד בקרב בני נוער
4
אורי ריבלוב Talentder -
סקרים:
בשביל לבדוק האם לפרויקט שלי יש ביקוש ערכתי סקר בין חברים ומשפחה שיבדוק ביקוש לאפלציה כמו
שבניתי ,ואלו תוצאות הסקר:
5
אורי ריבלוב Talentder -
רוב מוחלט של הנשאלים בסקר ענו כי הם מחפשים עבודה דרך האינטרנט כלומר יש ביקוש לפתרון טכנולוגי
לתהליך מציאת העבודה ,בנוסף כמעט כל המשיבים ענו כי הם מאמינים שיעבדו לפחות בשני עבודות כל
החיים מה שמראה שיש להרבה משתמשים פוטנציאל לחזור לאפלקציה מחדש.
על פי תוצאות הסקר הסקתי שיש שוק לאפלקציה שפיתחתי ושוק חיפוש העבודה הוא שוק גדול.
סקר שוק:
כיום ישנו שוק יחסית גדול של אפלקציות דומות למציאת עבודה:
– AllJobsהאפלקציה המובילה בשוק אך מתמקדת בעיקר באתר ופחות מושקעת באפלקציה -
– Drusimilגם אפלקציה פופולרית מאוד אבל האפלקציה אינה הכי מותאמת מכיוון שהיא האתר -
הרגיל בפורמט טלפוני
- jobnetפחות פופולרית מהשניים האחרות אבל גם עם נתח שוק לא קטן אבל ללא אפלקציה רק -
אתר
מסקנה :קיים שוק גדול וצורך גדול לאפלקציות למציאת עבודה ,אך האפלקציות הנוכחיות אינן נוחות ולא
כולן מותאמות לפורמט טלפוני ולכן יש מקום בשוק לאפלקציה נוספת שתפתור בעיות אלו באפלקציות
הקיימות.
6
אורי ריבלוב Talentder -
חידושים:
ממשק משתמש יפה ,נקי ,אלגנטי והכי חשוב -נוח ואינטואיטיבי לשימוש -
גיבוי וסנכרון אקטיבי )בזמן אמת( עם הענן -
צאט פשוט עם מעסיקים פוטנציאלים -
אפשרות להוציא את העבודות הפוטנציאליות לExcel -
אפשרות להוסיף מסמך קורות חיים לפרופיל -
אתגרים מרכזיים:
פיתוח אפלקציה זאת אינו היה פשוט ,אמנם תרגלנו את המיומניות שקשורות בכתיבת פרויקט במהלך כל
השנה אך לחבר את כל המרכיבים השונים לפרויקט אחד מכיל אינו היה פשוט אך בסופו של דבר אני מאוד
מרוצה מהתוצאה הסופית שיצרתי.
7
Talentder - אורי ריבלוב
8
Talentder - אורי ריבלוב
מימוש הפרויקט
מסכי פרויקט
Activity_splash
המסך הזה הוא המסך הראשון שרואים באפלקציה הוא מסך מעבר ומסך זה נמשך שלוש
.שניות
ולאחר שלוש שניות האפלקציה בודקת האם ישנו מידע שנשמר על ידי המשתמש הקודם
: shared Preference באפלקציה באמצעות
: האפלקציה בודקת האם המידע אינו ריקShared Preference -לאחר קבלת המידע מה
if(!mail.isEmpty()&&!password.isEmpty()&&((ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE)).getNetworkInfo(ConnectivityMa
nager.TYPE_WIFI).isConnected()) {
9
Talentder - אורי ריבלוב
Auth.signInWithEmailAndPassword(mail,
password).addOnCompleteListener(splash.this, new
OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
Intent data = new Intent(getApplicationContext(), Main.class);
data.putExtra("email",mail);
finish();
startActivity(data);
Toast.makeText(getApplicationContext(), " ",
Toast.LENGTH_LONG).show();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
}
});
10
Talentder - אורי ריבלוב
activity_log_in
:המסך כולל
– להכנסת סיסמאEditText
if (view == SignUp) {
Intent i = new Intent(this, sign_up.class);
startActivity(i);
}
11
Talentder - אורי ריבלוב
Auth.signInWithEmailAndPassword(mail, pass).addOnCompleteListener(this, new
OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
Intent data = new Intent(getApplicationContext(),Main.class);
data.putExtra("email", mail);
data.putExtra("password", pass);
finish();
startActivity(data);
Toast.makeText(getApplicationContext(), " ",
Toast.LENGTH_LONG).show();
activity_main – אם תהליך החיבור עובד מעבירים את המשתמש ל
if(stayConnected.isChecked()){
SharedPreferences.Editor editor = sp.edit();
editor.putString("Mail",_mail.getText().toString());
editor.putString("Password",_password.getText().toString());
editor.apply();
}
12
Talentder - אורי ריבלוב
activity_sign_up
פרופיל בסיסי זה כולל מייל סיסמא,באמצעות מסך זה יכול משתמש ליצור לעצמו פרופיל אישי באפלקציה
.ותמונה
:מסך זה כולל
if (view == submit) {
createUser();
}
if(Employer.isChecked()) {
u = new User(userName.getText().toString().toLowerCase(),
Password.getText().toString(), true); }
13
Talentder - אורי ריבלוב
p = new ProgressDialog(this);
p.setMessage("Registration...");
p.show();
if (view == upload_buttun) {
shwoFileChooser();
}
14
Talentder - אורי ריבלוב
firebase Storage - התמונה שנבחרה מהמכשיר נשמרת בButton submit -בנוסף שלוחצים על ה
15
Talentder - אורי ריבלוב
activity_main
:המסך הראשי של האפלקציה אשר כולל
if(view ==Chat){
Intent i = new Intent(this,MyChats.class);
startActivity(i);
}
if(view == Log_Out){
finish();
SharedPreferences settings = getSharedPreferences("details1",0);
settings.edit().remove("Mail").apply();
settings.edit().remove("Password").apply();
Intent i = new Intent(this,splash.class);
startActivity(i);
}
if(view == ExploreJobs){
Intent i = new Intent(this, Job_Browser.class);
startActivity(i);
}
16
Talentder - אורי ריבלוב
:אם המשתמש הנוכחי הואר מעסיק אז, – שמוביל לפרופיל של המשתמש הנוכחיButton
17
Talentder - אורי ריבלוב
activity_profile_page
:מסך פרופיל של משתמש רגיל אשר כולל
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot dataSnapshot:snapshot.getChildren()){
if
((dataSnapshot.child("mail").getValue().toString().toLowerCase()).equals(fire
baseAuth.getCurrentUser().getEmail().toString().toLowerCase())){
phone.setText(dataSnapshot.child("phone_Number").getValue().toString());
CityAndCountry.setText(dataSnapshot.child("cityAndCountry").getValue().toStri
ng());
email.setText(dataSnapshot.child("mail").getValue().toString());
name.setText(dataSnapshot.child("fullName").getValue().toString());
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {}
});
if (view == settings){
Intent i = new Intent(getApplicationContext(),Profile_page_edit.class);
i.putExtra("mail",email.getText().toString());
startActivityForResult(i,1);
}
18
Talentder - אורי ריבלוב
if(view==MyResume){
Intent i = new Intent(this,ResumeViewer.class);
i.putExtra("ResumeEmail",email.getText().toString());
startActivity(i);
}
: במסךeditText -שהמשתמש חוזר מהמסך של עריכת הפרופיל האפלקציה מעדכנת את ה
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable
Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==1){
if (resultCode== Activity.RESULT_OK){
name.setText(data.getStringExtra("fullName"));
email.setText(data.getStringExtra("Mail"));
CityAndCountry.setText(data.getStringExtra("CityAndCountry"));
phone.setText(data.getStringExtra("phoneNumber"));
}
}
}
19
Talentder - אורי ריבלוב
activity_profile_page_edit
: המסך כולל,מסך זה מאפשר למשתמש לערוך את פרטי המשתמש שלו
if (view == SaveChanges) {
saveChanges();
Intent returnIntent = new Intent();
returnIntent.putExtra("Mail", Mail.getText().toString());
returnIntent.putExtra("fullName", Full_Name.getText().toString());
returnIntent.putExtra("CityAndCountry",
CityAndCountry.getText().toString());
returnIntent.putExtra("phoneNumber", phoneNumber.getText().toString());
setResult(Activity.RESULT_OK, returnIntent);
finish();
}
myRef.child(mailRefactor(dataSnapshot.child("mail").getValue().toString()))
.child("phone_Number").setValue(PhoneNumber);
if (!Location.isEmpty())
myRef.child(mailRefactor(dataSnapshot.child("mail").getValue().toString()))
.child("cityAndCountry").setValue(Location);
if (!Name.isEmpty())
myRef.child(mailRefactor(dataSnapshot.child("mail").getValue().toString()))
.child("fullName").setValue(Name);
}}}
@Override
public void onCancelled(@NonNull DatabaseError error) {}});}
20
Talentder - אורי ריבלוב
if(view == removeResume){
filepath.delete().addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void unused) {
Toast.makeText(Profile_page_edit.this, "Deleting Complete",
Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(Profile_page_edit.this, "Deleting Failed",
Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
if (view == addResume) {
Intent galleryIntent = new Intent();
galleryIntent.setAction(Intent.ACTION_GET_CONTENT);
galleryIntent.setType("application/pdf");
startActivityForResult(galleryIntent, 1);
}
21
Talentder - אורי ריבלוב
protected void onActivityResult(int requestCode, int resultCode, @Nullable
Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
// Here we are initialising the progress dialog box
dialog = new ProgressDialog(this);
dialog.setMessage("Uploading");
22
אורי ריבלוב Talentder -
23
Talentder - אורי ריבלוב
activity_resume_viewer
:pdf המסך הזה מאפשר לראות את הקורות חיים של המשתמש כקובץ
storageReference.getStream().addOnSuccessListener(new OnSuccessLis-
tener<StreamDownloadTask.TaskSnapshot>() {
@Override
public void onSuccess(StreamDownloadTask.TaskSnapshot taskSnapshot) {
pdfView.fromStream(taskSnapshot.getStream()).load();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {}
});
" AndroidPdfViewer": באפלקציה השתמשתי בספרייה שנקראתpdf בשביל לאפשר צפייה בקבצי
:" אשר נראה ככהPDFView" : אלמנט בשםXMLספרייה זאת נותנת למתכנת להוסיף ל
<com.github.barteksc.pdfviewer.PDFView
android:id="@+id/pdfview"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
24
Talentder - אורי ריבלוב
activity_company_Profile_page
:המסך הזה מאפשר לראות מידע על חשבון של מעסיק והוא כולל
. של הלוגו של החברהImageView
storageRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>()
{
@Override
public void onSuccess(Uri uri) {
Picasso.get().load(uri).into(UserImage);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(getApplicationContext(),"SHIT",Toast.LENGTH_SHORT).show();
}
});
if (view == settings){
Intent i = new
Intent(getApplicationContext(),Company_Profile_edit.class);
i.putExtra("mail",email.getText().toString());
startActivityForResult(i,1);
}
25
אורי ריבלוב Talentder -
26
Talentder - אורי ריבלוב
activity_company_profile_edit
המסך מאפשר לערוך מידע על משתמש של חברה וכולל
. מספר טלפון והסבר קצר על החברה, שם חברה: שדרכם אפשר לערוך את- EditText
Picasso.get().load(uri).into(UserImage);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
}
});
if(view == addJob){
Intent i = new Intent(this, com.example.firebaselogin.addJob.class);
i.putExtra("mail",mail);
startActivity(i);
}
27
Talentder - אורי ריבלוב
if(view==settings)
{
saveChanges();
Intent returnIntent = new Intent();
returnIntent.putExtra("Mail",Mail.getText().toString());
returnIntent.putExtra("Phone",Phone.getText().toString());
returnIntent.putExtra("CompanyName",CompanyName.getText().toString());
returnIntent.putExtra("CompanyDescription",CompanyDescription.getText().toStr
ing());
setResult(Activity.RESULT_OK,returnIntent);
finish();
}
private void saveChanges(){
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot dataSnapshot:snapshot.getChildren()){
if
((dataSnapshot.child("mail").getValue().toString().toLowerCase()).equals(fire
baseAuth.getCurrentUser().getEmail().toString().toLowerCase())){
if (!Phone.getText().toString().isEmpty())
myRef.child(mailRefactor(dataSnapshot.child("mail").getValue().toString()))
.child("phone_Number").setValue(Phone.getText().toString());
if (!CompanyDescription.getText().toString().isEmpty())
myRef.child(mailRefactor(dataSnapshot.child("mail").getValue().toString()))
.child("companyDescription").setValue(CompanyDescription.getText().toString()
);
if (!CompanyName.getText().toString().isEmpty())
myRef.child(mailRefactor(dataSnapshot.child("mail").getValue().toString()))
.child("companyName").setValue(CompanyName.getText().toString());
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
28
אורי ריבלוב Talentder -
29
Talentder - אורי ריבלוב
activity_add_job
: המסך כולל.המסך מאפשר למשתמש של חברה להוסיף משרות
if(view == submit){
jobtitle = jobTitle.getText().toString();
jobdescription = jobDescription.getText().toString();
joblocation = jobLocation.getText().toString();
jobrequairments = jobRequairments.getText().toString();
expectedsalary = ExpectedSalary.getText().toString();
if(!jobtitle.isEmpty()){
if(!jobdescription.isEmpty()){
if(!joblocation.isEmpty()){
if(!jobrequairments.isEmpty()){
if(!expectedsalary.isEmpty()){
tempJob.setTitle(jobtitle);
tempJob.setDescription(jobdescription);
tempJob.setLocation(joblocation);
tempJob.setRequirements(jobrequairments);
tempJob.setExpected_salary(expectedsalary);
myRef.child(mailRefactor(firebaseAuth.getCurrentUser().getEmail())).child("jo
bs").child(String.valueOf(jobCount)).setValue(tempJob);
myRef.child(mailRefactor(firebaseAuth.getCurrentUser().getEmail())).child(("j
obCount")).setValue(jobCount+1);
jobCount++;
System.out.println("job ADDEd");
finish();
finish();
}
}
}
}
}
}
30
אורי ריבלוב Talentder -
31
Talentder - אורי ריבלוב
activity_job_view
:המסך הזה מאפשר לראות מידע על משרה מסוימת וכולל
if(v==Chat){
Intent I =new Intent(this,Chat.class);
I.putExtra("SentEmail",current.getStringExtra("email"));
startActivity(I);
}
if(v==companyPage){
Intent I =new Intent(this,Company_Profile_page.class);
I.putExtra("email",current.getStringExtra("email"));
startActivity(I);
}
32
Talentder - אורי ריבלוב
activity_company_browse_jobs
. ListView וכולל,המסך מאפשר לראות את כל המשרות שאותה חברה מציעה
:האפלקציה עוברת על כל המשרות שיש לאותה חברה להציע ומוסיפה אותה לרשימה
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot dataSnapshot:snapshot.getChildren()){
if
((dataSnapshot.child("mail").getValue().toString().toLowerCase())
.equals(getIntent().getStringExtra("mail").toLowerCase()))
{
DataSnapshot tempDataSnapshot =
dataSnapshot.child("jobs");
for (DataSnapshot dataSnapshot1 :
tempDataSnapshot.getChildren()){
temp = dataSnapshot1.getValue(job.class);
jobList.add(temp);
}
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
33
Talentder - אורי ריבלוב
: jobView ברשימה הוא עובר למסך שלjobs - כאשר המשתמש לוחץ על כל אחד מה
34
אורי ריבלוב Talentder -
chats_users_layout
המסך הזה ישומש בהמשך בתוך , activity_my_chats:כאשר כל אחד ממנו מייצג צאט קיים של משתמש
נוכחי עם משתמש אחר.
המסך כולל רק TextViewשמתאר את המייל של השמתמש השני שיש איתו צאט פעיל
35
Talentder - אורי ריבלוב
activity_my_chats
: המסך כולל,במסך זה יכול משתמש לראות את כל הצאטים הפעילים שלו
-האפלקציה טוענת את כל הצאטים הפעילים בכך שהיא עוברת על המידע ששמור על המשתמש הנוכחי ב
: ומוסיפה את כל המיילים שהמשתמש הנוכחי שלח להם הודעה ושמשתמשים שלחו לו הודעהfirebase
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot dataSnapshot:snapshot.getChildren()) {
DataSnapshot dataSnapshot1 = dataSnapshot.child("MessageSent");
//get all the emails that have chat with current user
for (DataSnapshot dataSnapshot2 : dataSnapshot1.getChildren()) {
MailsList.add(dataSnapshot2.child("sentEmail").get-
Value().toString());
MailsList.add(dataSnapshot2.child("sentEmail").get-
Value().toString());
}
}
:ואז האפלקציה מורידה מהרשימה את כל הערכים הכפולים ואת המייל של המשתמש הנוכחי
36
Talentder - אורי ריבלוב
וכאשר לוחצים על כל אחד מהפריטים ברשימה האפלקציה מעבירה את המשתמש לצאט עם המשתמש שעליו
:לחץ
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int
position, long id) {
temp = UsersAdapter.getItem(position);
I.putExtra("SentEmail",temp.getMail());
startActivity(I);
}
});
37
אורי ריבלוב Talentder -
message_layout
המסך הזה ישומש בהמשך בתוך , activity _chat:כאשר כל אחד ממנו מייצג הודעה של המשתמש נוכחי עם
משתמש אחר .וכולל:
38
Talentder - אורי ריבלוב
activity_chat
: והוא כולל,דרך מסך זה יכול המשתמש לשלוח הודעה למשתמש אחר
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot dataSnapshot : snapshot.getChildren())
if ((dataSnapshot.child("mail").getValue().toString().toLower-
Case())
.equals(firebaseAuth.getCurren-
tUser().getEmail().toString().toLowerCase())) {
Long I = (Long) (dataSnapshot.child("messageCount").get-
Value());
currentMessageCount = I.intValue();
DataSnapshot tempDataSnapshot = dataSnapshot.child("Messag-
eSent");
for (DataSnapshot dataSnapshot1 : tempDataSnap-
shot.getChildren()){
if((dataSnapshot1.child("sentEmail").get-
Value().toString()).equals(SentEmail)){
Message temp = new Message(dataSnap-
shot1.child("text").getValue().toString(),
firebaseAuth.getCurren-
tUser().getEmail().toString(),
dataSnapshot1.child("sentEmail").get-
Value().toString());
MessageList.add(temp);
}
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
39
Talentder - אורי ריבלוב
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot dataSnapshot : snapshot.getChildren())
if
((dataSnapshot.child("mail").getValue().toString().toLowerCase())
.equals(SentEmail.toLowerCase())) {
DataSnapshot tempDataSnapshot =
dataSnapshot.child("MessageSent");
if((dataSnapshot1.child("sentEmail").getValue().toString())
.equals(firebaseAuth.getCurrentUser().getEmail().toString())){
Message temp = new
Message(dataSnapshot1.child("text").getValue().toString(),
dataSnapshot1.child("sentEmail").getValue().toString(),
firebaseAuth.getCurrentUser().getEmail().toString());
MessageList.add(temp);
}
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {}});
40
Talentder - אורי ריבלוב
:כאשר לוחצים על המייל של נמען ההודעות האפלקציה מובילה לפרופיל של הנמען
if(isCurrentCompany) {
Intent i = new Intent(this, Profile_page.class);
i.putExtra("mail", Name.getText().toString());
startActivity(i);
}
else{
Intent i = new Intent(this, Company_Profile_page.class);
i.putExtra("email", Name.getText().toString());
i.putExtra("code",1);
startActivity(i);
הודעה חדשה בתקייתFirebase - האפלקציה מוסיף ב,כאשר משתמש לוחץ על כפתור שליחת ההודעה
:ההודעות היוצאות של המשתמש
if(view == sendMessege){
//add to List View
String text = text_to_send.getText().toString();
Message temp = new
Message(text,firebaseAuth.getCurrentUser().getEmail().toString(),SentEmail);
MessageList.add(temp);
messageAdapter = new MessageAdapter(this,0,0,MessageList);
lv.setAdapter(messageAdapter);
text_to_send.setText("");
myRef.child(mailRefactor(firebaseAuth.getCurrentUser().getEmail())).child("me
ssageCount").setValue(currentMessageCount+1);
myRef.child(mailRefactor(firebaseAuth.getCurrentUser().getEmail())).child("Me
ssageSent").child(String.valueOf(currentMessageCount+1)).setValue(temp);
}
41
Talentder - אורי ריבלוב
activity_job_browser
: המסך כולל,דרך מסך זה יכול המשתמש לחפש עבודות פוטנצאליות
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot dataSnapshot:snapshot.getChildren()){
DataSnapshot tempDataSnapshot = dataSnapshot.child("jobs");
for (DataSnapshot dataSnapshot1 :
tempDataSnapshot.getChildren()){
temp = dataSnapshot1.getValue(job.class);
jobList.add(temp);
Toast.makeText(Job_Browser.this, temp.toString(),
Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
42
Talentder - אורי ריבלוב
Job_browser_fliter.xml:
</menu>
43
Talentder - אורי ריבלוב
: האפלקצייה מבקשת רשות לכתיבה בזכרון המכשיר ואז יוצרת את הקובץExcel-בשביל להוריד את קובץ ה
if (id == R.id.DownloadExcel) {
ActivityCompat.requestPermissions(this, new
String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE},
PackageManager.PERMISSION_GRANTED);
try {
filePath.createNewFile();
if (fileOutputStream != null) {
fileOutputStream.flush();
fileOutputStream.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
44
Talentder - אורי ריבלוב
if (id == R.id.DownloadCSV) {
System.out.println(Environment.getExternalStorageDirectory()+"/Download/jobs.
csv");
writer.writeAll(csvData);
//writer.close();
} catch (IOException e) {
e.printStackTrace();
}
45
אורי ריבלוב Talentder -
46
אורי ריבלוב Talentder -
activity_internet_problem
המשתמש יופנה למסך זה כאשר יתבררר כי מכשירו אינו מחובר לאינטרנט ,מכיוון שלא חיבור לאינטרנט אי
אפשר להשתמש באפלקצייה ,המסך כולל רק כפתור אחד שכאשר לוחצים אליו האפלקציה בודקת אם ישנו
חיברו אינטרנטי ועם יש האפלקציה חוזרת למסך הקודם:
{)if(v == reset
;)ServiceManager s = new ServiceManager(this
;)(NetworkChangeReceiver n = new NetworkChangeReceiver
))(if(String.valueOf(s.isNetworkAvailable
{)).equals("true")&&n.checkInternet(this
;)(finish
}
}
47
Talentder - אורי ריבלוב
מחלקות
ServiceManager.java
כאשר המשתמש רוצה לבצע כל,קלאס זה משומש בכדי לבדוק את המצב של החיבור האינטרנטי של המכשיר
אם יש חיבור אינטרנטי אז האפלקציה,פעולה באפלקציה האפלקציה בודקת האם ישנו חיבור אינטרנטי
activity_internet_problem.xml :ממשיכה בתוכנית אבל אם אין חיבור אינטרנטי אז האפליקציה עוברת ל
48
Talentder - אורי ריבלוב
NetworkChangeReceiver.java
בכדיreset : בכאשר המשתמש לוחץ על כפתור הactivity_internet_problem.xml קלאס זה משומש בתוך
:לבדוק האם ישנו חיבור אינטרנטי בצורה הבאה
49
אורי ריבלוב Talentder -
Message.java
מחלקה זו מתארת הודעה בין שני אנשים באפלקציה הכולל:
– textתוכן ההודעה
50
אורי ריבלוב Talentder -
Job.java
מחלקה זו מתארת משרה והיא כוללת:
– Titleשם המשרה
– Locationמיקום המשרה
– descriptionתיאור המשרה
– requirementsדרישות המשרה
– Expected_salaryשכר משוער
51
אורי ריבלוב Talentder -
User.java
האובייקט כולל את הערכים המתאימים גם לחשבון פרטי וגם לחשבון חברה והוא כולל:
– mailמייל המשתמש
– passסיסמת המשתמש
– cityAndCountryהמיקום של המשתמש
– companyDescriptionתיאור החברה
– companyNameשם חברה
52
Talentder - אורי ריבלוב
jobAdapter.java
activity_company_browse_jobs.xml וactivity_job_browser.xml המחלקה הזאתי משומשת ב
53
אורי ריבלוב Talentder -
UserAdapter.java
מחלקה זו משומשת ב– activity_my_chats.xmlבכדי לטעון את רשימת המשתמשים לתוך ListViewוכולל:
54
אורי ריבלוב Talentder -
MessageAdapter.java
מחלקה זו משומשת ב – activity _chat.xmlבכדי לטעון את רשימת ההודעות לתוך ListViewוכולל:
55
Talentder - אורי ריבלוב
firebaseAuth.createUserWithEmailAndPassword(name.toLowerCase(),
pass).addOnCompleteListener(this,new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
User u;
// User
if(Employer.isChecked()) {
u = new User(userName.getText().toString().toLowerCase(),
Password.getText().toString(), true); }
else {u = new User(userName.getText().toString().toLowerCase(),
Password.getText().toString(),false); }
myref.child(mailRefactor(u.getMail())).setValue(u);
storageRef = storage.getReference(name.toLowerCase());
uploadFile(userName.getText().toString());
finish();
Toast.makeText(sign_up.this, " !",
Toast.LENGTH_LONG).show();
}
}
56
Talentder - אורי ריבלוב
myRef = FirebaseDatabase.getInstance().getReference("Users");
if(view == sendMessege){
//add to List View
String text = text_to_send.getText().toString();
Message temp = new
Message(text,firebaseAuth.getCurrentUser().getEmail().toString(),SentEmail);
MessageList.add(temp);
messageAdapter = new MessageAdapter(this,0,0,MessageList);
lv.setAdapter(messageAdapter);
text_to_send.setText("");
myRef.child(mailRefactor(firebaseAuth.getCurrentUser().getEmail())).child("me
ssageCount").setValue(currentMessageCount+1);
myRef.child(mailRefactor(firebaseAuth.getCurrentUser().getEmail())).child("Me
ssageSent").child(String.valueOf(currentMessageCount+1)).setValue(temp);
}
myRef = FirebaseDatabase.getInstance().getReference("Users");
if(!jobtitle.isEmpty()){
if(!jobdescription.isEmpty()){
if(!joblocation.isEmpty()){
if(!jobrequairments.isEmpty()){
if(!expectedsalary.isEmpty()){
tempJob.setTitle(jobtitle);
tempJob.setDescription(jobdescription);
tempJob.setLocation(joblocation);
tempJob.setRequirements(jobrequairments);
tempJob.setExpected_salary(expectedsalary);
tempJob.setEmail(firebaseAuth.getCurrentUser().getEmail().toString());
myRef.child(mailRefactor(firebaseAuth.getCurrentUser().getEmail())).child("jo
bs").child(String.valueOf(jobCount)).setValue(tempJob);
myRef.child(mailRefactor(firebaseAuth.getCurrentUser().getEmail())).child(("j
obCount")).setValue(jobCount+1);
jobCount++;
System.out.println("job ADDEd");
finish();
finish();
}
}
}
}
}
57
Talentder - אורי ריבלוב
FireBaseStorage
בפרויקט שלי השתמשתי בו בכדי לשמור תמונת פרופיל, משמש לשמירת קבצים דרך הענןFireBaseStorage
.pdf למשתמשים ובשביל לשמור קורות חיים כקובץ
}
}
58
Talentder - אורי ריבלוב
if (view == addResume) {
Intent galleryIntent = new Intent();
galleryIntent.setAction(Intent.ACTION_GET_CONTENT);
galleryIntent.setType("application/pdf");
startActivityForResult(galleryIntent, 1);
}
imageuri = data.getData();
StorageReference storageReference =
FirebaseStorage.getInstance().getReference();
// Here we are uploading the pdf in firebase storage with the name of current
time
final StorageReference filepath =
storageReference.child(firebaseAuth.getCurrentUser().getEmail().toString() +
"." + "pdf");
Toast.makeText(Profile_page_edit.this, filepath.getName(),
Toast.LENGTH_SHORT).show();
filepath.putFile(imageuri).continueWithTask(new Continuation() {
@Override
public Object then(@NonNull Task task) throws Exception {
if (!task.isSuccessful()) {
throw task.getException();
}
return filepath.getDownloadUrl();
}
})
59
אורי ריבלוב Talentder -
מדריך למשתמש
הוראות התקנה
מורידים קובץ apkלמכשיר אנדרואיד ,לא נתמך על ידי מערכות הפעלה אחרות ,לאחר הורדה ניתן לפתוח את
מסכים:
בפעם הראשונה שתיכנס לאפלקציה תגיע למסך התחברות ,עליך ללחוץ על כפתור ה SignUpואז תגיע למסך
זה:
עליך למלא את כתובת המייל שלך ולהזין סיסמא ,אם אתה רוצה ישנה אפשרות להוסיף תמונת פרופיל בכך
שתלחץ על כתפור ה – ,Uploud Photoכפתור זה יעביר אותך לבחירת תמונה מהזיכרון של הטלפון ,אם אתה
מעוניין לפתוח פרופיל של חברה אנא סמן את התיבה שכתוב עליה .I am Employer :שאתה מסיים למלא את
כל השדות אנא לחץ על כפתור ה – submitבכדי להמשיך בתהליך.
לאחר מכך האפלקציה תעבור חזרה למסך הפתיחה בו תידרש למלא את המייל והסיסמא שלך בכדי להתחבר
לחשבון שלך ,אם אתה מעוניין בכך אתה יכול לסמן את התיבה – stay Connectedאשר תגרום לכך שבפעם
הבאה שתתחבר לאפלקציה תשאר מחובר ולא תדרש למלא את המייל והסיסמא שלך מחדש.
60
אורי ריבלוב Talentder -
במסך זה יש לך ארבע כפתורים ,כפתור ה Log Outינתק אותך מהמשתמש שלך ויחזיר אותך למסך הקודם.
כפתור ה Explore jobs -יעביר אותך למסך שבו תוכל לראות משרות פוטנצאליות ,מסך זה נראה רק
למשתמשים עם משתמש שאינו משתמש חברה
כפתור ה chat -יעביר אותף למסך שבו תוכל לראות ולהיכנס לכל הצאטים הפעילים שלך
כפתור ה Profile -יעביר אותך לראות את הפרופיל שלך ויתן לך אפשרות לערוך אותו.
אפשר לגשת לכל הכפתורים האלו גם באמצעות שלוש הנקודות בצד ימין למעלה של המסך
אני ממליץ בתחילת השימוש באפלקציה גם לחברות וגם למשתמשים רגילים להיכן לעמוד הפרופיל שלהם
בשביל להוסיף מידע שימושי ,לפרופיל חברה כדי להוסיף את שם החברה ,תיאור של החברה ומספר משרות
ולפרופיל רגיל כדי להוסיף מספר טלפון ,שם מלא וקורות חיים.
61
אורי ריבלוב Talentder -
מתוך דף הפרופיל אפשר לגשת לדף עריכת הפרופיל בעזרת לחיצה על גלגל השיניים בצד ימין למעלה של
המסך :למשתמש רגיל לחיצה על כפתור זה יתן לערוך את :מספר הטלפון ,השם המלא ,המיקום ולהוסיף
קורות חיים בתור קובץ .pdf
ולמשתמש של חברה לחיצה על כפתור זה יאפשר לערוך את :שם החברה ,מספר הטלפון ולהוסיף משרות
לחברה.
62
אורי ריבלוב Talentder -
לאחר עריכת הפרופיל אפשר להתחיל בחיפוש העבודה ,באמצעות לחיצה על כפתור הExplore jobs -
האפלקציה עוברת למסך שבו אפשר לראות משרות שחברות פרסמו:
כאשר תלחץ על כל אחד מהמשרות תעבור לעמוד עם עוד מידע על כל משרה ועם כפתורים ,אחד לעבוד לעמוד
הפרופיל של החברה המפרסמת ואחד לצאט עם החברה המפרסמת:
63
אורי ריבלוב Talentder -
כאשר לוחצים על כפתור ה Chat -במסך הבית האפלקציה עוברת לרשימה של כל הצאטים הפעילים:
64
אורי ריבלוב Talentder -
כאשר תלחץ על כל אחד מהפריטים ברשימה תועבר לצאט שלך עם המשתמש עם המייל המוצג:
65
אורי ריבלוב Talentder -
רפלקציה
היעד המרכזי שלי בפרויקט היה להוציא פרויקט מוגמר שאני אוכל להיות גאה בו ,לפי דעתי הצלחתי חלקית
במטרה שלי אני גאה מאוד בפרויקט שלי ,כיף לדעת שבניתה משהוא בשתי ידיך אבל אני מרגיש שאם הייתי
מתחיל את הפרויקט מוקדם יותר ומקדיש אליו יותר משאבים הייתי יכול ליצור תוצר שהייתי יותר מרוצה
ממנו אבל בסך הכול אני מרוצה מאוד.
הדרך לבניית הפרויקט הזה אינה הייתה פשוטה ,אחד הדברים שהכי הקשו עליי בפרויקט היו השעות
הארוכות אך באמצעות סבלנות והתמדה הצלחתי לצלוח את בעיה זו אבל כאשר הצלחתי לפתח פיצר הסיפוק
שקיבלתי מההצלחה היה גדול משמעותית מהתסכול וזה אחד מהסיבות שהצלחתי להתמיד.
פרויקט זה שונה מאוד מפרויקטים במקצועות אחרים ,במקצועות אחרים רוב העבודות כוללות העתקת מידע
לעומת זאת בפרויקט הזה אחד הדברים שאני מאוד אוהב הוא העובדה שיוצרים אפלקציה מאפס בעזרת
הטמעת אלמטים שונים לתור פרויקט מלא.
ישנם מספר אפשרויות נוספות להמשך הפיתוח של התוכנה ,אחד מהרעיונות להמשך פיתוח האפליקציה
שהייתי רוצה לעשות הוא לפתח פיצר באפלקציה שהיה מושך משרות קיימות מאתרים אחרים ולייבא את
אותם משרות לאפלקציה שלי בנוסף הייתי שמח לעצב את האפלקציה בצורה יותר יפה .
דרך הפרויקט למדתי על עצמי שאני יכול להשיג כל מה שאני רוצה באמצעות התמדה וסבלנות ,כלי זה יהיה לי
שימושי בהמשך החיים גם בפן האקדמי וגם בכל דבר שאני יעשה בחיי האישיים.
בסך הכול נהנתי מאוד מהתהליך של בניית האפליקציה ואני שמח מאוד על כך שבחרתי לעשות פרויקט זה.
66
Talentder - אורי ריבלוב
ביבליוגרפיה
כפתור תמונת פרופיל עגול
androidדוקומנטציה של
FireBase:
67
Talentder - אורי ריבלוב
נספחים
:קטעי הקוד
https://github.com/oririb/FireBaseLogin
:APK קובץ
https://mega.nz/file/Ln4jSJ6I#JbGiSumzi8baFju1xuldMNd2xb8RHDXU3JwZLKoe-Wk
:סקר השוק
https://docs.google.com/forms/d/e/1FAIpQLSfGK_rhmALJGzU-
vR5hYkO8NFI_A231Hv5nHuzPdqYsFHIRzg/viewform?usp=sf_link
68