de.sourcestream.movieDB.controller.GalleryList.java Source code

Java tutorial

Introduction

Here is the source code for de.sourcestream.movieDB.controller.GalleryList.java

Source

/*
 *  Copyright 2015 sourcestream GmbH
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

package de.sourcestream.movieDB.controller;

import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.pm.ActivityInfo;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.content.ContextCompat;
import android.support.v4.widget.DrawerLayout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.AbsListView;
import android.widget.AdapterView;

import com.google.android.gms.analytics.HitBuilders;
import com.google.android.gms.analytics.Tracker;

import java.util.ArrayList;

import de.sourcestream.movieDB.MainActivity;
import de.sourcestream.movieDB.MovieDB;
import de.sourcestream.movieDB.R;
import de.sourcestream.movieDB.adapter.GalleryAdapter;
import de.sourcestream.movieDB.model.GalleryModel;

/**
 * This fragment is used in the gallery view.
 */
public class GalleryList extends Fragment implements AdapterView.OnItemClickListener {
    private MainActivity activity;
    private AbsListView listView;
    private String title;
    private GalleryPreviewSlide galleryPreview;
    private ArrayList<String> galleryPath;
    private Bundle save;

    /**
     * Called to do initial creation of a fragment.
     * This is called after onAttach(Activity) and before onCreateView(LayoutInflater, ViewGroup, Bundle).
     *
     * @param savedInstanceState If the fragment is being re-created from a previous saved state, this is the state.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (savedInstanceState != null)
            save = savedInstanceState.getBundle("save");
    }

    /**
     * Called to have the fragment instantiate its user interface view.
     *
     * @param inflater           sets the layout for the current view.
     * @param container          the container which holds the current view.
     * @param savedInstanceState If non-null, this fragment is being re-constructed from a previous saved state as given here.
     *                           Return the View for the fragment's UI, or null.
     */
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);

        View rootView = inflater.inflate(R.layout.gallerylist, container, false);
        activity = ((MainActivity) getActivity());
        galleryPreview = new GalleryPreviewSlide();
        activity.getMDrawerLayout().setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
        listView = (AbsListView) rootView.findViewById(R.id.gridView);
        return rootView;
    }

    /**
     * @param savedInstanceState if the fragment is being re-created from a previous saved state, this is the state.
     */
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        if (this.isVisible()) {
            // Check orientation and lock to portrait if we are on phone
            if (getResources().getBoolean(R.bool.portrait_only)) {
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            }
        }
        if (save != null)
            setTitle(save.getString("title"));
        activity.setTitle(getTitle());
        activity.getWindow().getDecorView()
                .setBackgroundColor(ContextCompat.getColor(activity, R.color.background_material_light));

        new Handler().post(new Runnable() {
            @Override
            public void run() {
                if (activity.getSupportActionBar() != null)
                    activity.getSupportActionBar().show();
            }
        });

        activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
        if (Build.VERSION.SDK_INT >= 19)
            activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
                    | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);

        listView.setOnItemClickListener(this);

        setGallery();
        System.gc();

        Tracker t = ((MovieDB) activity.getApplication()).getTracker();
        t.setScreenName("GalleryList - " + getTitle());
        t.send(new HitBuilders.ScreenViewBuilder().build());
    }

    /**
     * Callback method to be invoked when an item in this AdapterView has been clicked.
     *
     * @param parent   The AdapterView where the click happened.
     * @param view     The view within the AdapterView that was clicked (this will be a view provided by the adapter)
     * @param position The position of the view in the adapter.
     * @param id       The row id of the item that was clicked.
     */
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        FragmentManager manager = getFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        Bundle args = new Bundle();
        args.putStringArrayList("galleryList", galleryPath);
        args.putInt("currPos", position);
        galleryPreview.setArguments(args);
        transaction.replace(R.id.frame_container, galleryPreview);
        // add the current transaction to the back stack:
        transaction.addToBackStack("galleryList");
        transaction.commit();

    }

    /**
     * Method which sets our gallery list content. We pass the data from our MovieDetails, CastDetails or TVDetails fragment.
     */
    private void setGallery() {
        galleryPath = this.getArguments().getStringArrayList("galleryList");

        ArrayList<GalleryModel> galleryList = new ArrayList<>();
        GalleryAdapter galleryAdapter = new GalleryAdapter(getActivity(), R.layout.galleryview_row, galleryList);
        listView.setAdapter(galleryAdapter);

        for (int i = 0; i < galleryPath.size(); i++) {
            GalleryModel gallery = new GalleryModel();
            gallery.setFilePath(
                    MovieDB.imageUrl + getResources().getString(R.string.galleryImgSize) + galleryPath.get(i));
            galleryList.add(gallery);
        }

        galleryAdapter.notifyDataSetChanged();
    }

    /**
     * Update the title. We use this method to save our title and then to set it on the Toolbar.
     */
    public void setTitle(String title) {
        this.title = title;
    }

    /**
     * Get the title.
     */
    private String getTitle() {
        return this.title;
    }

    /**
     * Called to ask the fragment to save its current dynamic state,
     * so it can later be reconstructed in a new instance of its process is restarted.
     *
     * @param outState Bundle in which to place your saved state.
     */
    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        // Used to avoid bug where we add item in the back stack
        // and if we change orientation twice the item from the back stack has null values
        if (save != null)
            outState.putBundle("save", save);
        else {
            Bundle send = new Bundle();
            send.putString("title", getTitle());

            outState.putBundle("save", send);
        }
    }

    /**
     * Set empty adapter to free memory when this fragment is inactive
     */
    public void onDestroyView() {
        super.onDestroyView();
        listView.setAdapter(null);
    }

}