تطبيق Flickr بإستعمال Android الجزء الرابع

imadbelasri Android
AN

فهاد الجزء الرابع والأخير من تطبيق Flickr بإستعمال Android غادي نكملو الملفات لي بقاو ولي هما الملف لي غادي يمكنا من عرض كل الصور فالصفحة الرئيسية والملف لي غادي يمكن من البحث عن صور والملف لي غادي يمكن من عرض المعلومات الخاصة بصورة اختارها المستخدم.


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


1- الملف SearchActivity.java

فالمجلد com.example زيد ملف جديد عبارة عن java class سميه SearchActivity.java فيه غادي يكون الكود لي غادي يمكن باش نسترجعوا القيمة لي دخل المستخدم فالحقل ديال البحث ومن بعد غادي نخدمو بSharedPreferences لي هي بحال جدول كنخزنو فيه المعلومات لي بغينا لكن عكس الجدول المعلومات كتبقى وخا تسد التطبيق وتعاود تفتحو وهاد القيمة لي دخل كنعطيوها اسم data لي هي variable static كاينة فل MainActivity.java من بعد مكتخزن القيمة كتسد SearchActivity والكود لي فonCreate هداك غير باش كنزيدو toolbar لSearchActivity الكود ديال الملف هو:

                                                    
                                                        package com.example.belasri.flickerbrowser;

import android.app.SearchManager;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;

public class SearchActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_search, menu);
        // Get the SearchView and set the searchable configuration
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        final SearchView searchView = (SearchView) menu.findItem(R.id.search_view).getActionView();
        // Assumes current activity is the searchable activity
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        searchView.setIconifiedByDefault(false); // Do not iconify the widget; expand it by default
        //process searching
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
                prefs.edit().putString(MainActivity.data,query).commit();
                searchView.clearFocus();
                finish();
                return true;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                return false;
            }
        });
        searchView.setOnCloseListener(new SearchView.OnCloseListener() {
            @Override
            public boolean onClose() {
                finish();
                return false;
            }
        });
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        return super.onOptionsItemSelected(item);
    }
}

                                                    
                                                

2- الملف MainActivity.java

فالمجلد com.example عندنا الملف MainActivity.java لي هي ل Activity الرئيسية ديالنا أو الصفحة الرئيسية فعندنا des variables كاين mRecyclerView منبعد كاين flickerRecyclerViewAdapter لي هو لadapter لي زدنا من قبل ثم كاين data لي خدمنا بها ف SearchActivity من بعد كاين variable PHOTO_OBJECT لي غادي نرسلوها للPhotoDetails.java ولي غادي نزيدوها من بعد كنزيدو recyclerview ديالنا للActivity وكنخدمو بال ProcessPhotos class لي زدناها لتحت ولي كت hériter من لclass GetFlickerDataInJson فكنعطيها tag لي زدت ولي هي android منبعد كتexecuter لclass ProcessData ولي كت hériter من لclass DownloadJsonData ولي كتعطي للadapter objet de type photo منبعد كتزيد لadapter أ recyclerview ومنبعد كتحقق من واش المستخدم كليكا على شي عنصر من recyclerview ملي كيكليكي كترسل لعنصر لي كليكا عليه ولي هو Photo للملف PhotoDetails.java ولي غادي يعرض التفاصيل ديال الصورة أما onResume فهي ملي المستخدم كيدخل شي قيمة فالحقل فكتسترجعها بواسطة getSavedData وكترسلها للProcessPhotos باش تعرض الصور لي كيبحث عليهم المستخدم الكود ديال الملف هو :

                                                        
                                                            package com.example.belasri.flickerbrowser;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

import com.example.belasri.flickerbrowser.adapters.FlickerRecyclerViewAdapter;
public class MainActivity extends AppCompatActivity{
    private static final String LOG_TAG = "MainActivity";
    private RecyclerView mRecyclerView;
    private FlickerRecyclerViewAdapter flickerRecyclerViewAdapter;
    public final static String data = "data";
    public final static String PHOTO_OBJECT = "PHOTO_OBJECT";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        //String url = "https://api.flickr.com/services/feeds/photos_public.gne?tags=android&format=json&nojsoncallback=1";
        //GetData getData = new GetData(url);
        //GetFlickerDataInJson jsonData = new GetFlickerDataInJson("android",true);
        //jsonData.execute();
        mRecyclerView = (RecyclerView) findViewById(R.id.recycler);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        ProcessPhotos processPhotos = new ProcessPhotos("android",true);
        processPhotos.execute();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    protected void onResume() {
        super.onResume();
        if(flickerRecyclerViewAdapter != null){
            String query = getSavedData(data);
            if(query.length() > 0){
                ProcessPhotos processPhotos = new ProcessPhotos(query,true);
                processPhotos.execute();
            }
        }
    }

    private String getSavedData(String data) {
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
        return  prefs.getString(data,"");
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if(id == R.id.search){
            Intent intent = new Intent(MainActivity.this,SearchActivity.class);
            startActivity(intent);
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
    public class ProcessPhotos extends GetFlickerDataInJson{

        public ProcessPhotos(String searchingTag, Boolean MatchAll) {
            super(searchingTag, MatchAll);
        }
        public void execute(){
            super.execute();
            ProcessData processData = new ProcessData();
            processData.execute();
        }
        public class ProcessData extends DownloadJsonData{
            @Override
            protected void onPostExecute(String dataReturned) {
                super.onPostExecute(dataReturned);
                flickerRecyclerViewAdapter = new FlickerRecyclerViewAdapter(MainActivity.this,getmPhotos());
                mRecyclerView.setAdapter(flickerRecyclerViewAdapter);
                flickerRecyclerViewAdapter.notifyDataSetChanged();
                ItemClickSupport.addTo(mRecyclerView).setOnItemClickListener(new ItemClickSupport.OnItemClickListener() {
                    @Override
                    public void onItemClicked(RecyclerView recyclerView, int position, View v) {
                        Log.v("Item clicked",String.valueOf(getmPhotos().get(position).getItemTitle()));
                    }
                });
                ItemClickSupport.addTo(mRecyclerView).setOnItemLongClickListener(new ItemClickSupport.OnItemLongClickListener() {
                    @Override
                    public void onItemLongClicked(RecyclerView recyclerView, int position, View v) {
                        Intent intent = new Intent(MainActivity.this,PhotoDetails.class);
                        intent.putExtra(PHOTO_OBJECT,flickerRecyclerViewAdapter.getPhoto(position));
                        startActivity(intent);
                    }
                });
            }
        }
    }
}

                                                        
                                                    

3- الملف PhotoDetails.java

فالمجلد com.example زيد ملف جديد سميه PhotoDetails.java هادا الملف أو ل Activity لي غادي تعرض التفاصيل ديال كل صورة اختارها المستخدم فمنبعد مكتستقبل لobjet photo كتسترجع les textviews ول imageView لي عندنا فالملف activity_photo_details.xml كتعطيهم العنوان وtags وإسم مول الصورة لي فلobjet photo والصورة كتزيدها فل imageView باستعمال Picasso الكود ديال الملف هو

                                                        
                                                            package com.example.belasri.flickerbrowser;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.widget.ImageView;
import android.widget.TextView;

import com.example.belasri.flickerbrowser.model.Photo;
import com.squareup.picasso.Picasso;

public class PhotoDetails extends AppCompatActivity {
    TextView title,tags,author;
    ImageView photo_link;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_photo_details);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        Photo photo = (Photo) getIntent().getSerializableExtra(MainActivity.PHOTO_OBJECT);
        title = (TextView) findViewById(R.id.photo_title);
        tags = (TextView) findViewById(R.id.photo_tags);
        author = (TextView) findViewById(R.id.photo_author);
        photo_link = (ImageView) findViewById(R.id.photo);
        title.setText(photo.getItemTitle());
        tags.setText("Tags: " + photo.getItemTags());
        author.setText(photo.getItemAuthor());
        Picasso.with(this).load(photo.getItemImage()).error(R.drawable.placeholder).placeholder(R.drawable.placeholder).into(photo_link);
    }
}

                                                        
                                                    

4- الملف ItemClickSupport.java

فالمجلد com.example زيد ملف جديد سميه ItemClickSupport.java هاد ل class قادها واحد السيد كتمكن باش تزيد لitemclick لrecyclerview يعني تكليكي على شي عنصر فيها حيت recyclerview مكتsupporter لitemclick بحال لlistview ميمكناش نكليكيو على شي صورة وتدينا للPhotoDetails.java باش نشوفو التفاصيل فهاد لclass كتزيدنا هاد لoption الكود ديال الملف هو:

                                                        
                                                            package com.example.belasri.flickerbrowser;

import android.support.v7.widget.RecyclerView;
import android.view.View;

/**
 * Created by belasri on 10/05/2017.
 */
public class ItemClickSupport {
    private final RecyclerView mRecyclerView;
    private OnItemClickListener mOnItemClickListener;
    private OnItemLongClickListener mOnItemLongClickListener;
    private View.OnClickListener mOnClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mOnItemClickListener != null) {
                RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(v);
                mOnItemClickListener.onItemClicked(mRecyclerView, holder.getAdapterPosition(), v);
            }
        }
    };
    private View.OnLongClickListener mOnLongClickListener = new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            if (mOnItemLongClickListener != null) {
                RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(v);
                mOnItemLongClickListener.onItemLongClicked(mRecyclerView, holder.getAdapterPosition(), v);
            }
            return false;
        }
    };
    private RecyclerView.OnChildAttachStateChangeListener mAttachListener
            = new RecyclerView.OnChildAttachStateChangeListener() {
        @Override
        public void onChildViewAttachedToWindow(View view) {
            if (mOnItemClickListener != null) {
                view.setOnClickListener(mOnClickListener);
            }
            if (mOnItemLongClickListener != null) {
                view.setOnLongClickListener(mOnLongClickListener);
            }
        }

        @Override
        public void onChildViewDetachedFromWindow(View view) {

        }
    };

    private ItemClickSupport(RecyclerView recyclerView) {
        mRecyclerView = recyclerView;
        mRecyclerView.setTag(R.id.item_click_support, this);
        mRecyclerView.addOnChildAttachStateChangeListener(mAttachListener);
    }

    public static ItemClickSupport addTo(RecyclerView view) {
        ItemClickSupport support = (ItemClickSupport) view.getTag(R.id.item_click_support);
        if (support == null) {
            support = new ItemClickSupport(view);
        }
        return support;
    }

    public static ItemClickSupport removeFrom(RecyclerView view) {
        ItemClickSupport support = (ItemClickSupport) view.getTag(R.id.item_click_support);
        if (support != null) {
            support.detach(view);
        }
        return support;
    }

    public ItemClickSupport setOnItemClickListener(OnItemClickListener listener) {
        mOnItemClickListener = listener;
        return this;
    }

    public ItemClickSupport setOnItemLongClickListener(OnItemLongClickListener listener) {
        mOnItemLongClickListener = listener;
        return this;
    }

    private void detach(RecyclerView view) {
        view.removeOnChildAttachStateChangeListener(mAttachListener);
        view.setTag(R.id.item_click_support, null);
    }

    public interface OnItemClickListener {

        void onItemClicked(RecyclerView recyclerView, int position, View v);
    }

    public interface OnItemLongClickListener {

        void onItemLongClicked(RecyclerView recyclerView, int position, View v);
    }
}
                                                        
                                                    

5- الملف ids.xml

حاجة أخرى باش تخدم لclass لي زدنا من قبل غادي تزيد واحد الملف سميه ids.xml فالمجلد res/values وغادي تبقى آخر حاجة هي تزيد للكونيكسيون internet فالملف AndroidManifest.xml وملف غادي يزيد لbackground للrecyclerview غادي تلقاه فالكود سورس الكود ديال الملف ids.xml هو :

                                                        
                                                            <?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="item_click_support" type="id" />
</resources>