From 1e1ded9795a831a5f6949363d4c583538f87f0a8 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Mon, 29 Jul 2019 22:14:35 +0200 Subject: [PATCH] Move login logic to vm --- .idea/misc.xml | 2 +- .../messenger/ui/login/LoginActivity.java | 128 ++++++---------- .../messenger/ui/login/LoginViewModel.java | 141 ++++++++++++++++++ build.gradle | 3 +- version.gradle | 21 ++- .../xmpp_android/test/BuildConfig.java | 13 ++ .../messenger/xmpp_android/BuildConfig.java | 13 ++ .../debug/aapt/AndroidManifest.xml | 11 ++ .../debug/aapt/output.json | 1 + .../debug/AndroidManifest.xml | 11 ++ .../merged_manifests/debug/output.json | 1 + .../debugAndroidTest/AndroidManifest.xml | 22 +++ .../debugAndroidTest/output.json | 1 + .../logs/manifest-merger-debug-report.txt | 37 +++++ 14 files changed, 314 insertions(+), 91 deletions(-) create mode 100644 xmpp_android/build/generated/source/buildConfig/androidTest/debug/org/mercury_im/messenger/xmpp_android/test/BuildConfig.java create mode 100644 xmpp_android/build/generated/source/buildConfig/debug/org/mercury_im/messenger/xmpp_android/BuildConfig.java create mode 100644 xmpp_android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/AndroidManifest.xml create mode 100644 xmpp_android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/output.json create mode 100644 xmpp_android/build/intermediates/library_manifest/debug/AndroidManifest.xml create mode 100644 xmpp_android/build/intermediates/merged_manifests/debug/output.json create mode 100644 xmpp_android/build/intermediates/merged_manifests/debugAndroidTest/AndroidManifest.xml create mode 100644 xmpp_android/build/intermediates/merged_manifests/debugAndroidTest/output.json create mode 100644 xmpp_android/build/outputs/logs/manifest-merger-debug-report.txt diff --git a/.idea/misc.xml b/.idea/misc.xml index 2326c24..84da703 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java b/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java index ca49e41..0dce161 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/LoginActivity.java @@ -10,6 +10,7 @@ import android.widget.Button; import android.widget.TextView; import androidx.lifecycle.LiveData; +import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProviders; import com.google.android.material.textfield.TextInputEditText; @@ -44,9 +45,6 @@ import butterknife.ButterKnife; */ public class LoginActivity extends BindingActivity implements TextView.OnEditorActionListener { - @Inject - AccountRepository accountRepository; - // UI references. @BindView(R.id.jid) TextInputEditText mJidView; @@ -72,13 +70,50 @@ public class LoginActivity extends BindingActivity implements TextView.OnEditorA viewModel = ViewModelProviders.of(this).get(LoginViewModel.class); displayCredentials(viewModel.getAccount()); + viewModel.getJidError().observe(this, jidError -> { + if (jidError == null) return; + String errorMessage = null; + switch (jidError) { + case none: + break; + case emptyJid: + errorMessage = getResources().getString(R.string.error_field_required); + break; + case invalidJid: + errorMessage = getResources().getString(R.string.error_invalid_jid); + break; + case unknownJid: + errorMessage = "Unknown Jid!"; + } + mJidView.setError(errorMessage); + }); + + viewModel.getPasswordError().observe(this, passwordError -> { + if (passwordError == null) return; + String errorMessage = null; + switch (passwordError) { + case none: + break; + case emptyPassword: + errorMessage = getResources().getString(R.string.error_field_required); + break; + case invalidPassword: + errorMessage = getResources().getString(R.string.error_invalid_password); + break; + case incorrectPassword: + errorMessage = getResources().getString(R.string.error_incorrect_password); + break; + } + mPasswordView.setError(errorMessage); + }); + mJidView.setOnEditorActionListener(this); mPasswordView.setOnEditorActionListener(this); mSignInView.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { - loginDetailsEntered(); + viewModel.loginDetailsEntered(); } }); mSignInView.setEnabled(false); @@ -87,12 +122,14 @@ public class LoginActivity extends BindingActivity implements TextView.OnEditorA @Override protected void onServiceBound() { super.onServiceBound(); + viewModel.setConnectionService(connectionService); mSignInView.setEnabled(true); } @Override protected void onServiceUnbound() { super.onServiceUnbound(); + viewModel.setConnectionService(null); mSignInView.setEnabled(false); } @@ -112,88 +149,7 @@ public class LoginActivity extends BindingActivity implements TextView.OnEditorA }); } - // TODO: Move to ViewModel - private void loginDetailsEntered() { - boolean loginIntact = true; - String jidInput = mJidView.getText().toString(); - if (jidInput.isEmpty()) { - mJidView.setError(getResources().getString(R.string.error_field_required)); - loginIntact = false; - } - EntityBareJid jid = asValidJidOrNull(jidInput); - if (jid == null) { - mJidView.setError(getResources().getString(R.string.error_invalid_jid)); - loginIntact = false; - } - - String password = mPasswordView.getText().toString(); - if (!isPasswordValid(password)) { - mPasswordView.setError(getResources().getString(R.string.error_invalid_password)); - loginIntact = false; - } - - if (loginIntact) { - RoomAccountModel accountModel = new RoomAccountModel(); - accountModel.setEnabled(true); - accountModel.setJid(jid); - accountModel.setPassword(password); - long id = accountRepository.insertAccount(accountModel); - accountModel.setId(id); - Log.d(MercuryImApplication.TAG, "LoginActivity.loginDetailsEntered: Account " + id + " inserted."); - attemptLogin(accountModel); - } - } - - private void attemptLogin(AccountModel accountModel) { - XMPPTCPConnectionConfiguration configuration = XMPPTCPConnectionConfiguration.builder() - .setHost(accountModel.getJid().getDomain().toString()) - .setXmppAddressAndPassword(accountModel.getJid(), accountModel.getPassword()) - .setConnectTimeout(2 * 60 * 1000) - .build(); - new Thread() { - @Override - public void run() { - try { - XMPPTCPConnection connection = new XMPPTCPConnection(configuration); - connection.setUseStreamManagementResumption(true); - connection.setUseStreamManagement(true); - MercuryConnection mercuryConnection = new AndroidMercuryConnection(connection, accountModel.getId()); - connectionService.putConnection(accountModel.getId(), mercuryConnection); - mercuryConnection.setRosterHandler(new RoomRosterHandler(mercuryConnection)); - mercuryConnection.setPlainMessageHandler(new RoomPlainMessageHandler(accountModel.getId())); - - connection.connect().login(); - Log.d(MercuryImApplication.TAG, "Logged in for " + accountModel.getJid().toString()); - } catch (XmppStringprepException e) { - e.printStackTrace(); - } catch (InterruptedException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } catch (SmackException e) { - e.printStackTrace(); - } catch (XMPPException e) { - e.printStackTrace(); - } - } - }.start(); - super.finish(); - } - - /** - * Try to parse the input string into a {@link EntityBareJid} and return it. - * Return null on failure. - * @param input input string - * @return valid jid or null - */ - private EntityBareJid asValidJidOrNull(String input) { - return JidCreate.entityBareFromOrNull(input); - } - - private boolean isPasswordValid(String password) { - return !password.isEmpty(); - } @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { @@ -207,7 +163,7 @@ public class LoginActivity extends BindingActivity implements TextView.OnEditorA case R.id.password: if (actionId == EditorInfo.IME_ACTION_DONE || actionId == EditorInfo.IME_NULL) { - loginDetailsEntered(); + viewModel.loginDetailsEntered(); return true; } } diff --git a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java b/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java index ca4e599..33074e5 100644 --- a/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java +++ b/app/src/main/java/org/mercury_im/messenger/ui/login/LoginViewModel.java @@ -1,12 +1,31 @@ package org.mercury_im.messenger.ui.login; +import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; import androidx.annotation.NonNull; import android.text.TextUtils; +import android.util.Log; +import org.jivesoftware.smack.SmackException; +import org.jivesoftware.smack.XMPPException; +import org.jivesoftware.smack.tcp.XMPPTCPConnection; +import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration; +import org.jxmpp.jid.EntityBareJid; +import org.jxmpp.jid.impl.JidCreate; +import org.jxmpp.stringprep.XmppStringprepException; +import org.mercury_im.messenger.AndroidMercuryConnection; +import org.mercury_im.messenger.MercuryImApplication; +import org.mercury_im.messenger.R; +import org.mercury_im.messenger.handler.RoomPlainMessageHandler; +import org.mercury_im.messenger.handler.RoomRosterHandler; +import org.mercury_im.messenger.persistence.model.AccountModel; import org.mercury_im.messenger.persistence.room.model.RoomAccountModel; import org.mercury_im.messenger.persistence.repository.AccountRepository; +import org.mercury_im.messenger.service.XmppConnectionService; +import org.mercury_im.messenger.xmpp_core.MercuryConnection; + +import java.io.IOException; import javax.inject.Inject; @@ -16,6 +35,14 @@ public class LoginViewModel extends ViewModel { @Inject AccountRepository accountRepository; + private XmppConnectionService connectionService; + + private String jid; + private String password; + + private MutableLiveData jidError = new MutableLiveData<>(); + private MutableLiveData passwordError = new MutableLiveData<>(); + private MutableLiveData account = new MutableLiveData<>(); public LoginViewModel() { @@ -23,6 +50,50 @@ public class LoginViewModel extends ViewModel { init(new RoomAccountModel()); } + public enum JidError { + none, + emptyJid, + invalidJid, + unknownJid + } + + public enum PasswordError { + none, + emptyPassword, + invalidPassword, + incorrectPassword + } + + public void onJidInputChanged(String input) { + this.jid = input; + } + + public void onPasswordInputChanged(String input) { + this.password = input; + } + + public LiveData getJidError() { + return jidError; + } + + public LiveData getPasswordError() { + return passwordError; + } + + /** + * Try to parse the input string into a {@link EntityBareJid} and return it. + * Return null on failure. + * @param input input string + * @return valid jid or null + */ + private EntityBareJid asValidJidOrNull(String input) { + return JidCreate.entityBareFromOrNull(input); + } + + private boolean isPasswordValid(String password) { + return !password.isEmpty(); + } + public void init(@NonNull RoomAccountModel account) { this.account.setValue(account); } @@ -37,4 +108,74 @@ public class LoginViewModel extends ViewModel { accountRepository.insertAccount(account); } } + + // TODO: Move to ViewModel + public void loginDetailsEntered() { + boolean loginIntact = true; + if (jid.isEmpty()) { + jidError.postValue(JidError.emptyJid); + loginIntact = false; + } + + EntityBareJid bareJid = asValidJidOrNull(jid); + if (bareJid == null) { + jidError.postValue(JidError.invalidJid); + loginIntact = false; + } + + if (!isPasswordValid(password)) { + passwordError.postValue(PasswordError.invalidPassword); + loginIntact = false; + } + + if (loginIntact) { + RoomAccountModel accountModel = new RoomAccountModel(); + accountModel.setEnabled(true); + accountModel.setJid(bareJid); + accountModel.setPassword(password); + long id = accountRepository.insertAccount(accountModel); + accountModel.setId(id); + Log.d(MercuryImApplication.TAG, "LoginActivity.loginDetailsEntered: Account " + id + " inserted."); + attemptLogin(accountModel); + } + } + + private void attemptLogin(AccountModel accountModel) { + XMPPTCPConnectionConfiguration configuration = XMPPTCPConnectionConfiguration.builder() + .setHost(accountModel.getJid().getDomain().toString()) + .setXmppAddressAndPassword(accountModel.getJid(), accountModel.getPassword()) + .setConnectTimeout(2 * 60 * 1000) + .build(); + new Thread() { + @Override + public void run() { + try { + XMPPTCPConnection connection = new XMPPTCPConnection(configuration); + connection.setUseStreamManagementResumption(true); + connection.setUseStreamManagement(true); + MercuryConnection mercuryConnection = new AndroidMercuryConnection(connection, accountModel.getId()); + connectionService.putConnection(accountModel.getId(), mercuryConnection); + mercuryConnection.setRosterHandler(new RoomRosterHandler(mercuryConnection)); + mercuryConnection.setPlainMessageHandler(new RoomPlainMessageHandler(accountModel.getId())); + + connection.connect().login(); + Log.d(MercuryImApplication.TAG, "Logged in for " + accountModel.getJid().toString()); + } catch (XmppStringprepException e) { + e.printStackTrace(); + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (SmackException e) { + e.printStackTrace(); + } catch (XMPPException e) { + e.printStackTrace(); + } + } + }.start(); + } + + public void setConnectionService(XmppConnectionService connectionService) { + this.connectionService = connectionService; + } } diff --git a/build.gradle b/build.gradle index 41794c9..0cfbae2 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.4.1' + classpath 'com.android.tools.build:gradle:3.4.2' // NOTE: Do not place your application dependencies here; they belong @@ -25,6 +25,7 @@ allprojects { repositories { google() jcenter() + mavenLocal() maven { url 'https://igniterealtime.org/repo/' } diff --git a/version.gradle b/version.gradle index 4ddd8bf..68be4ca 100644 --- a/version.gradle +++ b/version.gradle @@ -3,19 +3,34 @@ ext { // Quickly switch between unique and normal releases using the toggle below // Version Strings for non-unique releases - /* - smackVersion = "4.4.0-alpha2-SNAPSHOT" + //* + smackVersion = "4.4.0-alpha3-SNAPSHOT" smackAndroidVersion = smackVersion smackAndroidExtensionsVersion = smackVersion + smackBoshVersion = smackVersion + smackCompressionJzlibVersion = smackVersion smackCoreVersion = smackVersion + smackDebugVersion = smackVersion + smackDebugSlf4jVersion = smackVersion smackExperimentalVersion = smackVersion smackExtensionsVersion = smackVersion smackImVersion = smackVersion + smackIntegrationTestVersion = smackVersion + smackJava7Version = smackVersion + smackJingleOldVersion = smackVersion + smackLegacyVersion = smackVersion smackOmemoVersion = smackVersion smackOmemoSignalVersion = smackVersion + smackOmemoSignalIntegrationTestVersion = smackVersion smackOpenpgpVersion = smackVersion - smackResolverMiniDnsVersion = smackVersion + smackReplVersion = smackVersion + smackResolverDnsjavaVersion = smackVersion + smackResolverJavaxVersion = smackVersion + smackResolverMinidnsVersion = smackVersion + smackResolverMinidnsDoxVersion = smackVersion + smackSaslJavaxVersion = smackVersion + smackSaslProvidedVersion = smackVersion smackTcpVersion = smackVersion /*/ diff --git a/xmpp_android/build/generated/source/buildConfig/androidTest/debug/org/mercury_im/messenger/xmpp_android/test/BuildConfig.java b/xmpp_android/build/generated/source/buildConfig/androidTest/debug/org/mercury_im/messenger/xmpp_android/test/BuildConfig.java new file mode 100644 index 0000000..565dcfd --- /dev/null +++ b/xmpp_android/build/generated/source/buildConfig/androidTest/debug/org/mercury_im/messenger/xmpp_android/test/BuildConfig.java @@ -0,0 +1,13 @@ +/** + * Automatically generated file. DO NOT MODIFY + */ +package org.mercury_im.messenger.xmpp_android.test; + +public final class BuildConfig { + public static final boolean DEBUG = Boolean.parseBoolean("true"); + public static final String APPLICATION_ID = "org.mercury_im.messenger.xmpp_android.test"; + public static final String BUILD_TYPE = "debug"; + public static final String FLAVOR = ""; + public static final int VERSION_CODE = 1; + public static final String VERSION_NAME = "1.0"; +} diff --git a/xmpp_android/build/generated/source/buildConfig/debug/org/mercury_im/messenger/xmpp_android/BuildConfig.java b/xmpp_android/build/generated/source/buildConfig/debug/org/mercury_im/messenger/xmpp_android/BuildConfig.java new file mode 100644 index 0000000..acfa4c7 --- /dev/null +++ b/xmpp_android/build/generated/source/buildConfig/debug/org/mercury_im/messenger/xmpp_android/BuildConfig.java @@ -0,0 +1,13 @@ +/** + * Automatically generated file. DO NOT MODIFY + */ +package org.mercury_im.messenger.xmpp_android; + +public final class BuildConfig { + public static final boolean DEBUG = Boolean.parseBoolean("true"); + public static final String APPLICATION_ID = "org.mercury_im.messenger.xmpp_android"; + public static final String BUILD_TYPE = "debug"; + public static final String FLAVOR = ""; + public static final int VERSION_CODE = 1; + public static final String VERSION_NAME = "1.0"; +} diff --git a/xmpp_android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/AndroidManifest.xml b/xmpp_android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/AndroidManifest.xml new file mode 100644 index 0000000..bf676c4 --- /dev/null +++ b/xmpp_android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/AndroidManifest.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/xmpp_android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/output.json b/xmpp_android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/output.json new file mode 100644 index 0000000..ad8a7c1 --- /dev/null +++ b/xmpp_android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/output.json @@ -0,0 +1 @@ +[{"outputType":{"type":"AAPT_FRIENDLY_MERGED_MANIFESTS"},"apkData":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"xmpp_android-debug.aar","fullName":"debug","baseName":"debug"},"path":"AndroidManifest.xml","properties":{"packageId":"org.mercury_im.messenger.xmpp_android","split":""}}] \ No newline at end of file diff --git a/xmpp_android/build/intermediates/library_manifest/debug/AndroidManifest.xml b/xmpp_android/build/intermediates/library_manifest/debug/AndroidManifest.xml new file mode 100644 index 0000000..bf676c4 --- /dev/null +++ b/xmpp_android/build/intermediates/library_manifest/debug/AndroidManifest.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/xmpp_android/build/intermediates/merged_manifests/debug/output.json b/xmpp_android/build/intermediates/merged_manifests/debug/output.json new file mode 100644 index 0000000..4c648d7 --- /dev/null +++ b/xmpp_android/build/intermediates/merged_manifests/debug/output.json @@ -0,0 +1 @@ +[{"outputType":{"type":"MERGED_MANIFESTS"},"apkData":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"xmpp_android-debug.aar","fullName":"debug","baseName":"debug"},"path":"../../library_manifest/debug/AndroidManifest.xml","properties":{"packageId":"org.mercury_im.messenger.xmpp_android","split":""}}] \ No newline at end of file diff --git a/xmpp_android/build/intermediates/merged_manifests/debugAndroidTest/AndroidManifest.xml b/xmpp_android/build/intermediates/merged_manifests/debugAndroidTest/AndroidManifest.xml new file mode 100644 index 0000000..3354089 --- /dev/null +++ b/xmpp_android/build/intermediates/merged_manifests/debugAndroidTest/AndroidManifest.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/xmpp_android/build/intermediates/merged_manifests/debugAndroidTest/output.json b/xmpp_android/build/intermediates/merged_manifests/debugAndroidTest/output.json new file mode 100644 index 0000000..70b0afb --- /dev/null +++ b/xmpp_android/build/intermediates/merged_manifests/debugAndroidTest/output.json @@ -0,0 +1 @@ +[{"outputType":{"type":"MERGED_MANIFESTS"},"apkData":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"xmpp_android-debug-androidTest.apk","fullName":"debugAndroidTest","baseName":"debug-androidTest"},"path":"AndroidManifest.xml","properties":{}}] \ No newline at end of file diff --git a/xmpp_android/build/outputs/logs/manifest-merger-debug-report.txt b/xmpp_android/build/outputs/logs/manifest-merger-debug-report.txt new file mode 100644 index 0000000..ff328e9 --- /dev/null +++ b/xmpp_android/build/outputs/logs/manifest-merger-debug-report.txt @@ -0,0 +1,37 @@ +-- Merging decision tree log --- +manifest +ADDED from /home/vanitas/Programmierung/mercury/Messenger/xmpp_android/src/main/AndroidManifest.xml:1:1-2:55 +INJECTED from /home/vanitas/Programmierung/mercury/Messenger/xmpp_android/src/main/AndroidManifest.xml:1:1-2:55 +INJECTED from /home/vanitas/Programmierung/mercury/Messenger/xmpp_android/src/main/AndroidManifest.xml:1:1-2:55 +INJECTED from /home/vanitas/Programmierung/mercury/Messenger/xmpp_android/src/main/AndroidManifest.xml:1:1-2:55 +INJECTED from /home/vanitas/Programmierung/mercury/Messenger/xmpp_android/src/main/AndroidManifest.xml:1:1-2:55 +INJECTED from /home/vanitas/Programmierung/mercury/Messenger/xmpp_android/src/main/AndroidManifest.xml:1:1-2:55 +INJECTED from /home/vanitas/Programmierung/mercury/Messenger/xmpp_android/src/main/AndroidManifest.xml:1:1-2:55 + package + ADDED from /home/vanitas/Programmierung/mercury/Messenger/xmpp_android/src/main/AndroidManifest.xml:2:5-52 + INJECTED from /home/vanitas/Programmierung/mercury/Messenger/xmpp_android/src/main/AndroidManifest.xml + INJECTED from /home/vanitas/Programmierung/mercury/Messenger/xmpp_android/src/main/AndroidManifest.xml + android:versionName + INJECTED from /home/vanitas/Programmierung/mercury/Messenger/xmpp_android/src/main/AndroidManifest.xml + ADDED from /home/vanitas/Programmierung/mercury/Messenger/xmpp_android/src/main/AndroidManifest.xml:1:1-2:55 + INJECTED from /home/vanitas/Programmierung/mercury/Messenger/xmpp_android/src/main/AndroidManifest.xml + android:versionCode + INJECTED from /home/vanitas/Programmierung/mercury/Messenger/xmpp_android/src/main/AndroidManifest.xml + ADDED from /home/vanitas/Programmierung/mercury/Messenger/xmpp_android/src/main/AndroidManifest.xml:1:1-2:55 + INJECTED from /home/vanitas/Programmierung/mercury/Messenger/xmpp_android/src/main/AndroidManifest.xml + xmlns:android + ADDED from /home/vanitas/Programmierung/mercury/Messenger/xmpp_android/src/main/AndroidManifest.xml:1:11-69 +uses-sdk +INJECTED from /home/vanitas/Programmierung/mercury/Messenger/xmpp_android/src/main/AndroidManifest.xml reason: use-sdk injection requested +INJECTED from /home/vanitas/Programmierung/mercury/Messenger/xmpp_android/src/main/AndroidManifest.xml +INJECTED from /home/vanitas/Programmierung/mercury/Messenger/xmpp_android/src/main/AndroidManifest.xml +INJECTED from /home/vanitas/Programmierung/mercury/Messenger/xmpp_android/src/main/AndroidManifest.xml +INJECTED from /home/vanitas/Programmierung/mercury/Messenger/xmpp_android/src/main/AndroidManifest.xml + android:targetSdkVersion + INJECTED from /home/vanitas/Programmierung/mercury/Messenger/xmpp_android/src/main/AndroidManifest.xml + ADDED from /home/vanitas/Programmierung/mercury/Messenger/xmpp_android/src/main/AndroidManifest.xml + INJECTED from /home/vanitas/Programmierung/mercury/Messenger/xmpp_android/src/main/AndroidManifest.xml + android:minSdkVersion + INJECTED from /home/vanitas/Programmierung/mercury/Messenger/xmpp_android/src/main/AndroidManifest.xml + ADDED from /home/vanitas/Programmierung/mercury/Messenger/xmpp_android/src/main/AndroidManifest.xml + INJECTED from /home/vanitas/Programmierung/mercury/Messenger/xmpp_android/src/main/AndroidManifest.xml