تطبيق compteur de calories بأندرويد الجزء الثالت

فهاد الجزء الثالت والأخير من تطبيق compteur de calories بأندرويد غادي نكملو الملفات لي بقاو ولي غادي يمكنونا من عرض les aliments لي دخل المستخدم ف liste من بعد غادي نشوفو كيفاش نعرضو les détails ديال واحد ل aliment  اختارو المستخدم كما غادي نشوفو كيفاش نديرولو partager او نمسحوه. 

نظرة سريعة بالفيديو


1- MainActivity.java


فالمجلد java كاين MainActivity.java فيه غادي نزيدو الكود لي غادي يمكن من استرجاع المعلومات لي دخل المستخدم فل les champs من بعد ما كن créer l'objet من la classe DataBaseHandler وف saveToDb كنزيد المعلومات لي دخل ف table باستعمال ل fonction addFood منبعد كنوجه المستخدم لل DisplayFood Activity لي غادي تمكن من عرض les aliments لي عندنا فla liste الكود ديال الملف هو:

                                    
                                        package coml.jbarli.contact.calcounter;

import android.content.Intent;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import data.DataBaseHandler;
import model.Food;
public class MainActivity extends ActionBarActivity {
    private Button saveButton;
    private EditText FoodNameText;
    private EditText CaloriesText;
    private DataBaseHandler dba;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        dba =  new DataBaseHandler(MainActivity.this);
        FoodNameText = (EditText) findViewById(R.id.foodEditText);
        CaloriesText = (EditText) findViewById(R.id.CaloriesEditText);
        saveButton = (Button) findViewById(R.id.submitButton);
        saveButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                saveToDb();
            }
        });
    }
    private void saveToDb() {
        Food food = new Food();
        String Name = FoodNameText.getText().toString().trim();
        String calories = CaloriesText.getText().toString().trim();
        if(Name.isEmpty() || calories.isEmpty()){
            Toast.makeText(getApplicationContext(),"Veuillez remplir le champ vide",Toast.LENGTH_LONG).show();
        }else{
                int cals = Integer.parseInt(calories);
                food.setCalories(cals);
                food.setFoodName(Name);
                dba.addFood(food);
                dba.close();
                FoodNameText.setText("");
                CaloriesText.setText("");
                startActivity(new Intent(MainActivity.this,DisplayFood.class));
        }
    }
}

                                    
                                

2- CustomListViewer.java


كنرجع لل package data فيه كنزيد الملف CustomListViewer لي عبارة عن java class ولي غادي تمكنا من عرض les aliments ف listview فمنبعد مكن créer ل constructeur عندي les fonctions لي كيرجعوا total ديال les aliments لي فل arraylist بالإضافة لإسترجاع aliment ول position ديال aliment من بعد ف getView كنسترجع les textviews ديال إسم وتاريخ وعدد السعرات ديال chaque aliment منبعد كنسترجع كل aliment بل fonction getItem لي كتاخد ل position ديال chaque aliment وكنعرض المعلومات ف textviews من بعد فل onclick ديال كل aliment كندي المستخدم لل DisplayItemFoodDetails Activity لي غادي تمكن من عرض المعلومات ديالو الكود ديال الملف هو :

                                    
                                        package data;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import java.util.ArrayList;

import coml.jbarli.contact.calcounter.DisplayItemFoodDetails;
import coml.jbarli.contact.calcounter.R;
import model.Food;

/**
 * Created by BELASRIIMAD on 09/02/2016.
 */
public class CustomListViewer extends ArrayAdapter<Food> {
    private Activity activity;
    private ArrayList<Food> FoodList = new ArrayList<>();
    private int LayoutRessource;
    public CustomListViewer(Activity act, int resource,ArrayList<Food> data) {
        super(act, resource,data);
        LayoutRessource = resource;
        activity = act;
        FoodList = data;
        notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        return FoodList.size();
    }

    @Override
    public Food getItem(int position) {
        return FoodList.get(position);
    }

    @Override
    public int getPosition(Food item) {
        return super.getPosition(item);
    }

    @Override
    public long getItemId(int position) {
        return super.getItemId(position);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        ViewHolder holder = null;
        if(row == null || (row.getTag() == null)){
            LayoutInflater inflater = LayoutInflater.from(activity);
            row = inflater.inflate(LayoutRessource,null);
            holder = new ViewHolder();
            holder.foodName = (TextView) row.findViewById(R.id.foodName);
            holder.foodCalories = (TextView) row.findViewById(R.id.calories);
            holder.foodDate = (TextView) row.findViewById(R.id.dateText);
            row.setTag(holder);
        }else{
            holder = (ViewHolder) row.getTag();
        }
        holder.food = getItem(position);
        holder.foodName.setText(holder.food.getFoodName());
        holder.foodCalories.setText(String.valueOf(holder.food.getCalories()));
        holder.foodDate.setText("le :" + holder.food.getRecorDate());
        final ViewHolder finalHolder = holder;
        row.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 Intent i = new Intent(activity, DisplayItemFoodDetails.class);
                 Bundle mBundle = new Bundle();
                 mBundle.putSerializable("userObj", finalHolder.food);
                 i.putExtras(mBundle);
                 activity.startActivity(i);
            }
        });
        return row;
    }
    public class ViewHolder{
        Food food;
        TextView foodName;
        TextView foodCalories;
        TextView foodDate;
    }
}

                                    
                                

3- DisplayFood.java


فالمجلد java كاين DisplayFood.java فيه غادي نزيدو الكود لي غادي يمكن من استرجاع les aliments لي عندنا فقاعدة البيانات وغادي نعرضوهم فل listview فمنبعد مكنسترجع les texviews فين غادي يكون مجموع السعرات الحرارية وtotal des aliments عندي ايضا arraylist dbaFood لي غادي نزيدو فيها les aliments لي استرجعنا فكنخدم بل fonction refreshData لي كن créer فيها ل objet من la classe DataBaseHandler منبعد كنسترجع les aliments بل fonction getFoods لي سبق وشوفنا منبعد كنعرض مجموع السعرات الحرارية وtotal des aliments ف textviews منبعد كنخدم ب for باش كنسترجع les aliments وكنزيد كل واحد فل arraylist منبعد كن créer ل adapter من la classe CustomListViewer لي كنعطيها ل arraylist dbaFood ومنبعد كنعطي لل listview ل adapter لي زدنا الكود ديال الملف هو:

                                      
                                        package coml.jbarli.contact.calcounter;

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.widget.ListView;
import android.widget.TextView;

import java.util.ArrayList;

import data.CustomListViewer;
import data.DataBaseHandler;
import model.Food;
import util.Utils;

public class DisplayFood extends ActionBarActivity {
    private DataBaseHandler dba;
    private ArrayList<Food> dbaFood = new ArrayList<>();
    private CustomListViewer foodAdapter;
    private ListView liste;
    private Food food;
    private TextView totalFood,totalCal;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_display_food);
        liste = (ListView) findViewById(R.id.list);
        totalCal = (TextView) findViewById(R.id.totalAmountTextView);
        totalFood = (TextView) findViewById(R.id.totalItemsTextView);
        refreshData();
    }

    private void refreshData() {
        dbaFood.clear();
        dba = new DataBaseHandler(getApplicationContext());
        ArrayList<Food> foodFromDb = dba.getFoods();
        int calValue = dba.getTotalCalories();
        int foodItems = dba.getSavedItems();
        String formattedCalsValues= Utils.formatNumber(calValue);
        String formattedFoodItems = Utils.formatNumber(foodItems);
        totalCal.setText("Total calories :" + formattedCalsValues);
        totalFood.setText("Total aliments :" + formattedFoodItems);
        for(int i = 0; i < foodFromDb.size() ; i++){
            String foodName = foodFromDb.get(i).getFoodName();
            String recordDate = foodFromDb.get(i).getRecorDate();
            int calories = foodFromDb.get(i).getCalories();
            int foodID = foodFromDb.get(i).getFoodId();
            Food myFood = new Food();
            myFood.setFoodName(foodName);
            myFood.setCalories(calories);
            myFood.setRecorDate(recordDate);
            myFood.setFoodId(foodID);
            dbaFood.add(myFood);
        }
        dba.close();
        //set the adapter
        foodAdapter = new CustomListViewer(DisplayFood.this,R.layout.liste_row,dbaFood);
        liste.setAdapter(foodAdapter);
        foodAdapter.notifyDataSetChanged();
    }

}

                                      
                                    

4- DisplayItemFoodDetails.java


فالمجلد java كاين الملف DisplayItemFoodDetails.java فيه غادي نزيدو الكود لي غادي يمكن من استرجاع ل aliment لي كليكا عليه المستخدم وعرض المعلومات الخاصة به فأول حاجة كنسترجع les textviews من بعد كنزيد les calories وإسم ديال ل aliment ول la date ديال ل ajout ف textviews منبعد فل onclick ديال ل bouton partager كتنفد ل fonction shareFood لي كتمكن باش نبارطاجي داك ل aliment وفل onclick ديال ل bouton supprimer كنعرض واحد رسالة تأكيد واش فعلا باغي يمسح ل aliment منبعد يلا كانت oui كن créer l'objet من la classe DataBaseHandler منبعد كنخدف بل fonction deleteFood لي كتمكن من حدف aliment باستعمال id ديالو الكود ديال الملف هو : 

                                        
                                            package coml.jbarli.contact.calcounter;

import android.app.AlertDialog;
import android.content.ActivityNotFoundException;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import data.DataBaseHandler;
import model.Food;

public class DisplayItemFoodDetails extends ActionBarActivity {
    private TextView foodName,Calories,DateTaken;
    private Button ShareButton,DeleteItemButton;
    private int FoodId;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_display_item_food_details);
        foodName = (TextView) findViewById(R.id.detsFoodName);
        Calories = (TextView) findViewById(R.id.detsCaloriesValue);
        DateTaken = (TextView) findViewById(R.id.detsDateText);
        ShareButton = (Button) findViewById(R.id.detsShareButton);
        DeleteItemButton = (Button) findViewById(R.id.deleteButton);
        Food food = (Food) getIntent().getSerializableExtra("userObj");
        foodName.setText(food.getFoodName());
        Calories.setText(String.valueOf(food.getCalories()));
        DateTaken.setText(food.getRecorDate());
        FoodId = food.getFoodId();
        Calories.setTextSize(34.9f);
        Calories.setTextColor(Color.RED);
        ShareButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                shareFood();
            }
        });
        DeleteItemButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder alert = new AlertDialog.Builder(DisplayItemFoodDetails.this);
                alert.setTitle("Supprimer");
                alert.setMessage("Voulez vous vraiment supprimer cet aliment?");
                alert.setNegativeButton("Non", null);
                alert.setPositiveButton("Oui", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        DataBaseHandler dba = new DataBaseHandler(getApplicationContext());
                        dba.deleteFood(FoodId);
                        Toast.makeText(getApplicationContext(),"Aliment supprimé",Toast.LENGTH_LONG).show();
                        startActivity(new Intent(DisplayItemFoodDetails.this,DisplayFood.class));
                        //liberer la memoire
                        DisplayItemFoodDetails.this.finish();
                    }
                });
                alert.show();
            }
        });
    }
    public void shareFood(){
        StringBuilder builder = new StringBuilder();
        String name = foodName.getText().toString();
        String calories = Calories.getText().toString();
        String date = DateTaken.getText().toString();
        builder.append("Aliment:"+ name + "\n");
        builder.append("Calories:"+ calories + "\n");
        builder.append("Date:" + date + "\n");
        Intent i = new Intent(Intent.ACTION_SEND);//send email
        i.setType("message/rfc822");
        i.putExtra(Intent.EXTRA_SUBJECT, "Mes calories");
        i.putExtra(Intent.EXTRA_EMAIL, new String[]{"recipient@exemple.com"});
        i.putExtra(Intent.EXTRA_TEXT,builder.toString());
        try{
            startActivity(Intent.createChooser(i, "Envois..."));
        }catch(ActivityNotFoundException e ){
            Toast.makeText(getApplicationContext()," Vous devez installer un client de messagerie...",Toast.LENGTH_LONG).show();
        }
    }
}

                                        
                                    

كلمات مفاتيح :