Home | History | Annotate | Download | only in threadsample
      1 /*
      2  * Copyright (C) 2012 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.example.android.threadsample;
     18 
     19 import android.content.Intent;
     20 import android.os.Bundle;
     21 import android.support.v4.app.Fragment;
     22 import android.support.v4.app.ShareCompat;
     23 import android.support.v4.content.LocalBroadcastManager;
     24 import android.util.Log;
     25 import android.view.LayoutInflater;
     26 import android.view.View;
     27 import android.view.ViewGroup;
     28 
     29 import java.net.MalformedURLException;
     30 import java.net.URL;
     31 
     32 public class PhotoFragment extends Fragment implements View.OnClickListener {
     33     // Constants
     34     private static final String LOG_TAG = "ImageDownloaderThread";
     35     private static final String PHOTO_URL_KEY = "com.example.android.threadsample.PHOTO_URL_KEY";
     36 
     37     PhotoView mPhotoView;
     38 
     39     String mURLString;
     40 
     41     ShareCompat.IntentBuilder mShareCompatIntentBuilder;
     42 
     43     /**
     44      * Converts the stored URL string to a URL, and then tries to download the picture from that
     45      * URL.
     46      */
     47     public void loadPhoto() {
     48         // If setPhoto() was called to store a URL, proceed
     49         if (mURLString != null) {
     50 
     51             // Handles invalid URLs
     52             try {
     53 
     54                 // Converts the URL string to a valid URL
     55                 URL localURL = new URL(mURLString);
     56 
     57                 /*
     58                  * setImageURL(url,false,null) attempts to download and decode the picture at
     59                  * at "url" without caching and without providing a Drawable. The result will be
     60                  * a BitMap stored in the PhotoView for this Fragment.
     61                  */
     62                 mPhotoView.setImageURL(localURL, false, null);
     63 
     64             // Catches an invalid URL format
     65             } catch (MalformedURLException localMalformedURLException) {
     66                 localMalformedURLException.printStackTrace();
     67             }
     68         }
     69     }
     70     /**
     71      * Returns the stored URL string
     72      * @return The URL of the picture being shown by this Fragment, in String format
     73      */
     74     public String getURLString() {
     75         return mURLString;
     76     }
     77 
     78     /*
     79      * This callback is invoked when users click on a displayed image. The input argument is
     80      * a handle to the View object that was clicked
     81      */
     82     @Override
     83     public void onClick(View view) {
     84 
     85         // Sends a broadcast intent to zoom the image
     86         Intent localIntent = new Intent(Constants.ACTION_ZOOM_IMAGE);
     87         LocalBroadcastManager.getInstance(getActivity()).sendBroadcast(localIntent);
     88     }
     89 
     90     /*
     91      * This callback is invoked when the Fragment is created.
     92      */
     93     @Override
     94     public void onCreate(Bundle bundle) {
     95         super.onCreate(bundle);
     96     }
     97 
     98     /*
     99      * This callback is invoked as the Fragment's View is being constructed.
    100      */
    101     @Override
    102     public View onCreateView(LayoutInflater inflater, ViewGroup viewGroup, Bundle bundle) {
    103         super.onCreateView(inflater, viewGroup, bundle);
    104 
    105         /*
    106          * Creates a View from the specified layout file. The layout uses the parameters specified
    107          * in viewGroup, but is not attached to any parent
    108          */
    109         View localView = inflater.inflate(R.layout.photo, viewGroup, false);
    110 
    111         // Gets a handle to the PhotoView View in the layout
    112         mPhotoView = ((PhotoView) localView.findViewById(R.id.photoView));
    113 
    114         /*
    115          * The click listener becomes this class (PhotoFragment). The onClick() method in this
    116          * class is invoked when users click a photo.
    117          */
    118         mPhotoView.setOnClickListener(this);
    119 
    120         // If the bundle argument contains data, uses it as a URL for the picture to display
    121         if (bundle != null) {
    122             mURLString = bundle.getString(PHOTO_URL_KEY);
    123         }
    124 
    125         if (mURLString != null)
    126             loadPhoto();
    127 
    128         // Returns the resulting View
    129         return localView;
    130     }
    131 
    132     /*
    133      * This callback is invoked as the Fragment's View is being destroyed
    134      */
    135     @Override
    136     public void onDestroyView() {
    137         // Logs the destroy operation
    138         Log.d(LOG_TAG, "onDestroyView");
    139 
    140         // If the View object still exists, delete references to avoid memory leaks
    141         if (mPhotoView != null) {
    142 
    143             mPhotoView.setOnClickListener(null);
    144             this.mPhotoView = null;
    145         }
    146 
    147         // Always call the super method last
    148         super.onDestroyView();
    149     }
    150 
    151     /*
    152      * This callback is invoked when the Fragment is no longer attached to its Activity.
    153      * Sets the URL for the Fragment to null
    154      */
    155     @Override
    156     public void onDetach() {
    157         // Logs the detach
    158         Log.d(LOG_TAG, "onDetach");
    159 
    160         // Removes the reference to the URL
    161         mURLString = null;
    162 
    163         // Always call the super method last
    164         super.onDetach();
    165     }
    166 
    167     /*
    168      * This callback is invoked if the system asks the Fragment to save its state. This allows the
    169      * the system to restart the Fragment later on.
    170      */
    171     @Override
    172     public void onSaveInstanceState(Bundle bundle) {
    173         // Always call the super method first
    174         super.onSaveInstanceState(bundle);
    175 
    176         // Puts the current URL for the picture being shown into the saved state
    177         bundle.putString(PHOTO_URL_KEY, mURLString);
    178     }
    179 
    180     /**
    181      * Sets the photo for this Fragment, by storing a URL that points to a picture
    182      * @param urlString A String representation of the URL pointing to the picture
    183      */
    184     public void setPhoto(String urlString) {
    185         mURLString = urlString;
    186     }
    187 }
    188