1package eu.siacs.conversations.ui;
2
3import android.app.PendingIntent;
4import android.content.ActivityNotFoundException;
5import android.content.Intent;
6import android.graphics.Bitmap;
7import android.graphics.BitmapFactory;
8import android.net.Uri;
9import android.os.Bundle;
10import android.os.Parcel;
11import android.provider.MediaStore;
12import android.view.View;
13import android.view.View.OnClickListener;
14import android.view.View.OnLongClickListener;
15import android.widget.Button;
16import android.widget.ImageView;
17import android.widget.TextView;
18import android.widget.Toast;
19
20import com.soundcloud.android.crop.Crop;
21
22import java.io.File;
23import java.io.FileNotFoundException;
24import java.io.IOException;
25
26import eu.siacs.conversations.Config;
27import eu.siacs.conversations.R;
28import eu.siacs.conversations.entities.Account;
29import eu.siacs.conversations.persistance.FileBackend;
30import eu.siacs.conversations.utils.PhoneHelper;
31import eu.siacs.conversations.xmpp.jid.InvalidJidException;
32import eu.siacs.conversations.xmpp.jid.Jid;
33import eu.siacs.conversations.xmpp.pep.Avatar;
34
35public class PublishProfilePictureActivity extends XmppActivity {
36
37 private static final int REQUEST_CHOOSE_FILE = 0xac23;
38
39 private ImageView avatar;
40 private TextView accountTextView;
41 private TextView hintOrWarning;
42 private TextView secondaryHint;
43 private Button cancelButton;
44 private Button publishButton;
45
46 final static int REQUEST_CROP_PICTURE = 92374;
47 private Uri avatarUri;
48 private Uri defaultUri;
49 private OnLongClickListener backToDefaultListener = new OnLongClickListener() {
50
51 @Override
52 public boolean onLongClick(View v) {
53 avatarUri = defaultUri;
54 loadImageIntoPreview(defaultUri);
55 return true;
56 }
57 };
58 private Account account;
59 private boolean support = false;
60 private boolean mInitialAccountSetup;
61 private UiCallback<Avatar> avatarPublication = new UiCallback<Avatar>() {
62
63 @Override
64 public void success(Avatar object) {
65 runOnUiThread(new Runnable() {
66
67 @Override
68 public void run() {
69 if (mInitialAccountSetup) {
70 Intent intent = new Intent(getApplicationContext(),
71 StartConversationActivity.class);
72 intent.putExtra("init",true);
73 startActivity(intent);
74 }
75 Toast.makeText(PublishProfilePictureActivity.this,
76 R.string.avatar_has_been_published,
77 Toast.LENGTH_SHORT).show();
78 finish();
79 }
80 });
81 }
82
83 @Override
84 public void error(final int errorCode, Avatar object) {
85 runOnUiThread(new Runnable() {
86
87 @Override
88 public void run() {
89 hintOrWarning.setText(errorCode);
90 hintOrWarning.setTextColor(getWarningTextColor());
91 publishButton.setText(R.string.publish);
92 enablePublishButton();
93 }
94 });
95
96 }
97
98 @Override
99 public void userInputRequried(PendingIntent pi, Avatar object) {
100 }
101 };
102
103 @Override
104 public void onCreate(Bundle savedInstanceState) {
105 super.onCreate(savedInstanceState);
106 setContentView(R.layout.activity_publish_profile_picture);
107 this.avatar = (ImageView) findViewById(R.id.account_image);
108 this.cancelButton = (Button) findViewById(R.id.cancel_button);
109 this.publishButton = (Button) findViewById(R.id.publish_button);
110 this.accountTextView = (TextView) findViewById(R.id.account);
111 this.hintOrWarning = (TextView) findViewById(R.id.hint_or_warning);
112 this.secondaryHint = (TextView) findViewById(R.id.secondary_hint);
113 this.publishButton.setOnClickListener(new OnClickListener() {
114
115 @Override
116 public void onClick(View v) {
117 if (avatarUri != null) {
118 publishButton.setText(R.string.publishing);
119 disablePublishButton();
120 xmppConnectionService.publishAvatar(account, avatarUri,
121 avatarPublication);
122 }
123 }
124 });
125 this.cancelButton.setOnClickListener(new OnClickListener() {
126
127 @Override
128 public void onClick(View v) {
129 if (mInitialAccountSetup) {
130 Intent intent = new Intent(getApplicationContext(),
131 StartConversationActivity.class);
132 if (xmppConnectionService != null && xmppConnectionService.getAccounts().size() == 1) {
133 intent.putExtra("init", true);
134 }
135 startActivity(intent);
136 }
137 finish();
138 }
139 });
140 this.avatar.setOnClickListener(new OnClickListener() {
141
142 @Override
143 public void onClick(View v) {
144 Intent attachFileIntent = new Intent();
145 attachFileIntent.setType("image/*");
146 attachFileIntent.setAction(Intent.ACTION_GET_CONTENT);
147 Intent chooser = Intent.createChooser(attachFileIntent,
148 getString(R.string.attach_file));
149 startActivityForResult(chooser, REQUEST_CHOOSE_FILE);
150 }
151 });
152 this.defaultUri = PhoneHelper.getSefliUri(getApplicationContext());
153 }
154
155 @Override
156 protected void onActivityResult(int requestCode, int resultCode,
157 final Intent data) {
158 super.onActivityResult(requestCode, resultCode, data);
159 if (resultCode == RESULT_OK) {
160 if (requestCode == REQUEST_CHOOSE_FILE) {
161 this.avatarUri = data.getData();
162 Uri destination = Uri.fromFile(new File(getCacheDir(), "croppedAvatar"));
163 Crop.of(this.avatarUri, destination).asSquare().start(PublishProfilePictureActivity.this);
164 }
165 }
166 if (requestCode == Crop.REQUEST_CROP) {
167 this.avatarUri = Uri.fromFile(new File(getCacheDir(), "croppedAvatar"));
168 loadImageIntoPreview(this.avatarUri);
169 }
170 }
171
172 @Override
173 protected void onBackendConnected() {
174 if (getIntent() != null) {
175 Jid jid;
176 try {
177 jid = Jid.fromString(getIntent().getStringExtra("account"));
178 } catch (InvalidJidException e) {
179 jid = null;
180 }
181 if (jid != null) {
182 this.account = xmppConnectionService.findAccountByJid(jid);
183 if (this.account.getXmppConnection() != null) {
184 this.support = this.account.getXmppConnection().getFeatures().pep();
185 }
186 if (this.avatarUri == null) {
187 if (this.account.getAvatar() != null
188 || this.defaultUri == null) {
189 this.avatar.setImageBitmap(avatarService().get(account,
190 getPixel(194)));
191 if (this.defaultUri != null) {
192 this.avatar
193 .setOnLongClickListener(this.backToDefaultListener);
194 } else {
195 this.secondaryHint.setVisibility(View.INVISIBLE);
196 }
197 if (!support) {
198 this.hintOrWarning
199 .setTextColor(getWarningTextColor());
200 this.hintOrWarning
201 .setText(R.string.error_publish_avatar_no_server_support);
202 }
203 } else {
204 this.avatarUri = this.defaultUri;
205 loadImageIntoPreview(this.defaultUri);
206 this.secondaryHint.setVisibility(View.INVISIBLE);
207 }
208 } else {
209 loadImageIntoPreview(avatarUri);
210 }
211 String account;
212 if (Config.DOMAIN_LOCK != null) {
213 account = this.account.getJid().getLocalpart();
214 } else {
215 account = this.account.getJid().toBareJid().toString();
216 }
217 this.accountTextView.setText(account);
218 }
219 }
220
221 }
222
223 @Override
224 protected void onStart() {
225 super.onStart();
226 if (getIntent() != null) {
227 this.mInitialAccountSetup = getIntent().getBooleanExtra("setup",
228 false);
229 }
230 if (this.mInitialAccountSetup) {
231 this.cancelButton.setText(R.string.skip);
232 }
233 }
234
235 private Bitmap loadScaledBitmap(String filePath, int reqSize) {
236 final BitmapFactory.Options options = new BitmapFactory.Options();
237 options.inJustDecodeBounds = true;
238 BitmapFactory.decodeFile(filePath,options);
239 options.inSampleSize = FileBackend.calcSampleSize(new File(filePath), reqSize);
240 options.inJustDecodeBounds = false;
241 return BitmapFactory.decodeFile(filePath,options);
242 }
243 protected void loadImageIntoPreview(Uri uri) {
244 Bitmap bm = null;
245 try{
246 bm = loadScaledBitmap(uri.getPath(), Config.AVATAR_SIZE);
247 } catch (Exception e) {
248 e.printStackTrace();
249 }
250
251 if (bm == null) {
252 disablePublishButton();
253 this.hintOrWarning.setTextColor(getWarningTextColor());
254 this.hintOrWarning
255 .setText(R.string.error_publish_avatar_converting);
256 return;
257 }
258 this.avatar.setImageBitmap(bm);
259 if (support) {
260 enablePublishButton();
261 this.publishButton.setText(R.string.publish);
262 this.hintOrWarning.setText(R.string.publish_avatar_explanation);
263 this.hintOrWarning.setTextColor(getPrimaryTextColor());
264 } else {
265 disablePublishButton();
266 this.hintOrWarning.setTextColor(getWarningTextColor());
267 this.hintOrWarning
268 .setText(R.string.error_publish_avatar_no_server_support);
269 }
270 if (this.defaultUri != null && uri.equals(this.defaultUri)) {
271 this.secondaryHint.setVisibility(View.INVISIBLE);
272 this.avatar.setOnLongClickListener(null);
273 } else if (this.defaultUri != null) {
274 this.secondaryHint.setVisibility(View.VISIBLE);
275 this.avatar.setOnLongClickListener(this.backToDefaultListener);
276 }
277 }
278
279 protected void enablePublishButton() {
280 this.publishButton.setEnabled(true);
281 this.publishButton.setTextColor(getPrimaryTextColor());
282 }
283
284 protected void disablePublishButton() {
285 this.publishButton.setEnabled(false);
286 this.publishButton.setTextColor(getSecondaryTextColor());
287 }
288
289 public void refreshUiReal() {
290 //nothing to do. This Activity doesn't implement any listeners
291 }
292}