PublishProfilePictureActivity.java

  1package eu.siacs.conversations.ui;
  2
  3import android.app.PendingIntent;
  4import android.content.Intent;
  5import android.graphics.Bitmap;
  6import android.net.Uri;
  7import android.os.Bundle;
  8import android.view.View;
  9import android.view.View.OnClickListener;
 10import android.view.View.OnLongClickListener;
 11import android.widget.Button;
 12import android.widget.ImageView;
 13import android.widget.TextView;
 14import eu.siacs.conversations.R;
 15import eu.siacs.conversations.entities.Account;
 16import eu.siacs.conversations.utils.PhoneHelper;
 17import eu.siacs.conversations.xmpp.pep.Avatar;
 18
 19public class PublishProfilePictureActivity extends XmppActivity {
 20
 21	private static final int REQUEST_CHOOSE_FILE = 0xac23;
 22
 23	private ImageView avatar;
 24	private TextView accountTextView;
 25	private TextView hintOrWarning;
 26	private TextView secondaryHint;
 27	private Button cancelButton;
 28	private Button publishButton;
 29
 30	private Uri avatarUri;
 31	private Uri defaultUri;
 32
 33	private Account account;
 34
 35	private boolean support = false;
 36
 37	private boolean mInitialAccountSetup;
 38
 39	private UiCallback<Avatar> avatarPublication = new UiCallback<Avatar>() {
 40
 41		@Override
 42		public void success(Avatar object) {
 43			runOnUiThread(new Runnable() {
 44
 45				@Override
 46				public void run() {
 47					if (mInitialAccountSetup) {
 48						startActivity(new Intent(getApplicationContext(),
 49								StartConversationActivity.class));
 50					}
 51					finish();
 52				}
 53			});
 54		}
 55
 56		@Override
 57		public void error(final int errorCode, Avatar object) {
 58			runOnUiThread(new Runnable() {
 59
 60				@Override
 61				public void run() {
 62					hintOrWarning.setText(errorCode);
 63					hintOrWarning.setTextColor(getWarningTextColor());
 64					publishButton.setText(R.string.publish);
 65					enablePublishButton();
 66				}
 67			});
 68
 69		}
 70
 71		@Override
 72		public void userInputRequried(PendingIntent pi, Avatar object) {
 73		}
 74	};
 75
 76	private OnLongClickListener backToDefaultListener = new OnLongClickListener() {
 77
 78		@Override
 79		public boolean onLongClick(View v) {
 80			avatarUri = defaultUri;
 81			loadImageIntoPreview(defaultUri);
 82			return true;
 83		}
 84	};
 85
 86	@Override
 87	public void onCreate(Bundle savedInstanceState) {
 88		super.onCreate(savedInstanceState);
 89		setContentView(R.layout.activity_publish_profile_picture);
 90		this.avatar = (ImageView) findViewById(R.id.account_image);
 91		this.cancelButton = (Button) findViewById(R.id.cancel_button);
 92		this.publishButton = (Button) findViewById(R.id.publish_button);
 93		this.accountTextView = (TextView) findViewById(R.id.account);
 94		this.hintOrWarning = (TextView) findViewById(R.id.hint_or_warning);
 95		this.secondaryHint = (TextView) findViewById(R.id.secondary_hint);
 96		this.publishButton.setOnClickListener(new OnClickListener() {
 97
 98			@Override
 99			public void onClick(View v) {
100				if (avatarUri != null) {
101					publishButton.setText(R.string.publishing);
102					disablePublishButton();
103					xmppConnectionService.publishAvatar(account, avatarUri,
104							avatarPublication);
105				}
106			}
107		});
108		this.cancelButton.setOnClickListener(new OnClickListener() {
109
110			@Override
111			public void onClick(View v) {
112				if (mInitialAccountSetup) {
113					startActivity(new Intent(getApplicationContext(),
114							StartConversationActivity.class));
115				}
116				finish();
117			}
118		});
119		this.avatar.setOnClickListener(new OnClickListener() {
120
121			@Override
122			public void onClick(View v) {
123				Intent attachFileIntent = new Intent();
124				attachFileIntent.setType("image/*");
125				attachFileIntent.setAction(Intent.ACTION_GET_CONTENT);
126				Intent chooser = Intent.createChooser(attachFileIntent,
127						getString(R.string.attach_file));
128				startActivityForResult(chooser, REQUEST_CHOOSE_FILE);
129			}
130		});
131		this.defaultUri = PhoneHelper.getSefliUri(getApplicationContext());
132	}
133
134	@Override
135	protected void onActivityResult(int requestCode, int resultCode,
136			final Intent data) {
137		super.onActivityResult(requestCode, resultCode, data);
138		if (resultCode == RESULT_OK) {
139			if (requestCode == REQUEST_CHOOSE_FILE) {
140				this.avatarUri = data.getData();
141				if (xmppConnectionServiceBound) {
142					loadImageIntoPreview(this.avatarUri);
143				}
144			}
145		}
146	}
147
148	@Override
149	protected void onBackendConnected() {
150		if (getIntent() != null) {
151			String jid = getIntent().getStringExtra("account");
152			if (jid != null) {
153				this.account = xmppConnectionService.findAccountByJid(jid);
154				if (this.account.getXmppConnection() != null) {
155					this.support = this.account.getXmppConnection()
156							.getFeatures().pubsub();
157				}
158				if (this.avatarUri == null) {
159					if (this.account.getAvatar() != null
160							|| this.defaultUri == null) {
161						this.avatar.setImageBitmap(avatarService().get(account,
162								getPixel(194)));
163						if (this.defaultUri != null) {
164							this.avatar
165									.setOnLongClickListener(this.backToDefaultListener);
166						} else {
167							this.secondaryHint.setVisibility(View.INVISIBLE);
168						}
169						if (!support) {
170							this.hintOrWarning
171									.setTextColor(getWarningTextColor());
172							this.hintOrWarning
173									.setText(R.string.error_publish_avatar_no_server_support);
174						}
175					} else {
176						this.avatarUri = this.defaultUri;
177						loadImageIntoPreview(this.defaultUri);
178						this.secondaryHint.setVisibility(View.INVISIBLE);
179					}
180				} else {
181					loadImageIntoPreview(avatarUri);
182				}
183				this.accountTextView.setText(this.account.getJid());
184			}
185		}
186
187	}
188
189	@Override
190	protected void onStart() {
191		super.onStart();
192		if (getIntent() != null) {
193			this.mInitialAccountSetup = getIntent().getBooleanExtra("setup",
194					false);
195		}
196		if (this.mInitialAccountSetup) {
197			this.cancelButton.setText(R.string.skip);
198		}
199	}
200
201	protected void loadImageIntoPreview(Uri uri) {
202		Bitmap bm = xmppConnectionService.getFileBackend().cropCenterSquare(
203				uri, 384);
204		if (bm == null) {
205			disablePublishButton();
206			this.hintOrWarning.setTextColor(getWarningTextColor());
207			this.hintOrWarning
208					.setText(R.string.error_publish_avatar_converting);
209			return;
210		}
211		this.avatar.setImageBitmap(bm);
212		if (support) {
213			enablePublishButton();
214			this.publishButton.setText(R.string.publish);
215			this.hintOrWarning.setText(R.string.publish_avatar_explanation);
216			this.hintOrWarning.setTextColor(getPrimaryTextColor());
217		} else {
218			disablePublishButton();
219			this.hintOrWarning.setTextColor(getWarningTextColor());
220			this.hintOrWarning
221					.setText(R.string.error_publish_avatar_no_server_support);
222		}
223		if (this.defaultUri != null && uri.equals(this.defaultUri)) {
224			this.secondaryHint.setVisibility(View.INVISIBLE);
225			this.avatar.setOnLongClickListener(null);
226		} else if (this.defaultUri != null) {
227			this.secondaryHint.setVisibility(View.VISIBLE);
228			this.avatar.setOnLongClickListener(this.backToDefaultListener);
229		}
230	}
231
232	protected void enablePublishButton() {
233		this.publishButton.setEnabled(true);
234		this.publishButton.setTextColor(getPrimaryTextColor());
235	}
236
237	protected void disablePublishButton() {
238		this.publishButton.setEnabled(false);
239		this.publishButton.setTextColor(getSecondaryTextColor());
240	}
241
242}