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