Android Open Source - soas Photos List Activity






From Project

Back to project page soas.

License

The source code is released under:

Apache License

If you think the Android project soas listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package com.meg7.soas.ui;
//from  www.j  ava2s  . co  m
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.view.MenuItem;
import android.view.View;

import com.meg7.soas.R;
import com.meg7.soas.data.Photo;
import com.meg7.soas.data.Photos;
import com.meg7.soas.ui.fragment.PhotoDetailFragment;
import com.meg7.soas.ui.fragment.PhotosListFragment;
import com.meg7.soas.ui.fragment.retained.PhotosListTaskFragment;

import org.parceler.Parcels;

/**
 * An activity representing a list of Repos. This activity
 * has different presentations for handset and tablet-size devices. On
 * handsets, the activity presents a list of items, which when touched,
 * lead to a {@link PhotoDetailActivity} representing
 * item details. On tablets, the activity presents the list of items and
 * item details side-by-side using two vertical panes.
 * <p>
 * The activity makes heavy use of fragments. The list of items is a
 * {@link com.meg7.soas.ui.fragment.PhotosListFragment} and the item details
 * (if present) is a {@link com.meg7.soas.ui.fragment.PhotoDetailFragment}.
 * <p>
 * This activity also implements the required
 * {@link com.meg7.soas.ui.fragment.PhotosListFragment.Callbacks} interface
 * to listen for item selections.
 */
public class PhotosListActivity extends BaseActivity
        implements PhotosListFragment.Callbacks, PhotosListTaskFragment.TaskCallbacks {

    private static final String TAG_TASK_FRAGMENT_PHOTOS_LIST = "photosListTaskFragment";

    private ActionBarDrawerToggle mDrawerToggle;

    private FragmentManager mFragmentManager;

    private PhotosListTaskFragment mPhotosListTaskFragment;
    private PhotosListFragment mPhotosListFragment;

    /**
     * Whether or not the activity is in two-pane mode, i.e. running on a tablet
     * device.
     */
    private boolean mIsTwoPane;

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

        DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer);
        drawerLayout.setStatusBarBackground(R.color.material_color_primary_dark);

        // Tie the DrawerLayout with the Toolbar.
        mDrawerToggle = new ActionBarDrawerToggle(this, drawerLayout,
                getToolbar(), R.string.drawer_open, R.string.drawer_close);
        mDrawerToggle.setDrawerIndicatorEnabled(true);
        drawerLayout.setDrawerListener(mDrawerToggle);

        mFragmentManager = getFragmentManager();

        mPhotosListFragment = (PhotosListFragment) mFragmentManager.findFragmentById(R.id.photosList);

        if (findViewById(R.id.photoDetailContainer) != null) {
            // The detail container view will be present only in the
            // large-screen layouts (res/values-large and
            // res/values-sw600dp). If this view is present, then the
            // activity should be in two-pane mode.
            mIsTwoPane = true;

            // In two-pane mode, list items should be given the
            // 'activated' state when touched.
            mPhotosListFragment.setActivateOnItemClick(true);
        }

        // Clear Back Stack on recreate.
        // mFragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
        // Or do nothing and make onBackPressed is handled normally.
        if (mIsTwoPane && mFragmentManager.getBackStackEntryCount() > 0) {
            findViewById(R.id.photosNoItemSelected).setVisibility(View.GONE);
        }

        // Initiate tasks.
        mPhotosListTaskFragment = (PhotosListTaskFragment) mFragmentManager.findFragmentByTag(TAG_TASK_FRAGMENT_PHOTOS_LIST);
        // If the Fragment is non-null, then it is currently being
        // retained across a configuration change.
        if (mPhotosListTaskFragment == null) {
            mPhotosListTaskFragment = new PhotosListTaskFragment();
            mFragmentManager.beginTransaction().
                    add(mPhotosListTaskFragment, TAG_TASK_FRAGMENT_PHOTOS_LIST).commit();
        } else {
            mPhotosListFragment.setPhotos(
                    mPhotosListTaskFragment.getLastRequestedPhotosStatusCode(),
                    mPhotosListTaskFragment.getLastRequestedPhotos());
        }

        // TODO: If exposing deep links into your app, handle intents here.

    }

    @Override
    protected int getLayoutResource() {
        return R.layout.activity_photos_list;
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        mDrawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        mDrawerToggle.onConfigurationChanged(newConfig);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (mDrawerToggle.onOptionsItemSelected(item)) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    public void refresh() {
        mPhotosListTaskFragment.refresh();
    }

    @Override
    public void requestNextPage() {
        mPhotosListTaskFragment.requestNextPage();
    }

    /**
     * Callback method from {@link com.meg7.soas.ui.fragment.PhotosListFragment.Callbacks}
     * indicating that the item with the given ID was selected.
     */
    @Override
    public void onItemSelected(View view, Photo photo) {
        if (mIsTwoPane) {
            // In two-pane mode, show the detail view in this activity by
            // adding or replacing the detail fragment using a
            // fragment transaction.
            PhotoDetailFragment fragment = PhotoDetailFragment.newInstance(Parcels.wrap(photo));
            mFragmentManager.beginTransaction()
                    .replace(R.id.photoDetailContainer, fragment)
                    // Add this transaction to the back stack.
                    .addToBackStack(photo.photoTitle)
                    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
                    .commit();

            findViewById(R.id.photosNoItemSelected).setVisibility(View.GONE);
            mFragmentManager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
                @Override
                public void onBackStackChanged() {
                    if (mFragmentManager.getBackStackEntryCount() == 0) {
                        findViewById(R.id.photosNoItemSelected).setVisibility(View.VISIBLE);
                    }
                }
            });
        } else {
            // In single-pane mode, simply start the detail activity
            // for the selected item ID.

            // Start it using ActivityCompat.startActivity
            PhotoDetailActivity.launch(PhotosListActivity.this, view, photo);

            // Or

            // Open DetailsActivity with default transition animation.
            // Intent detailIntent = new Intent(this, RepoDetailActivity.class);
            // detailIntent.putExtra(RepoDetailFragment.ARG_PHOTO, photo);
            // startActivity(detailIntent);
        }
    }

    @Override
    public void onBackPressed() {
        if (mIsTwoPane && mFragmentManager.getBackStackEntryCount() > 0){
            mFragmentManager.popBackStack();
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public void onResponse(PhotosListTaskFragment.Task task, int statusCode, Photos photos) {
        switch (task) {
            case REFRESH:
                mPhotosListFragment.setPhotos(statusCode, photos);
                break;
            case REQUEST_NEXT:
                mPhotosListFragment.appendPhotos(statusCode, photos);
                break;
        }
    }

}




Java Source Code List

com.meg7.soas.ApplicationTest.java
com.meg7.soas.SoasApplication.java
com.meg7.soas.data.Location.java
com.meg7.soas.data.OfflineNote.java
com.meg7.soas.data.Photo.java
com.meg7.soas.data.Photos.java
com.meg7.soas.database.DatabaseHelper.java
com.meg7.soas.database.OfflineNotesDataSource.java
com.meg7.soas.database.provider.OfflineNotesProvider.java
com.meg7.soas.database.provider.ProviderConstants.java
com.meg7.soas.database.provider.ProviderConstants.java
com.meg7.soas.espresso.LongListMatchers.java
com.meg7.soas.espresso.PhotosListActivityEspressoTest.java
com.meg7.soas.espresso.VolleyIdlingResource.java
com.meg7.soas.http.HttpConstants.java
com.meg7.soas.http.HttpHeaderParser.java
com.meg7.soas.http.request.GsonGetRequest.java
com.meg7.soas.http.util.UrlBuilder.java
com.meg7.soas.ui.BaseActivity.java
com.meg7.soas.ui.PhotoDetailActivity.java
com.meg7.soas.ui.PhotosListActivity.java
com.meg7.soas.ui.adapter.BaseEndlessAdapter.java
com.meg7.soas.ui.adapter.BaseEndlessScrollListener.java
com.meg7.soas.ui.adapter.PhotosAdapter.java
com.meg7.soas.ui.fragment.PhotoDetailFragment.java
com.meg7.soas.ui.fragment.PhotosListFragment.java
com.meg7.soas.ui.fragment.SwipeRefreshListFragment.java
com.meg7.soas.ui.fragment.retained.PhotosListTaskFragment.java
com.meg7.soas.ui.view.PhotoView.java
com.meg7.soas.ui.widget.BaseFadeInNetworkImageView.java
com.meg7.soas.ui.widget.RectangleFadeInNetworkImageView.java
com.meg7.soas.ui.widget.RoundedFadeInNetworkImageView.java
com.meg7.soas.unit.PhotosListActivityUnitTest.java
com.meg7.soas.util.BitmapLruCache.java
com.meg7.soas.util.SdkUtils.java
com.meg7.widget.RecyclingBitmapDrawable.java
com.meg7.widget.RecyclingImageView.java