content: /*
   * Copyright 2014 The Android Open Source Project
   *
   * 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 com.example.android.swiperefreshlayoutbasic;
  
  import com.example.android.common.dummydata.Cheeses;
  import com.example.android.common.logger.Log;
  
  import android.os.AsyncTask;
  import android.os.Bundle;
  import android.support.v4.app.Fragment;
  import android.support.v4.widget.SwipeRefreshLayout;
  import android.view.LayoutInflater;
  import android.view.Menu;
  import android.view.MenuInflater;
  import android.view.MenuItem;
  import android.view.View;
  import android.view.ViewGroup;
  import android.widget.ArrayAdapter;
  import android.widget.ListView;
  
  import java.util.List;
  
  /**
   * A basic sample that shows how to use {@link android.support.v4.widget.SwipeRefreshLayout} to add
   * the 'swipe-to-refresh' gesture to a layout. In this sample, SwipeRefreshLayout contains a
   * scrollable {@link android.widget.ListView} as its only child.
   *
   * <p>To provide an accessible way to trigger the refresh, this app also provides a refresh
   * action item.
   *
   * <p>In this sample app, the refresh updates the ListView with a random set of new items.
   */
  public class SwipeRefreshLayoutBasicFragment extends Fragment {
  
      private static final String LOG_TAG = SwipeRefreshLayoutBasicFragment.class.getSimpleName();
  
      private static final int LIST_ITEM_COUNT = 20;
  
      /**
       * The {@link android.support.v4.widget.SwipeRefreshLayout} that detects swipe gestures and
       * triggers callbacks in the app.
       */
      private SwipeRefreshLayout mSwipeRefreshLayout;
  
      /**
       * The {@link android.widget.ListView} that displays the content that should be refreshed.
       */
      private ListView mListView;
  
      /**
       * The {@link android.widget.ListAdapter} used to populate the {@link android.widget.ListView}
       * defined in the previous statement.
       */
      private ArrayAdapter<String> mListAdapter;
  
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
  
          // Notify the system to allow an options menu for this fragment.
          setHasOptionsMenu(true);
      }
  
      // BEGIN_INCLUDE (inflate_view)
      @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container,
              Bundle savedInstanceState) {
          View view = inflater.inflate(R.layout.fragment_sample, container, false);
  
          // Retrieve the SwipeRefreshLayout and ListView instances
          mSwipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swiperefresh);
  
          // BEGIN_INCLUDE (change_colors)
          // Set the color scheme of the SwipeRefreshLayout by providing 4 color resource ids
          mSwipeRefreshLayout.setColorScheme(
                  R.color.swipe_color_1, R.color.swipe_color_2,
                  R.color.swipe_color_3, R.color.swipe_color_4);
          // END_INCLUDE (change_colors)
  
          // Retrieve the ListView
          mListView = (ListView) view.findViewById(android.R.id.list);
  
          return view;
      }
      // END_INCLUDE (inflate_view)
  
      // BEGIN_INCLUDE (setup_views)
      @Override
      public void onViewCreated(View view, Bundle savedInstanceState) {
          super.onViewCreated(view, savedInstanceState);
  
          /**
           * Create an ArrayAdapter to contain the data for the ListView. Each item in the ListView
           * uses the system-defined simple_list_item_1 layout that contains one TextView.
           */
          mListAdapter = new ArrayAdapter<String>(
                  getActivity(),
                  android.R.layout.simple_list_item_1,
                  android.R.id.text1,
                  Cheeses.randomList(LIST_ITEM_COUNT));
  
          // Set the adapter between the ListView and its backing data.
          mListView.setAdapter(mListAdapter);
  
          // BEGIN_INCLUDE (setup_refreshlistener)
          /**
           * Implement {@link SwipeRefreshLayout.OnRefreshListener}. When users do the "swipe to
           * refresh" gesture, SwipeRefreshLayout invokes
           * {@link SwipeRefreshLayout.OnRefreshListener#onRefresh onRefresh()}. In
           * {@link SwipeRefreshLayout.OnRefreshListener#onRefresh onRefresh()}, call a method that
           * refreshes the content. Call the same method in response to the Refresh action from the
           * action bar.
           */
          mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
              @Override
              public void onRefresh() {
                  Log.i(LOG_TAG, "onRefresh called from SwipeRefreshLayout");
  
                  initiateRefresh();
              }
          });
          // END_INCLUDE (setup_refreshlistener)
      }
      // END_INCLUDE (setup_views)
  
      @Override
      public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
          inflater.inflate(R.menu.main_menu, menu);
      }
  
      // BEGIN_INCLUDE (setup_refresh_menu_listener)
      /**
       * Respond to the user's selection of the Refresh action item. Start the SwipeRefreshLayout
       * progress bar, then initiate the background task that refreshes the content.
       */
      @Override
      public boolean onOptionsItemSelected(MenuItem item) {
          switch (item.getItemId()) {
              case R.id.menu_refresh:
                  Log.i(LOG_TAG, "Refresh menu item selected");
  
                  // We make sure that the SwipeRefreshLayout is displaying it's refreshing indicator
                  if (!mSwipeRefreshLayout.isRefreshing()) {
                      mSwipeRefreshLayout.setRefreshing(true);
                  }
  
                  // Start our refresh background task
                  initiateRefresh();
  
                  return true;
          }
  
          return super.onOptionsItemSelected(item);
      }
      // END_INCLUDE (setup_refresh_menu_listener)
  
      // BEGIN_INCLUDE (initiate_refresh)
      /**
       * By abstracting the refresh process to a single method, the app allows both the
       * SwipeGestureLayout onRefresh() method and the Refresh action item to refresh the content.
       */
      private void initiateRefresh() {
          Log.i(LOG_TAG, "initiateRefresh");
  
          /**
           * Execute the background task, which uses {@link android.os.AsyncTask} to load the data.
           */
          new DummyBackgroundTask().execute();
      }
      // END_INCLUDE (initiate_refresh)
  
      // BEGIN_INCLUDE (refresh_complete)
      /**
       * When the AsyncTask finishes, it calls onRefreshComplete(), which updates the data in the
       * ListAdapter and turns off the progress bar.
       */
      private void onRefreshComplete(List<String> result) {
          Log.i(LOG_TAG, "onRefreshComplete");
  
          // Remove all items from the ListAdapter, and then replace them with the new items
          mListAdapter.clear();
          for (String cheese : result) {
              mListAdapter.add(cheese);
          }
  
          // Stop the refreshing indicator
          mSwipeRefreshLayout.setRefreshing(false);
      }
      // END_INCLUDE (refresh_complete)
  
      /**
       * Dummy {@link AsyncTask} which simulates a long running task to fetch new cheeses.
       */
      private class DummyBackgroundTask extends AsyncTask<Void, Void, List<String>> {
  
          static final int TASK_DURATION = 3 * 1000; // 3 seconds
  
          @Override
          protected List<String> doInBackground(Void... params) {
              // Sleep for a small amount of time to simulate a background-task
              try {
                  Thread.sleep(TASK_DURATION);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
  
              // Return a new random list of cheeses
              return Cheeses.randomList(LIST_ITEM_COUNT);
          }
  
          @Override
          protected void onPostExecute(List<String> result) {
              super.onPostExecute(result);
  
              // Tell the Fragment that the refresh has completed
              onRefreshComplete(result);
          }
  
      }
  }
  