share with uses new preview mechanism
This commit is contained in:
		
							parent
							
								
									00c062a0c8
								
							
						
					
					
						commit
						943f11e1f6
					
				| @ -18,6 +18,7 @@ import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import eu.siacs.conversations.entities.Conversation; | ||||
| import eu.siacs.conversations.ui.ConversationsActivity; | ||||
| import eu.siacs.conversations.ui.ShareWithActivity; | ||||
| 
 | ||||
| @TargetApi(Build.VERSION_CODES.M) | ||||
| @ -42,7 +43,7 @@ public class ContactChooserTargetService extends ChooserTargetService implements | ||||
| 				return chooserTargets; | ||||
| 			} | ||||
| 			mXmppConnectionService.populateWithOrderedConversations(conversations, false); | ||||
| 			final ComponentName componentName = new ComponentName(this, ShareWithActivity.class); | ||||
| 			final ComponentName componentName = new ComponentName(this, ConversationsActivity.class); | ||||
| 			final int pixel = (int) (48 * getResources().getDisplayMetrics().density); | ||||
| 			for(Conversation conversation : conversations) { | ||||
| 				if (conversation.sentMessagesCount() == 0) { | ||||
| @ -52,7 +53,7 @@ public class ContactChooserTargetService extends ChooserTargetService implements | ||||
| 				final Icon icon = Icon.createWithBitmap(mXmppConnectionService.getAvatarService().get(conversation, pixel)); | ||||
| 				final float score = 1 - (1.0f / MAX_TARGETS) * chooserTargets.size(); | ||||
| 				final Bundle extras = new Bundle(); | ||||
| 				extras.putString("uuid", conversation.getUuid()); | ||||
| 				extras.putString(ConversationsActivity.EXTRA_CONVERSATION, conversation.getUuid()); | ||||
| 				chooserTargets.add(new ChooserTarget(name, icon, score, componentName, extras)); | ||||
| 				if (chooserTargets.size() >= MAX_TARGETS) { | ||||
| 					break; | ||||
|  | ||||
| @ -1973,6 +1973,12 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke | ||||
|         final String nick = extras.getString(ConversationsActivity.EXTRA_NICK); | ||||
|         final boolean asQuote = extras.getBoolean(ConversationsActivity.EXTRA_AS_QUOTE); | ||||
|         final boolean pm = extras.getBoolean(ConversationsActivity.EXTRA_IS_PRIVATE_MESSAGE, false); | ||||
|         final List<Uri> uris = extractUris(extras); | ||||
|         if (uris != null && uris.size() > 0) { | ||||
|             mediaPreviewAdapter.addMediaPreviews(Attachment.of(getActivity(), uris)); | ||||
|             toggleInputMethod(); | ||||
|             return; | ||||
|         } | ||||
|         if (nick != null) { | ||||
|             if (pm) { | ||||
|                 Jid jid = conversation.getJid(); | ||||
| @ -2001,6 +2007,19 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private List<Uri> extractUris(Bundle extras) { | ||||
|         final List<Uri> uris = extras.getParcelableArrayList(Intent.EXTRA_STREAM); | ||||
|         if (uris != null) { | ||||
|             return uris; | ||||
|         } | ||||
|         final Uri uri = extras.getParcelable(Intent.EXTRA_STREAM); | ||||
|         if (uri != null) { | ||||
|             return Collections.singletonList(uri); | ||||
|         } else { | ||||
|             return null; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private boolean showBlockSubmenu(View view) { | ||||
|         final Jid jid = conversation.getJid(); | ||||
|         if (jid.getLocal() == null) { | ||||
|  | ||||
| @ -55,6 +55,8 @@ import android.widget.Toast; | ||||
| 
 | ||||
| import org.openintents.openpgp.util.OpenPgpApi; | ||||
| 
 | ||||
| import java.util.Arrays; | ||||
| import java.util.List; | ||||
| import java.util.concurrent.atomic.AtomicBoolean; | ||||
| 
 | ||||
| import eu.siacs.conversations.Config; | ||||
| @ -92,6 +94,12 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio | ||||
| 	public static final String EXTRA_NICK = "nick"; | ||||
| 	public static final String EXTRA_IS_PRIVATE_MESSAGE = "pm"; | ||||
| 
 | ||||
| 	private static List<String> VIEW_AND_SHARE_ACTIONS = Arrays.asList( | ||||
| 			ACTION_VIEW_CONVERSATION, | ||||
| 			Intent.ACTION_SEND, | ||||
| 			Intent.ACTION_SEND_MULTIPLE | ||||
| 	); | ||||
| 
 | ||||
| 	public static final int REQUEST_OPEN_MESSAGE = 0x9876; | ||||
| 	public static final int REQUEST_PLAY_PAUSE = 0x5432; | ||||
| 
 | ||||
| @ -105,8 +113,9 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio | ||||
| 	private boolean mActivityPaused = true; | ||||
| 	private AtomicBoolean mRedirectInProcess = new AtomicBoolean(false); | ||||
| 
 | ||||
| 	private static boolean isViewIntent(Intent i) { | ||||
| 		return i != null && ACTION_VIEW_CONVERSATION.equals(i.getAction()) && i.hasExtra(EXTRA_CONVERSATION); | ||||
| 	private static boolean isViewOrShareIntent(Intent i) { | ||||
| 		Log.d(Config.LOGTAG,"action: "+(i == null ? null : i.getAction())); | ||||
| 		return i != null && VIEW_AND_SHARE_ACTIONS.contains(i.getAction()) && i.hasExtra(EXTRA_CONVERSATION); | ||||
| 	} | ||||
| 
 | ||||
| 	private static Intent createLauncherIntent(Context context) { | ||||
| @ -383,7 +392,7 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio | ||||
| 		} else { | ||||
| 			intent = savedInstanceState.getParcelable("intent"); | ||||
| 		} | ||||
| 		if (isViewIntent(intent)) { | ||||
| 		if (isViewOrShareIntent(intent)) { | ||||
| 			pendingViewIntent.push(intent); | ||||
| 			setIntent(createLauncherIntent(this)); | ||||
| 		} | ||||
| @ -530,7 +539,7 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio | ||||
| 
 | ||||
| 	@Override | ||||
| 	protected void onNewIntent(final Intent intent) { | ||||
| 		if (isViewIntent(intent)) { | ||||
| 		if (isViewOrShareIntent(intent)) { | ||||
| 			if (xmppConnectionService != null) { | ||||
| 				processViewIntent(intent); | ||||
| 			} else { | ||||
|  | ||||
| @ -1,6 +1,5 @@ | ||||
| package eu.siacs.conversations.ui; | ||||
| 
 | ||||
| import android.app.PendingIntent; | ||||
| import android.content.Intent; | ||||
| import android.content.pm.PackageManager; | ||||
| import android.net.Uri; | ||||
| @ -12,387 +11,190 @@ import android.view.Menu; | ||||
| import android.view.MenuItem; | ||||
| import android.widget.Toast; | ||||
| 
 | ||||
| import java.net.URLConnection; | ||||
| import java.util.ArrayList; | ||||
| import java.util.Iterator; | ||||
| import java.util.List; | ||||
| import java.util.concurrent.atomic.AtomicInteger; | ||||
| 
 | ||||
| import eu.siacs.conversations.Config; | ||||
| import eu.siacs.conversations.R; | ||||
| import eu.siacs.conversations.entities.Account; | ||||
| import eu.siacs.conversations.entities.Conversation; | ||||
| import eu.siacs.conversations.entities.Message; | ||||
| import eu.siacs.conversations.persistance.FileBackend; | ||||
| import eu.siacs.conversations.services.XmppConnectionService; | ||||
| import eu.siacs.conversations.ui.adapter.ConversationAdapter; | ||||
| import eu.siacs.conversations.ui.service.EmojiService; | ||||
| import eu.siacs.conversations.ui.util.PresenceSelector; | ||||
| import eu.siacs.conversations.xmpp.XmppConnection; | ||||
| import rocks.xmpp.addr.Jid; | ||||
| 
 | ||||
| public class ShareWithActivity extends XmppActivity implements XmppConnectionService.OnConversationUpdate { | ||||
| 
 | ||||
| 	private static final int REQUEST_STORAGE_PERMISSION = 0x733f32; | ||||
| 	private boolean mReturnToPrevious = false; | ||||
| 	private Conversation mPendingConversation = null; | ||||
|     private static final int REQUEST_STORAGE_PERMISSION = 0x733f32; | ||||
|     private Conversation mPendingConversation = null; | ||||
| 
 | ||||
| 	@Override | ||||
| 	public void onConversationUpdate() { | ||||
| 		refreshUi(); | ||||
| 	} | ||||
|     @Override | ||||
|     public void onConversationUpdate() { | ||||
|         refreshUi(); | ||||
|     } | ||||
| 
 | ||||
| 	private class Share { | ||||
| 		public List<Uri> uris = new ArrayList<>(); | ||||
| 		public boolean image; | ||||
| 		public String account; | ||||
| 		public String contact; | ||||
| 		public String text; | ||||
| 		public String uuid; | ||||
| 		public boolean multiple = false; | ||||
| 		public String type; | ||||
| 	} | ||||
|     private class Share { | ||||
|         ArrayList<Uri> uris = new ArrayList<>(); | ||||
|         public String account; | ||||
|         public String contact; | ||||
|         public String text; | ||||
|     } | ||||
| 
 | ||||
| 	private Share share; | ||||
|     private Share share; | ||||
| 
 | ||||
| 	private static final int REQUEST_START_NEW_CONVERSATION = 0x0501; | ||||
| 	private RecyclerView mListView; | ||||
| 	private ConversationAdapter mAdapter; | ||||
| 	private List<Conversation> mConversations = new ArrayList<>(); | ||||
| 	private Toast mToast; | ||||
| 	private AtomicInteger attachmentCounter = new AtomicInteger(0); | ||||
|     private static final int REQUEST_START_NEW_CONVERSATION = 0x0501; | ||||
|     private ConversationAdapter mAdapter; | ||||
|     private List<Conversation> mConversations = new ArrayList<>(); | ||||
| 
 | ||||
| 	private UiInformableCallback<Message> attachFileCallback = new UiInformableCallback<Message>() { | ||||
| 
 | ||||
| 		@Override | ||||
| 		public void inform(final String text) { | ||||
| 			runOnUiThread(() -> replaceToast(text)); | ||||
| 		} | ||||
|     protected void onActivityResult(int requestCode, int resultCode, final Intent data) { | ||||
|         super.onActivityResult(requestCode, resultCode, data); | ||||
|         if (requestCode == REQUEST_START_NEW_CONVERSATION | ||||
|                 && resultCode == RESULT_OK) { | ||||
|             share.contact = data.getStringExtra("contact"); | ||||
|             share.account = data.getStringExtra(EXTRA_ACCOUNT); | ||||
|         } | ||||
|         if (xmppConnectionServiceBound | ||||
|                 && share != null | ||||
|                 && share.contact != null | ||||
|                 && share.account != null) { | ||||
|             share(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| 		@Override | ||||
| 		public void userInputRequried(PendingIntent pi, Message object) { | ||||
| 			// TODO Auto-generated method stub | ||||
|     @Override | ||||
|     public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { | ||||
|         if (grantResults.length > 0) | ||||
|             if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { | ||||
|                 if (requestCode == REQUEST_STORAGE_PERMISSION) { | ||||
|                     if (this.mPendingConversation != null) { | ||||
|                         share(this.mPendingConversation); | ||||
|                     } else { | ||||
|                         Log.d(Config.LOGTAG, "unable to find stored conversation"); | ||||
|                     } | ||||
|                 } | ||||
|             } else { | ||||
|                 Toast.makeText(this, R.string.no_storage_permission, Toast.LENGTH_SHORT).show(); | ||||
|             } | ||||
|     } | ||||
| 
 | ||||
| 		} | ||||
|     @Override | ||||
|     protected void onCreate(Bundle savedInstanceState) { | ||||
|         super.onCreate(savedInstanceState); | ||||
|         new EmojiService(this).init(); | ||||
| 
 | ||||
| 		@Override | ||||
| 		public void success(final Message message) { | ||||
| 			runOnUiThread(() -> { | ||||
| 				if (attachmentCounter.decrementAndGet() <=0 ) { | ||||
| 					int resId; | ||||
| 					if (share.image && share.multiple) { | ||||
| 						resId = R.string.shared_images_with_x; | ||||
| 					} else if (share.image) { | ||||
| 						resId = R.string.shared_image_with_x; | ||||
| 					} else { | ||||
| 						resId = R.string.shared_file_with_x; | ||||
| 					} | ||||
| 					Conversation conversation = (Conversation) message.getConversation(); | ||||
| 					replaceToast(getString(resId, conversation.getName())); | ||||
| 					if (mReturnToPrevious) { | ||||
| 						finish(); | ||||
| 					} else { | ||||
| 						switchToConversation(conversation); | ||||
| 					} | ||||
| 				} | ||||
| 			}); | ||||
| 		} | ||||
|         setContentView(R.layout.activity_share_with); | ||||
| 
 | ||||
| 		@Override | ||||
| 		public void error(final int errorCode, Message object) { | ||||
| 			runOnUiThread(() -> { | ||||
| 				replaceToast(getString(errorCode)); | ||||
| 				if (attachmentCounter.decrementAndGet() <=0 ) { | ||||
| 					finish(); | ||||
| 				} | ||||
| 			}); | ||||
| 		} | ||||
| 	}; | ||||
|         setSupportActionBar(findViewById(R.id.toolbar)); | ||||
|         if (getSupportActionBar() != null) { | ||||
|             getSupportActionBar().setDisplayHomeAsUpEnabled(false); | ||||
|             getSupportActionBar().setHomeButtonEnabled(false); | ||||
|         } | ||||
| 
 | ||||
| 	protected void hideToast() { | ||||
| 		if (mToast != null) { | ||||
| 			mToast.cancel(); | ||||
| 		} | ||||
| 	} | ||||
|         setTitle(getString(R.string.title_activity_sharewith)); | ||||
| 
 | ||||
| 	protected void replaceToast(String msg) { | ||||
| 		hideToast(); | ||||
| 		mToast = Toast.makeText(this, msg ,Toast.LENGTH_LONG); | ||||
| 		mToast.show(); | ||||
| 	} | ||||
|         RecyclerView mListView = findViewById(R.id.choose_conversation_list); | ||||
|         mAdapter = new ConversationAdapter(this, this.mConversations); | ||||
|         mListView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)); | ||||
|         mListView.setAdapter(mAdapter); | ||||
|         mAdapter.setConversationClickListener((view, conversation) -> share(conversation)); | ||||
|         this.share = new Share(); | ||||
|     } | ||||
| 
 | ||||
| 	protected void onActivityResult(int requestCode, int resultCode, final Intent data) { | ||||
| 		super.onActivityResult(requestCode, resultCode, data); | ||||
| 		if (requestCode == REQUEST_START_NEW_CONVERSATION | ||||
| 				&& resultCode == RESULT_OK) { | ||||
| 			share.contact = data.getStringExtra("contact"); | ||||
| 			share.account = data.getStringExtra(EXTRA_ACCOUNT); | ||||
| 		} | ||||
| 		if (xmppConnectionServiceBound | ||||
| 				&& share != null | ||||
| 				&& share.contact != null | ||||
| 				&& share.account != null) { | ||||
| 			share(); | ||||
| 		} | ||||
| 	} | ||||
|     @Override | ||||
|     public boolean onCreateOptionsMenu(Menu menu) { | ||||
|         getMenuInflater().inflate(R.menu.share_with, menu); | ||||
|         return true; | ||||
|     } | ||||
| 
 | ||||
| 	@Override | ||||
| 	public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { | ||||
| 		if (grantResults.length > 0) | ||||
| 			if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { | ||||
| 				if (requestCode == REQUEST_STORAGE_PERMISSION) { | ||||
| 					if (this.mPendingConversation != null) { | ||||
| 						share(this.mPendingConversation); | ||||
| 					} else { | ||||
| 						Log.d(Config.LOGTAG,"unable to find stored conversation"); | ||||
| 					} | ||||
| 				} | ||||
| 			} else { | ||||
| 				Toast.makeText(this, R.string.no_storage_permission, Toast.LENGTH_SHORT).show(); | ||||
| 			} | ||||
| 	} | ||||
|     @Override | ||||
|     public boolean onOptionsItemSelected(final MenuItem item) { | ||||
|         switch (item.getItemId()) { | ||||
|             case R.id.action_add: | ||||
|                 final Intent intent = new Intent(getApplicationContext(), ChooseContactActivity.class); | ||||
|                 startActivityForResult(intent, REQUEST_START_NEW_CONVERSATION); | ||||
|                 return true; | ||||
|         } | ||||
|         return super.onOptionsItemSelected(item); | ||||
|     } | ||||
| 
 | ||||
| 	@Override | ||||
| 	protected void onCreate(Bundle savedInstanceState) { | ||||
| 		super.onCreate(savedInstanceState); | ||||
| 		new EmojiService(this).init(); | ||||
|     @Override | ||||
|     public void onStart() { | ||||
|         super.onStart(); | ||||
|         Intent intent = getIntent(); | ||||
|         if (intent == null) { | ||||
|             return; | ||||
|         } | ||||
|         final String type = intent.getType(); | ||||
|         final String action = intent.getAction(); | ||||
|         if (Intent.ACTION_SEND.equals(action)) { | ||||
|             final String text = intent.getStringExtra(Intent.EXTRA_TEXT); | ||||
|             final Uri uri = intent.getParcelableExtra(Intent.EXTRA_STREAM); | ||||
|             if (type != null && uri != null && (text == null || !type.equals("text/plain"))) { | ||||
|                 this.share.uris.clear(); | ||||
|                 this.share.uris.add(uri); | ||||
|             } else { | ||||
|                 this.share.text = text; | ||||
|             } | ||||
|         } else if (Intent.ACTION_SEND_MULTIPLE.equals(action)) { | ||||
|             this.share.uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); | ||||
|         } | ||||
|         if (xmppConnectionServiceBound) { | ||||
|             xmppConnectionService.populateWithOrderedConversations(mConversations, this.share.uris.size() == 0); | ||||
|         } | ||||
| 
 | ||||
| 		setContentView(R.layout.activity_share_with); | ||||
|     } | ||||
| 
 | ||||
| 		setSupportActionBar(findViewById(R.id.toolbar)); | ||||
| 		if (getSupportActionBar() != null) { | ||||
| 			getSupportActionBar().setDisplayHomeAsUpEnabled(false); | ||||
| 			getSupportActionBar().setHomeButtonEnabled(false); | ||||
| 		} | ||||
|     @Override | ||||
|     void onBackendConnected() { | ||||
|         if (xmppConnectionServiceBound && share != null && ((share.contact != null && share.account != null))) { | ||||
|             share(); | ||||
|             return; | ||||
|         } | ||||
|         refreshUiReal(); | ||||
|     } | ||||
| 
 | ||||
| 		setTitle(getString(R.string.title_activity_sharewith)); | ||||
|     private void share() { | ||||
|         final Conversation conversation; | ||||
|             Account account; | ||||
|             try { | ||||
|                 account = xmppConnectionService.findAccountByJid(Jid.of(share.account)); | ||||
|             } catch (final IllegalArgumentException e) { | ||||
|                 account = null; | ||||
|             } | ||||
|             if (account == null) { | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
| 		mListView = findViewById(R.id.choose_conversation_list); | ||||
| 		mAdapter = new ConversationAdapter(this, this.mConversations); | ||||
| 		mListView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false)); | ||||
| 		mListView.setAdapter(mAdapter); | ||||
| 		mAdapter.setConversationClickListener((view, conversation) -> share(conversation)); | ||||
| 		this.share = new Share(); | ||||
| 	} | ||||
|             try { | ||||
|                 conversation = xmppConnectionService.findOrCreateConversation(account, Jid.of(share.contact), false, true); | ||||
|             } catch (final IllegalArgumentException e) { | ||||
|                 return; | ||||
|             } | ||||
|         share(conversation); | ||||
|     } | ||||
| 
 | ||||
| 	@Override | ||||
| 	public boolean onCreateOptionsMenu(Menu menu) { | ||||
| 		getMenuInflater().inflate(R.menu.share_with, menu); | ||||
| 		return true; | ||||
| 	} | ||||
|     private void share(final Conversation conversation) { | ||||
|         if (share.uris.size() != 0 && !hasStoragePermission(REQUEST_STORAGE_PERMISSION)) { | ||||
|             mPendingConversation = conversation; | ||||
|             return; | ||||
|         } | ||||
|         Intent intent = new Intent(this, ConversationsActivity.class); | ||||
|         intent.putExtra(ConversationsActivity.EXTRA_CONVERSATION, conversation.getUuid()); | ||||
|         if (share.uris.size() > 0) { | ||||
|             intent.setAction(Intent.ACTION_SEND_MULTIPLE); | ||||
|             intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, share.uris); | ||||
|             intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); | ||||
|         } else if (share.text != null) { | ||||
|             intent.setAction(ConversationsActivity.ACTION_VIEW_CONVERSATION); | ||||
|             intent.putExtra(ConversationsActivity.EXTRA_TEXT, share.text); | ||||
|         } | ||||
|         startActivity(intent); | ||||
|         finish(); | ||||
|     } | ||||
| 
 | ||||
| 	@Override | ||||
| 	public boolean onOptionsItemSelected(final MenuItem item) { | ||||
| 		switch (item.getItemId()) { | ||||
| 			case R.id.action_add: | ||||
| 				final Intent intent = new Intent(getApplicationContext(), ChooseContactActivity.class); | ||||
| 				startActivityForResult(intent, REQUEST_START_NEW_CONVERSATION); | ||||
| 				return true; | ||||
| 		} | ||||
| 		return super.onOptionsItemSelected(item); | ||||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
| 	public void onStart() { | ||||
| 		super.onStart(); | ||||
| 		Intent intent = getIntent(); | ||||
| 		if (intent == null) { | ||||
| 			return; | ||||
| 		} | ||||
| 		this.mReturnToPrevious = getBooleanPreference("return_to_previous", R.bool.return_to_previous); | ||||
| 		final String type = intent.getType(); | ||||
| 		final String action = intent.getAction(); | ||||
| 		Log.d(Config.LOGTAG, "action: "+action+ ", type:"+type); | ||||
| 		share.uuid = intent.getStringExtra("uuid"); | ||||
| 		if (Intent.ACTION_SEND.equals(action)) { | ||||
| 			final String text = intent.getStringExtra(Intent.EXTRA_TEXT); | ||||
| 			final Uri uri = intent.getParcelableExtra(Intent.EXTRA_STREAM); | ||||
| 			if (type != null && uri != null && (text == null || !type.equals("text/plain"))) { | ||||
| 				this.share.uris.clear(); | ||||
| 				this.share.uris.add(uri); | ||||
| 				this.share.image = type.startsWith("image/") || isImage(uri); | ||||
| 				this.share.type = type; | ||||
| 			} else { | ||||
| 				this.share.text = text; | ||||
| 			} | ||||
| 		} else if (Intent.ACTION_SEND_MULTIPLE.equals(action)) { | ||||
| 			this.share.image = type != null && type.startsWith("image/"); | ||||
| 			if (!this.share.image) { | ||||
| 				return; | ||||
| 			} | ||||
| 			this.share.uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); | ||||
| 		} | ||||
| 		if (xmppConnectionServiceBound) { | ||||
| 			if (share.uuid != null) { | ||||
| 				share(); | ||||
| 			} else { | ||||
| 				xmppConnectionService.populateWithOrderedConversations(mConversations, this.share.uris.size() == 0); | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 	} | ||||
| 
 | ||||
| 	protected boolean isImage(Uri uri) { | ||||
| 		try { | ||||
| 			String guess = URLConnection.guessContentTypeFromName(uri.toString()); | ||||
| 			return (guess != null && guess.startsWith("image/")); | ||||
| 		} catch (final StringIndexOutOfBoundsException ignored) { | ||||
| 			return false; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
| 	void onBackendConnected() { | ||||
| 		if (xmppConnectionServiceBound && share != null | ||||
| 				&& ((share.contact != null && share.account != null) || share.uuid != null)) { | ||||
| 			share(); | ||||
| 			return; | ||||
| 		} | ||||
| 		refreshUiReal(); | ||||
| 	} | ||||
| 
 | ||||
| 	private void share() { | ||||
| 		final Conversation conversation; | ||||
| 		if (share.uuid != null) { | ||||
| 			conversation = xmppConnectionService.findConversationByUuid(share.uuid); | ||||
| 			if (conversation == null) { | ||||
| 				return; | ||||
| 			} | ||||
| 		}else{ | ||||
| 			Account account; | ||||
| 			try { | ||||
| 				account = xmppConnectionService.findAccountByJid(Jid.of(share.account)); | ||||
| 			} catch (final IllegalArgumentException e) { | ||||
| 				account = null; | ||||
| 			} | ||||
| 			if (account == null) { | ||||
| 				return; | ||||
| 			} | ||||
| 
 | ||||
| 			try { | ||||
| 				conversation = xmppConnectionService | ||||
| 						.findOrCreateConversation(account, Jid.of(share.contact), false,true); | ||||
| 			} catch (final IllegalArgumentException e) { | ||||
| 				return; | ||||
| 			} | ||||
| 		} | ||||
| 		share(conversation); | ||||
| 	} | ||||
| 
 | ||||
| 	private void share(final Conversation conversation) { | ||||
| 		if (share.uris.size() != 0 && !hasStoragePermission(REQUEST_STORAGE_PERMISSION)) { | ||||
| 			mPendingConversation = conversation; | ||||
| 			return; | ||||
| 		} | ||||
| 		final Account account = conversation.getAccount(); | ||||
| 		final XmppConnection connection = account.getXmppConnection(); | ||||
| 		final long max = connection == null ? -1 : connection.getFeatures().getMaxHttpUploadSize(); | ||||
| 		mListView.setEnabled(false); | ||||
| 		if (conversation.getNextEncryption() == Message.ENCRYPTION_PGP && !hasPgp()) { | ||||
| 			if (share.uuid == null) { | ||||
| 				showInstallPgpDialog(); | ||||
| 			} else { | ||||
| 				Toast.makeText(this,R.string.openkeychain_not_installed,Toast.LENGTH_SHORT).show(); | ||||
| 				finish(); | ||||
| 			} | ||||
| 			return; | ||||
| 		} | ||||
| 		if (share.uris.size() != 0) { | ||||
| 			PresenceSelector.OnPresenceSelected callback = () -> { | ||||
| 				attachmentCounter.set(share.uris.size()); | ||||
| 				if (share.image) { | ||||
| 					share.multiple = share.uris.size() > 1; | ||||
| 					replaceToast(getString(share.multiple ? R.string.preparing_images : R.string.preparing_image)); | ||||
| 					for (Iterator<Uri> i = share.uris.iterator(); i.hasNext(); i.remove()) { | ||||
| 						final Uri uri = i.next(); | ||||
| 						delegateUriPermissionsToService(uri); | ||||
| 						xmppConnectionService.attachImageToConversation(conversation, uri, attachFileCallback); | ||||
| 					} | ||||
| 				} else { | ||||
| 					replaceToast(getString(R.string.preparing_file)); | ||||
| 					final Uri uri = share.uris.get(0); | ||||
| 					delegateUriPermissionsToService(uri); | ||||
| 					xmppConnectionService.attachFileToConversation(conversation, uri, share.type,  attachFileCallback); | ||||
| 				} | ||||
| 			}; | ||||
| 			if (account.httpUploadAvailable() | ||||
| 					&& ((share.image && !neverCompressPictures()) | ||||
| 					|| conversation.getMode() == Conversation.MODE_MULTI | ||||
| 					/*|| FileBackend.allFilesUnderSize(this, share.uris, max)*/)) { | ||||
| 				callback.onPresenceSelected(); | ||||
| 			} else { | ||||
| 				selectPresence(conversation, callback); | ||||
| 			} | ||||
| 		} else { | ||||
| 			if (mReturnToPrevious && this.share.text != null && !this.share.text.isEmpty() ) { | ||||
| 				final PresenceSelector.OnPresenceSelected callback = new PresenceSelector.OnPresenceSelected() { | ||||
| 
 | ||||
| 					private void finishAndSend(Message message) { | ||||
| 						replaceToast(getString(R.string.shared_text_with_x, conversation.getName())); | ||||
| 						finish(); | ||||
| 					} | ||||
| 
 | ||||
| 					private UiCallback<Message> messageEncryptionCallback = new UiCallback<Message>() { | ||||
| 						@Override | ||||
| 						public void success(final Message message) { | ||||
| 							runOnUiThread(() -> finishAndSend(message)); | ||||
| 						} | ||||
| 
 | ||||
| 						@Override | ||||
| 						public void error(final int errorCode, Message object) { | ||||
| 							runOnUiThread(() -> { | ||||
| 								replaceToast(getString(errorCode)); | ||||
| 								finish(); | ||||
| 							}); | ||||
| 						} | ||||
| 
 | ||||
| 						@Override | ||||
| 						public void userInputRequried(PendingIntent pi, Message object) { | ||||
| 							finish(); | ||||
| 						} | ||||
| 					}; | ||||
| 
 | ||||
| 					@Override | ||||
| 					public void onPresenceSelected() { | ||||
| 
 | ||||
| 						final int encryption = conversation.getNextEncryption(); | ||||
| 
 | ||||
| 						Message message = new Message(conversation,share.text, encryption); | ||||
| 
 | ||||
| 						Log.d(Config.LOGTAG,"on presence selected encrpytion="+encryption); | ||||
| 
 | ||||
| 						if (encryption == Message.ENCRYPTION_PGP) { | ||||
| 							replaceToast(getString(R.string.encrypting_message)); | ||||
| 							xmppConnectionService.getPgpEngine().encrypt(message,messageEncryptionCallback); | ||||
| 							return; | ||||
| 						} | ||||
| 						xmppConnectionService.sendMessage(message); | ||||
| 						finishAndSend(message); | ||||
| 					} | ||||
| 				}; | ||||
| 				if (conversation.getNextEncryption() == Message.ENCRYPTION_OTR) { | ||||
| 					selectPresence(conversation, callback); | ||||
| 				} else { | ||||
| 					callback.onPresenceSelected(); | ||||
| 				} | ||||
| 			} else { | ||||
| 				switchToConversation(conversation, this.share.text, true); | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 	} | ||||
| 
 | ||||
| 	public void refreshUiReal() { | ||||
| 		xmppConnectionService.populateWithOrderedConversations(mConversations, this.share != null && this.share.uris.size() == 0); | ||||
| 		mAdapter.notifyDataSetChanged(); | ||||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
| 	public void onBackPressed() { | ||||
| 		if (attachmentCounter.get() >= 1) { | ||||
| 			replaceToast(getString(R.string.sharing_files_please_wait)); | ||||
| 		} else { | ||||
| 			super.onBackPressed(); | ||||
| 		} | ||||
| 	} | ||||
|     public void refreshUiReal() { | ||||
|         xmppConnectionService.populateWithOrderedConversations(mConversations, this.share != null && this.share.uris.size() == 0); | ||||
|         mAdapter.notifyDataSetChanged(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -75,6 +75,14 @@ public class Attachment { | ||||
|         return Collections.singletonList(new Attachment(uri, type, mime)); | ||||
|     } | ||||
| 
 | ||||
|     public static List<Attachment> of(final Context context, List<Uri> uris) { | ||||
|         List<Attachment> attachments = new ArrayList<>(); | ||||
|         for(Uri uri : uris) { | ||||
|             final String mime = MimeUtils.guessMimeTypeFromUri(context, uri); | ||||
|             attachments.add(new Attachment(uri, mime != null && mime.startsWith("image/") ? Type.IMAGE : Type.FILE,mime)); | ||||
|         } | ||||
|         return attachments; | ||||
|     } | ||||
| 
 | ||||
|     public static List<Attachment> extractAttachments(final Context context, final Intent intent, Type type) { | ||||
|         List<Attachment> uris = new ArrayList<>(); | ||||
|  | ||||
| @ -35,7 +35,6 @@ | ||||
|     <bool name="indicate_received">false</bool> | ||||
|     <bool name="enable_foreground_service">false</bool> | ||||
|     <bool name="never_send">false</bool> | ||||
|     <bool name="return_to_previous">false</bool> | ||||
|     <bool name="validate_hostname">false</bool> | ||||
|     <bool name="show_qr_code_scan">true</bool> | ||||
|     <bool name="scroll_to_bottom">true</bool> | ||||
|  | ||||
| @ -105,8 +105,6 @@ | ||||
|     <string name="pref_accept_files">Accept files</string> | ||||
|     <string name="pref_accept_files_summary">Automatically accept files smaller than…</string> | ||||
|     <string name="pref_attachments">Attachments</string> | ||||
|     <string name="pref_return_to_previous">Quick Sharing</string> | ||||
|     <string name="pref_return_to_previous_summary">Immediately return to previous activity instead of opening the conversation after sharing something</string> | ||||
|     <string name="pref_notification_settings">Notification</string> | ||||
|     <string name="pref_vibrate">Vibrate</string> | ||||
|     <string name="pref_vibrate_summary">Vibrate when a new message arrives</string> | ||||
|  | ||||
| @ -137,11 +137,6 @@ | ||||
|             android:key="picture_compression" | ||||
|             android:summary="@string/pref_picture_compression_summary" | ||||
|             android:title="@string/pref_picture_compression" /> | ||||
|         <CheckBoxPreference | ||||
|             android:defaultValue="@bool/return_to_previous" | ||||
|             android:key="return_to_previous" | ||||
|             android:summary="@string/pref_return_to_previous_summary" | ||||
|             android:title="@string/pref_return_to_previous" /> | ||||
|         <CheckBoxPreference | ||||
|             android:defaultValue="@bool/use_share_location_plugin" | ||||
|             android:key="use_share_location_plugin" | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Daniel Gultsch
						Daniel Gultsch