Sunteți pe pagina 1din 31

Ministerul Educaţiei al Republicii Moldova

Universitatea Tehnică a Moldovei


Facultatea Calculatoare Informatica si Microelectronica
Departamentul Ingineria Software si Automatica

RAPORT
Lucrarea de laborator nr. 6
Programarea aplicatiilor mobile
Tema: Telemedicine - SPRINT2

A efectuat: Cebotari Maxim


st. gr. TI-182

A verificat:
asist. univ. C. Rusu
Chisinau 2020

Scopul lucrarii

Scopul lucrării de laborator

Pentru designul ofert in laboratorul nr. 5 să se implementeze partea funcțională a proiectului conform
serviciului API descris mai jos.
Metodele oferite de Servicu:
• Auth (autentificare)
• Reg (inregistrare)
• UserProfie (extragerea avansată despre utilizatorul curent autentificat)
• UpdateUserProfile (NotImplemented) - nu cred că o voi implementa
• GetDocList (vizualizarea listei de medici activi in sistem)
• GetDoc (vizualizarea unui anumit medici activ in sistem)
• UserRequestConsultation (Adaugarea unei programari la medic)

Desfasurarea lucrarii de laborator


Retrofit Android
Retrofit este un client REST sigur pentru tip pentru Android și Java, care are ca scop facilitarea
consumului de servicii web RESTful. Retrofit 2 are multe funcții noi și un API intern modificat în comparație
cu versiunile anterioare. Retrofit serializează automat răspunsul JSON folosind un POJO (Plain Old Java
Object) care trebuie definit în avansat pentru structura JSON. Pentru a serializa JSON avem nevoie de un
convertor pentru al converti mai întâi în Gson. Trebuie să adăugăm următoarele dependențe în fișierul nostru
build.grade.
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.google.code.gson:gson:2.6.2'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'

1. Register

Server:
[API REG] POST
~/api/Register/UserReg
Header - Content-Type:application/x-www-form-urlencoded

Body
Content-Type:application/x-www-form-urlencoded
FullName=
Birthday= {FORMAT yyyy/MM/dd}
Email=
Phone=
Address=
Username=
Password=
Base64Photo {string:base64}=

SUCCESS {STATUS CODE 201}


Android:
(API.java)
@FormUrlEncoded
@POST("api/Register/UserReg/")
Call<UserReg> register(
@Field("FullName") String fullname,
@Field("Birthday") String birthday,
@Field("Email") String email,
@Field("Phone") String phone,
@Field("Address") String address,
@Field("Username") String username,
@Field("Password") String password,
@Field("Base64Photo") String photo
);
(Sign_up.java)
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://81.180.72.17/")
.addConverterFactory(GsonConverterFactory.create())
.build();

API api = retrofit.create(API.class);

Call<UserReg> call = api.register(


name.getText().toString(),
birthday.getText().toString(),
email.getText().toString(),
phone.getText().toString(),
address.getText().toString(),
username.getText().toString(),
password.getText().toString(),
photo); //Static Var → in anexa este codfificarea foto

call.enqueue(new Callback<UserReg>() {
@Override
public void onResponse(Call<UserReg> call, Response<UserReg> response) {
Toast.makeText(getApplicationContext(), "Este necesara logarea.",
Toast.LENGTH_SHORT).show();
startActivity(new Intent(getApplicationContext(), Login.class));
}

@Override
public void onFailure(Call<UserReg> call, Throwable t) {
Toast.makeText(getApplicationContext(), t.getMessage(), Toast.LENGTH_LONG).show();
}
});
Design:

La inregistrarea cu success, utilizatorul va fi rederictionat catre pagina de logare (este posibil de


apelat functia cu auto logare). Mesajul de eroare va fi afisat in cazul procesului esuat.
2. Logare
Server:
[API AUTH] POST
~/api/Login/UserAuth
Header - Content-Type:application/x-www-form-urlencoded
Body
Content-Type:application/x-www-form-urlencoded
Email=
Password=

RESULT

"Status": "SUCCESS",
"Message": "TOKEN" < - need to be saved for future usage.
}

Android:
(API.java)
@FormUrlEncoded
@POST("api/Login/UserAuth/")
Call<UserAuth> auth(
@Field("Email") String email,
@Field("Password") String password
);

(Login.java)
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://81.180.72.17/")
.addConverterFactory(GsonConverterFactory.create())
.build();

API api = retrofit.create(API.class);

Call<UserAuth> call = api.auth(email,password);


//Call<UserAuth> call = api.auth("maxim.cebotari@isa.utm.md","maxim1908");

call.enqueue(new Callback<UserAuth>() {
@Override
public void onResponse(Call<UserAuth> call, Response<UserAuth> response) {

if (response.body() != null) {
Log.e("TOKEN: ", response.body().getMessage());
SharedPreferences.Editor editor = getSharedPreferences("TOKEN",
MODE_PRIVATE).edit();
editor.putString("TOKEN", response.body().getMessage());
editor.apply();
startActivity(new Intent(getApplicationContext(), Home_screen.class));
} else {
Toast.makeText(getApplicationContext(), "Login sau Parola incorecta.",
Toast.LENGTH_SHORT).show();
}

@Override
public void onFailure(Call<UserAuth> call, Throwable t) {
Toast.makeText(getApplicationContext(), t.getMessage(), Toast.LENGTH_LONG).show();
}
});

Design:

In cazul in care Login/Parola este gresita utilizatorul este informat. In caz contrar, de la server se va
primi token-ul, iar utilizatorul este redirictionat catre urmatoarea pagina.
3. Doctor List
Server:
[API DOC LIST] GET
~/api/Doctor/GetDoctorList
Header - Content-Type:application/x-www-form-urlencoded
token=TOKEN

RESULT

{
"DocId": 1,
"FullName": "Arseni Andrei",
"Specs": "Oculist",
"Address": "str. Vasile Alecsandri 45A",
"About": "Medic Oculist cu experienta de 12 ani in domeniu.",
"Stars": 4.2,
"Photo": "base64:string"
},
{
"DocId": 2,
"FullName": "Stratila Alina",
"Specs": "Pediatru",
"Address": "str. Mihai Eminescu 12/3",
"About": "Medic Pediatru cu experienta de 7 ani in domeniu.",
"Stars": 4.8,
"Photo": "base64:string"
},

Android:
(API.java)
@GET("api/Doctor/GetDoctorList/")
Call<List<API_Doctor_list>> docList(
@Header("token") String token,
@Header("Content-Type") String content_type
);
(Doctor_list.java)
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://81.180.72.17/")
.addConverterFactory(GsonConverterFactory.create())
.build();

API api = retrofit.create(API.class);


Call<List<API_Doctor_list>> call = api.docList(token, "application/x-www-form-urlencoded");
call.enqueue(new Callback<List<API_Doctor_list>>() {
@Override
public void onResponse(Call<List<API_Doctor_list>> call, Response<List<API_Doctor_list>>
response) {
List<API_Doctor_list> api_doctor_lists = response.body();
for (API_Doctor_list apiDoctorList : api_doctor_lists){
Log.e("Name: ", apiDoctorList.getFullName());
structure(
apiDoctorList.getDocId(),
apiDoctorList.getPhoto(),
apiDoctorList.getFullName(),
String.valueOf(apiDoctorList.getStars()),
apiDoctorList.getSpecs(),
apiDoctorList.getAddress());

}
}

@Override
public void onFailure(Call<List<API_Doctor_list>> call, Throwable t) {
Toast.makeText(getApplicationContext(), t.getMessage(), Toast.LENGTH_LONG).show();
}
});

Design:
Fiecare field se genereaza apare pentru fiecare doctor in mod automat (cu ajutorul functie
structure()) vezi anexa.

4. Doc Info
Server:
[API DOC {id}] GET
~/api/Doctor/GetDoctor/1
Header - Content-Type:application/x-www-form-urlencoded
token=TOKEN

RESULT

{
"DocId": 1,
"FullName": "Arseni Andrei",
"Specs": "Oculist",
"Address": "str. Vasile Alecsandri 45A",
"About": "Medic Oculist cu experienta de 12 ani in domeniu.",
"Stars": 4.2,
"Photo": "base64:string"
},

Android:
(API.java)
@GET("api/Doctor/GetDoctor/{id}")
Call<API_DocInfo> docInfo(
@Path("id") Integer id,
@Header("token") String token,
@Header("Content-Type") String content_type
);

(Doctor_details.java)
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://81.180.72.17/")
.addConverterFactory(GsonConverterFactory.create())
.build();

API api = retrofit.create(API.class);


Call<API_DocInfo> call = api.docInfo(Integer.valueOf(docID), token, "application/x-www-form-
urlencoded");
call.enqueue(new Callback<API_DocInfo>() {
@Override
public void onResponse(Call<API_DocInfo> call, Response<API_DocInfo> response) {
Log.e("ID: ", String.valueOf(response.body().getDocId()));
Log.e("Name: ", response.body().getFullName());
Log.e("Spesc: ", response.body().getSpecs());
Log.e("Address: ", response.body().getAddress());
Log.e("About: ", response.body().getAbout());
Log.e("Stars: ", String.valueOf(response.body().getStars()));
Log.e("Photo: ", "Alta data");

byte[] decodedString = Base64.decode(response.body().getPhoto(), Base64.DEFAULT);


Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0,
decodedString.length);

profile_image.setImageBitmap(decodedByte);
textView9.setText(response.body().getFullName());
textView10.setText(response.body().getSpecs());
textView7.setText(String.valueOf(response.body().getStars()));
descr.setText(response.body().getAbout());
textView8.setText(response.body().getAddress());

address = response.body().getAddress();
name = response.body().getFullName();
}

@Override
public void onFailure(Call<API_DocInfo> call, Throwable t) {
Toast.makeText(getApplicationContext(), t.getMessage(), Toast.LENGTH_LONG).show();
}
});

Design:
Am implement si GMap care afiseaza pe harta locatia. De aceasta determinarea Lat Long se ocupa
Geocoder (vezi anexa).

5. Consulatie Request
Server:
[API CONSULTATION REQUEST] POST
~/api/Doctor/AddConsultation
Header - Content-Type:application/x-www-form-urlencoded
token=TOKEN

RESULT

"ConsId": 1,
"Name": "",
"Disease": "",
"Address": "",
"Description": "",
"DocId": 5,
"IsConfirmed": false
}

Android:
(API.java)
@FormUrlEncoded
@POST("api/Doctor/AddConsultation/")
Call<ConsDet> approve(
@Field("ConsId") int consid,
@Field("Name") String name,
@Field("Disease") String disease,
@Field("Address") String address,
@Field("Description") String desc,
@Field("DocId") int docid,
@Field("IsConfirmed") Boolean bool
);

(Approve_notification.java)
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://81.180.72.17/")
.addConverterFactory(GsonConverterFactory.create())
.build();

API api = retrofit.create(API.class);

Call<ConsDet> call = api.approve(1,


prefs.getString("name", "No Name"),
prefs.getString("desease", "No desease"),
prefs.getString("location", "No location"),
prefs.getString("description", "No description"),
docid,
false);

call.enqueue(new Callback<ConsDet>() {
@Override
public void onResponse(Call<ConsDet> call, Response<ConsDet> response) {
Toast.makeText(getApplicationContext(), "Cerere plasata",
Toast.LENGTH_LONG).show();
startActivity(new Intent(getApplicationContext(), Home_screen.class));
}

@Override
public void onFailure(Call<ConsDet> call, Throwable t) {
Toast.makeText(getApplicationContext(), t.getMessage(), Toast.LENGTH_LONG).show();
}
});

Design:
Anexe:

API.java
package maxim.cebotari;

import android.content.SharedPreferences;

import java.util.List;

import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.Headers;
import retrofit2.http.POST;
import retrofit2.http.Path;

import static android.content.Context.MODE_PRIVATE;

public interface API {

@FormUrlEncoded
@POST("api/Register/UserReg/")
Call<UserReg> register(
@Field("FullName") String fullname,
@Field("Birthday") String birthday,
@Field("Email") String email,
@Field("Phone") String phone,
@Field("Address") String address,
@Field("Username") String username,
@Field("Password") String password,
@Field("Base64Photo") String photo
);

@FormUrlEncoded
@POST("api/Login/UserAuth/")
Call<UserAuth> auth(
@Field("Email") String email,
@Field("Password") String password
);

@GET("api/Doctor/GetDoctorList/")
Call<List<API_Doctor_list>> docList(
@Header("token") String token,
@Header("Content-Type") String content_type
);

@GET("api/Doctor/GetDoctor/{id}")
Call<API_DocInfo> docInfo(
@Path("id") Integer id,
@Header("token") String token,
@Header("Content-Type") String content_type
);

@FormUrlEncoded
@POST("api/Doctor/AddConsultation/")
Call<ConsDet> approve(
@Field("ConsId") int consid,
@Field("Name") String name,
@Field("Disease") String disease,
@Field("Address") String address,
@Field("Description") String desc,
@Field("DocId") int docid,
@Field("IsConfirmed") Boolean bool
);
}
SignUp.java
package maxim.cebotari;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Base64;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Toast;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class Sign_up extends AppCompatActivity {

Button btnNext;
ImageButton btnBack;
String photo =
"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNMT0zfBA
AESQHjMAmi3AAAAABJRU5ErkJggg==";
EditText name, birthday, email, phone, address, username, password;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.activity_sign_up);

btnBack = findViewById(R.id.btnBack);
btnNext = findViewById(R.id.btnNext);
name = findViewById(R.id.name);
birthday = findViewById(R.id.birthday);
email = findViewById(R.id.email);
phone = findViewById(R.id.phone);
address = findViewById(R.id.address);
username = findViewById(R.id.username);
password = findViewById(R.id.password);
btnNext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

/* *** Script for encoding photo to Base64


InputStream inputStream = new FileInputStream(uploadedPhoto);
byte[] bytes;
byte[] buffer = new byte[8192];
int bytesRead;
ByteArrayOutputStream output = new ByteArrayOutputStream();

try {
while ((bytesRead = inputStream.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
}
}
catch (IOException e) {
e.printStackTrace();
}

bytes = output.toByteArray();
String encodedString = Base64.encodeToString(bytes, Base64.DEFAULT);
*/

Retrofit retrofit = new Retrofit.Builder()


.baseUrl("http://81.180.72.17/")
.addConverterFactory(GsonConverterFactory.create())
.build();

API api = retrofit.create(API.class);

Call<UserReg> call = api.register(


name.getText().toString(),
birthday.getText().toString(),
email.getText().toString(),
phone.getText().toString(),
address.getText().toString(),
username.getText().toString(),
password.getText().toString(),
photo);

call.enqueue(new Callback<UserReg>() {
@Override
public void onResponse(Call<UserReg> call, Response<UserReg> response) {
Toast.makeText(getApplicationContext(), "Este necesara logarea.",
Toast.LENGTH_SHORT).show();
startActivity(new Intent(getApplicationContext(), Login.class));
}

@Override
public void onFailure(Call<UserReg> call, Throwable t) {
Toast.makeText(getApplicationContext(), t.getMessage(), Toast.LENGTH_LONG).show();
}
});

}
});

btnBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(getApplicationContext(), MainActivity.class));
}
});
}
}
Login.java
package maxim.cebotari;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class Login extends AppCompatActivity {

Button login;
TextView signUp;
EditText editEmail, editPass;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.activity_login);

login = findViewById(R.id.login);
signUp = findViewById(R.id.signUp);
editEmail = findViewById(R.id.editEmail);
editPass = findViewById(R.id.editPass);

signUp.setOnClickListener(v -> startActivity(new Intent(getApplicationContext(), Sign_up.class)));

login.setOnClickListener(v -> {

String email = editEmail.getText().toString();


String password = editPass.getText().toString();

Retrofit retrofit = new Retrofit.Builder()


.baseUrl("http://81.180.72.17/")
.addConverterFactory(GsonConverterFactory.create())
.build();

API api = retrofit.create(API.class);

Call<UserAuth> call = api.auth(email,password);


//Call<UserAuth> call = api.auth("maxim.cebotari@isa.utm.md","maxim1908");
call.enqueue(new Callback<UserAuth>() {
@Override
public void onResponse(Call<UserAuth> call, Response<UserAuth> response) {

if (response.body() != null) {
Log.e("TOKEN: ", response.body().getMessage());
SharedPreferences.Editor editor = getSharedPreferences("TOKEN",
MODE_PRIVATE).edit();
editor.putString("TOKEN", response.body().getMessage());
editor.apply();
startActivity(new Intent(getApplicationContext(), Home_screen.class));
} else {
Toast.makeText(getApplicationContext(), "Login sau Parola incorecta.",
Toast.LENGTH_SHORT).show();
}

@Override
public void onFailure(Call<UserAuth> call, Throwable t) {
Toast.makeText(getApplicationContext(), t.getMessage(), Toast.LENGTH_LONG).show();
}
});
});

}
}
Home_Screen.java
package maxim.cebotari;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class Home_screen extends AppCompatActivity {

Button btnRequest;
EditText name, desease, location, description;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home_screen);
btnRequest = findViewById(R.id.btnRequest);
name = findViewById(R.id.name);
desease = findViewById(R.id.desease);
location = findViewById(R.id.location);
description = findViewById(R.id.description);

btnRequest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SharedPreferences.Editor editor = getSharedPreferences("Request", MODE_PRIVATE).edit();
editor.putString("name", name.getText().toString());
editor.putString("desease", desease.getText().toString());
editor.putString("location", location.getText().toString());
editor.putString("description", description.getText().toString());
editor.apply();
startActivity(new Intent(getApplicationContext(), Doctor_list.class));
}
});
}
}
Doctor_List.java
package maxim.cebotari;

import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;

import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Base64;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import java.util.List;

import de.hdodenhof.circleimageview.CircleImageView;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class Doctor_list extends AppCompatActivity {

ConstraintLayout docSelect;
LinearLayout parentLayout;
CircleImageView profile_image;
TextView textView9, nota, textView10, address;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_doctor_list);

docSelect = findViewById(R.id.docSelect);
parentLayout = findViewById(R.id.parentLayout);
profile_image = findViewById(R.id.profile_image);
textView9 = findViewById(R.id.textView9);
nota = findViewById(R.id.nota);
textView10 = findViewById(R.id.textView10);
address = findViewById(R.id.address);

docSelect.setVisibility(View.GONE);

SharedPreferences prefs = getSharedPreferences("TOKEN", MODE_PRIVATE);


String token = prefs.getString("TOKEN", "No TOKEN defined");

Retrofit retrofit = new Retrofit.Builder()


.baseUrl("http://81.180.72.17/")
.addConverterFactory(GsonConverterFactory.create())
.build();

API api = retrofit.create(API.class);


Call<List<API_Doctor_list>> call = api.docList(token, "application/x-www-form-urlencoded");
call.enqueue(new Callback<List<API_Doctor_list>>() {
@Override
public void onResponse(Call<List<API_Doctor_list>> call, Response<List<API_Doctor_list>>
response) {
List<API_Doctor_list> api_doctor_lists = response.body();
for (API_Doctor_list apiDoctorList : api_doctor_lists){
Log.e("Name: ", apiDoctorList.getFullName());

structure(
apiDoctorList.getDocId(),
apiDoctorList.getPhoto(),
apiDoctorList.getFullName(),
String.valueOf(apiDoctorList.getStars()),
apiDoctorList.getSpecs(),
apiDoctorList.getAddress());

}
}

@Override
public void onFailure(Call<List<API_Doctor_list>> call, Throwable t) {
Toast.makeText(getApplicationContext(), t.getMessage(), Toast.LENGTH_LONG).show();
}
});

void structure(int docID, String ph, String nam, String st, String spe, String loc){
ConstraintLayout doc = new ConstraintLayout(getApplicationContext());

doc.setLayoutParams(docSelect.getLayoutParams());
doc.setBackgroundColor(Color.WHITE);

CircleImageView photo = (CircleImageView) getLayoutInflater().inflate(R.layout.photostyle, null);


photo.setLayoutParams(profile_image.getLayoutParams());

byte[] decodedString = Base64.decode(ph, Base64.DEFAULT);


Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);

photo.setImageBitmap(decodedByte);
doc.addView(photo);
TextView name = (TextView)getLayoutInflater().inflate(R.layout.namestyle, null);
name.setLayoutParams(textView9.getLayoutParams());
name.setText(nam);
doc.addView(name);

TextView stars = (TextView)getLayoutInflater().inflate(R.layout.starstyle, null);


stars.setLayoutParams(nota.getLayoutParams());
stars.setText(st);
doc.addView(stars);

TextView specs = (TextView)getLayoutInflater().inflate(R.layout.specstyle, null);


specs.setLayoutParams(textView10.getLayoutParams());
specs.setText(spe);
doc.addView(specs);

TextView location = (TextView)getLayoutInflater().inflate(R.layout.lcoationstyle, null);


location.setText(loc);
location.setLayoutParams(address.getLayoutParams());
doc.addView(location);

doc.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getBaseContext(), Doctor_details.class);
intent.putExtra("docID", String.valueOf(docID));
startActivity(intent);
}
});

parentLayout.addView(doc);
}
}
Doctor_details.java
package maxim.cebotari;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;
import android.os.Handler;
import android.util.Base64;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapView;
import com.google.android.gms.maps.MapsInitializer;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

import java.io.IOException;
import java.util.List;

import de.hdodenhof.circleimageview.CircleImageView;
import okhttp3.internal.platform.Platform;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class Doctor_details extends AppCompatActivity implements OnMapReadyCallback {

Button btnRequest1;
TextView textView9, textView10, textView7, descr, textView8;
MapView gmap;

CircleImageView profile_image;
GoogleMap map;
String name, address;
Address locatie;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.activity_doctor_details);

btnRequest1 = findViewById(R.id.btnRequest1);
textView9 = findViewById(R.id.textView9);
textView10 = findViewById(R.id.textView10);
textView7 = findViewById(R.id.textView7);
descr = findViewById(R.id.descr);
textView8 = findViewById(R.id.textView8);
gmap = findViewById(R.id.gmap);
profile_image = findViewById(R.id.profile_image);

gmap.onCreate(savedInstanceState);
gmap.getMapAsync(this);

String docID = getIntent().getStringExtra("docID");

btnRequest1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getBaseContext(), Approve_notification.class);
intent.putExtra("docID", String.valueOf(docID));
startActivity(intent);
}
});

SharedPreferences prefs = getSharedPreferences("TOKEN", MODE_PRIVATE);


String token = prefs.getString("TOKEN", "No TOKEN defined");

Retrofit retrofit = new Retrofit.Builder()


.baseUrl("http://81.180.72.17/")
.addConverterFactory(GsonConverterFactory.create())
.build();

API api = retrofit.create(API.class);


Call<API_DocInfo> call = api.docInfo(Integer.valueOf(docID), token, "application/x-www-form-
urlencoded");
call.enqueue(new Callback<API_DocInfo>() {
@Override
public void onResponse(Call<API_DocInfo> call, Response<API_DocInfo> response) {
Log.e("ID: ", String.valueOf(response.body().getDocId()));
Log.e("Name: ", response.body().getFullName());
Log.e("Spesc: ", response.body().getSpecs());
Log.e("Address: ", response.body().getAddress());
Log.e("About: ", response.body().getAbout());
Log.e("Stars: ", String.valueOf(response.body().getStars()));
Log.e("Photo: ", "Alta data");

byte[] decodedString = Base64.decode(response.body().getPhoto(), Base64.DEFAULT);


Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0,
decodedString.length);

profile_image.setImageBitmap(decodedByte);
textView9.setText(response.body().getFullName());
textView10.setText(response.body().getSpecs());
textView7.setText(String.valueOf(response.body().getStars()));
descr.setText(response.body().getAbout());
textView8.setText(response.body().getAddress());

address = response.body().getAddress();
name = response.body().getFullName();
}

@Override
public void onFailure(Call<API_DocInfo> call, Throwable t) {
Toast.makeText(getApplicationContext(), t.getMessage(), Toast.LENGTH_LONG).show();
}
});

@Override
public void onMapReady(GoogleMap googleMap) {
map = googleMap;
map.getUiSettings().setMyLocationButtonEnabled(false);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) !=
PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
{
Toast.makeText(getApplicationContext(), "Reject Permissions", Toast.LENGTH_SHORT).show();
return;
}
map.setMyLocationEnabled(true);
try {
MapsInitializer.initialize(getApplicationContext());
} catch (Exception e) {
e.printStackTrace();
}

final Handler handler = new Handler();


handler.postDelayed(new Runnable() {
@Override
public void run() {
Log.e("Geocoder: ", address);

Geocoder gc = new Geocoder(getApplicationContext());


try {
List<Address> list = gc.getFromLocationName(address, 1);
locatie = list.get(0);
} catch (IOException e) {
e.printStackTrace();
}

LatLng docloc = new LatLng(locatie.getLatitude(), locatie.getLongitude());


googleMap.addMarker(new MarkerOptions()
.position(docloc)
.title(name));
googleMap.moveCamera(CameraUpdateFactory.newLatLng(docloc));

CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(docloc, 18);


map.animateCamera(cameraUpdate);
}
}, 2000);

@Override
public void onResume() {
super.onResume();
gmap.onResume();
}
}
Approve_notification.java
package maxim.cebotari;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.Base64;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import de.hdodenhof.circleimageview.CircleImageView;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class Approve_notification extends AppCompatActivity {

TextView name, desease, location, description;


CircleImageView profile_image;
TextView docname, docspec, star;
Button btnRequest2, cancelRequest;
int docid;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_approve_notification);

name = findViewById(R.id.name);
desease = findViewById(R.id.desease);
location = findViewById(R.id.location);
description = findViewById(R.id.description);
docname = findViewById(R.id.textView9);
profile_image = findViewById(R.id.profile_image);
docspec = findViewById(R.id.textView10);
star = findViewById(R.id.textView7);
btnRequest2 = findViewById(R.id.btnRequest2);
cancelRequest = findViewById(R.id.cancelRequest);

SharedPreferences prefs = getSharedPreferences("Request", MODE_PRIVATE);


name.setText(prefs.getString("name", "No Name"));
desease.setText(prefs.getString("desease", "No desease"));
location.setText(prefs.getString("location", "No location"));
description.setText(prefs.getString("description", "No description"));

String docID = getIntent().getStringExtra("docID");

SharedPreferences tok = getSharedPreferences("TOKEN", MODE_PRIVATE);

String token = tok.getString("TOKEN", "No TOKEN defined");

Retrofit retrofit = new Retrofit.Builder()


.baseUrl("http://81.180.72.17/")
.addConverterFactory(GsonConverterFactory.create())
.build();

API api = retrofit.create(API.class);


Call<API_DocInfo> call = api.docInfo(Integer.valueOf(docID), token, "application/x-www-form-
urlencoded");
call.enqueue(new Callback<API_DocInfo>() {
@Override
public void onResponse(Call<API_DocInfo> call, Response<API_DocInfo> response) {
Log.e("ID: ", String.valueOf(response.body().getDocId()));
Log.e("Name: ", response.body().getFullName());
Log.e("Spesc: ", response.body().getSpecs());
Log.e("Address: ", response.body().getAddress());
Log.e("About: ", response.body().getAbout());
Log.e("Stars: ", String.valueOf(response.body().getStars()));
Log.e("Photo: ", "IMG");

byte[] decodedString = Base64.decode(response.body().getPhoto(), Base64.DEFAULT);


Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0,
decodedString.length);

profile_image.setImageBitmap(decodedByte);

docname.setText(response.body().getFullName());
docspec.setText(response.body().getSpecs());
star.setText(String.valueOf(response.body().getStars()));
docid = response.body().getDocId();
}

@Override
public void onFailure(Call<API_DocInfo> call, Throwable t) {
Toast.makeText(getApplicationContext(), t.getMessage(), Toast.LENGTH_LONG).show();
}
});

btnRequest2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

Retrofit retrofit = new Retrofit.Builder()


.baseUrl("http://81.180.72.17/")
.addConverterFactory(GsonConverterFactory.create())
.build();

API api = retrofit.create(API.class);

Call<ConsDet> call = api.approve(1,


prefs.getString("name", "No Name"),
prefs.getString("desease", "No desease"),
prefs.getString("location", "No location"),
prefs.getString("description", "No description"),
docid,
false);

call.enqueue(new Callback<ConsDet>() {
@Override
public void onResponse(Call<ConsDet> call, Response<ConsDet> response) {
Toast.makeText(getApplicationContext(), "Cerere plasata",
Toast.LENGTH_LONG).show();
startActivity(new Intent(getApplicationContext(), Home_screen.class));
}

@Override
public void onFailure(Call<ConsDet> call, Throwable t) {
Toast.makeText(getApplicationContext(), t.getMessage(), Toast.LENGTH_LONG).show();
}
});
}
});

cancelRequest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(), "Canceled", Toast.LENGTH_SHORT).show();
startActivity(new Intent(getApplicationContext(), Home_screen.class));
}
});
}
}

S-ar putea să vă placă și

  • Laborator 1 Testare Software
    Laborator 1 Testare Software
    Document8 pagini
    Laborator 1 Testare Software
    Ion Cornea
    Încă nu există evaluări
  • Pam 4
    Pam 4
    Document4 pagini
    Pam 4
    violina
    Încă nu există evaluări
  • Lab2 PAM
    Lab2 PAM
    Document12 pagini
    Lab2 PAM
    Ion Popescu
    Încă nu există evaluări
  • Pam Exam
    Pam Exam
    Document2 pagini
    Pam Exam
    Culea Constantin
    Încă nu există evaluări
  • Raport4 Lab4 AC
    Raport4 Lab4 AC
    Document3 pagini
    Raport4 Lab4 AC
    crismaruion
    Încă nu există evaluări
  • Lab. 3
    Lab. 3
    Document5 pagini
    Lab. 3
    Cristina Florea
    Încă nu există evaluări
  • Laborator 1 Prelucrarea Semnalelor
    Laborator 1 Prelucrarea Semnalelor
    Document19 pagini
    Laborator 1 Prelucrarea Semnalelor
    Ion Cornea
    Încă nu există evaluări
  • Laborator 1 Prelucrarea Semnalelor
    Laborator 1 Prelucrarea Semnalelor
    Document19 pagini
    Laborator 1 Prelucrarea Semnalelor
    Ion Cornea
    Încă nu există evaluări
  • Laborator NR.2
    Laborator NR.2
    Document9 pagini
    Laborator NR.2
    Daniil
    Încă nu există evaluări
  • LAB3PSR
    LAB3PSR
    Document11 pagini
    LAB3PSR
    Cristian
    Încă nu există evaluări
  • Laborator NR.1
    Laborator NR.1
    Document13 pagini
    Laborator NR.1
    Daniil
    100% (1)
  • Lab 1 Somipp
    Lab 1 Somipp
    Document7 pagini
    Lab 1 Somipp
    TîmburŞtefan
    Încă nu există evaluări
  • Lab 1
    Lab 1
    Document7 pagini
    Lab 1
    Ion Cornea
    Încă nu există evaluări
  • Examen, TS, Bilet 75
    Examen, TS, Bilet 75
    Document1 pagină
    Examen, TS, Bilet 75
    Никита Баранов
    Încă nu există evaluări
  • Somipp SOMIPP5
    Somipp SOMIPP5
    Document6 pagini
    Somipp SOMIPP5
    Damean Alexandra
    Încă nu există evaluări
  • Lab 2 Somipp
    Lab 2 Somipp
    Document5 pagini
    Lab 2 Somipp
    Augusta Bucataru
    Încă nu există evaluări
  • Somipp Linux 4 UTM
    Somipp Linux 4 UTM
    Document4 pagini
    Somipp Linux 4 UTM
    Cristi Poselețchi
    Încă nu există evaluări
  • IoT LL1
    IoT LL1
    Document12 pagini
    IoT LL1
    Anya Mr
    100% (1)
  • PS TS
    PS TS
    Document14 pagini
    PS TS
    Victor Turculet
    Încă nu există evaluări
  • Lab 6 Somipp
    Lab 6 Somipp
    Document5 pagini
    Lab 6 Somipp
    Augusta Bucataru
    Încă nu există evaluări
  • PAm Examen-1
    PAm Examen-1
    Document12 pagini
    PAm Examen-1
    Eric Semeniuc
    Încă nu există evaluări
  • BDC Lucrare de Curs
    BDC Lucrare de Curs
    Document37 pagini
    BDC Lucrare de Curs
    Vladislav Crivenco
    Încă nu există evaluări
  • TW Lab3
    TW Lab3
    Document6 pagini
    TW Lab3
    Dan
    Încă nu există evaluări
  • PSI Lab 3
    PSI Lab 3
    Document10 pagini
    PSI Lab 3
    Nicolae
    Încă nu există evaluări
  • TW Lab5
    TW Lab5
    Document3 pagini
    TW Lab5
    Dan
    Încă nu există evaluări
  • Lab 2 Pam
    Lab 2 Pam
    Document5 pagini
    Lab 2 Pam
    Augusta Bucataru
    Încă nu există evaluări
  • Examen TIDPP
    Examen TIDPP
    Document3 pagini
    Examen TIDPP
    Rosca Doinita
    Încă nu există evaluări
  • Somipp Linux 2 UTM
    Somipp Linux 2 UTM
    Document7 pagini
    Somipp Linux 2 UTM
    Cristi Poselețchi
    Încă nu există evaluări
  • Lab4 SAV
    Lab4 SAV
    Document3 pagini
    Lab4 SAV
    Zeul Hriscei
    Încă nu există evaluări
  • Lab 3
    Lab 3
    Document4 pagini
    Lab 3
    Rosca Doinita
    Încă nu există evaluări
  • Lab3 SAV
    Lab3 SAV
    Document4 pagini
    Lab3 SAV
    Zeul Hriscei
    Încă nu există evaluări
  • SOMIPP Lab5
    SOMIPP Lab5
    Document4 pagini
    SOMIPP Lab5
    X3 KTO
    Încă nu există evaluări
  • AMOO - Proiect de An
    AMOO - Proiect de An
    Document4 pagini
    AMOO - Proiect de An
    Dan
    Încă nu există evaluări
  • Lab1 Pam
    Lab1 Pam
    Document9 pagini
    Lab1 Pam
    Ion Popescu
    100% (2)
  • Lab7 AMOO
    Lab7 AMOO
    Document11 pagini
    Lab7 AMOO
    Сергей Борта
    Încă nu există evaluări
  • Lab 7
    Lab 7
    Document2 pagini
    Lab 7
    Cristina Florea
    Încă nu există evaluări
  • Amo 5
    Amo 5
    Document8 pagini
    Amo 5
    Fil Gorea
    Încă nu există evaluări
  • TW Lab 5
    TW Lab 5
    Document4 pagini
    TW Lab 5
    danielploaia
    Încă nu există evaluări
  • LL3 (Amoo)
    LL3 (Amoo)
    Document6 pagini
    LL3 (Amoo)
    Eric Semeniuc
    Încă nu există evaluări
  • Examen PW
    Examen PW
    Document71 pagini
    Examen PW
    DorinRotaru
    Încă nu există evaluări
  • Programarea in Retea Lab 4 Iepuras Daniel TI-171
    Programarea in Retea Lab 4 Iepuras Daniel TI-171
    Document8 pagini
    Programarea in Retea Lab 4 Iepuras Daniel TI-171
    DanuIepuras
    Încă nu există evaluări
  • Lab.6 FC
    Lab.6 FC
    Document3 pagini
    Lab.6 FC
    Cristina Florea
    Încă nu există evaluări
  • Atestarea 1 AC Rezolvat
    Atestarea 1 AC Rezolvat
    Document10 pagini
    Atestarea 1 AC Rezolvat
    Ion Damaschin
    Încă nu există evaluări
  • Somipp Linux 1 UTM
    Somipp Linux 1 UTM
    Document10 pagini
    Somipp Linux 1 UTM
    Cristi Poselețchi
    Încă nu există evaluări
  • Atestare
    Atestare
    Document3 pagini
    Atestare
    Cristian Conea
    Încă nu există evaluări
  • TW Atestare
    TW Atestare
    Document4 pagini
    TW Atestare
    yamahahohnerc70
    Încă nu există evaluări
  • TAP Lab2
    TAP Lab2
    Document4 pagini
    TAP Lab2
    Adrian Bodorin
    Încă nu există evaluări
  • TAP Lab5 Popov Biatrice CR 191
    TAP Lab5 Popov Biatrice CR 191
    Document6 pagini
    TAP Lab5 Popov Biatrice CR 191
    Alina Axenti
    Încă nu există evaluări
  • SOMIPP
     SOMIPP
    Document6 pagini
    SOMIPP
    Damean Alexandra
    Încă nu există evaluări
  • Proiect de Curs BD Exemplu-Unlocked
    Proiect de Curs BD Exemplu-Unlocked
    Document60 pagini
    Proiect de Curs BD Exemplu-Unlocked
    Amarfii Sergiu
    Încă nu există evaluări
  • Lab 1
    Lab 1
    Document8 pagini
    Lab 1
    dtatn
    Încă nu există evaluări
  • Iepuras Daniel LAB 3 TS
    Iepuras Daniel LAB 3 TS
    Document8 pagini
    Iepuras Daniel LAB 3 TS
    DanuIepuras
    Încă nu există evaluări
  • Laboratorul 2 PPE
    Laboratorul 2 PPE
    Document4 pagini
    Laboratorul 2 PPE
    crismaruion
    Încă nu există evaluări
  • Laborator Nr. 1 - SAV
    Laborator Nr. 1 - SAV
    Document4 pagini
    Laborator Nr. 1 - SAV
    Katalina
    Încă nu există evaluări
  • Lab 1 ASO
    Lab 1 ASO
    Document6 pagini
    Lab 1 ASO
    Cristian
    100% (1)
  • AMOO Lab2.Use Case
    AMOO Lab2.Use Case
    Document5 pagini
    AMOO Lab2.Use Case
    Dorin Gribincea
    Încă nu există evaluări
  • SOMIPP Labs
    SOMIPP Labs
    Document107 pagini
    SOMIPP Labs
    Ionel Boaghe
    Încă nu există evaluări
  • Raspunsuri AMSI
    Raspunsuri AMSI
    Document11 pagini
    Raspunsuri AMSI
    Cristina Florea
    Încă nu există evaluări
  • Lab 5-6
    Lab 5-6
    Document18 pagini
    Lab 5-6
    DanuIepuras
    Încă nu există evaluări
  • Exemplu Raport
    Exemplu Raport
    Document27 pagini
    Exemplu Raport
    Fil Gorea
    Încă nu există evaluări
  • Exemplu Raport
    Exemplu Raport
    Document27 pagini
    Exemplu Raport
    Ion Popescu
    Încă nu există evaluări
  • Raport: Lucrarea de Laborator nr.3 Disciplina: Programare În Rețea Tema: Client HTTP
    Raport: Lucrarea de Laborator nr.3 Disciplina: Programare În Rețea Tema: Client HTTP
    Document11 pagini
    Raport: Lucrarea de Laborator nr.3 Disciplina: Programare În Rețea Tema: Client HTTP
    Никита Баранов
    Încă nu există evaluări
  • Lab 5-6
    Lab 5-6
    Document18 pagini
    Lab 5-6
    DanuIepuras
    Încă nu există evaluări
  • Web de Tip REST
    Web de Tip REST
    Document10 pagini
    Web de Tip REST
    anon_503247383
    Încă nu există evaluări
  • Cornea Ion
    Cornea Ion
    Document18 pagini
    Cornea Ion
    Ion Cornea
    Încă nu există evaluări
  • Lab7 AMOO
    Lab7 AMOO
    Document7 pagini
    Lab7 AMOO
    Ion Cornea
    Încă nu există evaluări
  • PR - Lab 5
    PR - Lab 5
    Document4 pagini
    PR - Lab 5
    Ion Cornea
    Încă nu există evaluări
  • Raport 3 TS
    Raport 3 TS
    Document9 pagini
    Raport 3 TS
    Ion Cornea
    Încă nu există evaluări
  • Lab 1 SOMMIP
    Lab 1 SOMMIP
    Document4 pagini
    Lab 1 SOMMIP
    Ion Cornea
    Încă nu există evaluări
  • Lab2 TMPS
    Lab2 TMPS
    Document4 pagini
    Lab2 TMPS
    Ion Cornea
    Încă nu există evaluări
  • Lab 1
    Lab 1
    Document3 pagini
    Lab 1
    Ion Cornea
    Încă nu există evaluări
  • Lab 1
    Lab 1
    Document4 pagini
    Lab 1
    Ion Cornea
    Încă nu există evaluări
  • Laborator1 TMPS
    Laborator1 TMPS
    Document4 pagini
    Laborator1 TMPS
    Ion Cornea
    Încă nu există evaluări
  • PR - Lab 4
    PR - Lab 4
    Document4 pagini
    PR - Lab 4
    Ion Cornea
    Încă nu există evaluări
  • Programare Lab1
    Programare Lab1
    Document7 pagini
    Programare Lab1
    Ion Cornea
    Încă nu există evaluări
  • Lab 1
    Lab 1
    Document3 pagini
    Lab 1
    Ion Cornea
    Încă nu există evaluări
  • Lab 1
    Lab 1
    Document4 pagini
    Lab 1
    Ion Cornea
    Încă nu există evaluări
  • Lab 1
    Lab 1
    Document3 pagini
    Lab 1
    Ion Cornea
    Încă nu există evaluări
  • Lab 1
    Lab 1
    Document12 pagini
    Lab 1
    Ion Cornea
    Încă nu există evaluări
  • Lab 2
    Lab 2
    Document11 pagini
    Lab 2
    Ion Cornea
    Încă nu există evaluări
  • Lab 2
    Lab 2
    Document11 pagini
    Lab 2
    Ion Cornea
    Încă nu există evaluări
  • Lab 3
    Lab 3
    Document10 pagini
    Lab 3
    Ion Cornea
    Încă nu există evaluări
  • 1.cinematica Punctului
    1.cinematica Punctului
    Document17 pagini
    1.cinematica Punctului
    Ion Cornea
    Încă nu există evaluări
  • Lab 1
    Lab 1
    Document10 pagini
    Lab 1
    Ion Cornea
    Încă nu există evaluări
  • Cornea Ion (11 Mai - 15 Mai)
    Cornea Ion (11 Mai - 15 Mai)
    Document1 pagină
    Cornea Ion (11 Mai - 15 Mai)
    Ion Cornea
    Încă nu există evaluări
  • Tema 2 CP
    Tema 2 CP
    Document13 pagini
    Tema 2 CP
    Ion Cornea
    Încă nu există evaluări
  • Laborator 2
    Laborator 2
    Document7 pagini
    Laborator 2
    Ion Cornea
    Încă nu există evaluări
  • Cercetari Operationale: Alexei LEAHU
    Cercetari Operationale: Alexei LEAHU
    Document20 pagini
    Cercetari Operationale: Alexei LEAHU
    Ion Cornea
    Încă nu există evaluări
  • Tema7 10
    Tema7 10
    Document9 pagini
    Tema7 10
    Nana747
    Încă nu există evaluări