كيفاش تصاوب تطبيق Top 10 Downloads ب Android

imadbelasri Android
AN

فهاد الدرس غادي نصابو مشروع بسيط بandroid عبارة عن تطبيق كيعرض قائمة أفضل عشر تطبيقات مجانية فمتجر آبل التطبيق بسيط المهم فيه هو تعرف كيفاش تجبد المعلومات بالإعتماد على واحد api لي كتوفرها شركة آبل مجانا لمستخدميها.


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


- ملفات الواجهة

أول حاجة غادي نفتح Android Studio وغادي نزيد مشروع جديد نسميه Top10Downloader من بعد غادي نمشي ل res/layout/activity_main.xml وغادي نزيد فيه الكود لي غادي يمكني من عرض التطبيقات فالقائمة فالصفحة الرئيسية بعد الظغط على الزر Afficher الكود ديالو هو :

                                                    
                                                        <?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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.darijacoding.top10downloader.MainActivity">
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Afficher"
        android:id="@+id/getData"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />
    <ListView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/listView"
        android:layout_below="@+id/getData"
        android:layout_centerHorizontal="true"
     />
</RelativeLayout>

                                                    
                                                

-الملف list_item.xml

فنفس المجلد غادي نزيد ملف ونسميه list_item.xml ولي غادي يكون فيه واحد textview غادي تضمن المعلومات الخاصة بكل تطبيق الكود ديالو :

                                                        
                                                            <?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
</TextView>
                                                        
                                                    

- الملف Application.java

فالمجلد java وفل package لي فيه ل MainActivity.java كتزيد ملف جديد عبارة عن class كتسميها Application.java فيها غادي يكون الكود لي فيه المعلومات الخاصة بالتطبيق الإسم ديالو و مولاه والتاريخ فوقاش خرج بالإضافة لgetters و setters لي كيمكنو من استرجاع وتعديل كل معلومة من لي دكرنا الكود ديالو هو :

                                                        
                                                            package com.example.darijacoding.top10downloader;

/**
 * Created by Imad on 10/02/2017.
 */
public class Application {
    private String name;
    private String artist;
    private String releaseDate;

    public String getName() {
        return name;
    }

    public String getArtist() {
        return artist;
    }

    public String getReleaseDate() {
        return releaseDate;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setArtist(String artist) {
        this.artist = artist;
    }

    public void setReleaseDate(String releaseDate) {
        this.releaseDate = releaseDate;
    }

    @Override
    public String toString() {
        return  "Nom :" + getName() + "\n"+
                "Artiste :" + getArtist() + "\n" +
                "Date de sortie :" + getReleaseDate() + "\n";
    }
}

                                                        
                                                    

- الملف ParseApplication.java

فالمجلد java وفل package لي فيه ل MainActivity.java كتزيد ملف جديد عبارة عن class كتسميها ParseApplication.java فيها غادي يكون الكود لي يقوم بمعالجة المعلومات لي جاتنا من الرابط http://ax.itunes.apple.com /WebObjects/MZStoreServices.woa /ws/RSS/topfreeapplications /limit=10/xml ولي عبارة عن xml كنقلبو على Tag Entry حيت يلا درتي الرابط فالمتصفح غادي تلقى كل المعلومات لي باغيين ف Tag Entry من بعد كنستخرج منها الإسم وصاحب التطبيق وتاريخ الإضافة وكنزيدهم ف currentRecord لي عبارة عن جدول من صنف Application الكود ديال الملف ديالنا هو :

                                                        
                                                            package com.example.darijacoding.top10downloader;

import android.util.Log;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import java.io.StringReader;
import java.util.ArrayList;

/**
 * Created by Imad on 10/02/2017.
 */
public class ParseApplication{
    private String xmlData;
    private ArrayList<Application> applications;
    public ParseApplication(String xmlData) {
        this.xmlData = xmlData;
        applications = new ArrayList<Application>();
    }

    public ArrayList<Application> getApplications() {
        return applications;
    }
    public boolean process(){
        boolean status = true;
        Application currentRecord = null;
        boolean inEntry = false;
        String textValue = "";
        try{
            XmlPullParserFactory  factory = XmlPullParserFactory.newInstance();
            factory.setNamespaceAware(true);
            XmlPullParser xpp = factory.newPullParser();
            xpp.setInput(new StringReader(this.xmlData));
            int EventType = xpp.getEventType();
            Log.d("Starting Tag For",String.valueOf(EventType));
            while(EventType != XmlPullParser.END_DOCUMENT){
                String tagName = xpp.getName();
                switch(EventType){
                    case XmlPullParser.START_TAG:
                    Log.d("Starting Tag For",tagName);
                        if(tagName.equalsIgnoreCase("entry")){
                            inEntry = true;
                            currentRecord = new Application();
                        }
                        break;
                    case XmlPullParser.TEXT:
                        textValue = xpp.getText();
                        break;
                    case XmlPullParser.END_TAG:
                        //Log.d("Ending Tag For",tagName);
                        if(inEntry){
                            if(tagName.equalsIgnoreCase("entry")){
                                applications.add(currentRecord);
                                inEntry = false;
                            }else if(tagName.equalsIgnoreCase("name")){
                                currentRecord.setName(textValue);
                            }else if(tagName.equalsIgnoreCase("artist")){
                                currentRecord.setArtist(textValue);
                            }else if(tagName.equalsIgnoreCase("releasedate")){
                                currentRecord.setReleaseDate(textValue);
                            }
                        }
                        break;
                    default:
                }
                EventType = xpp.next();
            }
        }catch(Exception e){
            status = false;
            e.printStackTrace();
        }
        /*for(Application app : applications){
            Log.d("Applications","*************");
            Log.d("Name",app.getName());
            Log.d("Artist Name",app.getArtist());
            Log.d("Realease date",app.getReleaseDate());
        }*/
        return true;
    }
}

                                                        
                                                    

- الملف MainActivity.java

هادا هو الملف الرئيسي لي فيه الكود لي كيقوم بالإتصال ب الرابط لي زدنا عبر لclass DownloadData لي كتخدم بلClass AsyncTask ولي من بعد مكتعطينا النتيجة وكنخزنوها فل variable mFileContents كنصيفطها للclass ParseApplication وكنفد الfonction proccess منبعد كنخدم بل adapter لي هو لي كيمكني من ملء القائمة بالمعلومات لي حصلت عليها وآخر حاجة كنزيد الكود فAndroidManifest.xml كنمكن التطبيق من استخدام الانترنيت الكود ديال الملف هو :

                                                        
                                                            //AndroidManifest.xml code

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

//MainActivity.java code
package com.example.darijacoding.top10downloader;

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;

import java.io.IOError;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class MainActivity extends AppCompatActivity {
    private Button getData;
    private ListView liste;
    private String mFileContents;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getData = (Button) findViewById(R.id.getData);
        liste = (ListView) findViewById(R.id.listView);
        getData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ParseApplication parseApplication = new ParseApplication(mFileContents);
                parseApplication.process();
                ArrayAdapter<Application> adapter = new ArrayAdapter(MainActivity.this,R.layout.list_item,parseApplication.getApplications());
                liste.setAdapter(adapter);
            }
        });
        DownloadData data = new DownloadData();
        data.execute("http://ax.itunes.apple.com/WebObjects/MZStoreServices.woa/ws/RSS/topfreeapplications/limit=10/xml");
    }
    private class DownloadData extends AsyncTask<String,Void,String>{
        @Override
        protected String doInBackground(String... params) {
            mFileContents = downloadXmlFile(params[0]);
            if(mFileContents == null){
                Log.d("DownloadData","Error Downloading");
            }
            return mFileContents;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            Log.d("DownloadData","Result is:"+result);
        }

        private String downloadXmlFile(String urlPath) {
            StringBuilder tempBuffer = new StringBuilder();
            try{
                URL url = new URL(urlPath);
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                int response = connection.getResponseCode();
                Log.d("DownloadData","The response code was "+response);
                InputStream is = connection.getInputStream();
                InputStreamReader str = new InputStreamReader(is);
                int charRead;
                char[] storeDataGot = new char[500];
                while(true){
                    charRead = str.read(storeDataGot);
                    if(charRead <= 0){
                        break;
                    }
                    tempBuffer.append(String.copyValueOf(storeDataGot,0,charRead));
                }
                return tempBuffer.toString();
            }catch(IOException e){
                Log.d("DownloadData","Error Downloading"+e.getMessage());
            }
            return null;
        }
    }
}