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