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