Repository navigation
Expand file tree
/
Copy pathImagePickerActivity.java
More file actions
213 lines (173 loc) · 7.57 KB
/
Copy pathImagePickerActivity.java
File metadata and controls
213 lines (173 loc) · 7.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
package nl.changer.polypicker;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import nl.changer.polypicker.model.Image;
import nl.changer.polypicker.utils.ImageInternalFetcher;
public class ImagePickerActivity extends AppCompatActivity {
/**
* Key to persist the list when saving the state of the activity.
*/
private static final String KEY_LIST = "nl.changer.polypicker.savedinstance.key.list";
/**
* Returns the parcelled image uris in the intent with this extra.
*/
public static final String EXTRA_IMAGE_URIS = "nl.changer.changer.nl.polypicker.extra.selected_image_uris";
private LinkedHashSet<Image> mSelectedImages;
private LinearLayout mSelectedImagesContainer;
protected TextView mSelectedImageEmptyMessage;
private ViewPager mViewPager;
public ImageInternalFetcher mImageFetcher;
private Button mCancelButtonView, mDoneButtonView;
private SlidingTabText mSlidingTabText;
// initialize with default config.
private static Config mConfig = new Config.Builder().build();
public static void setConfig(Config config) {
if (config == null) {
throw new NullPointerException("Config cannot be passed null. Not setting config will use default values.");
}
mConfig = config;
}
public static Config getConfig() {
return mConfig;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pp__activity_main);
/*
// Dont enable the toolbar.
// Consumes a lot of space in the UI unnecessarily.
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
if (toolbar != null) {
setSupportActionBar(toolbar);
}*/
mSelectedImagesContainer = (LinearLayout) findViewById(R.id.pp__selected_photos_container);
mSelectedImageEmptyMessage = (TextView) findViewById(R.id.pp__selected_photos_empty);
mViewPager = (ViewPager) findViewById(R.id.pp__pager);
mCancelButtonView = (Button) findViewById(R.id.pp__btn_cancel);
mDoneButtonView = (Button) findViewById(R.id.pp__btn_done);
mSelectedImages = new LinkedHashSet<Image>();
mImageFetcher = new ImageInternalFetcher(this, 500);
mCancelButtonView.setOnClickListener(mOnFinishGettingImages);
mDoneButtonView.setOnClickListener(mOnFinishGettingImages);
setupActionBar();
if (savedInstanceState != null) {
populateUi(savedInstanceState);
}
}
private void populateUi(Bundle savedInstanceState) {
ArrayList<Image> list = savedInstanceState.getParcelableArrayList(KEY_LIST);
if (list != null) {
for (Image image : list) {
addImage(image);
}
}
}
/**
* Sets up the action bar, adding view page indicator.
*/
private void setupActionBar() {
mSlidingTabText = (SlidingTabText) findViewById(R.id.pp__sliding_tabs);
mSlidingTabText.setSelectedIndicatorColors(getResources().getColor(mConfig.getTabSelectionIndicatorColor()));
mSlidingTabText.setCustomTabView(R.layout.pp__tab_view_text, R.id.pp_tab_text);
mSlidingTabText.setTabStripColor(mConfig.getTabBackgroundColor());
mViewPager.setAdapter(new PagerAdapter2Fragments(getFragmentManager()));
mSlidingTabText.setTabTitles(getResources().getStringArray(R.array.tab_titles));
mSlidingTabText.setViewPager(mViewPager);
}
public boolean addImage(Image image) {
if (mSelectedImages == null) {
// this condition may arise when the activity is being
// restored when sufficient memory is available. onRestoreState()
// will be called.
mSelectedImages = new LinkedHashSet<Image>();
}
if (mSelectedImages.size() == mConfig.getSelectionLimit()) {
Toast.makeText(this, getString(R.string.n_images_selected, mConfig.getSelectionLimit()), Toast.LENGTH_SHORT).show();
return false;
} else {
if (mSelectedImages.add(image)) {
View rootView = LayoutInflater.from(ImagePickerActivity.this).inflate(R.layout.pp__list_item_selected_thumbnail, null);
ImageView thumbnail = (ImageView) rootView.findViewById(R.id.pp__selected_photo);
rootView.setTag(image.mUri);
mImageFetcher.loadImage(image.mUri, thumbnail);
mSelectedImagesContainer.addView(rootView, 0);
int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 60, getResources().getDisplayMetrics());
thumbnail.setLayoutParams(new FrameLayout.LayoutParams(px, px));
if (mSelectedImages.size() >= 1) {
mSelectedImagesContainer.setVisibility(View.VISIBLE);
mSelectedImageEmptyMessage.setVisibility(View.GONE);
}
return true;
}
}
return false;
}
public boolean removeImage(Image image) {
if (mSelectedImages.remove(image)) {
for (int i = 0; i < mSelectedImagesContainer.getChildCount(); i++) {
View childView = mSelectedImagesContainer.getChildAt(i);
if (childView.getTag().equals(image.mUri)) {
mSelectedImagesContainer.removeViewAt(i);
break;
}
}
if (mSelectedImages.size() == 0) {
mSelectedImagesContainer.setVisibility(View.GONE);
mSelectedImageEmptyMessage.setVisibility(View.VISIBLE);
}
return true;
}
return false;
}
public boolean containsImage(Image image) {
return mSelectedImages.contains(image);
}
private View.OnClickListener mOnFinishGettingImages = new View.OnClickListener() {
@Override
public void onClick(View view) {
if (view.getId() == R.id.pp__btn_done) {
Uri[] uris = new Uri[mSelectedImages.size()];
int i = 0;
for (Image img : mSelectedImages) {
uris[i++] = img.mUri;
}
Intent intent = new Intent();
intent.putExtra(EXTRA_IMAGE_URIS, uris);
setResult(Activity.RESULT_OK, intent);
} else if (view.getId() == R.id.pp__btn_cancel) {
setResult(Activity.RESULT_CANCELED);
}
finish();
}
};
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// preserve already taken images on configuration changes like
// screen rotation or activity run out of memory.
// HashSet cannot be saved, so convert to list and then save.
ArrayList<Image> list = new ArrayList<Image>(mSelectedImages);
outState.putParcelableArrayList(KEY_LIST, list);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
populateUi(savedInstanceState);
}
}