Sunteți pe pagina 1din 12

MINISTERUL EDUCAŢIEI ȘI CERCETĂRII AL REPUBLICII MOLDOVA

IP CENTRUL DE EXCELENŢĂ ÎN INFORMATICĂ ŞI TEHNOLOGII INFORMAŢIONALE

RAPORTUL STAGIULUI DE
PRACTICĂ

Eleva: Nagorneac Daria

Grupa: P-1841

Specialitatea: Programarea și analiza produselor program

Baza de practică: S.A. REGIA APĂ-CANAL SOROCA

Conducătorul stagiului de practică Conducătorul stagiului de practică

de la unitatea economică de la Centrul de Excelență

Melnic Vitalie Carp Alexandra

Chişinău, 2022
Introducere
Realizarea practicii ce precede probele de absolvire vizează formarea și dezvoltarea competențelor
profesionale, accentul instruirii fiind pus pe formarea de competențe în domeniul programării, necesare
integrării profesionale eficiente în vederea obținerii unei cariere de succes ulterioare.
Practica tehnologică este centrată pe elev, creând posibilități de dezvoltare a creativității elevilor, a
gândirii critice, educând personalități social-active, capabile să rezolve problemele pe care le vor întâlni
şi capabile să planifice și organizeze timpul de muncă.
Astfel, pe parcursul desfășurării practicii tehnologice elevii trebuie să acorde o atenție deosebită, în
primul rând, conștientizării elementelor și funcțiilor specifice specialității: dezvoltarea și testarea
aplicației.

Sarcina
Realizarea unei aplicații mobile care va păstra toată informația despre “S.A. REGIA APĂ-CANAL
SOROCA”, tarifele pentru apă/canalizare (pentru populație) și achitarea facturii.

Modul de elaborare a aplicației și codul sursă


 Aplicația este realizată în Android Studio și denumită “ApC”.
 Primul lucru realizat a fost bara de navigare de jos sau vizualizare pentru a naviga prin diferite
fragmente din aplicație.
 În fișierul buil.grandle verificăm dependența și dacă este nevoie o schimbăm, după acest lucru
închidem fișierul și mergem mai întâi activitymain.xml unde vom și crea bara de navigare de jos.
build.grandle
plugins {
id 'com.android.application'
}

android {
compileSdk 32

defaultConfig {
applicationId "com.example.apc"
minSdk 21
targetSdk 32
versionCode 1
versionName "1.0"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-
optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}

2
dependencies {

implementation 'androidx.appcompat:appcompat:1.4.2'
implementation 'com.google.android.material:material:1.6.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
implementation 'com.braintreepayments:card-form:3.1.1'
}

activitymain.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/container"
android:layout_above="@id/bottom_navigation"/>

<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
app:menu="@menu/bottom_nav_menu" />

</RelativeLayout>

 În continuare am creat noul director de resurse android care este menu, în interiorul căruia am
creat un fișier cu resurse pentru meniu bottom_nav_menu.xml, unde sau adăugat articolele:
Home, Info, Payment.
bottom_nav_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/home"
android:title="Home"
android:icon="@drawable/ic_baseline_home_24"/>
<item android:id="@+id/info"
android:title="Info"
android:icon="@drawable/ic_baseline_info_24"/>
<item android:id="@+id/payment"
android:title="Payment"
android:icon="@drawable/ic_baseline_payment_24"/>
</menu>

3
 De asemenea sunt create și pictograme cu ajutorul Vector Asset.

fig.1

fig.2

fig.3

 În continuare sunt create fragmentele.


fragment_home.xml

4
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".HomeFragment">

<WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>

</RelativeLayout>

fragment_info.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".InfoFragment">

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Tarife"
android:textSize="25sp"
android:gravity="center"
android:id="@+id/txtInfoFragment"
android:textColor="@color/black"
/>

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/txtInfoFragment"
android:padding="10sp"
android:text="Ce reprezintă tariful?"
android:textSize="15sp"
android:textColor="@color/black"
android:background="@color/purple_200"
/>

<TextView
android:layout_width="match_parent"
android:layout_height="489dp"
android:layout_below="@+id/txtInfoFragment"
android:layout_marginTop="31dp"
android:padding="10sp"
android:text="Tariful pentru serviciile publice de alimentare cu apă
potabilă și de canalizare reprezintă o taxă pentru captarea și tratarea apei
brute, transportarea, pomparea și distribuția apei potabile, colectarea,
transportarea și epurarea apelor uzate."
android:textColor="@color/black"
android:textSize="15sp" />

<TextView
android:layout_width="match_parent"

5
android:layout_height="wrap_content"
android:layout_below="@+id/txtInfoFragment"
android:layout_marginTop="147dp"
android:padding="10sp"
android:text="Cum se calculează și se aprobă tarifele?"
android:textColor="@color/black"
android:background="@color/purple_200"
android:textSize="15sp" />

<TextView
android:layout_width="match_parent"
android:layout_height="489dp"
android:layout_below="@+id/txtInfoFragment"
android:layout_marginTop="178dp"
android:padding="10sp"
android:text="Structura şi nivelul tarifelor sunt stabilite astfel
încât să reflecte costul economic al furnizării serviciului; costurile
rezonabile suportate în mod eficient de către S.A. ”Apă-Canal Cahul”
(cheltuieli de exploatare, întreţinere, dezvoltare),
un nivel al rentabilităţii proporţional cu tipul şi riscul activităţii."
android:textColor="@color/black"
android:textSize="15sp" />

<TextView
android:layout_width="match_parent"
android:layout_height="489dp"
android:layout_below="@+id/txtInfoFragment"
android:layout_marginTop="304dp"
android:padding="10sp"
android:text="Tariful pentru apă și canalizare (pentru populație) în
Soroca este de 17,40 lei/m c."
android:textColor="@color/black"
android:textSize="15sp" />

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/txtInfoFragment"
android:layout_marginTop="366dp"
android:padding="10sp"
android:text="De ce se modifică tarifele?"
android:textColor="@color/black"
android:background="@color/purple_200"
android:textSize="15sp" />

<TextView
android:layout_width="match_parent"
android:layout_height="489dp"
android:layout_below="@+id/txtInfoFragment"
android:layout_marginTop="396dp"
android:padding="10sp"
android:text="Actualizarea tarifului este necesară pentru a putea, în
primul rînd, întreține și apoi, dezvolta și moderniza serviciul public de
alimentare cu apă potabilă și de canalizare."
android:textColor="@color/black"
android:textSize="15sp" />

</RelativeLayout>

fragment_payment.xml

6
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context="PaymentFragment">

<com.braintreepayments.cardform.view.CardForm
android:id="@+id/card_form"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginStart="9dp"
android:layout_marginTop="9dp"
android:layout_marginEnd="10dp"
android:layout_marginBottom="390dp"
android:hint="Numărul facturii"
android:background="@color/purple_200"
android:textSize="20sp" />

<Button
android:id="@+id/btnBuy"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="10dp"
android:layout_marginLeft="40dp"
android:layout_marginRight="40dp"
android:layout_marginTop="10dp"
android:background="@color/purple_200"
android:text="Achitare"
android:textColor="@android:color/white" />

</RelativeLayout>

HomeFragment.java (sunt specificate datele S.A. REGIA APĂ-CANAL SOROCA)


package com.example.apc;

import android.os.Bundle;

import androidx.fragment.app.Fragment;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class HomeFragment extends Fragment {

WebView intview;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_home, container,

7
false);

intview = (WebView) rootView.findViewById(R.id.webView);


intview.getSettings().setJavaScriptEnabled(true);
intview.getSettings().setDomStorageEnabled(true);

this.intview.loadUrl("https://www.data2b.md/ro/companies/1003607000120/
societatea-pe-actiuni-regia-apa-canal-soroca");

return rootView ;
}

InfoFragment.java (sunt specificate informații despre tarife)


package com.example.apc;

import android.os.Bundle;

import androidx.fragment.app.Fragment;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class InfoFragment extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_info, container, false);
}
}

PaymentFragment.java (este creată achitarea facturii cu ajutorul cardului bancar)


package com.example.apc;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;

import androidx.fragment.app.Fragment;

import android.text.InputType;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.Toast;

import com.braintreepayments.cardform.view.CardForm;

public class PaymentFragment extends Fragment {

CardForm cardForm;
Button buy;
8
AlertDialog.Builder alertBuilder;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup
container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_payment,
container, false);

cardForm = rootView.findViewById(R.id.card_form);
buy = rootView.findViewById(R.id.btnBuy);
cardForm.cardRequired(true)
.expirationRequired(true)
.cvvRequired(true)
.mobileNumberRequired(true)
.mobileNumberExplanation("SMS este trimis pe acest număr
de telefon")
.setup(getActivity());

cardForm.getCvvEditText().setInputType(InputType.TYPE_CLASS_NUMBER |
InputType.TYPE_NUMBER_VARIATION_PASSWORD);
buy.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (cardForm.isValid()) {
alertBuilder = new
AlertDialog.Builder(getActivity());
alertBuilder.setTitle("Confirm înainte de
achiziționare");
alertBuilder.setMessage("Numărul cardului: " +
cardForm.getCardNumber() + "\n" +
"Data expirării cardului: " +
cardForm.getExpirationDateEditText().getText().toString() + "\n" +
"CVV: " + cardForm.getCvv() + "\n" +
"Numărul facturii: " +
cardForm.getPostalCode() + "\n" +
"Numărul de telefon: " +
cardForm.getMobileNumber());
alertBuilder.setPositiveButton("Confirm", new
DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface
dialogInterface, int i) {
dialogInterface.dismiss();
Toast.makeText(getActivity(), "Vă mulțumim
pentru achiziționare", Toast.LENGTH_LONG).show();
}
});
alertBuilder.setNegativeButton("Anulare", new
DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface
dialogInterface, int i) {
dialogInterface.dismiss();
}
});
AlertDialog alertDialog = alertBuilder.create();
alertDialog.show();

} else {
Toast.makeText(getActivity(), "Vă rugăm completați
cerințele", Toast.LENGTH_LONG).show();
}

9
}
});
return rootView;
}
}

MainActivity.java
package com.example.apc;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.TargetApi;
import android.os.Build;
import android.os.Bundle;
import android.view.MenuItem;
import android.webkit.WebResourceRequest;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.android.material.navigation.NavigationBarView;

public class MainActivity extends AppCompatActivity {

BottomNavigationView bottomNavigationView;

HomeFragment homeFragment = new HomeFragment();


InfoFragment infoFragment = new InfoFragment();
PaymentFragment paymentFragment = new PaymentFragment();

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

bottomNavigationView = findViewById(R.id.bottom_navigation);

getSupportFragmentManager().beginTransaction().replace(R.id.container,homeFra
gment).commit();

//BadgeDrawable badgeDrawable =
bottomNavigationView.getOrCreateBadge(R.id.home);
//badgeDrawable.setVisible(true);
//badgeDrawable.setNumber(8);

bottomNavigationView.setOnItemSelectedListener(new
NavigationBarView.OnItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.home:

getSupportFragmentManager().beginTransaction().replace(R.id.container,homeFra
gment).commit();
return true;
case R.id.info:

getSupportFragmentManager().beginTransaction().replace(R.id.container,infoFra
gment).commit();
return true;

10
case R.id.payment:

getSupportFragmentManager().beginTransaction().replace(R.id.container,payment
Fragment).commit();
return true;
}

return false;
}
});
}
}

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.apc">

<uses-permission android:name="android.permission.INTERNET"/>

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.ApC">
<activity
android:name=".MainActivity"
android:exported="true"
android:configChanges="orientation|keyboardHidden|screenSize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />


</intent-filter>
</activity>
</application>

</manifest>

11
Rezultatul elaborării

fig.4 fig.5

Webografie
https://www.youtube.com/watch?v=OV25x3a55pk

https://www.youtube.com/watch?v=WPAHa2GZIYo&t=530s

https://www.youtube.com/watch?v=7QxBFfkT1g4&t=925s

https://www.codingdemos.com/android-credit-card-form-tutorial/

12

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