Skip to content

Most visited

Recently visited

navigation
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
}
This site uses cookies to store your preferences for site-specific language and display options.

Hooray!

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a one-minute survey?
Help us improve Android tools and documentation.