DisplayingBitmaps / src / com.example.android.displayingbitmaps / ui /

ImageDetailActivity.java

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
}