Home | History | Annotate | Download | only in ui
      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.displayingbitmaps.ui;
     18 
     19 import android.annotation.TargetApi;
     20 import android.app.ActionBar;
     21 import android.os.Build.VERSION_CODES;
     22 import android.os.Bundle;
     23 import android.support.v4.app.Fragment;
     24 import android.support.v4.app.FragmentActivity;
     25 import android.support.v4.app.FragmentManager;
     26 import android.support.v4.app.FragmentStatePagerAdapter;
     27 import android.support.v4.app.NavUtils;
     28 import android.support.v4.view.ViewPager;
     29 import android.util.DisplayMetrics;
     30 import android.view.Menu;
     31 import android.view.MenuItem;
     32 import android.view.View;
     33 import android.view.View.OnClickListener;
     34 import android.view.WindowManager.LayoutParams;
     35 import android.widget.Toast;
     36 
     37 import com.example.android.displayingbitmaps.BuildConfig;
     38 import com.example.android.displayingbitmaps.R;
     39 import com.example.android.displayingbitmaps.provider.Images;
     40 import com.example.android.displayingbitmaps.util.ImageCache;
     41 import com.example.android.displayingbitmaps.util.ImageFetcher;
     42 import com.example.android.displayingbitmaps.util.Utils;
     43 
     44 public class ImageDetailActivity extends FragmentActivity implements OnClickListener {
     45     private static final String IMAGE_CACHE_DIR = "images";
     46     public static final String EXTRA_IMAGE = "extra_image";
     47 
     48     private ImagePagerAdapter mAdapter;
     49     private ImageFetcher mImageFetcher;
     50     private ViewPager mPager;
     51 
     52     @TargetApi(VERSION_CODES.HONEYCOMB)
     53     @Override
     54     public void onCreate(Bundle savedInstanceState) {
     55         if (BuildConfig.DEBUG) {
     56             Utils.enableStrictMode();
     57         }
     58         super.onCreate(savedInstanceState);
     59         setContentView(R.layout.image_detail_pager);
     60 
     61         // Fetch screen height and width, to use as our max size when loading images as this
     62         // activity runs full screen
     63         final DisplayMetrics displayMetrics = new DisplayMetrics();
     64         getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
     65         final int height = displayMetrics.heightPixels;
     66         final int width = displayMetrics.widthPixels;
     67 
     68         // For this sample we'll use half of the longest width to resize our images. As the
     69         // image scaling ensures the image is larger than this, we should be left with a
     70         // resolution that is appropriate for both portrait and landscape. For best image quality
     71         // we shouldn't divide by 2, but this will use more memory and require a larger memory
     72         // cache.
     73         final int longest = (height > width ? height : width) / 2;
     74 
     75         ImageCache.ImageCacheParams cacheParams =
     76                 new ImageCache.ImageCacheParams(this, IMAGE_CACHE_DIR);
     77         cacheParams.setMemCacheSizePercent(0.25f); // Set memory cache to 25% of app memory
     78 
     79         // The ImageFetcher takes care of loading images into our ImageView children asynchronously
     80         mImageFetcher = new ImageFetcher(this, longest);
     81         mImageFetcher.addImageCache(getSupportFragmentManager(), cacheParams);
     82         mImageFetcher.setImageFadeIn(false);
     83 
     84         // Set up ViewPager and backing adapter
     85         mAdapter = new ImagePagerAdapter(getSupportFragmentManager(), Images.imageUrls.length);
     86         mPager = (ViewPager) findViewById(R.id.pager);
     87         mPager.setAdapter(mAdapter);
     88         mPager.setPageMargin((int) getResources().getDimension(R.dimen.horizontal_page_margin));
     89         mPager.setOffscreenPageLimit(2);
     90 
     91         // Set up activity to go full screen
     92         getWindow().addFlags(LayoutParams.FLAG_FULLSCREEN);
     93 
     94         // Enable some additional newer visibility and ActionBar features to create a more
     95         // immersive photo viewing experience
     96         if (Utils.hasHoneycomb()) {
     97             final ActionBar actionBar = getActionBar();
     98 
     99             // Hide title text and set home as up
    100             actionBar.setDisplayShowTitleEnabled(false);
    101             actionBar.setDisplayHomeAsUpEnabled(true);
    102 
    103             // Hide and show the ActionBar as the visibility changes
    104             mPager.setOnSystemUiVisibilityChangeListener(
    105                     new View.OnSystemUiVisibilityChangeListener() {
    106                         @Override
    107                         public void onSystemUiVisibilityChange(int vis) {
    108                             if ((vis & View.SYSTEM_UI_FLAG_LOW_PROFILE) != 0) {
    109                                 actionBar.hide();
    110                             } else {
    111                                 actionBar.show();
    112                             }
    113                         }
    114                     });
    115 
    116             // Start low profile mode and hide ActionBar
    117             mPager.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);
    118             actionBar.hide();
    119         }
    120 
    121         // Set the current item based on the extra passed in to this activity
    122         final int extraCurrentItem = getIntent().getIntExtra(EXTRA_IMAGE, -1);
    123         if (extraCurrentItem != -1) {
    124             mPager.setCurrentItem(extraCurrentItem);
    125         }
    126     }
    127 
    128     @Override
    129     public void onResume() {
    130         super.onResume();
    131         mImageFetcher.setExitTasksEarly(false);
    132     }
    133 
    134     @Override
    135     protected void onPause() {
    136         super.onPause();
    137         mImageFetcher.setExitTasksEarly(true);
    138         mImageFetcher.flushCache();
    139     }
    140 
    141     @Override
    142     protected void onDestroy() {
    143         super.onDestroy();
    144         mImageFetcher.closeCache();
    145     }
    146 
    147     @Override
    148     public boolean onOptionsItemSelected(MenuItem item) {
    149         switch (item.getItemId()) {
    150             case android.R.id.home:
    151                 NavUtils.navigateUpFromSameTask(this);
    152                 return true;
    153             case R.id.clear_cache:
    154                 mImageFetcher.clearCache();
    155                 Toast.makeText(
    156                         this, R.string.clear_cache_complete_toast,Toast.LENGTH_SHORT).show();
    157                 return true;
    158         }
    159         return super.onOptionsItemSelected(item);
    160     }
    161 
    162     @Override
    163     public boolean onCreateOptionsMenu(Menu menu) {
    164         getMenuInflater().inflate(R.menu.main_menu, menu);
    165         return true;
    166     }
    167 
    168     /**
    169      * Called by the ViewPager child fragments to load images via the one ImageFetcher
    170      */
    171     public ImageFetcher getImageFetcher() {
    172         return mImageFetcher;
    173     }
    174 
    175     /**
    176      * The main adapter that backs the ViewPager. A subclass of FragmentStatePagerAdapter as there
    177      * could be a large number of items in the ViewPager and we don't want to retain them all in
    178      * memory at once but create/destroy them on the fly.
    179      */
    180     private class ImagePagerAdapter extends FragmentStatePagerAdapter {
    181         private final int mSize;
    182 
    183         public ImagePagerAdapter(FragmentManager fm, int size) {
    184             super(fm);
    185             mSize = size;
    186         }
    187 
    188         @Override
    189         public int getCount() {
    190             return mSize;
    191         }
    192 
    193         @Override
    194         public Fragment getItem(int position) {
    195             return ImageDetailFragment.newInstance(Images.imageUrls[position]);
    196         }
    197     }
    198 
    199     /**
    200      * Set on the ImageView in the ViewPager children fragments, to enable/disable low profile mode
    201      * when the ImageView is touched.
    202      */
    203     @TargetApi(VERSION_CODES.HONEYCOMB)
    204     @Override
    205     public void onClick(View v) {
    206         final int vis = mPager.getSystemUiVisibility();
    207         if ((vis & View.SYSTEM_UI_FLAG_LOW_PROFILE) != 0) {
    208             mPager.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
    209         } else {
    210             mPager.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);
    211         }
    212     }
    213 }
    214