[
  {
    "path": ".fbprefs",
    "content": "#FindBugs User Preferences\n#Wed Mar 25 22:24:48 CET 2009\ndetectorAppendingToAnObjectOutputStream=AppendingToAnObjectOutputStream|true\ndetectorBadAppletConstructor=BadAppletConstructor|false\ndetectorBadResultSetAccess=BadResultSetAccess|true\ndetectorBadSyntaxForRegularExpression=BadSyntaxForRegularExpression|true\ndetectorBadUseOfReturnValue=BadUseOfReturnValue|true\ndetectorBadlyOverriddenAdapter=BadlyOverriddenAdapter|true\ndetectorBooleanReturnNull=BooleanReturnNull|true\ndetectorCallToUnsupportedMethod=CallToUnsupportedMethod|true\ndetectorCheckImmutableAnnotation=CheckImmutableAnnotation|true\ndetectorCheckTypeQualifiers=CheckTypeQualifiers|true\ndetectorCloneIdiom=CloneIdiom|true\ndetectorComparatorIdiom=ComparatorIdiom|true\ndetectorConfusedInheritance=ConfusedInheritance|true\ndetectorConfusionBetweenInheritedAndOuterMethod=ConfusionBetweenInheritedAndOuterMethod|true\ndetectorCrossSiteScripting=CrossSiteScripting|true\ndetectorDoInsideDoPrivileged=DoInsideDoPrivileged|true\ndetectorDontCatchIllegalMonitorStateException=DontCatchIllegalMonitorStateException|true\ndetectorDontUseEnum=DontUseEnum|true\ndetectorDroppedException=DroppedException|true\ndetectorDumbMethodInvocations=DumbMethodInvocations|true\ndetectorDumbMethods=DumbMethods|true\ndetectorDuplicateBranches=DuplicateBranches|true\ndetectorEmptyZipFileEntry=EmptyZipFileEntry|true\ndetectorEqualsOperandShouldHaveClassCompatibleWithThis=EqualsOperandShouldHaveClassCompatibleWithThis|true\ndetectorFinalizerNullsFields=FinalizerNullsFields|true\ndetectorFindBadCast2=FindBadCast2|true\ndetectorFindBadForLoop=FindBadForLoop|true\ndetectorFindCircularDependencies=FindCircularDependencies|false\ndetectorFindDeadLocalStores=FindDeadLocalStores|true\ndetectorFindDoubleCheck=FindDoubleCheck|true\ndetectorFindEmptySynchronizedBlock=FindEmptySynchronizedBlock|true\ndetectorFindFieldSelfAssignment=FindFieldSelfAssignment|true\ndetectorFindFinalizeInvocations=FindFinalizeInvocations|true\ndetectorFindFloatEquality=FindFloatEquality|true\ndetectorFindHEmismatch=FindHEmismatch|true\ndetectorFindInconsistentSync2=FindInconsistentSync2|true\ndetectorFindJSR166LockMonitorenter=FindJSR166LockMonitorenter|true\ndetectorFindLocalSelfAssignment2=FindLocalSelfAssignment2|true\ndetectorFindMaskedFields=FindMaskedFields|true\ndetectorFindMismatchedWaitOrNotify=FindMismatchedWaitOrNotify|true\ndetectorFindNakedNotify=FindNakedNotify|true\ndetectorFindNonSerializableStoreIntoSession=FindNonSerializableStoreIntoSession|true\ndetectorFindNonSerializableValuePassedToWriteObject=FindNonSerializableValuePassedToWriteObject|true\ndetectorFindNonShortCircuit=FindNonShortCircuit|true\ndetectorFindNullDeref=FindNullDeref|true\ndetectorFindNullDerefsInvolvingNonShortCircuitEvaluation=FindNullDerefsInvolvingNonShortCircuitEvaluation|true\ndetectorFindOpenStream=FindOpenStream|true\ndetectorFindPuzzlers=FindPuzzlers|true\ndetectorFindRefComparison=FindRefComparison|true\ndetectorFindReturnRef=FindReturnRef|true\ndetectorFindRunInvocations=FindRunInvocations|true\ndetectorFindSelfComparison=FindSelfComparison|true\ndetectorFindSelfComparison2=FindSelfComparison2|true\ndetectorFindSleepWithLockHeld=FindSleepWithLockHeld|true\ndetectorFindSpinLoop=FindSpinLoop|true\ndetectorFindSqlInjection=FindSqlInjection|true\ndetectorFindTwoLockWait=FindTwoLockWait|true\ndetectorFindUncalledPrivateMethods=FindUncalledPrivateMethods|true\ndetectorFindUnconditionalWait=FindUnconditionalWait|true\ndetectorFindUninitializedGet=FindUninitializedGet|true\ndetectorFindUnrelatedTypesInGenericContainer=FindUnrelatedTypesInGenericContainer|true\ndetectorFindUnreleasedLock=FindUnreleasedLock|true\ndetectorFindUnsatisfiedObligation=FindUnsatisfiedObligation|true\ndetectorFindUnsyncGet=FindUnsyncGet|true\ndetectorFindUselessControlFlow=FindUselessControlFlow|true\ndetectorFormatStringChecker=FormatStringChecker|true\ndetectorHugeSharedStringConstants=HugeSharedStringConstants|true\ndetectorIDivResultCastToDouble=IDivResultCastToDouble|true\ndetectorIncompatMask=IncompatMask|true\ndetectorInconsistentAnnotations=InconsistentAnnotations|true\ndetectorInefficientMemberAccess=InefficientMemberAccess|false\ndetectorInefficientToArray=InefficientToArray|true\ndetectorInfiniteLoop=InfiniteLoop|true\ndetectorInfiniteRecursiveLoop=InfiniteRecursiveLoop|true\ndetectorInfiniteRecursiveLoop2=InfiniteRecursiveLoop2|false\ndetectorInheritanceUnsafeGetResource=InheritanceUnsafeGetResource|true\ndetectorInitializationChain=InitializationChain|true\ndetectorInstantiateStaticClass=InstantiateStaticClass|true\ndetectorInvalidJUnitTest=InvalidJUnitTest|true\ndetectorIteratorIdioms=IteratorIdioms|true\ndetectorLazyInit=LazyInit|true\ndetectorLoadOfKnownNullValue=LoadOfKnownNullValue|true\ndetectorMethodReturnCheck=MethodReturnCheck|true\ndetectorMultithreadedInstanceAccess=MultithreadedInstanceAccess|true\ndetectorMutableLock=MutableLock|true\ndetectorMutableStaticFields=MutableStaticFields|true\ndetectorNaming=Naming|true\ndetectorNumberConstructor=NumberConstructor|true\ndetectorOverridingEqualsNotSymmetrical=OverridingEqualsNotSymmetrical|true\ndetectorPreferZeroLengthArrays=PreferZeroLengthArrays|true\ndetectorPublicSemaphores=PublicSemaphores|false\ndetectorQuestionableBooleanAssignment=QuestionableBooleanAssignment|true\ndetectorReadReturnShouldBeChecked=ReadReturnShouldBeChecked|true\ndetectorRedundantInterfaces=RedundantInterfaces|true\ndetectorRepeatedConditionals=RepeatedConditionals|true\ndetectorRuntimeExceptionCapture=RuntimeExceptionCapture|true\ndetectorSerializableIdiom=SerializableIdiom|true\ndetectorStartInConstructor=StartInConstructor|true\ndetectorStaticCalendarDetector=StaticCalendarDetector|true\ndetectorStringConcatenation=StringConcatenation|true\ndetectorSuperfluousInstanceOf=SuperfluousInstanceOf|true\ndetectorSuspiciousThreadInterrupted=SuspiciousThreadInterrupted|true\ndetectorSwitchFallthrough=SwitchFallthrough|true\ndetectorSynchronizeAndNullCheckField=SynchronizeAndNullCheckField|true\ndetectorSynchronizeOnClassLiteralNotGetClass=SynchronizeOnClassLiteralNotGetClass|true\ndetectorSynchronizingOnContentsOfFieldToProtectField=SynchronizingOnContentsOfFieldToProtectField|true\ndetectorURLProblems=URLProblems|true\ndetectorUncallableMethodOfAnonymousClass=UncallableMethodOfAnonymousClass|true\ndetectorUnnecessaryMath=UnnecessaryMath|true\ndetectorUnreadFields=UnreadFields|true\ndetectorUseObjectEquals=UseObjectEquals|false\ndetectorUselessSubclassMethod=UselessSubclassMethod|false\ndetectorVarArgsProblems=VarArgsProblems|true\ndetectorVolatileUsage=VolatileUsage|true\ndetectorWaitInLoop=WaitInLoop|true\ndetectorWrongMapIterator=WrongMapIterator|true\ndetectorXMLFactoryBypass=XMLFactoryBypass|true\ndetector_threshold=2\neffort=default\nfilter_settings=Medium|BAD_PRACTICE,CORRECTNESS,EXPERIMENTAL,I18N,MALICIOUS_CODE,MT_CORRECTNESS,PERFORMANCE,SECURITY,STYLE|false\nfilter_settings_neg=|\nrun_at_full_build=true\n"
  },
  {
    "path": ".gitignore",
    "content": ".classpath\n.project\n.settings\nbin/\nbuild/\ngen/\n*.class\nlocal.properties\nbuild.properties\nres/values/version.xml\nlint.xml\nplay-publish-credentials.json\n"
  },
  {
    "path": ".gitmodules",
    "content": "[submodule \"MemorizingTrustManager\"]\n\tpath = MemorizingTrustManager\n\turl = git://github.com/ge0rg/MemorizingTrustManager.git\n"
  },
  {
    "path": "AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\" xmlns:tools=\"http://schemas.android.com/tools\" >\n\n\t<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />\n\t<uses-permission android:name=\"android.permission.FOREGROUND_SERVICE\" />\n\t<uses-permission android:name=\"android.permission.FOREGROUND_SERVICE_REMOTE_MESSAGING\" />\n\t<uses-permission android:name=\"android.permission.INTERNET\" />\n\t<uses-permission android:name=\"android.permission.NFC\" />\n\t<uses-permission android:name=\"android.permission.POST_NOTIFICATIONS\" />\n\t<uses-permission android:name=\"android.permission.RECEIVE_BOOT_COMPLETED\" />\n\t<uses-permission android:name=\"android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS\" />\n\t<uses-permission android:name=\"android.permission.VIBRATE\" />\n\t<uses-permission android:name=\"android.permission.WAKE_LOCK\" />\n\t<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />\n\n\t<application android:icon=\"@drawable/icon\"\n\t\tandroid:name=\".YaximApplication\"\n\t\tandroid:theme=\"@style/YaximDarkTheme\"\n\t\tandroid:supportsRtl=\"true\"\n\t\tandroid:label=\"@string/app_name\">\n\n\t\t<uses-library android:name=\"org.apache.http.legacy\" android:required=\"false\"/>\n\n\t\t<activity android:name=\".MainWindow\" android:label=\"@string/app_name\"\n\t\t\tandroid:launchMode=\"singleTask\"\n\t\t\tandroid:exported=\"true\"\n\t\t\tandroid:clearTaskOnLaunch=\"true\"\n\t\t\tandroid:configChanges=\"orientation|keyboardHidden|screenSize\">\n\t\t\t<intent-filter>\n\t\t\t\t<action android:name=\"android.intent.action.MAIN\" />\n\t\t\t\t<category android:name=\"android.intent.category.LAUNCHER\" />\n\t\t\t</intent-filter>\n\t\t\t<intent-filter android:icon=\"@drawable/icon\" android:label=\"@string/app_name\">\n\t\t\t\t<action android:name=\"android.intent.action.SEND\"></action>\n\t\t\t\t<category android:name=\"android.intent.category.DEFAULT\"></category>\n\t\t\t\t<data android:mimeType=\"text/*\"></data>\n\t\t\t</intent-filter>\n\t\t\t<intent-filter android:icon=\"@drawable/icon\" android:label=\"@string/app_name\">\n\t\t\t\t<action android:name=\"android.intent.action.SEND\"></action>\n\t\t\t\t<category android:name=\"android.intent.category.DEFAULT\"></category>\n\t\t\t\t<data android:mimeType=\"*/*\"></data>\n\t\t\t</intent-filter>\n\t\t\t<intent-filter android:icon=\"@drawable/icon\" android:label=\"@string/Menu_addFriend\">\n\t\t\t\t<action android:name=\"android.intent.action.SENDTO\" />\n\t\t\t\t<category android:name=\"android.intent.category.DEFAULT\" />\n\t\t\t\t<category android:name=\"android.intent.category.BROWSABLE\" />\n\t\t\t\t<data android:host=\"jabber\" android:scheme=\"imto\" />\n\t\t\t</intent-filter>\n\t\t\t<intent-filter android:icon=\"@drawable/icon\" android:label=\"@string/Menu_addFriend\">\n\t\t\t\t<action android:name=\"android.intent.action.VIEW\" />\n\t\t\t\t<category android:name=\"android.intent.category.DEFAULT\" />\n\t\t\t\t<category android:name=\"android.intent.category.BROWSABLE\" />\n\t\t\t\t<data android:scheme=\"xmpp\" />\n\t\t\t</intent-filter>\n\t\t\t<intent-filter android:icon=\"@drawable/icon\" android:label=\"@string/Menu_addFriend\">\n\t\t\t\t<action android:name=\"android.intent.action.VIEW\" />\n\t\t\t\t<category android:name=\"android.intent.category.DEFAULT\" />\n\t\t\t\t<category android:name=\"android.intent.category.BROWSABLE\" />\n\t\t\t\t<data android:scheme=\"https\" android:host=\"join.jabber.network\" />\n\t\t\t\t<data android:scheme=\"https\" android:host=\"xmpp.link\" />\n\t\t\t\t<data android:pathPrefix=\"/\" />\n\t\t\t</intent-filter>\n\t\t\t<intent-filter android:icon=\"@drawable/icon\" android:label=\"@string/Menu_addFriend\">\n\t\t\t\t<action android:name=\"android.intent.action.VIEW\" />\n\t\t\t\t<category android:name=\"android.intent.category.DEFAULT\" />\n\t\t\t\t<category android:name=\"android.intent.category.BROWSABLE\" />\n\t\t\t\t<data android:scheme=\"https\" android:host=\"yax.im\" />\n\t\t\t\t<data android:scheme=\"https\" android:host=\"conversations.im\" />\n\t\t\t\t<data android:pathPrefix=\"/i/\" />\n\t\t\t\t<data android:pathPrefix=\"/j/\" />\n\t\t\t</intent-filter>\n\t\t\t<intent-filter android:icon=\"@drawable/icon\" android:label=\"@string/Menu_addFriend\">\n\t\t\t\t<action android:name=\"android.nfc.action.NDEF_DISCOVERED\"/>\n\t\t\t\t<category android:name=\"android.intent.category.DEFAULT\"/>\n\t\t\t\t<data android:scheme=\"xmpp\"/>\n\t\t\t</intent-filter>\n\t\t</activity>\n\n\t\t<activity android:name=\".chat.ChatWindow\" android:label=\"@string/app_name\"\n\t\t\tandroid:parentActivityName=\".MainWindow\"\n\t\t\tandroid:configChanges=\"orientation|keyboardHidden|screenSize\"\n\t\t\tandroid:windowSoftInputMode=\"stateHidden\">\n\t\t\t<meta-data\n\t\t\t\tandroid:name=\"android.support.PARENT_ACTIVITY\"\n\t\t\t\tandroid:value=\".MainWindow\"/>\n\t\t</activity>\n\n\t\t<activity android:name=\".chat.MUCChatWindow\" android:label=\"@string/app_name\"\n\t\t\tandroid:parentActivityName=\".MainWindow\"\n\t\t\tandroid:configChanges=\"orientation|keyboardHidden|screenSize\"\n\t\t\tandroid:windowSoftInputMode=\"stateHidden\">\n\t\t\t<meta-data\n\t\t\t\tandroid:name=\"android.support.PARENT_ACTIVITY\"\n\t\t\t\tandroid:value=\".MainWindow\"/>\n\t\t</activity>\n\n\t\t<activity android:name=\".list.EntityListActivity\" android:label=\"@string/app_name\"\n\t\t\tandroid:parentActivityName=\".MainWindow\"\n\t\t\tandroid:configChanges=\"orientation|keyboardHidden|screenSize\"\n\t\t\tandroid:windowSoftInputMode=\"stateHidden\">\n\t\t\t<meta-data\n\t\t\t\tandroid:name=\"android.support.PARENT_ACTIVITY\"\n\t\t\t\tandroid:value=\".MainWindow\"/>\n\t\t</activity>\n\t\t<activity android:name=\".list.ServiceDiscoveryActivity\" android:label=\"@string/title_service_disco\"\n\t\t\tandroid:parentActivityName=\".MainWindow\"\n\t\t\tandroid:configChanges=\"orientation|keyboardHidden|screenSize\"\n\t\t\tandroid:windowSoftInputMode=\"stateHidden\">\n\t\t\t<meta-data\n\t\t\t\tandroid:name=\"android.support.PARENT_ACTIVITY\"\n\t\t\t\tandroid:value=\".MainWindow\"/>\n\t\t</activity>\n\t\t<activity android:name=\".list.SearchActivity\" android:label=\"@string/Menu_muc\"\n\t\t\tandroid:parentActivityName=\".MainWindow\"\n\t\t\tandroid:configChanges=\"orientation|keyboardHidden|screenSize\"\n\t\t\tandroid:windowSoftInputMode=\"stateHidden\">\n\t\t\t<meta-data\n\t\t\t\tandroid:name=\"android.support.PARENT_ACTIVITY\"\n\t\t\t\tandroid:value=\".MainWindow\"/>\n\t\t</activity>\n\t\t<activity android:name=\".preferences.MainPrefs\"\n\t\t\tandroid:label=\"@string/Menu_Settings\">\n\t\t</activity>\n\n\t\t<activity android:name=\".preferences.AccountPrefs\"\n\t\t\tandroid:label=\"@string/account_settings_title\">\n\t\t</activity>\n\n\t\t<activity android:name=\".preferences.NotificationPrefs\"\n\t\t\t\t  android:label=\"@string/preftitle_notify\">\n\t\t</activity>\n\n\t\t<service android:name=\".service.XMPPService\"\n\t\t\tandroid:exported=\"true\"\n\t\t\tandroid:foregroundServiceType=\"remoteMessaging\">\n\t\t\t<intent-filter>\n\t\t\t\t<action android:name=\"de.hdmstuttgart.yaxim.XMPPSERVICE\" />\n\t\t\t</intent-filter>\n\t\t</service>\n\n\t\t<receiver android:name=\".service.YaximBroadcastReceiver\" android:exported=\"false\">\n\t\t\t<intent-filter>\n\t\t\t\t<action android:name=\"android.intent.action.ACTION_SHUTDOWN\" />\n\t\t\t\t<action android:name=\"android.intent.action.BOOT_COMPLETED\" />\n\t\t\t\t<action android:name=\"android.net.conn.CONNECTIVITY_CHANGE\" />\n\t\t\t</intent-filter>\n\t\t\t<intent-filter>\n\t\t\t\t<action android:name=\"org.yaxim.androidclient.ACTION_MESSAGE_HEARD\" />\n\t\t\t\t<action android:name=\"org.yaxim.androidclient.ACTION_MESSAGE_REPLY\" />\n\t\t\t</intent-filter>\n\t\t</receiver>\n\n\t\t<provider android:name=\".data.ChatProvider\"\n\t\t\tandroid:exported=\"false\"\n\t\t\tandroid:authorities=\"${applicationId}.provider.Chats\" />\n\t\t<provider android:name=\".data.RosterProvider\"\n\t\t\tandroid:exported=\"false\"\n\t\t\tandroid:authorities=\"${applicationId}.provider.Roster\" />\n\t\t<provider\n\t\t\tandroid:name=\"android.support.v4.content.FileProvider\"\n\t\t\tandroid:authorities=\"${applicationId}.provider.Files\"\n\t\t\tandroid:exported=\"false\"\n\t\t\tandroid:grantUriPermissions=\"true\">\n\t\t\t<meta-data\n\t\t\t\tandroid:name=\"android.support.FILE_PROVIDER_PATHS\"\n\t\t\t\tandroid:resource=\"@xml/provider_paths\"/>\n\t\t</provider>\n\n\t\t<activity android:name=\"de.duenndns.ssl.MemorizingActivity\" />\n\n\t\t<meta-data android:name=\"com.google.android.gms.car.application\"\n\t\t\tandroid:resource=\"@xml/automotive_app_desc\" />\n\t</application>\n</manifest>\n"
  },
  {
    "path": "ChangeLog",
    "content": "0.9.9c:\n * Startup: show absolute sync progress instead of broken percent\n0.9.9b:\n * First startup: improve error handling\n * Service: use default DNS server instead of Google\n * Last Message Correction: always use first message's @id\n0.9.9a:\n * Service: enforce \"foreground service\" on Android 8+\n0.9.9:\n * User Interface: major rework for Material Design and Notification Channels\n * Performance: significant improvement with many messages\n * Easy Onboarding: implement account registration and contact adding (XEP-0401)\n * Easy Onboarding: support Google Play referrers (XEP-0379 + XEP-0401)\n * Reliable Messaging: implement Push (XEP-0357) and MAM (XEP-0313)\n * Service Discovery: allow browsing other servers and join rooms (XEP-0030)\n * The Matrix: support for the official Bifröst bridge on matrix.org\n * Chat Rooms: use account-synchronized nickname (XEP-0172; #163)\n * Chat Rooms: room search, bookmarks\n * Chat: support message search\n * Android: Support for new OS versions\n * XMPP Backend: upgrade to Smack 4.3.5\n * License: switched from GPLv2 to GPLv3 (#89)\n\n0.9.3:\n * File Upload: support sharing of pictures and files, and inline display (thanks Igor; XEP-0363)\n * Chat: support *bold*, _emphasis_, ~strikethrough~ and `code` (thanks Conversations!; XEP-0393)\n * Chat: new \"Quote\" menu option, fix copy on more incoming messages\n * Easy XMPP: integrate (display of) QR codes in yaxim\n * Chat Rooms: new nickname colors (XEP-0392)\n * Notifications: custom ringtones\n * Chat: improve clickable link support\n * Roster: support adding contacts from clipboard\n * About: add \"Rate\" and \"Contact\" buttons\n * Optimization: faster loading of long histories\n * Message Sync: fix duplicate messages bug\n * Server: better discovery of MUC and File Upload\n * Server: create new resurce string on resource conflict\n * Offline: fix delivery of offline MUC messages\n * Chat Rooms: use nickname from VCard\n\n0.9.2:\n * Fixes: Crash and connection problems fixed (among others: chatme.im)\n\n0.9.1:\n * Chat: Smiley Hugification™\n * Chat: fix notification after user pressed <Home>\n * Chat Rooms: repair participant list, fix crashes\n * Icons: toned down status icon contrast\n * Network: Android 7 improvements\n * Build: switch from ant to gradle. finally!\n\n0.9.0:\n * New artwork: yaxim is now \"yak's IM\" ;-)\n * Mobile Optimization: Support google:queue (almost XEP-0352)\n * Roster: proper display of errors and subscription status\n * Group Chats: finally implement XEP-0045 (huge rework)\n * Notifications: many improvements, support Android Auto and Wear\n * Easy XMPP: Easier account creation\n * Easy XMPP: \"Create Invitation\" function (XEP-0379)\n * Easy XMPP: Share contacts via NFC (Android Beam) and via other apps\n * Security: fix for CVE-2017-5589 vulnerability\n * Smarter Away: Set \"DND\" in silent mode\n\n0.8.8:\n * Security: fix for CVE-2014-5075 Smack vulnerability\n * Preferences: new password change dialog\n * Start wizard: re-enter password on account creation\n * Contacts: Revamped status dialog (icons, status message history)\n * Contacts: New \"mark as read\" context menu option\n * Contacts: Option to disable contact groups display\n * Security: closed export of chat and roster ContentProviders\n * Security: TLSv1.2 enabled by default, fallback to v1.1 or v1\n * Network: minor improvements to XEP-0198 ack requests\n * Chat: glued chat window \"OK\" button to the bottom\n * UI: Improved text contrast in light theme\n\n0.8.7b:\n * Server connection: fixed several reconnection issues\n * Preferences: No more crashes with incorrect JID\n * UI: Action Bar updates\n * Notification: Removed distracting ticker for online/offline changes\n\n0.8.7:\n * XEP-0198: Stream Management now fully supported\n * Chat: Returned messages (errors) are displayed in red\n * Settings: IDNA servers are supported now\n * Roster: Ask user about new contact requests\n * Preferences: Auto-reconnect option removed (use \"Quit\" or set status to \"Offline\")\n * Status notification: improve display of connection status, error messages\n * XEP-0092: Software Version replies implemented\n * XEP-0280: incoming carbons now only ring once\n * XEP-0184 + XEP-0280: ack status fixed for CC'ed messages\n * Action Bar: ActionBarSherlock updated from 4.2.0 to 4.4.0\n\n0.8.6b:\n * Also fix client-to-server pings (Oops, sorry!)\n\n0.8.6:\n * Fix server-to-client pings (error caused periodic reconnects)\n * Better connectivity when changing WiFi networks\n * Implement Message Carbons (XEP-0280)\n * Share with yaxim: using main contact list now\n * Contact context menu: display JID\n * Sent messages context menu: new \"Resend\" option\n * Contact sorting is case insensitive now\n * Large contact list loads slightly faster\n * Minor bug fix when aborting a connection\n\n0.8.5:\n * Implement XEP-0199 (client-to-server ping)\n * Implement XEP-0184 (message delivery receipts)\n * Privacy setting to suppress message content in notification\n * Display number of new messages in roster\n * Repair scrolling in chat window (fixes #53)\n * Work around WiFi/3G reconnection bug\n * Implement account creation with yaxim\n * New actionbar\n * Dark/light theme\n * Font size preference\n * Display number of members in roster group (fixes #41)\n * Backend database changes\n\n0.8.4:\n * New user-friendly first startup dialog\n * Support Android 3.x and 4.x\n * Remember which roster groups were collapsed (fixes #51)\n * Support offline timestamps (sending and receiving)\n * New roster implementation (using SQLite, fixes #5)\n * Enforce SSL by default (fixes #65)\n * Support negative priorities (fixes #61)\n * Updated ASMACK from flow, fixed SMACK debugging\n * Support jabber servers with SRV record (finally!)\n\n0.8.3:\n * Fix another auto-reconnect iussue\n * Support negative priority (fixes #61)\n * Display 'Error' messages as such (fixes #44)\n * Show MD5 checksum of SSL certificates (fixes #54)\n * Improved UI\n\n0.8.2:\n * Fix for annoying auto-reconnect bug! Sorry folks!\n * New group separator image\n * Auto-clear notification when opening chat window\n"
  },
  {
    "path": "LICENSE.txt",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<https://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<https://www.gnu.org/licenses/why-not-lgpl.html>.\n"
  },
  {
    "path": "README.md",
    "content": "yaxim (Yet Another XMPP Instant Messenger)\n==========================================\n\nyaxim is a lean Jabber/XMPP client for Android. It aims at usability, low overhead and security, and works on low-end Android devices starting with Android 4.0.\n\nCheck the [yaxim homepage](https://yaxim.org/) for latest news and downloads.\n\n## Features\n\n * Easy configuration and usability, using one XMPP account\n * Keeping your connection when the phone is started and on mobile/WiFi network changes\n * Chatting with friends and in group chats\n * Sending and receiving of text messages, images and files\n * Managing of your contact list\n * [more...](https://yaxim.org/features/)\n\n\n## Links\n\n * [Google Play](https://play.google.com/store/apps/details?id=org.yaxim.androidclient) (recommended, with auto-updates)\n * [F-Droid](https://f-droid.org/repository/browse/?fdid=org.yaxim.androidclient) (this version uses a different signing key, not interchangeable with official yaxim binaries!)\n * [Download APK](http://yax.im/apk)\n * [Screenshots](https://yaxim.org/screenshots/)\n * [Project Home](https://yaxim.org/)\n * [Source on GitHub](https://github.com/yaxim-org/yaxim)\n * [Translation](https://translations.launchpad.net/yaxim/master/+pots/yaxim/)\n\n\n## Build Instructions\n\nyaxim is written in Java and source code is maintained in `git`. The official\nrepository is [yaxim-org](https://github.com/yaxim-org/yaxim), whereas\nexperimental development work happens in\n[ge0rg's repo](https://github.com/ge0rg/yaxim). You will need Android Studio 3.x\nto compile the app.\n\nTo compile yaxim, the following steps need to be taken:\n\n\t# fetch source code from github\n\tgit clone https://github.com/yaxim-org/yaxim.git\n\tcd yaxim\n\t\n\t# initialize submodules\n\tgit submodule init\n\tgit submodule update\n\t\n\t# you can stop here, or go on to compile with gradle:\n\n\t# compile and install debug version of yaxim or Bruno\n\tgradle installYaximDebug\n\tgradle installBrunoDebug\n\t\n\t# compile release APKs for both\n\t# create RELEASE_STORE_FILE according to http://stackoverflow.com/a/25391891/539443\n\tgradle assembleRelease\n\n\n## License\n\n * yaxim is licensed under GNU GPLv3 (see LICENSE.txt)\n\n * [MemorizingTrustManager](https://github.com/ge0rg/memorizingtrustmanager) is MIT licensed.\n\n * [android-remote-stacktrace](http://code.google.com/p/android-remote-stacktrace/) is MIT licensed.\n\n\n### MIT License\n\n*android-remote-stacktrace*: Copyright (c) 2009 Mads Kristiansen, Nullwire ApS\n\n*MemorizingTrustManager*: Copyright (c) 2010 Georg Lukas\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "base.rdf.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<?xml-stylesheet href=\"style.xsl\" type=\"text/xsl\"?>\n<rdf:RDF xmlns=\"http://usefulinc.com/ns/doap#\"\n        xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\n        xmlns:xmpp=\"https://linkmauve.fr/ns/xmpp-doap#\"\n        xmlns:foaf=\"http://xmlns.com/foaf/0.1/\"\n        xmlns:schema=\"https://schema.org/\">\n  <Project>\n\n    <name>${NAME}</name>\n\n    <shortdesc xml:lang=\"en\">${SHORTDESC}</shortdesc>\n    <description xml:lang=\"en\">${DESCRIPTION}</description>\n    <schema:logo rdf:resource=\"${LOGO}\"/>\n    <schema:screenshot rdf:resource=\"${SCREENSHOT}\"/>\n    <schema:documentation rdf:resource=\"https://github.com/yaxim-org/yaxim/wiki\"/>\n\n    <homepage rdf:resource=\"${HOMEPAGE}\" />\n    <wiki rdf:resource=\"https://github.com/yaxim-org/yaxim/wiki\" />\n    <bug-database rdf:resource=\"https://github.com/yaxim-org/yaxim/issues\" />\n    <category rdf:resource=\"https://linkmauve.fr/ns/xmpp-doap#category-client\" />\n    <category rdf:resource=\"http://api.gnome.org/doap-extensions#apps\" />\n    <license rdf:resource=\"http://usefulinc.com/doap/licenses/gplv3\" />\n\n    <programming-language>Java</programming-language>\n    <os>Android</os>\n\n    <repository>\n      <GitRepository>\n        <location rdf:resource=\"https://github.com/yaxim-org/yaxim.git\" />\n        <browse rdf:resource=\"https://github.com/yaxim-org/yaxim\" />\n      </GitRepository>\n    </repository>\n\n    <implements rdf:resource=\"https://xmpp.org/rfcs/rfc6120.html\" />\n    <implements rdf:resource=\"https://xmpp.org/rfcs/rfc6121.html\" />\n    <implements rdf:resource=\"https://xmpp.org/rfcs/rfc6122.html\" />\n    <implements rdf:resource=\"https://xmpp.org/rfcs/rfc7590.html\" />\n\n    <implements>\n      <xmpp:SupportedXep>\n        <xmpp:xep rdf:resource=\"https://xmpp.org/extensions/xep-0030.html\" />\n\t<xmpp:version>2.5rc3</xmpp:version>\n        <xmpp:status>complete</xmpp:status>\n      </xmpp:SupportedXep>\n    </implements>\n    <implements>\n      <xmpp:SupportedXep>\n        <xmpp:xep rdf:resource=\"https://xmpp.org/extensions/xep-0045.html\" />\n\t<xmpp:version>1.32.0</xmpp:version>\n        <xmpp:status>complete</xmpp:status>\n        <xmpp:since>0.9.0</xmpp:since>\n      </xmpp:SupportedXep>\n    </implements>\n    <implements>\n      <xmpp:SupportedXep>\n        <xmpp:xep rdf:resource=\"https://xmpp.org/extensions/xep-0048.html\" />\n\t<xmpp:version>1.1</xmpp:version>\n        <xmpp:status>partial</xmpp:status>\n        <xmpp:since>0.9.3</xmpp:since>\n        <xmpp:note>Loading, but no editing support</xmpp:note>\n      </xmpp:SupportedXep>\n    </implements>\n    <implements>\n      <xmpp:SupportedXep>\n        <xmpp:xep rdf:resource=\"https://xmpp.org/extensions/xep-0049.html\" />\n\t<xmpp:version>1.2</xmpp:version>\n        <xmpp:status>complete</xmpp:status>\n        <xmpp:since>0.9.3</xmpp:since>\n        <xmpp:note>Used for Bookmarks</xmpp:note>\n      </xmpp:SupportedXep>\n    </implements>\n    <implements>\n      <xmpp:SupportedXep>\n        <xmpp:xep rdf:resource=\"https://xmpp.org/extensions/xep-0066.html\" />\n\t<xmpp:version>1.5</xmpp:version>\n        <xmpp:status>complete</xmpp:status>\n        <xmpp:since>0.9.0</xmpp:since>\n        <xmpp:note>Used for inline images</xmpp:note>\n      </xmpp:SupportedXep>\n    </implements>\n    <implements>\n      <xmpp:SupportedXep>\n        <xmpp:xep rdf:resource=\"https://xmpp.org/extensions/xep-0077.html\" />\n\t<xmpp:version>2.4</xmpp:version>\n        <xmpp:status>partial</xmpp:status>\n        <xmpp:note>No forms support</xmpp:note>\n      </xmpp:SupportedXep>\n    </implements>\n    <implements>\n      <xmpp:SupportedXep>\n        <xmpp:xep rdf:resource=\"https://xmpp.org/extensions/xep-0091.html\" />\n\t<xmpp:version>1.4</xmpp:version>\n        <xmpp:status>complete</xmpp:status>\n        <xmpp:note>Supported, obsoleted by XEP-0203</xmpp:note>\n      </xmpp:SupportedXep>\n    </implements>\n    <implements>\n      <xmpp:SupportedXep>\n        <xmpp:xep rdf:resource=\"https://xmpp.org/extensions/xep-0092.html\" />\n\t<xmpp:version>1.1</xmpp:version>\n        <xmpp:status>complete</xmpp:status>\n        <xmpp:note>Not possible yet to query other entities</xmpp:note>\n      </xmpp:SupportedXep>\n    </implements>\n    <implements>\n      <xmpp:SupportedXep>\n        <xmpp:xep rdf:resource=\"https://xmpp.org/extensions/xep-0115.html\" />\n\t<xmpp:version>1.5.1</xmpp:version>\n        <xmpp:status>complete</xmpp:status>\n      </xmpp:SupportedXep>\n    </implements>\n    <implements>\n      <xmpp:SupportedXep>\n        <xmpp:xep rdf:resource=\"https://xmpp.org/extensions/xep-0147.html\" />\n\t<xmpp:version>1.2</xmpp:version>\n        <xmpp:status>complete</xmpp:status>\n        <xmpp:since>0.9.0</xmpp:since>\n\t<xmpp:note>Support for xmpp: URIs and yax.im landing page</xmpp:note>\n      </xmpp:SupportedXep>\n    </implements>\n    <implements>\n      <xmpp:SupportedXep>\n        <xmpp:xep rdf:resource=\"https://xmpp.org/extensions/xep-0172.html\" />\n\t<xmpp:version>1.1</xmpp:version>\n        <xmpp:status>complete</xmpp:status>\n        <xmpp:since>0.9.9</xmpp:since>\n      </xmpp:SupportedXep>\n    </implements>\n    <implements>\n      <xmpp:SupportedXep>\n        <xmpp:xep rdf:resource=\"https://xmpp.org/extensions/xep-0184.html\" />\n\t<xmpp:version>1.4.0</xmpp:version>\n        <xmpp:status>complete</xmpp:status>\n        <xmpp:note>Green checkmark for acknowledged messages</xmpp:note>\n      </xmpp:SupportedXep>\n    </implements>\n    <implements>\n      <xmpp:SupportedXep>\n        <xmpp:xep rdf:resource=\"https://xmpp.org/extensions/xep-0198.html\" />\n\t<xmpp:version>1.6</xmpp:version>\n        <xmpp:status>complete</xmpp:status>\n        <xmpp:note>Fast reconnects on 3G/WiFi switching, stream ACKs</xmpp:note>\n      </xmpp:SupportedXep>\n    </implements>\n    <implements>\n      <xmpp:SupportedXep>\n        <xmpp:xep rdf:resource=\"https://xmpp.org/extensions/xep-0199.html\" />\n\t<xmpp:version>2.0.1</xmpp:version>\n        <xmpp:status>complete</xmpp:status>\n        <xmpp:note>Automatic server pinging every 15 minutes</xmpp:note>\n      </xmpp:SupportedXep>\n    </implements>\n    <implements>\n      <xmpp:SupportedXep>\n        <xmpp:xep rdf:resource=\"https://xmpp.org/extensions/xep-0203.html\" />\n\t<xmpp:version>2.0</xmpp:version>\n        <xmpp:status>complete</xmpp:status>\n      </xmpp:SupportedXep>\n    </implements>\n    <implements>\n      <xmpp:SupportedXep>\n        <xmpp:xep rdf:resource=\"https://xmpp.org/extensions/xep-0245.html\" />\n\t<xmpp:version>1.0</xmpp:version>\n        <xmpp:status>complete</xmpp:status>\n        <xmpp:since>0.9.0</xmpp:since>\n      </xmpp:SupportedXep>\n    </implements>\n    <implements>\n      <xmpp:SupportedXep>\n        <xmpp:xep rdf:resource=\"https://xmpp.org/extensions/xep-0249.html\" />\n\t<xmpp:version>1.2</xmpp:version>\n        <xmpp:status>partial</xmpp:status>\n        <xmpp:since>0.9.0</xmpp:since>\n        <xmpp:note>Receive-only support</xmpp:note>\n      </xmpp:SupportedXep>\n    </implements>\n    <implements>\n      <xmpp:SupportedXep>\n        <xmpp:xep rdf:resource=\"https://xmpp.org/extensions/xep-0280.html\" />\n\t<xmpp:version>0.13.1</xmpp:version>\n        <xmpp:status>complete</xmpp:status>\n      </xmpp:SupportedXep>\n    </implements>\n    <implements>\n      <xmpp:SupportedXep>\n        <xmpp:xep rdf:resource=\"https://xmpp.org/extensions/xep-0286.html\" />\n\t<xmpp:version>1.0.0</xmpp:version>\n        <xmpp:status>complete</xmpp:status>\n      </xmpp:SupportedXep>\n    </implements>\n    <implements>\n      <xmpp:SupportedXep>\n        <xmpp:xep rdf:resource=\"https://xmpp.org/extensions/xep-0297.html\" />\n\t<xmpp:version>1.0</xmpp:version>\n        <xmpp:status>complete</xmpp:status>\n        <xmpp:note>Used for MAM and Carbons</xmpp:note>\n      </xmpp:SupportedXep>\n    </implements>\n    <implements>\n      <xmpp:SupportedXep>\n        <xmpp:xep rdf:resource=\"https://xmpp.org/extensions/xep-0308.html\" />\n\t<xmpp:version>1.1.0</xmpp:version>\n        <xmpp:status>complete</xmpp:status>\n        <xmpp:since>0.9.0</xmpp:since>\n        <xmpp:note>Last 10 messages; sending support since 0.9.3</xmpp:note>\n      </xmpp:SupportedXep>\n    </implements>\n    <implements>\n      <xmpp:SupportedXep>\n        <xmpp:xep rdf:resource=\"https://xmpp.org/extensions/xep-0313.html\" />\n\t<xmpp:version>0.6.3</xmpp:version>\n        <xmpp:status>partial</xmpp:status>\n        <xmpp:since>0.9.9</xmpp:since>\n        <xmpp:note>Not used for MUCs; no configuration</xmpp:note>\n      </xmpp:SupportedXep>\n    </implements>\n    <implements>\n      <xmpp:SupportedXep>\n        <xmpp:xep rdf:resource=\"https://xmpp.org/extensions/xep-0352.html\" />\n\t<xmpp:version>0.3.0</xmpp:version>\n        <xmpp:status>complete</xmpp:status>\n        <xmpp:since>0.9.0</xmpp:since>\n        <xmpp:note>Using google:queue in 0.9.x; proper CSI since 0.9.9</xmpp:note>\n      </xmpp:SupportedXep>\n    </implements>\n    <implements>\n      <xmpp:SupportedXep>\n        <xmpp:xep rdf:resource=\"https://xmpp.org/extensions/xep-0357.html\" />\n\t<xmpp:version>0.3</xmpp:version>\n        <xmpp:status>complete</xmpp:status>\n        <xmpp:since>0.9.9</xmpp:since>\n        <xmpp:note>Registers for push on push.yax.im</xmpp:note>\n      </xmpp:SupportedXep>\n    </implements>\n    <implements>\n      <xmpp:SupportedXep>\n        <xmpp:xep rdf:resource=\"https://xmpp.org/extensions/xep-0359.html\" />\n\t<xmpp:version>0.6.0</xmpp:version>\n        <xmpp:status>partial</xmpp:status>\n        <xmpp:since>0.9.9</xmpp:since>\n        <xmpp:note>Only the subset required for MAM</xmpp:note>\n      </xmpp:SupportedXep>\n    </implements>\n    <implements>\n      <xmpp:SupportedXep>\n        <xmpp:xep rdf:resource=\"https://xmpp.org/extensions/xep-0363.html\" />\n\t<xmpp:version>0.9.0</xmpp:version>\n        <xmpp:status>complete</xmpp:status>\n        <xmpp:since>0.9.3</xmpp:since>\n      </xmpp:SupportedXep>\n    </implements>\n    <implements>\n      <xmpp:SupportedXep>\n        <xmpp:xep rdf:resource=\"https://xmpp.org/extensions/xep-0379.html\" />\n\t<xmpp:version>0.3.1</xmpp:version>\n        <xmpp:status>complete</xmpp:status>\n        <xmpp:since>0.9.0</xmpp:since>\n      </xmpp:SupportedXep>\n    </implements>\n    <implements>\n      <xmpp:SupportedXep>\n        <xmpp:xep rdf:resource=\"https://xmpp.org/extensions/xep-0392.html\" />\n\t<xmpp:version>0.6.0</xmpp:version>\n        <xmpp:status>complete</xmpp:status>\n        <xmpp:since>0.9.3</xmpp:since>\n      </xmpp:SupportedXep>\n    </implements>\n    <implements>\n      <xmpp:SupportedXep>\n        <xmpp:xep rdf:resource=\"https://xmpp.org/extensions/xep-0393.html\" />\n\t<xmpp:version>0.1.4</xmpp:version>\n        <xmpp:status>complete</xmpp:status>\n        <xmpp:since>0.9.3</xmpp:since>\n      </xmpp:SupportedXep>\n    </implements>\n    <implements>\n      <xmpp:SupportedXep>\n        <xmpp:xep rdf:resource=\"https://xmpp.org/extensions/xep-0401.html\" />\n\t<xmpp:version>0.3.0</xmpp:version>\n        <xmpp:status>complete</xmpp:status>\n        <xmpp:note>Requesting invitations and allowing onboarding using an invitation</xmpp:note>\n        <xmpp:since>0.9.9</xmpp:since>\n      </xmpp:SupportedXep>\n    </implements>\n    <implements>\n      <xmpp:SupportedXep>\n        <xmpp:xep rdf:resource=\"https://xmpp.org/extensions/xep-0410.html\" />\n\t<xmpp:version>1.0.1</xmpp:version>\n        <xmpp:status>complete</xmpp:status>\n        <xmpp:note>Automatic pinging of MUCs every 15 minutes</xmpp:note>\n        <xmpp:since>0.9.0</xmpp:since>\n      </xmpp:SupportedXep>\n    </implements>\n  </Project>\n</rdf:RDF>\n"
  },
  {
    "path": "bruno/res/drawable/ic_action_contacts_all.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:tint=\"?attr/colorControlNormal\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"6.34992\"\n    android:viewportHeight=\"6.34992\">\n  <path\n      android:pathData=\"M3.17238,0.59066C2.86797,0.59066 2.62099,0.81739 2.621,1.09657C2.62099,1.34184 2.81169,1.54557 3.06437,1.59162C3.06629,1.75423 3.21016,2.12321 3.35169,2.32593A0.71804,0.7648 89.99998,0 1,3.50155 2.25927C3.51293,2.2282 3.52978,2.201 3.55736,2.18744C3.50543,2.14403 3.36513,2.00241 3.33929,1.57354C3.33153,1.44747 3.23876,1.34296 3.1145,1.32032C2.97847,1.29553 2.89488,1.19801 2.89488,1.09553C2.89488,0.97864 3.00377,0.86558 3.17289,0.86558C3.25777,0.86558 3.32948,0.89732 3.37805,0.94154C3.35687,0.92226 3.36027,0.92727 3.38838,0.95756C3.47035,1.04582 3.60027,1.07034 3.70877,1.01802C3.72594,1.0098 3.73915,1.00309 3.75114,0.99838C3.75183,0.99839 3.75252,0.99839 3.75321,0.99838C3.85848,0.95595 3.98281,0.92915 4.11391,0.92397C4.27687,0.91809 4.44944,0.94547 4.61826,1.01079C4.63276,1.01642 4.66202,1.0305 4.70663,1.05161C4.74315,1.06888 4.78302,1.07788 4.82342,1.07796L4.82548,1.07796C4.9095,1.07798 4.9889,1.03952 5.04097,0.97358C5.05748,0.95275 5.06553,0.94383 5.06578,0.94361C5.11503,0.89844 5.18589,0.86764 5.26938,0.86764C5.43632,0.86764 5.54387,0.98153 5.54533,1.0976C5.54528,1.09785 5.54533,1.1012 5.54533,1.10122C5.54531,1.10294 5.54531,1.10466 5.54533,1.10639C5.54533,1.10642 5.54516,1.11134 5.54533,1.1131C5.54406,1.21286 5.46707,1.30724 5.33501,1.33428C5.21573,1.3581 5.12636,1.45757 5.11539,1.5787C4.92825,2.09963 4.85778,2.27775 4.90662,2.52179C4.93255,2.6514 5.0682,2.72184 5.19703,2.77293C5.3826,2.88172 5.48848,2.99866 5.48848,3.08402C5.48848,3.15383 5.47837,3.16429 5.47298,3.17083C5.4676,3.17739 5.44707,3.19706 5.37531,3.21683C5.26353,3.24761 5.09846,3.25191 4.81205,3.2561C4.55857,3.24377 4.48044,3.39029 4.34903,3.54083C4.37191,3.54085 4.5961,3.5398 4.6193,3.5398C5.45857,3.5398 5.76237,3.5347 5.76237,3.08454C5.76237,2.81577 5.52737,2.57874 5.15414,2.43032C5.2814,2.1517 5.36801,1.85219 5.38978,1.60402C5.63622,1.55357 5.82076,1.35276 5.82076,1.11155C5.82076,1.10974 5.82027,1.10716 5.82024,1.10535C5.82027,1.10354 5.82076,1.10045 5.82076,1.09864C5.82076,0.81945 5.57378,0.59325 5.26938,0.59325C5.11718,0.59325 4.97949,0.64958 4.87974,0.74104C4.85923,0.75988 4.84154,0.78149 4.82445,0.80305C4.78883,0.7862 4.75308,0.76903 4.71697,0.75499C4.51278,0.676 4.30225,0.64236 4.10254,0.64957C3.94206,0.65591 3.78849,0.68712 3.65089,0.74259C3.63007,0.75074 3.60998,0.76089 3.58992,0.77049C3.58033,0.76017 3.57246,0.74848 3.56201,0.73897C3.46227,0.64812 3.32458,0.59118 3.17238,0.59118L3.17238,0.59066z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"0\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"M4.28237,1.82675C3.87192,1.81917 3.54661,2.0297 3.47468,2.26754A0.71804,0.7648 89.99998,0 1,3.66846 2.22362C3.76692,2.10176 3.98934,1.97648 4.27255,1.97919C4.59594,2.03155 4.77344,2.12341 4.83892,2.19364C4.90551,2.26512 4.90078,2.30241 4.85804,2.38226C4.8153,2.46207 4.70878,2.55963 4.57382,2.62514C4.53838,2.64234 4.5013,2.65713 4.46324,2.66958A0.71804,0.7648 89.99998,0 1,4.50716 2.81375C5.06013,2.63144 5.43209,2.005 4.28237,1.82675z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"4.96668625\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m1.71977,3.17497 l-0.59531,0.52916c-0.32878,0 -0.59531,-0.23691 -0.5953,-0.52916 -0,-0.29224 0.26653,-0.52916 0.5953,-0.52916 0.32878,0 0.59531,0.23691 0.59531,0.52916z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"0\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m4.14098,3.15036c0,0.30584 -0.27548,0.55377 -0.6153,0.55377l-0.6153,-0.55377c-0,-0.30583 0.27548,-0.55377 0.6153,-0.55377 0.33982,0 0.6153,0.24794 0.6153,0.55377z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"0\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m2.19227,2.66518c-0.5765,0.0202 -1.07273,0.33248 -1.16064,0.84227 -0.10804,0.62645 0.72965,2.02741 1.38294,2.03256 0.76937,0.00634 1.52429,-1.94681 1.11459,-2.34699 -0.39166,-0.38256 -0.8885,-0.54355 -1.33689,-0.52784zM2.91895,3.34094c0.14335,0.00014 0.25949,0.125 0.2595,0.27896 0,0.15398 -0.11614,0.27886 -0.2595,0.27899 -0.14353,0.00012 -0.25994,-0.12481 -0.25994,-0.27899 0.00001,-0.15415 0.11642,-0.27907 0.25994,-0.27896zM1.76804,3.38924c0.14335,0.00014 0.25949,0.125 0.2595,0.27896 0,0.15398 -0.11614,0.27886 -0.2595,0.27899 -0.14353,0.00011 -0.25994,-0.12482 -0.25994,-0.27899 0.00001,-0.15415 0.11642,-0.27907 0.25994,-0.27896zM2.41545,4.02514c1.60857,0.2494 0.61214,1.2667 -0.18112,1.18099 -1.29234,-0.25665 -0.73919,-1.19802 0.18112,-1.18099z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"1.65870702\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m3.30559,4.57998c0.00019,0.01612 -0.00576,0.03026 -0.00736,0.04692 0.0456,0.08107 -0.19453,0.69698 -1.0639,0.57922 -0.5026,-0.06803 -0.83435,-0.45885 -0.8551,-0.6164 -0.44387,0.16043 -0.73553,0.42706 -0.73553,0.72977 -0,0.49068 0.71269,0.50129 1.65484,0.50129 0.94214,0 1.75713,-0.01069 1.75713,-0.50129 0,-0.30876 -0.29118,-0.58027 -0.75009,-0.73951z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"0.57111174\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m2.35449,4.76243c-0.08858,0.00181 -0.2739,-0.29963 -0.23168,-0.3775 0.04222,-0.07781 0.39644,-0.08741 0.44278,-0.01187 0.04634,0.07555 -0.12254,0.38703 -0.21109,0.3894z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"0.04823632\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m2.19227,2.66518c-0.5765,0.0202 -1.07273,0.33248 -1.16064,0.84227 -0.10804,0.62645 0.72965,2.02741 1.38294,2.03256 0.76937,0.00634 1.52429,-1.94681 1.11459,-2.34699 -0.39166,-0.38256 -0.8885,-0.54355 -1.33689,-0.52784zM2.91895,3.34094c0.14335,0.00014 0.25949,0.125 0.2595,0.27896 0,0.15398 -0.11614,0.27886 -0.2595,0.27899 -0.14353,0.00012 -0.25994,-0.12481 -0.25994,-0.27899 0.00001,-0.15415 0.11642,-0.27907 0.25994,-0.27896zM1.76804,3.38924c0.14335,0.00014 0.25949,0.125 0.2595,0.27896 0,0.15398 -0.11614,0.27886 -0.2595,0.27899 -0.14353,0.00011 -0.25994,-0.12482 -0.25994,-0.27899 0.00001,-0.15415 0.11642,-0.27907 0.25994,-0.27896zM2.41545,4.02514c1.60857,0.2494 0.61214,1.2667 -0.18112,1.18099 -1.29234,-0.25665 -0.73919,-1.19802 0.18112,-1.18099z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"1.65870702\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m3.30559,4.57998c0.00019,0.01612 -0.00576,0.03026 -0.00736,0.04692 0.0456,0.08107 -0.19453,0.69698 -1.0639,0.57922 -0.5026,-0.06803 -0.83435,-0.45885 -0.8551,-0.6164 -0.44387,0.16043 -0.73553,0.42706 -0.73553,0.72977 -0,0.49068 0.71269,0.50129 1.65484,0.50129 0.94214,0 1.75713,-0.01069 1.75713,-0.50129 0,-0.30876 -0.29118,-0.58027 -0.75009,-0.73951z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"0.57111174\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m4.28157,2.46581c-0.08061,0.00181 -0.24928,-0.2727 -0.21086,-0.34357 0.03842,-0.07084 0.3608,-0.07953 0.40297,-0.01078 0.04217,0.06875 -0.11152,0.35224 -0.19211,0.35438z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"0.04389965\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m2.19227,2.66521c-0.5765,0.0202 -1.07273,0.33247 -1.16064,0.84226 -0.10804,0.62645 0.72965,2.02741 1.38294,2.03256 0.76937,0.00634 1.52429,-1.94681 1.11459,-2.34699 -0.39166,-0.38256 -0.8885,-0.54355 -1.33689,-0.52784zM2.91895,3.34097c0.14335,0.00013 0.25949,0.12499 0.2595,0.27895 0,0.15398 -0.11614,0.27886 -0.2595,0.27899 -0.14353,0.00012 -0.25994,-0.12481 -0.25994,-0.27899 0.00001,-0.15415 0.11642,-0.27907 0.25994,-0.27895zM1.76804,3.38927c0.14335,0.00014 0.25949,0.125 0.2595,0.27896 0,0.15398 -0.11614,0.27886 -0.2595,0.27899 -0.14353,0.00011 -0.25994,-0.12481 -0.25994,-0.27899 0.00001,-0.15415 0.11642,-0.27907 0.25994,-0.27896zM2.41545,4.02516c1.60857,0.2494 0.61214,1.2667 -0.18112,1.18099 -1.29234,-0.25665 -0.73919,-1.19802 0.18112,-1.18099z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"1.65870702\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m3.30559,4.57998c0.00019,0.01612 -0.00576,0.03026 -0.00736,0.04692 0.0456,0.08107 -0.19453,0.69697 -1.0639,0.57921 -0.5026,-0.06803 -0.83435,-0.45885 -0.8551,-0.6164 -0.44387,0.16043 -0.73553,0.42706 -0.73553,0.72977 -0,0.49068 0.71269,0.50129 1.65484,0.50129 0.94214,0 1.75713,-0.01069 1.75713,-0.50129 0,-0.30876 -0.29118,-0.58027 -0.75009,-0.73951z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"0.57111174\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m3.72841,1.37472c0.09966,0.0001 0.1804,0.08687 0.1804,0.19394 0,0.10704 -0.08074,0.19386 -0.1804,0.19396 -0.09978,0.00007 -0.18071,-0.08678 -0.18071,-0.19396 0.00001,-0.10717 0.08093,-0.19402 0.18071,-0.19394l0,0\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"1.15315437\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m4.75654,1.32947c0.09966,0.00009 0.1804,0.08687 0.1804,0.19393 0,0.10704 -0.08074,0.19387 -0.1804,0.19396 -0.09978,0.00007 -0.18071,-0.08678 -0.18071,-0.19396 0.00001,-0.10716 0.08093,-0.19401 0.18071,-0.19393l0,0\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"1.15315437\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m3.30559,4.57998c0.00019,0.01612 -0.00576,0.03026 -0.00736,0.04692 0.0456,0.08107 -0.19453,0.69697 -1.0639,0.57921 -0.5026,-0.06803 -0.83435,-0.45885 -0.8551,-0.6164 -0.44387,0.16043 -0.73553,0.42706 -0.73553,0.72977 -0,0.49068 0.71269,0.50129 1.65484,0.50129 0.94214,0 1.75713,-0.01069 1.75713,-0.50129 0,-0.30876 -0.29118,-0.58027 -0.75009,-0.73951z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"0.57111174\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n</vector>\n"
  },
  {
    "path": "bruno/res/drawable/ic_action_contacts_online.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:tint=\"?attr/colorControlNormal\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"6.35\"\n    android:viewportHeight=\"6.35\">\n  <path\n      android:pathData=\"m3.17246,0.57443c-0.30581,0 -0.55374,0.22935 -0.55374,0.51206 -0,0.24838 0.19137,0.45511 0.44521,0.50175 0.01401,0.21467 0.09909,0.40044 0.22777,0.65872 0.03942,0.01341 0.07263,0.01805 0.11281,0.03657 0.25367,-0.27422 0.604,-0.38663 0.90211,-0.3861 1.22707,0.19747 0.75985,0.91117 0.15568,1.06882 0.01404,0.34388 -0.23155,0.56838 -0.28882,0.59882 0.02299,0.00003 0.0443,0.00021 0.06761,0.00021 0.84313,0 1.53346,-0.0098 1.53346,-0.46554 0,-0.27217 -0.23647,-0.51202 -0.61141,-0.66232 0.12784,-0.28215 0.21505,-0.58535 0.23693,-0.83665 0.24757,-0.05106 0.43294,-0.25465 0.43294,-0.49891 0,-0.00217 -0.00036,-0.00438 -0.00038,-0.00646 0.00003,-0.00217 0.00038,-0.00434 0.00038,-0.00646 0,-0.28271 -0.24793,-0.51186 -0.55374,-0.51186 -0.1529,0 -0.29143,0.05722 -0.39163,0.14986 -0.02061,0.01905 -0.03836,0.04065 -0.05553,0.06249l-0.0002,0c-0.03578,-0.01705 -0.07146,-0.03458 -0.10774,-0.04874 -0.20513,-0.07998 -0.41662,-0.11367 -0.61726,-0.10638 -0.16122,0.00586 -0.31536,0.03809 -0.45359,0.09424 -0.02092,0.0085 -0.04102,0.01813 -0.06118,0.02772 -0.00963,-0.01046 -0.01776,-0.02204 -0.02825,-0.03176 -0.1002,-0.09264 -0.23853,-0.15006 -0.39144,-0.15006zM4.7573,1.26203c0.12828,0.00013 0.23224,0.11605 0.23225,0.25907 0,0.14302 -0.10396,0.25894 -0.23225,0.25906 -0.12845,0.0001 -0.23264,-0.11585 -0.23264,-0.25906 0.00001,-0.14319 0.1042,-0.25917 0.23264,-0.25907zM3.72737,1.30673c0.12828,0.00012 0.23224,0.11605 0.23225,0.25906 0,0.14302 -0.10396,0.25914 -0.23225,0.25927 -0.12845,0.00011 -0.23264,-0.11605 -0.23264,-0.25927 0.00001,-0.14319 0.1042,-0.25917 0.23264,-0.25906zM4.26883,2.06733c-0.08916,0.00217 -0.1777,0.02291 -0.19659,0.05905 -0.02516,0.04818 0.03995,0.1874 0.1097,0.27524 0.03086,0.02243 0.05965,0.04712 0.08651,0.07341 0.0038,0.00087 0.00762,0.00217 0.01111,0.00217 0.07925,-0.00217 0.23027,-0.29167 0.1888,-0.3618 -0.02073,-0.03505 -0.11036,-0.05041 -0.19952,-0.04793z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"0\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m1.7568,3.07279 l-0.61382,0.56747c-0.339,0 -0.61382,-0.25407 -0.61382,-0.56747 -0,-0.3134 0.27481,-0.56747 0.61382,-0.56747 0.339,0 0.61382,0.25407 0.61382,0.56747z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"0\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m4.09238,3.08985c0,0.3134 -0.27481,0.56747 -0.61382,0.56747l-0.61382,-0.56747c-0,-0.3134 0.27481,-0.56747 0.61382,-0.56747 0.339,0 0.61382,0.25407 0.61382,0.56747z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"0\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m2.17906,2.57153c-0.57191,0.02078 -1.0642,0.34235 -1.15142,0.86728 -0.10719,0.64505 0.72385,2.08762 1.37195,2.09292 0.76325,0.00629 1.51217,-2.00463 1.10573,-2.41669 -0.38855,-0.39392 -0.88144,-0.5597 -1.32626,-0.54352zM2.89996,3.26735c0.14221,0.00014 0.25742,0.12871 0.25743,0.28725 0,0.15854 -0.11522,0.28714 -0.25743,0.28727 -0.14239,0.00012 -0.25788,-0.12852 -0.25787,-0.28727 0.00001,-0.15873 0.11549,-0.28736 0.25787,-0.28725zM1.7582,3.31706c0.14221,0.00014 0.25742,0.12871 0.25743,0.28725 0,0.15854 -0.11522,0.28714 -0.25743,0.28727 -0.14239,0.00012 -0.25788,-0.12852 -0.25787,-0.28727 0.00001,-0.15873 0.11549,-0.28736 0.25787,-0.28725zM2.40047,3.97184c1.59578,0.25681 0.60727,1.30432 -0.17968,1.21607 -1.28207,-0.26428 -0.73332,-1.2336 0.17968,-1.21607z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"8.37494659\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m3.28352,4.54318c0.00018,0.01657 -0.00572,0.03115 -0.00729,0.04832 0.04524,0.08349 -0.19298,0.71768 -1.05544,0.59642 -0.4986,-0.07006 -0.82772,-0.47248 -0.8483,-0.63471 -0.44034,0.1652 -0.72969,0.43974 -0.72969,0.75144 -0,0.50526 0.70703,0.51618 1.64168,0.51618 0.93465,0 1.74316,-0.01098 1.74316,-0.51618 0,-0.31792 -0.28886,-0.59749 -0.74413,-0.76148z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"2.88358951\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m2.37029,4.61434c-0.08787,0.00203 -0.27173,-0.30853 -0.22984,-0.38872 0.04188,-0.08016 0.39329,-0.09002 0.43926,-0.01224 0.04597,0.07778 -0.12156,0.39853 -0.20942,0.40097z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"0.11974473\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m1.7568,3.07279 l-0.61382,0.56747c-0.339,0 -0.61382,-0.25407 -0.61382,-0.56747 -0,-0.3134 0.27481,-0.56747 0.61382,-0.56747 0.339,0 0.61382,0.25407 0.61382,0.56747z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"0\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m4.09238,3.08985c0,0.3134 -0.27481,0.56747 -0.61382,0.56747l-0.61382,-0.56747c-0,-0.3134 0.27481,-0.56747 0.61382,-0.56747 0.339,0 0.61382,0.25407 0.61382,0.56747z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"0\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m2.17906,2.57153c-0.57191,0.02078 -1.0642,0.34235 -1.15142,0.86728 -0.10719,0.64505 0.72385,2.08762 1.37195,2.09292 0.76325,0.00629 1.51217,-2.00463 1.10573,-2.41669 -0.38855,-0.39392 -0.88144,-0.5597 -1.32626,-0.54352zM2.89996,3.26735c0.14221,0.00014 0.25742,0.12871 0.25743,0.28725 0,0.15854 -0.11522,0.28714 -0.25743,0.28727 -0.14239,0.00012 -0.25788,-0.12852 -0.25787,-0.28727 0.00001,-0.15873 0.11549,-0.28736 0.25787,-0.28725zM1.7582,3.31706c0.14221,0.00014 0.25742,0.12871 0.25743,0.28725 0,0.15854 -0.11522,0.28714 -0.25743,0.28727 -0.14239,0.00012 -0.25788,-0.12852 -0.25787,-0.28727 0.00001,-0.15873 0.11549,-0.28736 0.25787,-0.28725zM2.40047,3.97184c1.59578,0.25681 0.60727,1.30432 -0.17968,1.21607 -1.28207,-0.26428 -0.73332,-1.2336 0.17968,-1.21607z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"8.37494659\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m3.28352,4.54318c0.00018,0.01657 -0.00572,0.03115 -0.00729,0.04832 0.04524,0.08349 -0.19298,0.71768 -1.05544,0.59642 -0.4986,-0.07006 -0.82772,-0.47248 -0.8483,-0.63471 -0.44034,0.1652 -0.72969,0.43974 -0.72969,0.75144 -0,0.50526 0.70703,0.51618 1.64168,0.51618 0.93465,0 1.74316,-0.01098 1.74316,-0.51618 0,-0.31792 -0.28886,-0.59749 -0.74413,-0.76148z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"2.88358951\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m2.37029,4.61434c-0.08787,0.00203 -0.27173,-0.30853 -0.22984,-0.38872 0.04188,-0.08016 0.39329,-0.09002 0.43926,-0.01224 0.04597,0.07778 -0.12156,0.39853 -0.20942,0.40097z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"0.11974473\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m1.7568,3.07279 l-0.61382,0.56747c-0.339,0 -0.61382,-0.25407 -0.61382,-0.56747 -0,-0.3134 0.27481,-0.56747 0.61382,-0.56747 0.339,0 0.61382,0.25407 0.61382,0.56747z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"0\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m4.09238,3.07552c0,0.3134 -0.27481,0.56747 -0.61382,0.56747l-0.61382,-0.56747c-0,-0.3134 0.27481,-0.56747 0.61382,-0.56747 0.339,0 0.61382,0.25407 0.61382,0.56747z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"0\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m2.17906,2.57153c-0.57191,0.02078 -1.0642,0.34235 -1.15142,0.86728 -0.10719,0.64505 0.72385,2.08762 1.37195,2.09292 0.76325,0.00629 1.51217,-2.00463 1.10573,-2.41669 -0.38855,-0.39392 -0.88144,-0.5597 -1.32626,-0.54352zM2.89996,3.26736c0.14221,0.00014 0.25742,0.12871 0.25743,0.28725 0,0.15854 -0.11522,0.28714 -0.25743,0.28727 -0.14239,0.00012 -0.25788,-0.12852 -0.25787,-0.28727 0.00001,-0.15873 0.11549,-0.28736 0.25787,-0.28725zM1.7582,3.31706c0.14221,0.00014 0.25742,0.12871 0.25743,0.28725 0,0.15854 -0.11522,0.28714 -0.25743,0.28727 -0.14239,0.00012 -0.25788,-0.12852 -0.25787,-0.28727 0.00001,-0.15873 0.11549,-0.28736 0.25787,-0.28725zM2.40047,3.97184c1.59578,0.25681 0.60727,1.30432 -0.17968,1.21607 -1.28207,-0.26428 -0.73332,-1.2336 0.17968,-1.21607z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"8.37494659\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m3.28352,4.54316c0.00018,0.01657 -0.00572,0.03115 -0.00729,0.04832 0.04524,0.08349 -0.19298,0.71768 -1.05544,0.59642 -0.4986,-0.07006 -0.82772,-0.47248 -0.8483,-0.63471 -0.44034,0.1652 -0.72969,0.43974 -0.72969,0.75144 -0,0.50526 0.70703,0.51618 1.64168,0.51618 0.93465,0 1.74316,-0.01098 1.74316,-0.51618 0,-0.31792 -0.28886,-0.59749 -0.74413,-0.76148z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"2.88358951\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m2.37029,4.61434c-0.08787,0.00203 -0.27173,-0.30853 -0.22984,-0.38872 0.04188,-0.08016 0.39329,-0.09002 0.43926,-0.01224 0.04597,0.07778 -0.12156,0.39853 -0.20942,0.40097z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"0.11974473\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m1.7568,3.07279 l-0.61382,0.56747c-0.339,0 -0.61382,-0.25407 -0.61382,-0.56747 -0,-0.3134 0.27481,-0.56747 0.61382,-0.56747 0.339,0 0.61382,0.25407 0.61382,0.56747z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"0\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m4.09238,3.07552c0,0.3134 -0.27481,0.56747 -0.61382,0.56747l-0.61382,-0.56747c-0,-0.3134 0.27481,-0.56747 0.61382,-0.56747 0.339,0 0.61382,0.25407 0.61382,0.56747z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"0\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m2.17906,2.57153c-0.57191,0.02078 -1.0642,0.34235 -1.15142,0.86728 -0.10719,0.64505 0.72385,2.08762 1.37195,2.09292 0.76325,0.00629 1.51217,-2.00463 1.10573,-2.41669 -0.38855,-0.39392 -0.88144,-0.5597 -1.32626,-0.54352zM2.89996,3.26736c0.14221,0.00014 0.25742,0.12871 0.25743,0.28725 0,0.15854 -0.11522,0.28714 -0.25743,0.28727 -0.14239,0.00012 -0.25788,-0.12852 -0.25787,-0.28727 0.00001,-0.15873 0.11549,-0.28736 0.25787,-0.28725zM1.7582,3.31706c0.14221,0.00014 0.25742,0.12871 0.25743,0.28725 0,0.15854 -0.11522,0.28714 -0.25743,0.28727 -0.14239,0.00012 -0.25788,-0.12852 -0.25787,-0.28727 0.00001,-0.15873 0.11549,-0.28736 0.25787,-0.28725zM2.40047,3.97184c1.59578,0.25681 0.60727,1.30432 -0.17968,1.21607 -1.28207,-0.26428 -0.73332,-1.2336 0.17968,-1.21607z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"8.37494659\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m3.28352,4.54316c0.00018,0.01657 -0.00572,0.03115 -0.00729,0.04832 0.04524,0.08349 -0.19298,0.71768 -1.05544,0.59642 -0.4986,-0.07006 -0.82772,-0.47248 -0.8483,-0.63471 -0.44034,0.1652 -0.72969,0.43974 -0.72969,0.75144 -0,0.50526 0.70703,0.51618 1.64168,0.51618 0.93465,0 1.74316,-0.01098 1.74316,-0.51618 0,-0.31792 -0.28886,-0.59749 -0.74413,-0.76148z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"2.88358951\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m2.37029,4.61434c-0.08787,0.00203 -0.27173,-0.30853 -0.22984,-0.38872 0.04188,-0.08016 0.39329,-0.09002 0.43926,-0.01224 0.04597,0.07778 -0.12156,0.39853 -0.20942,0.40097z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"0.11974473\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n</vector>\n"
  },
  {
    "path": "bruno/res/drawable/ic_action_person_add.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:tint=\"?attr/colorControlNormal\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"6.35\"\n    android:viewportHeight=\"6.35\">\n  <path\n      android:pathData=\"m3.50099,1.94667 l-0.71003,0.63933c-0.39214,0 -0.71003,-0.28624 -0.71003,-0.63933 -0,-0.35308 0.31789,-0.63932 0.71003,-0.63932 0.39214,0 0.71003,0.28624 0.71003,0.63932z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"0\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m6.20268,1.96589c0,0.35308 -0.31789,0.63932 -0.71003,0.63932l-0.71003,-0.63932c-0,-0.35308 0.31789,-0.63932 0.71003,-0.63932 0.39214,0 0.71003,0.28624 0.71003,0.63932z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"0\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m3.98944,1.38193c-0.66156,0.02341 -1.23101,0.3857 -1.3319,0.9771 -0.12399,0.72673 0.83731,2.35197 1.587,2.35794 0.88289,0.00709 1.7492,-2.25847 1.27905,-2.7227 -0.44945,-0.4438 -1.01961,-0.63057 -1.53415,-0.61234zM4.82334,2.16587c0.1645,0.00016 0.29778,0.14501 0.29779,0.32362 0,0.17862 -0.13328,0.32349 -0.29779,0.32365 -0.16471,0.00013 -0.2983,-0.14479 -0.29829,-0.32365 0.00001,-0.17882 0.13359,-0.32375 0.29829,-0.32362zM3.50262,2.22186c0.1645,0.00016 0.29778,0.14501 0.29779,0.32362 0,0.17862 -0.13328,0.32349 -0.29779,0.32365 -0.16471,0.00013 -0.2983,-0.14479 -0.29829,-0.32365 0.00001,-0.17883 0.13359,-0.32375 0.29829,-0.32362zM4.24555,2.95956c1.84592,0.28932 0.70246,1.46948 -0.20784,1.37005 -1.48303,-0.29774 -0.84826,-1.38981 0.20784,-1.37005z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"3.56626511\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m5.26703,3.60324c0.00021,0.01867 -0.00661,0.03509 -0.00844,0.05444 0.05233,0.09406 -0.22323,0.80856 -1.22088,0.67194 -0.57676,-0.07893 -0.95747,-0.5323 -0.98127,-0.71508 -0.50936,0.18612 -0.84406,0.49543 -0.84406,0.84659 -0,0.56923 0.81785,0.58154 1.89902,0.58154 1.08116,0 2.0164,-0.01237 2.0164,-0.58154 0,-0.35818 -0.33414,-0.67315 -0.86077,-0.8579z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"1.22790575\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m4.21065,3.68341c-0.10165,0.00228 -0.31432,-0.3476 -0.26587,-0.43794 0.04845,-0.09031 0.45494,-0.10142 0.50811,-0.0138 0.05318,0.08763 -0.14062,0.44899 -0.24224,0.45174z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"0.05099035\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m3.50099,1.94667 l-0.71003,0.63933c-0.39214,0 -0.71003,-0.28624 -0.71003,-0.63933 -0,-0.35308 0.31789,-0.63932 0.71003,-0.63932 0.39214,0 0.71003,0.28624 0.71003,0.63932z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"0\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m6.20268,1.96589c0,0.35308 -0.31789,0.63932 -0.71003,0.63932l-0.71003,-0.63932c-0,-0.35308 0.31789,-0.63932 0.71003,-0.63932 0.39214,0 0.71003,0.28624 0.71003,0.63932z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"0\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m3.98944,1.38193c-0.66156,0.02341 -1.23101,0.3857 -1.3319,0.9771 -0.12399,0.72673 0.83731,2.35197 1.587,2.35794 0.88289,0.00709 1.7492,-2.25847 1.27905,-2.7227 -0.44945,-0.4438 -1.01961,-0.63057 -1.53415,-0.61234zM4.82334,2.16587c0.1645,0.00016 0.29778,0.14501 0.29779,0.32362 0,0.17862 -0.13328,0.32349 -0.29779,0.32365 -0.16471,0.00013 -0.2983,-0.14479 -0.29829,-0.32365 0.00001,-0.17882 0.13359,-0.32375 0.29829,-0.32362zM3.50262,2.22186c0.1645,0.00016 0.29778,0.14501 0.29779,0.32362 0,0.17862 -0.13328,0.32349 -0.29779,0.32365 -0.16471,0.00013 -0.2983,-0.14479 -0.29829,-0.32365 0.00001,-0.17883 0.13359,-0.32375 0.29829,-0.32362zM4.24555,2.95956c1.84592,0.28932 0.70246,1.46948 -0.20784,1.37005 -1.48303,-0.29774 -0.84826,-1.38981 0.20784,-1.37005z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"3.56626511\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m5.26703,3.60324c0.00021,0.01867 -0.00661,0.03509 -0.00844,0.05444 0.05233,0.09406 -0.22323,0.80856 -1.22088,0.67194 -0.57676,-0.07893 -0.95747,-0.5323 -0.98127,-0.71508 -0.50936,0.18612 -0.84406,0.49543 -0.84406,0.84659 -0,0.56923 0.81785,0.58154 1.89902,0.58154 1.08116,0 2.0164,-0.01237 2.0164,-0.58154 0,-0.35818 -0.33414,-0.67315 -0.86077,-0.8579z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"1.22790575\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m4.21065,3.68341c-0.10165,0.00228 -0.31432,-0.3476 -0.26587,-0.43794 0.04845,-0.09031 0.45494,-0.10142 0.50811,-0.0138 0.05318,0.08763 -0.14062,0.44899 -0.24224,0.45174z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"0.05099035\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m3.50099,1.94667 l-0.71003,0.63933c-0.39214,0 -0.71003,-0.28624 -0.71003,-0.63933 -0,-0.35308 0.31789,-0.63932 0.71003,-0.63932 0.39214,0 0.71003,0.28624 0.71003,0.63932z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"0\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m6.20268,1.94974c0,0.35308 -0.31789,0.63932 -0.71003,0.63932l-0.71003,-0.63932c-0,-0.35308 0.31789,-0.63932 0.71003,-0.63932 0.39214,0 0.71003,0.28624 0.71003,0.63932z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"0\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m3.98944,1.38194c-0.66156,0.02341 -1.23101,0.3857 -1.3319,0.9771 -0.12399,0.72673 0.83731,2.35197 1.587,2.35794 0.88289,0.00709 1.7492,-2.25847 1.27905,-2.7227 -0.44945,-0.4438 -1.01961,-0.63057 -1.53415,-0.61234zM4.82334,2.16587c0.1645,0.00016 0.29778,0.14501 0.29779,0.32362 0,0.17862 -0.13328,0.32349 -0.29779,0.32365 -0.16471,0.00013 -0.2983,-0.14479 -0.29829,-0.32365 0.00001,-0.17882 0.13359,-0.32375 0.29829,-0.32362zM3.50262,2.22187c0.1645,0.00016 0.29778,0.14501 0.29779,0.32362 0,0.17862 -0.13328,0.32349 -0.29779,0.32365 -0.16471,0.00013 -0.2983,-0.14479 -0.29829,-0.32365 0.00001,-0.17883 0.13359,-0.32375 0.29829,-0.32362zM4.24555,2.95956c1.84592,0.28932 0.70246,1.46948 -0.20784,1.37005 -1.48303,-0.29774 -0.84826,-1.38981 0.20784,-1.37005z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"3.56626511\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m5.26703,3.60323c0.00021,0.01867 -0.00661,0.03509 -0.00844,0.05444 0.05233,0.09406 -0.22323,0.80856 -1.22088,0.67194 -0.57676,-0.07893 -0.95747,-0.5323 -0.98127,-0.71508 -0.50936,0.18612 -0.84406,0.49543 -0.84406,0.84659 -0,0.56923 0.81785,0.58154 1.89902,0.58154 1.08116,0 2.0164,-0.01237 2.0164,-0.58154 0,-0.35818 -0.33414,-0.67315 -0.86077,-0.8579z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"1.22790575\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m4.21065,3.68341c-0.10165,0.00228 -0.31432,-0.3476 -0.26587,-0.43794 0.04845,-0.09031 0.45494,-0.10142 0.50811,-0.0138 0.05318,0.08763 -0.14062,0.44899 -0.24224,0.45174z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"0.05099035\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m3.50099,1.94667 l-0.71003,0.63933c-0.39214,0 -0.71003,-0.28624 -0.71003,-0.63933 -0,-0.35308 0.31789,-0.63932 0.71003,-0.63932 0.39214,0 0.71003,0.28624 0.71003,0.63932z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"0\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m6.20268,1.94974c0,0.35308 -0.31789,0.63932 -0.71003,0.63932l-0.71003,-0.63932c-0,-0.35308 0.31789,-0.63932 0.71003,-0.63932 0.39214,0 0.71003,0.28624 0.71003,0.63932z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"0\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m3.98944,1.38194c-0.66156,0.02341 -1.23101,0.3857 -1.3319,0.9771 -0.12399,0.72673 0.83731,2.35197 1.587,2.35794 0.88289,0.00709 1.7492,-2.25847 1.27905,-2.7227 -0.44945,-0.4438 -1.01961,-0.63057 -1.53415,-0.61234zM4.82334,2.16587c0.1645,0.00016 0.29778,0.14501 0.29779,0.32362 0,0.17862 -0.13328,0.32349 -0.29779,0.32365 -0.16471,0.00013 -0.2983,-0.14479 -0.29829,-0.32365 0.00001,-0.17882 0.13359,-0.32375 0.29829,-0.32362zM3.50262,2.22187c0.1645,0.00016 0.29778,0.14501 0.29779,0.32362 0,0.17862 -0.13328,0.32349 -0.29779,0.32365 -0.16471,0.00013 -0.2983,-0.14479 -0.29829,-0.32365 0.00001,-0.17883 0.13359,-0.32375 0.29829,-0.32362zM4.24555,2.95956c1.84592,0.28932 0.70246,1.46948 -0.20784,1.37005 -1.48303,-0.29774 -0.84826,-1.38981 0.20784,-1.37005z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"3.56626511\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m5.26703,3.60323c0.00021,0.01867 -0.00661,0.03509 -0.00844,0.05444 0.05233,0.09406 -0.22323,0.80856 -1.22088,0.67194 -0.57676,-0.07893 -0.95747,-0.5323 -0.98127,-0.71508 -0.50936,0.18612 -0.84406,0.49543 -0.84406,0.84659 -0,0.56923 0.81785,0.58154 1.89902,0.58154 1.08116,0 2.0164,-0.01237 2.0164,-0.58154 0,-0.35818 -0.33414,-0.67315 -0.86077,-0.8579z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"1.22790575\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m4.21065,3.68341c-0.10165,0.00228 -0.31432,-0.3476 -0.26587,-0.43794 0.04845,-0.09031 0.45494,-0.10142 0.50811,-0.0138 0.05318,0.08763 -0.14062,0.44899 -0.24224,0.45174z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"0.05099035\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n  <path\n      android:pathData=\"m1.05833,2.11667v0.79375H0.26458V3.43958H1.05833v0.79375h0.52917v-0.79375h0.79375V2.91042h-0.79375v-0.79375z\"\n      android:strokeAlpha=\"1\"\n      android:strokeLineJoin=\"round\"\n      android:strokeWidth=\"0.07264468\"\n      android:fillColor=\"#000000\"\n      android:strokeColor=\"#00000000\"\n      android:fillType=\"nonZero\"\n      android:fillAlpha=\"1\"\n      android:strokeLineCap=\"round\"/>\n</vector>\n"
  },
  {
    "path": "bruno/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources\n  xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <color name=\"light_pink\">#ffc7ef</color>\n    <color name=\"dark_pink\">#330626</color>\n    <color name=\"bright_pink\">#ca1f7b</color>\n\n    <color name=\"dark_green\">#063306</color>\n    <color name=\"green_error\">#d4d600</color>\n\n    <color name=\"light_ice\">#bfe8ff</color>\n    <color name=\"ice_error\">#df94a0</color>\n</resources>\n"
  },
  {
    "path": "bruno/res/values/prefArrays.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\" tools:ignore=\"MissingTranslation\">\n\n    <string-array name=\"pref_theme_entries\">\n\t<item>@string/pref_theme_dark</item>\n\t<item>@string/pref_theme_light</item>\n\t<item>@string/pref_theme_pine</item>\n\t<item>@string/pref_theme_ice</item>\n    </string-array>\n    <string-array name=\"pref_theme_values\">\n        <item>dark</item>\n        <item>light</item>\n        <item>pine</item>\n        <item>ice</item>\n    </string-array>\n</resources>\n"
  },
  {
    "path": "bruno/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"app_name\">@string/app_name_bruno</string>\n\t<string name=\"conn_title\">@string/conn_title_bruno</string>\n\t<string name=\"Menu_about\">@string/Menu_about_bruno</string>\n</resources>\n\n"
  },
  {
    "path": "bruno/res/values/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\" tools:targetApi=\"17\">\n\n\t<style name=\"StyleErrorView\">\n\t\t<item name=\"android:textSize\">18sp</item>\n\t\t<item name=\"android:padding\">5sp</item>\n\t\t<item name=\"android:textColor\">#000</item>\n\t\t<item name=\"android:background\">@color/bright_pink</item>\n\t\t<item name=\"android:shadowColor\">#44000000</item>\n\t\t<item name=\"android:shadowRadius\">3.0</item>\n\t</style>\n\n\t<style name=\"StyleErrorView.Light.Pink\">\n\t\t<item name=\"android:background\">#f48</item>\n\t</style>\n\t<style name=\"StyleErrorView.Light.Green\">\n\t\t<item name=\"android:background\">@color/green_error</item>\n\t</style>\n\t<style name=\"StyleErrorView.Light.Ice\">\n\t\t<item name=\"android:background\">@color/ice_error</item>\n\t</style>\n</resources>\n"
  },
  {
    "path": "bruno/res/values/themes.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\" tools:targetApi=\"11\">\n\n\t<style name=\"YaximDialogLight\" parent=\"Base.Theme.AppCompat.Light.Dialog.Alert\">\n\t\t<item name=\"colorAccent\">#991272</item> <!-- more intense dark_pink -->\n\t\t<item name=\"android:textColorPrimary\">#000000</item>\n\t\t<item name=\"android:background\">#ffe2ff</item> <!-- very light light_pink -->\n\t</style>\n\t<style name=\"YaximLightTheme\" parent=\"Theme.AppCompat.Light\">\n\t\t<item name=\"android:windowOptOutEdgeToEdgeEnforcement\">true</item>\n\t\t<item name=\"android:windowBackground\">@color/light_pink</item>\n\t\t<item name=\"ErrorView\">@style/StyleErrorView.Light.Pink</item>\n\t\t<item name=\"colorPrimary\">#ffabe7</item> <!-- +50% saturated light_pink -->\n\t\t<item name=\"colorPrimaryDark\">#e69ad0</item> <!-- 90% valued colorPrimary -->\n\t\t<item name=\"colorAccent\">#991272</item> <!-- double-valued dark_pink -->\n\t\t<item name=\"alertDialogTheme\">@style/YaximDialogLight</item>\n\n\t\t<item name=\"MainGroup\">@style/RosterGroupName.Light</item>\n\t\t<item name=\"MainChild\">@style/RosterGroupItem.Light</item>\n\t\t<item name=\"ChatMsgHeaderMeColor\">#ff6d6dcc</item>\n\t\t<item name=\"ChatMsgHeaderYouColor\">#ffcc5050</item>\n\t\t<item name=\"ChatNewMessageColor\">#ffb0b0b0</item>\n\t\t<item name=\"ChatStoredMessageColor\">#60b0b0b0</item>\n\t\t<item name=\"ChatText\">@style/ChatText.Light</item>\n\t\t<item name=\"fontFamily\">@font/comfortaa_regular</item>\n\t</style>\n\n\t<style name=\"YaximDialogDark\" parent=\"Base.Theme.AppCompat.Dialog.Alert\">\n\t\t<item name=\"colorAccent\">@color/light_pink</item>\n\t\t<item name=\"android:textColorPrimary\">#ffffff</item>\n\t\t<item name=\"android:background\">#3a2634</item>\n\t</style>\n\n\t<style name=\"YaximDarkTheme\" parent=\"Theme.AppCompat\">\n\t\t<item name=\"android:windowOptOutEdgeToEdgeEnforcement\">true</item>\n\t\t<item name=\"android:windowBackground\">@color/dark_pink</item>\n\t\t<item name=\"colorPrimary\">#800f5f</item> <!-- 50% saturated dark_pink -->\n\t\t<item name=\"colorPrimaryDark\">#4f0035</item> <!-- 40% saturated dark_pink -->\n\t\t<item name=\"colorAccent\">@color/light_pink</item>\n\t\t<item name=\"alertDialogTheme\">@style/YaximDialogDark</item>\n\n\t\t<item name=\"MainGroup\">@style/RosterGroupName.Dark</item>\n\t\t<item name=\"MainChild\">@style/RosterGroupItem</item>\n\t\t<item name=\"ChatMsgHeaderMeColor\">#ff8888ff</item>\n\t\t<item name=\"ChatMsgHeaderYouColor\">#ffff8888</item>\n\t\t<item name=\"ChatNewMessageColor\">#ff404040</item>\n\t\t<item name=\"ChatStoredMessageColor\">#60404040</item>\n\t\t<item name=\"ErrorView\">@style/StyleErrorView</item>\n\t\t<item name=\"ChatText\">@style/ChatText</item>\n\t\t<item name=\"fontFamily\">@font/comfortaa_regular</item>\n\t</style>\n\n\t<style name=\"YaximDialogDark.Pine\">\n\t\t<item name=\"colorAccent\">#c7ffc7</item>\n\t\t<item name=\"android:background\">#233a23</item> <!-- mix of dark_green and grey -->\n\t</style>\n\n\t<style name=\"YaximPineTheme\" parent=\"YaximDarkTheme\">\n\t\t<item name=\"android:windowBackground\">@color/dark_green</item>\n\t\t<item name=\"ErrorView\">@style/StyleErrorView.Light.Green</item>\n\t\t<item name=\"colorPrimary\">#031903</item> <!-- 50% saturated dark_pink -->\n\t\t<item name=\"colorPrimaryDark\">#021002</item> <!-- 40% saturated dark_pink -->\n\t\t<item name=\"colorAccent\">#c7ffc7</item>\n\t\t<item name=\"alertDialogTheme\">@style/YaximDialogDark.Pine</item>\n\t</style>\n\n\t<style name=\"YaximDialogLight.Ice\">\n\t\t<item name=\"colorAccent\">#008fcc</item>\n\t\t<item name=\"android:background\">#def3ff</item> <!-- mix of ice and white -->\n\t</style>\n\t<style name=\"YaximIceTheme\" parent=\"YaximLightTheme\">\n\t\t<item name=\"android:windowBackground\">@color/light_ice</item>\n\t\t<item name=\"ErrorView\">@style/StyleErrorView.Light.Ice</item>\n\t\t<item name=\"colorPrimary\">#4dbfff</item> <!-- +50% saturated light_ice -->\n\t\t<item name=\"colorPrimaryDark\">#008fcc</item> <!-- colorPrimary adapted dark -->\n\t\t<item name=\"colorAccent\">#007bbf</item> <!-- darker, saturated ice -->\n\t\t<item name=\"alertDialogTheme\">@style/YaximDialogLight.Ice</item>\n\t</style>\n</resources>\n"
  },
  {
    "path": "bruno/src/org/yaxim/androidclient/FlavorConfig.java",
    "content": "package org.yaxim.androidclient;\n\npublic class FlavorConfig {\n\tpublic static int getTheme(String theme) {\n\t\tswitch (theme) {\n\t\tcase \"ice\":\n\t\t\treturn R.style.YaximIceTheme;\n\t\tcase \"pine\":\n\t\t\treturn R.style.YaximPineTheme;\n\t\tcase \"light\":\n\t\t\treturn R.style.YaximLightTheme;\n\t\tdefault:\n\t\t\treturn R.style.YaximDarkTheme;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "bruno.rdf.sh",
    "content": "export NAME=\"Bruno\"\nexport SHORTDESC=\"Bruno the Jabber™ Bear\"\nexport DESCRIPTION=\"Bruno is an Android XMPP/Jabber client with a clean user interface and open source (GPLv3).\"\nexport HOMEPAGE=\"https://yaxim.org/bruno/\"\nexport LOGO=\"https://yaxim.org/images/bruno-64.png\"\nexport SCREENSHOT=\"https://yaxim.org/bruno/screenshots/bruno-roster-dark.png\"\n"
  },
  {
    "path": "build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\nbuildscript {\n\trepositories {\n\t\tmavenCentral()\n\t\tgoogle()\n\t}\n\tdependencies {\n\t\tclasspath 'com.android.tools.build:gradle:8.13.2'\n\t}\n}\n\nplugins {\n\t// obtain revision from git\n\tid 'org.ajoberstar.grgit' version '5.3.2'\n\tid 'com.github.triplet.play' version \"3.13.0\"\n}\n\nallprojects {\n\trepositories {\n\t\tmavenLocal()\n\t\tgoogle()\n\t\tmavenCentral()\n\t}\n}\n\n/////////////// yaxim specific build rules ///////////////\napply plugin: 'com.android.application'\napply plugin: 'com.github.triplet.play'\n\n// gradle rule to download sources for AS (because AS can't on its own)\n// run as: `gradle cleanIdea idea`\napply plugin: 'idea'\nidea {\n    module {\n        downloadJavadoc = true\n        downloadSources = true\n    }\n}\n\next {\n\tbuild_date = new Date().format('yyyy-MM-dd')\n\tbuild_revision = grgit.describe(tags: true)\n\tbuild_version = \"${build_revision} ${build_date}\"\n}\n\ndef versionCodeDate() {\n\tif (project.hasProperty(\"RELEASE_MINOR\")) {\n\t\treturn new Date().format(\"yyyyMMdd\" + RELEASE_MINOR).toInteger()\n\t} else {\n\t\treturn new Date().format(\"yyyyMMdd00\").toInteger()\n\t}\n}\n\nandroid {\n\tnamespace \"org.yaxim.androidclient\"\n\tcompileSdk 35\n\tuseLibrary 'org.apache.http.legacy'\n\tflavorDimensions (\"style\", \"distribution\")\n\tbuildFeatures {\n\t\taidl = true\n\t\tbuildConfig = true\n\t}\n\tdefaultConfig {\n\t\tapplicationId \"org.yaxim\"\n\t\tminSdk 14\n\t\t//noinspection ExpiredTargetSdkVersion\n\t\ttargetSdk 35\n\t\tversionName \"$build_revision\"\n\t\tversionCode versionCodeDate()\n\t\tvectorDrawables.useSupportLibrary = true\n\t\tresValue \"string\", \"build_revision\", \"$build_revision\"\n\t\tresValue \"string\", \"build_date\", \"$build_date\"\n\t\tresValue \"string\", \"build_version\", \"$build_version\"\n\t}\n\n\tif (project.hasProperty(\"RELEASE_KEY_ALIAS\")) {\n\t\tsigningConfigs {\n\t\t\trelease {\n\t\t\t\tstoreFile file(RELEASE_STORE_FILE)\n\t\t\t\tstorePassword RELEASE_STORE_PASSWORD\n\t\t\t\tkeyAlias RELEASE_KEY_ALIAS\n\t\t\t\tkeyPassword RELEASE_KEY_PASSWORD\n\t\t\t}\n\t\t}\n\t\tbuildTypes {\n\t\t\trelease {\n\t\t\t\tsigningConfig signingConfigs.release\n\t\t\t}\n\t\t}\n\t}\n\n\tbuildTypes {\n\t\tdebug {\n\t\t\tminifyEnabled true\n\t\t\tproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard.cfg'\n\t\t}\n\t\trelease {\n\t\t\tminifyEnabled true\n\t\t\tproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard.cfg'\n\t\t}\n\t}\n\tproductFlavors {\n\t\tyaxim {\n\t\t\tdimension \"style\"\n\t\t\tapplicationIdSuffix \"androidclient\"\n\t\t}\n\t\tbruno {\n\t\t\tdimension \"style\"\n\t\t\tapplicationIdSuffix \"bruno\"\n\t\t}\n\t\tplay {\n\t\t\tdimension \"distribution\"\n\t\t}\n\t\tfree {\n\t\t\tdimension \"distribution\"\n\t\t}\n\n\t\tapplicationVariants.all { variant ->\n\t\t\tvariant.resValue \"string\", \"application_id\", \"${variant.properties.applicationId}\"\n\t\t}\n\t}\n\n\tsourceSets {\n\t\tmain {\n\t\t\tmanifest.srcFile 'AndroidManifest.xml'\n\t\t\tjava.srcDirs = ['src']\n\t\t\taidl.srcDirs = ['src']\n\t\t\trenderscript.srcDirs = ['src']\n\t\t\tres.srcDirs = ['res']\n\t\t\tassets.srcDirs = ['assets']\n\t\t}\n\t\tyaxim {\n\t\t\tjava.srcDirs = ['yaxim/src']\n\t\t\tres.srcDirs = ['yaxim/res']\n\t\t\tassets.srcDirs = ['yaxim/assets']\n\t\t}\n\t\tbruno {\n\t\t\tjava.srcDirs = ['bruno/src']\n\t\t\tres.srcDirs = ['bruno/res']\n\t\t\tassets.srcDirs = ['bruno/assets']\n\t\t}\n\t\tplay {\n\t\t\tmanifest.srcFile 'play/AndroidManifest.xml'\n\t\t\tjava.srcDirs = ['play/src']\n\t\t\tres.srcDirs = ['play/res']\n\t\t\tassets.srcDirs = ['play/assets']\n\t\t}\n\t\tfree {\n\t\t\tjava.srcDirs = ['free/src']\n\t\t}\n\t}\n\tlintOptions {\n\t\tdisable 'MissingTranslation'\n\t}\n}\nplay {\n\tserviceAccountCredentials = file('play-publish-credentials.json')\n\ttrack = 'beta'\n}\n\ndependencies {\n\tdef SMACK_VERSION = \"4.3.5-SNAPSHOT\"\n\t// Google Push via FCM\n\tplayImplementation('com.google.firebase:firebase-messaging:17.3.4') {\n\t\texclude group: 'com.google.firebase', module: 'firebase-core'\n\t\texclude group: 'com.google.firebase', module: 'firebase-analytics'\n\t\texclude group: 'com.google.firebase', module: 'firebase-measurement-connector'\n\t}\n\timplementation 'com.android.support:appcompat-v7:28.0.0'\n\t// implicit compile 'com.android.support:support-v4:25.+'\n\timplementation project('MemorizingTrustManager')\n\tapi fileTree(include: ['*.jar'], dir: 'libs')\n\tapi fileTree(include: ['*.aar'], dir: 'libs')\n\timplementation 'me.leolin:ShortcutBadger:1.1.22@aar'\n\timplementation 'org.hsluv:hsluv:0.2'\n\timplementation 'com.koushikdutta.urlimageviewhelper:urlimageviewhelper:1.0.4'\n\timplementation 'com.google.zxing:core:3.3.3'\n\n\t// play referrer\n\tplayImplementation 'com.android.installreferrer:installreferrer:1.1'\n\t// smack4\n\t//compile project(\"Smack:smack-android-extensions\")\n\t//compile project(\"Smack:smack-tcp\")\n\t//compile project(\"Smack:smack-im\")\n\t//// for Carbons, and other\n\t//compile project(\"Smack:smack-experimental\")\n\timplementation 'org.jxmpp:jxmpp-jid:0.6.4-SNAPSHOT'\n\timplementation \"org.igniterealtime.smack:smack-android-extensions:$SMACK_VERSION\"\n\timplementation \"org.igniterealtime.smack:smack-tcp:$SMACK_VERSION\"\n\timplementation \"org.igniterealtime.smack:smack-im:$SMACK_VERSION\"\n\t// for Carbons, and other\n\timplementation \"org.igniterealtime.smack:smack-experimental:$SMACK_VERSION\"\n}\n\n// for smack4\nconfigurations {\n\tall*.exclude group: 'xpp3', module: 'xpp3'\n}\n"
  },
  {
    "path": "build.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project name=\"yaxim\" default=\"help\">\n\n    <!-- The local.properties file is created and updated by the 'android' tool.\n         It contains the path to the SDK. It should *NOT* be checked into\n         Version Control Systems. -->\n    <loadproperties srcFile=\"local.properties\" />\n\n    <!-- The ant.properties file can be created by you. It is only edited by the\n         'android' tool to add properties to it.\n         This is the place to change some Ant specific build properties.\n         Here are some properties you may want to change/update:\n\n         source.dir\n             The name of the source directory. Default is 'src'.\n         out.dir\n             The name of the output directory. Default is 'bin'.\n\n         For other overridable properties, look at the beginning of the rules\n         files in the SDK, at tools/ant/build.xml\n\n         Properties related to the SDK location or the project target should\n         be updated using the 'android' tool with the 'update' action.\n\n         This file is an integral part of the build system for your\n         application and should be checked into Version Control Systems.\n\n         -->\n    <property file=\"ant.properties\" />\n\n    <!-- The project.properties file is created and updated by the 'android'\n         tool, as well as ADT.\n\n         This contains project specific properties such as project target, and library\n         dependencies. Lower level build properties are stored in ant.properties\n         (or in .classpath for Eclipse projects).\n\n         This file is an integral part of the build system for your\n         application and should be checked into Version Control Systems. -->\n    <loadproperties srcFile=\"project.properties\" />\n\n    <!-- quick check on sdk.dir -->\n    <fail\n            message=\"sdk.dir is missing. Make sure to generate local.properties using 'android update project'\"\n            unless=\"sdk.dir\"\n    />\n\n    <!-- Custom Android task to deal with the project target, and import the proper rules.\n         This requires ant 1.6.0 or above. -->\n    <path id=\"android.antlibs\">\n        <pathelement path=\"${sdk.dir}/tools/lib/anttasks.jar\" />\n        <pathelement path=\"${sdk.dir}/tools/lib/sdklib.jar\" />\n        <pathelement path=\"${sdk.dir}/tools/lib/androidprefs.jar\" />\n        <pathelement path=\"${sdk.dir}/tools/lib/apkbuilder.jar\" />\n        <pathelement path=\"${sdk.dir}/tools/lib/jarutils.jar\" />\n    </path>\n\n    <!-- Execute the Android Setup task that will setup some properties specific to the target,\n         and import the build rules files.\n\n         The rules file is imported from\n            <SDK>/platforms/<target_platform>/templates/android_rules.xml\n\n         To customize some build steps for your project:\n         - copy the content of the main node <project> from android_rules.xml\n         - paste it in this build.xml below the <setup /> task.\n         - disable the import by changing the setup task below to <setup import=\"false\" />\n\n         This will ensure that the properties are setup correctly but that your customized\n         build steps are used.\n    -->\n\n    <target name=\"-pre-build\">\n\t<tstamp>\n\t    <format property=\"build.date\" pattern=\"yyyy-MM-dd\" />\n\t</tstamp>\n\t<exec executable=\"git\" outputproperty=\"git.revision\">\n\t    <arg line=\"describe --tags --dirty=+\"/>\n\t</exec>\n\t<copy file=\"version.xml.tpl\" tofile=\"${resource.absolute.dir}/values/version.xml\" overwrite=\"true\">\n\t    <filterchain>\n\t\t<replacetokens>\n\t\t    <token key=\"build_revision\" value=\"${git.revision}\"/>\n\t\t    <token key=\"build_date\" value=\"${build.date}\"/>\n\t\t    <token key=\"build_version\" value=\"${ant.project.name} ${git.revision} ${build.date}\"/>\n\t\t</replacetokens>\n\t    </filterchain>\n\n\t</copy>\n    </target>\n\n    <target name=\"check-proguard\">\n        <available file=\"tools/proguard.jar\" property=\"have.proguard\"/>\n    </target>\n\n    <target name=\"proguard\" depends=\"check-proguard\">\n\t    <fail unless=\"have.proguard\">Please download ProGuard from http://sourceforge.net/projects/proguard/files/ and place the JAR into the tools/ directory!</fail>\n    </target>\n\n    <target name=\"proguard.execute\" depends=\"-compile, -post-compile\" if=\"have.proguard\">\n        <taskdef resource=\"proguard/ant/task.properties\"\n                classpath=\"tools/proguard.jar\" />\n\t<!-- following lines copied from android-sdk build.xml -->\n\t<path id=\"project.jars.ref\">\n\t\t<pathelement location=\"${out.classes.absolute.dir}\" />\n\t\t<path refid=\"project.all.jars.path\" />\n\t</path>\n\t<pathconvert property=\"project.jars\" refid=\"project.jars.ref\">\n\t\t<firstmatchmapper>\n\t\t\t<regexpmapper from='^([^ ]*)( .*)$$' to='\"\\1\\2\"'/>\n\t\t\t<identitymapper/>\n\t\t</firstmatchmapper>\n\t</pathconvert>\n\n        <proguard configuration=\"proguard.cfg\">\n\t    -injars ${project.jars}\n\t    -outjars ${out.absolute.dir}/classes.min.jar\n\t    -libraryjars ${toString:project.target.class.path}\n\t    -printusage ${out.absolute.dir}/proguard.usage\n        </proguard>\n    </target>\n\n    <!-- Convert this project's .class files into .dex files. -->\n    <target name=\"dex.proguard\" depends=\"proguard.execute\" if=\"have.proguard\">\n\t<dex executable=\"${dx}\" output=\"${intermediate.dex.file}\"\n                    nolocals=\"@{nolocals}\"\n                    verbose=\"${verbose}\"\n                    previousBuildType=\"${build.last.target}\"\n                    buildType=\"${build.target}\">\n\t\t    <path path=\"${out.absolute.dir}/classes.min.jar\" />\n\t</dex>\n    </target>\n\n    <!-- Convert this project's .class files into .dex files. -->\n    <target name=\"dex.vanilla\" depends=\"-compile, -post-compile\" unless=\"have.proguard\">\n\t<dex-helper>\n\t</dex-helper>\n    </target>\n\n    <target name=\"-dex\" depends=\"dex.vanilla, dex.proguard\" />\n\n    <!-- Import the actual build file.\n\n         To customize existing targets, there are two options:\n         - Customize only one target:\n             - copy/paste the target into this file, *before* the\n               <import> task.\n             - customize it to your needs.\n         - Customize the whole content of build.xml\n             - copy/paste the content of the rules files (minus the top node)\n               into this file, replacing the <import> task.\n             - customize to your needs.\n\n         ***********************\n         ****** IMPORTANT ******\n         ***********************\n         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,\n         in order to avoid having your file be overridden by tools such as \"android update project\"\n    -->\n    <!-- version-tag: 1 -->\n    <import file=\"${sdk.dir}/tools/ant/build.xml\" />\n\n</project>\n"
  },
  {
    "path": "export-icons.sh",
    "content": "#!/bin/sh\n\n# convert a single svg file into a png in the according drawable dir\nsvg2png() {\n\tbasename=$1\n\twidth=$2\n\theight=$3\n\tdest=$4\n\tapi=$5\n\tinkscape --export-png=res/$dest$api/$basename.png --export-width=$width --export-height=$height --export-background-opacity=0 -C -z asset-graphics/$basename$api.svg\n}\n\n# convert a single svg into a group of PNGs for all DPIs\nsvg2all() {\n\tbasename=$1\n\tdpx=$2\n\tdpy=$3\n\tapi=$4\n\twhile read scale dir ; do\n\t\tsvg2png $basename $(($dpx*$scale)) $(($dpy*$scale)) drawable$dir $api\n\tdone <<EOF\n1\n3/2 -hdpi\n2 -xhdpi\n3 -xxhdpi\n4 -xxxhdpi\nEOF\n}\n\n# convert SVG to launcher icons (sizes at http://stackoverflow.com/a/12768159/539443)\nsvg2launcher() {\n\tbasename=$1\n\tapi=$2\n\n\tsvg2all $basename 48 48 $api\n\n\tsvg2png $basename 512 512 ../asset-graphics/\n}\n\n# a roster status icon is 66% of a launcher icon, making it 32dp\n# action bar icons are 32dp as well\nsvg2rosteraction() {\n\tbasename=$1\n\n\tsvg2all $basename 32 32\n}\n\n# a notification bar icon is 16x25dp (pre-v11), or 24dp as of v11\nsvg2notif() {\n\tsbname=$1\n\n\tsvg2png $sbname 16 25 drawable\n\tsvg2png $sbname 24 38 drawable-hdpi\n\tsvg2png $sbname 32 50 drawable-xhdpi\n\n\tsvg2all $basename 24 24 -v11\n}\n\nsvg2chat() {\n\tsvg2all $1 18 10\n}\n\n# convert chat markers\nfor file in asset-graphics/ic_chat_*.svg\ndo\n\tbasename=`basename $file .svg`\n\tsvg2chat $basename\ndone\n\n# convert launcher icon\nsvg2launcher icon\n\n# convert GNU for about dialog\nsvg2all gnuicon 48 48\n\n# convert statusbar notification icons\nsvg2notif sb_message\nsvg2notif ic_online\nsvg2notif ic_offline\n\n# convert roster status\nfor file in asset-graphics/ic_action_*.svg asset-graphics/ic_status_*.svg\ndo\n\tbasename=`basename $file .svg`\n\tsvg2rosteraction $basename\ndone\n\n"
  },
  {
    "path": "free/src/org/yaxim/androidclient/service/InstallReferrerReceiver.java",
    "content": "package org.yaxim.androidclient.service;\n\nimport android.content.Context;\nimport android.util.Log;\n\npublic class InstallReferrerReceiver {\n\tstatic final String TAG = \"yaxim.InstallReceiver\";\n\n\tpublic static void queryInstallReferrerLibrary(final Context context) {\n\t\tLog.d(TAG, \"No-Op InstallReferrer, see https://gitlab.com/fdroid/fdroidclient/-/issues/1932\");\n\t}\n}\n"
  },
  {
    "path": "free/src/org/yaxim/androidclient/service/PushManager.java",
    "content": "package org.yaxim.androidclient.service;\n\nimport android.app.Service;\nimport android.util.Log;\n\nimport org.jivesoftware.smack.XMPPConnection;\n\npublic class PushManager {\n\tprivate final static String TAG = \"yaxim.PushManager\";\n\n\tpublic PushManager(Service service, XMPPConnection connection) {\n\t\tLog.w(TAG, \"This version of yaxim doesn't have Push support\");\n\t}\n\n\tpublic boolean enableAccountPush() {\n\t\treturn false;\n\t}\n\n\tpublic boolean disableAccountPush() {\n\t\treturn false;\n\t}\n}\n"
  },
  {
    "path": "play/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:tools=\"http://schemas.android.com/tools\" package=\"org.yaxim.androidclient\"\n\txmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n\t<application tools:ignore=\"GoogleAppIndexingWarning\">\n\n\t\t<meta-data android:name=\"firebase_analytics_collection_deactivated\" android:value=\"true\" />\n\t\t<meta-data android:name=\"google_analytics_adid_collection_enabled\" android:value=\"false\" />\n\n\t\t<service android:name=\".service.PushMessageReceiver\" android:exported=\"false\" >\n\t\t\t<intent-filter>\n\t\t\t\t<action android:name=\"com.google.firebase.MESSAGING_EVENT\" />\n\t\t\t</intent-filter>\n\t\t</service>\n\n\t\t<receiver android:name=\".service.InstallReferrerReceiver\"\n\t\t\tandroid:enabled=\"true\"\n\t\t\tandroid:exported=\"true\">\n\t\t\t<intent-filter>\n\t\t\t\t<action android:name=\"com.android.vending.INSTALL_REFERRER\"/>\n\t\t\t</intent-filter>\n\t\t</receiver>\n\n\t</application>\n\n</manifest>\n"
  },
  {
    "path": "play/res/values/push.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"push_service\">push.yax.im</string>\n\t<string name=\"gcm_defaultSenderId\" translatable=\"false\">919923047082</string>\n\t<string name=\"google_app_id\">1:919923047082:android:5c6e1f8ed3616cbf88eed3</string>\n</resources>\n"
  },
  {
    "path": "play/src/org/yaxim/androidclient/service/InstallReferrerReceiver.java",
    "content": "package org.yaxim.androidclient.service;\n\nimport android.content.BroadcastReceiver;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.net.Uri;\nimport android.os.RemoteException;\nimport android.util.Log;\n\nimport com.android.installreferrer.api.InstallReferrerClient;\nimport com.android.installreferrer.api.InstallReferrerClient.InstallReferrerResponse;\nimport com.android.installreferrer.api.InstallReferrerStateListener;\nimport com.android.installreferrer.api.ReferrerDetails;\n\nimport org.yaxim.androidclient.MainWindow;\nimport org.yaxim.androidclient.data.YaximConfiguration;\nimport org.yaxim.androidclient.util.XMPPHelper;\n\nimport java.net.URLDecoder;\n\npublic class InstallReferrerReceiver extends BroadcastReceiver {\n\tstatic final String TAG = \"yaxim.InstallReceiver\";\n\tstatic boolean receivedReferrer = false;\n\n\tstatic synchronized void startActivity(Context context, Uri reference) {\n\t\tif (receivedReferrer)\n\t\t\treturn;\n\t\treceivedReferrer = true;\n\t\tLog.i(TAG, \"Referrer: \" + reference);\n\t\tIntent ref_intent = new Intent(context, MainWindow.class)\n\t\t\t\t.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP)\n\t\t\t\t.setAction(Intent.ACTION_VIEW)\n\t\t\t\t.setData(reference);\n\t\tcontext.startActivity(ref_intent);\n\t}\n\n\t@Override\n\tpublic void onReceive(Context context, Intent intent) {\n\t\tLog.d(TAG, \"onReceive \" + intent);\n\t\ttry {\n\t\t\tYaximConfiguration config = new YaximConfiguration(context);\n\t\t\tString ref = URLDecoder.decode(intent.getStringExtra(\"referrer\"), \"UTF-8\");\n\t\t\t//config.storeInstallReferrer(ref);\n\t\t\tLog.w(TAG, \"Ignoring legacy Referrer: \" + ref);\n\t\t\t//startActivity(context, Uri.parse(ref));\n\t\t} catch (Exception e) {\n\t\t\tLog.e(TAG, \"Error in handling referrer: \" + e.getLocalizedMessage());\n\t\t\te.printStackTrace();\n\t\t}\n\t}\n\n\tpublic static void queryInstallReferrerLibrary(final Context context) {\n\t\tLog.d(TAG, \"Querying InstallReferrer\");\n\t\tfinal InstallReferrerClient referrerClient = InstallReferrerClient.newBuilder(context).build();\n\t\treferrerClient.startConnection(new InstallReferrerStateListener() {\n\t\t\t@Override\n\t\t\tpublic void onInstallReferrerSetupFinished(int responseCode) {\n\t\t\t\tLog.d(TAG, \"InstallReferrerSetup: \" + responseCode);\n\t\t\t\tswitch (responseCode) {\n\t\t\t\t\tcase InstallReferrerResponse.OK:\n\t\t\t\t\t\t// Connection established.\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tReferrerDetails response = referrerClient.getInstallReferrer();\n\t\t\t\t\t\t\tString referrerUrl = response.getInstallReferrer();\n\t\t\t\t\t\t\tLog.d(TAG, \"InstallReferrerSetup: \" + referrerUrl);\n\t\t\t\t\t\t\t//long referrerClickTime = response.getReferrerClickTimestampSeconds();\n\t\t\t\t\t\t\t//long appInstallTime = response.getInstallBeginTimestampSeconds();\n\t\t\t\t\t\t\t//boolean instantExperienceLaunched = response.getGooglePlayInstantParam();\n\t\t\t\t\t\t\tUri ref = XMPPHelper.transmogrifyXmppUriHelper(Uri.parse(referrerUrl));\n\t\t\t\t\t\t\tif (ref != null)\n\t\t\t\t\t\t\t\tstartActivity(context, ref);\n\t\t\t\t\t\t} catch (RemoteException e) {\n\t\t\t\t\t\t\te.printStackTrace();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase InstallReferrerResponse.FEATURE_NOT_SUPPORTED:\n\t\t\t\t\t\t// API not available on the current Play Store app.\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase InstallReferrerResponse.SERVICE_UNAVAILABLE:\n\t\t\t\t\t\t// Connection couldn't be established.\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t@Override\n\t\t\tpublic void onInstallReferrerServiceDisconnected() {\n\t\t\t\t// Try to restart the connection on the next request to\n\t\t\t\t// Google Play by calling the startConnection() method.\n\t\t\t}\n\t\t});\n\t}\n}\n"
  },
  {
    "path": "play/src/org/yaxim/androidclient/service/PushManager.java",
    "content": "package org.yaxim.androidclient.service;\n\nimport android.app.Service;\nimport android.provider.Settings;\nimport android.support.annotation.NonNull;\nimport android.text.TextUtils;\nimport android.util.Log;\n\nimport com.google.android.gms.tasks.OnCompleteListener;\nimport com.google.android.gms.tasks.Task;\nimport com.google.firebase.FirebaseApp;\nimport com.google.firebase.iid.FirebaseInstanceId;\nimport com.google.firebase.iid.InstanceIdResult;\n\nimport org.jivesoftware.smack.SmackException;\nimport org.jivesoftware.smack.XMPPConnection;\nimport org.jivesoftware.smack.XMPPException;\nimport org.jivesoftware.smackx.commands.AdHocCommandManager;\nimport org.jivesoftware.smackx.commands.RemoteCommand;\nimport org.jivesoftware.smackx.push_notifications.PushNotificationsManager;\nimport org.jivesoftware.smackx.xdata.Form;\nimport org.jivesoftware.smackx.xdata.FormField;\nimport org.jivesoftware.smackx.xdata.packet.DataForm;\nimport org.jxmpp.jid.Jid;\nimport org.jxmpp.jid.impl.JidCreate;\nimport org.yaxim.androidclient.R;\nimport org.yaxim.androidclient.YaximApplication;\n\nimport java.util.HashMap;\n\npublic class PushManager {\n\tprivate final static String TAG = \"yaxim.PushManager\";\n\tprivate final static String NODE = \"v1-register-push\";\n\n\tprivate String deviceId = null;\n\tprivate String pushToken = null;\n\tprivate Service service;\n\tprivate XMPPConnection connection;\n\n\tpublic PushManager(Service service, XMPPConnection connection) {\n\t\tthis.deviceId = YaximApplication.getConfig().getPushNodeId();\n\t\tthis.service = service;\n\t\tthis.connection = connection;\n\t}\n\n\tpublic boolean enableAccountPush() {\n\t\tif (!connection.isAuthenticated())\n\t\t\treturn false;\n\t\tPushNotificationsManager pnm = PushNotificationsManager.getInstanceFor(connection);\n\t\ttry {\n\t\t\tif (!pnm.isSupported()) {\n\t\t\t\tLog.i(TAG, \"push not supported by account\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tgetFcmPushToken();\n\t\t\treturn true;\n\t\t} catch (Exception e) {\n\t\t\te.printStackTrace();\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tpublic boolean disableAccountPush() {\n\t\ttry {\n\t\t\tif (connection.isAuthenticated()) {\n\t\t\t\tJid push_service = JidCreate.from(service.getString(R.string.push_service));\n\t\t\t\tPushNotificationsManager.getInstanceFor(connection).disableAll(push_service);\n\t\t\t\tLog.i(TAG, \"Successfully disabled push for \" + push_service + \" on account.\");\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} catch (Exception e) {\n\t\t\tLog.e(TAG, \"Error obtaining FCM token!\");\n\t\t\te.printStackTrace();\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate void getFcmPushToken() {\n\t\tLog.d(TAG, \"requesting FCM token\");\n\t\t//FirebaseApp.initializeApp(YaximApplication.getApp());\n\t\tFirebaseInstanceId.getInstance().getInstanceId().addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {\n\t\t\t@Override\n\t\t\tpublic void onComplete(@NonNull Task<InstanceIdResult> task) {\n\t\t\t\tif (!task.isSuccessful()) {\n\t\t\t\t\tLog.w(TAG, \"FCM token retrieval failed.\");\n\t\t\t\t\ttask.getException().printStackTrace();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tInstanceIdResult result = task.getResult();\n\t\t\t\t\tpushToken = result.getToken();\n\t\t\t\t\tLog.d(TAG, \"FCM token: \" + pushToken);\n\t\t\t\t} catch (Exception e) {\n\t\t\t\t\tLog.e(TAG, \"Error obtaining FCM token!\");\n\t\t\t\t\te.printStackTrace();\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tif (connection.isAuthenticated()) {\n\t\t\t\t\t\tJid push_service = JidCreate.from(service.getString(R.string.push_service));\n\t\t\t\t\t\tAdHocCommandManager ahcm = AdHocCommandManager.getAddHocCommandsManager(connection);\n\t\t\t\t\t\tRemoteCommand rc = ahcm.getRemoteCommand(push_service, NODE);\n\t\t\t\t\t\tDataForm df = new DataForm(DataForm.Type.submit);\n\t\t\t\t\t\tdf.addField(new FormField(\"type\", \"fcm\"));\n\t\t\t\t\t\tdf.addField(new FormField(\"node\", deviceId));\n\t\t\t\t\t\tdf.addField(new FormField(\"token\", pushToken));\n\t\t\t\t\t\trc.execute(new Form(df));\n\t\t\t\t\t\tif (rc.getForm().hasField(\"node\") && rc.getForm().hasField(\"secret\")) {\n\t\t\t\t\t\t\tString node = rc.getForm().getField(\"node\").getFirstValue();\n\t\t\t\t\t\t\tString secret = rc.getForm().getField(\"secret\").getFirstValue();\n\t\t\t\t\t\t\tHashMap<String, String> pub_opts = new HashMap<>();\n\t\t\t\t\t\t\tpub_opts.put(\"secret\", secret);\n\t\t\t\t\t\t\tPushNotificationsManager.getInstanceFor(connection)\n\t\t\t\t\t\t\t\t\t.enable(push_service, node, pub_opts);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tLog.i(TAG, \"Successfully registered push for \" + push_service + \" on account.\");\n\t\t\t\t\t} else\n\t\t\t\t\t\tLog.i(TAG, \"Not connected to server, not registering for FCM push.\");\n\t\t\t\t} catch (Exception e) {\n\t\t\t\t\tLog.e(TAG, \"Error obtaining FCM token!\");\n\t\t\t\t\te.printStackTrace();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t}\n}\n"
  },
  {
    "path": "play/src/org/yaxim/androidclient/service/PushMessageReceiver.java",
    "content": "package org.yaxim.androidclient.service;\n\nimport android.content.Intent;\nimport android.os.Build;\nimport android.text.TextUtils;\nimport android.util.Log;\n\nimport com.google.firebase.messaging.FirebaseMessagingService;\nimport com.google.firebase.messaging.RemoteMessage;\n\nimport org.yaxim.androidclient.YaximApplication;\n\npublic class PushMessageReceiver extends FirebaseMessagingService {\n\tprivate final static String TAG = \"yaxim.PushMessageRcvr\";\n\n\tprivate void startServiceIfNeeded(String action) {\n\t\tif (!YaximApplication.getConfig().autoConnect) {\n\t\t\tLog.d(TAG, \"not starting, auto-connect disabled.\");\n\t\t\treturn;\n\t\t}\n\t\tIntent xmppServiceIntent = new Intent(this, XMPPService.class);\n\t\tif (!TextUtils.isEmpty(action))\n\t\t\txmppServiceIntent.setAction(action);\n\t\tif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n\t\t\tstartForegroundService(xmppServiceIntent);\n\t\t} else\n\t\t\tstartService(xmppServiceIntent);\n\t}\n\n\t@Override\n\tpublic void onMessageReceived(RemoteMessage remoteMessage) {\n\t\tLog.d(TAG, \"Received push message!\");\n\t\tstartServiceIfNeeded(null);\n\t}\n\n\t@Override\n\tpublic void onNewToken(String s) {\n\t\tLog.d(TAG, \"Received token update: \" + s);\n\t\tstartServiceIfNeeded(\"newtoken\");\n\t}\n}\n"
  },
  {
    "path": "proguard.cfg",
    "content": "-dontobfuscate\n-optimizationpasses 5\n-dontskipnonpubliclibraryclasses\n-dontpreverify\n-allowaccessmodification\n-verbose\n-optimizations !code/simplification/arithmetic,!field/*,field/propagation/value,!class/merging/*,!code/allocation/variable\n\n-keep public class * extends android.app.Activity\n-keep public class * extends android.app.Application\n-keep public class * extends android.app.Service\n-keep public class * extends android.content.BroadcastReceiver\n-keep public class * extends android.content.ContentProvider\n-keep public class * extends android.app.backup.BackupAgentHelper\n-keep public class * extends android.preference.Preference\n-keep public class com.android.vending.licensing.ILicensingService\n\n-keepclasseswithmembernames class * {\n    native <methods>;\n}\n\n-keepclasseswithmembers class * {\n    public <init>(android.content.Context, android.util.AttributeSet);\n}\n\n-keepclasseswithmembers class * {\n    public <init>(android.content.Context, android.util.AttributeSet, int);\n}\n\n-keepclassmembers class * extends android.app.Activity {\n   public void *(android.view.View);\n}\n\n-keepclassmembers enum * {\n    public static **[] values();\n    public static ** valueOf(java.lang.String);\n}\n\n-keep class * implements android.os.Parcelable {\n  public static final android.os.Parcelable$Creator *;\n}\n-dontwarn org.bouncycastle.**\n-keepclasseswithmembers class * extends org.jivesoftware.smack.sasl.SASLMechanism {\n\tpublic <init>(org.jivesoftware.smack.SASLAuthentication);\n}\n-keep class android.support.v4.app.** { *; }\n-keep interface android.support.v4.app.** { *; }\n-keep class com.actionbarsherlock.** { *; }\n-keep interface com.actionbarsherlock.** { *; }\n\n-keepattributes *Annotation*\n\n# smack4\n# We don't use jzlib, but instead the Android API for compression\n-dontnote com.jcraft.jzlib.*\n\n-dontnote android.os.SystemProperties\n\n-dontnote sun.security.pkcs11.SunPKCS11\n\n# Smack specific configuration\n-keep class org.jivesoftware.smack.** { *; }\n-keep class org.jivesoftware.smackx.** { *; }\n\n-dontwarn com.kenai.jbosh.*\n-dontwarn android.support.v4.app.*\n-keep class android.support.v7.widget.SearchView { *; }\n-dontwarn com.google.firebase.analytics.connector.AnalyticsConnector\n"
  },
  {
    "path": "project.properties",
    "content": "# This file is automatically generated by Android Tools.\n# Do not modify this file -- YOUR CHANGES WILL BE ERASED!\n#\n# This file must be checked in Version Control Systems.\n#\n# To customize properties used by the Ant build system use,\n# \"ant.properties\", and override values to adapt the script to your\n# project structure.\n\n# Indicates whether an apk should be generated for each density.\nsplit.density=false\nandroid.library.reference.1=MemorizingTrustManager/\nandroid.library.reference.2=../android-sdk/extras/android/support/v7/appcompat\nproguard.config=proguard.cfg\nproguard.enabled=true\n# Project target.\ntarget=android-23\napk-configurations=\n"
  },
  {
    "path": "rdf.sh",
    "content": "#!/bin/bash\n\nsource yaxim.rdf.sh\nenvsubst < base.rdf.xml > yaxim.rdf.xml\n\nsource bruno.rdf.sh\nenvsubst < base.rdf.xml > bruno.rdf.xml\n"
  },
  {
    "path": "res/drawable/count_bcg.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n       android:shape=\"rectangle\">\n    <solid android:color=\"#FFE73C18\" />\n    <corners android:radius=\"4sp\" />\n</shape>\n"
  },
  {
    "path": "res/drawable/group_indicator.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item\n        android:state_expanded=\"true\"\n        android:drawable=\"@drawable/ic_group_opened\" />\n    <item\n        android:drawable=\"@drawable/ic_group_closed\" />\n</selector>\n\n"
  },
  {
    "path": "res/drawable/ic_action_attach.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\tandroid:tint=\"?attr/colorControlNormal\"\n        android:width=\"24sp\"\n        android:height=\"24sp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M16.5,6v11.5c0,2.21 -1.79,4 -4,4s-4,-1.79 -4,-4V5c0,-1.38 1.12,-2.5 2.5,-2.5s2.5,1.12 2.5,2.5v10.5c0,0.55 -0.45,1 -1,1s-1,-0.45 -1,-1V6H10v9.5c0,1.38 1.12,2.5 2.5,2.5s2.5,-1.12 2.5,-2.5V5c0,-2.21 -1.79,-4 -4,-4S7,2.79 7,5v12.5c0,3.04 2.46,5.5 5.5,5.5s5.5,-2.46 5.5,-5.5V6h-1.5z\"/>\n</vector>\n"
  },
  {
    "path": "res/drawable/ic_action_camera.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:tint=\"?attr/colorControlNormal\"\n        android:width=\"24sp\"\n        android:height=\"24sp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M12,12m-3.2,0a3.2,3.2 0,1 1,6.4 0a3.2,3.2 0,1 1,-6.4 0\"/>\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M9,2L7.17,4L4,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6c0,-1.1 -0.9,-2 -2,-2h-3.17L15,2L9,2zM12,17c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5z\"/>\n</vector>\n"
  },
  {
    "path": "res/drawable/ic_action_contacts_all.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24sp\"\n    android:height=\"24sp\"\n    android:tint=\"?attr/colorControlNormal\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:pathData=\"m16.3877,13.4155c-0.2567,0 -0.5489,0.0172 -0.8587,0.0431 1.0269,0.7236 1.7439,1.6971 1.7439,2.9721v2.1537h5.3115v-2.1537c0,-2.0073 -4.1341,-3.0152 -6.1967,-3.0152z\"\n      android:strokeAlpha=\"1\"\n      android:strokeWidth=\"0.87328565\"\n      android:fillColor=\"#00000000\"\n      android:strokeColor=\"#000000\"\n      android:fillAlpha=\"1\"/>\n  <path\n      android:fillColor=\"#FF000000\"\n      android:pathData=\"M16,5C14.34,5 13,6.34 13,8C13,9.66 14.34,11 16,11C17.66,11 18.9902,9.66 18.9902,8C18.9902,6.34 17.66,5 16,5zM16,6C17.1,6 18,6.9 18,8C18,9.1 17.1,10 16,10C14.9,10 14,9.1 14,8C14,6.9 14.9,6 16,6z\"/>\n  <path\n      android:fillColor=\"#FF000000\"\n      android:pathData=\"M8,11C9.66,11 10.99,9.66 10.99,8 10.99,6.34 9.66,5 8,5 6.34,5 5,6.34 5,8c0,1.66 1.34,3 3,3z\"/>\n  <path\n      android:fillColor=\"#FF000000\"\n      android:pathData=\"M8,13C5.67,13 1,14.17 1,16.5V19H15V16.5C15,14.17 10.33,13 8,13Z\"/>\n</vector>\n"
  },
  {
    "path": "res/drawable/ic_action_contacts_online.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:tint=\"?attr/colorControlNormal\"\n    android:width=\"24sp\"\n    android:height=\"24sp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:fillColor=\"#FF000000\"\n      android:pathData=\"M16,11c1.66,0 2.99,-1.34 2.99,-3S17.66,5 16,5c-1.66,0 -3,1.34 -3,3s1.34,3 3,3zM8,11c1.66,0 2.99,-1.34 2.99,-3S9.66,5 8,5C6.34,5 5,6.34 5,8s1.34,3 3,3zM8,13c-2.33,0 -7,1.17 -7,3.5L1,19h14v-2.5c0,-2.33 -4.67,-3.5 -7,-3.5zM16,13c-0.29,0 -0.62,0.02 -0.97,0.05 1.16,0.84 1.97,1.97 1.97,3.45L17,19h6v-2.5c0,-2.33 -4.67,-3.5 -7,-3.5z\"/>\n</vector>\n"
  },
  {
    "path": "res/drawable/ic_action_file.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\tandroid:tint=\"?attr/colorControlNormal\"\n        android:width=\"24sp\"\n        android:height=\"24sp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M6,2c-1.1,0 -1.99,0.9 -1.99,2L4,20c0,1.1 0.89,2 1.99,2L18,22c1.1,0 2,-0.9 2,-2L20,8l-6,-6L6,2zM13,9L13,3.5L18.5,9L13,9z\"/>\n</vector>\n"
  },
  {
    "path": "res/drawable/ic_action_person_add.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\tandroid:tint=\"?attr/colorControlNormal\"\n        android:width=\"24sp\"\n        android:height=\"24sp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M15,12c2.21,0 4,-1.79 4,-4s-1.79,-4 -4,-4 -4,1.79 -4,4 1.79,4 4,4zM6,10L6,7L4,7v3L1,10v2h3v3h2v-3h3v-2L6,10zM15,14c-2.67,0 -8,1.34 -8,4v2h16v-2c0,-2.66 -5.33,-4 -8,-4z\"/>\n</vector>\n"
  },
  {
    "path": "res/drawable/ic_action_photo.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\tandroid:tint=\"?attr/colorControlNormal\"\n        android:width=\"24sp\"\n        android:height=\"24sp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M21,19V5c0,-1.1 -0.9,-2 -2,-2H5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2zM8.5,13.5l2.5,3.01L14.5,12l4.5,6H5l3.5,-4.5z\"/>\n</vector>\n"
  },
  {
    "path": "res/drawable/ic_action_search.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:tint=\"?attr/colorControlNormal\"\n        android:width=\"24sp\"\n        android:height=\"24sp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z\"/>\n</vector>\n"
  },
  {
    "path": "res/drawable/ic_status_available.xml",
    "content": "<vector android:height=\"32sp\" android:viewportHeight=\"480\"\n    android:viewportWidth=\"480\" android:width=\"32sp\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillAlpha=\"1\" android:fillColor=\"#99cc33\"\n        android:pathData=\"M108.789,64.865L371.211,64.865A43.925,43.925 88.201,0 1,415.135 108.789L415.135,371.211A43.925,43.925 88.201,0 1,371.211 415.135L108.789,415.135A43.925,43.925 88.201,0 1,64.865 371.211L64.865,108.789A43.925,43.925 88.201,0 1,108.789 64.865z\"\n        android:strokeAlpha=\"1\" android:strokeColor=\"#669900\" android:strokeWidth=\"3.00193024\"/>\n    <path android:fillAlpha=\"0.50196081\" android:fillColor=\"#ffffff\"\n        android:pathData=\"m162.285,141.042c-25.01,0 -45.174,21.209 -45.174,47.517l0,77.881c0,26.308 20.163,47.517 45.174,47.517l93.285,0 43.857,61.794 0,-61.794 19.143,0c25.01,0 45.072,-21.209 45.072,-47.517l0,-77.881c0,-26.308 -20.062,-47.517 -45.072,-47.517l-156.285,0z\"\n        android:strokeAlpha=\"1\" android:strokeColor=\"#669900\" android:strokeWidth=\"3.08531718\"/>\n</vector>\n"
  },
  {
    "path": "res/drawable/ic_status_away.xml",
    "content": "<vector android:height=\"32sp\" android:viewportHeight=\"480\"\n    android:viewportWidth=\"480\" android:width=\"32sp\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillAlpha=\"1\" android:fillColor=\"#ff9900\"\n        android:pathData=\"M108.789,64.865L371.211,64.865A43.925,43.925 88.201,0 1,415.135 108.789L415.135,371.211A43.925,43.925 88.201,0 1,371.211 415.135L108.789,415.135A43.925,43.925 88.201,0 1,64.865 371.211L64.865,108.789A43.925,43.925 88.201,0 1,108.789 64.865z\"\n        android:strokeAlpha=\"1\" android:strokeColor=\"#ff6600\" android:strokeWidth=\"3.00193024000000008\"/>\n    <path android:fillAlpha=\"0.627451\" android:fillColor=\"#ffffff\"\n        android:pathData=\"m162.285,141.042c-25.01,0 -45.174,21.209 -45.174,47.517l0,77.881c0,26.308 20.163,47.517 45.174,47.517l93.285,0 43.857,61.794 0,-61.794 19.143,0c25.01,0 45.072,-21.209 45.072,-47.517l0,-77.881c0,-26.308 -20.062,-47.517 -45.072,-47.517l-156.285,0z\"\n        android:strokeAlpha=\"1\" android:strokeColor=\"#ff6600\" android:strokeWidth=\"3.08531718\"/>\n</vector>\n"
  },
  {
    "path": "res/drawable/ic_status_chat.xml",
    "content": "<vector android:height=\"32sp\" android:viewportHeight=\"480\"\n    android:viewportWidth=\"480\" android:width=\"32sp\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillAlpha=\"1\" android:fillColor=\"#83c127\"\n        android:pathData=\"m108.855,65.302c-24.315,0 -43.846,19.571 -43.846,43.846l0,261.7c0,24.275 19.531,43.846 43.846,43.846l262.29,0c24.315,0 43.846,-19.571 43.846,-43.846l0,-261.7c0,-24.275 -19.531,-43.846 -43.846,-43.846l-262.29,0z\" android:strokeColor=\"#00000000\"/>\n    <path android:fillAlpha=\"1\" android:fillColor=\"#99cc33\"\n        android:pathData=\"M108.891,65L371.109,65A43.891,43.891 92.752,0 1,415 108.891L415,371.109A43.891,43.891 92.752,0 1,371.109 415L108.891,415A43.891,43.891 92.752,0 1,65 371.109L65,108.891A43.891,43.891 92.752,0 1,108.891 65z\"\n        android:strokeAlpha=\"1\" android:strokeColor=\"#669900\" android:strokeWidth=\"3.17873645000000016\"/>\n    <path android:fillAlpha=\"1\" android:fillColor=\"#ffffff\"\n        android:pathData=\"m202.513,173.37c-21.035,0 -37.994,17.833 -37.994,39.951l0,65.481c0,22.119 16.959,39.951 37.994,39.951l78.459,0 36.887,51.955 0,-51.955 16.101,0c21.035,0 37.909,-17.833 37.909,-39.951l0,-65.481c0,-22.119 -16.874,-39.951 -37.909,-39.951l-131.446,0z\"\n        android:strokeAlpha=\"1\" android:strokeColor=\"#669900\" android:strokeWidth=\"3.17873645\"/>\n    <path android:fillAlpha=\"1\" android:fillColor=\"#ffffff\"\n        android:pathData=\"m140.806,124.681c-21.035,0 -37.947,17.795 -37.947,39.914l0,65.474c0,22.119 16.912,40.012 37.947,40.012l16.123,0 0,51.907 36.866,-51.907 78.451,0c21.035,0 37.947,-17.893 37.947,-40.012l0,-65.474c0,-22.119 -16.912,-39.914 -37.947,-39.914l-131.44,0z\"\n        android:strokeAlpha=\"1\" android:strokeColor=\"#83c127\" android:strokeWidth=\"3.17873645\"/>\n    <path android:fillAlpha=\"1\" android:fillColor=\"#ffffff\"\n        android:pathData=\"m140.806,124.681c-21.035,0 -37.947,17.795 -37.947,39.914l0,65.474c0,22.119 16.912,40.012 37.947,40.012l16.123,0 0,51.907 36.866,-51.907 78.451,0c21.035,0 37.947,-17.893 37.947,-40.012l0,-65.474c0,-22.119 -16.912,-39.914 -37.947,-39.914l-131.44,0z\"\n        android:strokeAlpha=\"1\" android:strokeColor=\"#83c127\" android:strokeWidth=\"0.12714948\"/>\n    <path android:fillAlpha=\"1\" android:fillColor=\"#ffffff\"\n        android:pathData=\"m272.235,122.652c21.035,0 37.994,17.833 37.994,39.951l0,65.481c0,22.119 -16.959,39.951 -37.994,39.951l-78.459,0 -36.887,51.955 0,-51.955 -16.101,0c-21.035,0 -37.909,-17.833 -37.909,-39.951l0,-65.481c0,-22.119 16.874,-39.951 37.909,-39.951l131.446,0z\"\n        android:strokeAlpha=\"1\" android:strokeColor=\"#669900\" android:strokeWidth=\"3.17873645\"/>\n</vector>\n"
  },
  {
    "path": "res/drawable/ic_status_dnd.xml",
    "content": "<vector android:height=\"32sp\" android:viewportHeight=\"480\"\n    android:viewportWidth=\"480\" android:width=\"32sp\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillAlpha=\"1\" android:fillColor=\"#cc0000\"\n        android:pathData=\"M108.789,64.865L371.211,64.865A43.925,43.925 88.201,0 1,415.135 108.789L415.135,371.21A43.925,43.925 88.201,0 1,371.211 415.135L108.789,415.135A43.925,43.925 88.201,0 1,64.865 371.21L64.865,108.789A43.925,43.925 88.201,0 1,108.789 64.865z\"\n        android:strokeAlpha=\"1\" android:strokeColor=\"#990000\" android:strokeWidth=\"3.00193024\"/>\n    <path android:fillAlpha=\"1\" android:fillColor=\"#ff8181\"\n        android:pathData=\"m297.824,179.702c0,-8.119 7.568,-14.879 16.661,-14.879 9.092,0 16.76,6.141 16.76,14.259l-0.061,126.195c0,41.001 -37.223,74.24 -83.138,74.24 -33.813,0 -62.912,-18.025 -75.902,-43.902l-48.117,-104.584c-3.393,-7.314 0.647,-16.153 8.911,-19.208 8.399,-3.108 18.137,0.224 21.617,7.725l43.229,89.964 -0.227,-171.711c0,-8.119 7.371,-14.701 16.463,-14.701 9.092,0 16.662,6.404 16.662,14.523\"\n        android:strokeAlpha=\"1\" android:strokeColor=\"#990000\"\n        android:strokeLineCap=\"round\" android:strokeLineJoin=\"round\" android:strokeWidth=\"2.70502417\"/>\n    <path android:fillAlpha=\"1\" android:fillColor=\"#ff8181\"\n        android:pathData=\"m297.677,248.777 l0.049,-103.382c0,-8.119 -7.57,-14.524 -16.662,-14.524 -9.093,0 -16.464,6.582 -16.464,14.702\"\n        android:strokeAlpha=\"1\" android:strokeColor=\"#990000\"\n        android:strokeLineCap=\"round\" android:strokeLineJoin=\"miter\" android:strokeWidth=\"2.70502417\"/>\n    <path android:fillAlpha=\"1\" android:fillColor=\"#ff8181\"\n        android:pathData=\"m264.157,248.861 l0.246,-133.852c0,-8.12 -7.569,-14.525 -16.662,-14.525 -9.093,0 -16.464,6.582 -16.464,14.702l0,133.17\"\n        android:strokeAlpha=\"1\" android:strokeColor=\"#990000\"\n        android:strokeLineCap=\"round\" android:strokeLineJoin=\"miter\" android:strokeWidth=\"2.70502417\"/>\n</vector>\n"
  },
  {
    "path": "res/drawable/ic_status_offline.xml",
    "content": "<vector android:height=\"32sp\" android:viewportHeight=\"480\"\n    android:viewportWidth=\"480\" android:width=\"32sp\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillAlpha=\"1\" android:fillColor=\"#bfbfbf\"\n        android:pathData=\"M108.789,64.865L371.211,64.865A43.925,43.925 88.201,0 1,415.135 108.789L415.135,371.211A43.925,43.925 88.201,0 1,371.211 415.135L108.789,415.135A43.925,43.925 88.201,0 1,64.865 371.211L64.865,108.789A43.925,43.925 88.201,0 1,108.789 64.865z\"\n        android:strokeAlpha=\"1\" android:strokeColor=\"#808080\" android:strokeWidth=\"3.00193024000000008\"/>\n    <path android:fillAlpha=\"0.75294119\" android:fillColor=\"#ffffff\"\n        android:pathData=\"m162.285,141.042c-25.01,0 -45.174,21.209 -45.174,47.517l0,77.881c0,26.308 20.163,47.517 45.174,47.517l93.285,0 43.857,61.794 0,-61.794 19.143,0c25.01,0 45.072,-21.209 45.072,-47.517l0,-77.881c0,-26.308 -20.062,-47.517 -45.072,-47.517l-156.285,0z\"\n        android:strokeAlpha=\"1\" android:strokeColor=\"#808080\" android:strokeWidth=\"3.08531718\"/>\n</vector>\n"
  },
  {
    "path": "res/drawable/ic_status_subscribe.xml",
    "content": "<vector android:height=\"32sp\" android:viewportHeight=\"480\"\n    android:viewportWidth=\"480\" android:width=\"32sp\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillAlpha=\"0.25098041\" android:fillColor=\"#cc0000\"\n        android:pathData=\"M108.789,64.865L371.211,64.865A43.925,43.925 88.201,0 1,415.135 108.789L415.135,371.21A43.925,43.925 88.201,0 1,371.211 415.135L108.789,415.135A43.925,43.925 88.201,0 1,64.865 371.21L64.865,108.789A43.925,43.925 88.201,0 1,108.789 64.865z\"\n        android:strokeAlpha=\"1\" android:strokeColor=\"#990000\" android:strokeWidth=\"3.00193024000000008\"/>\n    <path android:fillAlpha=\"1\" android:fillColor=\"#ffffff\"\n        android:pathData=\"m202.326,96.475l75.348,0l0,110.196l-10.674,80.387l-54,0l-10.674,-80.387zM202.326,315.135l75.348,0l0,68.464l-75.348,0z\"\n        android:strokeAlpha=\"1\" android:strokeColor=\"#990000\"\n        android:strokeLineJoin=\"round\" android:strokeWidth=\"3.9195869\"/>\n</vector>\n"
  },
  {
    "path": "res/drawable/ic_status_unknown.xml",
    "content": "<vector android:height=\"32sp\" android:viewportHeight=\"480\"\n    android:viewportWidth=\"480\" android:width=\"32sp\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillAlpha=\"1\" android:fillColor=\"#bfbfbf\"\n        android:pathData=\"M108.789,64.865L371.211,64.865A43.925,43.925 88.201,0 1,415.135 108.789L415.135,371.21A43.925,43.925 88.201,0 1,371.211 415.135L108.789,415.135A43.925,43.925 88.201,0 1,64.865 371.21L64.865,108.789A43.925,43.925 88.201,0 1,108.789 64.865z\"\n        android:strokeAlpha=\"1\" android:strokeColor=\"#808080\" android:strokeWidth=\"3.00193024000000008\"/>\n    <path android:fillAlpha=\"1\" android:fillColor=\"#ffffff\"\n        android:pathData=\"m270.345,288.32l-66.156,0l0,-9.258q0,-15.493 6.047,-27.397 6.047,-12.092 25.473,-30.609l11.728,-10.959q10.446,-9.825 15.21,-18.516 4.948,-8.691 4.948,-17.383 0,-13.226 -8.796,-20.595 -8.796,-7.558 -24.556,-7.558 -14.844,0 -32.07,6.424 -17.226,6.235 -35.918,18.705l0,-59.328q22.174,-7.936 40.5,-11.714 18.326,-3.779 35.369,-3.779 44.715,0 68.172,18.894 23.457,18.705 23.457,54.793 0,18.516 -7.147,33.254 -7.147,14.549 -24.373,31.364l-11.728,10.77q-12.461,11.714 -16.31,18.894 -3.848,6.991 -3.848,15.493zM204.189,316.283l66.156,0l0,67.264l-66.156,0z\"\n        android:strokeAlpha=\"1\" android:strokeColor=\"#808080\"\n        android:strokeLineJoin=\"round\" android:strokeWidth=\"3.9195869\"/>\n</vector>\n"
  },
  {
    "path": "res/drawable/ic_status_xa.xml",
    "content": "<vector android:height=\"32sp\" android:viewportHeight=\"480\"\n    android:viewportWidth=\"480\" android:width=\"32sp\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillAlpha=\"1\" android:fillColor=\"#3366ff\"\n        android:pathData=\"M109.108,65.597L370.892,65.597A43.741,43.818 90,0 1,414.71 109.338L414.71,370.662A43.741,43.818 90,0 1,370.892 414.403L109.108,414.403A43.741,43.818 90,0 1,65.29 370.662L65.29,109.338A43.741,43.818 90,0 1,109.108 65.597z\"\n        android:strokeAlpha=\"1\" android:strokeColor=\"#003399\" android:strokeWidth=\"3.18152999999999997\"/>\n    <path android:fillAlpha=\"0.75294119\" android:fillColor=\"#ffffff\"\n        android:pathData=\"m125.975,290.151c13.393,26.453 36.084,47.036 63.745,57.808 62.006,24.145 131.837,-6.455 156.024,-68.352 24.187,-61.897 -6.401,-131.678 -68.407,-155.823 0,0 67.077,70.914 -2.609,148.393 -69.686,77.48 -148.754,17.974 -148.754,17.974z\"\n        android:strokeAlpha=\"1\" android:strokeColor=\"#003399\"\n        android:strokeLineCap=\"square\" android:strokeLineJoin=\"miter\" android:strokeWidth=\"3.1815299\"/>\n</vector>\n"
  },
  {
    "path": "res/layout/aboutview.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\tandroid:layout_height=\"fill_parent\" \n\tandroid:layout_width=\"fill_parent\" >\n\t<LinearLayout\n\t\tandroid:layout_width=\"fill_parent\"\n\t\tandroid:layout_height=\"wrap_content\"\n\t\tandroid:orientation=\"vertical\"\n\t\t>\n\t\t<TextView\n\t\t\tandroid:layout_width=\"fill_parent\"\n\t\t\tandroid:layout_height=\"wrap_content\"\n\t\t\tandroid:gravity=\"center\"\n\t\t\tandroid:textSize=\"20sp\"\n\t\t\tandroid:text=\"@string/build_version\"\n\t\t\tstyle=\"?attr/dialogTextColor\"\n\t\t\tandroid:layout_marginBottom=\"7sp\"\n\t\t\t/>\n\t\t<TextView\n\t\t\tandroid:layout_width=\"fill_parent\"\n\t\t\tandroid:layout_height=\"wrap_content\"\n\t\t\tandroid:drawableLeft=\"@drawable/icon\"\n\t\t\tandroid:drawablePadding=\"10sp\"\n\t\t\tandroid:text=\"@string/AboutDialog_DevelopersTitle\"\n\t\t\tandroid:textSize=\"20sp\"\n\t\t\tandroid:padding=\"10sp\"\n\t\t\tstyle=\"?attr/dialogTextColor\"\n\t\t\t/>\n\t\t<TextView\n\t\t\tandroid:layout_width=\"fill_parent\"\n\t\t\tandroid:layout_height=\"wrap_content\"\n\t\t\tandroid:autoLink=\"web\"\n\t\t\tandroid:text=\"@string/AboutDialog_DevelopersList\"\n\t\t\tandroid:padding=\"2sp\"\n\t\t\tstyle=\"?attr/dialogTextColor\"\n\t\t\t/>\n\t\t<TextView\n\t\t\tandroid:layout_width=\"fill_parent\"\n\t\t\tandroid:layout_height=\"wrap_content\"\n\t\t\tandroid:drawableLeft=\"@drawable/gnuicon\"\n\t\t\tandroid:drawablePadding=\"15sp\"\n\t\t\tandroid:text=\"@string/AboutDialog_LicenceTitle\"\n\t\t\tandroid:textSize=\"20sp\"\n\t\t\tandroid:padding=\"10sp\"\n\t\t\tstyle=\"?attr/dialogTextColor\"\n\t\t\t/>\n\t\t<TextView\n\t\t\tandroid:layout_width=\"fill_parent\"\n\t\t\tandroid:layout_height=\"wrap_content\"\n\t\t\tandroid:autoLink=\"web\"\n\t\t\tandroid:text=\"@string/AboutDialog_LicenceText\"\n\t\t\tandroid:padding=\"2sp\"\n\t\t\tstyle=\"?attr/dialogTextColor\"\n\t\t\t/>\n\t\t<TextView\n\t\t\tandroid:id=\"@+id/translator_credits\"\n\t\t\tandroid:layout_width=\"fill_parent\"\n\t\t\tandroid:layout_height=\"wrap_content\"\n\t\t\tandroid:text=\"@string/translator_credits\"\n\t\t\tandroid:autoLink=\"web\"\n\t\t\tandroid:padding=\"2sp\"\n\t\t\tstyle=\"?attr/dialogTextColor\"\n\t\t\t/>\n\t</LinearLayout>\n\n</ScrollView>\t\n"
  },
  {
    "path": "res/layout/activity_entitylist.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n\txmlns:android=\"http://schemas.android.com/apk/res/android\"\n\tandroid:id=\"@+id/muclist_layout\"\n\tandroid:orientation=\"vertical\"\n\tandroid:layout_width=\"fill_parent\" \n\tandroid:layout_height=\"fill_parent\">\n    \n\t<ExpandableListView android:id=\"@android:id/list\"\n\t\tandroid:layout_width=\"fill_parent\" \n\t\tandroid:layout_height=\"fill_parent\"\n\t\tandroid:scrollingCache=\"true\"\n\t\tandroid:focusable=\"true\"\n\t\tandroid:groupIndicator=\"@drawable/group_indicator\"\n\t\tandroid:fadingEdge=\"none\"\n\t\tandroid:cacheColorHint=\"#0000\"\n\t\tandroid:divider=\"#0000\"/>\n\n\t<TextView android:id=\"@android:id/empty\"\n\t\tandroid:layout_width=\"fill_parent\" \n\t\tandroid:layout_height=\"fill_parent\"\n\t\tandroid:gravity=\"center\"\n\t\tandroid:textSize=\"18sp\"\n\t\tandroid:text=\"@string/muc_synchronizing\"/>\n</LinearLayout>\n"
  },
  {
    "path": "res/layout/addrosteritemdialog.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<ScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\tandroid:layout_width=\"fill_parent\" \n\tandroid:layout_height=\"wrap_content\"\n\t>\n<LinearLayout\n\t\tandroid:id=\"@+id/statusLayout\" \n\t\tandroid:orientation=\"vertical\"\n\t\tandroid:layout_width=\"fill_parent\" \n\t\tandroid:layout_height=\"wrap_content\"\n\t\tandroid:paddingLeft=\"10sp\"\n\t\tandroid:paddingRight=\"10sp\"\n\t\tandroid:paddingBottom=\"15sp\"\n\t\tandroid:paddingTop=\"10sp\">\n\n\t<TextView\n\t\t\tandroid:id=\"@+id/Addcontact_Title\"\n\t\t\tandroid:layout_width=\"fill_parent\"\n\t\t\tandroid:layout_height=\"wrap_content\"\n\t\t\tandroid:text=\"@string/addFriend_Summ\"\n\t\t\tandroid:paddingBottom=\"20sp\"\n\t\t\tstyle=\"?attr/dialogTextColor\"\n\t\t/>\n\t<org.yaxim.androidclient.widget.AutoCompleteJidEdit\n\t\t\tandroid:id=\"@+id/AddContact_EditTextField\"\n\t\t\tandroid:layout_width=\"fill_parent\"\n\t\t\tandroid:layout_height=\"wrap_content\"\n\t\t\tandroid:layout_marginBottom=\"20sp\"\n\t\t\tandroid:gravity=\"left\"\n\t\t\tandroid:singleLine=\"true\"\n\t\t\tandroid:imeOptions=\"actionNext\"\n\t\t\tandroid:textSize=\"18sp\"\n\t\t\tandroid:maxWidth=\"200sp\"\n\t\t\tandroid:inputType=\"textEmailAddress\"\n\t\t\tandroid:hint=\"@string/Global_JID_hint\"\n\t\t\t/>\n\t\n\t<EditText\n\t\t\tandroid:id=\"@+id/AddContactAlias_EditTextField\"\n\t\t\tandroid:layout_width=\"fill_parent\"\n\t\t\tandroid:layout_height=\"wrap_content\"\n\t\t\tandroid:gravity=\"left\"\n\t\t\tandroid:layout_marginBottom=\"20sp\"\n\t\t\tandroid:singleLine=\"true\"\n\t\t\tandroid:textSize=\"18sp\"\n\t\t\tandroid:maxWidth=\"200sp\"\n\t\t\tandroid:hint=\"@string/addFriend_aliasHint\"\n\t\t\t/>\n\t\t<org.yaxim.androidclient.dialogs.GroupNameView\n\t\t\tandroid:id=\"@+id/AddRosterItem_GroupName\"\n\t\t\tandroid:layout_width=\"fill_parent\"\n\t\t\tandroid:layout_height=\"wrap_content\"\n\t\t\tandroid:orientation=\"vertical\"\n\t\t\t/>\n</LinearLayout>\n</ScrollView>\n"
  },
  {
    "path": "res/layout/chat_action_title.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Copyright (C) 2010 The Android Open Source Project\n\n     Licensed under the Apache License, Version 2.0 (the \"License\");\n     you may not use this file except in compliance with the License.\n     You may obtain a copy of the License at\n  \n          http://www.apache.org/licenses/LICENSE-2.0\n  \n     Unless required by applicable law or agreed to in writing, software\n     distributed under the License is distributed on an \"AS IS\" BASIS,\n     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n     See the License for the specific language governing permissions and\n     limitations under the License.\n-->\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\tandroid:layout_width=\"wrap_content\"\n\tandroid:layout_height=\"wrap_content\"\n\tandroid:orientation=\"horizontal\"\n\t>\n\n\t<ImageView android:id=\"@+id/action_bar_status\"\n\t\tandroid:layout_gravity=\"center_vertical|left\"\n\t\tandroid:layout_width=\"wrap_content\"\n\t\tandroid:paddingRight=\"4sp\"\n\t\tandroid:paddingEnd=\"4sp\"\n\t\tandroid:layout_height=\"wrap_content\" />\n\n\t<LinearLayout android:layout_width=\"wrap_content\"\n\t\tandroid:layout_height=\"wrap_content\"\n\t\tandroid:layout_gravity=\"center_vertical|left\"\n\t\tandroid:orientation=\"vertical\" >\n\n\t\t<TextView android:id=\"@+id/action_bar_title\"\n\t\t\tandroid:layout_width=\"wrap_content\"\n\t\t\tandroid:layout_height=\"wrap_content\"\n\t\t\tandroid:singleLine=\"true\"\n\t\t\tstyle=\"@style/TextAppearance.Widget.AppCompat.Toolbar.Title\"\n\t\t\tandroid:ellipsize=\"end\" />\n\t\t<TextView android:id=\"@+id/action_bar_subtitle\"\n\t\t\tandroid:layout_width=\"wrap_content\"\n\t\t\tandroid:layout_height=\"wrap_content\"\n\t\t\tandroid:layout_marginTop=\"-3sp\"\n\t\t\tandroid:layout_marginBottom=\"5dip\"\n\t\t\tandroid:singleLine=\"true\"\n\t\t\tandroid:ellipsize=\"end\"\n\t\t\tandroid:visibility=\"gone\" />\n\t</LinearLayout>\n</LinearLayout>\n"
  },
  {
    "path": "res/layout/chatrow.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\t\tandroid:layout_width=\"fill_parent\" android:padding=\"4sp\" \n\t\tandroid:layout_height=\"wrap_content\" android:orientation=\"vertical\"\n\t\tandroid:descendantFocusability=\"blocksDescendants\"\n\t\t>\n\n\t\t<LinearLayout android:layout_width=\"fill_parent\"\n\t\t\tandroid:layout_height=\"wrap_content\" android:orientation=\"horizontal\">\n\n\t\t\t<TextView android:id=\"@+id/chat_from\" android:layout_width=\"0sp\"\n\t\t\t\tandroid:layout_height=\"wrap_content\" android:layout_weight=\"1\"\n\t\t\t\tandroid:singleLine=\"true\"\n\t\t\t\tandroid:textSize=\"11sp\"\n\t\t\t\tandroid:textColor=\"#88f\"\n\t\t\t\tandroid:textStyle=\"bold\"\n\t\t\t\tandroid:ellipsize=\"end\" android:text=\"@string/chat_from_me\" />\n\n\t\t\t<TextView android:id=\"@+id/chat_date\" android:layout_width=\"wrap_content\"\n\t\t\t\tandroid:layout_height=\"wrap_content\"\n\t\t\t\tandroid:textSize=\"11sp\"\n\t\t\t\tandroid:paddingRight=\"6sp\"\n\t\t\t\tandroid:paddingEnd=\"6sp\"\n\t\t\t\t/>\n\n\t\t\t<ImageView\n\t\t\t    android:id=\"@+id/iconView\"\n\t\t\t    android:layout_width=\"wrap_content\"\n\t\t\t    android:layout_height=\"wrap_content\"\n\t\t\t    android:layout_gravity=\"center_vertical\"\n\t\t\t    android:layout_marginLeft=\"6sp\"\n\t\t\t    android:layout_marginStart=\"6sp\"\n\t\t\t    android:src=\"@drawable/ic_chat_msg_status_unread\" />\n\n\t\t</LinearLayout>\n\n\t\t<TextView android:id=\"@+id/chat_message\"\n\t\t\tstyle=\"?attr/ChatText\"\n\t\t\tandroid:layout_width=\"fill_parent\" android:layout_height=\"wrap_content\"\n\t\t\tandroid:gravity=\"center_vertical\" />\n\n\t\t<ImageView android:id=\"@+id/chat_image\"\n\t\t\tandroid:visibility=\"gone\"\n\t\t\tandroid:scaleType=\"fitCenter\"\n\t\t\tandroid:adjustViewBounds=\"true\"\n\t\t\tandroid:layout_width=\"fill_parent\"\n\t\t\tandroid:layout_height=\"wrap_content\"\n\t\t\tandroid:gravity=\"center_vertical\" />\n\n\t<TextView android:id=\"@+id/chat_error\"\n\t\t\t  style=\"?attr/ChatText\"\n\t\t\t  android:visibility=\"gone\"\n\t\t\t  android:layout_width=\"fill_parent\" android:layout_height=\"wrap_content\"\n\t\t\t  android:gravity=\"center_vertical\" />\n</LinearLayout>\n"
  },
  {
    "path": "res/layout/edittext_dialog.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\tandroid:id=\"@+id/layout_root\" android:orientation=\"vertical\"\n\tandroid:layout_width=\"fill_parent\" android:layout_height=\"fill_parent\"\n\tandroid:paddingLeft=\"15sp\"\n\tandroid:paddingStart=\"15sp\"\n\tandroid:paddingRight=\"15sp\"\n\tandroid:paddingEnd=\"15sp\"\n\tandroid:paddingBottom=\"15sp\"\n\tandroid:paddingTop=\"10sp\"\n\tandroid:layout_gravity=\"top\">\n\t<TextView android:id=\"@+id/text\" android:layout_width=\"wrap_content\"\n\t\tandroid:layout_height=\"wrap_content\"\n\t\tstyle=\"?attr/dialogTextColor\"\n\t\tandroid:gravity=\"top\" android:textSize=\"16sp\" android:paddingBottom=\"20sp\"/>\n\t<EditText\n\t\tandroid:layout_height=\"wrap_content\"\n\t\tandroid:id=\"@+id/editText\"\n\t\tandroid:layout_width=\"match_parent\"\n\t\t>\n\t\t<requestFocus></requestFocus>\n\t</EditText>\n</LinearLayout>\n"
  },
  {
    "path": "res/layout/firststartdialog.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<ScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\t\tandroid:orientation=\"vertical\"\n\t\tandroid:layout_width=\"fill_parent\"\n\t\tandroid:layout_height=\"wrap_content\"\n\t\tandroid:paddingLeft=\"10sp\"\n\t\tandroid:paddingStart=\"10sp\"\n\t\tandroid:paddingRight=\"10sp\"\n\t\tandroid:paddingEnd=\"10sp\"\n\t\tandroid:paddingBottom=\"15sp\"\n\t\tandroid:paddingTop=\"10sp\" >\n    <LinearLayout\n\t\tandroid:layout_width=\"fill_parent\"\n\t\tandroid:layout_height=\"wrap_content\"\n\t\tandroid:orientation=\"vertical\"\n\t\t>\n\t<TextView\n\t\t\tandroid:id=\"@+id/StartupDialog_Summary\"\n\t\t\tandroid:layout_width=\"wrap_content\"\n\t\t\tandroid:layout_height=\"wrap_content\"\n\t\t\tandroid:drawableLeft=\"@drawable/icon\"\n\t\t\tandroid:drawableStart=\"@drawable/icon\"\n\t\t\tandroid:text=\"@string/StartupDialog_Summary\"\n\t\t\tandroid:drawablePadding=\"10sp\"\n\t\t\tandroid:padding=\"10sp\"\n\t\t\tstyle=\"?attr/dialogTextColor\"\n\t\t\tandroid:focusable=\"true\"\n\t\t/>\n\t<TextView\n\t\t\tandroid:id=\"@+id/StartupDialog_Username_title\"\n\t\t\tandroid:layout_width=\"fill_parent\"\n\t\t\tandroid:layout_height=\"wrap_content\"\n\t\t\tandroid:text=\"@string/StartupDialog_Username_title\"\n\t\t\tandroid:padding=\"2sp\"\n\t\t\tstyle=\"?attr/dialogTextColor\"\n\t\t/>\n\t<org.yaxim.androidclient.widget.AutoCompleteJidEdit\n\t\t\tandroid:id=\"@+id/StartupDialog_JID_EditTextField\"\n\t\t\tandroid:layout_width=\"fill_parent\"\n\t\t\tandroid:layout_height=\"wrap_content\"\n\t\t\tandroid:padding=\"10sp\"\n\t\t\tandroid:gravity=\"left\"\n\t\t\tandroid:singleLine=\"true\"\n\t\t\tandroid:imeOptions=\"actionNext\"\n\t\t\tandroid:textSize=\"18sp\"\n\t\t\tandroid:maxWidth=\"200sp\"\n\t\t\tandroid:inputType=\"textEmailAddress\"\n\t\t\tandroid:hint=\"@string/Global_JID_hint\"\n\t\t\tandroid:contentDescription=\"@string/StartupDialog_Username_title\"/>\n\t<CheckBox\n\t\t\tandroid:id=\"@+id/create_account\"\n\t\t\tandroid:layout_width=\"fill_parent\"\n\t\t\tandroid:layout_height=\"wrap_content\"\n\t\t\tandroid:text=\"@string/StartupDialog_create_new\"\n\t\t\tstyle=\"?attr/dialogTextColor\"\n\t\t/>\n\t<TextView\n\t\t\tandroid:id=\"@+id/StartupDialog_passwd_title\"\n\t\t\tandroid:layout_width=\"fill_parent\"\n\t\t\tandroid:layout_height=\"wrap_content\"\n\t\t\tandroid:text=\"@string/StartupDialog_passwd_title\"\n\t\t\tandroid:padding=\"2sp\"\n\t\t\tstyle=\"?attr/dialogTextColor\"\n\t\t/>\n\t<EditText\n\t\t\tandroid:id=\"@+id/StartupDialog_PASSWD_EditTextField\"\n\t\t\tandroid:layout_width=\"fill_parent\"\n\t\t\tandroid:layout_height=\"wrap_content\"\n\t\t\tandroid:password=\"true\"\n\t\t\tandroid:padding=\"10sp\"\n\t\t\tandroid:gravity=\"left\"\n\t\t\tandroid:singleLine=\"true\"\n\t\t\tandroid:textSize=\"18sp\"\n\t\t\tandroid:maxWidth=\"200sp\"\n\t\t\tandroid:hint=\"@string/StartupDialog_pwHint\"\n\t\t\tandroid:contentDescription=\"@string/StartupDialog_passwd_title\"\n\t\t\t/>\n\t<CheckBox\n\t\t\tandroid:id=\"@+id/password_show\"\n\t\t\tandroid:layout_width=\"fill_parent\"\n\t\t\tandroid:layout_height=\"wrap_content\"\n\t\t\tandroid:text=\"@string/StartupDialog_pwshowHint\"\n\t\t\tstyle=\"?attr/dialogTextColor\"\n\t\t\t/>\n    </LinearLayout>\n</ScrollView>\n"
  },
  {
    "path": "res/layout/groupnameview.xml",
    "content": "<merge xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\t<Spinner android:id=\"@+id/groupspinner\" \n\t\tandroid:prompt=\"@string/AddContact_SpinnerPrompt\" \n\t\tandroid:layout_width=\"fill_parent\"\n\t\tandroid:layout_height=\"wrap_content\"\n\t\tandroid:layout_marginBottom=\"10sp\">\n\t</Spinner>\n\t<EditText\n\t\tandroid:id=\"@+id/newgroupinput\"\n\t\tandroid:layout_width=\"fill_parent\"\n\t\tandroid:layout_height=\"wrap_content\"\n\t\tandroid:visible=\"false\"\n\t\tandroid:enabled=\"false\"\n\t\tandroid:singleLine=\"true\"\n\t\tandroid:hint=\"@string/NewGroup_EditTextField_Hint\"\n\t\t/>\n</merge>\n"
  },
  {
    "path": "res/layout/main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<LinearLayout\n\txmlns:android=\"http://schemas.android.com/apk/res/android\"\n\tandroid:orientation=\"vertical\"\n\tandroid:layout_width=\"fill_parent\" \n\tandroid:layout_height=\"fill_parent\">\n    \n\t<TextView android:id=\"@+id/error_view\"\n\t\tandroid:layout_width=\"fill_parent\"\n\t\tandroid:layout_height=\"wrap_content\"\n\t\tstyle=\"?ErrorView\"\n\t\tandroid:visibility=\"gone\"\n\t\tandroid:text=\"\"\n\t\tandroid:maxLines = \"6\"\n\t\tandroid:onClick=\"onClickClipboard\"\n\t\tandroid:focusable=\"true\"/>\n\n\t<ExpandableListView android:id=\"@android:id/list\"\n\t\tandroid:layout_width=\"fill_parent\" \n\t\tandroid:layout_height=\"fill_parent\"\n\t\tandroid:scrollingCache=\"true\"\n\t\tandroid:focusable=\"true\"\n\t\tandroid:groupIndicator=\"@drawable/group_indicator\"\n\t\tandroid:fadingEdge=\"none\"\n\t\tandroid:cacheColorHint=\"#0000\"\n\t\tandroid:divider=\"#0000\"/>\n\n\t<TextView android:id=\"@android:id/empty\"\n\t\tandroid:layout_width=\"fill_parent\" \n\t\tandroid:layout_height=\"fill_parent\"\n\t\tandroid:gravity=\"center\"\n\t\tandroid:textSize=\"18sp\"\n\t\tandroid:text=\"@string/conn_empty_roster_hints\"/>\n</LinearLayout>\n"
  },
  {
    "path": "res/layout/mainchat.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<FrameLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <LinearLayout\n                  android:layout_width=\"fill_parent\"\n                  android:layout_height=\"fill_parent\"\n                  android:orientation=\"vertical\">\n\n        <ListView\n            android:id=\"@android:id/list\"\n            android:layout_width=\"fill_parent\"\n            android:layout_height=\"200sp\"\n            android:layout_weight=\"1\"\n            android:fastScrollEnabled=\"true\"\n            android:stackFromBottom=\"true\"\n            android:transcriptMode=\"normal\"\n            android:divider=\"#0000\"/>\n\n        <LinearLayout\n            android:id=\"@+id/details\"\n            android:layout_width=\"fill_parent\"\n            android:layout_height=\"wrap_content\"\n            android:baselineAligned=\"false\"\n            android:gravity=\"bottom\"\n            >\n\n            <EditText\n                android:id=\"@+id/Chat_UserInput\"\n                android:layout_width=\"200sp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"1\"\n                android:hint=\"@string/chat_enterMsgHint\"\n                android:inputType=\"textShortMessage|textAutoCorrect|textCapSentences|textMultiLine\"\n                >\n            </EditText>\n\n            <Button\n                android:id=\"@+id/Chat_SendButton\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:minWidth=\"60sp\"\n                android:text=\"@android:string/ok\"\n                />\n\n        </LinearLayout>\n\n    </LinearLayout>\n\n    <RelativeLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <ProgressBar\n            android:id=\"@+id/loading_progress\"\n            style=\"@android:style/Widget.ProgressBar.Large\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_centerInParent=\"true\"\n            android:visibility=\"gone\"/>\n    </RelativeLayout>\n</FrameLayout>\n"
  },
  {
    "path": "res/layout/mainchild_row.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\tandroid:orientation=\"horizontal\" android:layout_width=\"fill_parent\"\n\tandroid:layout_height=\"wrap_content\" android:gravity=\"center_vertical\">\n\n\t<RelativeLayout android:layout_width=\"52sp\" android:layout_height=\"wrap_content\">\n\t\t<TextView android:id=\"@+id/roster_unreadmsg_cnt\"\n\t\t\tstyle=\"@style/RosterMessageCounter\" />\n\t\t<ImageView android:id=\"@+id/roster_icon\"\n\t\t\tandroid:layout_width=\"wrap_content\" android:layout_height=\"wrap_content\"\n\t\t\tandroid:layout_marginEnd=\"4sp\"\n\t\t\tandroid:layout_marginRight=\"4sp\"\n\t\t\tandroid:longClickable=\"false\"\n\t\t\tandroid:paddingStart=\"12sp\"\n\t\t\tandroid:paddingLeft=\"12sp\"\n\t\t\t/>\n\t</RelativeLayout>\n\n\t<LinearLayout android:layout_width=\"fill_parent\"\n\t\tandroid:layout_height=\"wrap_content\" android:orientation=\"vertical\"\n\t\tandroid:minHeight=\"52sp\" android:layout_gravity=\"center_vertical\"\n\t\tandroid:gravity=\"center_vertical\">\n\n\t\t<LinearLayout android:layout_width=\"fill_parent\"\n\t\t\tandroid:layout_height=\"wrap_content\" android:orientation=\"horizontal\"\n\t\t\tandroid:layout_gravity=\"center_vertical\"\n\t\t\tandroid:gravity=\"center_vertical\">\n\n\t\t\t<TextView android:id=\"@+id/roster_screenname\"\n\t\t\t\tstyle=\"?attr/MainChild\"\n\t\t\t\tandroid:paddingStart=\"10sp\"\n\t\t\t\tandroid:paddingLeft=\"10sp\" android:longClickable=\"false\"\n\t\t\t\tandroid:layout_weight=\"1\"\n\t\t\t\tandroid:layout_width=\"fill_parent\"\n\t\t\t\tandroid:layout_height=\"wrap_content\" android:singleLine=\"true\" />\n\n\t\t\t<TextView android:id=\"@+id/roster_nusers\"\n\t\t\t\tstyle=\"?attr/MainChild\"\n\t\t\t\tandroid:visibility=\"gone\"\n\t\t\t\tandroid:layout_width=\"wrap_content\"\n\t\t\t\tandroid:layout_height=\"wrap_content\" android:singleLine=\"true\" />\n\t\t</LinearLayout>\n\n\t\t<TextView android:id=\"@+id/roster_statusmsg\"\n\t\t\tandroid:paddingStart=\"10sp\"\n\t\t\tandroid:paddingLeft=\"10sp\"\n\t\t\tandroid:textSize=\"13sp\" android:layout_width=\"fill_parent\"\n\t\t\tandroid:layout_height=\"wrap_content\" android:singleLine=\"true\"\n\t\t\tandroid:ellipsize=\"end\" android:visibility=\"gone\" \n\t\t\t/>\n\n\t</LinearLayout>\n</LinearLayout>\n"
  },
  {
    "path": "res/layout/maingroup_row.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\tandroid:orientation=\"horizontal\"\n\tandroid:layout_width=\"fill_parent\"\n\tandroid:layout_height=\"wrap_content\"\n\tandroid:gravity=\"center_vertical\"\n\tstyle=\"?attr/MainGroup\"\n\t>\n\n\t<TextView android:id=\"@+id/groupname\"\n\t\tstyle=\"@style/RosterGroupName\"\n\t\tandroid:paddingLeft=\"40sp\"\n\t\tandroid:paddingStart=\"40sp\"\n\t\tandroid:paddingRight=\"4sp\"\n\t\tandroid:paddingEnd=\"4sp\"\n\t\tandroid:layout_weight=\"1\"\n\t\tandroid:layout_width=\"100sp\"\n\t\tandroid:layout_height=\"wrap_content\"\n\t\tandroid:singleLine=\"true\"\n\t\tandroid:ellipsize=\"end\"\n\t\t/>\n\n\t<ProgressBar\n\t\tandroid:id=\"@+id/loading_progress\"\n\t\tstyle=\"@android:style/Widget.ProgressBar.Small\"\n\t\tandroid:layout_width=\"wrap_content\"\n\t\tandroid:layout_height=\"wrap_content\"\n\t\tandroid:layout_centerInParent=\"true\"\n\t\tandroid:visibility=\"gone\"\n\t\t/>\n\n\t<TextView android:id=\"@+id/members\"\n\t\tstyle=\"@style/RosterGroupName\"\n\t\tandroid:paddingRight=\"6sp\"\n\t\tandroid:paddingEnd=\"6sp\"\n\t\tandroid:paddingLeft=\"4sp\"\n\t\tandroid:paddingStart=\"4sp\"\n\t\tandroid:layout_width=\"wrap_content\"\n\t\tandroid:layout_height=\"wrap_content\"\n\t\t/>\n\n</LinearLayout>\n"
  },
  {
    "path": "res/layout/moverosterentrytogroupview.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\" \n\t\tandroid:id=\"@+id/moverosterentrytogroupview\" \n\t\tandroid:orientation=\"vertical\"\n\t\tandroid:paddingTop=\"10sp\"\n\t\tandroid:paddingLeft=\"10sp\"\n\t\tandroid:paddingRight=\"10sp\"\n\t\tandroid:paddingBottom=\"10sp\"\n\t\tandroid:layout_width=\"fill_parent\" \n\t\tandroid:layout_height=\"fill_parent\">\n\n\t\t<TextView\n\t\t\tandroid:id=\"@+id/moverosterentrytogroupview_summary\"\n\t\t\tandroid:layout_width=\"fill_parent\"\n\t\t\tandroid:layout_height=\"wrap_content\"\n\t\t\tandroid:text=\"@string/MoveRosterEntryToGroupDialog_summ\"\n\t\t\tandroid:layout_marginBottom=\"10sp\"\n\t\t\tandroid:focusable=\"true\"\n\t\t\tstyle=\"?attr/dialogTextColor\"\n\t\t\t/>\n\t\t<org.yaxim.androidclient.dialogs.GroupNameView\n\t\t\tandroid:id=\"@+id/moverosterentrytogroupview_gv\"\n\t\t\tandroid:layout_width=\"fill_parent\"\n\t\t\tandroid:layout_height=\"wrap_content\"\n\t\t\tandroid:orientation=\"vertical\"\n\t\t\t/>\n\t</LinearLayout>\n"
  },
  {
    "path": "res/layout/muc_new_dialog.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    android:paddingLeft=\"10sp\"\n    android:paddingRight=\"10sp\"\n    android:paddingBottom=\"15sp\"\n    android:paddingTop=\"10sp\"\n    >\n\n    <TextView\n\tandroid:id=\"@+id/muc_invitation\"\n\tandroid:layout_width=\"match_parent\"\n\tandroid:layout_height=\"wrap_content\"\n\tandroid:layout_marginBottom=\"15sp\"\n\tandroid:visibility=\"gone\"\n\t/>\n    <org.yaxim.androidclient.widget.AutoCompleteJidEdit\n\tandroid:id=\"@+id/muc_new_jid\"\n\tandroid:layout_width=\"match_parent\"\n\tandroid:layout_height=\"wrap_content\"\n\tandroid:layout_marginBottom=\"15sp\"\n\tandroid:singleLine=\"true\"\n\tandroid:hint=\"@string/muc_jid_hint\"\n\tandroid:contentDescription=\"@string/muc_jid_hint\"\n\tandroid:inputType=\"textEmailAddress\"\n\t/>\n\n    <TextView\n\tandroid:id=\"@+id/muc_status\"\n\tandroid:layout_width=\"match_parent\"\n\tandroid:layout_height=\"wrap_content\"\n\tandroid:layout_marginBottom=\"15sp\"\n\tandroid:visibility=\"gone\"\n\t/>\n    <EditText\n\tandroid:id=\"@+id/muc_new_nick\"\n\tandroid:layout_width=\"match_parent\"\n\tandroid:layout_height=\"wrap_content\"\n\tandroid:layout_marginBottom=\"15sp\"\n\tandroid:singleLine=\"true\"\n\tandroid:contentDescription=\"@string/muc_nickname_hint\"\n\tandroid:hint=\"@string/muc_nickname_hint\" />\n\n    <EditText\n\tandroid:id=\"@+id/muc_new_pw\"\n\tandroid:layout_width=\"match_parent\"\n\tandroid:layout_height=\"wrap_content\"\n\tandroid:singleLine=\"true\"\n\tandroid:contentDescription=\"@string/muc_password_hint\"\n\tandroid:hint=\"@string/muc_password_hint\"\n\tandroid:inputType=\"textPassword\" />\n\n\t<CheckBox\n\t\tandroid:id=\"@+id/password_show\"\n\t\tstyle=\"?attr/dialogTextColor\"\n\t\tandroid:layout_width=\"match_parent\"\n\t\tandroid:layout_height=\"wrap_content\"\n\t\tandroid:text=\"@string/StartupDialog_pwshowHint\"\n\t\t/>\n\n</LinearLayout>\n"
  },
  {
    "path": "res/layout/password_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\tandroid:id=\"@+id/StartupDialog_ScrollView\" \n\tandroid:layout_height=\"wrap_content\" \n\tandroid:layout_width=\"fill_parent\" >\n\t<LinearLayout \n\t\tandroid:orientation=\"vertical\"\n\t\tandroid:layout_width=\"fill_parent\" \n\t\tandroid:layout_height=\"wrap_content\"\n\t\tandroid:paddingLeft=\"10sp\"\n\t\tandroid:paddingStart=\"10sp\"\n\t\tandroid:paddingRight=\"10sp\"\n\t\tandroid:paddingEnd=\"10sp\"\n\t\tandroid:paddingBottom=\"15sp\"\n\t\tandroid:paddingTop=\"10sp\" >\n\n\t\t<CheckBox\n\t\t\tandroid:id=\"@+id/password_change_on_server\"\n\t\t\tandroid:layout_width=\"fill_parent\"\n\t\t\tandroid:layout_height=\"wrap_content\"\n\t\t\tandroid:text=\"@string/account_jabberPW_change_on_server\"\n\t\t\tstyle=\"?attr/dialogTextColor\"\n\t\t\t/>\n\n\t\t<TextView\n\t\t\tandroid:layout_width=\"fill_parent\"\n\t\t\tandroid:layout_height=\"wrap_content\"\n\t\t\tandroid:visibility=\"gone\"\n\t\t\tandroid:text=\"@string/account_jabberPW_password_old\"\n\t\t\tandroid:padding=\"2sp\"\n\t\t\tstyle=\"?attr/dialogTextColor\"\n\t\t\t/>\n\t\t<EditText\n\t\t\tandroid:id=\"@+id/password_old\"\n\t\t\tandroid:layout_width=\"fill_parent\"\n\t\t\tandroid:layout_height=\"wrap_content\"\n\t\t\tandroid:visibility=\"gone\"\n\t\t\tandroid:inputType=\"textPassword\"\n\t\t\tandroid:padding=\"10sp\"\n\t\t\tandroid:singleLine=\"true\"\n\t\t\t/>\n\n\t\t<TextView\n\t\t\tandroid:layout_width=\"fill_parent\"\n\t\t\tandroid:layout_height=\"wrap_content\"\n\t\t\tandroid:text=\"@string/account_jabberPW_password_new\"\n\t\t\tandroid:padding=\"2sp\"\n\t\t\tstyle=\"?attr/dialogTextColor\"\n\t\t\t/>\n\t\t<EditText\n\t\t\tandroid:id=\"@+id/password_new\"\n\t\t\tandroid:layout_width=\"fill_parent\"\n\t\t\tandroid:layout_height=\"wrap_content\"\n\t\t\tandroid:padding=\"10sp\"\n\t\t\tandroid:inputType=\"textPassword\"\n\t\t\tandroid:singleLine=\"true\"\n\t\t\tandroid:hint=\"@string/StartupDialog_pwHint\"\n\t\t\t/>\n\t\t<CheckBox\n\t\t\tandroid:id=\"@+id/password_show\"\n\t\t\tandroid:layout_width=\"fill_parent\"\n\t\t\tandroid:layout_height=\"wrap_content\"\n\t\t\tandroid:text=\"@string/StartupDialog_pwshowHint\"\n\t\t\tstyle=\"?attr/dialogTextColor\"\n\t\t\t/>\n\n\t\t<TextView\n\t\t    android:id=\"@+id/password_warning\"\n\t\t    style=\"?attr/dialogTextColor\"\n\t\t    android:layout_width=\"fill_parent\"\n\t\t    android:layout_height=\"wrap_content\"\n\t\t    android:padding=\"2sp\"\n\t\t    android:text=\"@string/account_jabberPW_warning\"\n\t\t    android:textColor=\"#b00\"\n\t\t    android:textStyle=\"bold\" />\n\n\t</LinearLayout>\n</ScrollView>\n"
  },
  {
    "path": "res/layout/qrcode_dialog.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\tandroid:id=\"@+id/layout_root\" android:orientation=\"vertical\"\n\tandroid:layout_width=\"fill_parent\" android:layout_height=\"fill_parent\"\n\tandroid:paddingLeft=\"15sp\"\n\tandroid:paddingStart=\"15sp\"\n\tandroid:paddingRight=\"15sp\"\n\tandroid:paddingEnd=\"15sp\"\n\tandroid:paddingBottom=\"15sp\"\n\tandroid:paddingTop=\"10sp\"\n\tandroid:layout_gravity=\"top\">\n\n\t<ImageView\n\t\tandroid:id=\"@+id/qr_code\"\n\t\tandroid:layout_width=\"wrap_content\"\n\t\tandroid:layout_height=\"wrap_content\"\n\t\tandroid:adjustViewBounds=\"true\"\n\t\tandroid:gravity=\"center_vertical\"\n\t\tandroid:scaleType=\"centerInside\"/>\n\n\t<TextView android:id=\"@+id/text\"\n\t\tandroid:layout_width=\"fill_parent\"\n\t\tandroid:layout_height=\"wrap_content\"\n\t\tstyle=\"?attr/dialogTextColor\"\n\t\tandroid:gravity=\"center\"\n\t\tandroid:textSize=\"20sp\"\n\t\tandroid:paddingTop=\"20sp\"\n\t\tandroid:paddingBottom=\"20sp\"/>\n</LinearLayout>\n"
  },
  {
    "path": "res/layout/status_action_provider.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\" >\n\n    <ImageButton\n        android:id=\"@+id/button\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentLeft=\"true\"\n        android:layout_alignParentTop=\"true\"\n        android:src=\"@drawable/ic_status_offline\"\n        android:background=\"@android:color/transparent\" />\n\n</RelativeLayout>"
  },
  {
    "path": "res/layout/status_spinner_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"fill_parent\"\n    android:layout_height=\"wrap_content\"\n    android:orientation=\"horizontal\"\n    android:padding=\"6dip\">\n  <ImageView\n      android:id=\"@+id/status_icon\"\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\" />\n  <TextView\n      android:id=\"@+id/status_text\"\n      style=\"?android:attr/spinnerItemStyle\"\n      android:layout_width=\"fill_parent\"\n      android:layout_height=\"fill_parent\"\n      android:gravity=\"center_vertical\"\n      android:layout_marginLeft=\"10dip\" />\n</LinearLayout>\n"
  },
  {
    "path": "res/layout/statusview.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\" \n\t\tandroid:layout_width=\"fill_parent\" \n\t\tandroid:layout_height=\"fill_parent\"\n\t\t>\n<LinearLayout\n\t\tandroid:id=\"@+id/statusLayout\" \n\t\tandroid:orientation=\"vertical\"\n\t\tandroid:layout_width=\"fill_parent\" \n\t\tandroid:minWidth=\"240sp\" \n\t\tandroid:layout_height=\"fill_parent\"\n\t\tandroid:paddingLeft=\"10sp\"\n\t\tandroid:paddingRight=\"10sp\"\n\t\tandroid:paddingBottom=\"15sp\"\n\t\tandroid:paddingTop=\"10sp\"\n\t\t>\n\n\t<CheckBox\n\t\tandroid:id=\"@+id/statusview_dnd_when_silent\"\n\t\tandroid:layout_width=\"fill_parent\"\n\t\tandroid:layout_height=\"wrap_content\"\n\t\tandroid:text=\"@string/pref_dnd_when_silent\"\n\t\tandroid:visibility=\"gone\"\n\t\tstyle=\"?attr/dialogTextColor\"\n\t\t/>\n\t<Spinner android:id=\"@+id/statusview_spinner\"\n\t\tandroid:layout_height=\"wrap_content\"\n\t\tandroid:layout_width=\"fill_parent\"\n\t\tandroid:prompt=\"@string/setStatusTitle\"\n\t\tandroid:layout_marginBottom=\"15sp\"\n\t/>\n\n\t<RelativeLayout\n\t    android:layout_width=\"fill_parent\"\n\t    android:layout_height=\"wrap_content\"\n\t    android:layout_marginBottom=\"15sp\"\n\t    >\n\t  <AutoCompleteTextView android:id=\"@+id/statusview_message\"\n\t\tandroid:layout_height=\"wrap_content\"\n\t\tandroid:layout_width=\"fill_parent\"\n\t\tandroid:hint=\"@string/setStatusmsgHint\"\n\t\tandroid:inputType=\"textCapSentences\"\n\t\tandroid:singleLine=\"true\"\n\t\tandroid:imeOptions=\"actionDone\"\n\t  />\n\t  <Button\n\t      android:id=\"@+id/statusview_message_button_clear\"\n\t      android:layout_width=\"30dip\"\n\t      android:layout_height=\"30dip\"\n\t      android:layout_alignParentEnd=\"true\"\n\t      android:layout_alignParentRight=\"true\"\n\t      android:background=\"@android:drawable/ic_menu_close_clear_cancel\"\n\t      android:layout_centerVertical=\"true\"\n\t      android:layout_marginRight=\"5dip\"\n\t      />\n\t</RelativeLayout>\n\n</LinearLayout>\n</ScrollView>\n"
  },
  {
    "path": "res/menu/chat_contextmenu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\t<item android:id=\"@+id/chat_contextmenu_copy_text\"\n\t\tandroid:title=\"@android:string/copy\">\n\t</item>\n\t<item android:id=\"@+id/chat_contextmenu_quote\" android:title=\"@string/chatmenu_quote\" />\n\t<item android:id=\"@+id/chat_contextmenu_resend\" android:title=\"@string/chatmenu_resend\"></item>\n</menu>\n"
  },
  {
    "path": "res/menu/contact_options.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\t<item   android:id=\"@+id/roster_contextmenu_contact_request_auth\"\n\t\tandroid:title=\"@string/roster_contextmenu_contact_request_auth\"\n\t\tandroid:icon=\"@drawable/ic_action_person_add\"\n\t\tandroid:orderInCategory=\"4\"\n\t\t/>\n\n\t<item   android:id=\"@+id/roster_contextmenu_contact_rename\"\n\t\tandroid:title=\"@string/roster_contextmenu_contact_rename\"\n\t\tandroid:orderInCategory=\"4\"\n\t\t/>\n\n\t<item   android:id=\"@+id/roster_contextmenu_contact_change_group\"\n\t\tandroid:title=\"@string/roster_contextmenu_contact_change_group\"\n\t\tandroid:orderInCategory=\"4\"\n\t\t/>\n\n\t<item   android:id=\"@+id/roster_contextmenu_ringtone\"\n\t\t\tandroid:title=\"@string/roster_contextmenu_contact_ringtone\"\n\t\t\tandroid:icon=\"@android:drawable/ic_menu_edit\"\n\t\t\tandroid:orderInCategory=\"5\"\n\t\t/>\n\t<item   android:id=\"@+id/roster_contextmenu_contact_share\"\n\t\tandroid:title=\"@string/roster_contextmenu_contact_share\"\n\t\tandroid:icon=\"@android:drawable/ic_menu_share\"\n\t\tandroid:orderInCategory=\"9\"\n\t\t/>\n\n\t<item   android:id=\"@+id/roster_contextmenu_contact_delete\"\n\t\tandroid:title=\"@string/roster_contextmenu_contact_delete\"\n\t\tandroid:orderInCategory=\"10\"\n\t\t/>\n</menu>\n"
  },
  {
    "path": "res/menu/muc_options.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n      xmlns:app=\"http://schemas.android.com/apk/res-auto\" >\n\t<item android:id=\"@+id/chat_optionsmenu_userlist\"\n\t\tandroid:title=\"@string/Menu_userlist\"\n\t\tandroid:icon=\"@drawable/ic_action_contacts_online\"\n\t\tapp:showAsAction=\"ifRoom\" />\n\t<item   android:id=\"@+id/roster_contextmenu_muc_edit\"\n\t\tandroid:title=\"@string/roster_contextmenu_muc_edit\"\n\t\tandroid:icon=\"@android:drawable/ic_menu_preferences\"\n\t\tandroid:orderInCategory=\"4\"\n\t\t/>\n\t<item   android:id=\"@+id/roster_contextmenu_muc_ringtone\"\n\t\t\tandroid:title=\"@string/roster_contextmenu_contact_ringtone\"\n\t\t\tandroid:icon=\"@android:drawable/ic_menu_edit\"\n\t\t\tandroid:orderInCategory=\"5\"\n\t\t/>\n\t<item   android:id=\"@+id/roster_contextmenu_muc_share\"\n\t\tandroid:title=\"@string/roster_contextmenu_contact_share\"\n\t\tandroid:icon=\"@android:drawable/ic_menu_share\"\n\t\tandroid:orderInCategory=\"9\"\n\t\t/>\n\n\t<item   android:id=\"@+id/roster_contextmenu_muc_leave\"\n\t\tandroid:title=\"@string/roster_contextmenu_muc_leave\"\n\t\tandroid:icon=\"@android:drawable/ic_menu_close_clear_cancel\"\n\t\tandroid:orderInCategory=\"10\"\n\t\t/>\n</menu>\n"
  },
  {
    "path": "res/menu/noncontact_options.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n      xmlns:app=\"http://schemas.android.com/apk/res-auto\" >\n\t<item android:id=\"@+id/menu_add_friend\" android:title=\"@string/Menu_addFriend\"\n\t\tandroid:icon=\"@drawable/ic_action_person_add\"\n\t\tandroid:orderInCategory=\"4\"\n\t\tapp:showAsAction=\"always\"\n\t\t/>\n\n\t<item   android:id=\"@+id/roster_contextmenu_contact_share\"\n\t\tandroid:title=\"@string/roster_contextmenu_contact_share\"\n\t\tandroid:icon=\"@android:drawable/ic_menu_share\"\n\t\tandroid:orderInCategory=\"9\"\n\t\t/>\n</menu>\n"
  },
  {
    "path": "res/menu/roster_group_contextmenu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\t\t<item android:id=\"@+id/roster_contextmenu_group_rename\"\n\t\t\tandroid:title=\"@string/roster_contextmenu_group_rename\">\n\t\t</item>\n</menu>\n"
  },
  {
    "path": "res/menu/roster_item_contextmenu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n      xmlns:app=\"http://schemas.android.com/apk/res-auto\" >\n\t<group android:id=\"@+id/roster_contextmenu_item_menu\" android:orderInCategory=\"1\">\n\t\t<item   android:id=\"@+id/app_bar_search\"\n\t\t\tapp:actionViewClass=\"android.support.v7.widget.SearchView\"\n\t\t\tapp:showAsAction=\"never|collapseActionView\"\n\t\t\tandroid:icon=\"@drawable/ic_action_search\"\n\t\t\tandroid:orderInCategory=\"2\"\n\t\t\tandroid:title=\"@android:string/search_go\"/>\n\t\t<item   android:id=\"@+id/roster_contextmenu_contact_mark_as_read\"\n\t\t\tandroid:title=\"@string/roster_contextmenu_contact_mark_as_read\"\n\t\t\tandroid:orderInCategory=\"2\"\n\t\t\t/>\n\t\t<item   android:id=\"@+id/roster_contextmenu_contact_delmsg\"\n\t\t\tandroid:title=\"@string/roster_contextmenu_contact_delmsg\"\n\t\t\tandroid:orderInCategory=\"2\"\n\t\t\t/>\n\t\t<item   android:id=\"@+id/roster_contextmenu_send\"\n\t\t\tandroid:title=\"@string/roster_contextmenu_send\"\n\t\t\tandroid:icon=\"@drawable/ic_action_attach\"\n\t\t\tapp:showAsAction=\"always\"\n\t\t\tandroid:orderInCategory=\"1\"\n\t\t\tandroid:visible=\"false\"\n\t\t\t>\n\t\t\t<menu>\n\t\t\t\t<item\n\t\t\t\t\tandroid:id=\"@+id/roster_contextmenu_take_image\"\n\t\t\t\t\tandroid:icon=\"@drawable/ic_action_camera\"\n\t\t\t\t\tandroid:title=\"@string/roster_contextmenu_take_image\"\n\t\t\t\t\t/>\n\t\t\t\t<item\n\t\t\t\t\tandroid:id=\"@+id/roster_contextmenu_send_image\"\n\t\t\t\t\tandroid:icon=\"@drawable/ic_action_photo\"\n\t\t\t\t\tandroid:title=\"@string/roster_contextmenu_send_image\"\n\t\t\t\t\t/>\n\t\t\t\t<item\n\t\t\t\t\tandroid:id=\"@+id/roster_contextmenu_send_file\"\n\t\t\t\t\tandroid:icon=\"@drawable/ic_action_file\"\n\t\t\t\t\tandroid:title=\"@string/roster_contextmenu_send_file\"\n\t\t\t\t\t/>\n\t\t\t</menu>\n\t\t</item>\n\t</group>\n</menu>\n"
  },
  {
    "path": "res/menu/roster_options.xml",
    "content": "<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n      xmlns:app=\"http://schemas.android.com/apk/res-auto\" >\n\t<item android:id=\"@+id/menu_show_hide\" android:title=\"@string/Menu_HideOff\"\n\t\tandroid:alphabeticShortcut=\"o\"\n\t\tandroid:icon=\"@android:drawable/ic_menu_delete\" app:showAsAction=\"ifRoom\"/>\n\n\t<item android:id=\"@+id/menu_connect\" android:title=\"@string/Menu_connect\"\n\t\tandroid:alphabeticShortcut=\"c\"\n\t\t/>\n\n\t<item android:id=\"@+id/menu_add_clipboard\" android:title=\"@string/Menu_addClipboard\"\n\t\tandroid:visible=\"false\"\n\t\tandroid:icon=\"@drawable/ic_action_person_add\" />\n\n\t<item android:id=\"@+id/menu_add_friend\" android:title=\"@string/Menu_addFriend\"\n\t\tandroid:alphabeticShortcut=\"a\"\n\t\tandroid:icon=\"@drawable/ic_action_person_add\" />\n\n\t<item android:id=\"@+id/menu_matrix\" android:title=\"@string/Menu_matrix\" \n\t    />\n\n\t<item android:id=\"@+id/menu_muc\" android:title=\"@string/Menu_muc\" \n\t    android:alphabeticShortcut=\"t\" />\n\n\t<item android:id=\"@+id/menu_send_invitation\" android:title=\"@string/Menu_send_invitation\" \n\t    android:alphabeticShortcut=\"s\" />\n\n\t<item android:id=\"@+id/menu_markallread\" android:title=\"@string/Menu_mark_all_as_read\"\n\t\tandroid:alphabeticShortcut=\"m\"/>\n\n\t<item android:id=\"@+id/menu_settings\" android:title=\"@string/Menu_Settings\"\n\t\tandroid:alphabeticShortcut=\"p\"\n\t\tandroid:icon=\"@android:drawable/ic_menu_preferences\" />\n\n\t<item android:id=\"@+id/menu_about\" android:title=\"@string/Menu_about\"\n\t\tandroid:alphabeticShortcut=\"y\"\n\t\tandroid:icon=\"@drawable/about\" />\n\n\t<item android:id=\"@+id/menu_exit\" android:title=\"@string/Global_Exit\"\n\t\tandroid:alphabeticShortcut=\"x\"\n\t\tandroid:icon=\"@android:drawable/ic_menu_close_clear_cancel\" />\n\n</menu>\n"
  },
  {
    "path": "res/values/array.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\" tools:ignore=\"MissingTranslation\">\n\t<string-array name=\"vibr_values\">\n\t\t<item>OFF</item>\n\t\t<item>SYSTEM</item>\n\t\t<item>ALWAYS</item>\n\t</string-array>\n</resources>\n"
  },
  {
    "path": "res/values/attrs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<!-- View styles -->\n\t<attr name=\"MainGroup\" format=\"reference\" />\n\t<attr name=\"MainChild\" format=\"reference\" />\n\t<attr name=\"ErrorView\" format=\"reference\" />\n\t<attr name=\"ChatText\" format=\"reference\" />\n\t<attr name=\"dialogTextColor\" format=\"reference\" />\n\t\n\t<!-- Attributes -->\n\t<attr name=\"ChatMsgHeaderMeColor\" format=\"reference|color\" />\n\t<attr name=\"ChatMsgHeaderYouColor\" format=\"reference|color\" />\n\t<attr name=\"ChatNewMessageColor\" format=\"reference|color\" />\n\t<attr name=\"ChatStoredMessageColor\" format=\"reference|color\" />\n</resources>\n"
  },
  {
    "path": "res/values/developers.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\" tools:ignore=\"MissingTranslation\">\n<string name=\"AboutDialog_DevelopersList\">• Christian Polzer\n\\n• Daniel Dorau\n\\n• Daniel Michalik\n\\n• Felix Knecht\n\\n• Georg Lukas\n\\n• Jan Kiszka\n\\n• Michael Kanis\n\\n• Nolan Darilek\n\\n• Sven Pfleiderer\n</string>\n<string name=\"yaxim_muc\">yaxim@chat.yax.im</string>\n</resources>\n"
  },
  {
    "path": "res/values/prefArrays.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\" tools:ignore=\"MissingTranslation\">\n\n    <string-array name=\"fontSizesChatCodes\">\n        <item>14</item>\n        <item>18</item>\n        <item>22</item>\n        <item>30</item>\n    </string-array>\n    <!--\n    <string-array name=\"fontSizesClist\">\n        <item>6px</item>\n        <item>8px</item>\n        <item>10px</item>\n        <item>12px</item>\n        <item>14px</item>\n    </string-array>\n    <string-array name=\"fontSizesClistCodes\">\n        <item>6</item>\n        <item>8</item>\n        <item>10</item>\n        <item>12</item>\n        <item>14</item>\n    </string-array> -->\n    <string-array name=\"pref_theme_entries\">\n\t<item>@string/pref_theme_dark</item>\n\t<item>@string/pref_theme_light</item>\n    </string-array>\n    <string-array name=\"pref_theme_values\">\n        <item>dark</item>\n        <item>light</item>\n    </string-array>\n\n</resources>\n"
  },
  {
    "path": "res/values/servers.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\" tools:ignore=\"MissingTranslation\">\n\t<string-array name=\"xmpp_servers\">\n\t\t<item>yax.im</item>\n\t\t<!-- snip -->\n\t\t<!-- :r!curl -s http://xmpp.net/services.xml | xml2 | awk -F= '/@jid=/ { print \"\\t\\t<item>\" $2 \"</item>\" }' | sort -n -->\n\t\t<item>0nl1ne.at</item>\n\t\t<item>blah.im</item>\n\t\t<item>boese-ban.de</item>\n\t\t<item>brauchen.info</item>\n\t\t<item>ch3kr.net</item>\n\t\t<item>chatme.im</item>\n\t\t<item>chrome.pl</item>\n\t\t<item>climm.org</item>\n\t\t<item>coderollers.com</item>\n\t\t<item>codingteam.net</item>\n\t\t<item>comm.unicate.me</item>\n\t\t<item>creep.im</item>\n\t\t<item>deshalbfrei.org</item>\n\t\t<item>draugr.de</item>\n\t\t<item>einfachjabber.de</item>\n\t\t<item>forumanalogue.fr</item>\n\t\t<item>im.apinc.org</item>\n\t\t<item>im.flosoft.biz</item>\n\t\t<item>internet-exception.de</item>\n\t\t<item>is-a-furry.org</item>\n\t\t<item>jabb3r.net</item>\n\t\t<item>jabberafrica.org</item>\n\t\t<item>jabber.at</item>\n\t\t<item>jabber-br.org</item>\n\t\t<item>jabber.chaotic.de</item>\n\t\t<item>jabber.co.nz</item>\n\t\t<item>jabber.cz</item>\n\t\t<item>jabber.de</item>\n\t\t<item>jabberd.eu</item>\n\t\t<item>jabber.earth.li</item>\n\t\t<item>jabberes.org</item>\n\t\t<item>jabber.etighichat.com</item>\n\t\t<item>jabber.fourecks.de</item>\n\t\t<item>jabber.gate31.net</item>\n\t\t<item>jabber-hosting.de</item>\n\t\t<item>jabber.hot-chilli.net</item>\n\t\t<item>jabber.iitsp.com</item>\n\t\t<item>jabber.i-pobox.net</item>\n\t\t<item>jabber.loudas.com</item>\n\t\t<item>jabber.me</item>\n\t\t<item>jabber.meta.net.nz</item>\n\t\t<item>jabber.minus273.org</item>\n\t\t<item>jabber.no</item>\n\t\t<item>jabber.no-sense.net</item>\n\t\t<item>jabber.org</item>\n\t\t<item>jabberpl.org</item>\n\t\t<item>jabber.rootbash.com</item>\n\t\t<item>jabber.rueckgr.at</item>\n\t\t<item>jabber.scha.de</item>\n\t\t<item>jabber.schnied.net</item>\n\t\t<item>jabber.second-home.de</item>\n\t\t<item>jabber.smash-net.org</item>\n\t\t<item>jabber.sow.as</item>\n\t\t<item>jabber.theforest.us</item>\n\t\t<item>jabber.tmkis.com</item>\n\t\t<item>jabber.yeahnah.co.nz</item>\n\t\t<item>jabbim.com</item>\n\t\t<item>jabbim.cz</item>\n\t\t<item>jabbim.hu</item>\n\t\t<item>jabbim.pl</item>\n\t\t<item>jabbim.sk</item>\n\t\t<item>jabin.org</item>\n\t\t<item>jabme.de</item>\n\t\t<item>jabster.pl</item>\n\t\t<item>jaim.at</item>\n\t\t<item>jappix.com</item>\n\t\t<item>jisshi.com</item>\n\t\t<item>labnote.org</item>\n\t\t<item>lightwitch.org</item>\n\t\t<item>limun.org</item>\n\t\t<item>linuxlovers.at</item>\n\t\t<item>lsd-25.ru</item>\n\t\t<item>macjabber.de</item>\n\t\t<item>mayplaces.com</item>\n\t\t<item>miqote.com</item>\n\t\t<item>na-di.de</item>\n\t\t<item>neko.im</item>\n\t\t<item>netmindz.net</item>\n\t\t<item>njs.netlab.cz</item>\n\t\t<item>palemoon.net</item>\n\t\t<item>palita.net</item>\n\t\t<item>pandion.im</item>\n\t\t<item>pidgin.su</item>\n\t\t<item>programmer-art.org</item>\n\t\t<item>prosody.de</item>\n\t\t<item>richim.org</item>\n\t\t<item>rkquery.de</item>\n\t\t<item>sss.chaoslab.ru</item>\n\t\t<item>sternenschweif.de</item>\n\t\t<item>suchat.org</item>\n\t\t<item>swissjabber.ch</item>\n\t\t<item>swissjabber.de</item>\n\t\t<item>swissjabber.eu</item>\n\t\t<item>swissjabber.li</item>\n\t\t<item>swissjabber.org</item>\n\t\t<item>tcweb.org</item>\n\t\t<item>tekst.me</item>\n\t\t<item>thiessen.im</item>\n\t\t<item>thiessen.it</item>\n\t\t<item>thiessen.org</item>\n\t\t<item>tigase.im</item>\n\t\t<item>twattle.net</item>\n\t\t<item>ubuntu-jabber.de</item>\n\t\t<item>ubuntu-jabber.net</item>\n\t\t<item>univers-libre.net</item>\n\t\t<item>uprod.biz</item>\n\t\t<item>verdammung.org</item>\n\t\t<item>wtfismyip.com</item>\n\t\t<item>xabber.de</item>\n\t\t<item>xmpp-hosting.de</item>\n\t\t<item>xmpp.jp</item>\n\t\t<item>xmppnet.de</item>\n\t\t<item>xmpp.ru.net</item>\n\t\t<item>zauris.ru</item>\n\t\t<item>zsim.de</item>\n\t\t<!-- snap -->\n\t</string-array>\n\t<string-array name=\"muc_services\">\n\t\t<item>chat.yax.im</item>\n\t\t<!-- Top50 domains manually extracted from http://search.wensley.org.uk/chat/ -->\n\t\t<!-- snip -->\n\t\t<item>chat.jabberfr.org</item>\n\t\t<item>conference.1big.ru</item>\n\t\t<item>conference.allegro.pl</item>\n\t\t<item>conference.boese-ban.de</item>\n\t\t<item>conference.chat.bytemark.co.uk</item>\n\t\t<item>conference.chatme.im</item>\n\t\t<item>conference.codingteam.net</item>\n\t\t<item>conference.draugr.de</item>\n\t\t<item>conference.dukgo.com</item>\n\t\t<item>conference.fnal.gov</item>\n\t\t<item>conference.freize.org</item>\n\t\t<item>conference.gentoo.ru</item>\n\t\t<item>conference.ik.nu</item>\n\t\t<item>conference.i-pobox.net</item>\n\t\t<item>conference.jabber.bol.ru</item>\n\t\t<item>conference.jabber.ccc.de</item>\n\t\t<item>conference.jabber.dn.ua</item>\n\t\t<item>conference.jabber.hot-chilli.net</item>\n\t\t<item>conference.jabber.kiev.ua</item>\n\t\t<item>conference.jabber.linuxlovers.at</item>\n\t\t<item>conference.jabber.minihub.org</item>\n\t\t<item>conference.jabber.od.ua</item>\n\t\t<item>conference.jabberon.ru</item>\n\t\t<item>conference.jabber.org</item>\n\t\t<item>conference.jabber.ru</item>\n\t\t<item>conference.jabber.ufanet.ru</item>\n\t\t<item>conference.jabber.upenn.edu</item>\n\t\t<item>conference.jabberzac.org</item>\n\t\t<item>conference.jabber.zone</item>\n\t\t<item>conference.jabme.de</item>\n\t\t<item>conference.jivesoftware.com</item>\n\t\t<item>conference.kanet.ru</item>\n\t\t<item>conference.kdetalk.net</item>\n\t\t<item>conference.lightwitch.org</item>\n\t\t<item>conference.linuxoid.in</item>\n\t\t<item>conference.mit.edu</item>\n\t\t<item>conference.neko.im</item>\n\t\t<item>conference.qip.ru</item>\n\t\t<item>conference.ripe.net</item>\n\t\t<item>conference.riseup.net</item>\n\t\t<item>conference.swissjabber.ch</item>\n\t\t<item>conference.ubuntu-jabber.de</item>\n\t\t<item>conference.xmpp.jp</item>\n\t\t<item>conference.xmpp.ru</item>\n\t\t<item>conf.jabberes.org</item>\n\t\t<item>jabber.ietf.org</item>\n\t\t<item>muc.creep.im</item>\n\t\t<item>muc.xmpp.org</item>\n\t\t<item>salas.mijabber.es</item>\n\t\t<item>salas.suchat.org</item>\n\t\t<!-- snap -->\n\t</string-array>\n</resources>\n"
  },
  {
    "path": "res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"app_name\">yaxim</string>\n\t<string name=\"app_name_bruno\">Bruno</string>\n\n\t<!-- Connection state -->\n\t<string name=\"conn_title\">yaxim: %s</string>\n\t<string name=\"conn_title_bruno\">Bruno: %s</string>\n\t<string name=\"conn_connecting\">Connecting to server…</string>\n\t<string name=\"conn_disconnecting\">Disconnecting…</string>\n\t<string name=\"conn_online\">Online</string>\n\t<string name=\"conn_offline\">Offline</string>\n\t<string name=\"conn_empty_roster\">No contacts to show!</string>\n\t<string name=\"conn_empty_roster_hints\">There are many ways to add contacts:\\n\\n\n\t\t- Android Beam™: touch a friend\\'s phone\\n\\n\n\t\t- Scan a QR code\\n\\n\n\t\t- \\\"Create invitation\\\" and share it (e-mail, SMS, QR code, …)\\n\\n\n\t\t- \\\"Add contact\\\" if you know the JID</string>\n\t<string name=\"conn_reconnect\">Next connection attempt in %d seconds.</string>\n\t<string name=\"conn_disconnected\">Connection closed</string>\n\t<string name=\"conn_no_network\">No network connection</string>\n\t<string name=\"conn_ping_timeout\">No response</string>\n\t<string name=\"conn_error\">Error: %s</string>\n\n\t<!-- Global Strings -->\n\t<string name=\"Global_Exit\">Exit</string>\n\t<string name=\"Global_authenticate_first\">Please connect first</string>\n\t<string name=\"Global_JID_hint\">user@yax.im</string>\n\t<!-- tooltip message when the user entered an invalid XMPP address -->\n\t<string name=\"Global_JID_malformed\">Check address format!</string>\n\n\t<!-- FirstStartUpDialog -->\n\t<string name=\"StartupDialog_Title\">Welcome to yaxim!</string>\n\t<string name=\"StartupDialog_Summary\">You need to configure yaxim before you can use it. Please enter your Jabber ID and password.</string>\n\t<string name=\"StartupDialog_pwHint\">Enter password</string>\n\t<string name=\"StartupDialog_pwshowHint\">Show password</string>\n\t<string name=\"StartupDialog_Username_title\">Jabber ID:</string>\n\t<string name=\"StartupDialog_passwd_title\">Password:</string>\n\t<string name=\"StartupDialog_advanced\">Advanced…</string>\n\t<string name=\"StartupDialog_create_new\">Register new account</string>\n\t<string name=\"StartupDialog_error_password\">Password is too short!</string>\n\t<string name=\"StartupDialog_created_password\">Created secure password</string>\n\t<string name=\"StartupDialog_auth_failed\">Please check your username and password!</string>\n\t<string name=\"StartupDialog_server_failed\">Could not connect to %s!</string>\n\t<string name=\"StartupDialog_no_registration\">Server does not allow registration!</string>\n\n\t<string name=\"StartupDialog_invitation\">You have been invited to Jabber. Please complete your registration.</string>\n\t<string name=\"StartupDialog_no_more_accounts\">No additional account supported!</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_message\">Message from %s</string>\n\t<string name=\"notification_anonymous_message\">Message received</string>\n\t<!--  Group Chat notification, %1$s is the user name, %2$s is the room, e.g. \"{Ge0rG} in {yaxim Chat}\" -->\n\t<string name=\"notification_muc_message\">%1$s in %2$s</string>\n\t<!--  Group Group Chat private message notification, %1$s is the user name, %2$s is the room, e.g. \"Message from {Ge0rG} in {yaxim Chat}\" -->\n\t<!--string name=\"notification_muc_pm\">Message from %1$s in %2$s</string-->\n\t<!-- notification button: direct reply (make SHORT string) -->\n\t<string name=\"notification_reply\">Reply</string>\n\t<!-- notification button: mark as read (make SHORT string) -->\n\t<string name=\"notification_mark_read\">Mark Read</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_error\">Error while sending message!</string>\n\n\t<!-- Notification Settings -->\n\t<string name=\"preftitle_notify\">Notification Settings</string>\n\t<string name=\"preftitle_notify_msg\">Message Notification</string>\n\t<string name=\"preftitle_notify_muc\">Group Chat Notification</string>\n\t<string name=\"notification_custom\">Custom Ringtone</string>\n\t<string name=\"muc_highlight_title\">Only notify on mention</string>\n\t<string name=\"muc_highlight_sum\">Notify when your nickname is mentioned in a room</string>\n\t<string name=\"led_title\">Blinking LED</string>\n\t<string name=\"led_summ\">Blink phone LED on incoming messages</string>\n\t<string name=\"vibr_title\">Vibration</string>\n\t<string name=\"vibr_summ\">Vibrate on incoming messages</string>\n\t<string-array name=\"vibr_values_displayed\">\n\t\t<item>Never</item>\n\t\t<item>System preference</item>\n\t\t<item>Always</item>\n\t</string-array>\n\t<string name=\"ringtone_title\">Ringtone</string>\n\t<string name=\"ringtone_summ\">Tone for incoming messages</string>\n\t<string name=\"ticker_title\">Message preview</string>\n\t<string name=\"ticker_summ\">Show sender and message in status bar</string>\n\n\t<!-- Startup Setting Strings -->\n\t<string name=\"preftitle_general\">General Settings</string>\n\t<string name=\"pref_dnd_when_silent\">\\\"Do not disturb\\\" in silent mode</string>\n\t<string name=\"pref_dnd_when_silent_summ\">Set your online status to \\\"DND\\\" when your phone is in silent mode</string>\n\t<string name=\"statuspopup_name\">Set your status</string>\n\t<string name=\"showOffline_summ\">Always show all contacts in the roster</string>\n\t<string name=\"showOffline_title\">Show offline contacts</string>\n\t<string name=\"enableGroups_summ\">Arrange your contacts by their groups</string>\n\t<string name=\"enableGroups_title\">Show contact groups</string>\n\t<string name=\"foregroundService_summ\">Keep app in memory to ensure always-on connection (foreground service)</string>\n\t<string name=\"foregroundService_title\">Statusbar icon</string>\n\n\t<string name=\"preftitle_debug\">Debugging</string>\n\t<string name=\"smackdebug_summ\">Packet and debug output via logcat (may contain personal information)</string>\n\t<string name=\"smackdebug_title\">SMACK debugging</string>\n\n\t<string name=\"reportcrash_title\">Send crash reports</string>\n\t<string name=\"reportcrash_summ\">Send anonymous crash reports to developer</string>\n\n\t<!-- Appearence Strings -->\n\t<string name=\"preftitle_app\">Appearance</string>\n\t<string name=\"FontChat_title\">Chat font size</string>\n\t<string name=\"FontChat_summ\">Set chat font size</string>\n\t<string name=\"FontChat_dialog\">Chat font size</string>\n\t<!--\n\t<string name=\"FontRost_title\">Roster font size</string>\n\t<string name=\"FontRost_summ\">Set roster font size</string>\n\t<string name=\"FontRost_dialog\">Roster font fize</string>\n\t<string name=\"setFontRoster\">Set roster font size</string>\n\t-->\n\t<string name=\"pref_theme\">Theme</string>\n\t<string name=\"pref_theme_dark\">Dark</string>\n\t<string name=\"pref_theme_light\">Light</string>\n\t<string name=\"pref_theme_pine\">Pine</string>\n\t<string name=\"pref_theme_ice\">Ice</string>\n\t<string name=\"preftitle_ui\">Appearance</string>\n\t<string-array name=\"fontSizesChat\">\n\t\t<item>small</item>\n\t\t<item>normal</item>\n\t\t<item>large</item>\n\t\t<item>huge</item>\n\t</string-array>\n\n\t<!-- Mainmenu \t-->\n\t<string name=\"Menu_addFriend\">Add contact</string>\n\t<string name=\"Menu_addClipboard\">Add %s</string>\n\t<string name=\"Menu_ShowOff\">Show offline</string>\n\t<string name=\"Menu_HideOff\">Hide offline</string>\n\t<string name=\"Menu_AccSettings\">Edit account</string>\n\t<string name=\"Menu_Settings\">Settings</string>\n\t<string name=\"Menu_Status\">Status</string>\n\t<string name=\"Menu_connect\">Connect</string>\n\t<string name=\"Menu_disconnect\">Disconnect</string>\n\t<string name=\"Menu_about\">About yaxim</string>\n\t<string name=\"Menu_about_bruno\">About Bruno</string>\n\t<string name=\"Menu_muc\">Add / browse…</string>\n\t<string name=\"Menu_matrix\">Enter the Matrix…</string>\n\t<string name=\"Menu_mark_all_as_read\">Mark all as read</string>\n\t<string name=\"Menu_send_invitation\">Create invitation</string>\n    <string name=\"Menu_userlist\">Participants</string>\n\n\n\t<!-- AddFriend -->\n\t<string name=\"addFriend_Title\">Add a Contact</string>\n\t<string name=\"addFriend_Summ\">Please enter the Jabber ID of your friend, the\n\t\tdesired screen name and choose their contact group!</string>\n\t<string name=\"addFriend_aliasHint\">Screen name</string>\n\t<string name=\"addrosteritemaddgroupchoice\">Add to a new group</string>\n\t<string name=\"NewGroup_EditTextField_Hint\">Name for the new group</string>\n\n\t<!-- Roster CONTEXTMENU -->\n\t<string name=\"roster_contextmenu_group_rename\">Rename group</string>\n\t<string name=\"roster_contextmenu_contact_mark_as_read\">Mark as read</string>\n\t<string name=\"roster_contextmenu_contact_delete\">Delete contact</string>\n\t<string name=\"roster_contextmenu_contact_delmsg\">Delete chat history</string>\n\t<string name=\"roster_contextmenu_contact_rename\">Rename</string>\n\t<string name=\"roster_contextmenu_contact_request_auth\">Request authorization</string>\n\t<string name=\"roster_contextmenu_contact_change_group\">Change group</string>\n\t<string name=\"roster_contextmenu_contact_share\">Share address</string>\n\t<string name=\"roster_contextmenu_contact_ringtone\">Ringtone</string>\n\t<string name=\"roster_contextmenu_muc_edit\">Edit group chat</string>\n\t<string name=\"roster_contextmenu_muc_leave\">Leave group chat</string>\n\t<string name=\"muc_leave_question\">Really leave %s?</string>\n\n\t<!-- Accountprefs -->\n\t<string name=\"account_settings_login\">Login Information</string>\n\t<string name=\"account_settings_title\">Account Settings</string>\n\t<string name=\"account_options_title\">Connecting Options</string>\n\t<string name=\"account_options_advanced\">Advanced Options</string>\n\t<string name=\"carbons_title\">Message Carbons (XEP-0280)</string>\n\t<string name=\"carbons_summ\">Request message copies from your other client(s)</string>\n\t<string name=\"account_jabberID_title\">Jabber ID</string>\n\t<string name=\"account_jabberID_sum\">example: me@jabber.example.com</string>\n\t<string name=\"account_jabberID_dialog_title\">Enter your Jabber ID:</string>\n\t<string name=\"account_jabberPW_title\">Account Password</string>\n\t<string name=\"account_jabberPW_sum\">Your Jabber account password</string>\n\t<string name=\"account_jabberPW_change_on_server\">Change password on server</string>\n\t<string name=\"account_jabberPW_password_old\">Old Password:</string>\n\t<string name=\"account_jabberPW_password_new\">New Password:</string>\n\t<string name=\"account_jabberPW_warning\">WARNING! For successful login you must also set the same password on the server!</string>\n\t<string name=\"account_jabberPW_progress\">Please wait, changing password&#8230;</string>\n\t<string name=\"account_jabberPW_finished\">Password successfully changed.</string>\n\t<string name=\"account_jabberPW_error\">Error changing password: %s</string>\n\t<string name=\"account_nickname_title\">Display Name</string>\n\t<string name=\"account_nickname_summ\">Your nickname displayed to other users</string>\n\t\n\t<!-- accountprefs -->\n\t<string name=\"account_resource_title\">Client Resource</string>\n\t<string name=\"account_resource_summ\">Default: yaxim</string>\n\t<string name=\"account_resource_dialog_title\">Enter your resource:</string>\n\t<string name=\"account_resource_hint\">yaxim</string>\n\t<string name=\"account_prio_title\">Client Priority</string>\n\t<string name=\"account_prio_summ\">Default: 0 (allowed: -128 .. 127)</string>\n\t<string name=\"account_prio_error\">Allowed values: -128 .. 127</string>\n\t<string name=\"account_prio_dialog_title\">Enter your priority:</string>\n\t<string name=\"account_port_title\">Server Port</string>\n\t<string name=\"account_port_sum\">Default: 5222</string>\n\t<string name=\"account_port_dialog_title\">Enter the server port:</string>\n\t<string name=\"account_port_hint\">5222</string>\n\t<string name=\"account_customserver_title\">Custom Server</string>\n\t<string name=\"account_customserver_summ\">(Optional) alternative server hostname</string>\n\t<string name=\"account_customserver_dialog_title\">Enter server hostname:</string>\n\t<string name=\"account_customserver_hint\">host.example.com</string>\n\t<string name=\"require_ssl_title\">Require SSL/TLS</string>\n\t<string name=\"require_ssl_summ\">Always encrypt server connection</string>\n\n\t<!--StatusPopUp-->\n\t<string name=\"AddContact_SpinnerPrompt\">Choose Group</string>\n\t<string name=\"setStatusmsgHint\">Your status message</string>\n\t<string name=\"setStatusTitle\">Set your status</string>\n\t<string name=\"RenameGroup_summ\">Rename group %s to:</string>\n\t<string name=\"RenameGroup_title\">Rename group</string>\n\t<string name=\"RenameEntry_summ\">Rename %1$s (%2$s) to: </string>\n\t<string name=\"RenameEntry_title\">Rename contact</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_summ\">Select a group from the spinner below</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_title\">Change group</string>\n\t<string name=\"deleteRosterItem_text\">Really remove %1$s (%2$s)?</string>\n\t<string name=\"deleteRosterItem_title\">Delete Contact</string>\n\t<string name=\"deleteChatHistory_text\">Really remove all messages with %1$s (%2$s)?</string>\n\t<string name=\"deleteChatHistory_title\">Delete Chat History</string>\n\t<string name=\"subscriptionRequest_text\">%1$s wants to add you as a contact: \\\"%2$s\\\"</string>\n\t<string name=\"subscriptionRequest_title\">Subscription Request</string>\n\t<string name=\"subscription_accept\">Accept</string>\n\t<string name=\"subscription_reject\">Reject</string>\n\t<string name=\"subscription_reject_all\">Reject all</string>\n\t<string name=\"subscription_status_from\">can see your status</string>\n\n\t<!-- CHATWINDOW -->\n\t<string name=\"chat_from_me\">Me:</string>\n\t<string name=\"toast_stored_offline\">The message has been stored for transmission.</string>\n\t<string name=\"chat_enterMsgHint\">Enter message</string> \n\n\t<!-- Message context menu; use the verb form (to quote) -->\n\t<string name=\"chatmenu_quote\">Quote</string>\n\t<!-- Message context menu: repeat the same message -->\n\t<string name=\"chatmenu_resend\">Edit message</string>\n\n\t<!-- GPS settings -->\n\t<!--\n\t<string name=\"showGPS_title\">GPS to status</string>\n\t<string name=\"showGPS_summ_on\">GPS is send to StatusMessage</string>\n\t<string name=\"showGPS_summ_off\">GPS is send to StatusMessage</string>\n\t-->\n\n\t<!-- About Dialog -->\n\t<string name=\"AboutDialog_title\">About yaxim</string>\n\t<string name=\"AboutDialog_DevelopersTitle\">Developers</string>\n\t<!-- Contact the developer button -->\n\t<string name=\"AboutDialog_DevelopersText\">Contact</string>\n\t<string name=\"AboutDialog_LicenceTitle\">Licensing</string>\n\t<string name=\"AboutDialog_Vote\">Rate app</string>\n\t<string name=\"AboutDialog_LicenceText\">\n\t\tThis program is free software; you can redistribute\n\t\tit and/or\n\t\tmodify it under the terms of the GNU General Public License\n\t\tversion 2\n\t\tas published by the Free Software Foundation.\n\t\tLink:\n\t\thttp://www.gnu.org/licenses/gpl-2.0.html\\n\n\t\t\\n\n\t\tParts of this software are\n\t\tprovided under the MIT License:\\n\n\t\t\\n\n\t\tCopyright © 2009 Mads\n\t\tKristiansen, Nullwire ApS\\n\n\t\t\\n\n\t\tPermission is hereby granted, free of\n\t\tcharge, to any person obtaining\n\t\ta copy\n\t\tof this software and associated\n\t\tdocumentation files (the\n\t\t\"Software\"), to deal\n\t\tin the Software without\n\t\trestriction, including\n\t\twithout limitation the rights\n\t\tto use, copy,\n\t\tmodify, merge, publish,\n\t\tdistribute, sublicense, and/or sell\n\t\tcopies of\n\t\tthe Software, and to\n\t\tpermit persons to whom the Software is\n\t\tfurnished to\n\t\tdo so, subject to\n\t\tthe following conditions:\n\t\t\\n\n\t\tThe above copyright notice\n\t\tand this permission notice shall be\n\t\tincluded in all\n\t\tcopies or\n\t\tsubstantial portions of the Software.\n\t\t\\n\n\t\tTHE SOFTWARE IS PROVIDED \"AS\n\t\tIS\", WITHOUT WARRANTY OF ANY KIND,\n\t\tEXPRESS OR\n\t\tIMPLIED, INCLUDING BUT NOT\n\t\tLIMITED TO THE WARRANTIES OF\n\t\tMERCHANTABILITY,\n\t\tFITNESS FOR A PARTICULAR\n\t\tPURPOSE AND NONINFRINGEMENT.\n\t\tIN NO EVENT SHALL THE\n\t\tAUTHORS OR COPYRIGHT\n\t\tHOLDERS BE LIABLE FOR ANY\n\t\tCLAIM, DAMAGES OR OTHER\n\t\tLIABILITY, WHETHER IN\n\t\tAN ACTION OF CONTRACT,\n\t\tTORT OR OTHERWISE, ARISING FROM,\n\t\tOUT OF OR IN\n\t\tCONNECTION WITH THE\n\t\tSOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n\t\tSOFTWARE.\n    </string>\n\n\t<string name=\"status_available\">Online</string>\n\t<string name=\"status_away\">Away</string>\n\t<string name=\"status_chat\">Free for chat</string>\n\t<string name=\"status_dnd\">Do not disturb</string>\n\t<string name=\"status_xa\">Not available</string>\n\t<string name=\"status_offline\">Offline</string>\n\n\t<string name=\"translator_credits\">translator-credits</string>\n\n\t<!-- default roster group with no name -->\n\t<string name=\"default_group\">General</string>\n\t<string name=\"all_contacts_group\">All contacts</string>\n\t<string name=\"muc_group\">Group Chats</string>\n\n\t<!-- SEND listener popup -->\n\t<string name=\"chooseContact\">Choose contact</string>\n\t<string name=\"action_settings\">Settings</string>\n\n\t<!-- MUC strings -->\n\t<string name=\"muc_jid_hint\">Group chat JID</string>\n\t<string name=\"muc_nickname_hint\">Nickname</string>\n\t<string name=\"muc_password_hint\">Password (optional)</string>\n\t<string name=\"title_activity_muc_invite\">Group Chat Invitation</string>\n\t<!-- Groupchat invitation: \"Invitation from {contact name}\" -->\n\t<string name=\"muc_invitation_from\">Invitation from %s</string>\n\t<!-- Groupchat info: {description} ({number} participants) -->\n\t<string name=\"muc_invitation_occupants\">%1$s (%2$d participants)</string>\n\t<!-- Notification button: \"Join as {default nickname}\" (make SHORT string) -->\n\t<string name=\"muc_invitation_join\">Join as %s</string>\n\t<string name=\"muc_synchronizing\">Synchronizing…</string>\n\t<!-- Title of user list, contains JID -->\n\t<string name=\"chat_muc_userlist\">Group Chat Participants (%s)</string>\n\t<!-- Kicked from groupchat: \"Kicked: {reason} -->\n\t<string name=\"muc_kicked\">Kicked: %s</string>\n\t<!-- Kicked from groupchat: \"Kicked by {admin name}: {reason} -->\n\t<string name=\"muc_kicked_by\">Kicked by %1$s: %2$s</string>\n\t<!-- Banned from groupchat: \"Banned: {reason} -->\n\t<string name=\"muc_banned\">Banned: %s</string>\n\t<!-- Banned from groupchat: \"Banned by {admin name}: {reason} -->\n\t<string name=\"muc_banned_by\">Banned by %1$s: %2$s</string>\n\n\t<!-- File upload -->\n\t<string name=\"roster_contextmenu_send\">Send&#8230;</string>\n\t<string name=\"roster_contextmenu_take_image\">Take picture</string>\n\t<string name=\"roster_contextmenu_send_image\">Choose picture</string>\n\t<string name=\"roster_contextmenu_send_file\">Send file</string>\n\t<string name=\"upload_compress\">Compressing picture&#8230;</string>\n\t<string name=\"upload_uploading\">Uploading&#8230;</string>\n\t<string name=\"upload_too_large\">file too large!</string>\n\t<string name=\"storage_permission\">%s needs storage access to send files!</string>\n\t<string name=\"notification_permission_denied\">Notifications are disabled in the Android app preferences.</string>\n\n\t<!-- Search -->\n\t<string name=\"search_msg_hint\">Message content</string>\n\n\t<!-- MUC bookmarks -->\n\t<string name=\"group_bookmarks\">My group chats</string>\n\t<string name=\"group_mucsearch\">Public group chats</string>\n\t<!-- Service Discovery -->\n\t<string name=\"title_service_disco\">Browser: %s</string>\n\n\t<!-- Android 9 notification preferences: permanent notification -->\n\t<string name=\"notification_status\">Foreground service</string>\n\t<!-- Android 9 notification preferences: message notifications -->\n\t<string name=\"notification_msg\">Messages</string>\n\n</resources>\n"
  },
  {
    "path": "res/values/styles.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\" tools:targetApi=\"17\">\n\n<!--     the unprefixed ones (without android:) are for the Sherlock implementation -->\n\n    <style name=\"RosterGroupName\">\n        <item name=\"android:textSize\">22sp</item>\n        <item name=\"android:textStyle\">bold</item>\n\t<item name=\"android:paddingTop\">2dp</item>\n\t<item name=\"android:paddingBottom\">2dp</item>\n    </style>\n\n    <style name=\"RosterGroupName.Dark\">\n        <item name=\"android:background\">@drawable/group_background_9_dark</item>\n    </style>\n\n    <style name=\"RosterGroupName.Light\">\n        <item name=\"android:background\">@drawable/group_background_9_light</item>\n    </style>\n\n    <style name=\"RosterGroupItem\">\n        <item name=\"android:textSize\">20sp</item>\n    </style>\n\n    <style name=\"RosterGroupItem.Light\">\n\t<item name=\"android:textColor\">#000000</item>\n    </style>\n\n\t<style name=\"StyleErrorView\">\n\t\t<item name=\"android:textSize\">18sp</item>\n\t\t<item name=\"android:padding\">5sp</item>\n\t\t<item name=\"android:textColor\">#000</item>\n\t\t<item name=\"android:background\">#b44</item>\n\t\t<item name=\"android:shadowColor\">#44000000</item>\n\t\t<item name=\"android:shadowRadius\">3.0</item>\n\t</style>\n\t\t\n\t<style name=\"StyleErrorView.Light\">\n\t\t<item name=\"android:background\">#f88</item>\n\t\t<item name=\"android:textColor\">#400</item>\n\t</style>\n\t\n    <style name=\"RosterMessageCounter\">\n        <item name=\"android:visibility\">gone</item>\n        <item name=\"android:layout_width\">wrap_content</item>\n        <item name=\"android:layout_height\">wrap_content</item>\n        <item name=\"android:layout_gravity\">center_horizontal</item>\n        <item name=\"android:layout_alignParentBottom\">true</item>\n        <item name=\"android:layout_alignParentRight\">true</item>\n        <item name=\"android:layout_alignParentEnd\">true</item>\n        <item name=\"android:layout_marginRight\">4dip</item>\n        <item name=\"android:layout_marginEnd\">4dip</item>\n        <item name=\"android:layout_marginLeft\">4dip</item>\n        <item name=\"android:layout_marginStart\">4dip</item>\n        <item name=\"android:gravity\">center</item>\n        <item name=\"android:paddingTop\">2dip</item>\n        <item name=\"android:paddingBottom\">2dip</item>\n        <item name=\"android:paddingLeft\">5dip</item>\n        <item name=\"android:paddingStart\">5dip</item>\n        <item name=\"android:paddingRight\">5dip</item>\n        <item name=\"android:paddingEnd\">5dip</item>\n        <item name=\"android:singleLine\">true</item>\n        <item name=\"android:lines\">1</item>\n        <item name=\"android:ellipsize\">marquee</item>\n        <item name=\"android:textSize\">11dip</item>\n        <item name=\"android:textColor\">#FFFFFFFF</item>\n        <item name=\"android:background\">@drawable/count_bcg</item>\n        <item name=\"android:text\"></item>\n    </style>\n\n    <style name=\"ChatText\">\n\t<item name=\"android:textSize\">18sp</item>\n\t<item name=\"android:textColor\">#daffffff</item>\n    </style>\n    <style name=\"ChatText.Light\">\n\t<item name=\"android:textColor\">#000000</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "res/values/themes.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\" tools:targetApi=\"11\">\n\n    <!-- for emulator include bg -->\n    <!-- <color name=\"holo_light_bg_color\">#fff3f3f3</color> -->\n    \n<!--     the unprefixed ones (without android:) are for the Sherlock implementation -->\n\n    <style name=\"YaximLightTheme\" parent=\"Theme.AppCompat.Light\">\n        <item name=\"android:windowOptOutEdgeToEdgeEnforcement\">true</item>\n        <!-- <item name=\"android:windowBackground\">@color/holo_light_bg_color</item> -->\n        <item name=\"MainGroup\">@style/RosterGroupName.Light</item>\n        <item name=\"MainChild\">@style/RosterGroupItem.Light</item>\n        <!-- <item name=\"android:listSeparatorTextViewStyle\">@style/PreferenceListHeader</item> -->\n        <item name=\"ChatMsgHeaderMeColor\">#ff6d6dcc</item>\n        <item name=\"ChatMsgHeaderYouColor\">#ffcc5050</item>\n\t\t<item name=\"ErrorView\">@style/StyleErrorView.Light</item>\n\t\t<item name=\"ChatNewMessageColor\">#ffb0b0b0</item>\n\t\t<item name=\"ChatStoredMessageColor\">#60b0b0b0</item>\n        <item name=\"ChatText\">@style/ChatText.Light</item>\n    </style>\n\n    <style name=\"IndeterminateProgress\" parent=\"Widget.AppCompat.ProgressBar\">\n        <item name=\"android:minWidth\">32dip</item>\n        <item name=\"android:maxWidth\">32dip</item>\n        <item name=\"android:minHeight\">32dip</item>\n        <item name=\"android:maxHeight\">32dip</item>\n    </style>\n\n    <style name=\"YaximDarkTheme\" parent=\"Theme.AppCompat\">\n        <item name=\"android:windowOptOutEdgeToEdgeEnforcement\">true</item>\n        <item name=\"colorPrimary\">#404040</item>\n        <item name=\"colorPrimaryDark\">#303030</item>\n        <item name=\"colorAccent\">#d5e6b3</item>\n        <item name=\"android:windowBackground\">@color/colorBackgroundDark</item>\n        <item name=\"MainGroup\">@style/RosterGroupName.Dark</item>\n        <item name=\"MainChild\">@style/RosterGroupItem</item>\n        <item name=\"ChatMsgHeaderMeColor\">#ff8888ff</item>\n        <item name=\"ChatMsgHeaderYouColor\">#ffff8888</item>\n\t\t<item name=\"ChatNewMessageColor\">#ff404040</item>\n\t\t<item name=\"ChatStoredMessageColor\">#60404040</item>\n\t\t<item name=\"ErrorView\">@style/StyleErrorView</item>\n        <item name=\"ChatText\">@style/ChatText</item>\n    </style>\n\n    <color name=\"colorBackgroundDark\">#101010</color>\n</resources>\n"
  },
  {
    "path": "res/values-cs/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"app_name\">yaxim</string>\n\t<string name=\"app_name_bruno\">Bruno</string>\n\n\t<!-- Connection state -->\n\t<string name=\"conn_title\">yaxim: %s</string>\n\t<string name=\"conn_title_bruno\">Bruno: %s</string>\n\t<string name=\"conn_connecting\">Připojuji se k serveru...</string>\n\t<string name=\"conn_disconnecting\">Odpojuje se...</string>\n\t<string name=\"conn_online\">Připojen</string>\n\t<string name=\"conn_offline\">Odpojen</string>\n\t<string name=\"conn_empty_roster\">Žádné kontakty k zobrazení!</string>\n\t<string name=\"conn_empty_roster_hints\">There are many ways to add contacts:\\n\\n\n\t\t- Android Beam™: touch a friend\\'s phone\\n\\n\n\t\t- Scan a QR code\\n\\n\n\t\t- \\\"Create invitation\\\" and share it (e-mail, SMS, QR code, …)\\n\\n\n\t\t- \\\"Add contact\\\" if you know the JID</string>\n\t<string name=\"conn_reconnect\">Pokus o další pripojení za %d sekund.</string>\n\t<string name=\"conn_disconnected\">Spojení ukončeno</string>\n\t<string name=\"conn_no_network\">Žádné připojení k síti</string>\n\t<string name=\"conn_ping_timeout\">No response</string>\n\t<string name=\"conn_error\">Error: %s</string>\n\n\t<!-- Global Strings -->\n\t<string name=\"Global_Exit\">Ukončit</string>\n\t<string name=\"Global_authenticate_first\">Nejprve se prosím připojte</string>\n\t<string name=\"Global_JID_hint\">user@yax.im</string>\n\t<!-- tooltip message when the user entered an invalid XMPP address -->\n\t<string name=\"Global_JID_malformed\">Ověřte adresu!</string>\n\n\t<!-- FirstStartUpDialog -->\n\t<string name=\"StartupDialog_Title\">Vítejte v klientu yaxim!</string>\n\t<string name=\"StartupDialog_Summary\">Před použitím je potřeba yaxim nakonfigurovat. Prosím zadejte své Jabber ID a heslo.</string>\n\t<string name=\"StartupDialog_pwHint\">Zadejte heslo</string>\n\t<string name=\"StartupDialog_pwshowHint\">Show password</string>\n\t<string name=\"StartupDialog_Username_title\">Jabber ID:</string>\n\t<string name=\"StartupDialog_passwd_title\">Heslo:</string>\n\t<string name=\"StartupDialog_advanced\">Pokročilé...</string>\n\t<string name=\"StartupDialog_create_new\">Registrovat nový účet</string>\n\t<string name=\"StartupDialog_error_password\">Password is too short!</string>\n\t<string name=\"StartupDialog_created_password\">Created secure password</string>\n\t<string name=\"StartupDialog_auth_failed\">Please check your username and password!</string>\n\t<string name=\"StartupDialog_server_failed\">Could not connect to %s!</string>\n\t<string name=\"StartupDialog_no_registration\">Server does not allow registration!</string>\n\n\t<string name=\"StartupDialog_invitation\">You have been invited to Jabber. Please complete your registration.</string>\n\t<string name=\"StartupDialog_no_more_accounts\">No additional account supported!</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_message\">Zpráva od %s</string>\n\t<string name=\"notification_anonymous_message\">Přijata nová zpráva</string>\n\t<!--  Group Chat notification, %1$s is the user name, %2$s is the room, e.g. \"{Ge0rG} in {yaxim Chat}\" -->\n\t<string name=\"notification_muc_message\">%1$s in %2$s</string>\n\t<!--  Group Group Chat private message notification, %1$s is the user name, %2$s is the room, e.g. \"Message from {Ge0rG} in {yaxim Chat}\" -->\n\t<!--string name=\"notification_muc_pm\">Message from %1$s in %2$s</string-->\n\t<!-- notification button: direct reply (make SHORT string) -->\n\t<string name=\"notification_reply\">Reply</string>\n\t<!-- notification button: mark as read (make SHORT string) -->\n\t<string name=\"notification_mark_read\">Mark Read</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_error\">Chyba při odesílání zprávy!</string>\n\n\t<!-- Notification Settings -->\n\t<string name=\"preftitle_notify\">Notification Settings</string>\n\t<string name=\"preftitle_notify_msg\">Nastavení upozornění na zprávy</string>\n\t<string name=\"preftitle_notify_muc\">Group Chat Notification</string>\n\t<string name=\"notification_custom\">Custom Ringtone</string>\n\t<string name=\"muc_highlight_title\">Only notify on mention</string>\n\t<string name=\"muc_highlight_sum\">Notify when your nickname is mentioned in a room</string>\n\t<string name=\"led_title\">Blikání LED diody</string>\n\t<string name=\"led_summ\">Blikat při příchozích zprávách diodou na telefonu</string>\n\t<string name=\"vibr_title\">Vibrace</string>\n\t<string name=\"vibr_summ\">Vibrovat při příchozích zprávách</string>\n\t<string-array name=\"vibr_values_displayed\">\n\t\t<item>Nikdy</item>\n\t\t<item>Podle nastavení systému</item>\n\t\t<item>Vždy</item>\n\t</string-array>\n\t<string name=\"ringtone_title\">Vyzvánění</string>\n\t<string name=\"ringtone_summ\">Zvuk pro příchozí zprávy</string>\n\t<string name=\"ticker_title\">Náhled zprávy</string>\n\t<string name=\"ticker_summ\">Zobrazovat zprávu a jejího odesílatele ve stavové liště</string>\n\n\t<!-- Startup Setting Strings -->\n\t<string name=\"preftitle_general\">General Settings</string>\n\t<string name=\"pref_dnd_when_silent\">\\\"Do not disturb\\\" in silent mode</string>\n\t<string name=\"pref_dnd_when_silent_summ\">Set your online status to \\\"DND\\\" when your phone is in silent mode</string>\n\t<string name=\"statuspopup_name\">Nastavte si svůj stav</string>\n\t<string name=\"showOffline_summ\">Vždy zobrazovat všechny kontakty v seznamu</string>\n\t<string name=\"showOffline_title\">Zobrazení odpojených kontaktů</string>\n\t<string name=\"enableGroups_summ\">Uspořádat kontakty podle jejich skupin</string>\n\t<string name=\"enableGroups_title\">Zobrazovat skupiny kontaktů</string>\n\t<string name=\"foregroundService_summ\">Keep app in memory to ensure always-on connection (foreground service)</string>\n\t<string name=\"foregroundService_title\">Ikona ve stavové liště</string>\n\n\t<string name=\"preftitle_debug\">Ladění</string>\n\t<string name=\"smackdebug_summ\">Výstup paketů a ladění pomocí logcat (může obsahovat osobní data)</string>\n\t<string name=\"smackdebug_title\">SMACK debugging</string>\n\n\t<string name=\"reportcrash_title\">Odesílání zpráv o selhání</string>\n\t<string name=\"reportcrash_summ\">Posílat anonymní zprávy o selhání vývojářům</string>\n\n\t<!-- Appearence Strings -->\n\t<string name=\"preftitle_app\">Vzhled</string>\n\t<string name=\"FontChat_title\">Velikost písma v chatu</string>\n\t<string name=\"FontChat_summ\">Nastavit velikost písma</string>\n\t<string name=\"FontChat_dialog\">Velikost písma v chatu</string>\n\t<!--\n\t<string name=\"FontRost_title\">Roster font size</string>\n\t<string name=\"FontRost_summ\">Set roster font size</string>\n\t<string name=\"FontRost_dialog\">Roster font fize</string>\n\t<string name=\"setFontRoster\">Set roster font size</string>\n\t-->\n\t<string name=\"pref_theme\">Motiv</string>\n\t<string name=\"pref_theme_dark\">Tmavý</string>\n\t<string name=\"pref_theme_light\">Světlý</string>\n\t<string name=\"pref_theme_pine\">Pine</string>\n\t<string name=\"pref_theme_ice\">Ice</string>\n\t<string name=\"preftitle_ui\">Vzhled</string>\n\t<string-array name=\"fontSizesChat\">\n\t\t<item>malé</item>\n\t\t<item>normální</item>\n\t\t<item>velké</item>\n\t\t<item>velký</item>\n\t</string-array>\n\n\t<!-- Mainmenu \t-->\n\t<string name=\"Menu_addFriend\">Add contact</string>\n\t<string name=\"Menu_addClipboard\">Add %s</string>\n\t<string name=\"Menu_ShowOff\">Show offline</string>\n\t<string name=\"Menu_HideOff\">Hide offline</string>\n\t<string name=\"Menu_AccSettings\">Edit account</string>\n\t<string name=\"Menu_Settings\">Nastavení</string>\n\t<string name=\"Menu_Status\">Stav</string>\n\t<string name=\"Menu_connect\">Připojit</string>\n\t<string name=\"Menu_disconnect\">Odpojit</string>\n\t<string name=\"Menu_about\">O aplikaci yaxim</string>\n\t<string name=\"Menu_about_bruno\">About Bruno</string>\n\t<string name=\"Menu_muc\">Add / browse…</string>\n\t<string name=\"Menu_matrix\">Enter the Matrix…</string>\n\t<string name=\"Menu_mark_all_as_read\">Mark all as read</string>\n\t<string name=\"Menu_send_invitation\">Create invitation</string>\n    <string name=\"Menu_userlist\">Participants</string>\n\n\n\t<!-- AddFriend -->\n\t<string name=\"addFriend_Title\">Přidat kontakt</string>\n\t<string name=\"addFriend_Summ\">Prosím vložte Jabber ID vašeho kamaráda, zadejte požadovanou přezdívku a přidejte ho do skupiny!</string>\n\t<string name=\"addFriend_aliasHint\">Přezdívka</string>\n\t<string name=\"addrosteritemaddgroupchoice\">Přidat do nové skupiny</string>\n\t<string name=\"NewGroup_EditTextField_Hint\">Název nové skupiny</string>\n\n\t<!-- Roster CONTEXTMENU -->\n\t<string name=\"roster_contextmenu_group_rename\">Přejmenovat skupinu</string>\n\t<string name=\"roster_contextmenu_contact_mark_as_read\">Označit jako přečtené</string>\n\t<string name=\"roster_contextmenu_contact_delete\">Delete contact</string>\n\t<string name=\"roster_contextmenu_contact_delmsg\">Delete chat history</string>\n\t<string name=\"roster_contextmenu_contact_rename\">Přejmenovat</string>\n\t<string name=\"roster_contextmenu_contact_request_auth\">Request authorization</string>\n\t<string name=\"roster_contextmenu_contact_change_group\">Změnit skupinu</string>\n\t<string name=\"roster_contextmenu_contact_share\">Share address</string>\n\t<string name=\"roster_contextmenu_contact_ringtone\">Vyzvánění</string>\n\t<string name=\"roster_contextmenu_muc_edit\">Edit group chat</string>\n\t<string name=\"roster_contextmenu_muc_leave\">Leave group chat</string>\n\t<string name=\"muc_leave_question\">Really leave %s?</string>\n\n\t<!-- Accountprefs -->\n\t<string name=\"account_settings_login\">Přihlašovací údaje</string>\n\t<string name=\"account_settings_title\">Nastavení účtu</string>\n\t<string name=\"account_options_title\">Možnosti připojení</string>\n\t<string name=\"account_options_advanced\">Pokročilé nastavení</string>\n\t<string name=\"carbons_title\">Message Carbons (XEP-0280)</string>\n\t<string name=\"carbons_summ\">Vyžádat kopie zpráv z vašich ostatních klientů</string>\n\t<string name=\"account_jabberID_title\">Jabber ID</string>\n\t<string name=\"account_jabberID_sum\">např: ja@jabber.nekde.cz</string>\n\t<string name=\"account_jabberID_dialog_title\">Napište své Jabber ID:</string>\n\t<string name=\"account_jabberPW_title\">Heslo</string>\n\t<string name=\"account_jabberPW_sum\">Vaše heslo k Jabber účtu</string>\n\t<string name=\"account_jabberPW_change_on_server\">Změnit heslo na serveru</string>\n\t<string name=\"account_jabberPW_password_old\">Staré heslo:</string>\n\t<string name=\"account_jabberPW_password_new\">Nové heslo:</string>\n\t<string name=\"account_jabberPW_warning\">Varování! K úspěšnému přihlášení je nutné nastavit stejné heslo na serveru!</string>\n\t<string name=\"account_jabberPW_progress\">Prosím počkejte, heslo se mění...</string>\n\t<string name=\"account_jabberPW_finished\">Heslo bylo úspěšně změněno.</string>\n\t<string name=\"account_jabberPW_error\">Chyba při změně hesla: %s</string>\n\t<string name=\"account_nickname_title\">Display Name</string>\n\t<string name=\"account_nickname_summ\">Your nickname displayed to other users</string>\n\t\n\t<!-- accountprefs -->\n\t<string name=\"account_resource_title\">Zdroj</string>\n\t<string name=\"account_resource_summ\">Výchozí: yaxim</string>\n\t<string name=\"account_resource_dialog_title\">Zadejte zdroj:</string>\n\t<string name=\"account_resource_hint\">yaxim</string>\n\t<string name=\"account_prio_title\">Priorita:</string>\n\t<string name=\"account_prio_summ\">Výchozí: 0 (povolené hodnoty: -128 až 127)</string>\n\t<string name=\"account_prio_error\">Povolené hodnoty: -128 .. 127</string>\n\t<string name=\"account_prio_dialog_title\">Zvolte prioritu:</string>\n\t<string name=\"account_port_title\">Port serveru</string>\n\t<string name=\"account_port_sum\">Výchozí: 5222</string>\n\t<string name=\"account_port_dialog_title\">Zadejte port serveru:</string>\n\t<string name=\"account_port_hint\">5222</string>\n\t<string name=\"account_customserver_title\">Vlastní server</string>\n\t<string name=\"account_customserver_summ\">(volitelné) alternativní adresa serveru</string>\n\t<string name=\"account_customserver_dialog_title\">Zadejte adresu serveru:</string>\n\t<string name=\"account_customserver_hint\">host.nekde.cz</string>\n\t<string name=\"require_ssl_title\">Vyžadovat SSL/TLS</string>\n\t<string name=\"require_ssl_summ\">Vždy šifrovat spojení se serverem</string>\n\n\t<!--StatusPopUp-->\n\t<string name=\"AddContact_SpinnerPrompt\">Vyberte skupinu</string>\n\t<string name=\"setStatusmsgHint\">Váš stav</string>\n\t<string name=\"setStatusTitle\">Nastavte si svůj stav</string>\n\t<string name=\"RenameGroup_summ\">Přejmenovat skupinu %s na:</string>\n\t<string name=\"RenameGroup_title\">Přejmenovat skupinu</string>\n\t<string name=\"RenameEntry_summ\">Přejmenovat %1$s (%2$s) na:</string>\n\t<string name=\"RenameEntry_title\">Přejmenovat kontakt</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_summ\">Vyberte skupinu z níže uvedené nabídky</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_title\">Změnit skupinu</string>\n\t<string name=\"deleteRosterItem_text\">Opravdu odstranit %1$s (%2$s)?</string>\n\t<string name=\"deleteRosterItem_title\">Odstranit kontakt</string>\n\t<string name=\"deleteChatHistory_text\">Opravdu odstranit všechny zprávy s %1$s (%2$s)?</string>\n\t<string name=\"deleteChatHistory_title\">Vymazat historii chatu</string>\n\t<string name=\"subscriptionRequest_text\">%1$s si vás chce přidat jako kontakt: \\\"%2$s\\\"</string>\n\t<string name=\"subscriptionRequest_title\">Subscription Request</string>\n\t<string name=\"subscription_accept\">Accept</string>\n\t<string name=\"subscription_reject\">Reject</string>\n\t<string name=\"subscription_reject_all\">Reject all</string>\n\t<string name=\"subscription_status_from\">can see your status</string>\n\n\t<!-- CHATWINDOW -->\n\t<string name=\"chat_from_me\">Já:</string>\n\t<string name=\"toast_stored_offline\">Zpráva byla uložena k odeslání.</string>\n\t<string name=\"chat_enterMsgHint\">Vložte zprávu</string> \n\n\t<!-- Message context menu; use the verb form (to quote) -->\n\t<string name=\"chatmenu_quote\">Quote</string>\n\t<!-- Message context menu: repeat the same message -->\n\t<string name=\"chatmenu_resend\">Edit message</string>\n\n\t<!-- GPS settings -->\n\t<!--\n\t<string name=\"showGPS_title\">GPS to status</string>\n\t<string name=\"showGPS_summ_on\">GPS is send to StatusMessage</string>\n\t<string name=\"showGPS_summ_off\">GPS is send to StatusMessage</string>\n\t-->\n\n\t<!-- About Dialog -->\n\t<string name=\"AboutDialog_title\">O aplikaci yaxim</string>\n\t<string name=\"AboutDialog_DevelopersTitle\">Vývojáři</string>\n\t<!-- Contact the developer button -->\n\t<string name=\"AboutDialog_DevelopersText\">Contact</string>\n\t<string name=\"AboutDialog_LicenceTitle\">Licence</string>\n\t<string name=\"AboutDialog_Vote\">Rate app</string>\n\t<string name=\"AboutDialog_LicenceText\">This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. Link: http://www.gnu.org/licenses/gpl-2.0.html\\n \\n Parts of this software are provided under the MIT License:\\n \\n Copyright © 2009 Mads Kristiansen, Nullwire ApS\\n \\n Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: \\n The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. \\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</string>\n\n\t<string name=\"status_available\">Připojen</string>\n\t<string name=\"status_away\">Pryč</string>\n\t<string name=\"status_chat\">Můžu si povídat</string>\n\t<string name=\"status_dnd\">Nerušit</string>\n\t<string name=\"status_xa\">Nejsem k zastižení</string>\n\t<string name=\"status_offline\">Odpojen</string>\n\n\t<string name=\"translator_credits\">Launchpad Contributions:\n  Fosfor https://launchpad.net/~fosfor\n  Linuxfan https://launchpad.net/~linuxfan-timo\n  Mirek Ryšán https://launchpad.net/~mirek-rysan</string>\n\n\t<!-- default roster group with no name -->\n\t<string name=\"default_group\">Nezařazení</string>\n\t<string name=\"all_contacts_group\">Všechny kontakty</string>\n\t<string name=\"muc_group\">Group Chats</string>\n\n\t<!-- SEND listener popup -->\n\t<string name=\"chooseContact\">Vyberte kontakt</string>\n\t<string name=\"action_settings\">Nastavení</string>\n\n\t<!-- MUC strings -->\n\t<string name=\"muc_jid_hint\">Group chat JID</string>\n\t<string name=\"muc_nickname_hint\">Nickname</string>\n\t<string name=\"muc_password_hint\">Password (optional)</string>\n\t<string name=\"title_activity_muc_invite\">Group Chat Invitation</string>\n\t<!-- Groupchat invitation: \"Invitation from {contact name}\" -->\n\t<string name=\"muc_invitation_from\">Invitation from %s</string>\n\t<!-- Groupchat info: {description} ({number} participants) -->\n\t<string name=\"muc_invitation_occupants\">%1$s (%2$d participants)</string>\n\t<!-- Notification button: \"Join as {default nickname}\" (make SHORT string) -->\n\t<string name=\"muc_invitation_join\">Join as %s</string>\n\t<string name=\"muc_synchronizing\">Synchronizing…</string>\n\t<!-- Title of user list, contains JID -->\n\t<string name=\"chat_muc_userlist\">Group Chat Participants (%s)</string>\n\t<!-- Kicked from groupchat: \"Kicked: {reason} -->\n\t<string name=\"muc_kicked\">Kicked: %s</string>\n\t<!-- Kicked from groupchat: \"Kicked by {admin name}: {reason} -->\n\t<string name=\"muc_kicked_by\">Kicked by %1$s: %2$s</string>\n\t<!-- Banned from groupchat: \"Banned: {reason} -->\n\t<string name=\"muc_banned\">Banned: %s</string>\n\t<!-- Banned from groupchat: \"Banned by {admin name}: {reason} -->\n\t<string name=\"muc_banned_by\">Banned by %1$s: %2$s</string>\n\n\t<!-- File upload -->\n\t<string name=\"roster_contextmenu_send\">Send…</string>\n\t<string name=\"roster_contextmenu_take_image\">Take picture</string>\n\t<string name=\"roster_contextmenu_send_image\">Choose picture</string>\n\t<string name=\"roster_contextmenu_send_file\">Send file</string>\n\t<string name=\"upload_compress\">Compressing picture…</string>\n\t<string name=\"upload_uploading\">Uploading…</string>\n\t<string name=\"upload_too_large\">file too large!</string>\n\t<string name=\"storage_permission\">%s needs storage access to send files!</string>\n\t<string name=\"notification_permission_denied\">Notifications are disabled in the Android app preferences.</string>\n\n\t<!-- Search -->\n\t<string name=\"search_msg_hint\">Message content</string>\n\n\t<!-- MUC bookmarks -->\n\t<string name=\"group_bookmarks\">My group chats</string>\n\t<string name=\"group_mucsearch\">Public group chats</string>\n\t<!-- Service Discovery -->\n\t<string name=\"title_service_disco\">Browser: %s</string>\n\n\t<!-- Android 9 notification preferences: permanent notification -->\n\t<string name=\"notification_status\">Foreground service</string>\n\t<!-- Android 9 notification preferences: message notifications -->\n\t<string name=\"notification_msg\">Messages</string>\n\n</resources>\n"
  },
  {
    "path": "res/values-de/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"app_name\">yaxim</string>\n\t<string name=\"app_name_bruno\">Bruno</string>\n\n\t<!-- Connection state -->\n\t<string name=\"conn_title\">yaxim: %s</string>\n\t<string name=\"conn_title_bruno\">Bruno: %s</string>\n\t<string name=\"conn_connecting\">Verbinde mit Server…</string>\n\t<string name=\"conn_disconnecting\">Verbindung wird getrennt…</string>\n\t<string name=\"conn_online\">Online</string>\n\t<string name=\"conn_offline\">Offline</string>\n\t<string name=\"conn_empty_roster\">Keine Kontakte zum Anzeigen!</string>\n\t<string name=\"conn_empty_roster_hints\">Es gibt viele Wege, Kontakte hinzuzufügen:\\n\\n - Android Beam™: das Telefon eines Freundes berühren\\n\\n - QR-Code scannen\\n\\n - \\\"Einladung erzeugen\\\" und weitergeben (E-Mail, SMS, QR-Code, …)\\n\\n - \\\"Kontakt hinzufügen\\\" wenn die JID bekannt ist</string>\n\t<string name=\"conn_reconnect\">Nächster Versuch in %d Sekunden.</string>\n\t<string name=\"conn_disconnected\">Verbindung getrennt</string>\n\t<string name=\"conn_no_network\">Keine Netzwerkverbindung</string>\n\t<string name=\"conn_ping_timeout\">Keine Antwort</string>\n\t<string name=\"conn_error\">Fehler: %s</string>\n\n\t<!-- Global Strings -->\n\t<string name=\"Global_Exit\">Beenden</string>\n\t<string name=\"Global_authenticate_first\">Bitte zuerst verbinden!</string>\n\t<string name=\"Global_JID_hint\">nutzer@yax.im</string>\n\t<!-- tooltip message when the user entered an invalid XMPP address -->\n\t<string name=\"Global_JID_malformed\">Adressformat überprüfen!</string>\n\n\t<!-- FirstStartUpDialog -->\n\t<string name=\"StartupDialog_Title\">Willkommen bei yaxim!</string>\n\t<string name=\"StartupDialog_Summary\">Sie müssen yaxim zuerst konfigurieren. Bitte Ihre Jabber-ID und Ihr Passwort eingeben.</string>\n\t<string name=\"StartupDialog_pwHint\">Passwort eingeben</string>\n\t<string name=\"StartupDialog_pwshowHint\">Passwort anzeigen</string>\n\t<string name=\"StartupDialog_Username_title\">Jabber-ID:</string>\n\t<string name=\"StartupDialog_passwd_title\">Passwort:</string>\n\t<string name=\"StartupDialog_advanced\">Erweitert…</string>\n\t<string name=\"StartupDialog_create_new\">Neues Konto anlegen</string>\n\t<string name=\"StartupDialog_error_password\">Passwort ist zu kurz!</string>\n\t<string name=\"StartupDialog_created_password\">Sicheres Passwort erzeugt</string>\n\t<string name=\"StartupDialog_auth_failed\">Bitte Benutzername und Passwort prüfen!</string>\n\t<string name=\"StartupDialog_server_failed\">Konnte nicht mit %s verbinden!</string>\n\t<string name=\"StartupDialog_no_registration\">Server erlaubt keine Registrierung!</string>\n\n\t<string name=\"StartupDialog_invitation\">Sie wurden zu Jabber eingeladen. Bitte schließen Sie Ihre Registrierung ab.</string>\n\t<string name=\"StartupDialog_no_more_accounts\">Keine Unterstützung für mehrere Konten!</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_message\">Mitteilung von %s</string>\n\t<string name=\"notification_anonymous_message\">Mitteilung empfangen</string>\n\t<!--  Group Chat notification, %1$s is the user name, %2$s is the room, e.g. \"{Ge0rG} in {yaxim Chat}\" -->\n\t<string name=\"notification_muc_message\">%1$s in %2$s</string>\n\t<!--  Group Group Chat private message notification, %1$s is the user name, %2$s is the room, e.g. \"Message from {Ge0rG} in {yaxim Chat}\" -->\n\t<!--string name=\"notification_muc_pm\">Message from %1$s in %2$s</string-->\n\t<!-- notification button: direct reply (make SHORT string) -->\n\t<string name=\"notification_reply\">Antworten</string>\n\t<!-- notification button: mark as read (make SHORT string) -->\n\t<string name=\"notification_mark_read\">Gelesen</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_error\">Fehler beim Nachrichtenversand!</string>\n\n\t<!-- Notification Settings -->\n\t<string name=\"preftitle_notify\">Benachrichtigungs-Einstellungen</string>\n\t<string name=\"preftitle_notify_msg\">Benachrichtigung</string>\n\t<string name=\"preftitle_notify_muc\">Gruppenchat-Benachrichtigung</string>\n\t<string name=\"notification_custom\">Eigener Klingelton</string>\n\t<string name=\"muc_highlight_title\">Nur bei Erwähnung benachrichtigen</string>\n\t<string name=\"muc_highlight_sum\">Benachrichtigen, wenn der eigene Nickname erwähnt wird</string>\n\t<string name=\"led_title\">LED-Blinken</string>\n\t<string name=\"led_summ\">Neue Nachrichten durch LED-Blinken anzeigen</string>\n\t<string name=\"vibr_title\">Vibration</string>\n\t<string name=\"vibr_summ\">Bei neuen Nachrichten vibrieren</string>\n\t<string-array name=\"vibr_values_displayed\">\n\t\t<item>Niemals</item>\n\t\t<item>Systemvorgabe</item>\n\t\t<item>Immer</item>\n\t</string-array>\n\t<string name=\"ringtone_title\">Klingelton</string>\n\t<string name=\"ringtone_summ\">Ton für neue Nachrichten</string>\n\t<string name=\"ticker_title\">Vorschau auf Nachricht</string>\n\t<string name=\"ticker_summ\">Absender und Nachricht in Statusleiste anzeigen</string>\n\n\t<!-- Startup Setting Strings -->\n\t<string name=\"preftitle_general\">Allgemeine Einstellungen</string>\n\t<string name=\"pref_dnd_when_silent\">\\\"Nicht stören\\\" bei Stummschaltung</string>\n\t<string name=\"pref_dnd_when_silent_summ\">Setzt Ihren Online-Status auf \\\"Bitte nicht stören\\\" wenn das Telefon stummgeschaltet ist</string>\n\t<string name=\"statuspopup_name\">Status einstellen</string>\n\t<string name=\"showOffline_summ\">Alle Kontakte immer in der Liste anzeigen</string>\n\t<string name=\"showOffline_title\">Abgemeldete Kontakte anzeigen</string>\n\t<string name=\"enableGroups_summ\">Kontakte anhand ihrer Gruppenzugehörigkeit anordnen</string>\n\t<string name=\"enableGroups_title\">Kontaktgruppen anzeigen</string>\n\t<string name=\"foregroundService_summ\">App im Speicher halten, um die Verbindung aufrechtzuerhalten (Vordergrund-Dienst)</string>\n\t<string name=\"foregroundService_title\">Symbol in der Statusleiste</string>\n\n\t<string name=\"preftitle_debug\">Fehlerdiagnose</string>\n\t<string name=\"smackdebug_summ\">Paket- und Fehlerdiagnoseausgabe in »logcat« (kann persönliche Informationen enthalten)</string>\n\t<string name=\"smackdebug_title\">SMACK-Fehlerdiagnose</string>\n\n\t<string name=\"reportcrash_title\">Fehlerberichte senden</string>\n\t<string name=\"reportcrash_summ\">Anonymen Absturzbericht an die Entwickler senden</string>\n\n\t<!-- Appearence Strings -->\n\t<string name=\"preftitle_app\">Darstellung</string>\n\t<string name=\"FontChat_title\">Unterhaltungsschriftgröße</string>\n\t<string name=\"FontChat_summ\">Schriftgröße für Unterhaltung einstellen</string>\n\t<string name=\"FontChat_dialog\">Unterhaltungsschriftgröße</string>\n\t<!--\n\t<string name=\"FontRost_title\">Roster font size</string>\n\t<string name=\"FontRost_summ\">Set roster font size</string>\n\t<string name=\"FontRost_dialog\">Roster font fize</string>\n\t<string name=\"setFontRoster\">Set roster font size</string>\n\t-->\n\t<string name=\"pref_theme\">Erscheinungsbild</string>\n\t<string name=\"pref_theme_dark\">Dunkel</string>\n\t<string name=\"pref_theme_light\">Hell</string>\n\t<string name=\"pref_theme_pine\">Pinie</string>\n\t<string name=\"pref_theme_ice\">Eis</string>\n\t<string name=\"preftitle_ui\">Darstellung</string>\n\t<string-array name=\"fontSizesChat\">\n\t\t<item>klein</item>\n\t\t<item>normal</item>\n\t\t<item>groß</item>\n\t\t<item>riesig</item>\n\t</string-array>\n\n\t<!-- Mainmenu \t-->\n\t<string name=\"Menu_addFriend\">Kontakt hinzufügen</string>\n\t<string name=\"Menu_addClipboard\">%s hinzufügen</string>\n\t<string name=\"Menu_ShowOff\">Abwesende anzeigen</string>\n\t<string name=\"Menu_HideOff\">Abwesende verstecken</string>\n\t<string name=\"Menu_AccSettings\">Konto bearbeiten</string>\n\t<string name=\"Menu_Settings\">Einstellungen</string>\n\t<string name=\"Menu_Status\">Status</string>\n\t<string name=\"Menu_connect\">Verbinden</string>\n\t<string name=\"Menu_disconnect\">Trennen</string>\n\t<string name=\"Menu_about\">Über yaxim</string>\n\t<string name=\"Menu_about_bruno\">Über Bruno</string>\n\t<string name=\"Menu_muc\">Erkunden…</string>\n\t<string name=\"Menu_matrix\">Die Matrix betreten…</string>\n\t<string name=\"Menu_mark_all_as_read\">Alle als gelesen markieren</string>\n\t<string name=\"Menu_send_invitation\">Einladung erzeugen</string>\n    <string name=\"Menu_userlist\">Teilnehmer</string>\n\n\n\t<!-- AddFriend -->\n\t<string name=\"addFriend_Title\">Kontakt hinzufügen</string>\n\t<string name=\"addFriend_Summ\">Bitte die Jabber-ID Ihres Freundes eingeben, einen Anzeigenamen festlegen und eine Kontaktgruppe zuordnen!</string>\n\t<string name=\"addFriend_aliasHint\">Anzeigename</string>\n\t<string name=\"addrosteritemaddgroupchoice\">Zu neuer Gruppe hinzufügen</string>\n\t<string name=\"NewGroup_EditTextField_Hint\">Name der neuen Gruppe</string>\n\n\t<!-- Roster CONTEXTMENU -->\n\t<string name=\"roster_contextmenu_group_rename\">Gruppe umbenennen</string>\n\t<string name=\"roster_contextmenu_contact_mark_as_read\">Als gelesen markieren</string>\n\t<string name=\"roster_contextmenu_contact_delete\">Kontakt löschen</string>\n\t<string name=\"roster_contextmenu_contact_delmsg\">Chatverlauf löschen</string>\n\t<string name=\"roster_contextmenu_contact_rename\">Umbenennen</string>\n\t<string name=\"roster_contextmenu_contact_request_auth\">Genehmigung anfragen</string>\n\t<string name=\"roster_contextmenu_contact_change_group\">Gruppe ändern</string>\n\t<string name=\"roster_contextmenu_contact_share\">Adresse teilen</string>\n\t<string name=\"roster_contextmenu_contact_ringtone\">Klingelton</string>\n\t<string name=\"roster_contextmenu_muc_edit\">Gruppenchat bearbeiten</string>\n\t<string name=\"roster_contextmenu_muc_leave\">Gruppenchat verlassen</string>\n\t<string name=\"muc_leave_question\">%s wirklich verlassen?</string>\n\n\t<!-- Accountprefs -->\n\t<string name=\"account_settings_login\">Anmeldedaten</string>\n\t<string name=\"account_settings_title\">Kontoeinstellungen</string>\n\t<string name=\"account_options_title\">Verbindungseinstellungen</string>\n\t<string name=\"account_options_advanced\">Erweiterte Einstellungen</string>\n\t<string name=\"carbons_title\">Nachrichtenkopien (XEP-0280)</string>\n\t<string name=\"carbons_summ\">Gesprächsverlauf von anderen Anwendungen anfragen</string>\n\t<string name=\"account_jabberID_title\">Jabber-ID</string>\n\t<string name=\"account_jabberID_sum\">Beispiel: me@jabber.example.com</string>\n\t<string name=\"account_jabberID_dialog_title\">Jabber-ID eingeben:</string>\n\t<string name=\"account_jabberPW_title\">Kontopasswort</string>\n\t<string name=\"account_jabberPW_sum\">Ihr Passwort des Jabber-Kontos</string>\n\t<string name=\"account_jabberPW_change_on_server\">Passwort auf Server ändern</string>\n\t<string name=\"account_jabberPW_password_old\">Altes Passwort:</string>\n\t<string name=\"account_jabberPW_password_new\">Neues Passwort:</string>\n\t<string name=\"account_jabberPW_warning\">ACHTUNG! Sie müssen auf dem Server das selbe Passwort einstellen, um sich anmelden zu können!</string>\n\t<string name=\"account_jabberPW_progress\">Bitte warten, Passwort wird geändert…</string>\n\t<string name=\"account_jabberPW_finished\">Das Passwort wurde erfolgreich geändert.</string>\n\t<string name=\"account_jabberPW_error\">Fehler beim ändern des Passwortes: %s</string>\n\t<string name=\"account_nickname_title\">Anzeigename</string>\n\t<string name=\"account_nickname_summ\">Ihr Name, der anderen Nutzern angezeigt wird</string>\n\t\n\t<!-- accountprefs -->\n\t<string name=\"account_resource_title\">Client-Ressource</string>\n\t<string name=\"account_resource_summ\">Vorgabe: yaxim</string>\n\t<string name=\"account_resource_dialog_title\">Quelle eingeben:</string>\n\t<string name=\"account_resource_hint\">yaxim</string>\n\t<string name=\"account_prio_title\">Client-Priorität</string>\n\t<string name=\"account_prio_summ\">Vorgabe: 0 (erlaubt: -128 .. 127)</string>\n\t<string name=\"account_prio_error\">Erlaubte Werte: -128 .. 127</string>\n\t<string name=\"account_prio_dialog_title\">Priorität eingeben:</string>\n\t<string name=\"account_port_title\">Server-Port</string>\n\t<string name=\"account_port_sum\">Vorgabe: 5222</string>\n\t<string name=\"account_port_dialog_title\">Server-Port eingeben:</string>\n\t<string name=\"account_port_hint\">5222</string>\n\t<string name=\"account_customserver_title\">Benutzerdefinierter Server</string>\n\t<string name=\"account_customserver_summ\">(Optional) alternativer Serverrechnername</string>\n\t<string name=\"account_customserver_dialog_title\">Serverrechnername eingeben:</string>\n\t<string name=\"account_customserver_hint\">host.example.com</string>\n\t<string name=\"require_ssl_title\">SSL/TLS erzwingen</string>\n\t<string name=\"require_ssl_summ\">Serverkommunikation immer verschlüsseln</string>\n\n\t<!--StatusPopUp-->\n\t<string name=\"AddContact_SpinnerPrompt\">Gruppe auswählen</string>\n\t<string name=\"setStatusmsgHint\">Ihre Statusnachricht</string>\n\t<string name=\"setStatusTitle\">Status einstellen</string>\n\t<string name=\"RenameGroup_summ\">Gruppe %s umbenennen in:</string>\n\t<string name=\"RenameGroup_title\">Gruppe umbenennen</string>\n\t<string name=\"RenameEntry_summ\">%1$s (%2$s) umbenennen in:</string>\n\t<string name=\"RenameEntry_title\">Kontakt umbenennen</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_summ\">Gruppe aus der Liste auswählen</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_title\">Gruppe ändern</string>\n\t<string name=\"deleteRosterItem_text\">%1$s (%2$s) wirklich entfernen?</string>\n\t<string name=\"deleteRosterItem_title\">Kontakt löschen</string>\n\t<string name=\"deleteChatHistory_text\">Wirklich alle Nachrichten mit %1$s (%2$s) löschen?</string>\n\t<string name=\"deleteChatHistory_title\">Unterhaltungsverlauf löschen</string>\n\t<string name=\"subscriptionRequest_text\">%1$s möchte Sie als Kontakt hinzufügen: »%2$s«</string>\n\t<string name=\"subscriptionRequest_title\">Abonnementanfrage</string>\n\t<string name=\"subscription_accept\">Annehmen</string>\n\t<string name=\"subscription_reject\">Ablehnen</string>\n\t<string name=\"subscription_reject_all\">Alle ablehnen</string>\n\t<string name=\"subscription_status_from\">kann Ihren Status sehen</string>\n\n\t<!-- CHATWINDOW -->\n\t<string name=\"chat_from_me\">Ich:</string>\n\t<string name=\"toast_stored_offline\">Nachricht zum Versand gespeichert.</string>\n\t<string name=\"chat_enterMsgHint\">Mitteilung eingeben</string> \n\n\t<!-- Message context menu; use the verb form (to quote) -->\n\t<string name=\"chatmenu_quote\">Zitieren</string>\n\t<!-- Message context menu: repeat the same message -->\n\t<string name=\"chatmenu_resend\">Nachricht bearbeiten</string>\n\n\t<!-- GPS settings -->\n\t<!--\n\t<string name=\"showGPS_title\">GPS to status</string>\n\t<string name=\"showGPS_summ_on\">GPS is send to StatusMessage</string>\n\t<string name=\"showGPS_summ_off\">GPS is send to StatusMessage</string>\n\t-->\n\n\t<!-- About Dialog -->\n\t<string name=\"AboutDialog_title\">Über yaxim</string>\n\t<string name=\"AboutDialog_DevelopersTitle\">Entwickler</string>\n\t<!-- Contact the developer button -->\n\t<string name=\"AboutDialog_DevelopersText\">Kontakt</string>\n\t<string name=\"AboutDialog_LicenceTitle\">Lizenzierung</string>\n\t<string name=\"AboutDialog_Vote\">App bewerten</string>\n\t<string name=\"AboutDialog_LicenceText\">This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. Link: http://www.gnu.org/licenses/gpl-2.0.html\\n \\n Parts of this software are provided under the MIT License:\\n \\n Copyright © 2009 Mads Kristiansen, Nullwire ApS\\n \\n Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: \\n The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. \\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</string>\n\n\t<string name=\"status_available\">Online</string>\n\t<string name=\"status_away\">Abwesend</string>\n\t<string name=\"status_chat\">Frei zum Chatten</string>\n\t<string name=\"status_dnd\">Bitte nicht stören</string>\n\t<string name=\"status_xa\">Nicht verfügbar</string>\n\t<string name=\"status_offline\">Offline</string>\n\n\t<string name=\"translator_credits\">Launchpad Contributions:\n  Daniel Winzen https://launchpad.net/~q-d-deactivatedaccount\n  Georg Lukas https://launchpad.net/~ge0rg\n  Jan Kiszka https://launchpad.net/~jan-kiszka\n  Johannes Boost https://launchpad.net/~jjjb\n  Markus Unterwaditzer https://launchpad.net/~untitaker\n  Michael Kanis https://launchpad.net/~mkanis\n  René Moser https://launchpad.net/~resmo\n  Tobias Bannert https://launchpad.net/~toba</string>\n\n\t<!-- default roster group with no name -->\n\t<string name=\"default_group\">Allgemein</string>\n\t<string name=\"all_contacts_group\">Alle Kontakte</string>\n\t<string name=\"muc_group\">Gruppenchats</string>\n\n\t<!-- SEND listener popup -->\n\t<string name=\"chooseContact\">Kontakt auswählen</string>\n\t<string name=\"action_settings\">Einstellungen</string>\n\n\t<!-- MUC strings -->\n\t<string name=\"muc_jid_hint\">Gruppenchat-JID</string>\n\t<string name=\"muc_nickname_hint\">Nickname</string>\n\t<string name=\"muc_password_hint\">Passwort (optional)</string>\n\t<string name=\"title_activity_muc_invite\">Gruppenchat-Einladung</string>\n\t<!-- Groupchat invitation: \"Invitation from {contact name}\" -->\n\t<string name=\"muc_invitation_from\">Einladung von %s</string>\n\t<!-- Groupchat info: {description} ({number} participants) -->\n\t<string name=\"muc_invitation_occupants\">%1$s (%2$d Teilnehmer)</string>\n\t<!-- Notification button: \"Join as {default nickname}\" (make SHORT string) -->\n\t<string name=\"muc_invitation_join\">Beitreten als %s</string>\n\t<string name=\"muc_synchronizing\">Synchronisiere…</string>\n\t<!-- Title of user list, contains JID -->\n\t<string name=\"chat_muc_userlist\">Gruppenchat-Teilnehmer (%s)</string>\n\t<!-- Kicked from groupchat: \"Kicked: {reason} -->\n\t<string name=\"muc_kicked\">Gekickt: %s</string>\n\t<!-- Kicked from groupchat: \"Kicked by {admin name}: {reason} -->\n\t<string name=\"muc_kicked_by\">Gekickt von %1$s: %2$s</string>\n\t<!-- Banned from groupchat: \"Banned: {reason} -->\n\t<string name=\"muc_banned\">Gebannt: %s</string>\n\t<!-- Banned from groupchat: \"Banned by {admin name}: {reason} -->\n\t<string name=\"muc_banned_by\">Gebannt von %1$s: %2$s</string>\n\n\t<!-- File upload -->\n\t<string name=\"roster_contextmenu_send\">Senden…</string>\n\t<string name=\"roster_contextmenu_take_image\">Bild aufnehmen</string>\n\t<string name=\"roster_contextmenu_send_image\">Bild auswählen</string>\n\t<string name=\"roster_contextmenu_send_file\">Datei senden</string>\n\t<string name=\"upload_compress\">Komprimiere Bild…</string>\n\t<string name=\"upload_uploading\">Lade hoch...</string>\n\t<string name=\"upload_too_large\">Datei zu groß!</string>\n\t<string name=\"storage_permission\">%s braucht Speicherzugriff, um Dateien zu versenden!</string>\n\t<string name=\"notification_permission_denied\">Benachrichtigungen sind in den Android-App-Einstellungen deaktiviert.</string>\n\n\t<!-- Search -->\n\t<string name=\"search_msg_hint\">Nachrichteninhalt</string>\n\n\t<!-- MUC bookmarks -->\n\t<string name=\"group_bookmarks\">Meine Gruppenchats</string>\n\t<string name=\"group_mucsearch\">Öffentliche Gruppenchats</string>\n\t<!-- Service Discovery -->\n\t<string name=\"title_service_disco\">Browser: %s</string>\n\n\t<!-- Android 9 notification preferences: permanent notification -->\n\t<string name=\"notification_status\">Vordergrund-Dienst</string>\n\t<!-- Android 9 notification preferences: message notifications -->\n\t<string name=\"notification_msg\">Nachrichten</string>\n\n</resources>\n"
  },
  {
    "path": "res/values-el/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"app_name\">yaxim</string>\n\t<string name=\"app_name_bruno\">Bruno</string>\n\n\t<!-- Connection state -->\n\t<string name=\"conn_title\">yaxim: %s</string>\n\t<string name=\"conn_title_bruno\">Bruno: %s</string>\n\t<string name=\"conn_connecting\">Σύνδεση στο server…</string>\n\t<string name=\"conn_disconnecting\">Γίνεται αποσύνδεση...</string>\n\t<string name=\"conn_online\">Με σύνδεση</string>\n\t<string name=\"conn_offline\">Εκτός Σύνδεσης</string>\n\t<string name=\"conn_empty_roster\">Δεν υπάρχουν επαφές για εμφάνιση</string>\n\t<string name=\"conn_empty_roster_hints\">Υπάρχουν πολλοί τρόπο θα προσθέτετε επαφές:\\n\\n - Android Beam™: επαφή με κινητό φίλου\\n\\n - Μέσω κωδικού QR\\n\\n - \\\"Δημιουργία πρόσκλησης\\\" και διαμοιρασμού (e-mail, SMS, κωδικό QR, …)\\n\\n - \\\"Προσθήκη επαφής\\\" εάν γνωρίζετε το JID</string>\n\t<string name=\"conn_reconnect\">Επόμενη προσπάθεια σύνδεσης σε %d δευτερόλεπτα.</string>\n\t<string name=\"conn_disconnected\">Η σύνδεση τερματίστηκε</string>\n\t<string name=\"conn_no_network\">Δεν υπάρχει σύνδεση δικτύου</string>\n\t<string name=\"conn_ping_timeout\">Καμία απόκριση</string>\n\t<string name=\"conn_error\">Σφάλμα: %s</string>\n\n\t<!-- Global Strings -->\n\t<string name=\"Global_Exit\">Έξοδος</string>\n\t<string name=\"Global_authenticate_first\">Παρακαλώ συνδεθείτε πρώτα</string>\n\t<string name=\"Global_JID_hint\">user@yax.im</string>\n\t<!-- tooltip message when the user entered an invalid XMPP address -->\n\t<string name=\"Global_JID_malformed\">Ελέγξτε την μορφοποίηση του συνδέσμου!</string>\n\n\t<!-- FirstStartUpDialog -->\n\t<string name=\"StartupDialog_Title\">Καλωσορίσατε στο yaxim!</string>\n\t<string name=\"StartupDialog_Summary\">Πρέπει να ρυθμίσετε πρώτα το yaxim για να μπορέσετε να το χρησιμοποιήσετε. Παρακαλώ το εισάγετε το Jabber ID και τον κωδικό σας.</string>\n\t<string name=\"StartupDialog_pwHint\">Εισάγετε κωδικό</string>\n\t<string name=\"StartupDialog_pwshowHint\">Εμφάνιση κωδικού</string>\n\t<string name=\"StartupDialog_Username_title\">Jabber ID:</string>\n\t<string name=\"StartupDialog_passwd_title\">Κωδικός:</string>\n\t<string name=\"StartupDialog_advanced\">Περισσότερα...</string>\n\t<string name=\"StartupDialog_create_new\">Δημιουργία νέου λογαριασμού</string>\n\t<string name=\"StartupDialog_error_password\">Το συνθηματικό έχει μικρό μήκος!</string>\n\t<string name=\"StartupDialog_created_password\">Δημιουργήθηκε ασφαλές συνθηματικό</string>\n\t<string name=\"StartupDialog_auth_failed\">Παρακαλώ ελέγξτε το όνομα χρήστη και συνθηματικό σας!</string>\n\t<string name=\"StartupDialog_server_failed\">Αδυναμία σύνδεσης σε %s!</string>\n\t<string name=\"StartupDialog_no_registration\">Ο διακομιστής δεν επιτρέπει εγγραφές!</string>\n\n\t<string name=\"StartupDialog_invitation\">Έχετε προσκαλεσθεί σε Jabber. Παρακαλώ ολοκληρώστε την εγγραφή σας.</string>\n\t<string name=\"StartupDialog_no_more_accounts\">Δεν επιτρέπεται επιπλέον λογαριασμός!</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_message\">Μήνυμα από %s</string>\n\t<string name=\"notification_anonymous_message\">Μήνυμα ελήφθη</string>\n\t<!--  Group Chat notification, %1$s is the user name, %2$s is the room, e.g. \"{Ge0rG} in {yaxim Chat}\" -->\n\t<string name=\"notification_muc_message\">%1$s από %2$s</string>\n\t<!--  Group Group Chat private message notification, %1$s is the user name, %2$s is the room, e.g. \"Message from {Ge0rG} in {yaxim Chat}\" -->\n\t<!--string name=\"notification_muc_pm\">Message from %1$s in %2$s</string-->\n\t<!-- notification button: direct reply (make SHORT string) -->\n\t<string name=\"notification_reply\">Απάντηση</string>\n\t<!-- notification button: mark as read (make SHORT string) -->\n\t<string name=\"notification_mark_read\">Σημείωση ως διαβασμένο</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_error\">Σφάλμα κατά την αποστολή του μηνύματος!</string>\n\n\t<!-- Notification Settings -->\n\t<string name=\"preftitle_notify\">Ρυθμίσεις Ειδοποιήσεων</string>\n\t<string name=\"preftitle_notify_msg\">Ειδοποίηση μηνύματος</string>\n\t<string name=\"preftitle_notify_muc\">Ειδοποίηση από Γκρουπ</string>\n\t<string name=\"notification_custom\">Προσωπικό Ringtone</string>\n\t<string name=\"muc_highlight_title\">Ειδοποίηση μόνο σε απάντηση με αναφορά</string>\n\t<string name=\"muc_highlight_sum\">Ειδοποίηση όταν το ψευδόνυμο αναφερθεί σε δωμάτιο</string>\n\t<string name=\"led_title\">Ειδοποίηση μέσω LED</string>\n\t<string name=\"led_summ\">Ειδοποίηση μέσω LED του κινητού σε εισερχόμενα μηνύματα</string>\n\t<string name=\"vibr_title\">Δόνηση</string>\n\t<string name=\"vibr_summ\">Δόνηση σε εισερχόμενα μηνύματα</string>\n\t<string-array name=\"vibr_values_displayed\">\n\t\t<item>Ποτέ</item>\n\t\t<item>Επιλογή συστήματος</item>\n\t\t<item>Πάντα</item>\n\t</string-array>\n\t<string name=\"ringtone_title\">Ήχος κλήσης</string>\n\t<string name=\"ringtone_summ\">Ήχος για εισερχόμενα μηνύματα</string>\n\t<string name=\"ticker_title\">Προεπισκόπηση μηνύματος</string>\n\t<string name=\"ticker_summ\">Εμφάνιση ονόματος αποστολέα στην μπάρα ειδοποιήσεων</string>\n\n\t<!-- Startup Setting Strings -->\n\t<string name=\"preftitle_general\">Γενικές ρυθμίσεις</string>\n\t<string name=\"pref_dnd_when_silent\">\\\"Μην ενοχλείτε\\\" σε κατάσταση σίγασης</string>\n\t<string name=\"pref_dnd_when_silent_summ\">Ορίσετε την κατάστασή σας σε \\\"DND\\\" (μην ενοχλείτε) όταν το κινητό σας βρίσκεται σε κατάσταση σίγασης</string>\n\t<string name=\"statuspopup_name\">Καθορισμός της κατάστασή σας</string>\n\t<string name=\"showOffline_summ\">Πάντα εμφανείς όλες οι επαφές στη λίστα</string>\n\t<string name=\"showOffline_title\">Εμφάνιση επαφών εκτός σύνδεσης</string>\n\t<string name=\"enableGroups_summ\">Στοίχιση επαφών με βάση τα γκρουπ</string>\n\t<string name=\"enableGroups_title\">Εμφάνιση γκρουπ επαφών</string>\n\t<string name=\"foregroundService_summ\">Να παραμένει η εφαρμογή ενεργή στη μνήμη για να βεβαιώσετε αδιάλειπτη σύνδεση (υπηρεσία παρασκηνίου)</string>\n\t<string name=\"foregroundService_title\">Εικονίδιο μπάρας ειδοποιήσεων</string>\n\n\t<string name=\"preftitle_debug\">Αποσφαλμάτωση</string>\n\t<string name=\"smackdebug_summ\">Πακέτα και αποσφαλμάτωση μέσω logcat (μπορεί να περιέχει προσωπικές πληροφορίες)</string>\n\t<string name=\"smackdebug_title\">SMACK αποσφαλμάτωση</string>\n\n\t<string name=\"reportcrash_title\">Αποστολή αναφορών προβλημάτων</string>\n\t<string name=\"reportcrash_summ\">Αποστολή ανώνυμων αναφορών προβλημάτων στον προγραμματιστή</string>\n\n\t<!-- Appearence Strings -->\n\t<string name=\"preftitle_app\">Εμφάνιση</string>\n\t<string name=\"FontChat_title\">Μέγεθος γραμματοσειράς</string>\n\t<string name=\"FontChat_summ\">Ρύθμιση του μεγέθος γραμματοσειρά μηνυμάτων</string>\n\t<string name=\"FontChat_dialog\">Μέγεθος γραμματοσειράς</string>\n\t<!--\n\t<string name=\"FontRost_title\">Roster font size</string>\n\t<string name=\"FontRost_summ\">Set roster font size</string>\n\t<string name=\"FontRost_dialog\">Roster font fize</string>\n\t<string name=\"setFontRoster\">Set roster font size</string>\n\t-->\n\t<string name=\"pref_theme\">Εμφάνιση</string>\n\t<string name=\"pref_theme_dark\">Σκοτεινό</string>\n\t<string name=\"pref_theme_light\">Φωτεινό</string>\n\t<string name=\"pref_theme_pine\">Πεύκο</string>\n\t<string name=\"pref_theme_ice\">Πάγος</string>\n\t<string name=\"preftitle_ui\">Εμφάνιση</string>\n\t<string-array name=\"fontSizesChat\">\n\t\t<item>Μικρό</item>\n\t\t<item>Κανονικό</item>\n\t\t<item>Μεγάλο</item>\n\t\t<item>Τεράστιο</item>\n\t</string-array>\n\n\t<!-- Mainmenu \t-->\n\t<string name=\"Menu_addFriend\">Προσθήκη επαφής</string>\n\t<string name=\"Menu_addClipboard\">Προσθήκη %s</string>\n\t<string name=\"Menu_ShowOff\">Εμφάνιση εκτός σύνδεσης</string>\n\t<string name=\"Menu_HideOff\">Απόκρυψη εκτός σύνδεσης</string>\n\t<string name=\"Menu_AccSettings\">Επεξεργασία λογαριασμού</string>\n\t<string name=\"Menu_Settings\">Ρυθμίσεις</string>\n\t<string name=\"Menu_Status\">Κατάσταση</string>\n\t<string name=\"Menu_connect\">Σύνδεση</string>\n\t<string name=\"Menu_disconnect\">Αποσύνδεση</string>\n\t<string name=\"Menu_about\">Περί του yaxim</string>\n\t<string name=\"Menu_about_bruno\">Περί του Bruno</string>\n\t<string name=\"Menu_muc\">Προσθήκη / αναζήτηση...</string>\n\t<string name=\"Menu_matrix\">Μπείτε στο Matrix...</string>\n\t<string name=\"Menu_mark_all_as_read\">Σημείωση όλων ως αναγνωσμένα</string>\n\t<string name=\"Menu_send_invitation\">Δημιουργία πρόσκλησης</string>\n    <string name=\"Menu_userlist\">Συμμετέχοντες</string>\n\n\n\t<!-- AddFriend -->\n\t<string name=\"addFriend_Title\">Προσθήκη μιας Επαφής</string>\n\t<string name=\"addFriend_Summ\">Παρακαλώ εισάγετε το Jabber ID και το εμφανιζόμενο όνομα της επικοινωνία σας και αντιστοιχίσετε την σε μια ομάδα!</string>\n\t<string name=\"addFriend_aliasHint\">Εμφανής ονομασία</string>\n\t<string name=\"addrosteritemaddgroupchoice\">Προσθήκη σε νέα ομάδα</string>\n\t<string name=\"NewGroup_EditTextField_Hint\">Ονομασία της  νέας ομάδας</string>\n\n\t<!-- Roster CONTEXTMENU -->\n\t<string name=\"roster_contextmenu_group_rename\">Μετονομασία ομάδας</string>\n\t<string name=\"roster_contextmenu_contact_mark_as_read\">Σήμανση ως αναγνωσμένο</string>\n\t<string name=\"roster_contextmenu_contact_delete\">Διαγραφή επαφής</string>\n\t<string name=\"roster_contextmenu_contact_delmsg\">Διαγραφή ιστορικού μηνυμάτων</string>\n\t<string name=\"roster_contextmenu_contact_rename\">Μετονομασία</string>\n\t<string name=\"roster_contextmenu_contact_request_auth\">Αίτηση έγκρισης</string>\n\t<string name=\"roster_contextmenu_contact_change_group\">Αλλαγή ομάδας</string>\n\t<string name=\"roster_contextmenu_contact_share\">Διαμοιρασμός διεύθυνσης</string>\n\t<string name=\"roster_contextmenu_contact_ringtone\">Ήχος κλήσης</string>\n\t<string name=\"roster_contextmenu_muc_edit\">Επεξεργασία ομάδας μηνυμάτων</string>\n\t<string name=\"roster_contextmenu_muc_leave\">Αποχώρηση από ομάδα μηνυμάτων</string>\n\t<string name=\"muc_leave_question\">Θέλετε να φύγετε πραγματικά %s ;</string>\n\n\t<!-- Accountprefs -->\n\t<string name=\"account_settings_login\">Πληροφορίες Σύνδεσης</string>\n\t<string name=\"account_settings_title\">Ρυθμίσεις Λογαριασμού</string>\n\t<string name=\"account_options_title\">Επιλογή Σύνδεσης</string>\n\t<string name=\"account_options_advanced\">Προχωρημένες Επιλογές</string>\n\t<string name=\"carbons_title\">Αντίγραφα Μηνυμάτων (XEP-0280)</string>\n\t<string name=\"carbons_summ\">Αίτηση για αντίγραφα μηνυμάτων από άλλες εφαρμογές</string>\n\t<string name=\"account_jabberID_title\">Jabber ID</string>\n\t<string name=\"account_jabberID_sum\">παράδειγμα: me@jabber.example.com</string>\n\t<string name=\"account_jabberID_dialog_title\">Εισαγάγετε το Jabber ID σας:</string>\n\t<string name=\"account_jabberPW_title\">Συνθηματικό Λογαριασμού</string>\n\t<string name=\"account_jabberPW_sum\">Συνθηματικό του Jabber λογαριασμού σας</string>\n\t<string name=\"account_jabberPW_change_on_server\">Αλλαγή συνθηματικού στον εξυπηρετητή</string>\n\t<string name=\"account_jabberPW_password_old\">Παλαιό Συνθηματικό</string>\n\t<string name=\"account_jabberPW_password_new\">Νέο Συνθηματικό</string>\n\t<string name=\"account_jabberPW_warning\">ΠΡΟΣΟΧΗ! Για επιτυχής σύνδεση πρέπει να ορίσετε το ίδιο συνθηματικό και στον εξυπηρετητή!</string>\n\t<string name=\"account_jabberPW_progress\">Παρακαλώ περιμένετε, αλλάζει το συνθηματικό...</string>\n\t<string name=\"account_jabberPW_finished\">Το συνθηματικό άλλαξε με επιτυχία.</string>\n\t<string name=\"account_jabberPW_error\">Σφάλμα αλλαγής συνθηματικού: %s</string>\n\t<string name=\"account_nickname_title\">Εμφανιζόμενο Όνομα</string>\n\t<string name=\"account_nickname_summ\">Το ψευδόνυμο που θα εμφανίζετε σε τρίτους</string>\n\t\n\t<!-- accountprefs -->\n\t<string name=\"account_resource_title\">Πηγή Πελάτη</string>\n\t<string name=\"account_resource_summ\">Default: yaxim</string>\n\t<string name=\"account_resource_dialog_title\">Εισάγετε πηγή:</string>\n\t<string name=\"account_resource_hint\">yaxim</string>\n\t<string name=\"account_prio_title\">Προτεραιότητά του Client</string>\n\t<string name=\"account_prio_summ\">Προεπιλογή: 0 (επιτρέπεται: -128 .. 127)</string>\n\t<string name=\"account_prio_error\">Επιτρεπόμενες τιμές: -128 .. 127</string>\n\t<string name=\"account_prio_dialog_title\">Εισάγετε την προτεραιότητά σας:</string>\n\t<string name=\"account_port_title\">Θύρα Εξυπηρετητή</string>\n\t<string name=\"account_port_sum\">Προεπιλογή: 5222</string>\n\t<string name=\"account_port_dialog_title\">Εισάγετε τη θύρα του εξυπηρετητή:</string>\n\t<string name=\"account_port_hint\">5222</string>\n\t<string name=\"account_customserver_title\">Προσαρμοσμένος Εξυπηρετητής</string>\n\t<string name=\"account_customserver_summ\">(Προαιρετικό) εναλλακτικό hostname εξυπηρετητή</string>\n\t<string name=\"account_customserver_dialog_title\">Πληκτρολογήστε το hostname του εξυπηρετητή:</string>\n\t<string name=\"account_customserver_hint\">host.example.com</string>\n\t<string name=\"require_ssl_title\">Απαιτείται SSL/TLS</string>\n\t<string name=\"require_ssl_summ\">Πάντα κρυπτογράφημένη σύνδεση</string>\n\n\t<!--StatusPopUp-->\n\t<string name=\"AddContact_SpinnerPrompt\">Επιλογή Ομάδας</string>\n\t<string name=\"setStatusmsgHint\">Το μήνυμα κατάστασής σας</string>\n\t<string name=\"setStatusTitle\">Καθορισμός της κατάστασή σας</string>\n\t<string name=\"RenameGroup_summ\">Mετονομασία ομάδας %s σε:</string>\n\t<string name=\"RenameGroup_title\">Μετονομασία ομάδας</string>\n\t<string name=\"RenameEntry_summ\">Μετονομασία %1$s (%2$s) σε:</string>\n\t<string name=\"RenameEntry_title\">Μετονομασία επαφής</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_summ\">Διαλέξτε μια ομάδα απο την λίστα</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_title\">Αλλαγή ομάδας</string>\n\t<string name=\"deleteRosterItem_text\">Σίγουρα να διαγραφεί επαφή %1$s (%2$s);</string>\n\t<string name=\"deleteRosterItem_title\">Διαγραφή Επαφής</string>\n\t<string name=\"deleteChatHistory_text\">Διαγραφή όλων των μηνυμάτων με %1$s (%2$s) ;</string>\n\t<string name=\"deleteChatHistory_title\">Διαγραφή Ιστορικού Μηνυμάτων</string>\n\t<string name=\"subscriptionRequest_text\">%1$s θέλει να σε προσθέσει ως επαφή: \\\"%2$s\\\"</string>\n\t<string name=\"subscriptionRequest_title\">Αίτηση Εγγραφής</string>\n\t<string name=\"subscription_accept\">Αποδοχή</string>\n\t<string name=\"subscription_reject\">Απόρριψη</string>\n\t<string name=\"subscription_reject_all\">Απόρριψη όλων</string>\n\t<string name=\"subscription_status_from\">μπορεί να δει την κατάστασή σας</string>\n\n\t<!-- CHATWINDOW -->\n\t<string name=\"chat_from_me\">Εγώ:</string>\n\t<string name=\"toast_stored_offline\">Το μήνυμα έχει αποθηκευτεί για την μετάδοση.</string>\n\t<string name=\"chat_enterMsgHint\">Πληκτρολογήστε το μήνυμα</string> \n\n\t<!-- Message context menu; use the verb form (to quote) -->\n\t<string name=\"chatmenu_quote\">Παράθεση</string>\n\t<!-- Message context menu: repeat the same message -->\n\t<string name=\"chatmenu_resend\">Επεξεργασία μηνύματος</string>\n\n\t<!-- GPS settings -->\n\t<!--\n\t<string name=\"showGPS_title\">GPS to status</string>\n\t<string name=\"showGPS_summ_on\">GPS is send to StatusMessage</string>\n\t<string name=\"showGPS_summ_off\">GPS is send to StatusMessage</string>\n\t-->\n\n\t<!-- About Dialog -->\n\t<string name=\"AboutDialog_title\">Περί του yaxim</string>\n\t<string name=\"AboutDialog_DevelopersTitle\">Προγραμματιστές</string>\n\t<!-- Contact the developer button -->\n\t<string name=\"AboutDialog_DevelopersText\">Επικοινωνία</string>\n\t<string name=\"AboutDialog_LicenceTitle\">Αδειοδότηση</string>\n\t<string name=\"AboutDialog_Vote\">Βαθμολογία εφαρμογής</string>\n\t<string name=\"AboutDialog_LicenceText\">Αυτό το πρόγραμμα είναι ελεύθερο λογισμικό· μπορείτε να το αναδιανείμετε και/ή να το τροποποιήσετε υπό τους όρους της GNU General Public License έκδοσης 2, όπως δημοσιεύθηκε από το Free Software Foundation. Σύνδεσμος: http://www.gnu.org/licenses/gpl-2.0.html\\n \\n Μέρη αυτού του λογισμικού παρέχονται υπό την άδεια MIT:\\n \\n Πνευματικά Δικαιώματα © 2009 Mads Kristiansen, Nullwire ApS\\n \\n Δίδεται άδεια, χωρίς χρέωση, σε οποιονδήποτε αποκτήσει ένα αντίγραφο αυτού του λογισμικού και των συναφών αρχείων τεκμηρίωσης (το \"Λογισμικό\"), να ασχοληθεί με το Λογισμικό χωρίς περιορισμό, συμπεριλαμβανομένων, χωρίς περιορισμό, των δικαιωμάτων χρήσης, αντιγραφής, τροποποίησης, συγχώνευσης, δημοσίευσης, διανομής, αδειοδότησης και/ή πώλησης αντιγράφων του Λογισμικού, και να επιτρέψει σε άτομα στα οποία παρέχεται το Λογισμικό να το πράξουν, υπό τις ακόλουθες προϋποθέσεις: \\n Η παραπάνω ειδοποίηση πνευματικών δικαιωμάτων και αυτή η άδεια θα πρέπει να περιλαμβάνονται σε όλα τα αντίγραφα ή σε σημαντικά μέρη του Λογισμικού. \\n ΤΟ ΛΟΓΙΣΜΙΚΟ ΠΑΡΕΧΕΤΑΙ \"ΩΣ ΕΧΕΙ\", ΧΩΡΙΣ ΚΑΜΙΑ ΕΓΓΥΗΣΗ, ΡΗΤΗ Ή ΣΙΩΠΗΡΗ, ΣΥΜΠΕΡΙΛΑΜΒΑΝΟΜΕΝΩΝ, ΑΛΛΑ ΟΧΙ ΠΕΡΙΟΡΙΣΤΙΚΑ, ΤΩΝ ΕΓΓΥΗΣΕΩΝ ΕΜΠΟΡΕΥΣΙΜΟΤΗΤΑΣ, ΚΑΤΑΛΛΗΛΟΤΗΤΑΣ ΓΙΑ ΣΥΓΚΕΚΡΙΜΕΝΟ ΣΚΟΠΟ ΚΑΙ ΜΗ ΠΑΡΑΒΙΑΣΗΣ. ΣΕ ΚΑΜΙΑ ΠΕΡΙΠΤΩΣΗ ΔΕΝ ΘΑ ΕΙΝΑΙ ΥΠΕΥΘΥΝΟΙ ΟΙ ΣΥΓΓΡΑΦΕΙΣ Ή ΟΙ ΚΑΤΟΧΟΙ ΤΩΝ ΠΝΕΥΜΑΤΙΚΩΝ ΔΙΚΑΙΩΜΑΤΩΝ ΓΙΑ ΟΠΟΙΑΔΗΠΟΤΕ ΑΞΙΩΣΗ, ΖΗΜΙΑ Ή ΑΛΛΗ ΕΥΘΥΝΗ, ΕΙΤΕ ΣΕ ΣΥΜΒΑΣΗ, ΑΔΙΚΟΠΡΑΞΙΑ Ή ΑΛΛΩΣ, ΠΟΥ ΠΡΟΚΥΠΤΕΙ ΑΠΟ Ή ΣΕ ΣΧΕΣΗ ΜΕ ΤΟ ΛΟΓΙΣΜΙΚΟ Ή ΤΗ ΧΡΗΣΗ Ή ΑΛΛΕΣ ΣΥΝΑΛΛΑΓΕΣ ΣΤΟ ΛΟΓΙΣΜΙΚΟ.</string>\n\n\t<string name=\"status_available\">Με σύνδεση</string>\n\t<string name=\"status_away\">Απουσιάζω</string>\n\t<string name=\"status_chat\">Ανοιχτός για συζήτηση</string>\n\t<string name=\"status_dnd\">Μην ενοχλείτε</string>\n\t<string name=\"status_xa\">Μη διαθέσιμος/η</string>\n\t<string name=\"status_offline\">Εκτός Σύνδεσης</string>\n\n\t<string name=\"translator_credits\">Launchpad Contributions:\n  Georg Lukas https://launchpad.net/~ge0rg\n  Lef https://launchpad.net/~somniusx\n  Theo Ioannidis https://launchpad.net/~xaroulhs1983</string>\n\n\t<!-- default roster group with no name -->\n\t<string name=\"default_group\">Γενικά</string>\n\t<string name=\"all_contacts_group\">Όλες οι επαφές</string>\n\t<string name=\"muc_group\">Ομαδικές συζητήσεις</string>\n\n\t<!-- SEND listener popup -->\n\t<string name=\"chooseContact\">Επιλογή επαφής</string>\n\t<string name=\"action_settings\">Ρυθμίσεις</string>\n\n\t<!-- MUC strings -->\n\t<string name=\"muc_jid_hint\">JID ομαδικής συζύτησης</string>\n\t<string name=\"muc_nickname_hint\">Ψευδώνυμο</string>\n\t<string name=\"muc_password_hint\">Συνθηματικό (προαιρετικό)</string>\n\t<string name=\"title_activity_muc_invite\">Πρόσκληση σε Ομαδική Συζήτηση</string>\n\t<!-- Groupchat invitation: \"Invitation from {contact name}\" -->\n\t<string name=\"muc_invitation_from\">Πρόσκληση από %s</string>\n\t<!-- Groupchat info: {description} ({number} participants) -->\n\t<string name=\"muc_invitation_occupants\">%1$s (%2$d συμμετέχοντες)</string>\n\t<!-- Notification button: \"Join as {default nickname}\" (make SHORT string) -->\n\t<string name=\"muc_invitation_join\">Συμμετοχή ως %s</string>\n\t<string name=\"muc_synchronizing\">Συγχρονίζει...</string>\n\t<!-- Title of user list, contains JID -->\n\t<string name=\"chat_muc_userlist\">Συμμετέχοντες σε Ομαδική Συζήτηση (%s)</string>\n\t<!-- Kicked from groupchat: \"Kicked: {reason} -->\n\t<string name=\"muc_kicked\">Εκδιώχθηκε: %s</string>\n\t<!-- Kicked from groupchat: \"Kicked by {admin name}: {reason} -->\n\t<string name=\"muc_kicked_by\">Εκδιώχθηκε από %1$s: %2$s</string>\n\t<!-- Banned from groupchat: \"Banned: {reason} -->\n\t<string name=\"muc_banned\">Αποκλείστηκε: %s</string>\n\t<!-- Banned from groupchat: \"Banned by {admin name}: {reason} -->\n\t<string name=\"muc_banned_by\">Αποκλείστηκε από %1$s: %2$s</string>\n\n\t<!-- File upload -->\n\t<string name=\"roster_contextmenu_send\">Αποστολή...</string>\n\t<string name=\"roster_contextmenu_take_image\">Λήψη φωτογραφίας</string>\n\t<string name=\"roster_contextmenu_send_image\">Επιλογή φωτογραφίας</string>\n\t<string name=\"roster_contextmenu_send_file\">Αποστολή αρχείου</string>\n\t<string name=\"upload_compress\">Συμπίεση φωτογραφίας...</string>\n\t<string name=\"upload_uploading\">Γίνεται αποστολή…</string>\n\t<string name=\"upload_too_large\">αρχείο πολύ μεγάλο!</string>\n\t<string name=\"storage_permission\">Το %s χρειάζεται πρόσβαση στον χώρο αποθήκευσης για να αποσταλούν αρχεία!</string>\n\t<string name=\"notification_permission_denied\">Notifications are disabled in the Android app preferences.</string>\n\n\t<!-- Search -->\n\t<string name=\"search_msg_hint\">Περιεχόμενο μηνύματος</string>\n\n\t<!-- MUC bookmarks -->\n\t<string name=\"group_bookmarks\">Οι ομαδικές συνομιλίες μου</string>\n\t<string name=\"group_mucsearch\">Δημόσιες ομαδικές συνομιλίες</string>\n\t<!-- Service Discovery -->\n\t<string name=\"title_service_disco\">Πρόγραμμα περιήγησης: %s</string>\n\n\t<!-- Android 9 notification preferences: permanent notification -->\n\t<string name=\"notification_status\">Υπηρεσία προσκηνίου</string>\n\t<!-- Android 9 notification preferences: message notifications -->\n\t<string name=\"notification_msg\">Μηνύματα</string>\n\n</resources>\n"
  },
  {
    "path": "res/values-en-rGB/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"app_name\">yaxim</string>\n\t<string name=\"app_name_bruno\">Bruno</string>\n\n\t<!-- Connection state -->\n\t<string name=\"conn_title\">yaxim: %s</string>\n\t<string name=\"conn_title_bruno\">Bruno: %s</string>\n\t<string name=\"conn_connecting\">Connecting to server…</string>\n\t<string name=\"conn_disconnecting\">Disconnecting…</string>\n\t<string name=\"conn_online\">Online</string>\n\t<string name=\"conn_offline\">Offline</string>\n\t<string name=\"conn_empty_roster\">No contacts to show!</string>\n\t<string name=\"conn_empty_roster_hints\">There are many ways to add contacts:\\n\\n - Android Beam™: touch a friend\\'s phone\\n\\n - Scan a QR code\\n\\n - \\\"Create invitation\\\" and share it (e-mail, SMS, QR code, …)\\n\\n - \\\"Add contact\\\" if you know the JID</string>\n\t<string name=\"conn_reconnect\">Next connection attempt in %d seconds.</string>\n\t<string name=\"conn_disconnected\">Connection closed</string>\n\t<string name=\"conn_no_network\">No network connection</string>\n\t<string name=\"conn_ping_timeout\">No response</string>\n\t<string name=\"conn_error\">Error: %s</string>\n\n\t<!-- Global Strings -->\n\t<string name=\"Global_Exit\">Exit</string>\n\t<string name=\"Global_authenticate_first\">Please connect first</string>\n\t<string name=\"Global_JID_hint\">user@yax.im</string>\n\t<!-- tooltip message when the user entered an invalid XMPP address -->\n\t<string name=\"Global_JID_malformed\">Check address format!</string>\n\n\t<!-- FirstStartUpDialog -->\n\t<string name=\"StartupDialog_Title\">Welcome to yaxim!</string>\n\t<string name=\"StartupDialog_Summary\">You need to configure yaxim before you can use it. Please enter your Jabber ID and password.</string>\n\t<string name=\"StartupDialog_pwHint\">Enter password</string>\n\t<string name=\"StartupDialog_pwshowHint\">Show password</string>\n\t<string name=\"StartupDialog_Username_title\">Jabber ID:</string>\n\t<string name=\"StartupDialog_passwd_title\">Password:</string>\n\t<string name=\"StartupDialog_advanced\">Advanced…</string>\n\t<string name=\"StartupDialog_create_new\">Register new account</string>\n\t<string name=\"StartupDialog_error_password\">Password is too short!</string>\n\t<string name=\"StartupDialog_created_password\">Created secure password</string>\n\t<string name=\"StartupDialog_auth_failed\">Please check your username and password!</string>\n\t<string name=\"StartupDialog_server_failed\">Could not connect to %s!</string>\n\t<string name=\"StartupDialog_no_registration\">Server does not allow registration!</string>\n\n\t<string name=\"StartupDialog_invitation\">You have been invited to Jabber. Please complete your registration.</string>\n\t<string name=\"StartupDialog_no_more_accounts\">No additional account supported!</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_message\">Message from %s</string>\n\t<string name=\"notification_anonymous_message\">Message received</string>\n\t<!--  Group Chat notification, %1$s is the user name, %2$s is the room, e.g. \"{Ge0rG} in {yaxim Chat}\" -->\n\t<string name=\"notification_muc_message\">%1$s in %2$s</string>\n\t<!--  Group Group Chat private message notification, %1$s is the user name, %2$s is the room, e.g. \"Message from {Ge0rG} in {yaxim Chat}\" -->\n\t<!--string name=\"notification_muc_pm\">Message from %1$s in %2$s</string-->\n\t<!-- notification button: direct reply (make SHORT string) -->\n\t<string name=\"notification_reply\">Reply</string>\n\t<!-- notification button: mark as read (make SHORT string) -->\n\t<string name=\"notification_mark_read\">Mark Read</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_error\">Error while sending message!</string>\n\n\t<!-- Notification Settings -->\n\t<string name=\"preftitle_notify\">Notification Settings</string>\n\t<string name=\"preftitle_notify_msg\">Message Notification</string>\n\t<string name=\"preftitle_notify_muc\">Group Chat Notification</string>\n\t<string name=\"notification_custom\">Custom Ringtone</string>\n\t<string name=\"muc_highlight_title\">Only notify on mention</string>\n\t<string name=\"muc_highlight_sum\">Notify when your nickname is mentioned in a room</string>\n\t<string name=\"led_title\">Blinking LED</string>\n\t<string name=\"led_summ\">Blink phone LED on incoming messages</string>\n\t<string name=\"vibr_title\">Vibration</string>\n\t<string name=\"vibr_summ\">Vibrate on incoming messages</string>\n\t<string-array name=\"vibr_values_displayed\">\n\t\t<item>Never</item>\n\t\t<item>System preference</item>\n\t\t<item>Always</item>\n\t</string-array>\n\t<string name=\"ringtone_title\">Ringtone</string>\n\t<string name=\"ringtone_summ\">Tone for incoming messages</string>\n\t<string name=\"ticker_title\">Message preview</string>\n\t<string name=\"ticker_summ\">Show sender and message in status bar</string>\n\n\t<!-- Startup Setting Strings -->\n\t<string name=\"preftitle_general\">General Settings</string>\n\t<string name=\"pref_dnd_when_silent\">\\\"Do not disturb\\\" in silent mode</string>\n\t<string name=\"pref_dnd_when_silent_summ\">Set your online status to \\\"DND\\\" when your phone is in silent mode</string>\n\t<string name=\"statuspopup_name\">Set your status</string>\n\t<string name=\"showOffline_summ\">Always show all contacts in the roster</string>\n\t<string name=\"showOffline_title\">Show offline contacts</string>\n\t<string name=\"enableGroups_summ\">Arrange your contacts by their groups</string>\n\t<string name=\"enableGroups_title\">Show contact groups</string>\n\t<string name=\"foregroundService_summ\">Keep app in memory to ensure always-on connection (foreground service)</string>\n\t<string name=\"foregroundService_title\">Statusbar icon</string>\n\n\t<string name=\"preftitle_debug\">Debugging</string>\n\t<string name=\"smackdebug_summ\">Packet and debug output via logcat (may contain personal information)</string>\n\t<string name=\"smackdebug_title\">SMACK debugging</string>\n\n\t<string name=\"reportcrash_title\">Send crash reports</string>\n\t<string name=\"reportcrash_summ\">Send anonymous crash reports to developer</string>\n\n\t<!-- Appearence Strings -->\n\t<string name=\"preftitle_app\">Appearance</string>\n\t<string name=\"FontChat_title\">Chat font size</string>\n\t<string name=\"FontChat_summ\">Set chat font size</string>\n\t<string name=\"FontChat_dialog\">Chat font size</string>\n\t<!--\n\t<string name=\"FontRost_title\">Roster font size</string>\n\t<string name=\"FontRost_summ\">Set roster font size</string>\n\t<string name=\"FontRost_dialog\">Roster font fize</string>\n\t<string name=\"setFontRoster\">Set roster font size</string>\n\t-->\n\t<string name=\"pref_theme\">Theme</string>\n\t<string name=\"pref_theme_dark\">Dark</string>\n\t<string name=\"pref_theme_light\">Light</string>\n\t<string name=\"pref_theme_pine\">Pine</string>\n\t<string name=\"pref_theme_ice\">Ice</string>\n\t<string name=\"preftitle_ui\">Appearance</string>\n\t<string-array name=\"fontSizesChat\">\n\t\t<item>small</item>\n\t\t<item>normal</item>\n\t\t<item>large</item>\n\t\t<item>huge</item>\n\t</string-array>\n\n\t<!-- Mainmenu \t-->\n\t<string name=\"Menu_addFriend\">Add contact</string>\n\t<string name=\"Menu_addClipboard\">Add %s</string>\n\t<string name=\"Menu_ShowOff\">Show offline</string>\n\t<string name=\"Menu_HideOff\">Hide offline</string>\n\t<string name=\"Menu_AccSettings\">Edit account</string>\n\t<string name=\"Menu_Settings\">Settings</string>\n\t<string name=\"Menu_Status\">Status</string>\n\t<string name=\"Menu_connect\">Connect</string>\n\t<string name=\"Menu_disconnect\">Disconnect</string>\n\t<string name=\"Menu_about\">About yaxim</string>\n\t<string name=\"Menu_about_bruno\">About Bruno</string>\n\t<string name=\"Menu_muc\">Add / browse…</string>\n\t<string name=\"Menu_matrix\">Enter the Matrix…</string>\n\t<string name=\"Menu_mark_all_as_read\">Mark all as read</string>\n\t<string name=\"Menu_send_invitation\">Create invitation</string>\n    <string name=\"Menu_userlist\">Participants</string>\n\n\n\t<!-- AddFriend -->\n\t<string name=\"addFriend_Title\">Add a Contact</string>\n\t<string name=\"addFriend_Summ\">Please enter the Jabber ID of your friend, the\n\t\tdesired screen name and choose their contact group!</string>\n\t<string name=\"addFriend_aliasHint\">Screen name</string>\n\t<string name=\"addrosteritemaddgroupchoice\">Add to a new group</string>\n\t<string name=\"NewGroup_EditTextField_Hint\">Name for the new group</string>\n\n\t<!-- Roster CONTEXTMENU -->\n\t<string name=\"roster_contextmenu_group_rename\">Rename group</string>\n\t<string name=\"roster_contextmenu_contact_mark_as_read\">Mark as read</string>\n\t<string name=\"roster_contextmenu_contact_delete\">Delete contact</string>\n\t<string name=\"roster_contextmenu_contact_delmsg\">Delete chat history</string>\n\t<string name=\"roster_contextmenu_contact_rename\">Rename</string>\n\t<string name=\"roster_contextmenu_contact_request_auth\">Request authorization</string>\n\t<string name=\"roster_contextmenu_contact_change_group\">Change group</string>\n\t<string name=\"roster_contextmenu_contact_share\">Share address</string>\n\t<string name=\"roster_contextmenu_contact_ringtone\">Ringtone</string>\n\t<string name=\"roster_contextmenu_muc_edit\">Edit group chat</string>\n\t<string name=\"roster_contextmenu_muc_leave\">Leave group chat</string>\n\t<string name=\"muc_leave_question\">Really leave %s?</string>\n\n\t<!-- Accountprefs -->\n\t<string name=\"account_settings_login\">Login Information</string>\n\t<string name=\"account_settings_title\">Account Settings</string>\n\t<string name=\"account_options_title\">Connecting Options</string>\n\t<string name=\"account_options_advanced\">Advanced Options</string>\n\t<string name=\"carbons_title\">Message Carbons (XEP-0280)</string>\n\t<string name=\"carbons_summ\">Request message copies from your other client(s)</string>\n\t<string name=\"account_jabberID_title\">Jabber ID</string>\n\t<string name=\"account_jabberID_sum\">example: me@jabber.example.com</string>\n\t<string name=\"account_jabberID_dialog_title\">Enter your Jabber ID:</string>\n\t<string name=\"account_jabberPW_title\">Account Password</string>\n\t<string name=\"account_jabberPW_sum\">Your Jabber account password</string>\n\t<string name=\"account_jabberPW_change_on_server\">Change password on server</string>\n\t<string name=\"account_jabberPW_password_old\">Old Password:</string>\n\t<string name=\"account_jabberPW_password_new\">New Password:</string>\n\t<string name=\"account_jabberPW_warning\">WARNING! For successful login you must also set the same password on the server!</string>\n\t<string name=\"account_jabberPW_progress\">Please wait, changing password…</string>\n\t<string name=\"account_jabberPW_finished\">Password successfully changed.</string>\n\t<string name=\"account_jabberPW_error\">Error changing password: %s</string>\n\t<string name=\"account_nickname_title\">Display Name</string>\n\t<string name=\"account_nickname_summ\">Your nickname displayed to other users</string>\n\t\n\t<!-- accountprefs -->\n\t<string name=\"account_resource_title\">Client Resource</string>\n\t<string name=\"account_resource_summ\">Default: yaxim</string>\n\t<string name=\"account_resource_dialog_title\">Enter your resource:</string>\n\t<string name=\"account_resource_hint\">yaxim</string>\n\t<string name=\"account_prio_title\">Client Priority</string>\n\t<string name=\"account_prio_summ\">Default: 0 (allowed: -128 .. 127)</string>\n\t<string name=\"account_prio_error\">Allowed values: -128 .. 127</string>\n\t<string name=\"account_prio_dialog_title\">Enter your priority:</string>\n\t<string name=\"account_port_title\">Server Port</string>\n\t<string name=\"account_port_sum\">Default: 5222</string>\n\t<string name=\"account_port_dialog_title\">Enter the server port:</string>\n\t<string name=\"account_port_hint\">5222</string>\n\t<string name=\"account_customserver_title\">Custom Server</string>\n\t<string name=\"account_customserver_summ\">(Optional) alternative server hostname</string>\n\t<string name=\"account_customserver_dialog_title\">Enter server hostname:</string>\n\t<string name=\"account_customserver_hint\">host.example.com</string>\n\t<string name=\"require_ssl_title\">Require SSL/TLS</string>\n\t<string name=\"require_ssl_summ\">Always encrypt server connection</string>\n\n\t<!--StatusPopUp-->\n\t<string name=\"AddContact_SpinnerPrompt\">Choose Group</string>\n\t<string name=\"setStatusmsgHint\">Your status message</string>\n\t<string name=\"setStatusTitle\">Set your status</string>\n\t<string name=\"RenameGroup_summ\">Rename group %s to:</string>\n\t<string name=\"RenameGroup_title\">Rename group</string>\n\t<string name=\"RenameEntry_summ\">Rename %1$s (%2$s) to: </string>\n\t<string name=\"RenameEntry_title\">Rename contact</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_summ\">Select a group from the spinner below</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_title\">Change group</string>\n\t<string name=\"deleteRosterItem_text\">Really remove %1$s (%2$s)?</string>\n\t<string name=\"deleteRosterItem_title\">Delete Contact</string>\n\t<string name=\"deleteChatHistory_text\">Really remove all messages with %1$s (%2$s)?</string>\n\t<string name=\"deleteChatHistory_title\">Delete Chat History</string>\n\t<string name=\"subscriptionRequest_text\">%1$s wants to add you as a contact: \\\"%2$s\\\"</string>\n\t<string name=\"subscriptionRequest_title\">Subscription Request</string>\n\t<string name=\"subscription_accept\">Accept</string>\n\t<string name=\"subscription_reject\">Reject</string>\n\t<string name=\"subscription_reject_all\">Reject all</string>\n\t<string name=\"subscription_status_from\">can see your status</string>\n\n\t<!-- CHATWINDOW -->\n\t<string name=\"chat_from_me\">Me:</string>\n\t<string name=\"toast_stored_offline\">The message has been stored for transmission.</string>\n\t<string name=\"chat_enterMsgHint\">Enter message</string> \n\n\t<!-- Message context menu; use the verb form (to quote) -->\n\t<string name=\"chatmenu_quote\">Quote</string>\n\t<!-- Message context menu: repeat the same message -->\n\t<string name=\"chatmenu_resend\">Edit message</string>\n\n\t<!-- GPS settings -->\n\t<!--\n\t<string name=\"showGPS_title\">GPS to status</string>\n\t<string name=\"showGPS_summ_on\">GPS is send to StatusMessage</string>\n\t<string name=\"showGPS_summ_off\">GPS is send to StatusMessage</string>\n\t-->\n\n\t<!-- About Dialog -->\n\t<string name=\"AboutDialog_title\">About yaxim</string>\n\t<string name=\"AboutDialog_DevelopersTitle\">Developers</string>\n\t<!-- Contact the developer button -->\n\t<string name=\"AboutDialog_DevelopersText\">Contact</string>\n\t<string name=\"AboutDialog_LicenceTitle\">Licensing</string>\n\t<string name=\"AboutDialog_Vote\">Rate app</string>\n\t<string name=\"AboutDialog_LicenceText\">\n\t\tThis program is free software; you can redistribute\n\t\tit and/or\n\t\tmodify it under the terms of the GNU General Public License\n\t\tversion 2\n\t\tas published by the Free Software Foundation.\n\t\tLink:\n\t\thttp://www.gnu.org/licenses/gpl-2.0.html\\n\n\t\t\\n\n\t\tParts of this software are\n\t\tprovided under the MIT License:\\n\n\t\t\\n\n\t\tCopyright © 2009 Mads\n\t\tKristiansen, Nullwire ApS\\n\n\t\t\\n\n\t\tPermission is hereby granted, free of\n\t\tcharge, to any person obtaining\n\t\ta copy\n\t\tof this software and associated\n\t\tdocumentation files (the\n\t\t\"Software\"), to deal\n\t\tin the Software without\n\t\trestriction, including\n\t\twithout limitation the rights\n\t\tto use, copy,\n\t\tmodify, merge, publish,\n\t\tdistribute, sublicense, and/or sell\n\t\tcopies of\n\t\tthe Software, and to\n\t\tpermit persons to whom the Software is\n\t\tfurnished to\n\t\tdo so, subject to\n\t\tthe following conditions:\n\t\t\\n\n\t\tThe above copyright notice\n\t\tand this permission notice shall be\n\t\tincluded in all\n\t\tcopies or\n\t\tsubstantial portions of the Software.\n\t\t\\n\n\t\tTHE SOFTWARE IS PROVIDED \"AS\n\t\tIS\", WITHOUT WARRANTY OF ANY KIND,\n\t\tEXPRESS OR\n\t\tIMPLIED, INCLUDING BUT NOT\n\t\tLIMITED TO THE WARRANTIES OF\n\t\tMERCHANTABILITY,\n\t\tFITNESS FOR A PARTICULAR\n\t\tPURPOSE AND NONINFRINGEMENT.\n\t\tIN NO EVENT SHALL THE\n\t\tAUTHORS OR COPYRIGHT\n\t\tHOLDERS BE LIABLE FOR ANY\n\t\tCLAIM, DAMAGES OR OTHER\n\t\tLIABILITY, WHETHER IN\n\t\tAN ACTION OF CONTRACT,\n\t\tTORT OR OTHERWISE, ARISING FROM,\n\t\tOUT OF OR IN\n\t\tCONNECTION WITH THE\n\t\tSOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n\t\tSOFTWARE.\n    </string>\n\n\t<string name=\"status_available\">Online</string>\n\t<string name=\"status_away\">Away</string>\n\t<string name=\"status_chat\">Free for chat</string>\n\t<string name=\"status_dnd\">Do not disturb</string>\n\t<string name=\"status_xa\">Not available</string>\n\t<string name=\"status_offline\">Offline</string>\n\n\t<string name=\"translator_credits\">Launchpad Contributions:\n  Andi Chandler https://launchpad.net/~bing</string>\n\n\t<!-- default roster group with no name -->\n\t<string name=\"default_group\">General</string>\n\t<string name=\"all_contacts_group\">All contacts</string>\n\t<string name=\"muc_group\">Group Chats</string>\n\n\t<!-- SEND listener popup -->\n\t<string name=\"chooseContact\">Choose contact</string>\n\t<string name=\"action_settings\">Settings</string>\n\n\t<!-- MUC strings -->\n\t<string name=\"muc_jid_hint\">Group chat JID</string>\n\t<string name=\"muc_nickname_hint\">Nickname</string>\n\t<string name=\"muc_password_hint\">Password (optional)</string>\n\t<string name=\"title_activity_muc_invite\">Group Chat Invitation</string>\n\t<!-- Groupchat invitation: \"Invitation from {contact name}\" -->\n\t<string name=\"muc_invitation_from\">Invitation from %s</string>\n\t<!-- Groupchat info: {description} ({number} participants) -->\n\t<string name=\"muc_invitation_occupants\">%1$s (%2$d participants)</string>\n\t<!-- Notification button: \"Join as {default nickname}\" (make SHORT string) -->\n\t<string name=\"muc_invitation_join\">Join as %s</string>\n\t<string name=\"muc_synchronizing\">Synchronizing…</string>\n\t<!-- Title of user list, contains JID -->\n\t<string name=\"chat_muc_userlist\">Group Chat Participants (%s)</string>\n\t<!-- Kicked from groupchat: \"Kicked: {reason} -->\n\t<string name=\"muc_kicked\">Kicked: %s</string>\n\t<!-- Kicked from groupchat: \"Kicked by {admin name}: {reason} -->\n\t<string name=\"muc_kicked_by\">Kicked by %1$s: %2$s</string>\n\t<!-- Banned from groupchat: \"Banned: {reason} -->\n\t<string name=\"muc_banned\">Banned: %s</string>\n\t<!-- Banned from groupchat: \"Banned by {admin name}: {reason} -->\n\t<string name=\"muc_banned_by\">Banned by %1$s: %2$s</string>\n\n\t<!-- File upload -->\n\t<string name=\"roster_contextmenu_send\">Send…</string>\n\t<string name=\"roster_contextmenu_take_image\">Take picture</string>\n\t<string name=\"roster_contextmenu_send_image\">Choose picture</string>\n\t<string name=\"roster_contextmenu_send_file\">Send file</string>\n\t<string name=\"upload_compress\">Compressing picture…</string>\n\t<string name=\"upload_uploading\">Uploading…</string>\n\t<string name=\"upload_too_large\">file too large!</string>\n\t<string name=\"storage_permission\">%s needs storage access to send files!</string>\n\t<string name=\"notification_permission_denied\">Notifications are disabled in the Android app preferences.</string>\n\n\t<!-- Search -->\n\t<string name=\"search_msg_hint\">Message content</string>\n\n\t<!-- MUC bookmarks -->\n\t<string name=\"group_bookmarks\">My group chats</string>\n\t<string name=\"group_mucsearch\">Public group chats</string>\n\t<!-- Service Discovery -->\n\t<string name=\"title_service_disco\">Browser: %s</string>\n\n\t<!-- Android 9 notification preferences: permanent notification -->\n\t<string name=\"notification_status\">Foreground service</string>\n\t<!-- Android 9 notification preferences: message notifications -->\n\t<string name=\"notification_msg\">Messages</string>\n\n</resources>\n"
  },
  {
    "path": "res/values-es/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"app_name\">yaxim</string>\n\t<string name=\"app_name_bruno\">Bruno</string>\n\n\t<!-- Connection state -->\n\t<string name=\"conn_title\">yaxim: %s</string>\n\t<string name=\"conn_title_bruno\">Bruno: %s</string>\n\t<string name=\"conn_connecting\">Conectándose al servidor…</string>\n\t<string name=\"conn_disconnecting\">Desconectando...</string>\n\t<string name=\"conn_online\">En línea</string>\n\t<string name=\"conn_offline\">Fuera de Línea</string>\n\t<string name=\"conn_empty_roster\">No hay contactos para mostrar!</string>\n\t<string name=\"conn_empty_roster_hints\">Hay muchas maneras de añadir contactos:\\n\\n - Android Beam™: introducir el teléfono de un amigo\\n\\n - Escanear un código QR\\n\\n - \\\"Crear una invitación\\\" y compartirla vía (e-mail, SMS, código QR,...)\\n\\n - \\\"Añadir contacto\" si conoces el JID</string>\n\t<string name=\"conn_reconnect\">Próximo intento de conexión en %d segundos.</string>\n\t<string name=\"conn_disconnected\">Conexión cerrada</string>\n\t<string name=\"conn_no_network\">Sin conexión de red</string>\n\t<string name=\"conn_ping_timeout\">No hay respuesta.</string>\n\t<string name=\"conn_error\">Error: %s</string>\n\n\t<!-- Global Strings -->\n\t<string name=\"Global_Exit\">Salida</string>\n\t<string name=\"Global_authenticate_first\">Por favor conéctese primero</string>\n\t<string name=\"Global_JID_hint\">user@yax.im</string>\n\t<!-- tooltip message when the user entered an invalid XMPP address -->\n\t<string name=\"Global_JID_malformed\">Verifique el formato de la dirección!</string>\n\n\t<!-- FirstStartUpDialog -->\n\t<string name=\"StartupDialog_Title\">¡Bienvenido/a a yaxim!</string>\n\t<string name=\"StartupDialog_Summary\">Necesita configurar yaxim antes de usarlo. Por favor escriba su identidad de Jabber y su contaseña.</string>\n\t<string name=\"StartupDialog_pwHint\">Escribe la contraseña</string>\n\t<string name=\"StartupDialog_pwshowHint\">Contraseña</string>\n\t<string name=\"StartupDialog_Username_title\">Identidad Jabber:</string>\n\t<string name=\"StartupDialog_passwd_title\">Contraseña:</string>\n\t<string name=\"StartupDialog_advanced\">Avanzada…</string>\n\t<string name=\"StartupDialog_create_new\">Registrar nueva cuenta</string>\n\t<string name=\"StartupDialog_error_password\">La contraseña es demasiado corta!</string>\n\t<string name=\"StartupDialog_created_password\">Contraseña segura creada</string>\n\t<string name=\"StartupDialog_auth_failed\">Por favor, compruebe su nombre de usuario y contraseña!</string>\n\t<string name=\"StartupDialog_server_failed\">Could not connect to %s!</string>\n\t<string name=\"StartupDialog_no_registration\">Server does not allow registration!</string>\n\n\t<string name=\"StartupDialog_invitation\">Ha sido invitado a Jabber. Por favor complete su registro.</string>\n\t<string name=\"StartupDialog_no_more_accounts\">No hay cuentas adicionales compatibles!</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_message\">Mensaje de %s</string>\n\t<string name=\"notification_anonymous_message\">Mensaje recibido</string>\n\t<!--  Group Chat notification, %1$s is the user name, %2$s is the room, e.g. \"{Ge0rG} in {yaxim Chat}\" -->\n\t<string name=\"notification_muc_message\">%1$s en %2$s</string>\n\t<!--  Group Group Chat private message notification, %1$s is the user name, %2$s is the room, e.g. \"Message from {Ge0rG} in {yaxim Chat}\" -->\n\t<!--string name=\"notification_muc_pm\">Message from %1$s in %2$s</string-->\n\t<!-- notification button: direct reply (make SHORT string) -->\n\t<string name=\"notification_reply\">Responder</string>\n\t<!-- notification button: mark as read (make SHORT string) -->\n\t<string name=\"notification_mark_read\">Marcar como leído</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_error\">Errores al enviar el mensaje!</string>\n\n\t<!-- Notification Settings -->\n\t<string name=\"preftitle_notify\">Configuración de las notificaciones</string>\n\t<string name=\"preftitle_notify_msg\">Notificación de mensajes</string>\n\t<string name=\"preftitle_notify_muc\">Notificación de chat de grupo</string>\n\t<string name=\"notification_custom\">Tono de aviso personalizado</string>\n\t<string name=\"muc_highlight_title\">Notificar sólo en caso de mención</string>\n\t<string name=\"muc_highlight_sum\">Notificar cuando tu apodo sea mencionado en un chat en grupo</string>\n\t<string name=\"led_title\">LED parpadeante</string>\n\t<string name=\"led_summ\">Parpadeo del LED al recibir un mensaje</string>\n\t<string name=\"vibr_title\">Vibración</string>\n\t<string name=\"vibr_summ\">Vibrar al recibir un mensaje</string>\n\t<string-array name=\"vibr_values_displayed\">\n\t\t<item>Nunca</item>\n\t\t<item>Preferencias del sistema</item>\n\t\t<item>Siempre</item>\n\t</string-array>\n\t<string name=\"ringtone_title\">Tono de aviso</string>\n\t<string name=\"ringtone_summ\">Tono para mensajes entrantes</string>\n\t<string name=\"ticker_title\">Vista previa de mensajes</string>\n\t<string name=\"ticker_summ\">Mostrar remitente y mensaje en la barra de estado</string>\n\n\t<!-- Startup Setting Strings -->\n\t<string name=\"preftitle_general\">Configuración general</string>\n\t<string name=\"pref_dnd_when_silent\">\\\"No molestar\\\" en modo silencioso.</string>\n\t<string name=\"pref_dnd_when_silent_summ\">Establecer el estado de conexión a \\\"DND\\\" cuando tu teléfono está en modo silencio.</string>\n\t<string name=\"statuspopup_name\">Ponga su estado</string>\n\t<string name=\"showOffline_summ\">Mostrar siempre todos los contactos en la lista</string>\n\t<string name=\"showOffline_title\">Mostrar contactos desconectados</string>\n\t<string name=\"enableGroups_summ\">Organizar sus contactos por grupo</string>\n\t<string name=\"enableGroups_title\">Mostrar grupos de contactos</string>\n\t<string name=\"foregroundService_summ\">Keep app in memory to ensure always-on connection (foreground service)</string>\n\t<string name=\"foregroundService_title\">Icono de barra de estado</string>\n\n\t<string name=\"preftitle_debug\">Depuración</string>\n\t<string name=\"smackdebug_summ\">Registro de depuración y paquetes vía logcat (puede contener información personal)</string>\n\t<string name=\"smackdebug_title\">Depuración SMACK</string>\n\n\t<string name=\"reportcrash_title\">Enviar informes de fallo de programma</string>\n\t<string name=\"reportcrash_summ\">Enviar informes anónimos de fallo de programa a los desarrolladores</string>\n\n\t<!-- Appearence Strings -->\n\t<string name=\"preftitle_app\">Aspecto</string>\n\t<string name=\"FontChat_title\">Tamaño de fuente del chat</string>\n\t<string name=\"FontChat_summ\">Definir tamaño de fuente del chat</string>\n\t<string name=\"FontChat_dialog\">Tamaño de fuente del chat</string>\n\t<!--\n\t<string name=\"FontRost_title\">Roster font size</string>\n\t<string name=\"FontRost_summ\">Set roster font size</string>\n\t<string name=\"FontRost_dialog\">Roster font fize</string>\n\t<string name=\"setFontRoster\">Set roster font size</string>\n\t-->\n\t<string name=\"pref_theme\">Tema</string>\n\t<string name=\"pref_theme_dark\">Oscuro</string>\n\t<string name=\"pref_theme_light\">Claro</string>\n\t<string name=\"pref_theme_pine\">Pino</string>\n\t<string name=\"pref_theme_ice\">Hielo</string>\n\t<string name=\"preftitle_ui\">Aspecto</string>\n\t<string-array name=\"fontSizesChat\">\n\t\t<item>pequeño</item>\n\t\t<item>normal</item>\n\t\t<item>grande</item>\n\t\t<item>enorme</item>\n\t</string-array>\n\n\t<!-- Mainmenu \t-->\n\t<string name=\"Menu_addFriend\">Añadir contacto</string>\n\t<string name=\"Menu_addClipboard\">Añade %s</string>\n\t<string name=\"Menu_ShowOff\">Mostrar los fuera de línea</string>\n\t<string name=\"Menu_HideOff\">Ocultar desconectados</string>\n\t<string name=\"Menu_AccSettings\">Editar cuenta</string>\n\t<string name=\"Menu_Settings\">Opciones</string>\n\t<string name=\"Menu_Status\">Estado</string>\n\t<string name=\"Menu_connect\">Conectar</string>\n\t<string name=\"Menu_disconnect\">Desconectar</string>\n\t<string name=\"Menu_about\">Acerca de yaxim</string>\n\t<string name=\"Menu_about_bruno\">About Bruno</string>\n\t<string name=\"Menu_muc\">Add / browse…</string>\n\t<string name=\"Menu_matrix\">Enter the Matrix…</string>\n\t<string name=\"Menu_mark_all_as_read\">Marcar todos como leídos</string>\n\t<string name=\"Menu_send_invitation\">Crear invitación</string>\n    <string name=\"Menu_userlist\">Participantes</string>\n\n\n\t<!-- AddFriend -->\n\t<string name=\"addFriend_Title\">Añadir un contacto</string>\n\t<string name=\"addFriend_Summ\">¡Por favor, escriba la identidad Jabber de su amigo, el apodo deseado y elija su grupo de contactos!</string>\n\t<string name=\"addFriend_aliasHint\">Apodo</string>\n\t<string name=\"addrosteritemaddgroupchoice\">Añadir a un nuevo grupo</string>\n\t<string name=\"NewGroup_EditTextField_Hint\">Nombre para el nuevo grupo</string>\n\n\t<!-- Roster CONTEXTMENU -->\n\t<string name=\"roster_contextmenu_group_rename\">Renombrar grupo</string>\n\t<string name=\"roster_contextmenu_contact_mark_as_read\">Marcar como leído</string>\n\t<string name=\"roster_contextmenu_contact_delete\">Eliminar contacto</string>\n\t<string name=\"roster_contextmenu_contact_delmsg\">Borrar el historial del chat</string>\n\t<string name=\"roster_contextmenu_contact_rename\">Renombrar</string>\n\t<string name=\"roster_contextmenu_contact_request_auth\">Solicitar autorización</string>\n\t<string name=\"roster_contextmenu_contact_change_group\">Cambiar grupo</string>\n\t<string name=\"roster_contextmenu_contact_share\">Compartir la dirección</string>\n\t<string name=\"roster_contextmenu_contact_ringtone\">Tono de aviso</string>\n\t<string name=\"roster_contextmenu_muc_edit\">Editar el chat en grupo</string>\n\t<string name=\"roster_contextmenu_muc_leave\">Salir del chat en grupo</string>\n\t<string name=\"muc_leave_question\">¿Realmente quiere abandonar  %s?</string>\n\n\t<!-- Accountprefs -->\n\t<string name=\"account_settings_login\">Información de ingreso</string>\n\t<string name=\"account_settings_title\">Configuración de cuenta</string>\n\t<string name=\"account_options_title\">Opciones de conexión</string>\n\t<string name=\"account_options_advanced\">Opciones avanzadas</string>\n\t<string name=\"carbons_title\">Copias de mensajes (XEP-0280)</string>\n\t<string name=\"carbons_summ\">Solicitar copias de mensajes de tu(s) otro(s) cliente(s)</string>\n\t<string name=\"account_jabberID_title\">Identidad Jabber</string>\n\t<string name=\"account_jabberID_sum\">ejemplo: yo@jabber.ejemplo.com</string>\n\t<string name=\"account_jabberID_dialog_title\">Escribe tu Identidad Jabber:</string>\n\t<string name=\"account_jabberPW_title\">Contraseña de la cuenta</string>\n\t<string name=\"account_jabberPW_sum\">La contraseña de su cuenta de Jabber</string>\n\t<string name=\"account_jabberPW_change_on_server\">Cambiar la contraseña en el servidor</string>\n\t<string name=\"account_jabberPW_password_old\">Contraseña anterior:</string>\n\t<string name=\"account_jabberPW_password_new\">Contraseña Nueva:</string>\n\t<string name=\"account_jabberPW_warning\">¡ATENCIÓN! ¡Para conectarse exitosamente debe configurar la misma contraseña en el servidor!</string>\n\t<string name=\"account_jabberPW_progress\">Espere por favor, cambiando contraseña...</string>\n\t<string name=\"account_jabberPW_finished\">Contraseña cambiada con éxito.</string>\n\t<string name=\"account_jabberPW_error\">Error cambiando contraseña: %s</string>\n\t<string name=\"account_nickname_title\">Display Name</string>\n\t<string name=\"account_nickname_summ\">Your nickname displayed to other users</string>\n\t\n\t<!-- accountprefs -->\n\t<string name=\"account_resource_title\">Recurso del cliente</string>\n\t<string name=\"account_resource_summ\">Standard : yaxim</string>\n\t<string name=\"account_resource_dialog_title\">Escriba su recurso:</string>\n\t<string name=\"account_resource_hint\">yaxim</string>\n\t<string name=\"account_prio_title\">Prioridad del cliente</string>\n\t<string name=\"account_prio_summ\">Predefinido: 0 (permitido: -128 a 127)</string>\n\t<string name=\"account_prio_error\">Valores permitidos: -128 a 127</string>\n\t<string name=\"account_prio_dialog_title\">Escriba su prioridad:</string>\n\t<string name=\"account_port_title\">Puerto del Servidor</string>\n\t<string name=\"account_port_sum\">Por defecto: 5222</string>\n\t<string name=\"account_port_dialog_title\">Escriba el puerto del servidor:</string>\n\t<string name=\"account_port_hint\">5222</string>\n\t<string name=\"account_customserver_title\">Servidor personalizado</string>\n\t<string name=\"account_customserver_summ\">(Opcional) Nombre del servidor alternativo</string>\n\t<string name=\"account_customserver_dialog_title\">Escriba el nombre del servidor:</string>\n\t<string name=\"account_customserver_hint\">nombre.ejemplo.com</string>\n\t<string name=\"require_ssl_title\">Exigir SSL/TLS</string>\n\t<string name=\"require_ssl_summ\">Siempre cifrar la conexión con el servidor</string>\n\n\t<!--StatusPopUp-->\n\t<string name=\"AddContact_SpinnerPrompt\">Seleccionar Grupo</string>\n\t<string name=\"setStatusmsgHint\">Tu mensaje de estado</string>\n\t<string name=\"setStatusTitle\">Ponga su estado</string>\n\t<string name=\"RenameGroup_summ\">Renombrar el grupo %s a:</string>\n\t<string name=\"RenameGroup_title\">Renombrar grupo</string>\n\t<string name=\"RenameEntry_summ\">Renombrar %1$s (%2$s) a:</string>\n\t<string name=\"RenameEntry_title\">Renombrar contacto</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_summ\">Seleccione un grupo entre los que figuran debajo</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_title\">Cambiar grupo</string>\n\t<string name=\"deleteRosterItem_text\">¿Realmente desea eliminar %1$s (%2$s)?</string>\n\t<string name=\"deleteRosterItem_title\">Eliminar contacto</string>\n\t<string name=\"deleteChatHistory_text\">¿Está seguro de que desea borrar todos los mensajes con %1$s (%2$s)?</string>\n\t<string name=\"deleteChatHistory_title\">Eliminar historial de charla</string>\n\t<string name=\"subscriptionRequest_text\">%1$s quiere agregarte como contacto: \\\"%2$s\\\"</string>\n\t<string name=\"subscriptionRequest_title\">Pedido de suscripción</string>\n\t<string name=\"subscription_accept\">Aceptar</string>\n\t<string name=\"subscription_reject\">Rechazar</string>\n\t<string name=\"subscription_reject_all\">Rechazar todo</string>\n\t<string name=\"subscription_status_from\">puede ver su estado</string>\n\n\t<!-- CHATWINDOW -->\n\t<string name=\"chat_from_me\">Yo:</string>\n\t<string name=\"toast_stored_offline\">Este mensaje ha sido almacenado para su transmisión.</string>\n\t<string name=\"chat_enterMsgHint\">Introduzca el mensaje</string> \n\n\t<!-- Message context menu; use the verb form (to quote) -->\n\t<string name=\"chatmenu_quote\">Cita</string>\n\t<!-- Message context menu: repeat the same message -->\n\t<string name=\"chatmenu_resend\">Edite el mensaje</string>\n\n\t<!-- GPS settings -->\n\t<!--\n\t<string name=\"showGPS_title\">GPS to status</string>\n\t<string name=\"showGPS_summ_on\">GPS is send to StatusMessage</string>\n\t<string name=\"showGPS_summ_off\">GPS is send to StatusMessage</string>\n\t-->\n\n\t<!-- About Dialog -->\n\t<string name=\"AboutDialog_title\">Acerca de yaxim</string>\n\t<string name=\"AboutDialog_DevelopersTitle\">Desarrolladores</string>\n\t<!-- Contact the developer button -->\n\t<string name=\"AboutDialog_DevelopersText\">Contacto</string>\n\t<string name=\"AboutDialog_LicenceTitle\">Licencia</string>\n\t<string name=\"AboutDialog_Vote\">Valoración de la app</string>\n\t<string name=\"AboutDialog_LicenceText\">Este programa es software libre: usted puede redistribuirlo y/o modificarlo bajo los términos de la Licencia Pública General GNU versión 2 publicada por la Fundación para el Software Libre. Enlace: http://www.gnu.org/licenses/gpl-2.0.html\\n \\n Partes de este software son ofrecidas bajo la licencia MIT: \\n \\n Copyright © 2009 Mads Kristiansen, Nullwire ApS\\n \\n Se autoriza, de forma gratuita, a cualquier persona que ha obtenido una copia de este software y archivos de documentación asociados (el \"Software\"), para tratar en el Software sin restricción, incluyendo sin ninguna limitación en lo que concierne a los derechos para usar, copiar, modificar, fusionar, publicar, distribuir, sublicenciar y / o vender copias de este Software, y para permitir a las personas que usan el Software a hacerlo, con sujeción a las siguientes condiciones: \\n El aviso de copyright anterior y este aviso de permiso se incluirá en todas las copias o partes sustanciales de este Software. \\n EL SOFTWARE SE ENTREGA \"TAL CUAL\", SIN GARANTÍA DE NINGÚN TIPO, EXPRESA O IMPLÍCITA, INCLUIDAS PERO NO LIMITADAS A LAS GARANTÍAS DE COMERCIALIZACIÓN, IDONEIDAD PARA UN PROPÓSITO PARTICULAR Y DE NO INFRACCIÓN. EN NINGÚN  CASO LOS AUTORES O TITULARES DEL COPYRIGHT SERÁN RESPONSABLES DE ALGÚN RECLAMO, DAÑOS U OTRAS RESPONSABILIDADES, YA SEA EN UN LITIGIO, AGRAVIO O DE OTRO MODO, DERIVADAS DE, FUERA DE O EN CONEXIÓN CON EL SOFTWARE O SU UTILIZACIÓN U OTRAS OPERACIONES EN EL SOFTWARE.</string>\n\n\t<string name=\"status_available\">En línea</string>\n\t<string name=\"status_away\">Ausente</string>\n\t<string name=\"status_chat\">Disponible para conversación</string>\n\t<string name=\"status_dnd\">No molestar.</string>\n\t<string name=\"status_xa\">Disponible</string>\n\t<string name=\"status_offline\">Fuera de Línea</string>\n\n\t<string name=\"translator_credits\">Launchpad Contributions:\n  Adolfo Jayme Barrientos https://launchpad.net/~fitojb\n  Argafål https://launchpad.net/~argafal\n  Georg Lukas https://launchpad.net/~ge0rg\n  Henry Mata https://launchpad.net/~matahr\n  Javier Henderson https://launchpad.net/~javier-3\n  Jorge Merlino https://launchpad.net/~jorge-merlino\n  Leonardo Gastón De Luca https://launchpad.net/~leorockway\n  Matias Castillo Felmer https://launchpad.net/~slashytu\n  Mikael Nordfeldth https://launchpad.net/~mmn\n  SILVIO BARLETTA https://launchpad.net/~ik1bqd\n  Suso https://launchpad.net/~susobaco-t\n  lImIt https://launchpad.net/~limit-gb</string>\n\n\t<!-- default roster group with no name -->\n\t<string name=\"default_group\">General</string>\n\t<string name=\"all_contacts_group\">Todos los contactos</string>\n\t<string name=\"muc_group\">Grupos de charla</string>\n\n\t<!-- SEND listener popup -->\n\t<string name=\"chooseContact\">Elegir contacto</string>\n\t<string name=\"action_settings\">Opciones</string>\n\n\t<!-- MUC strings -->\n\t<string name=\"muc_jid_hint\">JID del chat en grupo</string>\n\t<string name=\"muc_nickname_hint\">Alias</string>\n\t<string name=\"muc_password_hint\">Contraseña (optativo)</string>\n\t<string name=\"title_activity_muc_invite\">Invitación a chat en grupo</string>\n\t<!-- Groupchat invitation: \"Invitation from {contact name}\" -->\n\t<string name=\"muc_invitation_from\">Invitación de %s</string>\n\t<!-- Groupchat info: {description} ({number} participants) -->\n\t<string name=\"muc_invitation_occupants\">%1$s (%2$d participantes)</string>\n\t<!-- Notification button: \"Join as {default nickname}\" (make SHORT string) -->\n\t<string name=\"muc_invitation_join\">Unirse como %s</string>\n\t<string name=\"muc_synchronizing\">Sincronizando...</string>\n\t<!-- Title of user list, contains JID -->\n\t<string name=\"chat_muc_userlist\">Participantes del chat en grupo (%s)</string>\n\t<!-- Kicked from groupchat: \"Kicked: {reason} -->\n\t<string name=\"muc_kicked\">Toque de atención: %s</string>\n\t<!-- Kicked from groupchat: \"Kicked by {admin name}: {reason} -->\n\t<string name=\"muc_kicked_by\">%1$s: %2$s te ha dado un toque de atención.</string>\n\t<!-- Banned from groupchat: \"Banned: {reason} -->\n\t<string name=\"muc_banned\">Vetado: %s</string>\n\t<!-- Banned from groupchat: \"Banned by {admin name}: {reason} -->\n\t<string name=\"muc_banned_by\">Vetado por %1$s: %2$s</string>\n\n\t<!-- File upload -->\n\t<string name=\"roster_contextmenu_send\">Enviando...</string>\n\t<string name=\"roster_contextmenu_take_image\">Hacer una foto</string>\n\t<string name=\"roster_contextmenu_send_image\">Escoger una foto</string>\n\t<string name=\"roster_contextmenu_send_file\">Envíar un archivo</string>\n\t<string name=\"upload_compress\">Comprimiendo imagen...</string>\n\t<string name=\"upload_uploading\">Subiendo...</string>\n\t<string name=\"upload_too_large\">Archivo demasiado grande!</string>\n\t<string name=\"storage_permission\">%s needs storage access to send files!</string>\n\t<string name=\"notification_permission_denied\">Notifications are disabled in the Android app preferences.</string>\n\n\t<!-- Search -->\n\t<string name=\"search_msg_hint\">Message content</string>\n\n\t<!-- MUC bookmarks -->\n\t<string name=\"group_bookmarks\">My group chats</string>\n\t<string name=\"group_mucsearch\">Public group chats</string>\n\t<!-- Service Discovery -->\n\t<string name=\"title_service_disco\">Browser: %s</string>\n\n\t<!-- Android 9 notification preferences: permanent notification -->\n\t<string name=\"notification_status\">Foreground service</string>\n\t<!-- Android 9 notification preferences: message notifications -->\n\t<string name=\"notification_msg\">Messages</string>\n\n</resources>\n"
  },
  {
    "path": "res/values-eu/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"app_name\">yaxim</string>\n\t<string name=\"app_name_bruno\">Bruno</string>\n\n\t<!-- Connection state -->\n\t<string name=\"conn_title\">yaxim: %s</string>\n\t<string name=\"conn_title_bruno\">Bruno: %s</string>\n\t<string name=\"conn_connecting\">Zerbitzarira konektatzen...</string>\n\t<string name=\"conn_disconnecting\">Deskonektatzen…</string>\n\t<string name=\"conn_online\">Konektatuta</string>\n\t<string name=\"conn_offline\">Lineaz kanpo</string>\n\t<string name=\"conn_empty_roster\">Ez dago kontakturik erakusteko!</string>\n\t<string name=\"conn_empty_roster_hints\">There are many ways to add contacts:\\n\\n\n\t\t- Android Beam™: touch a friend\\'s phone\\n\\n\n\t\t- Scan a QR code\\n\\n\n\t\t- \\\"Create invitation\\\" and share it (e-mail, SMS, QR code, …)\\n\\n\n\t\t- \\\"Add contact\\\" if you know the JID</string>\n\t<string name=\"conn_reconnect\">Hurrengo konexio-saiakera %d segundotan.</string>\n\t<string name=\"conn_disconnected\">Konexioa itxita</string>\n\t<string name=\"conn_no_network\">Sareko konexiorik ez.</string>\n\t<string name=\"conn_ping_timeout\">Ez dago erantzunik.</string>\n\t<string name=\"conn_error\">Errorea: %s</string>\n\n\t<!-- Global Strings -->\n\t<string name=\"Global_Exit\">Irten</string>\n\t<string name=\"Global_authenticate_first\">Mesedez, konektatu lehenik</string>\n\t<string name=\"Global_JID_hint\">erabiltzailea@yax.im</string>\n\t<!-- tooltip message when the user entered an invalid XMPP address -->\n\t<string name=\"Global_JID_malformed\">Egiaztatu helbidearen formatua!</string>\n\n\t<!-- FirstStartUpDialog -->\n\t<string name=\"StartupDialog_Title\">Ongietorri yaxim-era!</string>\n\t<string name=\"StartupDialog_Summary\">Erabili aurretik yaxim konfiguratu behar duzu. Mesedez, sartu zure Jabber IDa eta pasahitza.</string>\n\t<string name=\"StartupDialog_pwHint\">Sartu pasahitza</string>\n\t<string name=\"StartupDialog_pwshowHint\">Pasahitza erakutsi</string>\n\t<string name=\"StartupDialog_Username_title\">Jabber IDa:</string>\n\t<string name=\"StartupDialog_passwd_title\">Pasahitza:</string>\n\t<string name=\"StartupDialog_advanced\">Aurreratua...</string>\n\t<string name=\"StartupDialog_create_new\">Erregistratu kontu berria</string>\n\t<string name=\"StartupDialog_error_password\">Pasahitza laburregia da!</string>\n\t<string name=\"StartupDialog_created_password\">Pasahitz segurua sortu da</string>\n\t<string name=\"StartupDialog_auth_failed\">Mesedez, egiaztatu zure erabiltzaile-izena eta pasahitza!</string>\n\t<string name=\"StartupDialog_server_failed\">Ezin zen %s-(e)ra konektatu!</string>\n\t<string name=\"StartupDialog_no_registration\">Zerbitzariak ez du erregistrorik onartzen!</string>\n\n\t<string name=\"StartupDialog_invitation\">Jabber gonbidatu dizute. Mesedez, osatu erregistroa.</string>\n\t<string name=\"StartupDialog_no_more_accounts\">Ez dago beste konturik bermatuta!</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_message\">%s-(r)en mezua</string>\n\t<string name=\"notification_anonymous_message\">Mezua jasota</string>\n\t<!--  Group Chat notification, %1$s is the user name, %2$s is the room, e.g. \"{Ge0rG} in {yaxim Chat}\" -->\n\t<string name=\"notification_muc_message\">%1$s(e)k %2$s sarreran</string>\n\t<!--  Group Group Chat private message notification, %1$s is the user name, %2$s is the room, e.g. \"Message from {Ge0rG} in {yaxim Chat}\" -->\n\t<!--string name=\"notification_muc_pm\">Message from %1$s in %2$s</string-->\n\t<!-- notification button: direct reply (make SHORT string) -->\n\t<string name=\"notification_reply\">Erantzun</string>\n\t<!-- notification button: mark as read (make SHORT string) -->\n\t<string name=\"notification_mark_read\">Markatu irakurritako gisa</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_error\">Errorea mezua bidaltzean!</string>\n\n\t<!-- Notification Settings -->\n\t<string name=\"preftitle_notify\">Jakinarazpen ezarpenak</string>\n\t<string name=\"preftitle_notify_msg\">Mezu jakinarazpena</string>\n\t<string name=\"preftitle_notify_muc\">Taldeko txataren jakinarazpena</string>\n\t<string name=\"notification_custom\">Dei-tonu pertsonalizatua</string>\n\t<string name=\"muc_highlight_title\">Aipamena jakinarazi besterik ez</string>\n\t<string name=\"muc_highlight_sum\">Jakinarazi ezizena gela batean aipatzen denean</string>\n\t<string name=\"led_title\">LED keinukaria</string>\n\t<string name=\"led_summ\">Egin keinuak telefonoaren LEDarekin sarrerako mezuak iristean</string>\n\t<string name=\"vibr_title\">Bibrazioa</string>\n\t<string name=\"vibr_summ\">Bibratu sarrerako mezuak iristean</string>\n\t<string-array name=\"vibr_values_displayed\">\n\t\t<item>Inoiz ez</item>\n\t\t<item>Sistemaren hobespena</item>\n\t\t<item>Beti</item>\n\t</string-array>\n\t<string name=\"ringtone_title\">Tonua</string>\n\t<string name=\"ringtone_summ\">Sarrerako mezuen tonua</string>\n\t<string name=\"ticker_title\">Mezuaren aurrebista</string>\n\t<string name=\"ticker_summ\">Erakutsi bidaltzailea eta mezua egoera-barran</string>\n\n\t<!-- Startup Setting Strings -->\n\t<string name=\"preftitle_general\">Ezarpen Orokorrak</string>\n\t<string name=\"pref_dnd_when_silent\">Isilik moduan ez gogaitzea</string>\n\t<string name=\"pref_dnd_when_silent_summ\">Zure telefonoa isilik moduan dagoenean, ezarri zure egoera, linean, DNDra</string>\n\t<string name=\"statuspopup_name\">Ezarri zure egoera</string>\n\t<string name=\"showOffline_summ\">Beti erakutsi zerrendako kontaktu guztiak</string>\n\t<string name=\"showOffline_title\">Erakutsi lineaz kanpo dauden kontaktuak</string>\n\t<string name=\"enableGroups_summ\">Kontaktuak taldeka antolatzea</string>\n\t<string name=\"enableGroups_title\">Bistaratu kontaktu-taldeak</string>\n\t<string name=\"foregroundService_summ\">Mantendu aplikazioa memorian konexioa beti piztuta dagoela bermatzeko (lehen mailako zerbitzua)</string>\n\t<string name=\"foregroundService_title\">Egoera-barra ikonoa</string>\n\n\t<string name=\"preftitle_debug\">Arazketa</string>\n\t<string name=\"smackdebug_summ\">Pakete eta arazketa irteera logcat bidez (informazio pertsonala eduki dezake)</string>\n\t<string name=\"smackdebug_title\">SMACK arazketa</string>\n\n\t<string name=\"reportcrash_title\">Bidali kraskadura txostena</string>\n\t<string name=\"reportcrash_summ\">Bidali kraskadura txosten anonimoak garatzaileari</string>\n\n\t<!-- Appearence Strings -->\n\t<string name=\"preftitle_app\">Itxura</string>\n\t<string name=\"FontChat_title\">Berriketaren letra tamaina</string>\n\t<string name=\"FontChat_summ\">Ezarri berriketaren letra tamaina</string>\n\t<string name=\"FontChat_dialog\">Berriketaren letra tamaina</string>\n\t<!--\n\t<string name=\"FontRost_title\">Roster font size</string>\n\t<string name=\"FontRost_summ\">Set roster font size</string>\n\t<string name=\"FontRost_dialog\">Roster font fize</string>\n\t<string name=\"setFontRoster\">Set roster font size</string>\n\t-->\n\t<string name=\"pref_theme\">Gaia</string>\n\t<string name=\"pref_theme_dark\">Iluna</string>\n\t<string name=\"pref_theme_light\">Argia</string>\n\t<string name=\"pref_theme_pine\">Pinua</string>\n\t<string name=\"pref_theme_ice\">Izotza</string>\n\t<string name=\"preftitle_ui\">Itxura</string>\n\t<string-array name=\"fontSizesChat\">\n\t\t<item>txikia</item>\n\t\t<item>normala</item>\n\t\t<item>handia</item>\n\t\t<item>eskerga</item>\n\t</string-array>\n\n\t<!-- Mainmenu \t-->\n\t<string name=\"Menu_addFriend\">Gehitu kontaktua</string>\n\t<string name=\"Menu_addClipboard\">Gehitu %s</string>\n\t<string name=\"Menu_ShowOff\">Erakutsi konexiorik gabe</string>\n\t<string name=\"Menu_HideOff\">Ezkutatu saretik kanpo</string>\n\t<string name=\"Menu_AccSettings\">Editatu kontua</string>\n\t<string name=\"Menu_Settings\">Ezarpenak</string>\n\t<string name=\"Menu_Status\">Egoera</string>\n\t<string name=\"Menu_connect\">Konektatu</string>\n\t<string name=\"Menu_disconnect\">Deskonektatu</string>\n\t<string name=\"Menu_about\">yaxim-i buruz</string>\n\t<string name=\"Menu_about_bruno\">Brunori buruz</string>\n\t<string name=\"Menu_muc\">Gehitu / nabigatu…</string>\n\t<string name=\"Menu_matrix\">Sartu matrizea…</string>\n\t<string name=\"Menu_mark_all_as_read\">Markatu guztiak irakurrita gisa</string>\n\t<string name=\"Menu_send_invitation\">Sortu gonbidaketa</string>\n    <string name=\"Menu_userlist\">Parte-hartzaileak</string>\n\n\n\t<!-- AddFriend -->\n\t<string name=\"addFriend_Title\">Gehitu kontaktu bat</string>\n\t<string name=\"addFriend_Summ\">Mesedez, sartu zure lagunaren Jabber IDa, pantailan agertzea nahi duzun izena eta aukeratu bere kontaktu taldea!</string>\n\t<string name=\"addFriend_aliasHint\">Pantailako izena</string>\n\t<string name=\"addrosteritemaddgroupchoice\">Gehitu talde berri batera</string>\n\t<string name=\"NewGroup_EditTextField_Hint\">Talde berriaren izena</string>\n\n\t<!-- Roster CONTEXTMENU -->\n\t<string name=\"roster_contextmenu_group_rename\">Berrizendatu taldea</string>\n\t<string name=\"roster_contextmenu_contact_mark_as_read\">Markatu irakurrita gisa</string>\n\t<string name=\"roster_contextmenu_contact_delete\">Ezabatu kontaktua</string>\n\t<string name=\"roster_contextmenu_contact_delmsg\">Ezabatu txataren historia</string>\n\t<string name=\"roster_contextmenu_contact_rename\">Berrizendatu</string>\n\t<string name=\"roster_contextmenu_contact_request_auth\">Baimen-eskaera</string>\n\t<string name=\"roster_contextmenu_contact_change_group\">Aldatu taldea</string>\n\t<string name=\"roster_contextmenu_contact_share\">Ekintzen zuzendaritza</string>\n\t<string name=\"roster_contextmenu_contact_ringtone\">Tonua</string>\n\t<string name=\"roster_contextmenu_muc_edit\">Editatu txat-taldea</string>\n\t<string name=\"roster_contextmenu_muc_leave\">Txat taldetik irten</string>\n\t<string name=\"muc_leave_question\">Benetan irten nahi duzu %s?</string>\n\n\t<!-- Accountprefs -->\n\t<string name=\"account_settings_login\">Saio hasieraren informazioa</string>\n\t<string name=\"account_settings_title\">Kontuaren ezarpenak</string>\n\t<string name=\"account_options_title\">Konexioaren aukerak</string>\n\t<string name=\"account_options_advanced\">Aukera aurreratuak</string>\n\t<string name=\"carbons_title\">Message Carbons (XEP-0280)</string>\n\t<string name=\"carbons_summ\">Eskatu beste bezeroaren mezuaren kopiak</string>\n\t<string name=\"account_jabberID_title\">Jabber IDa</string>\n\t<string name=\"account_jabberID_sum\">adibidea: ni@jabber.adibidea.com</string>\n\t<string name=\"account_jabberID_dialog_title\">Sartu zure Jabber IDa:</string>\n\t<string name=\"account_jabberPW_title\">Kontuaren pasahitza</string>\n\t<string name=\"account_jabberPW_sum\">Zure Jabber kontuaren pasahitza</string>\n\t<string name=\"account_jabberPW_change_on_server\">Aldatu pasahitza zerbitzarian</string>\n\t<string name=\"account_jabberPW_password_old\">Pasahitz zaharra:</string>\n\t<string name=\"account_jabberPW_password_new\">Pasahitz berria:</string>\n\t<string name=\"account_jabberPW_warning\">OHARRA! Saioa behar bezala hasteko, pasahitz bera ezarri behar duzu zerbitzarian!</string>\n\t<string name=\"account_jabberPW_progress\">Mesedez, itxaron, pasahitza aldatzen…</string>\n\t<string name=\"account_jabberPW_finished\">Pasahitza ondo aldatu da.</string>\n\t<string name=\"account_jabberPW_error\">Errorea pasahitza aldatzean: %s</string>\n\t<string name=\"account_nickname_title\">Bistaratzeko izena</string>\n\t<string name=\"account_nickname_summ\">Beste erabiltzaileei erakutsitako ezizena</string>\n\t\n\t<!-- accountprefs -->\n\t<string name=\"account_resource_title\">Bezeroaren baliabidea</string>\n\t<string name=\"account_resource_summ\">Lehenetsia: yaxim</string>\n\t<string name=\"account_resource_dialog_title\">Sartu zure baliabidea:</string>\n\t<string name=\"account_resource_hint\">yaxim</string>\n\t<string name=\"account_prio_title\">Bezeroaren lehentasuna</string>\n\t<string name=\"account_prio_summ\">Lehenetsia: 0 (baimenduak: -128 .. 127)</string>\n\t<string name=\"account_prio_error\">Baimendutako balioak: -128 ... 127</string>\n\t<string name=\"account_prio_dialog_title\">Sartu zure lehentasuna:</string>\n\t<string name=\"account_port_title\">Zerbitzariaren ataka</string>\n\t<string name=\"account_port_sum\">Lehenetsia: 5222</string>\n\t<string name=\"account_port_dialog_title\">Sartu zerbitzariaren ataka:</string>\n\t<string name=\"account_port_hint\">5222</string>\n\t<string name=\"account_customserver_title\">Zerbitzari pertsonalizatua</string>\n\t<string name=\"account_customserver_summ\">(Hautazkoa) zerbitzariaren ostalari-izen alternatiboa</string>\n\t<string name=\"account_customserver_dialog_title\">Sartu zerbitzariaren ostalari-izena:</string>\n\t<string name=\"account_customserver_hint\">ostalaria.adibidea.com</string>\n\t<string name=\"require_ssl_title\">Behartu SSL/TLS</string>\n\t<string name=\"require_ssl_summ\">Beti zifratu zerbitzarirako konexioa</string>\n\n\t<!--StatusPopUp-->\n\t<string name=\"AddContact_SpinnerPrompt\">Aukeratu taldea</string>\n\t<string name=\"setStatusmsgHint\">Zure egoera mezua</string>\n\t<string name=\"setStatusTitle\">Ezarri zure egoera</string>\n\t<string name=\"RenameGroup_summ\">Berrizendatu %s taldea honela:</string>\n\t<string name=\"RenameGroup_title\">Berrizendatu taldea</string>\n\t<string name=\"RenameEntry_summ\">Berrizendatu %1$s (%2$s) honela:</string>\n\t<string name=\"RenameEntry_title\">Berrizendatu kontaktua</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_summ\">Hautatu talde bat beheko birakaritik</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_title\">Aldatu taldea</string>\n\t<string name=\"deleteRosterItem_text\">Ziur zaude %1$s (%2$s) kendu nahi duzula?</string>\n\t<string name=\"deleteRosterItem_title\">Ezabatu kontaktua</string>\n\t<string name=\"deleteChatHistory_text\">Ziur zaude %1$s (%2$s) duten mezu guztiak kendu nahi dituzula?</string>\n\t<string name=\"deleteChatHistory_title\">Ezabatu berriketa historia</string>\n\t<string name=\"subscriptionRequest_text\">%1$s wants to add you as a contact: \\\"%2$s\\\"</string>\n\t<string name=\"subscriptionRequest_title\">Harpidetza-eskaera</string>\n\t<string name=\"subscription_accept\">Onetsi</string>\n\t<string name=\"subscription_reject\">Errefusatu</string>\n\t<string name=\"subscription_reject_all\">Baztertu denak</string>\n\t<string name=\"subscription_status_from\">zure egoera ikus dezakezu</string>\n\n\t<!-- CHATWINDOW -->\n\t<string name=\"chat_from_me\">Ni:</string>\n\t<string name=\"toast_stored_offline\">Mezua gorde da transmisiorako.</string>\n\t<string name=\"chat_enterMsgHint\">Sartu mezua</string> \n\n\t<!-- Message context menu; use the verb form (to quote) -->\n\t<string name=\"chatmenu_quote\">Aipua</string>\n\t<!-- Message context menu: repeat the same message -->\n\t<string name=\"chatmenu_resend\">Editatu mezua</string>\n\n\t<!-- GPS settings -->\n\t<!--\n\t<string name=\"showGPS_title\">GPS to status</string>\n\t<string name=\"showGPS_summ_on\">GPS is send to StatusMessage</string>\n\t<string name=\"showGPS_summ_off\">GPS is send to StatusMessage</string>\n\t-->\n\n\t<!-- About Dialog -->\n\t<string name=\"AboutDialog_title\">yaxim-i buruz</string>\n\t<string name=\"AboutDialog_DevelopersTitle\">Garatzaileak</string>\n\t<!-- Contact the developer button -->\n\t<string name=\"AboutDialog_DevelopersText\">Ukipena</string>\n\t<string name=\"AboutDialog_LicenceTitle\">Lizentzia</string>\n\t<string name=\"AboutDialog_Vote\">Aplikazioa baloratu</string>\n\t<string name=\"AboutDialog_LicenceText\">This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. Link: http://www.gnu.org/licenses/gpl-2.0.html\\n \\n Parts of this software are provided under the MIT License:\\n \\n Copyright © 2009 Mads Kristiansen, Nullwire ApS\\n \\n Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: \\n The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. \\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</string>\n\n\t<string name=\"status_available\">Konektatuta</string>\n\t<string name=\"status_away\">Aldendua</string>\n\t<string name=\"status_chat\">Libre berriketarako</string>\n\t<string name=\"status_dnd\">Ez eragotzi</string>\n\t<string name=\"status_xa\">Eskuraezin</string>\n\t<string name=\"status_offline\">Lineaz kanpo</string>\n\n\t<string name=\"translator_credits\">Launchpad Contributions:\n  Asier Iturralde Sarasola https://launchpad.net/~asier-iturralde\n  Georg Lukas https://launchpad.net/~ge0rg\n  Guillermo https://launchpad.net/~willyx96</string>\n\n\t<!-- default roster group with no name -->\n\t<string name=\"default_group\">Orokorra</string>\n\t<string name=\"all_contacts_group\">Kontaktu guztiak</string>\n\t<string name=\"muc_group\">Txat-taldeak</string>\n\n\t<!-- SEND listener popup -->\n\t<string name=\"chooseContact\">Aukeratu kontaktua</string>\n\t<string name=\"action_settings\">Ezarpenak</string>\n\n\t<!-- MUC strings -->\n\t<string name=\"muc_jid_hint\">JID txat-taldea</string>\n\t<string name=\"muc_nickname_hint\">Ezizena</string>\n\t<string name=\"muc_password_hint\">Pasahitza (aukerakoa)</string>\n\t<string name=\"title_activity_muc_invite\">Taldeko txat-gonbidapena</string>\n\t<!-- Groupchat invitation: \"Invitation from {contact name}\" -->\n\t<string name=\"muc_invitation_from\">%s-aren gonbidapena</string>\n\t<!-- Groupchat info: {description} ({number} participants) -->\n\t<string name=\"muc_invitation_occupants\">%1$s (%2$d participants)</string>\n\t<!-- Notification button: \"Join as {default nickname}\" (make SHORT string) -->\n\t<string name=\"muc_invitation_join\">Bat egin %s gisa</string>\n\t<string name=\"muc_synchronizing\">Sinkronizatzen…</string>\n\t<!-- Title of user list, contains JID -->\n\t<string name=\"chat_muc_userlist\">Chat taldeko parte-hartzaileak (%s)</string>\n\t<!-- Kicked from groupchat: \"Kicked: {reason} -->\n\t<string name=\"muc_kicked\">Kicked: %s</string>\n\t<!-- Kicked from groupchat: \"Kicked by {admin name}: {reason} -->\n\t<string name=\"muc_kicked_by\">Kicked by %1$s: %2$s</string>\n\t<!-- Banned from groupchat: \"Banned: {reason} -->\n\t<string name=\"muc_banned\">%s debekatua</string>\n\t<!-- Banned from groupchat: \"Banned by {admin name}: {reason} -->\n\t<string name=\"muc_banned_by\">Banned by %1$s: %2$s</string>\n\n\t<!-- File upload -->\n\t<string name=\"roster_contextmenu_send\">Bidali…</string>\n\t<string name=\"roster_contextmenu_take_image\">Argazkia atera</string>\n\t<string name=\"roster_contextmenu_send_image\">Aukeratu irudia</string>\n\t<string name=\"roster_contextmenu_send_file\">Bidali fitxategia</string>\n\t<string name=\"upload_compress\">Irudia konprimitzen...</string>\n\t<string name=\"upload_uploading\">Igotzen…</string>\n\t<string name=\"upload_too_large\">fitxategia handiegia da!</string>\n\t<string name=\"storage_permission\">%s fitxategiak bidaltzeko biltegiratze-sarbidea behar du!</string>\n\t<string name=\"notification_permission_denied\">Notifications are disabled in the Android app preferences.</string>\n\n\t<!-- Search -->\n\t<string name=\"search_msg_hint\">Mezuaren edukia</string>\n\n\t<!-- MUC bookmarks -->\n\t<string name=\"group_bookmarks\">Nire taldeko txatak</string>\n\t<string name=\"group_mucsearch\">Talde publikoetako txatak</string>\n\t<!-- Service Discovery -->\n\t<string name=\"title_service_disco\">%s nabigatzailea</string>\n\n\t<!-- Android 9 notification preferences: permanent notification -->\n\t<string name=\"notification_status\">Zerbitzu aurreratua</string>\n\t<!-- Android 9 notification preferences: message notifications -->\n\t<string name=\"notification_msg\">Mezuak</string>\n\n</resources>\n"
  },
  {
    "path": "res/values-fi/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"app_name\">yaxim</string>\n\t<string name=\"app_name_bruno\">Bruno</string>\n\n\t<!-- Connection state -->\n\t<string name=\"conn_title\">yaxim: %s</string>\n\t<string name=\"conn_title_bruno\">Bruno: %s</string>\n\t<string name=\"conn_connecting\">Yhdistetään palvelimeen...</string>\n\t<string name=\"conn_disconnecting\">Katkaistaan yhteyttä...</string>\n\t<string name=\"conn_online\">Verkossa</string>\n\t<string name=\"conn_offline\">Poissa verkosta</string>\n\t<string name=\"conn_empty_roster\">Ei yhteystietoja!</string>\n\t<string name=\"conn_empty_roster_hints\">Yhteystietoja voi lisätä monella tavalla:\n\n- Andoid Beam™: kosketa toista puhelinta\n\n- Skannaa QR-koodi\n\n- \\\"Luo kutsu\\\" ja jaa se (sähköpostilla, tekstiviestillä, QR-koodilla)\n\n- \\\"Lisää yhteystieto\\\" jos tiedät JID:n</string>\n\t<string name=\"conn_reconnect\">Seuraava yhteydenmuodostus %d sekunnin kuluttua.</string>\n\t<string name=\"conn_disconnected\">Yhteys suljettiin</string>\n\t<string name=\"conn_no_network\">Ei verkkoyhteyttä</string>\n\t<string name=\"conn_ping_timeout\">Ei vastausta</string>\n\t<string name=\"conn_error\">Virhe: %s</string>\n\n\t<!-- Global Strings -->\n\t<string name=\"Global_Exit\">Poistu</string>\n\t<string name=\"Global_authenticate_first\">Ole hyvä ja muodosta yhteys ensin</string>\n\t<string name=\"Global_JID_hint\">käyttäjä@yax.im</string>\n\t<!-- tooltip message when the user entered an invalid XMPP address -->\n\t<string name=\"Global_JID_malformed\">Tarkista osoitteen muotoilu ja oikeinkirjoitus</string>\n\n\t<!-- FirstStartUpDialog -->\n\t<string name=\"StartupDialog_Title\">Tervetuloa yaxim-viestimeen!</string>\n\t<string name=\"StartupDialog_Summary\">Yaximin asetukset on määriteltävä ennen käyttöä. Ole hyvä ja anna Jabber-käyttäjätunnuksesi sekä salasanasi.</string>\n\t<string name=\"StartupDialog_pwHint\">Syötä salasana</string>\n\t<string name=\"StartupDialog_pwshowHint\">Näytä salasana</string>\n\t<string name=\"StartupDialog_Username_title\">Jabber-tunnus:</string>\n\t<string name=\"StartupDialog_passwd_title\">Salasana:</string>\n\t<string name=\"StartupDialog_advanced\">Lisäominaisuudet...</string>\n\t<string name=\"StartupDialog_create_new\">Luo uusi tunnus</string>\n\t<string name=\"StartupDialog_error_password\">Salasana on liian lyhyt!</string>\n\t<string name=\"StartupDialog_created_password\">Turvallinen salasana luotu</string>\n\t<string name=\"StartupDialog_auth_failed\">Ole hyvä ja tarkasta käyttäjätunnuksesi ja salasanasi!</string>\n\t<string name=\"StartupDialog_server_failed\">Could not connect to %s!</string>\n\t<string name=\"StartupDialog_no_registration\">Server does not allow registration!</string>\n\n\t<string name=\"StartupDialog_invitation\">Sinut on kutsuttu Jabberiin. Ole hyvä ja viimeistele rekisteröintisi.</string>\n\t<string name=\"StartupDialog_no_more_accounts\">Lisätiliä ei tueta, sinulla voi olla vain yksi tili!</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_message\">Viesti käyttäjältä %s</string>\n\t<string name=\"notification_anonymous_message\">Viesti vastaanotettu</string>\n\t<!--  Group Chat notification, %1$s is the user name, %2$s is the room, e.g. \"{Ge0rG} in {yaxim Chat}\" -->\n\t<string name=\"notification_muc_message\">%1$s huoneessa %2$s</string>\n\t<!--  Group Group Chat private message notification, %1$s is the user name, %2$s is the room, e.g. \"Message from {Ge0rG} in {yaxim Chat}\" -->\n\t<!--string name=\"notification_muc_pm\">Message from %1$s in %2$s</string-->\n\t<!-- notification button: direct reply (make SHORT string) -->\n\t<string name=\"notification_reply\">Vastaa</string>\n\t<!-- notification button: mark as read (make SHORT string) -->\n\t<string name=\"notification_mark_read\">Merkitse luetuksi</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_error\">Virhe lähetettäessä viestiä!</string>\n\n\t<!-- Notification Settings -->\n\t<string name=\"preftitle_notify\">Ilmoitusasetukset</string>\n\t<string name=\"preftitle_notify_msg\">Viesti-ilmoitus</string>\n\t<string name=\"preftitle_notify_muc\">Ryhmäkeskustelun ilmoitukset</string>\n\t<string name=\"notification_custom\">Omavalintainen soittoääni</string>\n\t<string name=\"muc_highlight_title\">Ilmoita vain mainittaessa</string>\n\t<string name=\"muc_highlight_sum\">Ilmoita, kun nimesi mainitaan huoneessa</string>\n\t<string name=\"led_title\">Vilkkuva LED</string>\n\t<string name=\"led_summ\">Vilkauta puhelimen LEDiä viestin saapuessa</string>\n\t<string name=\"vibr_title\">Värinä</string>\n\t<string name=\"vibr_summ\">Värise viestin saapuessa</string>\n\t<string-array name=\"vibr_values_displayed\">\n\t\t<item>Ei koskaan</item>\n\t\t<item>Järjestelmän asetukset</item>\n\t\t<item>Aina</item>\n\t</string-array>\n\t<string name=\"ringtone_title\">Soittoääni</string>\n\t<string name=\"ringtone_summ\">Vastaanotettujen viestien hälytysääni</string>\n\t<string name=\"ticker_title\">Viestin esikatselu</string>\n\t<string name=\"ticker_summ\">Näytä lähettäjä sekä viesti tilapalkissa</string>\n\n\t<!-- Startup Setting Strings -->\n\t<string name=\"preftitle_general\">Yleiset asetukset</string>\n\t<string name=\"pref_dnd_when_silent\">\\\"Älä häiritse\\\"-tila hiljennettynä</string>\n\t<string name=\"pref_dnd_when_silent_summ\">Muuta tilasi \\\"älä häiritse\\\"-tilaan kun puhelimesi on hiljennetty</string>\n\t<string name=\"statuspopup_name\">Aseta tilasi</string>\n\t<string name=\"showOffline_summ\">Näytä aina kaikki kontaktit listalla</string>\n\t<string name=\"showOffline_title\">Näytä poissaolevat kontaktit</string>\n\t<string name=\"enableGroups_summ\">Järjestä kontaktit ryhmien mukaan</string>\n\t<string name=\"enableGroups_title\">Näytä ryhmät</string>\n\t<string name=\"foregroundService_summ\">Säilytä sovellus muistissa varmistaaksesi yhteyden pysyvän aina päällä (etualan palvelu)</string>\n\t<string name=\"foregroundService_title\">Tilapalkin kuvake</string>\n\n\t<string name=\"preftitle_debug\">Virheenjäljitys</string>\n\t<string name=\"smackdebug_summ\">Paketti- ja virheenjäljitystiedot logcatin avulla (voi sisältää henkilökohtaista tietoa)</string>\n\t<string name=\"smackdebug_title\">SMACK virheenjäljitys</string>\n\n\t<string name=\"reportcrash_title\">Lähetä kaatumisraportit</string>\n\t<string name=\"reportcrash_summ\">Lähetä anonyymit kaatumisraportit kehittäjälle</string>\n\n\t<!-- Appearence Strings -->\n\t<string name=\"preftitle_app\">Ulkoasu</string>\n\t<string name=\"FontChat_title\">Keskusteluikkunan kirjasinkoko</string>\n\t<string name=\"FontChat_summ\">Aseta keskusteluikkunan kirjasinkoko</string>\n\t<string name=\"FontChat_dialog\">Keskusteluikkunan kirjasinkoko</string>\n\t<!--\n\t<string name=\"FontRost_title\">Roster font size</string>\n\t<string name=\"FontRost_summ\">Set roster font size</string>\n\t<string name=\"FontRost_dialog\">Roster font fize</string>\n\t<string name=\"setFontRoster\">Set roster font size</string>\n\t-->\n\t<string name=\"pref_theme\">Teema</string>\n\t<string name=\"pref_theme_dark\">Tumma</string>\n\t<string name=\"pref_theme_light\">Vaalea</string>\n\t<string name=\"pref_theme_pine\">Mänty</string>\n\t<string name=\"pref_theme_ice\">Jää</string>\n\t<string name=\"preftitle_ui\">Ulkoasu</string>\n\t<string-array name=\"fontSizesChat\">\n\t\t<item>pieni</item>\n\t\t<item>normaali</item>\n\t\t<item>suuri</item>\n\t\t<item>valtava</item>\n\t</string-array>\n\n\t<!-- Mainmenu \t-->\n\t<string name=\"Menu_addFriend\">Lisää yhteystieto</string>\n\t<string name=\"Menu_addClipboard\">Lisää %s</string>\n\t<string name=\"Menu_ShowOff\">Näytä poissaolevat</string>\n\t<string name=\"Menu_HideOff\">Piilota poissaolevat</string>\n\t<string name=\"Menu_AccSettings\">Muokkaa tiliä</string>\n\t<string name=\"Menu_Settings\">Asetukset</string>\n\t<string name=\"Menu_Status\">Tila</string>\n\t<string name=\"Menu_connect\">Yhdistä</string>\n\t<string name=\"Menu_disconnect\">Katkaise yhteys</string>\n\t<string name=\"Menu_about\">Tietoja yaximista</string>\n\t<string name=\"Menu_about_bruno\">Tietoja Brunosta</string>\n\t<string name=\"Menu_muc\">Lisää / selaa...</string>\n\t<string name=\"Menu_matrix\">Astu sisään Matrixiin...</string>\n\t<string name=\"Menu_mark_all_as_read\">Merkitse kaikki luetuiksi</string>\n\t<string name=\"Menu_send_invitation\">Luo kutsu</string>\n    <string name=\"Menu_userlist\">Osallistujat</string>\n\n\n\t<!-- AddFriend -->\n\t<string name=\"addFriend_Title\">Lisää kontakti</string>\n\t<string name=\"addFriend_Summ\">Ole hyvä ja anna tuttavasi Jabber-tunnus, näytettävä nimi ja kontaktiryhmä.</string>\n\t<string name=\"addFriend_aliasHint\">Näytettävä nimi</string>\n\t<string name=\"addrosteritemaddgroupchoice\">Lisää uuteen ryhmään</string>\n\t<string name=\"NewGroup_EditTextField_Hint\">Nimi uudelle ryhmälle</string>\n\n\t<!-- Roster CONTEXTMENU -->\n\t<string name=\"roster_contextmenu_group_rename\">Nimeä ryhmä uudelleen</string>\n\t<string name=\"roster_contextmenu_contact_mark_as_read\">Merkitse luetuksi</string>\n\t<string name=\"roster_contextmenu_contact_delete\">Poista yhteystieto</string>\n\t<string name=\"roster_contextmenu_contact_delmsg\">Poista keskusteluhistoria</string>\n\t<string name=\"roster_contextmenu_contact_rename\">Nimeä uudelleen</string>\n\t<string name=\"roster_contextmenu_contact_request_auth\">Pyydä hyväksyntää</string>\n\t<string name=\"roster_contextmenu_contact_change_group\">Vaihda ryhmää</string>\n\t<string name=\"roster_contextmenu_contact_share\">Jaa osoite</string>\n\t<string name=\"roster_contextmenu_contact_ringtone\">Soittoääni</string>\n\t<string name=\"roster_contextmenu_muc_edit\">Muokkaa ryhmäkeskustelua</string>\n\t<string name=\"roster_contextmenu_muc_leave\">Poistu ryhmäkeskustelusta</string>\n\t<string name=\"muc_leave_question\">Poistutaanko ryhmästä %s?</string>\n\n\t<!-- Accountprefs -->\n\t<string name=\"account_settings_login\">Kirjautumistiedot</string>\n\t<string name=\"account_settings_title\">Tiliasetukset</string>\n\t<string name=\"account_options_title\">Yhteysasetukset</string>\n\t<string name=\"account_options_advanced\">Lisäasetukset</string>\n\t<string name=\"carbons_title\">Viestien kopiot (XEP-0280)</string>\n\t<string name=\"carbons_summ\">Pyydä viestikopiot muilta asiakasohjelmiltasi</string>\n\t<string name=\"account_jabberID_title\">Jabber-tunnus</string>\n\t<string name=\"account_jabberID_sum\">esimerkki: minä@jabber.example.com</string>\n\t<string name=\"account_jabberID_dialog_title\">Anna Jabber-tunnus:</string>\n\t<string name=\"account_jabberPW_title\">Tilin salasana</string>\n\t<string name=\"account_jabberPW_sum\">Jabber-tilisi salasana</string>\n\t<string name=\"account_jabberPW_change_on_server\">Muuta salasana palvelimella</string>\n\t<string name=\"account_jabberPW_password_old\">Vanha salasana:</string>\n\t<string name=\"account_jabberPW_password_new\">Uusi salasana:</string>\n\t<string name=\"account_jabberPW_warning\">HUOMAA! Jotta kirjautuminen onnistuisi, salasana on vaihdettava myös palvelimella!</string>\n\t<string name=\"account_jabberPW_progress\">Odota hetki, salasanaa vaihdetaan...</string>\n\t<string name=\"account_jabberPW_finished\">Salasanan vaihto onnistui.</string>\n\t<string name=\"account_jabberPW_error\">Salasanan vaihto epäonnistui: %s</string>\n\t<string name=\"account_nickname_title\">Näyttönimi</string>\n\t<string name=\"account_nickname_summ\">Lempinimesi, joka näkyy muille käyttäjille</string>\n\t\n\t<!-- accountprefs -->\n\t<string name=\"account_resource_title\">Ohjelman resurssi</string>\n\t<string name=\"account_resource_summ\">Oletus: yaxim</string>\n\t<string name=\"account_resource_dialog_title\">Anna haluamasi resurssi:</string>\n\t<string name=\"account_resource_hint\">yaxim</string>\n\t<string name=\"account_prio_title\">Ohjelman prioriteetti</string>\n\t<string name=\"account_prio_summ\">Oletus: 0 (sallittu: -128 .. 127)</string>\n\t<string name=\"account_prio_error\">Sallitut arvot: -128 .. 127</string>\n\t<string name=\"account_prio_dialog_title\">Anna prioriteetti:</string>\n\t<string name=\"account_port_title\">Palvelimen portti</string>\n\t<string name=\"account_port_sum\">Oletus: 5222</string>\n\t<string name=\"account_port_dialog_title\">Anna palvelimen portti:</string>\n\t<string name=\"account_port_hint\">5222</string>\n\t<string name=\"account_customserver_title\">Muu palvelin</string>\n\t<string name=\"account_customserver_summ\">(Valinnainen) Vaihtoehtoinen palvelimen osoite</string>\n\t<string name=\"account_customserver_dialog_title\">Anna palvelimen verkkotunnus:</string>\n\t<string name=\"account_customserver_hint\">host.example.com</string>\n\t<string name=\"require_ssl_title\">Vaadi SSL/TLS</string>\n\t<string name=\"require_ssl_summ\">Pakota salattu palvelinyhteys</string>\n\n\t<!--StatusPopUp-->\n\t<string name=\"AddContact_SpinnerPrompt\">Valitse ryhmä</string>\n\t<string name=\"setStatusmsgHint\">Tilaviestisi</string>\n\t<string name=\"setStatusTitle\">Aseta tilasi</string>\n\t<string name=\"RenameGroup_summ\">Nimeä ryhmä %s uudelleen:</string>\n\t<string name=\"RenameGroup_title\">Nimeä ryhmä uudelleen</string>\n\t<string name=\"RenameEntry_summ\">Nimeä %1$s (%2$s) uudelleen:</string>\n\t<string name=\"RenameEntry_title\">Uudelleennimeä kontakti</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_summ\">Valitse ryhmä kiekosta alapuolella</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_title\">Vaihda ryhmää</string>\n\t<string name=\"deleteRosterItem_text\">Poistetaanko %1$s (%2$s) varmasti?</string>\n\t<string name=\"deleteRosterItem_title\">Poista kontakti</string>\n\t<string name=\"deleteChatHistory_text\">Poistetaanko kaikki kontaktin %1$s (%2$s) viestit?</string>\n\t<string name=\"deleteChatHistory_title\">Pyyhi viestihistoria</string>\n\t<string name=\"subscriptionRequest_text\">%1$s haluaa lisätä sinut kontakteihinsa: \\\"%2$s\\\"</string>\n\t<string name=\"subscriptionRequest_title\">Hyväksyntäpyyntö</string>\n\t<string name=\"subscription_accept\">Hyväksy</string>\n\t<string name=\"subscription_reject\">Hylkää</string>\n\t<string name=\"subscription_reject_all\">Hylkää kaikki</string>\n\t<string name=\"subscription_status_from\">voi nähdä tilasi</string>\n\n\t<!-- CHATWINDOW -->\n\t<string name=\"chat_from_me\">Minä:</string>\n\t<string name=\"toast_stored_offline\">Viesti on tallennettu lähetystä varten.</string>\n\t<string name=\"chat_enterMsgHint\">Syötä viesti</string> \n\n\t<!-- Message context menu; use the verb form (to quote) -->\n\t<string name=\"chatmenu_quote\">Lainaa</string>\n\t<!-- Message context menu: repeat the same message -->\n\t<string name=\"chatmenu_resend\">Muokkaa viestiä</string>\n\n\t<!-- GPS settings -->\n\t<!--\n\t<string name=\"showGPS_title\">GPS to status</string>\n\t<string name=\"showGPS_summ_on\">GPS is send to StatusMessage</string>\n\t<string name=\"showGPS_summ_off\">GPS is send to StatusMessage</string>\n\t-->\n\n\t<!-- About Dialog -->\n\t<string name=\"AboutDialog_title\">Tietoja yaximista</string>\n\t<string name=\"AboutDialog_DevelopersTitle\">Kehittäjät</string>\n\t<!-- Contact the developer button -->\n\t<string name=\"AboutDialog_DevelopersText\">Ota yhteyttä</string>\n\t<string name=\"AboutDialog_LicenceTitle\">Lisenssit</string>\n\t<string name=\"AboutDialog_Vote\">Arvioi tämä sovellus</string>\n\t<string name=\"AboutDialog_LicenceText\">\n\t\tThis program is free software; you can redistribute\n\t\tit and/or\n\t\tmodify it under the terms of the GNU General Public License\n\t\tversion 2\n\t\tas published by the Free Software Foundation.\n\t\tLink:\n\t\thttp://www.gnu.org/licenses/gpl-2.0.html\\n\n\t\t\\n\n\t\tParts of this software are\n\t\tprovided under the MIT License:\\n\n\t\t\\n\n\t\tCopyright © 2009 Mads\n\t\tKristiansen, Nullwire ApS\\n\n\t\t\\n\n\t\tPermission is hereby granted, free of\n\t\tcharge, to any person obtaining\n\t\ta copy\n\t\tof this software and associated\n\t\tdocumentation files (the\n\t\t\"Software\"), to deal\n\t\tin the Software without\n\t\trestriction, including\n\t\twithout limitation the rights\n\t\tto use, copy,\n\t\tmodify, merge, publish,\n\t\tdistribute, sublicense, and/or sell\n\t\tcopies of\n\t\tthe Software, and to\n\t\tpermit persons to whom the Software is\n\t\tfurnished to\n\t\tdo so, subject to\n\t\tthe following conditions:\n\t\t\\n\n\t\tThe above copyright notice\n\t\tand this permission notice shall be\n\t\tincluded in all\n\t\tcopies or\n\t\tsubstantial portions of the Software.\n\t\t\\n\n\t\tTHE SOFTWARE IS PROVIDED \"AS\n\t\tIS\", WITHOUT WARRANTY OF ANY KIND,\n\t\tEXPRESS OR\n\t\tIMPLIED, INCLUDING BUT NOT\n\t\tLIMITED TO THE WARRANTIES OF\n\t\tMERCHANTABILITY,\n\t\tFITNESS FOR A PARTICULAR\n\t\tPURPOSE AND NONINFRINGEMENT.\n\t\tIN NO EVENT SHALL THE\n\t\tAUTHORS OR COPYRIGHT\n\t\tHOLDERS BE LIABLE FOR ANY\n\t\tCLAIM, DAMAGES OR OTHER\n\t\tLIABILITY, WHETHER IN\n\t\tAN ACTION OF CONTRACT,\n\t\tTORT OR OTHERWISE, ARISING FROM,\n\t\tOUT OF OR IN\n\t\tCONNECTION WITH THE\n\t\tSOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n\t\tSOFTWARE.\n    </string>\n\n\t<string name=\"status_available\">Verkossa</string>\n\t<string name=\"status_away\">Poissa</string>\n\t<string name=\"status_chat\">Vapaa keskustelemaan</string>\n\t<string name=\"status_dnd\">Älä häiritse</string>\n\t<string name=\"status_xa\">Ei saatavilla</string>\n\t<string name=\"status_offline\">Poissa verkosta</string>\n\n\t<string name=\"translator_credits\">Launchpad Contributions:\n  Georg Lukas https://launchpad.net/~ge0rg\n  Heikki Hannikainen https://launchpad.net/~hessu\n  Jussi Karttunen https://launchpad.net/~jkarttunen</string>\n\n\t<!-- default roster group with no name -->\n\t<string name=\"default_group\">Yleiset</string>\n\t<string name=\"all_contacts_group\">Kaikki yhteystiedot</string>\n\t<string name=\"muc_group\">Ryhmäkeskustelut</string>\n\n\t<!-- SEND listener popup -->\n\t<string name=\"chooseContact\">Valitse kontakti</string>\n\t<string name=\"action_settings\">Asetukset</string>\n\n\t<!-- MUC strings -->\n\t<string name=\"muc_jid_hint\">Ryhmäkeskustelun JID</string>\n\t<string name=\"muc_nickname_hint\">Nimimerkki</string>\n\t<string name=\"muc_password_hint\">Salasana (vapaaehtoinen)</string>\n\t<string name=\"title_activity_muc_invite\">Kutsu ryhmäkeskustelun</string>\n\t<!-- Groupchat invitation: \"Invitation from {contact name}\" -->\n\t<string name=\"muc_invitation_from\">Kutsu käyttäjältä %s</string>\n\t<!-- Groupchat info: {description} ({number} participants) -->\n\t<string name=\"muc_invitation_occupants\">%1$s (%2$d osallistujaa)</string>\n\t<!-- Notification button: \"Join as {default nickname}\" (make SHORT string) -->\n\t<string name=\"muc_invitation_join\">Liity käyttäjänä %s</string>\n\t<string name=\"muc_synchronizing\">Synkronoi...</string>\n\t<!-- Title of user list, contains JID -->\n\t<string name=\"chat_muc_userlist\">Ryhmäkeskustelun osallistujat (%s)</string>\n\t<!-- Kicked from groupchat: \"Kicked: {reason} -->\n\t<string name=\"muc_kicked\">Poistettu: %s</string>\n\t<!-- Kicked from groupchat: \"Kicked by {admin name}: {reason} -->\n\t<string name=\"muc_kicked_by\">%1$s:n poistama: %2$s</string>\n\t<!-- Banned from groupchat: \"Banned: {reason} -->\n\t<string name=\"muc_banned\">Estetty: %s</string>\n\t<!-- Banned from groupchat: \"Banned by {admin name}: {reason} -->\n\t<string name=\"muc_banned_by\">%1$s:n estämä: %2$s</string>\n\n\t<!-- File upload -->\n\t<string name=\"roster_contextmenu_send\">Lähetä...</string>\n\t<string name=\"roster_contextmenu_take_image\">Ota kuva</string>\n\t<string name=\"roster_contextmenu_send_image\">Valitse kuva</string>\n\t<string name=\"roster_contextmenu_send_file\">Lähetä tiedosto</string>\n\t<string name=\"upload_compress\">Pakataan kuvaa...</string>\n\t<string name=\"upload_uploading\">Lähetetään...</string>\n\t<string name=\"upload_too_large\">tiedosto on liian suuri!</string>\n\t<string name=\"storage_permission\">%s tarvitsee käyttöoikeuden tallennustilaan tiedostojen lähettämistä varten!</string>\n\t<string name=\"notification_permission_denied\">Notifications are disabled in the Android app preferences.</string>\n\n\t<!-- Search -->\n\t<string name=\"search_msg_hint\">Viestin sisältö</string>\n\n\t<!-- MUC bookmarks -->\n\t<string name=\"group_bookmarks\">Viestiryhmäni</string>\n\t<string name=\"group_mucsearch\">Julkiset viestiryhmät</string>\n\t<!-- Service Discovery -->\n\t<string name=\"title_service_disco\">Selain: %s</string>\n\n\t<!-- Android 9 notification preferences: permanent notification -->\n\t<string name=\"notification_status\">Etualan palvelu</string>\n\t<!-- Android 9 notification preferences: message notifications -->\n\t<string name=\"notification_msg\">Viestit</string>\n\n</resources>\n"
  },
  {
    "path": "res/values-fr/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"app_name\">yaxim</string>\n\t<string name=\"app_name_bruno\">Bruno</string>\n\n\t<!-- Connection state -->\n\t<string name=\"conn_title\">yaxim : %s</string>\n\t<string name=\"conn_title_bruno\">Bruno : %s</string>\n\t<string name=\"conn_connecting\">Connexion au serveur…</string>\n\t<string name=\"conn_disconnecting\">Déconnexion…</string>\n\t<string name=\"conn_online\">En ligne</string>\n\t<string name=\"conn_offline\">Hors ligne</string>\n\t<string name=\"conn_empty_roster\">Aucun contact à afficher !</string>\n\t<string name=\"conn_empty_roster_hints\">Il existe de nombreuses façons d\\'ajouter des contacts :\\n\\n - Android Beam™ : touchez le téléphone d’un ami\\n\\n - Scannez un QR code\\n\\n - « Créez une invitation » et partagez-la (e-mail, SMS, QR code…)\\n\\n - « Ajoutez un contact » si vous connaissez son JID</string>\n\t<string name=\"conn_reconnect\">Prochaine tentative de connexion dans %d secondes.</string>\n\t<string name=\"conn_disconnected\">Connexion terminée</string>\n\t<string name=\"conn_no_network\">Aucune connexion réseau</string>\n\t<string name=\"conn_ping_timeout\">Pas de réponse</string>\n\t<string name=\"conn_error\">Erreur : %s</string>\n\n\t<!-- Global Strings -->\n\t<string name=\"Global_Exit\">Quitter</string>\n\t<string name=\"Global_authenticate_first\">Merci de d\\'abord vous connecter</string>\n\t<string name=\"Global_JID_hint\">utilisateur@yax.im</string>\n\t<!-- tooltip message when the user entered an invalid XMPP address -->\n\t<string name=\"Global_JID_malformed\">Vérifiez le format de l\\'adresse !</string>\n\n\t<!-- FirstStartUpDialog -->\n\t<string name=\"StartupDialog_Title\">Bienvenue dans yaxim !</string>\n\t<string name=\"StartupDialog_Summary\">Vous devez configurer yaxim avant de pouvoir l\\'utiliser. Merci d\\'entrer votre identifiant Jabber et son mot de passe.</string>\n\t<string name=\"StartupDialog_pwHint\">Saisir un mot de passe</string>\n\t<string name=\"StartupDialog_pwshowHint\">Afficher le mot de passe</string>\n\t<string name=\"StartupDialog_Username_title\">Identifiant Jabber :</string>\n\t<string name=\"StartupDialog_passwd_title\">Mot de passe :</string>\n\t<string name=\"StartupDialog_advanced\">Avancé…</string>\n\t<string name=\"StartupDialog_create_new\">Enregistrer un nouveau compte</string>\n\t<string name=\"StartupDialog_error_password\">Le mot de passe est trop court !</string>\n\t<string name=\"StartupDialog_created_password\">Mot passe sûr créé</string>\n\t<string name=\"StartupDialog_auth_failed\">Vérifiez votre nom d’utilisateur et votre mot de passe !</string>\n\t<string name=\"StartupDialog_server_failed\">Could not connect to %s!</string>\n\t<string name=\"StartupDialog_no_registration\">Server does not allow registration!</string>\n\n\t<string name=\"StartupDialog_invitation\">Vous avez été invités sur Jabber. Merci de bien vouloir finir votre inscription.</string>\n\t<string name=\"StartupDialog_no_more_accounts\">Pas de prise en charge d’un compte supplémentaire !</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_message\">Message de %s</string>\n\t<string name=\"notification_anonymous_message\">Message reçu</string>\n\t<!--  Group Chat notification, %1$s is the user name, %2$s is the room, e.g. \"{Ge0rG} in {yaxim Chat}\" -->\n\t<string name=\"notification_muc_message\">%1$s dans %2$s</string>\n\t<!--  Group Group Chat private message notification, %1$s is the user name, %2$s is the room, e.g. \"Message from {Ge0rG} in {yaxim Chat}\" -->\n\t<!--string name=\"notification_muc_pm\">Message from %1$s in %2$s</string-->\n\t<!-- notification button: direct reply (make SHORT string) -->\n\t<string name=\"notification_reply\">Répondre</string>\n\t<!-- notification button: mark as read (make SHORT string) -->\n\t<string name=\"notification_mark_read\">Marquer comme lu</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_error\">Erreur lors de l\\'envoi du message !</string>\n\n\t<!-- Notification Settings -->\n\t<string name=\"preftitle_notify\">Configuration des notifications</string>\n\t<string name=\"preftitle_notify_msg\">Notification de message</string>\n\t<string name=\"preftitle_notify_muc\">Notification de salon</string>\n\t<string name=\"notification_custom\">Sonnerie personnalisée</string>\n\t<string name=\"muc_highlight_title\">Ne notifier que les mentions</string>\n\t<string name=\"muc_highlight_sum\">Ne notifier que quand votre nom est mentionné dans un salon</string>\n\t<string name=\"led_title\">LED clignotante</string>\n\t<string name=\"led_summ\">LED clignotante lors de la réception d\\'un nouveau message</string>\n\t<string name=\"vibr_title\">Vibration</string>\n\t<string name=\"vibr_summ\">Vibration lors de la réception d’un nouveau message</string>\n\t<string-array name=\"vibr_values_displayed\">\n\t\t<item>Jamais</item>\n\t\t<item>Préférence système</item>\n\t\t<item>Toujours</item>\n\t</string-array>\n\t<string name=\"ringtone_title\">Sonnerie</string>\n\t<string name=\"ringtone_summ\">Sonnerie pour les messages entrants</string>\n\t<string name=\"ticker_title\">Prévisualisation du message</string>\n\t<string name=\"ticker_summ\">Affiché l’expéditeur et le messsage dans la barre d’état</string>\n\n\t<!-- Startup Setting Strings -->\n\t<string name=\"preftitle_general\">Paramètres généraux</string>\n\t<string name=\"pref_dnd_when_silent\">« Ne pas déranger » en mode silence</string>\n\t<string name=\"pref_dnd_when_silent_summ\">Change votre statut en « ne pas déranger » quand votre téléphone est en mode silencieux</string>\n\t<string name=\"statuspopup_name\">Définir votre état</string>\n\t<string name=\"showOffline_summ\">Toujours afficher l’ensemble des contacts dans la liste</string>\n\t<string name=\"showOffline_title\">Afficher les contacts hors ligne</string>\n\t<string name=\"enableGroups_summ\">Organiser vos contacts selon leurs groupes</string>\n\t<string name=\"enableGroups_title\">Afficher les groupes du contact</string>\n\t<string name=\"foregroundService_summ\">Garder l’application en mémoire pour garantir que la connexion sera toujours établie (service au premier plan)</string>\n\t<string name=\"foregroundService_title\">Icône de la barre d\\'état</string>\n\n\t<string name=\"preftitle_debug\">Débogage</string>\n\t<string name=\"smackdebug_summ\">Paquets et informations de débogage via logcat (peut contenir des informations personnelles)</string>\n\t<string name=\"smackdebug_title\">Débogage de SMACK</string>\n\n\t<string name=\"reportcrash_title\">Envoyer les rapports d’erreur</string>\n\t<string name=\"reportcrash_summ\">Envoyer des rapports de crash anonymes au développeur</string>\n\n\t<!-- Appearence Strings -->\n\t<string name=\"preftitle_app\">Apparence</string>\n\t<string name=\"FontChat_title\">Taille de la police dans les conversations</string>\n\t<string name=\"FontChat_summ\">Paramétrer la taille de la police dans les conversations</string>\n\t<string name=\"FontChat_dialog\">Taille de la police dans les conversations</string>\n\t<!--\n\t<string name=\"FontRost_title\">Roster font size</string>\n\t<string name=\"FontRost_summ\">Set roster font size</string>\n\t<string name=\"FontRost_dialog\">Roster font fize</string>\n\t<string name=\"setFontRoster\">Set roster font size</string>\n\t-->\n\t<string name=\"pref_theme\">Thème</string>\n\t<string name=\"pref_theme_dark\">Sombre</string>\n\t<string name=\"pref_theme_light\">Clair</string>\n\t<string name=\"pref_theme_pine\">Pin</string>\n\t<string name=\"pref_theme_ice\">Glace</string>\n\t<string name=\"preftitle_ui\">Apparence</string>\n\t<string-array name=\"fontSizesChat\">\n\t\t<item>petit</item>\n\t\t<item>normal</item>\n\t\t<item>grand</item>\n\t\t<item>très grand</item>\n\t</string-array>\n\n\t<!-- Mainmenu \t-->\n\t<string name=\"Menu_addFriend\">Ajouter un contact</string>\n\t<string name=\"Menu_addClipboard\">Ajouter %s</string>\n\t<string name=\"Menu_ShowOff\">Montrer les contacts hors ligne</string>\n\t<string name=\"Menu_HideOff\">Cacher les contacts hors ligne</string>\n\t<string name=\"Menu_AccSettings\">Modifier le compte</string>\n\t<string name=\"Menu_Settings\">Préférences</string>\n\t<string name=\"Menu_Status\">État</string>\n\t<string name=\"Menu_connect\">Se connecter</string>\n\t<string name=\"Menu_disconnect\">Se déconnecter</string>\n\t<string name=\"Menu_about\">À propos de yaxim</string>\n\t<string name=\"Menu_about_bruno\">À propos de Bruno</string>\n\t<string name=\"Menu_muc\">Ajouter / parcourir…</string>\n\t<string name=\"Menu_matrix\">Entrer dans Matrix…</string>\n\t<string name=\"Menu_mark_all_as_read\">Tout marquer comme lu</string>\n\t<string name=\"Menu_send_invitation\">Créer une invitation</string>\n    <string name=\"Menu_userlist\">Participants</string>\n\n\n\t<!-- AddFriend -->\n\t<string name=\"addFriend_Title\">Ajouter un contact</string>\n\t<string name=\"addFriend_Summ\">Merci d’entrer l’identifiant Jabber de votre ami, son pseudonyme ainsi que son groupe !</string>\n\t<string name=\"addFriend_aliasHint\">Pseudonyme</string>\n\t<string name=\"addrosteritemaddgroupchoice\">Ajouter à un nouveau groupe</string>\n\t<string name=\"NewGroup_EditTextField_Hint\">Nom du nouveau groupe</string>\n\n\t<!-- Roster CONTEXTMENU -->\n\t<string name=\"roster_contextmenu_group_rename\">Renommer le groupe</string>\n\t<string name=\"roster_contextmenu_contact_mark_as_read\">Marquer comme lu</string>\n\t<string name=\"roster_contextmenu_contact_delete\">Supprimer le contact</string>\n\t<string name=\"roster_contextmenu_contact_delmsg\">Effacer l’historique de conversation</string>\n\t<string name=\"roster_contextmenu_contact_rename\">Renommer</string>\n\t<string name=\"roster_contextmenu_contact_request_auth\">Demander l’autorisation</string>\n\t<string name=\"roster_contextmenu_contact_change_group\">Changer le groupe</string>\n\t<string name=\"roster_contextmenu_contact_share\">Partager l’adresse</string>\n\t<string name=\"roster_contextmenu_contact_ringtone\">Sonnerie</string>\n\t<string name=\"roster_contextmenu_muc_edit\">Éditer le salon</string>\n\t<string name=\"roster_contextmenu_muc_leave\">Quitter le salon</string>\n\t<string name=\"muc_leave_question\">Voulez-vous vraiment quitter %s ?</string>\n\n\t<!-- Accountprefs -->\n\t<string name=\"account_settings_login\">Information de connexion</string>\n\t<string name=\"account_settings_title\">Paramètres du compte</string>\n\t<string name=\"account_options_title\">Options de connexion</string>\n\t<string name=\"account_options_advanced\">Options avancées</string>\n\t<string name=\"carbons_title\">Message Carbons (XEP-0280)</string>\n\t<string name=\"carbons_summ\">Demander une copie des messages reçus et envoyés par vos autres clients</string>\n\t<string name=\"account_jabberID_title\">Identifiant Jabber</string>\n\t<string name=\"account_jabberID_sum\">exemple : moi@jabber.example.com</string>\n\t<string name=\"account_jabberID_dialog_title\">Veuillez entrer votre identifiant Jabber :</string>\n\t<string name=\"account_jabberPW_title\">Mot de passe du compte</string>\n\t<string name=\"account_jabberPW_sum\">Le mot de passe de votre compte Jabber</string>\n\t<string name=\"account_jabberPW_change_on_server\">Modifier le mot de passe sur le serveur</string>\n\t<string name=\"account_jabberPW_password_old\">Ancien mot de passe :</string>\n\t<string name=\"account_jabberPW_password_new\">Nouveau mot de passe :</string>\n\t<string name=\"account_jabberPW_warning\">Attention ! Pour que votre prochaine tentative de connexion n’échoue pas, vous devez également modifier le mot de passe enregistré sur le serveur !</string>\n\t<string name=\"account_jabberPW_progress\">Veuillez patienter, modification du mot de passe…</string>\n\t<string name=\"account_jabberPW_finished\">Mot de passe modifié avec succès.</string>\n\t<string name=\"account_jabberPW_error\">Erreur lors de la modification du mot de passe : %s</string>\n\t<string name=\"account_nickname_title\">Nom affiché</string>\n\t<string name=\"account_nickname_summ\">Pseudo qui sera affiché aux autres utilisateurs</string>\n\t\n\t<!-- accountprefs -->\n\t<string name=\"account_resource_title\">Ressource client</string>\n\t<string name=\"account_resource_summ\">Par défaut : yaxim</string>\n\t<string name=\"account_resource_dialog_title\">Entrez votre ressource :</string>\n\t<string name=\"account_resource_hint\">yaxim</string>\n\t<string name=\"account_prio_title\">Priorité du client</string>\n\t<string name=\"account_prio_summ\">Par défaut : 0 (de -128 à 127)</string>\n\t<string name=\"account_prio_error\">Valeurs autorisées : -128 à 127</string>\n\t<string name=\"account_prio_dialog_title\">Entrez votre priorité :</string>\n\t<string name=\"account_port_title\">Port du serveur</string>\n\t<string name=\"account_port_sum\">Par défaut : 5222</string>\n\t<string name=\"account_port_dialog_title\">Entrez le port du serveur :</string>\n\t<string name=\"account_port_hint\">5222</string>\n\t<string name=\"account_customserver_title\">Serveur personnalisé</string>\n\t<string name=\"account_customserver_summ\">(Optionnel) domaine alternatif du serveur</string>\n\t<string name=\"account_customserver_dialog_title\">Entrez le nom de domaine du serveur :</string>\n\t<string name=\"account_customserver_hint\">hote.example.com</string>\n\t<string name=\"require_ssl_title\">Force TLS/SSL</string>\n\t<string name=\"require_ssl_summ\">Toujours chiffrer la connexion au serveur</string>\n\n\t<!--StatusPopUp-->\n\t<string name=\"AddContact_SpinnerPrompt\">Choisir un groupe</string>\n\t<string name=\"setStatusmsgHint\">Votre message d’état</string>\n\t<string name=\"setStatusTitle\">Définir votre état</string>\n\t<string name=\"RenameGroup_summ\">Renommer le groupe %s en :</string>\n\t<string name=\"RenameGroup_title\">Renommer le groupe</string>\n\t<string name=\"RenameEntry_summ\">Renommer %1$s (%2$s) en :</string>\n\t<string name=\"RenameEntry_title\">Renommer le contact</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_summ\">Selectionner un groupe ci-dessous</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_title\">Changer le groupe</string>\n\t<string name=\"deleteRosterItem_text\">Voulez-vous vraiment supprimer %1$s (%2$s) ?</string>\n\t<string name=\"deleteRosterItem_title\">Supprimer le contact</string>\n\t<string name=\"deleteChatHistory_text\">Voulez-vous vraiment effacer tous les messages avec %1$s (%2$s) ?</string>\n\t<string name=\"deleteChatHistory_title\">Effacer l’historique de conversation</string>\n\t<string name=\"subscriptionRequest_text\">%1$s voudrait vous ajouter en tant que contact : « %2$s »</string>\n\t<string name=\"subscriptionRequest_title\">Demande d’ajout de contact</string>\n\t<string name=\"subscription_accept\">Accepter</string>\n\t<string name=\"subscription_reject\">Refuser</string>\n\t<string name=\"subscription_reject_all\">Tout refuser</string>\n\t<string name=\"subscription_status_from\">peut voir votre statut</string>\n\n\t<!-- CHATWINDOW -->\n\t<string name=\"chat_from_me\">Moi :</string>\n\t<string name=\"toast_stored_offline\">Le message a été stocké pour envoi futur.</string>\n\t<string name=\"chat_enterMsgHint\">Entrez un message</string> \n\n\t<!-- Message context menu; use the verb form (to quote) -->\n\t<string name=\"chatmenu_quote\">Citer</string>\n\t<!-- Message context menu: repeat the same message -->\n\t<string name=\"chatmenu_resend\">Éditer le message</string>\n\n\t<!-- GPS settings -->\n\t<!--\n\t<string name=\"showGPS_title\">GPS to status</string>\n\t<string name=\"showGPS_summ_on\">GPS is send to StatusMessage</string>\n\t<string name=\"showGPS_summ_off\">GPS is send to StatusMessage</string>\n\t-->\n\n\t<!-- About Dialog -->\n\t<string name=\"AboutDialog_title\">À propos de yaxim</string>\n\t<string name=\"AboutDialog_DevelopersTitle\">Développeurs</string>\n\t<!-- Contact the developer button -->\n\t<string name=\"AboutDialog_DevelopersText\">Nous contacter</string>\n\t<string name=\"AboutDialog_LicenceTitle\">Licence</string>\n\t<string name=\"AboutDialog_Vote\">Évaluer cette application</string>\n\t<string name=\"AboutDialog_LicenceText\">Ce programme est un logiciel libre : vous pouvez le redistribuez et/ou le modifier sous les termes de la version 2 de la licence GNU General Public License tel que publiée par la Free Software Foundation. Lien : http://www.gnu.org/licenses/gpl-2.0.html\\n \\n Une partie de ce logiciel est fourni sous la licence MIT :\\n \\n Copyright © 2009 Mads Kristiansen, Nullwire ApS\\n \\nis hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: \\n The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. \\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</string>\n\n\t<string name=\"status_available\">En ligne</string>\n\t<string name=\"status_away\">Absent(e)</string>\n\t<string name=\"status_chat\">Disponible pour discuter</string>\n\t<string name=\"status_dnd\">Ne pas déranger</string>\n\t<string name=\"status_xa\">Indisponible</string>\n\t<string name=\"status_offline\">Hors ligne</string>\n\n\t<string name=\"translator_credits\">Launchpad Contributions:\n  Cedric Heintz https://launchpad.net/~ced117\n  Emmanuel Gil Peyrot https://launchpad.net/~linkmauve\n  Gabriel U. https://launchpad.net/~gabriel-ull\n  Georg Lukas https://launchpad.net/~ge0rg\n  Mathias Hablützel https://launchpad.net/~mathias-habluetzel\n  Matthieu Baerts https://launchpad.net/~matttbe\n  Michael Scherer https://launchpad.net/~misc-zarb\n  Nÿco https://launchpad.net/~nicolas-verite\n  Valentin Lorentz https://launchpad.net/~progval\n  louiz’ https://launchpad.net/~louizatakk\n  sebseb01 https://launchpad.net/~sebseb01</string>\n\n\t<!-- default roster group with no name -->\n\t<string name=\"default_group\">Général</string>\n\t<string name=\"all_contacts_group\">Tous les contacts</string>\n\t<string name=\"muc_group\">Salons de discussion</string>\n\n\t<!-- SEND listener popup -->\n\t<string name=\"chooseContact\">Choisissez un contact</string>\n\t<string name=\"action_settings\">Préférences</string>\n\n\t<!-- MUC strings -->\n\t<string name=\"muc_jid_hint\">Identifiant Jabber du salon</string>\n\t<string name=\"muc_nickname_hint\">Pseudo</string>\n\t<string name=\"muc_password_hint\">Mot de passe (facultatif)</string>\n\t<string name=\"title_activity_muc_invite\">Invitation à un salon</string>\n\t<!-- Groupchat invitation: \"Invitation from {contact name}\" -->\n\t<string name=\"muc_invitation_from\">Invitation de %s</string>\n\t<!-- Groupchat info: {description} ({number} participants) -->\n\t<string name=\"muc_invitation_occupants\">%1$s (%2$d participants)</string>\n\t<!-- Notification button: \"Join as {default nickname}\" (make SHORT string) -->\n\t<string name=\"muc_invitation_join\">Rejoindre en tant que %s</string>\n\t<string name=\"muc_synchronizing\">Synchronisation en cours…</string>\n\t<!-- Title of user list, contains JID -->\n\t<string name=\"chat_muc_userlist\">Participants au salon (%s)</string>\n\t<!-- Kicked from groupchat: \"Kicked: {reason} -->\n\t<string name=\"muc_kicked\">Éjecté : %s</string>\n\t<!-- Kicked from groupchat: \"Kicked by {admin name}: {reason} -->\n\t<string name=\"muc_kicked_by\">Éjecté par %1$s : %2$s</string>\n\t<!-- Banned from groupchat: \"Banned: {reason} -->\n\t<string name=\"muc_banned\">Banni : %s</string>\n\t<!-- Banned from groupchat: \"Banned by {admin name}: {reason} -->\n\t<string name=\"muc_banned_by\">Banni par %1$s : %2$s</string>\n\n\t<!-- File upload -->\n\t<string name=\"roster_contextmenu_send\">Envoyer…</string>\n\t<string name=\"roster_contextmenu_take_image\">Prendre une photo</string>\n\t<string name=\"roster_contextmenu_send_image\">Sélectionner une photo</string>\n\t<string name=\"roster_contextmenu_send_file\">Envoyer un fichier</string>\n\t<string name=\"upload_compress\">Compression de la photo…</string>\n\t<string name=\"upload_uploading\">Envoi en cours…</string>\n\t<string name=\"upload_too_large\">Fichier trop gros !</string>\n\t<string name=\"storage_permission\">%s a besoin d’un accès au stockage pour envoyer des fichiers !</string>\n\t<string name=\"notification_permission_denied\">Notifications are disabled in the Android app preferences.</string>\n\n\t<!-- Search -->\n\t<string name=\"search_msg_hint\">Contenu du message</string>\n\n\t<!-- MUC bookmarks -->\n\t<string name=\"group_bookmarks\">Mes salons</string>\n\t<string name=\"group_mucsearch\">Salons publics</string>\n\t<!-- Service Discovery -->\n\t<string name=\"title_service_disco\">Navigateur : %s</string>\n\n\t<!-- Android 9 notification preferences: permanent notification -->\n\t<string name=\"notification_status\">Service au premier plan</string>\n\t<!-- Android 9 notification preferences: message notifications -->\n\t<string name=\"notification_msg\">Messages</string>\n\n</resources>\n"
  },
  {
    "path": "res/values-he/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"app_name\">yaxim</string>\n\t<string name=\"app_name_bruno\">ברונו</string>\n\n\t<!-- Connection state -->\n\t<string name=\"conn_title\">yaxim: %s</string>\n\t<string name=\"conn_title_bruno\">ברונו: %s</string>\n\t<string name=\"conn_connecting\">מתחבר לשרת…</string>\n\t<string name=\"conn_disconnecting\">מתנתק…</string>\n\t<string name=\"conn_online\">מקוון</string>\n\t<string name=\"conn_offline\">לא מקוון</string>\n\t<string name=\"conn_empty_roster\">אין אנשי קשר להצגה!</string>\n\t<string name=\"conn_empty_roster_hints\">ישנן דרכים רבות להוסיף אנשי קשר:\\n\\n - ‏Android Beam™: נגיעה בטלפון של חבר\\n\\n - סריקת קודQR\\n\\n - \\\"צור הזמנה\\\" ואז לשתף אותה (דוא״ל, SMS, קוד QR, …)\\n\\n - \\\"הוסף איש קשר\\\" אם יש לך את המזהה JID</string>\n\t<string name=\"conn_reconnect\">ניסיון חיבור נוסף תוך %d שניות.</string>\n\t<string name=\"conn_disconnected\">החיבור נסגר</string>\n\t<string name=\"conn_no_network\">אין חיבור רשת</string>\n\t<string name=\"conn_ping_timeout\">אין תגובה</string>\n\t<string name=\"conn_error\">שגיאה: %s</string>\n\n\t<!-- Global Strings -->\n\t<string name=\"Global_Exit\">יציאה</string>\n\t<string name=\"Global_authenticate_first\">נא להתחבר תחילה</string>\n\t<string name=\"Global_JID_hint\">user@yax.im</string>\n\t<!-- tooltip message when the user entered an invalid XMPP address -->\n\t<string name=\"Global_JID_malformed\">בדוק צורת כתובת!</string>\n\n\t<!-- FirstStartUpDialog -->\n\t<string name=\"StartupDialog_Title\">ברוך בואך אל yaxim!</string>\n\t<string name=\"StartupDialog_Summary\">עליך להגדיר את yaxim טרם תעמוד לך האפשרות להפיק ממנה תועלת. נא להזין מזהה Jabber וסיסמה.</string>\n\t<string name=\"StartupDialog_pwHint\">הזן סיסמה</string>\n\t<string name=\"StartupDialog_pwshowHint\">הצג סיסמה</string>\n\t<string name=\"StartupDialog_Username_title\">מזהה Jabber:</string>\n\t<string name=\"StartupDialog_passwd_title\">סיסמה:</string>\n\t<string name=\"StartupDialog_advanced\">מתקדם…</string>\n\t<string name=\"StartupDialog_create_new\">צור חשבון חדש</string>\n\t<string name=\"StartupDialog_error_password\">הסיסמה קצרה מדי!</string>\n\t<string name=\"StartupDialog_created_password\">נוצרה סיסמה מאובטחת</string>\n\t<string name=\"StartupDialog_auth_failed\">נא לבדוק שם משתמש וסיסמה!</string>\n\t<string name=\"StartupDialog_server_failed\">לא ניתן להתחבר אל %s!</string>\n\t<string name=\"StartupDialog_no_registration\">השרת לא מאפשר הרשמה!</string>\n\n\t<string name=\"StartupDialog_invitation\">הוזמת לרשת Jabber. נא להשלים את הרשמתך למערכת.</string>\n\t<string name=\"StartupDialog_no_more_accounts\">אין חשבונות נוספים נתמכים!</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_message\">הודעה מאת %s</string>\n\t<string name=\"notification_anonymous_message\">הודעה התקבלה</string>\n\t<!--  Group Chat notification, %1$s is the user name, %2$s is the room, e.g. \"{Ge0rG} in {yaxim Chat}\" -->\n\t<string name=\"notification_muc_message\">%1$s בחדר %2$s</string>\n\t<!--  Group Group Chat private message notification, %1$s is the user name, %2$s is the room, e.g. \"Message from {Ge0rG} in {yaxim Chat}\" -->\n\t<!--string name=\"notification_muc_pm\">Message from %1$s in %2$s</string-->\n\t<!-- notification button: direct reply (make SHORT string) -->\n\t<string name=\"notification_reply\">השב</string>\n\t<!-- notification button: mark as read (make SHORT string) -->\n\t<string name=\"notification_mark_read\">סמן כנקרא</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_error\">שגיאה במהלך שליחת הודעה!</string>\n\n\t<!-- Notification Settings -->\n\t<string name=\"preftitle_notify\">הגדרות התראה</string>\n\t<string name=\"preftitle_notify_msg\">התראת הודעה</string>\n\t<string name=\"preftitle_notify_muc\">התראת צ׳אט קבוצה</string>\n\t<string name=\"notification_custom\">צלצול מותאם</string>\n\t<string name=\"muc_highlight_title\">שלח התראה איזכור בלבד</string>\n\t<string name=\"muc_highlight_sum\">התראה כאשר הכינוי שלך מאוזכר בחדר</string>\n\t<string name=\"led_title\">‏LED מהבהב</string>\n\t<string name=\"led_summ\">הבהב LED טלפון בהודעות נכנסות</string>\n\t<string name=\"vibr_title\">רטט</string>\n\t<string name=\"vibr_summ\">הרטט בהודעות נכנסות</string>\n\t<string-array name=\"vibr_values_displayed\">\n\t\t<item>אף פעם</item>\n\t\t<item>העדפת מערכת</item>\n\t\t<item>תמיד</item>\n\t</string-array>\n\t<string name=\"ringtone_title\">צלצול</string>\n\t<string name=\"ringtone_summ\">צליל להודעות נכנסות</string>\n\t<string name=\"ticker_title\">תצוגה מקדימה של הודעה</string>\n\t<string name=\"ticker_summ\">הצג שולח והודעה בתוך שורת מצב</string>\n\n\t<!-- Startup Setting Strings -->\n\t<string name=\"preftitle_general\">הגדרות כלליות</string>\n\t<string name=\"pref_dnd_when_silent\">\\\"אין להפריע\\\" במצב שקט</string>\n\t<string name=\"pref_dnd_when_silent_summ\">הגדר את המצב המקוון שלך למצב \\\"DND\\\" כאשר הטלפון שלך במצב שקט</string>\n\t<string name=\"statuspopup_name\">קבע את המצב שלך</string>\n\t<string name=\"showOffline_summ\">הצג תמיד את כל אנשי הקשר ברשימה</string>\n\t<string name=\"showOffline_title\">הצג אנשי קשר לא מקוונים</string>\n\t<string name=\"enableGroups_summ\">ארגן אנשי קשר לפי הקבוצות שלהם</string>\n\t<string name=\"enableGroups_title\">הצג קבוצות איש קשר</string>\n\t<string name=\"foregroundService_summ\">שמור את האפליקציה בזיכרון כדי להבטיח פעילות תמידית של חיבור (שירות foreground)</string>\n\t<string name=\"foregroundService_title\">סמל שורת מצב</string>\n\n\t<string name=\"preftitle_debug\">Debugging</string>\n\t<string name=\"smackdebug_summ\">פלט חבילת מידע ודיבאג מבעד logcat (יכול להכיל מידע אישי)</string>\n\t<string name=\"smackdebug_title\">SMACK דיבאג</string>\n\n\t<string name=\"reportcrash_title\">שלח דיווחי קריסה</string>\n\t<string name=\"reportcrash_summ\">שלח דיווחי קריסה אלמוניים למפתח</string>\n\n\t<!-- Appearence Strings -->\n\t<string name=\"preftitle_app\">מראה תצוגה</string>\n\t<string name=\"FontChat_title\">גודל גופן צ׳אט</string>\n\t<string name=\"FontChat_summ\">הגדר גודל גופן צ׳אט</string>\n\t<string name=\"FontChat_dialog\">גודל גופן צ׳אט</string>\n\t<!--\n\t<string name=\"FontRost_title\">Roster font size</string>\n\t<string name=\"FontRost_summ\">Set roster font size</string>\n\t<string name=\"FontRost_dialog\">Roster font fize</string>\n\t<string name=\"setFontRoster\">Set roster font size</string>\n\t-->\n\t<string name=\"pref_theme\">ערכת נושא</string>\n\t<string name=\"pref_theme_dark\">כהה</string>\n\t<string name=\"pref_theme_light\">בהיר</string>\n\t<string name=\"pref_theme_pine\">אורן</string>\n\t<string name=\"pref_theme_ice\">קרח</string>\n\t<string name=\"preftitle_ui\">מראה תצוגה</string>\n\t<string-array name=\"fontSizesChat\">\n\t\t<item>קטן</item>\n\t\t<item>רגיל</item>\n\t\t<item>גדול</item>\n\t\t<item>ענק</item>\n\t</string-array>\n\n\t<!-- Mainmenu \t-->\n\t<string name=\"Menu_addFriend\">הוסף איש קשר</string>\n\t<string name=\"Menu_addClipboard\">הוסף %s</string>\n\t<string name=\"Menu_ShowOff\">הצג לא מקוונים</string>\n\t<string name=\"Menu_HideOff\">הסתר לא מקוונים</string>\n\t<string name=\"Menu_AccSettings\">ערוך חשבון</string>\n\t<string name=\"Menu_Settings\">הגדרות</string>\n\t<string name=\"Menu_Status\">מצב</string>\n\t<string name=\"Menu_connect\">התחבר</string>\n\t<string name=\"Menu_disconnect\">התנתק</string>\n\t<string name=\"Menu_about\">אודות yaxim</string>\n\t<string name=\"Menu_about_bruno\">אודות ברונו</string>\n\t<string name=\"Menu_muc\">הוסף / סייר…</string>\n\t<string name=\"Menu_matrix\">כניסה למטריקס…</string>\n\t<string name=\"Menu_mark_all_as_read\">סמן הכל כנקרא</string>\n\t<string name=\"Menu_send_invitation\">צור הזמנה</string>\n    <string name=\"Menu_userlist\">משתתפים</string>\n\n\n\t<!-- AddFriend -->\n\t<string name=\"addFriend_Title\">הוסף איש קשר</string>\n\t<string name=\"addFriend_Summ\">נא להזין מזהה Jabber של האיש קשר, שם לתצוגה וגם קבוצת קשר!</string>\n\t<string name=\"addFriend_aliasHint\">שם תצוגה</string>\n\t<string name=\"addrosteritemaddgroupchoice\">הוסף לקבוצה חדשה</string>\n\t<string name=\"NewGroup_EditTextField_Hint\">שם לקבוצה החדשה</string>\n\n\t<!-- Roster CONTEXTMENU -->\n\t<string name=\"roster_contextmenu_group_rename\">שנה שם קבוצה</string>\n\t<string name=\"roster_contextmenu_contact_mark_as_read\">סמן בתור נקרא</string>\n\t<string name=\"roster_contextmenu_contact_delete\">מחק איש קשר</string>\n\t<string name=\"roster_contextmenu_contact_delmsg\">מחק היסטוריית צ׳אט</string>\n\t<string name=\"roster_contextmenu_contact_rename\">שנה שם</string>\n\t<string name=\"roster_contextmenu_contact_request_auth\">בקש הרשאה</string>\n\t<string name=\"roster_contextmenu_contact_change_group\">שנה קבוצה</string>\n\t<string name=\"roster_contextmenu_contact_share\">שתף כתובת</string>\n\t<string name=\"roster_contextmenu_contact_ringtone\">צלצול</string>\n\t<string name=\"roster_contextmenu_muc_edit\">ערוך צ׳אט קבוצה</string>\n\t<string name=\"roster_contextmenu_muc_leave\">עזוב צ׳אט קבוצה</string>\n\t<string name=\"muc_leave_question\">האם ברצונך לעזוב את %s?</string>\n\n\t<!-- Accountprefs -->\n\t<string name=\"account_settings_login\">מידע התחברות</string>\n\t<string name=\"account_settings_title\">הגדרות חשבון</string>\n\t<string name=\"account_options_title\">אפשרויות חיבור</string>\n\t<string name=\"account_options_advanced\">אפשרויות מתקדמות</string>\n\t<string name=\"carbons_title\">הודעות העתק (XEP-0280)</string>\n\t<string name=\"carbons_summ\">בקש העתקים של הודעות מלקוח(ות) אחר(ים) שלך</string>\n\t<string name=\"account_jabberID_title\">מזהה Jabber</string>\n\t<string name=\"account_jabberID_sum\">דוגמא: me@jabber.example.com</string>\n\t<string name=\"account_jabberID_dialog_title\">הזן מזהה Jabber שלך:</string>\n\t<string name=\"account_jabberPW_title\">סיסמת חשבון</string>\n\t<string name=\"account_jabberPW_sum\">סיסמת חשבון Jabber שלך</string>\n\t<string name=\"account_jabberPW_change_on_server\">שנה סיסמה על השרת</string>\n\t<string name=\"account_jabberPW_password_old\">סיסמה ישנה:</string>\n\t<string name=\"account_jabberPW_password_new\">סיסמה חדשה:</string>\n\t<string name=\"account_jabberPW_warning\">אזהרה! לכניסה מוצלחת עליך גם לקבוע את אותה הסיסמה על השרת!</string>\n\t<string name=\"account_jabberPW_progress\">נא להמתין, משנה סיסמה…</string>\n\t<string name=\"account_jabberPW_finished\">סיסמה שונתה בהצלחה.</string>\n\t<string name=\"account_jabberPW_error\">שגיאה בשינוי סיסמה: %s</string>\n\t<string name=\"account_nickname_title\">שם תצוגה</string>\n\t<string name=\"account_nickname_summ\">הכינוי שלך שמוצג למשתמשים אחרים</string>\n\t\n\t<!-- accountprefs -->\n\t<string name=\"account_resource_title\">משאב לקוח</string>\n\t<string name=\"account_resource_summ\">ברירת מחדל: yaxim</string>\n\t<string name=\"account_resource_dialog_title\">הזן משאב:</string>\n\t<string name=\"account_resource_hint\">yaxim</string>\n\t<string name=\"account_prio_title\">עדיפות לקוח</string>\n\t<string name=\"account_prio_summ\">ברירת מחדל: 0 (מותרים: -128 .. 127)</string>\n\t<string name=\"account_prio_error\">ערכים מותרים: -128 .. 127</string>\n\t<string name=\"account_prio_dialog_title\">הזן עדיפות:</string>\n\t<string name=\"account_port_title\">פורט שרת</string>\n\t<string name=\"account_port_sum\">ברירת מחדל: 5222</string>\n\t<string name=\"account_port_dialog_title\">הזן פורט שרת:</string>\n\t<string name=\"account_port_hint\">5222</string>\n\t<string name=\"account_customserver_title\">שרת מותאם אישית</string>\n\t<string name=\"account_customserver_summ\">(רשות) שם מארח חלופי של שרת</string>\n\t<string name=\"account_customserver_dialog_title\">הזן שם מארח שרת:</string>\n\t<string name=\"account_customserver_hint\">host.example.com</string>\n\t<string name=\"require_ssl_title\">מצריך SSL/TLS</string>\n\t<string name=\"require_ssl_summ\">הצפן תמיד חיבור שרת</string>\n\n\t<!--StatusPopUp-->\n\t<string name=\"AddContact_SpinnerPrompt\">בחר קבוצה</string>\n\t<string name=\"setStatusmsgHint\">הודעת מצב</string>\n\t<string name=\"setStatusTitle\">קבע את המצב שלך</string>\n\t<string name=\"RenameGroup_summ\">שנה שם קבוצה %s לשם:</string>\n\t<string name=\"RenameGroup_title\">שנה שם קבוצה</string>\n\t<string name=\"RenameEntry_summ\">שנה שם %1$s (%2$s) לשם:</string>\n\t<string name=\"RenameEntry_title\">שנה שם איש קשר</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_summ\">בחר קבוצה מתוך הספינר להלן</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_title\">שנה קבוצה</string>\n\t<string name=\"deleteRosterItem_text\">האם ברצונך להסיר את %1$s ‏(%2$s)?</string>\n\t<string name=\"deleteRosterItem_title\">מחק איש קשר</string>\n\t<string name=\"deleteChatHistory_text\">האם ברצונך להסיר את כל ההודעות עם %1$s ‏(%2$s)?</string>\n\t<string name=\"deleteChatHistory_title\">מחק היסטוריית שיחה</string>\n\t<string name=\"subscriptionRequest_text\">%1$s רוצה להוסיף אותך בתור איש קשר: \\\"%2$s\\\"</string>\n\t<string name=\"subscriptionRequest_title\">בקשת הרשמה</string>\n\t<string name=\"subscription_accept\">אשר</string>\n\t<string name=\"subscription_reject\">סרב</string>\n\t<string name=\"subscription_reject_all\">דחה את הכל</string>\n\t<string name=\"subscription_status_from\">יכול/ה לראות את הסטטוס שלך</string>\n\n\t<!-- CHATWINDOW -->\n\t<string name=\"chat_from_me\">אני:</string>\n\t<string name=\"toast_stored_offline\">ההודעה אוחסנה לשידור עתידי.</string>\n\t<string name=\"chat_enterMsgHint\">הזן הודעה</string> \n\n\t<!-- Message context menu; use the verb form (to quote) -->\n\t<string name=\"chatmenu_quote\">צטט</string>\n\t<!-- Message context menu: repeat the same message -->\n\t<string name=\"chatmenu_resend\">ערוך הודעה</string>\n\n\t<!-- GPS settings -->\n\t<!--\n\t<string name=\"showGPS_title\">GPS to status</string>\n\t<string name=\"showGPS_summ_on\">GPS is send to StatusMessage</string>\n\t<string name=\"showGPS_summ_off\">GPS is send to StatusMessage</string>\n\t-->\n\n\t<!-- About Dialog -->\n\t<string name=\"AboutDialog_title\">אודות yaxim</string>\n\t<string name=\"AboutDialog_DevelopersTitle\">מפתחים</string>\n\t<!-- Contact the developer button -->\n\t<string name=\"AboutDialog_DevelopersText\">צור קשר</string>\n\t<string name=\"AboutDialog_LicenceTitle\">רישוי</string>\n\t<string name=\"AboutDialog_Vote\">דרגו את האפליקציה</string>\n\t<string name=\"AboutDialog_LicenceText\">תוכנית זו הינה תכנה חופשית; זכותכם להפיצה ו/או לשנותה בכפוף לתנאי הרשיון GNU General Public License גרסא 2 כפי שזה פורסם על ידי Free Software Foundation. קישור: http://www.gnu.org/licenses/gpl-2.0.html\\n \\n חלקים של תוכנה זו מסופקים תחת הרשיון MIT:\\n \\n זכויות יוצרים © 2009 Mads Kristiansen, Nullwire ApS\\n \\n רשות מוענקת בזאת, חינם אין כסף, לכל אדם אשר משיג עותק של תכנה זו וגם קבצי תיעוד מסונפים (\"התכנה\"), להתעסק בתכנה ללא הגבלה, לרבות ללא הגבלת הזכויות להשתמש, להעתיק, לשנות, למזג, לפרסם, להפיץ, להעניק רשיונות נגזרים, ו/או למכור עותקים של התכנה, וגם להתיר לאנשים אשר להם התוכנה מסופקת לעשות כן, כפופים ומוכנעים לתנאים שלהלן: \\n הודעת זכויות יוצרים לעיל וכן הודעת היתר זו יוכללו בכל העותקים או בחלקים מהותיים של התכנה. \\n התכנה הינה מסופקת \"AS IS\" (כמות שהיא), ללא כתב אחריות מכל סוג שהוא, בין אם באופן מפורש או בין אם באופן מרומז, כולל אך לא מוגבלת לחבויות של סחירות, התאמה לתכלית מסוימת ובלתי מפרה. בשום מקרה המחברים או המחזיקים בזכויות יוצרים לא יישאו באחריות עבור כל תובענה, נזקים או חבות אחרת, בין אם בתוך פעולה של הסכם, עוולה או אחרת, אשר עולה מן, מתוך או בנוגע לתכנה או לשימוש או דין ודברים אחרים בתכנה.</string>\n\n\t<string name=\"status_available\">מקוון</string>\n\t<string name=\"status_away\">נעדר</string>\n\t<string name=\"status_chat\">חופשי לשיחה</string>\n\t<string name=\"status_dnd\">לא להפריע</string>\n\t<string name=\"status_xa\">לא זמין</string>\n\t<string name=\"status_offline\">לא מקוון</string>\n\n\t<string name=\"translator_credits\">Launchpad Contributions:\n  GenghisKhan https://launchpad.net/~genghiskhan</string>\n\n\t<!-- default roster group with no name -->\n\t<string name=\"default_group\">כללית</string>\n\t<string name=\"all_contacts_group\">כל אנשי הקשר</string>\n\t<string name=\"muc_group\">קבוצות צ׳אט</string>\n\n\t<!-- SEND listener popup -->\n\t<string name=\"chooseContact\">בחר איש קשר</string>\n\t<string name=\"action_settings\">הגדרות</string>\n\n\t<!-- MUC strings -->\n\t<string name=\"muc_jid_hint\">‏JID צ׳אט קבוצה</string>\n\t<string name=\"muc_nickname_hint\">שם כינוי</string>\n\t<string name=\"muc_password_hint\">סיסמה (רשות)</string>\n\t<string name=\"title_activity_muc_invite\">הזמנת צ׳אט קבוצה</string>\n\t<!-- Groupchat invitation: \"Invitation from {contact name}\" -->\n\t<string name=\"muc_invitation_from\">הזמנה מאת %s</string>\n\t<!-- Groupchat info: {description} ({number} participants) -->\n\t<string name=\"muc_invitation_occupants\">‏%1$s ‏(%2$d משתתפים)</string>\n\t<!-- Notification button: \"Join as {default nickname}\" (make SHORT string) -->\n\t<string name=\"muc_invitation_join\">הצטרף בתור %s</string>\n\t<string name=\"muc_synchronizing\">מסנכרן…</string>\n\t<!-- Title of user list, contains JID -->\n\t<string name=\"chat_muc_userlist\">משתתפי צ׳אט קבוצה (%s)</string>\n\t<!-- Kicked from groupchat: \"Kicked: {reason} -->\n\t<string name=\"muc_kicked\">נבעט: %s</string>\n\t<!-- Kicked from groupchat: \"Kicked by {admin name}: {reason} -->\n\t<string name=\"muc_kicked_by\">נבעט ע״י %1$s: ‏%2$s</string>\n\t<!-- Banned from groupchat: \"Banned: {reason} -->\n\t<string name=\"muc_banned\">נאסר: %s</string>\n\t<!-- Banned from groupchat: \"Banned by {admin name}: {reason} -->\n\t<string name=\"muc_banned_by\">נאסר ע״י %1$s: ‏%2$s</string>\n\n\t<!-- File upload -->\n\t<string name=\"roster_contextmenu_send\">שלח…</string>\n\t<string name=\"roster_contextmenu_take_image\">צלם תמונה</string>\n\t<string name=\"roster_contextmenu_send_image\">בחר תמונה</string>\n\t<string name=\"roster_contextmenu_send_file\">שלח קובץ</string>\n\t<string name=\"upload_compress\">דוחס תמונה…</string>\n\t<string name=\"upload_uploading\">מעלה…</string>\n\t<string name=\"upload_too_large\">הקובץ גדול מדי!</string>\n\t<string name=\"storage_permission\">‏%s צריך גישת אחסון כדי לשלוח קובץ!</string>\n\t<string name=\"notification_permission_denied\">Notifications are disabled in the Android app preferences.</string>\n\n\t<!-- Search -->\n\t<string name=\"search_msg_hint\">תוכן הודעה</string>\n\n\t<!-- MUC bookmarks -->\n\t<string name=\"group_bookmarks\">הקבוצות צ׳אט שלי</string>\n\t<string name=\"group_mucsearch\">קבוצות צ׳אט ציבוריות</string>\n\t<!-- Service Discovery -->\n\t<string name=\"title_service_disco\">סייר: %s</string>\n\n\t<!-- Android 9 notification preferences: permanent notification -->\n\t<string name=\"notification_status\">שירות Foreground</string>\n\t<!-- Android 9 notification preferences: message notifications -->\n\t<string name=\"notification_msg\">הודעות</string>\n\n</resources>\n"
  },
  {
    "path": "res/values-hi/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"app_name\">याक्सिं</string>\n\t<string name=\"app_name_bruno\">भालू</string>\n\n\t<!-- Connection state -->\n\t<string name=\"conn_title\">याक्सिं: %s</string>\n\t<string name=\"conn_title_bruno\">भालू: %s</string>\n\t<string name=\"conn_connecting\">सर्वर से संपर्क जारी…</string>\n\t<string name=\"conn_disconnecting\">सर्वर से असंबंधन जारी...</string>\n\t<string name=\"conn_online\">उपस्थित</string>\n\t<string name=\"conn_offline\">अनुपस्थित</string>\n\t<string name=\"conn_empty_roster\">कोई संपर्क दिखाने के लिए नहीं है!</string>\n\t<string name=\"conn_empty_roster_hints\">There are many ways to add contacts:\\n\\n\n\t\t- Android Beam™: touch a friend\\'s phone\\n\\n\n\t\t- Scan a QR code\\n\\n\n\t\t- \\\"Create invitation\\\" and share it (e-mail, SMS, QR code, …)\\n\\n\n\t\t- \\\"Add contact\\\" if you know the JID</string>\n\t<string name=\"conn_reconnect\">%d सेकंड में अगले कनेक्शन का प्रयास किया जायेगा</string>\n\t<string name=\"conn_disconnected\">कनेक्शन बन्द</string>\n\t<string name=\"conn_no_network\">कोई भी  नेटवर्क कनेक्शन उपलब्ध नहीं है</string>\n\t<string name=\"conn_ping_timeout\">No response</string>\n\t<string name=\"conn_error\">त्रुटि: %s</string>\n\n\t<!-- Global Strings -->\n\t<string name=\"Global_Exit\">बाहर निकलें</string>\n\t<string name=\"Global_authenticate_first\">कृपया पहले कनेक्ट करें</string>\n\t<string name=\"Global_JID_hint\">user@yax.im</string>\n\t<!-- tooltip message when the user entered an invalid XMPP address -->\n\t<string name=\"Global_JID_malformed\">पता के प्रारूप की जाँच करें!</string>\n\n\t<!-- FirstStartUpDialog -->\n\t<string name=\"StartupDialog_Title\">Welcome to yaxim!</string>\n\t<string name=\"StartupDialog_Summary\">You need to configure yaxim before you can use it. Please enter your Jabber ID and password.</string>\n\t<string name=\"StartupDialog_pwHint\">पासवर्ड डालें</string>\n\t<string name=\"StartupDialog_pwshowHint\">Show password</string>\n\t<string name=\"StartupDialog_Username_title\">जैबर आईडीः</string>\n\t<string name=\"StartupDialog_passwd_title\">पासवर्ड:</string>\n\t<string name=\"StartupDialog_advanced\">Advanced…</string>\n\t<string name=\"StartupDialog_create_new\">Register new account</string>\n\t<string name=\"StartupDialog_error_password\">Password is too short!</string>\n\t<string name=\"StartupDialog_created_password\">सुरक्षित पासवर्ड बनाये</string>\n\t<string name=\"StartupDialog_auth_failed\">अपने यूज़रनेम और पासवर्ड की जांच करें!</string>\n\t<string name=\"StartupDialog_server_failed\">Could not connect to %s!</string>\n\t<string name=\"StartupDialog_no_registration\">Server does not allow registration!</string>\n\n\t<string name=\"StartupDialog_invitation\">You have been invited to Jabber. Please complete your registration.</string>\n\t<string name=\"StartupDialog_no_more_accounts\">No additional account supported!</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_message\">%s से संदेश</string>\n\t<string name=\"notification_anonymous_message\">संदेश प्राप्त हुआ</string>\n\t<!--  Group Chat notification, %1$s is the user name, %2$s is the room, e.g. \"{Ge0rG} in {yaxim Chat}\" -->\n\t<string name=\"notification_muc_message\">%1$s in %2$s</string>\n\t<!--  Group Group Chat private message notification, %1$s is the user name, %2$s is the room, e.g. \"Message from {Ge0rG} in {yaxim Chat}\" -->\n\t<!--string name=\"notification_muc_pm\">Message from %1$s in %2$s</string-->\n\t<!-- notification button: direct reply (make SHORT string) -->\n\t<string name=\"notification_reply\">Reply</string>\n\t<!-- notification button: mark as read (make SHORT string) -->\n\t<string name=\"notification_mark_read\">Mark Read</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_error\">Error while sending message!</string>\n\n\t<!-- Notification Settings -->\n\t<string name=\"preftitle_notify\">Notification Settings</string>\n\t<string name=\"preftitle_notify_msg\">Message Notification</string>\n\t<string name=\"preftitle_notify_muc\">Group Chat Notification</string>\n\t<string name=\"notification_custom\">Custom Ringtone</string>\n\t<string name=\"muc_highlight_title\">Only notify on mention</string>\n\t<string name=\"muc_highlight_sum\">Notify when your nickname is mentioned in a room</string>\n\t<string name=\"led_title\">Blinking LED</string>\n\t<string name=\"led_summ\">Blink phone LED on incoming messages</string>\n\t<string name=\"vibr_title\">Vibration</string>\n\t<string name=\"vibr_summ\">Vibrate on incoming messages</string>\n\t<string-array name=\"vibr_values_displayed\">\n\t\t<item>Never</item>\n\t\t<item>System preference</item>\n\t\t<item>Always</item>\n\t</string-array>\n\t<string name=\"ringtone_title\">Ringtone</string>\n\t<string name=\"ringtone_summ\">Tone for incoming messages</string>\n\t<string name=\"ticker_title\">Message preview</string>\n\t<string name=\"ticker_summ\">Show sender and message in status bar</string>\n\n\t<!-- Startup Setting Strings -->\n\t<string name=\"preftitle_general\">General Settings</string>\n\t<string name=\"pref_dnd_when_silent\">\\\"Do not disturb\\\" in silent mode</string>\n\t<string name=\"pref_dnd_when_silent_summ\">Set your online status to \\\"DND\\\" when your phone is in silent mode</string>\n\t<string name=\"statuspopup_name\">Set your status</string>\n\t<string name=\"showOffline_summ\">Always show all contacts in the roster</string>\n\t<string name=\"showOffline_title\">Show offline contacts</string>\n\t<string name=\"enableGroups_summ\">Arrange your contacts by their groups</string>\n\t<string name=\"enableGroups_title\">Show contact groups</string>\n\t<string name=\"foregroundService_summ\">Keep app in memory to ensure always-on connection (foreground service)</string>\n\t<string name=\"foregroundService_title\">Statusbar icon</string>\n\n\t<string name=\"preftitle_debug\">Debugging</string>\n\t<string name=\"smackdebug_summ\">Packet and debug output via logcat (may contain personal information)</string>\n\t<string name=\"smackdebug_title\">SMACK debugging</string>\n\n\t<string name=\"reportcrash_title\">Send crash reports</string>\n\t<string name=\"reportcrash_summ\">Send anonymous crash reports to developer</string>\n\n\t<!-- Appearence Strings -->\n\t<string name=\"preftitle_app\">Appearance</string>\n\t<string name=\"FontChat_title\">Chat font size</string>\n\t<string name=\"FontChat_summ\">Set chat font size</string>\n\t<string name=\"FontChat_dialog\">Chat font size</string>\n\t<!--\n\t<string name=\"FontRost_title\">Roster font size</string>\n\t<string name=\"FontRost_summ\">Set roster font size</string>\n\t<string name=\"FontRost_dialog\">Roster font fize</string>\n\t<string name=\"setFontRoster\">Set roster font size</string>\n\t-->\n\t<string name=\"pref_theme\">Theme</string>\n\t<string name=\"pref_theme_dark\">Dark</string>\n\t<string name=\"pref_theme_light\">Light</string>\n\t<string name=\"pref_theme_pine\">Pine</string>\n\t<string name=\"pref_theme_ice\">Ice</string>\n\t<string name=\"preftitle_ui\">Appearance</string>\n\t<string-array name=\"fontSizesChat\">\n\t\t<item>small</item>\n\t\t<item>normal</item>\n\t\t<item>large</item>\n\t\t<item>huge</item>\n\t</string-array>\n\n\t<!-- Mainmenu \t-->\n\t<string name=\"Menu_addFriend\">Add contact</string>\n\t<string name=\"Menu_addClipboard\">Add %s</string>\n\t<string name=\"Menu_ShowOff\">Show offline</string>\n\t<string name=\"Menu_HideOff\">Hide offline</string>\n\t<string name=\"Menu_AccSettings\">Edit account</string>\n\t<string name=\"Menu_Settings\">Settings</string>\n\t<string name=\"Menu_Status\">Status</string>\n\t<string name=\"Menu_connect\">Connect</string>\n\t<string name=\"Menu_disconnect\">Disconnect</string>\n\t<string name=\"Menu_about\">About yaxim</string>\n\t<string name=\"Menu_about_bruno\">About Bruno</string>\n\t<string name=\"Menu_muc\">Add / browse…</string>\n\t<string name=\"Menu_matrix\">Enter the Matrix…</string>\n\t<string name=\"Menu_mark_all_as_read\">Mark all as read</string>\n\t<string name=\"Menu_send_invitation\">Create invitation</string>\n    <string name=\"Menu_userlist\">Participants</string>\n\n\n\t<!-- AddFriend -->\n\t<string name=\"addFriend_Title\">Add a Contact</string>\n\t<string name=\"addFriend_Summ\">Please enter the Jabber ID of your friend, the\n\t\tdesired screen name and choose their contact group!</string>\n\t<string name=\"addFriend_aliasHint\">Screen name</string>\n\t<string name=\"addrosteritemaddgroupchoice\">Add to a new group</string>\n\t<string name=\"NewGroup_EditTextField_Hint\">Name for the new group</string>\n\n\t<!-- Roster CONTEXTMENU -->\n\t<string name=\"roster_contextmenu_group_rename\">Rename group</string>\n\t<string name=\"roster_contextmenu_contact_mark_as_read\">Mark as read</string>\n\t<string name=\"roster_contextmenu_contact_delete\">Delete contact</string>\n\t<string name=\"roster_contextmenu_contact_delmsg\">Delete chat history</string>\n\t<string name=\"roster_contextmenu_contact_rename\">Rename</string>\n\t<string name=\"roster_contextmenu_contact_request_auth\">Request authorization</string>\n\t<string name=\"roster_contextmenu_contact_change_group\">Change group</string>\n\t<string name=\"roster_contextmenu_contact_share\">Share address</string>\n\t<string name=\"roster_contextmenu_contact_ringtone\">Ringtone</string>\n\t<string name=\"roster_contextmenu_muc_edit\">Edit group chat</string>\n\t<string name=\"roster_contextmenu_muc_leave\">Leave group chat</string>\n\t<string name=\"muc_leave_question\">Really leave %s?</string>\n\n\t<!-- Accountprefs -->\n\t<string name=\"account_settings_login\">Login Information</string>\n\t<string name=\"account_settings_title\">Account Settings</string>\n\t<string name=\"account_options_title\">Connecting Options</string>\n\t<string name=\"account_options_advanced\">Advanced Options</string>\n\t<string name=\"carbons_title\">Message Carbons (XEP-0280)</string>\n\t<string name=\"carbons_summ\">Request message copies from your other client(s)</string>\n\t<string name=\"account_jabberID_title\">Jabber ID</string>\n\t<string name=\"account_jabberID_sum\">example: me@jabber.example.com</string>\n\t<string name=\"account_jabberID_dialog_title\">Enter your Jabber ID:</string>\n\t<string name=\"account_jabberPW_title\">Account Password</string>\n\t<string name=\"account_jabberPW_sum\">Your Jabber account password</string>\n\t<string name=\"account_jabberPW_change_on_server\">Change password on server</string>\n\t<string name=\"account_jabberPW_password_old\">Old Password:</string>\n\t<string name=\"account_jabberPW_password_new\">New Password:</string>\n\t<string name=\"account_jabberPW_warning\">WARNING! For successful login you must also set the same password on the server!</string>\n\t<string name=\"account_jabberPW_progress\">Please wait, changing password…</string>\n\t<string name=\"account_jabberPW_finished\">Password successfully changed.</string>\n\t<string name=\"account_jabberPW_error\">Error changing password: %s</string>\n\t<string name=\"account_nickname_title\">Display Name</string>\n\t<string name=\"account_nickname_summ\">Your nickname displayed to other users</string>\n\t\n\t<!-- accountprefs -->\n\t<string name=\"account_resource_title\">Client Resource</string>\n\t<string name=\"account_resource_summ\">Default: yaxim</string>\n\t<string name=\"account_resource_dialog_title\">Enter your resource:</string>\n\t<string name=\"account_resource_hint\">याक्सिं</string>\n\t<string name=\"account_prio_title\">Client Priority</string>\n\t<string name=\"account_prio_summ\">Default: 0 (allowed: -128 .. 127)</string>\n\t<string name=\"account_prio_error\">Allowed values: -128 .. 127</string>\n\t<string name=\"account_prio_dialog_title\">Enter your priority:</string>\n\t<string name=\"account_port_title\">Server Port</string>\n\t<string name=\"account_port_sum\">Default: 5222</string>\n\t<string name=\"account_port_dialog_title\">Enter the server port:</string>\n\t<string name=\"account_port_hint\">5222</string>\n\t<string name=\"account_customserver_title\">Custom Server</string>\n\t<string name=\"account_customserver_summ\">(Optional) alternative server hostname</string>\n\t<string name=\"account_customserver_dialog_title\">Enter server hostname:</string>\n\t<string name=\"account_customserver_hint\">host.example.com</string>\n\t<string name=\"require_ssl_title\">Require SSL/TLS</string>\n\t<string name=\"require_ssl_summ\">Always encrypt server connection</string>\n\n\t<!--StatusPopUp-->\n\t<string name=\"AddContact_SpinnerPrompt\">Choose Group</string>\n\t<string name=\"setStatusmsgHint\">Your status message</string>\n\t<string name=\"setStatusTitle\">Set your status</string>\n\t<string name=\"RenameGroup_summ\">Rename group %s to:</string>\n\t<string name=\"RenameGroup_title\">Rename group</string>\n\t<string name=\"RenameEntry_summ\">Rename %1$s (%2$s) to: </string>\n\t<string name=\"RenameEntry_title\">Rename contact</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_summ\">Select a group from the spinner below</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_title\">Change group</string>\n\t<string name=\"deleteRosterItem_text\">Really remove %1$s (%2$s)?</string>\n\t<string name=\"deleteRosterItem_title\">Delete Contact</string>\n\t<string name=\"deleteChatHistory_text\">Really remove all messages with %1$s (%2$s)?</string>\n\t<string name=\"deleteChatHistory_title\">Delete Chat History</string>\n\t<string name=\"subscriptionRequest_text\">%1$s wants to add you as a contact: \\\"%2$s\\\"</string>\n\t<string name=\"subscriptionRequest_title\">Subscription Request</string>\n\t<string name=\"subscription_accept\">Accept</string>\n\t<string name=\"subscription_reject\">Reject</string>\n\t<string name=\"subscription_reject_all\">Reject all</string>\n\t<string name=\"subscription_status_from\">can see your status</string>\n\n\t<!-- CHATWINDOW -->\n\t<string name=\"chat_from_me\">Me:</string>\n\t<string name=\"toast_stored_offline\">The message has been stored for transmission.</string>\n\t<string name=\"chat_enterMsgHint\">Enter message</string> \n\n\t<!-- Message context menu; use the verb form (to quote) -->\n\t<string name=\"chatmenu_quote\">Quote</string>\n\t<!-- Message context menu: repeat the same message -->\n\t<string name=\"chatmenu_resend\">Edit message</string>\n\n\t<!-- GPS settings -->\n\t<!--\n\t<string name=\"showGPS_title\">GPS to status</string>\n\t<string name=\"showGPS_summ_on\">GPS is send to StatusMessage</string>\n\t<string name=\"showGPS_summ_off\">GPS is send to StatusMessage</string>\n\t-->\n\n\t<!-- About Dialog -->\n\t<string name=\"AboutDialog_title\">About yaxim</string>\n\t<string name=\"AboutDialog_DevelopersTitle\">Developers</string>\n\t<!-- Contact the developer button -->\n\t<string name=\"AboutDialog_DevelopersText\">Contact</string>\n\t<string name=\"AboutDialog_LicenceTitle\">Licensing</string>\n\t<string name=\"AboutDialog_Vote\">Rate app</string>\n\t<string name=\"AboutDialog_LicenceText\">\n\t\tThis program is free software; you can redistribute\n\t\tit and/or\n\t\tmodify it under the terms of the GNU General Public License\n\t\tversion 2\n\t\tas published by the Free Software Foundation.\n\t\tLink:\n\t\thttp://www.gnu.org/licenses/gpl-2.0.html\\n\n\t\t\\n\n\t\tParts of this software are\n\t\tprovided under the MIT License:\\n\n\t\t\\n\n\t\tCopyright © 2009 Mads\n\t\tKristiansen, Nullwire ApS\\n\n\t\t\\n\n\t\tPermission is hereby granted, free of\n\t\tcharge, to any person obtaining\n\t\ta copy\n\t\tof this software and associated\n\t\tdocumentation files (the\n\t\t\"Software\"), to deal\n\t\tin the Software without\n\t\trestriction, including\n\t\twithout limitation the rights\n\t\tto use, copy,\n\t\tmodify, merge, publish,\n\t\tdistribute, sublicense, and/or sell\n\t\tcopies of\n\t\tthe Software, and to\n\t\tpermit persons to whom the Software is\n\t\tfurnished to\n\t\tdo so, subject to\n\t\tthe following conditions:\n\t\t\\n\n\t\tThe above copyright notice\n\t\tand this permission notice shall be\n\t\tincluded in all\n\t\tcopies or\n\t\tsubstantial portions of the Software.\n\t\t\\n\n\t\tTHE SOFTWARE IS PROVIDED \"AS\n\t\tIS\", WITHOUT WARRANTY OF ANY KIND,\n\t\tEXPRESS OR\n\t\tIMPLIED, INCLUDING BUT NOT\n\t\tLIMITED TO THE WARRANTIES OF\n\t\tMERCHANTABILITY,\n\t\tFITNESS FOR A PARTICULAR\n\t\tPURPOSE AND NONINFRINGEMENT.\n\t\tIN NO EVENT SHALL THE\n\t\tAUTHORS OR COPYRIGHT\n\t\tHOLDERS BE LIABLE FOR ANY\n\t\tCLAIM, DAMAGES OR OTHER\n\t\tLIABILITY, WHETHER IN\n\t\tAN ACTION OF CONTRACT,\n\t\tTORT OR OTHERWISE, ARISING FROM,\n\t\tOUT OF OR IN\n\t\tCONNECTION WITH THE\n\t\tSOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n\t\tSOFTWARE.\n    </string>\n\n\t<string name=\"status_available\">उपस्थित</string>\n\t<string name=\"status_away\">Away</string>\n\t<string name=\"status_chat\">Free for chat</string>\n\t<string name=\"status_dnd\">Do not disturb</string>\n\t<string name=\"status_xa\">Not available</string>\n\t<string name=\"status_offline\">अनुपस्थित</string>\n\n\t<string name=\"translator_credits\">Launchpad Contributions:\n  Devendra Mani https://launchpad.net/~devmgs\n  Sachin https://launchpad.net/~msachin</string>\n\n\t<!-- default roster group with no name -->\n\t<string name=\"default_group\">General</string>\n\t<string name=\"all_contacts_group\">All contacts</string>\n\t<string name=\"muc_group\">Group Chats</string>\n\n\t<!-- SEND listener popup -->\n\t<string name=\"chooseContact\">Choose contact</string>\n\t<string name=\"action_settings\">Settings</string>\n\n\t<!-- MUC strings -->\n\t<string name=\"muc_jid_hint\">Group chat JID</string>\n\t<string name=\"muc_nickname_hint\">Nickname</string>\n\t<string name=\"muc_password_hint\">Password (optional)</string>\n\t<string name=\"title_activity_muc_invite\">Group Chat Invitation</string>\n\t<!-- Groupchat invitation: \"Invitation from {contact name}\" -->\n\t<string name=\"muc_invitation_from\">Invitation from %s</string>\n\t<!-- Groupchat info: {description} ({number} participants) -->\n\t<string name=\"muc_invitation_occupants\">%1$s (%2$d participants)</string>\n\t<!-- Notification button: \"Join as {default nickname}\" (make SHORT string) -->\n\t<string name=\"muc_invitation_join\">Join as %s</string>\n\t<string name=\"muc_synchronizing\">Synchronizing…</string>\n\t<!-- Title of user list, contains JID -->\n\t<string name=\"chat_muc_userlist\">Group Chat Participants (%s)</string>\n\t<!-- Kicked from groupchat: \"Kicked: {reason} -->\n\t<string name=\"muc_kicked\">Kicked: %s</string>\n\t<!-- Kicked from groupchat: \"Kicked by {admin name}: {reason} -->\n\t<string name=\"muc_kicked_by\">Kicked by %1$s: %2$s</string>\n\t<!-- Banned from groupchat: \"Banned: {reason} -->\n\t<string name=\"muc_banned\">Banned: %s</string>\n\t<!-- Banned from groupchat: \"Banned by {admin name}: {reason} -->\n\t<string name=\"muc_banned_by\">Banned by %1$s: %2$s</string>\n\n\t<!-- File upload -->\n\t<string name=\"roster_contextmenu_send\">Send…</string>\n\t<string name=\"roster_contextmenu_take_image\">Take picture</string>\n\t<string name=\"roster_contextmenu_send_image\">Choose picture</string>\n\t<string name=\"roster_contextmenu_send_file\">Send file</string>\n\t<string name=\"upload_compress\">Compressing picture…</string>\n\t<string name=\"upload_uploading\">Uploading…</string>\n\t<string name=\"upload_too_large\">file too large!</string>\n\t<string name=\"storage_permission\">%s needs storage access to send files!</string>\n\t<string name=\"notification_permission_denied\">Notifications are disabled in the Android app preferences.</string>\n\n\t<!-- Search -->\n\t<string name=\"search_msg_hint\">Message content</string>\n\n\t<!-- MUC bookmarks -->\n\t<string name=\"group_bookmarks\">My group chats</string>\n\t<string name=\"group_mucsearch\">Public group chats</string>\n\t<!-- Service Discovery -->\n\t<string name=\"title_service_disco\">Browser: %s</string>\n\n\t<!-- Android 9 notification preferences: permanent notification -->\n\t<string name=\"notification_status\">Foreground service</string>\n\t<!-- Android 9 notification preferences: message notifications -->\n\t<string name=\"notification_msg\">Messages</string>\n\n</resources>\n"
  },
  {
    "path": "res/values-hr/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"app_name\">yaxim</string>\n\t<string name=\"app_name_bruno\">Bruno</string>\n\n\t<!-- Connection state -->\n\t<string name=\"conn_title\">yaxim: %s</string>\n\t<string name=\"conn_title_bruno\">Bruno: %s</string>\n\t<string name=\"conn_connecting\">Connecting to server…</string>\n\t<string name=\"conn_disconnecting\">Disconnecting…</string>\n\t<string name=\"conn_online\">Online</string>\n\t<string name=\"conn_offline\">Offline</string>\n\t<string name=\"conn_empty_roster\">No contacts to show!</string>\n\t<string name=\"conn_empty_roster_hints\">There are many ways to add contacts:\\n\\n\n\t\t- Android Beam™: touch a friend\\'s phone\\n\\n\n\t\t- Scan a QR code\\n\\n\n\t\t- \\\"Create invitation\\\" and share it (e-mail, SMS, QR code, …)\\n\\n\n\t\t- \\\"Add contact\\\" if you know the JID</string>\n\t<string name=\"conn_reconnect\">Next connection attempt in %d seconds.</string>\n\t<string name=\"conn_disconnected\">Veza je prekinuta</string>\n\t<string name=\"conn_no_network\">No network connection</string>\n\t<string name=\"conn_ping_timeout\">No response</string>\n\t<string name=\"conn_error\">Error: %s</string>\n\n\t<!-- Global Strings -->\n\t<string name=\"Global_Exit\">Exit</string>\n\t<string name=\"Global_authenticate_first\">Please connect first</string>\n\t<string name=\"Global_JID_hint\">user@yax.im</string>\n\t<!-- tooltip message when the user entered an invalid XMPP address -->\n\t<string name=\"Global_JID_malformed\">Check address format!</string>\n\n\t<!-- FirstStartUpDialog -->\n\t<string name=\"StartupDialog_Title\">Welcome to yaxim!</string>\n\t<string name=\"StartupDialog_Summary\">You need to configure yaxim before you can use it. Please enter your Jabber ID and password.</string>\n\t<string name=\"StartupDialog_pwHint\">Enter password</string>\n\t<string name=\"StartupDialog_pwshowHint\">Show password</string>\n\t<string name=\"StartupDialog_Username_title\">Jabber ID:</string>\n\t<string name=\"StartupDialog_passwd_title\">Password:</string>\n\t<string name=\"StartupDialog_advanced\">Advanced…</string>\n\t<string name=\"StartupDialog_create_new\">Register new account</string>\n\t<string name=\"StartupDialog_error_password\">Password is too short!</string>\n\t<string name=\"StartupDialog_created_password\">Created secure password</string>\n\t<string name=\"StartupDialog_auth_failed\">Please check your username and password!</string>\n\t<string name=\"StartupDialog_server_failed\">Could not connect to %s!</string>\n\t<string name=\"StartupDialog_no_registration\">Server does not allow registration!</string>\n\n\t<string name=\"StartupDialog_invitation\">You have been invited to Jabber. Please complete your registration.</string>\n\t<string name=\"StartupDialog_no_more_accounts\">No additional account supported!</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_message\">Message from %s</string>\n\t<string name=\"notification_anonymous_message\">Message received</string>\n\t<!--  Group Chat notification, %1$s is the user name, %2$s is the room, e.g. \"{Ge0rG} in {yaxim Chat}\" -->\n\t<string name=\"notification_muc_message\">%1$s in %2$s</string>\n\t<!--  Group Group Chat private message notification, %1$s is the user name, %2$s is the room, e.g. \"Message from {Ge0rG} in {yaxim Chat}\" -->\n\t<!--string name=\"notification_muc_pm\">Message from %1$s in %2$s</string-->\n\t<!-- notification button: direct reply (make SHORT string) -->\n\t<string name=\"notification_reply\">Reply</string>\n\t<!-- notification button: mark as read (make SHORT string) -->\n\t<string name=\"notification_mark_read\">Mark Read</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_error\">Error while sending message!</string>\n\n\t<!-- Notification Settings -->\n\t<string name=\"preftitle_notify\">Notification Settings</string>\n\t<string name=\"preftitle_notify_msg\">Message Notification</string>\n\t<string name=\"preftitle_notify_muc\">Group Chat Notification</string>\n\t<string name=\"notification_custom\">Custom Ringtone</string>\n\t<string name=\"muc_highlight_title\">Only notify on mention</string>\n\t<string name=\"muc_highlight_sum\">Notify when your nickname is mentioned in a room</string>\n\t<string name=\"led_title\">Blinking LED</string>\n\t<string name=\"led_summ\">Blink phone LED on incoming messages</string>\n\t<string name=\"vibr_title\">Vibration</string>\n\t<string name=\"vibr_summ\">Vibrate on incoming messages</string>\n\t<string-array name=\"vibr_values_displayed\">\n\t\t<item>Never</item>\n\t\t<item>System preference</item>\n\t\t<item>Always</item>\n\t</string-array>\n\t<string name=\"ringtone_title\">Ringtone</string>\n\t<string name=\"ringtone_summ\">Tone for incoming messages</string>\n\t<string name=\"ticker_title\">Message preview</string>\n\t<string name=\"ticker_summ\">Show sender and message in status bar</string>\n\n\t<!-- Startup Setting Strings -->\n\t<string name=\"preftitle_general\">General Settings</string>\n\t<string name=\"pref_dnd_when_silent\">\\\"Do not disturb\\\" in silent mode</string>\n\t<string name=\"pref_dnd_when_silent_summ\">Set your online status to \\\"DND\\\" when your phone is in silent mode</string>\n\t<string name=\"statuspopup_name\">Set your status</string>\n\t<string name=\"showOffline_summ\">Always show all contacts in the roster</string>\n\t<string name=\"showOffline_title\">Show offline contacts</string>\n\t<string name=\"enableGroups_summ\">Arrange your contacts by their groups</string>\n\t<string name=\"enableGroups_title\">Show contact groups</string>\n\t<string name=\"foregroundService_summ\">Keep app in memory to ensure always-on connection (foreground service)</string>\n\t<string name=\"foregroundService_title\">Statusbar icon</string>\n\n\t<string name=\"preftitle_debug\">Debugging</string>\n\t<string name=\"smackdebug_summ\">Packet and debug output via logcat (may contain personal information)</string>\n\t<string name=\"smackdebug_title\">SMACK debugging</string>\n\n\t<string name=\"reportcrash_title\">Send crash reports</string>\n\t<string name=\"reportcrash_summ\">Send anonymous crash reports to developer</string>\n\n\t<!-- Appearence Strings -->\n\t<string name=\"preftitle_app\">Appearance</string>\n\t<string name=\"FontChat_title\">Chat font size</string>\n\t<string name=\"FontChat_summ\">Set chat font size</string>\n\t<string name=\"FontChat_dialog\">Chat font size</string>\n\t<!--\n\t<string name=\"FontRost_title\">Roster font size</string>\n\t<string name=\"FontRost_summ\">Set roster font size</string>\n\t<string name=\"FontRost_dialog\">Roster font fize</string>\n\t<string name=\"setFontRoster\">Set roster font size</string>\n\t-->\n\t<string name=\"pref_theme\">Theme</string>\n\t<string name=\"pref_theme_dark\">Dark</string>\n\t<string name=\"pref_theme_light\">Light</string>\n\t<string name=\"pref_theme_pine\">Pine</string>\n\t<string name=\"pref_theme_ice\">Ice</string>\n\t<string name=\"preftitle_ui\">Appearance</string>\n\t<string-array name=\"fontSizesChat\">\n\t\t<item>small</item>\n\t\t<item>normal</item>\n\t\t<item>large</item>\n\t\t<item>huge</item>\n\t</string-array>\n\n\t<!-- Mainmenu \t-->\n\t<string name=\"Menu_addFriend\">Add contact</string>\n\t<string name=\"Menu_addClipboard\">Add %s</string>\n\t<string name=\"Menu_ShowOff\">Show offline</string>\n\t<string name=\"Menu_HideOff\">Hide offline</string>\n\t<string name=\"Menu_AccSettings\">Edit account</string>\n\t<string name=\"Menu_Settings\">Settings</string>\n\t<string name=\"Menu_Status\">Status</string>\n\t<string name=\"Menu_connect\">Connect</string>\n\t<string name=\"Menu_disconnect\">Disconnect</string>\n\t<string name=\"Menu_about\">About yaxim</string>\n\t<string name=\"Menu_about_bruno\">About Bruno</string>\n\t<string name=\"Menu_muc\">Add / browse…</string>\n\t<string name=\"Menu_matrix\">Enter the Matrix…</string>\n\t<string name=\"Menu_mark_all_as_read\">Mark all as read</string>\n\t<string name=\"Menu_send_invitation\">Create invitation</string>\n    <string name=\"Menu_userlist\">Participants</string>\n\n\n\t<!-- AddFriend -->\n\t<string name=\"addFriend_Title\">Add a Contact</string>\n\t<string name=\"addFriend_Summ\">Please enter the Jabber ID of your friend, the\n\t\tdesired screen name and choose their contact group!</string>\n\t<string name=\"addFriend_aliasHint\">Screen name</string>\n\t<string name=\"addrosteritemaddgroupchoice\">Add to a new group</string>\n\t<string name=\"NewGroup_EditTextField_Hint\">Name for the new group</string>\n\n\t<!-- Roster CONTEXTMENU -->\n\t<string name=\"roster_contextmenu_group_rename\">Rename group</string>\n\t<string name=\"roster_contextmenu_contact_mark_as_read\">Mark as read</string>\n\t<string name=\"roster_contextmenu_contact_delete\">Delete contact</string>\n\t<string name=\"roster_contextmenu_contact_delmsg\">Delete chat history</string>\n\t<string name=\"roster_contextmenu_contact_rename\">Rename</string>\n\t<string name=\"roster_contextmenu_contact_request_auth\">Request authorization</string>\n\t<string name=\"roster_contextmenu_contact_change_group\">Change group</string>\n\t<string name=\"roster_contextmenu_contact_share\">Share address</string>\n\t<string name=\"roster_contextmenu_contact_ringtone\">Ringtone</string>\n\t<string name=\"roster_contextmenu_muc_edit\">Edit group chat</string>\n\t<string name=\"roster_contextmenu_muc_leave\">Leave group chat</string>\n\t<string name=\"muc_leave_question\">Really leave %s?</string>\n\n\t<!-- Accountprefs -->\n\t<string name=\"account_settings_login\">Login Information</string>\n\t<string name=\"account_settings_title\">Account Settings</string>\n\t<string name=\"account_options_title\">Connecting Options</string>\n\t<string name=\"account_options_advanced\">Advanced Options</string>\n\t<string name=\"carbons_title\">Message Carbons (XEP-0280)</string>\n\t<string name=\"carbons_summ\">Request message copies from your other client(s)</string>\n\t<string name=\"account_jabberID_title\">Jabber ID</string>\n\t<string name=\"account_jabberID_sum\">example: me@jabber.example.com</string>\n\t<string name=\"account_jabberID_dialog_title\">Enter your Jabber ID:</string>\n\t<string name=\"account_jabberPW_title\">Account Password</string>\n\t<string name=\"account_jabberPW_sum\">Your Jabber account password</string>\n\t<string name=\"account_jabberPW_change_on_server\">Change password on server</string>\n\t<string name=\"account_jabberPW_password_old\">Old Password:</string>\n\t<string name=\"account_jabberPW_password_new\">New Password:</string>\n\t<string name=\"account_jabberPW_warning\">WARNING! For successful login you must also set the same password on the server!</string>\n\t<string name=\"account_jabberPW_progress\">Please wait, changing password…</string>\n\t<string name=\"account_jabberPW_finished\">Password successfully changed.</string>\n\t<string name=\"account_jabberPW_error\">Error changing password: %s</string>\n\t<string name=\"account_nickname_title\">Display Name</string>\n\t<string name=\"account_nickname_summ\">Your nickname displayed to other users</string>\n\t\n\t<!-- accountprefs -->\n\t<string name=\"account_resource_title\">Client Resource</string>\n\t<string name=\"account_resource_summ\">Default: yaxim</string>\n\t<string name=\"account_resource_dialog_title\">Enter your resource:</string>\n\t<string name=\"account_resource_hint\">yaxim</string>\n\t<string name=\"account_prio_title\">Client Priority</string>\n\t<string name=\"account_prio_summ\">Default: 0 (allowed: -128 .. 127)</string>\n\t<string name=\"account_prio_error\">Allowed values: -128 .. 127</string>\n\t<string name=\"account_prio_dialog_title\">Enter your priority:</string>\n\t<string name=\"account_port_title\">Server Port</string>\n\t<string name=\"account_port_sum\">Default: 5222</string>\n\t<string name=\"account_port_dialog_title\">Enter the server port:</string>\n\t<string name=\"account_port_hint\">5222</string>\n\t<string name=\"account_customserver_title\">Custom Server</string>\n\t<string name=\"account_customserver_summ\">(Optional) alternative server hostname</string>\n\t<string name=\"account_customserver_dialog_title\">Enter server hostname:</string>\n\t<string name=\"account_customserver_hint\">host.example.com</string>\n\t<string name=\"require_ssl_title\">Require SSL/TLS</string>\n\t<string name=\"require_ssl_summ\">Always encrypt server connection</string>\n\n\t<!--StatusPopUp-->\n\t<string name=\"AddContact_SpinnerPrompt\">Choose Group</string>\n\t<string name=\"setStatusmsgHint\">Your status message</string>\n\t<string name=\"setStatusTitle\">Set your status</string>\n\t<string name=\"RenameGroup_summ\">Rename group %s to:</string>\n\t<string name=\"RenameGroup_title\">Rename group</string>\n\t<string name=\"RenameEntry_summ\">Rename %1$s (%2$s) to: </string>\n\t<string name=\"RenameEntry_title\">Rename contact</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_summ\">Select a group from the spinner below</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_title\">Change group</string>\n\t<string name=\"deleteRosterItem_text\">Really remove %1$s (%2$s)?</string>\n\t<string name=\"deleteRosterItem_title\">Delete Contact</string>\n\t<string name=\"deleteChatHistory_text\">Really remove all messages with %1$s (%2$s)?</string>\n\t<string name=\"deleteChatHistory_title\">Delete Chat History</string>\n\t<string name=\"subscriptionRequest_text\">%1$s wants to add you as a contact: \\\"%2$s\\\"</string>\n\t<string name=\"subscriptionRequest_title\">Subscription Request</string>\n\t<string name=\"subscription_accept\">Accept</string>\n\t<string name=\"subscription_reject\">Reject</string>\n\t<string name=\"subscription_reject_all\">Reject all</string>\n\t<string name=\"subscription_status_from\">can see your status</string>\n\n\t<!-- CHATWINDOW -->\n\t<string name=\"chat_from_me\">Me:</string>\n\t<string name=\"toast_stored_offline\">The message has been stored for transmission.</string>\n\t<string name=\"chat_enterMsgHint\">Enter message</string> \n\n\t<!-- Message context menu; use the verb form (to quote) -->\n\t<string name=\"chatmenu_quote\">Quote</string>\n\t<!-- Message context menu: repeat the same message -->\n\t<string name=\"chatmenu_resend\">Edit message</string>\n\n\t<!-- GPS settings -->\n\t<!--\n\t<string name=\"showGPS_title\">GPS to status</string>\n\t<string name=\"showGPS_summ_on\">GPS is send to StatusMessage</string>\n\t<string name=\"showGPS_summ_off\">GPS is send to StatusMessage</string>\n\t-->\n\n\t<!-- About Dialog -->\n\t<string name=\"AboutDialog_title\">About yaxim</string>\n\t<string name=\"AboutDialog_DevelopersTitle\">Developers</string>\n\t<!-- Contact the developer button -->\n\t<string name=\"AboutDialog_DevelopersText\">Contact</string>\n\t<string name=\"AboutDialog_LicenceTitle\">Licensing</string>\n\t<string name=\"AboutDialog_Vote\">Rate app</string>\n\t<string name=\"AboutDialog_LicenceText\">\n\t\tThis program is free software; you can redistribute\n\t\tit and/or\n\t\tmodify it under the terms of the GNU General Public License\n\t\tversion 2\n\t\tas published by the Free Software Foundation.\n\t\tLink:\n\t\thttp://www.gnu.org/licenses/gpl-2.0.html\\n\n\t\t\\n\n\t\tParts of this software are\n\t\tprovided under the MIT License:\\n\n\t\t\\n\n\t\tCopyright © 2009 Mads\n\t\tKristiansen, Nullwire ApS\\n\n\t\t\\n\n\t\tPermission is hereby granted, free of\n\t\tcharge, to any person obtaining\n\t\ta copy\n\t\tof this software and associated\n\t\tdocumentation files (the\n\t\t\"Software\"), to deal\n\t\tin the Software without\n\t\trestriction, including\n\t\twithout limitation the rights\n\t\tto use, copy,\n\t\tmodify, merge, publish,\n\t\tdistribute, sublicense, and/or sell\n\t\tcopies of\n\t\tthe Software, and to\n\t\tpermit persons to whom the Software is\n\t\tfurnished to\n\t\tdo so, subject to\n\t\tthe following conditions:\n\t\t\\n\n\t\tThe above copyright notice\n\t\tand this permission notice shall be\n\t\tincluded in all\n\t\tcopies or\n\t\tsubstantial portions of the Software.\n\t\t\\n\n\t\tTHE SOFTWARE IS PROVIDED \"AS\n\t\tIS\", WITHOUT WARRANTY OF ANY KIND,\n\t\tEXPRESS OR\n\t\tIMPLIED, INCLUDING BUT NOT\n\t\tLIMITED TO THE WARRANTIES OF\n\t\tMERCHANTABILITY,\n\t\tFITNESS FOR A PARTICULAR\n\t\tPURPOSE AND NONINFRINGEMENT.\n\t\tIN NO EVENT SHALL THE\n\t\tAUTHORS OR COPYRIGHT\n\t\tHOLDERS BE LIABLE FOR ANY\n\t\tCLAIM, DAMAGES OR OTHER\n\t\tLIABILITY, WHETHER IN\n\t\tAN ACTION OF CONTRACT,\n\t\tTORT OR OTHERWISE, ARISING FROM,\n\t\tOUT OF OR IN\n\t\tCONNECTION WITH THE\n\t\tSOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n\t\tSOFTWARE.\n    </string>\n\n\t<string name=\"status_available\">Online</string>\n\t<string name=\"status_away\">Away</string>\n\t<string name=\"status_chat\">Free for chat</string>\n\t<string name=\"status_dnd\">Do not disturb</string>\n\t<string name=\"status_xa\">Not available</string>\n\t<string name=\"status_offline\">Offline</string>\n\n\t<string name=\"translator_credits\">Launchpad Contributions:\n  Georg Lukas https://launchpad.net/~ge0rg\n  freedomrun https://launchpad.net/~freedomrun</string>\n\n\t<!-- default roster group with no name -->\n\t<string name=\"default_group\">General</string>\n\t<string name=\"all_contacts_group\">All contacts</string>\n\t<string name=\"muc_group\">Group Chats</string>\n\n\t<!-- SEND listener popup -->\n\t<string name=\"chooseContact\">Choose contact</string>\n\t<string name=\"action_settings\">Settings</string>\n\n\t<!-- MUC strings -->\n\t<string name=\"muc_jid_hint\">Group chat JID</string>\n\t<string name=\"muc_nickname_hint\">Nickname</string>\n\t<string name=\"muc_password_hint\">Password (optional)</string>\n\t<string name=\"title_activity_muc_invite\">Group Chat Invitation</string>\n\t<!-- Groupchat invitation: \"Invitation from {contact name}\" -->\n\t<string name=\"muc_invitation_from\">Invitation from %s</string>\n\t<!-- Groupchat info: {description} ({number} participants) -->\n\t<string name=\"muc_invitation_occupants\">%1$s (%2$d participants)</string>\n\t<!-- Notification button: \"Join as {default nickname}\" (make SHORT string) -->\n\t<string name=\"muc_invitation_join\">Join as %s</string>\n\t<string name=\"muc_synchronizing\">Synchronizing…</string>\n\t<!-- Title of user list, contains JID -->\n\t<string name=\"chat_muc_userlist\">Group Chat Participants (%s)</string>\n\t<!-- Kicked from groupchat: \"Kicked: {reason} -->\n\t<string name=\"muc_kicked\">Kicked: %s</string>\n\t<!-- Kicked from groupchat: \"Kicked by {admin name}: {reason} -->\n\t<string name=\"muc_kicked_by\">Kicked by %1$s: %2$s</string>\n\t<!-- Banned from groupchat: \"Banned: {reason} -->\n\t<string name=\"muc_banned\">Banned: %s</string>\n\t<!-- Banned from groupchat: \"Banned by {admin name}: {reason} -->\n\t<string name=\"muc_banned_by\">Banned by %1$s: %2$s</string>\n\n\t<!-- File upload -->\n\t<string name=\"roster_contextmenu_send\">Send…</string>\n\t<string name=\"roster_contextmenu_take_image\">Take picture</string>\n\t<string name=\"roster_contextmenu_send_image\">Choose picture</string>\n\t<string name=\"roster_contextmenu_send_file\">Send file</string>\n\t<string name=\"upload_compress\">Compressing picture…</string>\n\t<string name=\"upload_uploading\">Uploading…</string>\n\t<string name=\"upload_too_large\">file too large!</string>\n\t<string name=\"storage_permission\">%s needs storage access to send files!</string>\n\t<string name=\"notification_permission_denied\">Notifications are disabled in the Android app preferences.</string>\n\n\t<!-- Search -->\n\t<string name=\"search_msg_hint\">Message content</string>\n\n\t<!-- MUC bookmarks -->\n\t<string name=\"group_bookmarks\">My group chats</string>\n\t<string name=\"group_mucsearch\">Public group chats</string>\n\t<!-- Service Discovery -->\n\t<string name=\"title_service_disco\">Browser: %s</string>\n\n\t<!-- Android 9 notification preferences: permanent notification -->\n\t<string name=\"notification_status\">Foreground service</string>\n\t<!-- Android 9 notification preferences: message notifications -->\n\t<string name=\"notification_msg\">Messages</string>\n\n</resources>\n"
  },
  {
    "path": "res/values-id/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"app_name\">yaxim</string>\n\t<string name=\"app_name_bruno\">Bruno</string>\n\n\t<!-- Connection state -->\n\t<string name=\"conn_title\">yaxim: %s</string>\n\t<string name=\"conn_title_bruno\">Bruno: %s</string>\n\t<string name=\"conn_connecting\">Menghubungi erver</string>\n\t<string name=\"conn_disconnecting\">Disconnecting…</string>\n\t<string name=\"conn_online\">Tersambung</string>\n\t<string name=\"conn_offline\">Terputus</string>\n\t<string name=\"conn_empty_roster\">Tidak ada daftar alamat</string>\n\t<string name=\"conn_empty_roster_hints\">There are many ways to add contacts:\\n\\n\n\t\t- Android Beam™: touch a friend\\'s phone\\n\\n\n\t\t- Scan a QR code\\n\\n\n\t\t- \\\"Create invitation\\\" and share it (e-mail, SMS, QR code, …)\\n\\n\n\t\t- \\\"Add contact\\\" if you know the JID</string>\n\t<string name=\"conn_reconnect\">Next connection attempt in %d seconds.</string>\n\t<string name=\"conn_disconnected\">Koneksi terputus</string>\n\t<string name=\"conn_no_network\">No network connection</string>\n\t<string name=\"conn_ping_timeout\">No response</string>\n\t<string name=\"conn_error\">Error: %s</string>\n\n\t<!-- Global Strings -->\n\t<string name=\"Global_Exit\">Keluar</string>\n\t<string name=\"Global_authenticate_first\">Harus tersambung dulu</string>\n\t<string name=\"Global_JID_hint\">user@yax.im</string>\n\t<!-- tooltip message when the user entered an invalid XMPP address -->\n\t<string name=\"Global_JID_malformed\">Check address format!</string>\n\n\t<!-- FirstStartUpDialog -->\n\t<string name=\"StartupDialog_Title\">Selamat datang</string>\n\t<string name=\"StartupDialog_Summary\">Anda harus mengkonfigurasi Yaxim terlebih dahulu. Silahkan masukan Jabber ID dan kata sandi</string>\n\t<string name=\"StartupDialog_pwHint\">Masukkan kata sandi</string>\n\t<string name=\"StartupDialog_pwshowHint\">Show password</string>\n\t<string name=\"StartupDialog_Username_title\">Jabber ID:</string>\n\t<string name=\"StartupDialog_passwd_title\">Kata sandi:</string>\n\t<string name=\"StartupDialog_advanced\">Lanjutan...</string>\n\t<string name=\"StartupDialog_create_new\">Daftar akun baru</string>\n\t<string name=\"StartupDialog_error_password\">Password is too short!</string>\n\t<string name=\"StartupDialog_created_password\">Created secure password</string>\n\t<string name=\"StartupDialog_auth_failed\">Please check your username and password!</string>\n\t<string name=\"StartupDialog_server_failed\">Could not connect to %s!</string>\n\t<string name=\"StartupDialog_no_registration\">Server does not allow registration!</string>\n\n\t<string name=\"StartupDialog_invitation\">You have been invited to Jabber. Please complete your registration.</string>\n\t<string name=\"StartupDialog_no_more_accounts\">No additional account supported!</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_message\">Pesan dari %s</string>\n\t<string name=\"notification_anonymous_message\">Pesan diterima</string>\n\t<!--  Group Chat notification, %1$s is the user name, %2$s is the room, e.g. \"{Ge0rG} in {yaxim Chat}\" -->\n\t<string name=\"notification_muc_message\">%1$s in %2$s</string>\n\t<!--  Group Group Chat private message notification, %1$s is the user name, %2$s is the room, e.g. \"Message from {Ge0rG} in {yaxim Chat}\" -->\n\t<!--string name=\"notification_muc_pm\">Message from %1$s in %2$s</string-->\n\t<!-- notification button: direct reply (make SHORT string) -->\n\t<string name=\"notification_reply\">Reply</string>\n\t<!-- notification button: mark as read (make SHORT string) -->\n\t<string name=\"notification_mark_read\">Mark Read</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_error\">Error while sending message!</string>\n\n\t<!-- Notification Settings -->\n\t<string name=\"preftitle_notify\">Notification Settings</string>\n\t<string name=\"preftitle_notify_msg\">Pemberitahuan Pesan</string>\n\t<string name=\"preftitle_notify_muc\">Group Chat Notification</string>\n\t<string name=\"notification_custom\">Custom Ringtone</string>\n\t<string name=\"muc_highlight_title\">Only notify on mention</string>\n\t<string name=\"muc_highlight_sum\">Notify when your nickname is mentioned in a room</string>\n\t<string name=\"led_title\">LED berkedip</string>\n\t<string name=\"led_summ\">LED berkedip ketika ada pesan baru</string>\n\t<string name=\"vibr_title\">Getar</string>\n\t<string name=\"vibr_summ\">Bergetar ketika ada pesan baru</string>\n\t<string-array name=\"vibr_values_displayed\">\n\t\t<item>Tidak Pernah</item>\n\t\t<item>System preference</item>\n\t\t<item>Selalu</item>\n\t</string-array>\n\t<string name=\"ringtone_title\">Nada dering</string>\n\t<string name=\"ringtone_summ\">Nada pesan baru</string>\n\t<string name=\"ticker_title\">Lihat pesan</string>\n\t<string name=\"ticker_summ\">Tampilkan pengirim dan pesan di status</string>\n\n\t<!-- Startup Setting Strings -->\n\t<string name=\"preftitle_general\">General Settings</string>\n\t<string name=\"pref_dnd_when_silent\">\\\"Do not disturb\\\" in silent mode</string>\n\t<string name=\"pref_dnd_when_silent_summ\">Set your online status to \\\"DND\\\" when your phone is in silent mode</string>\n\t<string name=\"statuspopup_name\">Atur status</string>\n\t<string name=\"showOffline_summ\">Always show all contacts in the roster</string>\n\t<string name=\"showOffline_title\">Show offline contacts</string>\n\t<string name=\"enableGroups_summ\">Arrange your contacts by their groups</string>\n\t<string name=\"enableGroups_title\">Show contact groups</string>\n\t<string name=\"foregroundService_summ\">Keep app in memory to ensure always-on connection (foreground service)</string>\n\t<string name=\"foregroundService_title\">Statusbar icon</string>\n\n\t<string name=\"preftitle_debug\">Debugging</string>\n\t<string name=\"smackdebug_summ\">Packet and debug output via logcat (may contain personal information)</string>\n\t<string name=\"smackdebug_title\">SMACK debugging</string>\n\n\t<string name=\"reportcrash_title\">Send crash reports</string>\n\t<string name=\"reportcrash_summ\">Send anonymous crash reports to developer</string>\n\n\t<!-- Appearence Strings -->\n\t<string name=\"preftitle_app\">Tampilan</string>\n\t<string name=\"FontChat_title\">Ukuran huruf</string>\n\t<string name=\"FontChat_summ\">Atur ukuran huruf</string>\n\t<string name=\"FontChat_dialog\">Ukuran huruf</string>\n\t<!--\n\t<string name=\"FontRost_title\">Roster font size</string>\n\t<string name=\"FontRost_summ\">Set roster font size</string>\n\t<string name=\"FontRost_dialog\">Roster font fize</string>\n\t<string name=\"setFontRoster\">Set roster font size</string>\n\t-->\n\t<string name=\"pref_theme\">Tema</string>\n\t<string name=\"pref_theme_dark\">Gelap</string>\n\t<string name=\"pref_theme_light\">Terang</string>\n\t<string name=\"pref_theme_pine\">Pine</string>\n\t<string name=\"pref_theme_ice\">Ice</string>\n\t<string name=\"preftitle_ui\">Tampilan</string>\n\t<string-array name=\"fontSizesChat\">\n\t\t<item>kecil</item>\n\t\t<item>normal</item>\n\t\t<item>large</item>\n\t\t<item>huge</item>\n\t</string-array>\n\n\t<!-- Mainmenu \t-->\n\t<string name=\"Menu_addFriend\">Add contact</string>\n\t<string name=\"Menu_addClipboard\">Add %s</string>\n\t<string name=\"Menu_ShowOff\">Show offline</string>\n\t<string name=\"Menu_HideOff\">Hide offline</string>\n\t<string name=\"Menu_AccSettings\">Edit account</string>\n\t<string name=\"Menu_Settings\">Pengaturan</string>\n\t<string name=\"Menu_Status\">Status</string>\n\t<string name=\"Menu_connect\">Sambung</string>\n\t<string name=\"Menu_disconnect\">Putus</string>\n\t<string name=\"Menu_about\">Tentang Yaxim</string>\n\t<string name=\"Menu_about_bruno\">About Bruno</string>\n\t<string name=\"Menu_muc\">Add / browse…</string>\n\t<string name=\"Menu_matrix\">Enter the Matrix…</string>\n\t<string name=\"Menu_mark_all_as_read\">Mark all as read</string>\n\t<string name=\"Menu_send_invitation\">Create invitation</string>\n    <string name=\"Menu_userlist\">Participants</string>\n\n\n\t<!-- AddFriend -->\n\t<string name=\"addFriend_Title\">Tambah kontak</string>\n\t<string name=\"addFriend_Summ\">Please enter the Jabber ID of your friend, the\n\t\tdesired screen name and choose their contact group!</string>\n\t<string name=\"addFriend_aliasHint\">Screen name</string>\n\t<string name=\"addrosteritemaddgroupchoice\">Add to a new group</string>\n\t<string name=\"NewGroup_EditTextField_Hint\">Name for the new group</string>\n\n\t<!-- Roster CONTEXTMENU -->\n\t<string name=\"roster_contextmenu_group_rename\">Rename group</string>\n\t<string name=\"roster_contextmenu_contact_mark_as_read\">Mark as read</string>\n\t<string name=\"roster_contextmenu_contact_delete\">Delete contact</string>\n\t<string name=\"roster_contextmenu_contact_delmsg\">Delete chat history</string>\n\t<string name=\"roster_contextmenu_contact_rename\">Rename</string>\n\t<string name=\"roster_contextmenu_contact_request_auth\">Request authorization</string>\n\t<string name=\"roster_contextmenu_contact_change_group\">Change group</string>\n\t<string name=\"roster_contextmenu_contact_share\">Share address</string>\n\t<string name=\"roster_contextmenu_contact_ringtone\">Nada dering</string>\n\t<string name=\"roster_contextmenu_muc_edit\">Edit group chat</string>\n\t<string name=\"roster_contextmenu_muc_leave\">Leave group chat</string>\n\t<string name=\"muc_leave_question\">Really leave %s?</string>\n\n\t<!-- Accountprefs -->\n\t<string name=\"account_settings_login\">Login Information</string>\n\t<string name=\"account_settings_title\">Account Settings</string>\n\t<string name=\"account_options_title\">Connecting Options</string>\n\t<string name=\"account_options_advanced\">Advanced Options</string>\n\t<string name=\"carbons_title\">Message Carbons (XEP-0280)</string>\n\t<string name=\"carbons_summ\">Request message copies from your other client(s)</string>\n\t<string name=\"account_jabberID_title\">Jabber ID</string>\n\t<string name=\"account_jabberID_sum\">example: me@jabber.example.com</string>\n\t<string name=\"account_jabberID_dialog_title\">Enter your Jabber ID:</string>\n\t<string name=\"account_jabberPW_title\">Account Password</string>\n\t<string name=\"account_jabberPW_sum\">Your Jabber account password</string>\n\t<string name=\"account_jabberPW_change_on_server\">Change password on server</string>\n\t<string name=\"account_jabberPW_password_old\">Old Password:</string>\n\t<string name=\"account_jabberPW_password_new\">New Password:</string>\n\t<string name=\"account_jabberPW_warning\">WARNING! For successful login you must also set the same password on the server!</string>\n\t<string name=\"account_jabberPW_progress\">Please wait, changing password…</string>\n\t<string name=\"account_jabberPW_finished\">Password successfully changed.</string>\n\t<string name=\"account_jabberPW_error\">Error changing password: %s</string>\n\t<string name=\"account_nickname_title\">Display Name</string>\n\t<string name=\"account_nickname_summ\">Your nickname displayed to other users</string>\n\t\n\t<!-- accountprefs -->\n\t<string name=\"account_resource_title\">Client Resource</string>\n\t<string name=\"account_resource_summ\">Default: yaxim</string>\n\t<string name=\"account_resource_dialog_title\">Enter your resource:</string>\n\t<string name=\"account_resource_hint\">yaxim</string>\n\t<string name=\"account_prio_title\">Client Priority</string>\n\t<string name=\"account_prio_summ\">Default: 0 (allowed: -128 .. 127)</string>\n\t<string name=\"account_prio_error\">Allowed values: -128 .. 127</string>\n\t<string name=\"account_prio_dialog_title\">Enter your priority:</string>\n\t<string name=\"account_port_title\">Server Port</string>\n\t<string name=\"account_port_sum\">Default: 5222</string>\n\t<string name=\"account_port_dialog_title\">Enter the server port:</string>\n\t<string name=\"account_port_hint\">5222</string>\n\t<string name=\"account_customserver_title\">Custom Server</string>\n\t<string name=\"account_customserver_summ\">(Optional) alternative server hostname</string>\n\t<string name=\"account_customserver_dialog_title\">Enter server hostname:</string>\n\t<string name=\"account_customserver_hint\">host.example.com</string>\n\t<string name=\"require_ssl_title\">Require SSL/TLS</string>\n\t<string name=\"require_ssl_summ\">Always encrypt server connection</string>\n\n\t<!--StatusPopUp-->\n\t<string name=\"AddContact_SpinnerPrompt\">Choose Group</string>\n\t<string name=\"setStatusmsgHint\">Your status message</string>\n\t<string name=\"setStatusTitle\">Atur status</string>\n\t<string name=\"RenameGroup_summ\">Rename group %s to:</string>\n\t<string name=\"RenameGroup_title\">Rename group</string>\n\t<string name=\"RenameEntry_summ\">Rename %1$s (%2$s) to: </string>\n\t<string name=\"RenameEntry_title\">Rename contact</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_summ\">Select a group from the spinner below</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_title\">Change group</string>\n\t<string name=\"deleteRosterItem_text\">Really remove %1$s (%2$s)?</string>\n\t<string name=\"deleteRosterItem_title\">Delete Contact</string>\n\t<string name=\"deleteChatHistory_text\">Really remove all messages with %1$s (%2$s)?</string>\n\t<string name=\"deleteChatHistory_title\">Delete Chat History</string>\n\t<string name=\"subscriptionRequest_text\">%1$s wants to add you as a contact: \\\"%2$s\\\"</string>\n\t<string name=\"subscriptionRequest_title\">Subscription Request</string>\n\t<string name=\"subscription_accept\">Accept</string>\n\t<string name=\"subscription_reject\">Reject</string>\n\t<string name=\"subscription_reject_all\">Reject all</string>\n\t<string name=\"subscription_status_from\">can see your status</string>\n\n\t<!-- CHATWINDOW -->\n\t<string name=\"chat_from_me\">Me:</string>\n\t<string name=\"toast_stored_offline\">The message has been stored for transmission.</string>\n\t<string name=\"chat_enterMsgHint\">Enter message</string> \n\n\t<!-- Message context menu; use the verb form (to quote) -->\n\t<string name=\"chatmenu_quote\">Quote</string>\n\t<!-- Message context menu: repeat the same message -->\n\t<string name=\"chatmenu_resend\">Edit message</string>\n\n\t<!-- GPS settings -->\n\t<!--\n\t<string name=\"showGPS_title\">GPS to status</string>\n\t<string name=\"showGPS_summ_on\">GPS is send to StatusMessage</string>\n\t<string name=\"showGPS_summ_off\">GPS is send to StatusMessage</string>\n\t-->\n\n\t<!-- About Dialog -->\n\t<string name=\"AboutDialog_title\">Tentang Yaxim</string>\n\t<string name=\"AboutDialog_DevelopersTitle\">Developers</string>\n\t<!-- Contact the developer button -->\n\t<string name=\"AboutDialog_DevelopersText\">Contact</string>\n\t<string name=\"AboutDialog_LicenceTitle\">Licensing</string>\n\t<string name=\"AboutDialog_Vote\">Rate app</string>\n\t<string name=\"AboutDialog_LicenceText\">\n\t\tThis program is free software; you can redistribute\n\t\tit and/or\n\t\tmodify it under the terms of the GNU General Public License\n\t\tversion 2\n\t\tas published by the Free Software Foundation.\n\t\tLink:\n\t\thttp://www.gnu.org/licenses/gpl-2.0.html\\n\n\t\t\\n\n\t\tParts of this software are\n\t\tprovided under the MIT License:\\n\n\t\t\\n\n\t\tCopyright © 2009 Mads\n\t\tKristiansen, Nullwire ApS\\n\n\t\t\\n\n\t\tPermission is hereby granted, free of\n\t\tcharge, to any person obtaining\n\t\ta copy\n\t\tof this software and associated\n\t\tdocumentation files (the\n\t\t\"Software\"), to deal\n\t\tin the Software without\n\t\trestriction, including\n\t\twithout limitation the rights\n\t\tto use, copy,\n\t\tmodify, merge, publish,\n\t\tdistribute, sublicense, and/or sell\n\t\tcopies of\n\t\tthe Software, and to\n\t\tpermit persons to whom the Software is\n\t\tfurnished to\n\t\tdo so, subject to\n\t\tthe following conditions:\n\t\t\\n\n\t\tThe above copyright notice\n\t\tand this permission notice shall be\n\t\tincluded in all\n\t\tcopies or\n\t\tsubstantial portions of the Software.\n\t\t\\n\n\t\tTHE SOFTWARE IS PROVIDED \"AS\n\t\tIS\", WITHOUT WARRANTY OF ANY KIND,\n\t\tEXPRESS OR\n\t\tIMPLIED, INCLUDING BUT NOT\n\t\tLIMITED TO THE WARRANTIES OF\n\t\tMERCHANTABILITY,\n\t\tFITNESS FOR A PARTICULAR\n\t\tPURPOSE AND NONINFRINGEMENT.\n\t\tIN NO EVENT SHALL THE\n\t\tAUTHORS OR COPYRIGHT\n\t\tHOLDERS BE LIABLE FOR ANY\n\t\tCLAIM, DAMAGES OR OTHER\n\t\tLIABILITY, WHETHER IN\n\t\tAN ACTION OF CONTRACT,\n\t\tTORT OR OTHERWISE, ARISING FROM,\n\t\tOUT OF OR IN\n\t\tCONNECTION WITH THE\n\t\tSOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n\t\tSOFTWARE.\n    </string>\n\n\t<string name=\"status_available\">Tersambung</string>\n\t<string name=\"status_away\">Away</string>\n\t<string name=\"status_chat\">Free for chat</string>\n\t<string name=\"status_dnd\">Do not disturb</string>\n\t<string name=\"status_xa\">Not available</string>\n\t<string name=\"status_offline\">Terputus</string>\n\n\t<string name=\"translator_credits\">Launchpad Contributions:\n  Georg Lukas https://launchpad.net/~ge0rg\n  Wiha Sjah https://launchpad.net/~wihasjah</string>\n\n\t<!-- default roster group with no name -->\n\t<string name=\"default_group\">General</string>\n\t<string name=\"all_contacts_group\">All contacts</string>\n\t<string name=\"muc_group\">Group Chats</string>\n\n\t<!-- SEND listener popup -->\n\t<string name=\"chooseContact\">Choose contact</string>\n\t<string name=\"action_settings\">Pengaturan</string>\n\n\t<!-- MUC strings -->\n\t<string name=\"muc_jid_hint\">Group chat JID</string>\n\t<string name=\"muc_nickname_hint\">Nickname</string>\n\t<string name=\"muc_password_hint\">Password (optional)</string>\n\t<string name=\"title_activity_muc_invite\">Group Chat Invitation</string>\n\t<!-- Groupchat invitation: \"Invitation from {contact name}\" -->\n\t<string name=\"muc_invitation_from\">Invitation from %s</string>\n\t<!-- Groupchat info: {description} ({number} participants) -->\n\t<string name=\"muc_invitation_occupants\">%1$s (%2$d participants)</string>\n\t<!-- Notification button: \"Join as {default nickname}\" (make SHORT string) -->\n\t<string name=\"muc_invitation_join\">Join as %s</string>\n\t<string name=\"muc_synchronizing\">Synchronizing…</string>\n\t<!-- Title of user list, contains JID -->\n\t<string name=\"chat_muc_userlist\">Group Chat Participants (%s)</string>\n\t<!-- Kicked from groupchat: \"Kicked: {reason} -->\n\t<string name=\"muc_kicked\">Kicked: %s</string>\n\t<!-- Kicked from groupchat: \"Kicked by {admin name}: {reason} -->\n\t<string name=\"muc_kicked_by\">Kicked by %1$s: %2$s</string>\n\t<!-- Banned from groupchat: \"Banned: {reason} -->\n\t<string name=\"muc_banned\">Banned: %s</string>\n\t<!-- Banned from groupchat: \"Banned by {admin name}: {reason} -->\n\t<string name=\"muc_banned_by\">Banned by %1$s: %2$s</string>\n\n\t<!-- File upload -->\n\t<string name=\"roster_contextmenu_send\">Send…</string>\n\t<string name=\"roster_contextmenu_take_image\">Take picture</string>\n\t<string name=\"roster_contextmenu_send_image\">Choose picture</string>\n\t<string name=\"roster_contextmenu_send_file\">Send file</string>\n\t<string name=\"upload_compress\">Compressing picture…</string>\n\t<string name=\"upload_uploading\">Uploading…</string>\n\t<string name=\"upload_too_large\">file too large!</string>\n\t<string name=\"storage_permission\">%s needs storage access to send files!</string>\n\t<string name=\"notification_permission_denied\">Notifications are disabled in the Android app preferences.</string>\n\n\t<!-- Search -->\n\t<string name=\"search_msg_hint\">Message content</string>\n\n\t<!-- MUC bookmarks -->\n\t<string name=\"group_bookmarks\">My group chats</string>\n\t<string name=\"group_mucsearch\">Public group chats</string>\n\t<!-- Service Discovery -->\n\t<string name=\"title_service_disco\">Browser: %s</string>\n\n\t<!-- Android 9 notification preferences: permanent notification -->\n\t<string name=\"notification_status\">Foreground service</string>\n\t<!-- Android 9 notification preferences: message notifications -->\n\t<string name=\"notification_msg\">Messages</string>\n\n</resources>\n"
  },
  {
    "path": "res/values-it/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"app_name\">yaxim</string>\n\t<string name=\"app_name_bruno\">Bruno</string>\n\n\t<!-- Connection state -->\n\t<string name=\"conn_title\">yaxim: %s</string>\n\t<string name=\"conn_title_bruno\">Bruno: %s</string>\n\t<string name=\"conn_connecting\">Connessione al server…</string>\n\t<string name=\"conn_disconnecting\">Disconnessione…</string>\n\t<string name=\"conn_online\">Connesso</string>\n\t<string name=\"conn_offline\">Scollegato</string>\n\t<string name=\"conn_empty_roster\">Nessun contatto da mostrare!</string>\n\t<string name=\"conn_empty_roster_hints\">Ci sono molti modi per aggiungere contatti:\\n\\n - Android Beam™: tocca il telefono di un amico\\n\\n - Scansiona un QR code\\n\\n - \\\"Creando invito\\\" e condividilo (e-mail, SMS, QR code, …)\\n\\n - \\\"Aggiungi contatto\\\" se conosci il suo JID</string>\n\t<string name=\"conn_reconnect\">Nuovo tentativo di connessione tra %d secondi.</string>\n\t<string name=\"conn_disconnected\">Connessione chiusa</string>\n\t<string name=\"conn_no_network\">Nessuna connessione di rete</string>\n\t<string name=\"conn_ping_timeout\">No response</string>\n\t<string name=\"conn_error\">Errore: %s</string>\n\n\t<!-- Global Strings -->\n\t<string name=\"Global_Exit\">Esci</string>\n\t<string name=\"Global_authenticate_first\">Prima è necessario connettersi</string>\n\t<string name=\"Global_JID_hint\">utente@yax.im</string>\n\t<!-- tooltip message when the user entered an invalid XMPP address -->\n\t<string name=\"Global_JID_malformed\">Controlla il formato dell\\'indirizzo!</string>\n\n\t<!-- FirstStartUpDialog -->\n\t<string name=\"StartupDialog_Title\">Benvenuto in yaxim!</string>\n\t<string name=\"StartupDialog_Summary\">È necessario configurare yaxim prima di poterlo usare. Inserisci il tuo ID Jabber e la tua password.</string>\n\t<string name=\"StartupDialog_pwHint\">Inserisci la password</string>\n\t<string name=\"StartupDialog_pwshowHint\">Mostra la password</string>\n\t<string name=\"StartupDialog_Username_title\">Jabber ID:</string>\n\t<string name=\"StartupDialog_passwd_title\">Password:</string>\n\t<string name=\"StartupDialog_advanced\">Avanzate…</string>\n\t<string name=\"StartupDialog_create_new\">Registra un nuovo account</string>\n\t<string name=\"StartupDialog_error_password\">La password è troppo corta!</string>\n\t<string name=\"StartupDialog_created_password\">Creata password sicura</string>\n\t<string name=\"StartupDialog_auth_failed\">Controllare nome utente e password</string>\n\t<string name=\"StartupDialog_server_failed\">Could not connect to %s!</string>\n\t<string name=\"StartupDialog_no_registration\">Server does not allow registration!</string>\n\n\t<string name=\"StartupDialog_invitation\">You have been invited to Jabber. Please complete your registration.</string>\n\t<string name=\"StartupDialog_no_more_accounts\">No additional account supported!</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_message\">Messaggio da %s</string>\n\t<string name=\"notification_anonymous_message\">Messaggio ricevuto</string>\n\t<!--  Group Chat notification, %1$s is the user name, %2$s is the room, e.g. \"{Ge0rG} in {yaxim Chat}\" -->\n\t<string name=\"notification_muc_message\">%1$s in %2$s</string>\n\t<!--  Group Group Chat private message notification, %1$s is the user name, %2$s is the room, e.g. \"Message from {Ge0rG} in {yaxim Chat}\" -->\n\t<!--string name=\"notification_muc_pm\">Message from %1$s in %2$s</string-->\n\t<!-- notification button: direct reply (make SHORT string) -->\n\t<string name=\"notification_reply\">Rispondi</string>\n\t<!-- notification button: mark as read (make SHORT string) -->\n\t<string name=\"notification_mark_read\">Segna come letto</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_error\">Errore durante l\\'invio del messaggio!</string>\n\n\t<!-- Notification Settings -->\n\t<string name=\"preftitle_notify\">Notification Settings</string>\n\t<string name=\"preftitle_notify_msg\">Notifica messaggi</string>\n\t<string name=\"preftitle_notify_muc\">Notifica conversazione di gruppo</string>\n\t<string name=\"notification_custom\">Custom Ringtone</string>\n\t<string name=\"muc_highlight_title\">Notifica sono se menzionato</string>\n\t<string name=\"muc_highlight_sum\">Notifica se il tuo soprannone viene menzionato in una stanza</string>\n\t<string name=\"led_title\">Lampeggia LED</string>\n\t<string name=\"led_summ\">LED lampeggiante per i messaggi in arrivo</string>\n\t<string name=\"vibr_title\">Vibrazione</string>\n\t<string name=\"vibr_summ\">Vibrazione per i messaggi in arrivo</string>\n\t<string-array name=\"vibr_values_displayed\">\n\t\t<item>Mai</item>\n\t\t<item>Preferenze di sistema</item>\n\t\t<item>Sempre</item>\n\t</string-array>\n\t<string name=\"ringtone_title\">Suoneria</string>\n\t<string name=\"ringtone_summ\">Suono per i messaggi in arrivo</string>\n\t<string name=\"ticker_title\">Anteprima del messaggio</string>\n\t<string name=\"ticker_summ\">Visualizza il mittente e il messaggio nella barra di stato</string>\n\n\t<!-- Startup Setting Strings -->\n\t<string name=\"preftitle_general\">Impostazioni generali</string>\n\t<string name=\"pref_dnd_when_silent\">\"Non disturbare\" in modalità silenziosa</string>\n\t<string name=\"pref_dnd_when_silent_summ\">Imposta il tuo stato in linea a \\\"DND\\\" (non disturbare) quando il telefono è in modalità silenziosa</string>\n\t<string name=\"statuspopup_name\">Imposta il tuo stato</string>\n\t<string name=\"showOffline_summ\">Mostra sempre tutti i contatti nella lista</string>\n\t<string name=\"showOffline_title\">Mostra contatti offline</string>\n\t<string name=\"enableGroups_summ\">Ordina i tuoi contatti secondo i loro gruppi</string>\n\t<string name=\"enableGroups_title\">Mostra i gruppi dei contatti</string>\n\t<string name=\"foregroundService_summ\">Keep app in memory to ensure always-on connection (foreground service)</string>\n\t<string name=\"foregroundService_title\">Icona barra di stato</string>\n\n\t<string name=\"preftitle_debug\">Debug</string>\n\t<string name=\"smackdebug_summ\">Output dei pacchetti e del debug via logcat (può contenere informazioni personali)</string>\n\t<string name=\"smackdebug_title\">Debug SMACK</string>\n\n\t<string name=\"reportcrash_title\">Invia rapporti sui crash</string>\n\t<string name=\"reportcrash_summ\">Invia report anonimi sui crash allo sviluppatore</string>\n\n\t<!-- Appearence Strings -->\n\t<string name=\"preftitle_app\">Aspetto</string>\n\t<string name=\"FontChat_title\">Dimensioni del carattere per la chat</string>\n\t<string name=\"FontChat_summ\">Imposta le dimensioni del carattere per la chat</string>\n\t<string name=\"FontChat_dialog\">Dimensioni del carattere per la chat</string>\n\t<!--\n\t<string name=\"FontRost_title\">Roster font size</string>\n\t<string name=\"FontRost_summ\">Set roster font size</string>\n\t<string name=\"FontRost_dialog\">Roster font fize</string>\n\t<string name=\"setFontRoster\">Set roster font size</string>\n\t-->\n\t<string name=\"pref_theme\">Tema</string>\n\t<string name=\"pref_theme_dark\">Scuro</string>\n\t<string name=\"pref_theme_light\">Chiaro</string>\n\t<string name=\"pref_theme_pine\">Pino</string>\n\t<string name=\"pref_theme_ice\">Ghiaccio</string>\n\t<string name=\"preftitle_ui\">Aspetto</string>\n\t<string-array name=\"fontSizesChat\">\n\t\t<item>piccolo</item>\n\t\t<item>normale</item>\n\t\t<item>grande</item>\n\t\t<item>enorme</item>\n\t</string-array>\n\n\t<!-- Mainmenu \t-->\n\t<string name=\"Menu_addFriend\">Aggiungi contatto</string>\n\t<string name=\"Menu_addClipboard\">Add %s</string>\n\t<string name=\"Menu_ShowOff\">Mostra disconnesso</string>\n\t<string name=\"Menu_HideOff\">Nascondi disconnesso</string>\n\t<string name=\"Menu_AccSettings\">Modifica account</string>\n\t<string name=\"Menu_Settings\">Impostazioni</string>\n\t<string name=\"Menu_Status\">Stato</string>\n\t<string name=\"Menu_connect\">Connetti</string>\n\t<string name=\"Menu_disconnect\">Disconnetti</string>\n\t<string name=\"Menu_about\">Informazioni su yaxim</string>\n\t<string name=\"Menu_about_bruno\">About Bruno</string>\n\t<string name=\"Menu_muc\">Add / browse…</string>\n\t<string name=\"Menu_matrix\">Enter the Matrix…</string>\n\t<string name=\"Menu_mark_all_as_read\">Segna tutti come letti</string>\n\t<string name=\"Menu_send_invitation\">Crea invito</string>\n    <string name=\"Menu_userlist\">Partecipanti</string>\n\n\n\t<!-- AddFriend -->\n\t<string name=\"addFriend_Title\">Aggiungi un contatto</string>\n\t<string name=\"addFriend_Summ\">Inserisci l\\'ID Jabber del contatto, il soprannome desiderato e scegli il gruppo in cui inserirlo!</string>\n\t<string name=\"addFriend_aliasHint\">Soprannome</string>\n\t<string name=\"addrosteritemaddgroupchoice\">Aggiungi ad un nuovo gruppo</string>\n\t<string name=\"NewGroup_EditTextField_Hint\">Nome del nuovo gruppo</string>\n\n\t<!-- Roster CONTEXTMENU -->\n\t<string name=\"roster_contextmenu_group_rename\">Rinomina gruppo</string>\n\t<string name=\"roster_contextmenu_contact_mark_as_read\">Segna come già letto</string>\n\t<string name=\"roster_contextmenu_contact_delete\">Elimina contatto</string>\n\t<string name=\"roster_contextmenu_contact_delmsg\">Cancella cronologia conversazione</string>\n\t<string name=\"roster_contextmenu_contact_rename\">Rinomina</string>\n\t<string name=\"roster_contextmenu_contact_request_auth\">Richiesta autorizzazione</string>\n\t<string name=\"roster_contextmenu_contact_change_group\">Cambia gruppo</string>\n\t<string name=\"roster_contextmenu_contact_share\">Condividi indirizzo</string>\n\t<string name=\"roster_contextmenu_contact_ringtone\">Suoneria</string>\n\t<string name=\"roster_contextmenu_muc_edit\">Modifica conversazione di gruppo</string>\n\t<string name=\"roster_contextmenu_muc_leave\">Abbandona conversazione di gruppo</string>\n\t<string name=\"muc_leave_question\">Sicuri di voler uscire da %s?</string>\n\n\t<!-- Accountprefs -->\n\t<string name=\"account_settings_login\">Informazioni utente</string>\n\t<string name=\"account_settings_title\">Impostazioni account</string>\n\t<string name=\"account_options_title\">Opzioni di connessione</string>\n\t<string name=\"account_options_advanced\">Opzioni avanzate</string>\n\t<string name=\"carbons_title\">Messagggio Carbons (XEP-0280)</string>\n\t<string name=\"carbons_summ\">Richiedi copie di messaggi da tuoi altri accreditamenti</string>\n\t<string name=\"account_jabberID_title\">ID Jabber</string>\n\t<string name=\"account_jabberID_sum\">esempio: io@jabber.esempio.it</string>\n\t<string name=\"account_jabberID_dialog_title\">Inserisci il tuo ID Jabber:</string>\n\t<string name=\"account_jabberPW_title\">Password dell\\'account</string>\n\t<string name=\"account_jabberPW_sum\">La password del tuo account Jabber</string>\n\t<string name=\"account_jabberPW_change_on_server\">Cambia la password sul server</string>\n\t<string name=\"account_jabberPW_password_old\">Vecchia password:</string>\n\t<string name=\"account_jabberPW_password_new\">Nuova password:</string>\n\t<string name=\"account_jabberPW_warning\">ATTENZIONE! Perché l\\'accesso avvenga con successo, devi anche impostare la stessa password sul server!</string>\n\t<string name=\"account_jabberPW_progress\">Aspetta, per piacere. Cambio della password in corso...</string>\n\t<string name=\"account_jabberPW_finished\">Password cambiata con successo.</string>\n\t<string name=\"account_jabberPW_error\">Errore durante il cambio della password: %s</string>\n\t<string name=\"account_nickname_title\">Display Name</string>\n\t<string name=\"account_nickname_summ\">Your nickname displayed to other users</string>\n\t\n\t<!-- accountprefs -->\n\t<string name=\"account_resource_title\">Risorsa del client</string>\n\t<string name=\"account_resource_summ\">Predefinito: yaxim</string>\n\t<string name=\"account_resource_dialog_title\">Inserisci la risorsa:</string>\n\t<string name=\"account_resource_hint\">yaxim</string>\n\t<string name=\"account_prio_title\">Priorità del client</string>\n\t<string name=\"account_prio_summ\">Default: 0 (ammessi: -128 .. 127)</string>\n\t<string name=\"account_prio_error\">Valori permessi: -128 .. 127</string>\n\t<string name=\"account_prio_dialog_title\">Inserisci la priorità:</string>\n\t<string name=\"account_port_title\">Porta del server</string>\n\t<string name=\"account_port_sum\">Predefinita: 5222</string>\n\t<string name=\"account_port_dialog_title\">Inserisci la porta del server:</string>\n\t<string name=\"account_port_hint\">5222</string>\n\t<string name=\"account_customserver_title\">Server personalizzato</string>\n\t<string name=\"account_customserver_summ\">(Opzionale) Nome server alternativo</string>\n\t<string name=\"account_customserver_dialog_title\">Inserisci il nome del server:</string>\n\t<string name=\"account_customserver_hint\">host.exempio.it</string>\n\t<string name=\"require_ssl_title\">Richiedi SSL/TLS</string>\n\t<string name=\"require_ssl_summ\">Cifra sempre la connessione</string>\n\n\t<!--StatusPopUp-->\n\t<string name=\"AddContact_SpinnerPrompt\">Scegli gruppo</string>\n\t<string name=\"setStatusmsgHint\">Il tuo messaggio di stato</string>\n\t<string name=\"setStatusTitle\">Imposta il tuo stato</string>\n\t<string name=\"RenameGroup_summ\">Rinomina gruppo %s:</string>\n\t<string name=\"RenameGroup_title\">Rinomina gruppo</string>\n\t<string name=\"RenameEntry_summ\">Rinomina %1$s (%2$s) in:</string>\n\t<string name=\"RenameEntry_title\">Rinomina contatto</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_summ\">Scegli un gruppo dalla casella sotto</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_title\">Cambia gruppo</string>\n\t<string name=\"deleteRosterItem_text\">Vuoi veramente eliminare %1$s (%2$s)?</string>\n\t<string name=\"deleteRosterItem_title\">Elimina contatto</string>\n\t<string name=\"deleteChatHistory_text\">Rimuovere definitivamente tutti i messaggi con %1$s (%2$s)?</string>\n\t<string name=\"deleteChatHistory_title\">Cancella la cronologia della chat</string>\n\t<string name=\"subscriptionRequest_text\">%1$s vuole aggiungerti come contatto: \\\"%2$s\\\"</string>\n\t<string name=\"subscriptionRequest_title\">Richiesta di abbonamento</string>\n\t<string name=\"subscription_accept\">Accetta</string>\n\t<string name=\"subscription_reject\">Rifiuta</string>\n\t<string name=\"subscription_reject_all\">Reject all</string>\n\t<string name=\"subscription_status_from\">può vedere il tuo stato</string>\n\n\t<!-- CHATWINDOW -->\n\t<string name=\"chat_from_me\">Io:</string>\n\t<string name=\"toast_stored_offline\">Il messaggio sarà trasmesso più tardi</string>\n\t<string name=\"chat_enterMsgHint\">Inserisci il messaggio</string> \n\n\t<!-- Message context menu; use the verb form (to quote) -->\n\t<string name=\"chatmenu_quote\">Cita</string>\n\t<!-- Message context menu: repeat the same message -->\n\t<string name=\"chatmenu_resend\">Edit message</string>\n\n\t<!-- GPS settings -->\n\t<!--\n\t<string name=\"showGPS_title\">GPS to status</string>\n\t<string name=\"showGPS_summ_on\">GPS is send to StatusMessage</string>\n\t<string name=\"showGPS_summ_off\">GPS is send to StatusMessage</string>\n\t-->\n\n\t<!-- About Dialog -->\n\t<string name=\"AboutDialog_title\">Informazioni su yaxim</string>\n\t<string name=\"AboutDialog_DevelopersTitle\">Sviluppatori</string>\n\t<!-- Contact the developer button -->\n\t<string name=\"AboutDialog_DevelopersText\">Contatto</string>\n\t<string name=\"AboutDialog_LicenceTitle\">Licenza</string>\n\t<string name=\"AboutDialog_Vote\">Valuta l\\'app</string>\n\t<string name=\"AboutDialog_LicenceText\">This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. Link: http://www.gnu.org/licenses/gpl-2.0.html\\n \\n Parts of this software are provided under the MIT License:\\n \\n Copyright © 2009 Mads Kristiansen, Nullwire ApS\\n \\n Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: \\n The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. \\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTW</string>\n\n\t<string name=\"status_available\">Connesso</string>\n\t<string name=\"status_away\">Assente</string>\n\t<string name=\"status_chat\">Libero</string>\n\t<string name=\"status_dnd\">Non disturbare</string>\n\t<string name=\"status_xa\">Non disponibile</string>\n\t<string name=\"status_offline\">Scollegato</string>\n\n\t<string name=\"translator_credits\">Launchpad Contributions:\n  Ema987 https://launchpad.net/~ema987\n  Georg Lukas https://launchpad.net/~ge0rg\n  Gianfranco Frisani https://launchpad.net/~gfrisani\n  Guybrush88 https://launchpad.net/~guybrush\n  Lorenzo J. Lucchini https://launchpad.net/~ljl\n  Marco Ciampa https://launchpad.net/~ciampix\n  Pietro Pecchi https://launchpad.net/~pietro-pecchi\n  SILVIO BARLETTA https://launchpad.net/~ik1bqd</string>\n\n\t<!-- default roster group with no name -->\n\t<string name=\"default_group\">Generale</string>\n\t<string name=\"all_contacts_group\">Tutti i contatti</string>\n\t<string name=\"muc_group\">Conversazione di gruppo</string>\n\n\t<!-- SEND listener popup -->\n\t<string name=\"chooseContact\">Scegli il contatto</string>\n\t<string name=\"action_settings\">Impostazioni</string>\n\n\t<!-- MUC strings -->\n\t<string name=\"muc_jid_hint\">JID della conversazione di gruppo</string>\n\t<string name=\"muc_nickname_hint\">Soprannome</string>\n\t<string name=\"muc_password_hint\">Password (opzionale)</string>\n\t<string name=\"title_activity_muc_invite\">Invito a conversazione di gruppo</string>\n\t<!-- Groupchat invitation: \"Invitation from {contact name}\" -->\n\t<string name=\"muc_invitation_from\">Invito da %s</string>\n\t<!-- Groupchat info: {description} ({number} participants) -->\n\t<string name=\"muc_invitation_occupants\">%1$s (%2$d partecipanti)</string>\n\t<!-- Notification button: \"Join as {default nickname}\" (make SHORT string) -->\n\t<string name=\"muc_invitation_join\">Unisciti come %s</string>\n\t<string name=\"muc_synchronizing\">Sincronizzazione…</string>\n\t<!-- Title of user list, contains JID -->\n\t<string name=\"chat_muc_userlist\">Partecipanti alla conversazione di gruppo (%s)</string>\n\t<!-- Kicked from groupchat: \"Kicked: {reason} -->\n\t<string name=\"muc_kicked\">Cacciato: %s</string>\n\t<!-- Kicked from groupchat: \"Kicked by {admin name}: {reason} -->\n\t<string name=\"muc_kicked_by\">Cacciato da %1$s: %2$s</string>\n\t<!-- Banned from groupchat: \"Banned: {reason} -->\n\t<string name=\"muc_banned\">Bannato: %s</string>\n\t<!-- Banned from groupchat: \"Banned by {admin name}: {reason} -->\n\t<string name=\"muc_banned_by\">Bannato da %1$s: %2$s</string>\n\n\t<!-- File upload -->\n\t<string name=\"roster_contextmenu_send\">Invia...</string>\n\t<string name=\"roster_contextmenu_take_image\">Fai una foto</string>\n\t<string name=\"roster_contextmenu_send_image\">Scegli la foto</string>\n\t<string name=\"roster_contextmenu_send_file\">Invia un file</string>\n\t<string name=\"upload_compress\">Compressione immagine...</string>\n\t<string name=\"upload_uploading\">Caricamento...</string>\n\t<string name=\"upload_too_large\">file troppo grande!</string>\n\t<string name=\"storage_permission\">%s needs storage access to send files!</string>\n\t<string name=\"notification_permission_denied\">Notifications are disabled in the Android app preferences.</string>\n\n\t<!-- Search -->\n\t<string name=\"search_msg_hint\">Message content</string>\n\n\t<!-- MUC bookmarks -->\n\t<string name=\"group_bookmarks\">My group chats</string>\n\t<string name=\"group_mucsearch\">Public group chats</string>\n\t<!-- Service Discovery -->\n\t<string name=\"title_service_disco\">Browser: %s</string>\n\n\t<!-- Android 9 notification preferences: permanent notification -->\n\t<string name=\"notification_status\">Foreground service</string>\n\t<!-- Android 9 notification preferences: message notifications -->\n\t<string name=\"notification_msg\">Messages</string>\n\n</resources>\n"
  },
  {
    "path": "res/values-ja/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"app_name\">yaxim</string>\n\t<string name=\"app_name_bruno\">Bruno</string>\n\n\t<!-- Connection state -->\n\t<string name=\"conn_title\">yaxim: %s</string>\n\t<string name=\"conn_title_bruno\">Bruno: %s</string>\n\t<string name=\"conn_connecting\">サーバーに接続しています…</string>\n\t<string name=\"conn_disconnecting\">切断しています…</string>\n\t<string name=\"conn_online\">オンライン</string>\n\t<string name=\"conn_offline\">オフライン</string>\n\t<string name=\"conn_empty_roster\">連絡先はありません!</string>\n\t<string name=\"conn_empty_roster_hints\">連絡先を追加する方法はたくさんあります:\\n\\n - Android ビーム™: 友達の電話にタッチ\\n\\n - QR コードをスキャン\\n\\n - \\\"招待を作成\" して共有します (メール、SMS、QR コード …)\\n\\n - JID が分かっている場合は \\\"連絡先を追加\\\"</string>\n\t<string name=\"conn_reconnect\">%d 秒後に接続します</string>\n\t<string name=\"conn_disconnected\">接続が閉じられました</string>\n\t<string name=\"conn_no_network\">ネットワークに接続されていません</string>\n\t<string name=\"conn_ping_timeout\">応答がありません</string>\n\t<string name=\"conn_error\">エラー: %s</string>\n\n\t<!-- Global Strings -->\n\t<string name=\"Global_Exit\">終了</string>\n\t<string name=\"Global_authenticate_first\">先に接続してください</string>\n\t<string name=\"Global_JID_hint\">user@yax.im</string>\n\t<!-- tooltip message when the user entered an invalid XMPP address -->\n\t<string name=\"Global_JID_malformed\">アドレスの形式を確認してください!</string>\n\n\t<!-- FirstStartUpDialog -->\n\t<string name=\"StartupDialog_Title\">yaximへようこそ！</string>\n\t<string name=\"StartupDialog_Summary\">yaxim を使用する前に、yaxim を設定する必要があります。 あなたの Jabber ID とパスワードを入力してください。</string>\n\t<string name=\"StartupDialog_pwHint\">パスワードを入力</string>\n\t<string name=\"StartupDialog_pwshowHint\">パスワードを表示</string>\n\t<string name=\"StartupDialog_Username_title\">Jabber ID:</string>\n\t<string name=\"StartupDialog_passwd_title\">パスワード：</string>\n\t<string name=\"StartupDialog_advanced\">詳細…</string>\n\t<string name=\"StartupDialog_create_new\">新しいアカウントを登録</string>\n\t<string name=\"StartupDialog_error_password\">パスワードが短すぎます!</string>\n\t<string name=\"StartupDialog_created_password\">安全なパスワードを作成しました</string>\n\t<string name=\"StartupDialog_auth_failed\">ユーザー名とパスワードを確認してください!</string>\n\t<string name=\"StartupDialog_server_failed\">%s に接続できませんでした!</string>\n\t<string name=\"StartupDialog_no_registration\">サーバーが登録を許可していません!</string>\n\n\t<string name=\"StartupDialog_invitation\">Jabber に招待されました。登録を完了してください。</string>\n\t<string name=\"StartupDialog_no_more_accounts\">追加のアカウントはサポートされていません!</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_message\">%s さんからのメッセージ</string>\n\t<string name=\"notification_anonymous_message\">メッセージを受信しました</string>\n\t<!--  Group Chat notification, %1$s is the user name, %2$s is the room, e.g. \"{Ge0rG} in {yaxim Chat}\" -->\n\t<string name=\"notification_muc_message\">%2$s の %1$s</string>\n\t<!--  Group Group Chat private message notification, %1$s is the user name, %2$s is the room, e.g. \"Message from {Ge0rG} in {yaxim Chat}\" -->\n\t<!--string name=\"notification_muc_pm\">Message from %1$s in %2$s</string-->\n\t<!-- notification button: direct reply (make SHORT string) -->\n\t<string name=\"notification_reply\">返信</string>\n\t<!-- notification button: mark as read (make SHORT string) -->\n\t<string name=\"notification_mark_read\">既読にする</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_error\">メッセージの送信中にエラーが発生しました!</string>\n\n\t<!-- Notification Settings -->\n\t<string name=\"preftitle_notify\">通知設定</string>\n\t<string name=\"preftitle_notify_msg\">メッセージの通知</string>\n\t<string name=\"preftitle_notify_muc\">グループチャｔット通知</string>\n\t<string name=\"notification_custom\">カスタムの着信音</string>\n\t<string name=\"muc_highlight_title\">メンション時のみ通知</string>\n\t<string name=\"muc_highlight_sum\">ルームであなたのニックネームがメンションされた時に通知します</string>\n\t<string name=\"led_title\">LED点滅</string>\n\t<string name=\"led_summ\">メッセージの受信時に LED を点滅します</string>\n\t<string name=\"vibr_title\">振動</string>\n\t<string name=\"vibr_summ\">メッセージ受信時に振動します</string>\n\t<string-array name=\"vibr_values_displayed\">\n\t\t<item>しない</item>\n\t\t<item>システム設定</item>\n\t\t<item>常に</item>\n\t</string-array>\n\t<string name=\"ringtone_title\">着信音</string>\n\t<string name=\"ringtone_summ\">メッセージ受信時の着信音を選択</string>\n\t<string name=\"ticker_title\">メッセージプレビュー</string>\n\t<string name=\"ticker_summ\">ステータスバーに送信者とメッセージを表示する</string>\n\n\t<!-- Startup Setting Strings -->\n\t<string name=\"preftitle_general\">全般設定</string>\n\t<string name=\"pref_dnd_when_silent\">サイレントモード時 \\\"取り込み中\\\"</string>\n\t<string name=\"pref_dnd_when_silent_summ\">お使いの電話がサイレントモードの時に、オンラインステータスを \\\"取り込み中\\\" に設定します</string>\n\t<string name=\"statuspopup_name\">ステータスを設定</string>\n\t<string name=\"showOffline_summ\">常にすべての連絡先を名簿に表示する</string>\n\t<string name=\"showOffline_title\">オフラインの連絡先を表示する</string>\n\t<string name=\"enableGroups_summ\">連絡先をグループ別に整理する</string>\n\t<string name=\"enableGroups_title\">連絡先グループを表示する</string>\n\t<string name=\"foregroundService_summ\">アプリをメモリ上に残して常時接続を確保する (フォアグラウンドサービス)</string>\n\t<string name=\"foregroundService_title\">ステータスバーアイコン</string>\n\n\t<string name=\"preftitle_debug\">デバッグ</string>\n\t<string name=\"smackdebug_summ\">logcat によるパケットとデバッグ出力 (個人情報を含む場合があります)</string>\n\t<string name=\"smackdebug_title\">SMACK デバッグ</string>\n\n\t<string name=\"reportcrash_title\">クラッシュレポートを送信</string>\n\t<string name=\"reportcrash_summ\">開発者に匿名のクラッシュレポートを送信します</string>\n\n\t<!-- Appearence Strings -->\n\t<string name=\"preftitle_app\">外観</string>\n\t<string name=\"FontChat_title\">チャットのフォントサイズ</string>\n\t<string name=\"FontChat_summ\">チャットのフォントサイズを設定します</string>\n\t<string name=\"FontChat_dialog\">チャットのフォントサイズ</string>\n\t<!--\n\t<string name=\"FontRost_title\">Roster font size</string>\n\t<string name=\"FontRost_summ\">Set roster font size</string>\n\t<string name=\"FontRost_dialog\">Roster font fize</string>\n\t<string name=\"setFontRoster\">Set roster font size</string>\n\t-->\n\t<string name=\"pref_theme\">テーマ</string>\n\t<string name=\"pref_theme_dark\">ダーク</string>\n\t<string name=\"pref_theme_light\">ライト</string>\n\t<string name=\"pref_theme_pine\">パイン</string>\n\t<string name=\"pref_theme_ice\">アイス</string>\n\t<string name=\"preftitle_ui\">外観</string>\n\t<string-array name=\"fontSizesChat\">\n\t\t<item>小</item>\n\t\t<item>標準</item>\n\t\t<item>大</item>\n\t\t<item>最大</item>\n\t</string-array>\n\n\t<!-- Mainmenu \t-->\n\t<string name=\"Menu_addFriend\">連絡先を追加</string>\n\t<string name=\"Menu_addClipboard\">%s を追加</string>\n\t<string name=\"Menu_ShowOff\">オフラインを表示する</string>\n\t<string name=\"Menu_HideOff\">オフラインを非表示</string>\n\t<string name=\"Menu_AccSettings\">アカウントを編集</string>\n\t<string name=\"Menu_Settings\">設定</string>\n\t<string name=\"Menu_Status\">ステータス</string>\n\t<string name=\"Menu_connect\">接続</string>\n\t<string name=\"Menu_disconnect\">切断</string>\n\t<string name=\"Menu_about\">yaxim について</string>\n\t<string name=\"Menu_about_bruno\">Bruno について</string>\n\t<string name=\"Menu_muc\">追加 / 参照…</string>\n\t<string name=\"Menu_matrix\">マトリックスを入力…</string>\n\t<string name=\"Menu_mark_all_as_read\">すべて既読にする</string>\n\t<string name=\"Menu_send_invitation\">招待状を作成</string>\n    <string name=\"Menu_userlist\">参加者</string>\n\n\n\t<!-- AddFriend -->\n\t<string name=\"addFriend_Title\">連絡先を追加</string>\n\t<string name=\"addFriend_Summ\">友達の Jabber ID と希望の画面名を入力して、連絡先グループを選択してください!</string>\n\t<string name=\"addFriend_aliasHint\">画面名</string>\n\t<string name=\"addrosteritemaddgroupchoice\">新しいグループに追加</string>\n\t<string name=\"NewGroup_EditTextField_Hint\">新しいグループの名前</string>\n\n\t<!-- Roster CONTEXTMENU -->\n\t<string name=\"roster_contextmenu_group_rename\">グループ名を変更</string>\n\t<string name=\"roster_contextmenu_contact_mark_as_read\">既読にする</string>\n\t<string name=\"roster_contextmenu_contact_delete\">連絡先を削除</string>\n\t<string name=\"roster_contextmenu_contact_delmsg\">チャット履歴を削除</string>\n\t<string name=\"roster_contextmenu_contact_rename\">名前を変更</string>\n\t<string name=\"roster_contextmenu_contact_request_auth\">認証のリクエスト</string>\n\t<string name=\"roster_contextmenu_contact_change_group\">グループを変更</string>\n\t<string name=\"roster_contextmenu_contact_share\">アドレスを共有</string>\n\t<string name=\"roster_contextmenu_contact_ringtone\">着信音</string>\n\t<string name=\"roster_contextmenu_muc_edit\">グループチャットを編集</string>\n\t<string name=\"roster_contextmenu_muc_leave\">グループチャットを離れる</string>\n\t<string name=\"muc_leave_question\">%s を離れてもよろしいですか?</string>\n\n\t<!-- Accountprefs -->\n\t<string name=\"account_settings_login\">ログイン情報</string>\n\t<string name=\"account_settings_title\">アカウント設定</string>\n\t<string name=\"account_options_title\">接続オプション</string>\n\t<string name=\"account_options_advanced\">詳細オプション</string>\n\t<string name=\"carbons_title\">メッセージカーボン (XEP-0280)</string>\n\t<string name=\"carbons_summ\">他のクライアントからメッセージのコピーをリクエストします</string>\n\t<string name=\"account_jabberID_title\">Jabber ID</string>\n\t<string name=\"account_jabberID_sum\">例: me@jabber.example.com</string>\n\t<string name=\"account_jabberID_dialog_title\">Jabber ID を入力:</string>\n\t<string name=\"account_jabberPW_title\">アカウントのパスワード</string>\n\t<string name=\"account_jabberPW_sum\">Jabber アカウントのパスワード</string>\n\t<string name=\"account_jabberPW_change_on_server\">サーバーのパスワードを変更</string>\n\t<string name=\"account_jabberPW_password_old\">前のパスワード:</string>\n\t<string name=\"account_jabberPW_password_new\">新しいパスワード:</string>\n\t<string name=\"account_jabberPW_warning\">警告! 正常に ログインするには、サーバー上と同じパスワードを設定する必要があります。</string>\n\t<string name=\"account_jabberPW_progress\">お待ちください。パスワードを変更しています…</string>\n\t<string name=\"account_jabberPW_finished\">パスワードを変更しました。</string>\n\t<string name=\"account_jabberPW_error\">パスワードの変更時にエラーが発生しました: %s</string>\n\t<string name=\"account_nickname_title\">表示名</string>\n\t<string name=\"account_nickname_summ\">他のユーザーに表示されるニックネーム</string>\n\t\n\t<!-- accountprefs -->\n\t<string name=\"account_resource_title\">クライアント リソース</string>\n\t<string name=\"account_resource_summ\">デフォルト: yaxim</string>\n\t<string name=\"account_resource_dialog_title\">リソースを入力してください:</string>\n\t<string name=\"account_resource_hint\">yaxim</string>\n\t<string name=\"account_prio_title\">クライアントの優先度</string>\n\t<string name=\"account_prio_summ\">デフォルト: 0 (可能な範囲: -128 .. 127)</string>\n\t<string name=\"account_prio_error\">可能な範囲は: -128 .. 127</string>\n\t<string name=\"account_prio_dialog_title\">優先度を入力してください:</string>\n\t<string name=\"account_port_title\">サーバー ポート</string>\n\t<string name=\"account_port_sum\">デフォルト: 5222</string>\n\t<string name=\"account_port_dialog_title\">サーバーのポートを入力してください:</string>\n\t<string name=\"account_port_hint\">5222</string>\n\t<string name=\"account_customserver_title\">カスタムサーバー</string>\n\t<string name=\"account_customserver_summ\">(オプション) 代替のサーバーホスト名</string>\n\t<string name=\"account_customserver_dialog_title\">サーバーのホスト名を入力してください:</string>\n\t<string name=\"account_customserver_hint\">host.example.com</string>\n\t<string name=\"require_ssl_title\">SSL/TLS が必要</string>\n\t<string name=\"require_ssl_summ\">常にサーバー接続を暗号化する</string>\n\n\t<!--StatusPopUp-->\n\t<string name=\"AddContact_SpinnerPrompt\">グループを選択</string>\n\t<string name=\"setStatusmsgHint\">ステータスメッセージ</string>\n\t<string name=\"setStatusTitle\">ステータスを設定</string>\n\t<string name=\"RenameGroup_summ\">グループ %s の名前を変更:</string>\n\t<string name=\"RenameGroup_title\">グループ名を変更</string>\n\t<string name=\"RenameEntry_summ\">%1$s (%2$s) の名前を変更:</string>\n\t<string name=\"RenameEntry_title\">連絡先の名前を変更</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_summ\">下のスピナーからグループを選択</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_title\">グループを変更</string>\n\t<string name=\"deleteRosterItem_text\">%1$s (%2$s) を削除してもよろしいですか?</string>\n\t<string name=\"deleteRosterItem_title\">連絡先を削除</string>\n\t<string name=\"deleteChatHistory_text\">%1$s (%2$s) のメッセージをすべて削除してもよろしいですか?</string>\n\t<string name=\"deleteChatHistory_title\">チャット履歴を削除</string>\n\t<string name=\"subscriptionRequest_text\">%1$s さんがあなたを連絡先に追加したいと言っています: \\\"%2$s\\\"</string>\n\t<string name=\"subscriptionRequest_title\">登録のリクエスト</string>\n\t<string name=\"subscription_accept\">承認</string>\n\t<string name=\"subscription_reject\">拒否</string>\n\t<string name=\"subscription_reject_all\">すべて拒否</string>\n\t<string name=\"subscription_status_from\">あなたのステータスを参照可能</string>\n\n\t<!-- CHATWINDOW -->\n\t<string name=\"chat_from_me\">わたし:</string>\n\t<string name=\"toast_stored_offline\">メッセージが送信用に保存されています。</string>\n\t<string name=\"chat_enterMsgHint\">メッセージを入力</string> \n\n\t<!-- Message context menu; use the verb form (to quote) -->\n\t<string name=\"chatmenu_quote\">引用</string>\n\t<!-- Message context menu: repeat the same message -->\n\t<string name=\"chatmenu_resend\">メッセージを編集</string>\n\n\t<!-- GPS settings -->\n\t<!--\n\t<string name=\"showGPS_title\">GPS to status</string>\n\t<string name=\"showGPS_summ_on\">GPS is send to StatusMessage</string>\n\t<string name=\"showGPS_summ_off\">GPS is send to StatusMessage</string>\n\t-->\n\n\t<!-- About Dialog -->\n\t<string name=\"AboutDialog_title\">yaxim について</string>\n\t<string name=\"AboutDialog_DevelopersTitle\">開発者</string>\n\t<!-- Contact the developer button -->\n\t<string name=\"AboutDialog_DevelopersText\">連絡先</string>\n\t<string name=\"AboutDialog_LicenceTitle\">ライセンス</string>\n\t<string name=\"AboutDialog_Vote\">アプリを評価</string>\n\t<string name=\"AboutDialog_LicenceText\">このプログラムはフリーソフトウェアです。 フリーソフトウェア財団が公開する GNU General Public License バージョン 2 の規約の下で再配布したり、変更することができます。 リンク: http://www.gnu.org/licenses/gpl-2.0.html\\n \\n このソフトウェアの一部は、MIT ライセンスの下で提供されています:\\n \\n Copyright © 2009 Mads Kristiansen, Nullwire ApS\\n \\n Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: \\n The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. \\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</string>\n\n\t<string name=\"status_available\">オンライン</string>\n\t<string name=\"status_away\">離席中</string>\n\t<string name=\"status_chat\">チャットできます</string>\n\t<string name=\"status_dnd\">取り込み中</string>\n\t<string name=\"status_xa\">使用不可</string>\n\t<string name=\"status_offline\">オフライン</string>\n\n\t<string name=\"translator_credits\">Launchpad Contributions:\n  M. https://launchpad.net/~nbkhope\n  Naofumi Fukue https://launchpad.net/~naofum</string>\n\n\t<!-- default roster group with no name -->\n\t<string name=\"default_group\">一般</string>\n\t<string name=\"all_contacts_group\">すべての連絡先</string>\n\t<string name=\"muc_group\">グループチャット</string>\n\n\t<!-- SEND listener popup -->\n\t<string name=\"chooseContact\">連絡先を選択</string>\n\t<string name=\"action_settings\">設定</string>\n\n\t<!-- MUC strings -->\n\t<string name=\"muc_jid_hint\">グループチャット JID</string>\n\t<string name=\"muc_nickname_hint\">ニックネーム</string>\n\t<string name=\"muc_password_hint\">パスワード (オプション)</string>\n\t<string name=\"title_activity_muc_invite\">グループチャットの招待</string>\n\t<!-- Groupchat invitation: \"Invitation from {contact name}\" -->\n\t<string name=\"muc_invitation_from\">%s からの招待</string>\n\t<!-- Groupchat info: {description} ({number} participants) -->\n\t<string name=\"muc_invitation_occupants\">%1$s (%2$d 参加者)</string>\n\t<!-- Notification button: \"Join as {default nickname}\" (make SHORT string) -->\n\t<string name=\"muc_invitation_join\">%s として参加</string>\n\t<string name=\"muc_synchronizing\">同期しています…</string>\n\t<!-- Title of user list, contains JID -->\n\t<string name=\"chat_muc_userlist\">グループチャット参加者 (%s)</string>\n\t<!-- Kicked from groupchat: \"Kicked: {reason} -->\n\t<string name=\"muc_kicked\">キックしました: %s</string>\n\t<!-- Kicked from groupchat: \"Kicked by {admin name}: {reason} -->\n\t<string name=\"muc_kicked_by\">%1$s からキックされました: %2$s</string>\n\t<!-- Banned from groupchat: \"Banned: {reason} -->\n\t<string name=\"muc_banned\">禁止しました: %s</string>\n\t<!-- Banned from groupchat: \"Banned by {admin name}: {reason} -->\n\t<string name=\"muc_banned_by\">%1$s から禁止されました: %2$s</string>\n\n\t<!-- File upload -->\n\t<string name=\"roster_contextmenu_send\">送信…</string>\n\t<string name=\"roster_contextmenu_take_image\">写真を撮る</string>\n\t<string name=\"roster_contextmenu_send_image\">写真を選択</string>\n\t<string name=\"roster_contextmenu_send_file\">ファイルを送信</string>\n\t<string name=\"upload_compress\">写真を圧縮しています…</string>\n\t<string name=\"upload_uploading\">アップロードしています…</string>\n\t<string name=\"upload_too_large\">ファイルが大きすぎます!</string>\n\t<string name=\"storage_permission\">%s はファイルを送信するためにストレージのアクセスが必要です!</string>\n\t<string name=\"notification_permission_denied\">Notifications are disabled in the Android app preferences.</string>\n\n\t<!-- Search -->\n\t<string name=\"search_msg_hint\">メッセージの内容</string>\n\n\t<!-- MUC bookmarks -->\n\t<string name=\"group_bookmarks\">マイグループチャット</string>\n\t<string name=\"group_mucsearch\">公開グループチャット</string>\n\t<!-- Service Discovery -->\n\t<string name=\"title_service_disco\">ブラウザー: %s</string>\n\n\t<!-- Android 9 notification preferences: permanent notification -->\n\t<string name=\"notification_status\">フォアグラウンドサービス</string>\n\t<!-- Android 9 notification preferences: message notifications -->\n\t<string name=\"notification_msg\">メッセージ</string>\n\n</resources>\n"
  },
  {
    "path": "res/values-kn/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"app_name\">ಯಾಕ್ಸಿಂ</string>\n\t<string name=\"app_name_bruno\">ಭಾಲೂ</string>\n\n\t<!-- Connection state -->\n\t<string name=\"conn_title\">ಯಾಕ್ಸಿಂ: %s</string>\n\t<string name=\"conn_title_bruno\">ಭಾಲೂ: %s</string>\n\t<string name=\"conn_connecting\">ಸರ್ವರ್‌ಗೆ ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ…</string>\n\t<string name=\"conn_disconnecting\">ಸಂಪರ್ಕ ಕಡಿಸುತ್ತಾ…</string>\n\t<string name=\"conn_online\">ಉಪಸ್ಥಿತ</string>\n\t<string name=\"conn_offline\">ಅನುಪಸ್ಥಿತ</string>\n\t<string name=\"conn_empty_roster\">ತೋರಿಸಲು ಸಂಪರ್ಕಗಳಿಲ್ಲ!</string>\n\t<string name=\"conn_empty_roster_hints\">ಸಂಪರ್ಕಗಳನ್ನು ಸೇರಿಸಲು ಹಲವು ಮಾರ್ಗಗಳಿವೆ:\\n\\n - QR ಕೋಡ್ ಸ್ಕ್ಯಾನ್ ಮಾಡಿ\\n\\n - ಅನ್ವಯ ಮುಖ್ಯ ಪುಟದಲ್ಲಿ \\\"︙\\\" ಬಟ್ಟನ್ ಒಳಗೆ \\\"ಆಹ್ವಾನ ರಚಿಸು\\\" ಒತ್ತಿ ಮತ್ತು ಅದನ್ನು ಹಂಚಿಕೊಳ್ಳಿ (ಇ-ಮೇಲ್, SMS, QR ಕೋಡ್, …)\\n\\n - ನಿಮಗೆ JID ತಿಳಿದಿದ್ದರೆ \\\"ಸಂಪರ್ಕವನ್ನು ಸೇರಿಸು\\\" ಒತ್ತಿ</string>\n\t<string name=\"conn_reconnect\">ಮುಂದಿನ ಸಂಪರ್ಕ ಪ್ರಯತ್ನ %d ಕ್ಷಣಗಳಲ್ಲಿ.</string>\n\t<string name=\"conn_disconnected\">ಅಂತರ್ಜಾಲ ಸಂಪರ್ಕ ಮುಚ್ಚಲಾಗಿದೆ</string>\n\t<string name=\"conn_no_network\">ಅಂತರ್ಜಾಲ ಸಂಪರ್ಕ ಇಲ್ಲ</string>\n\t<string name=\"conn_ping_timeout\">ಪ್ರತಿಕ್ರಿಯೆ ಇಲ್ಲ</string>\n\t<string name=\"conn_error\">ದೋಷ: %s</string>\n\n\t<!-- Global Strings -->\n\t<string name=\"Global_Exit\">ನಿರ್ಗಮನ</string>\n\t<string name=\"Global_authenticate_first\">ದಯವಿಟ್ಟು ಮೊದಲು ಅಂತರ್ಜಾಲಕ್ಕೆ ಸಂಪರ್ಕಿಸಿ</string>\n\t<string name=\"Global_JID_hint\">ಬಳಕೆದಾರ@yax.im</string>\n\t<!-- tooltip message when the user entered an invalid XMPP address -->\n\t<string name=\"Global_JID_malformed\">ವಿಳಾಸ ಸ್ವರೂಪ ಪರಿಶೀಲಿಸಿ!</string>\n\n\t<!-- FirstStartUpDialog -->\n\t<string name=\"StartupDialog_Title\">ಯಾಕ್ಸಿಂ ಗೆ ಸುಸ್ವಾಗತ!</string>\n\t<string name=\"StartupDialog_Summary\">ಯಾಕ್ಸಿಂ ಬಳಸುವ ಮುನ್ನ ಖಾತೆ ಜೋಡಿಸಬೇಕು. ದಯವಿಟ್ಟು ನಿಮ್ಮ Jabber ID ಹಾಗು ಗುಪ್ತಪದ ಹಾಕಿ.</string>\n\t<string name=\"StartupDialog_pwHint\">ಗುಪ್ತಪದ ಒತ್ತಿ</string>\n\t<string name=\"StartupDialog_pwshowHint\">ಗುಪ್ತಪದ ತೋರಿಸು</string>\n\t<string name=\"StartupDialog_Username_title\">Jabber ID:</string>\n\t<string name=\"StartupDialog_passwd_title\">ಗುಪ್ತಪದ:</string>\n\t<string name=\"StartupDialog_advanced\">ತಿಳಿದವರ…</string>\n\t<string name=\"StartupDialog_create_new\">ಹೊಸ ಖಾತೆ ನೋಂದಿಸಿ</string>\n\t<string name=\"StartupDialog_error_password\">ಗುಪ್ತಪದ ತುಂಬಾ ಚಿಕ್ಕದು!</string>\n\t<string name=\"StartupDialog_created_password\">ಬದ್ಧ ಗುಪ್ತಪದ ಸೃಷ್ಟಿಸಲಾಯಿತು</string>\n\t<string name=\"StartupDialog_auth_failed\">ದಯವಿಟ್ಟು ನಿಮ್ಮ ಬಳಕೆನಾಮ ಹಾಗು ಗುಪ್ತಪದ ಪರಿಶೀಲಿಸಿ!</string>\n\t<string name=\"StartupDialog_server_failed\">Could not connect to %s!</string>\n\t<string name=\"StartupDialog_no_registration\">Server does not allow registration!</string>\n\n\t<string name=\"StartupDialog_invitation\">ನಿಮ್ಮನ್ನು Jabberಗೆ ಆಹ್ವಾನಿಸಲಾಗಿದೆ. ದಯವಿಟ್ಟು ನೊಂದಣಿ ಪೂರ್ತಿ ಮಾಡಿ.</string>\n\t<string name=\"StartupDialog_no_more_accounts\">ಮತ್ತೊಂದು ಖಾತೆ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ!</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_message\">%s ಇಂದ ಸಂದೇಶ</string>\n\t<string name=\"notification_anonymous_message\">ಸಂದೇಶ ಬಂದಿದೆ</string>\n\t<!--  Group Chat notification, %1$s is the user name, %2$s is the room, e.g. \"{Ge0rG} in {yaxim Chat}\" -->\n\t<string name=\"notification_muc_message\">%1$s %2$s ಅಲ್ಲಿ</string>\n\t<!--  Group Group Chat private message notification, %1$s is the user name, %2$s is the room, e.g. \"Message from {Ge0rG} in {yaxim Chat}\" -->\n\t<!--string name=\"notification_muc_pm\">Message from %1$s in %2$s</string-->\n\t<!-- notification button: direct reply (make SHORT string) -->\n\t<string name=\"notification_reply\">ಉತ್ತರಿಸು</string>\n\t<!-- notification button: mark as read (make SHORT string) -->\n\t<string name=\"notification_mark_read\">ಓದಿದೆ</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_error\">ಸಂದೇಶವನ್ನು ಕಳುಹಿಸುವಾಗ ದೋಷ!</string>\n\n\t<!-- Notification Settings -->\n\t<string name=\"preftitle_notify\">ಅಧಿಸೂಚನೆ ಬದಲಾವಣೆಗಳು</string>\n\t<string name=\"preftitle_notify_msg\">ಸಂದೇಶ ಅಧಿಸೂಚನೆ</string>\n\t<string name=\"preftitle_notify_muc\">ಗುಂಪಿನ ಅಧಿಸೂಚನೆ</string>\n\t<string name=\"notification_custom\">ಬೇರೆ ರಿಂಗ್ಟೋನ್</string>\n\t<string name=\"muc_highlight_title\">ಹೆಸರಿಸಿದಾಗ ಮಾತ್ರ ತಿಳಿಸು</string>\n\t<string name=\"muc_highlight_sum\">ಕೋಣೆಗಳಲ್ಲಿ ನಿಮ್ಮ ಉಪನಾಮವನ್ನು ಹೆಸರಿಸಿದಾಗ ತಿಳಿಸು</string>\n\t<string name=\"led_title\">ಮಿಣುಕುವ LED</string>\n\t<string name=\"led_summ\">ಸಂದೇಶ ಬಂದಾಗ ಫೋನಿನ LED ಬೆಳಕನ್ನು ಮಿಣುಕಿಸು</string>\n\t<string name=\"vibr_title\">ಕಂಪನ</string>\n\t<string name=\"vibr_summ\">ಸಂದೇಶಗಳು ಬಂದಾಗ ಕಂಪಿಸು</string>\n\t<string-array name=\"vibr_values_displayed\">\n\t\t<item>ಎಂದಿಗೂ</item>\n\t\t<item>ಫೋನ್ ಆದ್ಯತೆ</item>\n\t\t<item>ಸದಾ</item>\n\t</string-array>\n\t<string name=\"ringtone_title\">ರಿಂಗ್ಟೋನ್</string>\n\t<string name=\"ringtone_summ\">ಒಳಬರುವ ಸಂದೇಶಗಳ ಧ್ವನಿ</string>\n\t<string name=\"ticker_title\">ಸಂದೇಶ ಮುನ್ನೋಟ</string>\n\t<string name=\"ticker_summ\">ಸ್ಥಿತಿ ಪಟ್ಟಿಯಲ್ಲಿ ಸಂದೇಶವನ್ನು ಮತ್ತು ಕಳುಹಿಸಿದವರನ್ನು ತೋರಿಸು</string>\n\n\t<!-- Startup Setting Strings -->\n\t<string name=\"preftitle_general\">ಸಾಮಾನ್ಯ ಆಯ್ಕೆಗಳು</string>\n\t<string name=\"pref_dnd_when_silent\">ಸೈಲೆಣ್ಟ್ ಮೋಡ್ ನಲ್ಲಿ \\\"ತೊಂದರೆ ಕೊಡಬೇಡಿ\\\"</string>\n\t<string name=\"pref_dnd_when_silent_summ\">ನಿಮ್ಮ ಫೋನ್ ಸೈಲೆಂಟ್ ಮೋಡ್‌ನಲ್ಲಿರುವಾಗ ನಿಮ್ಮ ಉಪಸ್ಥಿತಿಯನ್ನು \\\"ತೊಂದರೆ ಕೊಡಬೇಡಿ\\\" ಗೆ ಬದಲಿಸಿ</string>\n\t<string name=\"statuspopup_name\">ಸ್ಥಿತಿ ಹಾಕು</string>\n\t<string name=\"showOffline_summ\">ಸಂಪರ್ಕ ಪಟ್ಟಿಯಲ್ಲಿನ ಎಲ್ಲಾ ಸಂಪರ್ಕಗಳನ್ನು ಸದಾ ತೋರಿಸು</string>\n\t<string name=\"showOffline_title\">ಅನುಪಸ್ಥಿತ ಸಂಪರ್ಕಗಳ ತೋರಿಸು</string>\n\t<string name=\"enableGroups_summ\">ನಿಮ್ಮ ಸಂಪರ್ಕಗಳನ್ನು ವಿಭಾಗ ಪ್ರಕಾರ ಜೋಡಿಸಿ</string>\n\t<string name=\"enableGroups_title\">ಸಂಪರ್ಕ ವಿಭಾಗಗಳನ್ನು ತೋರಿಸು</string>\n\t<string name=\"foregroundService_summ\">ಯಾವಾಗಲೂ ಜಾಲ ಸಂಪರ್ಕವನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು ಅನ್ವಯವನ್ನು ಮೆಮೊರಿಯಲ್ಲಿ ಇರಿಸಿ (ಮುನ್ನೆಲೆ ಸೇವೆ)</string>\n\t<string name=\"foregroundService_title\">ಸ್ಥಿತಿಪಟ್ಟಿ ಚಿತ್ರ</string>\n\n\t<string name=\"preftitle_debug\">ದೋಷ ನಿವಾರಣೆ</string>\n\t<string name=\"smackdebug_summ\">logcat ಮುಖಾಂತರ ದೋಷಕ್ಕೆ ಕಾರಣದ ವರದಿ ಹಾಗೂ ಜಾಲ ಸಂಪರ್ಕತೆ ಪಟ್ಟಣಗಳು (ವೈಯಕ್ತಿಕ ಮಾಹಿತಿಯನ್ನು ಒಳಗೊಂಡಿರಬಹುದು)</string>\n\t<string name=\"smackdebug_title\">SMACK ದೋಷ ನಿವಾರಣೆ</string>\n\n\t<string name=\"reportcrash_title\">ಅಪ್ಪಳಿಕೆ ವರದಿಗಳನ್ನು ಕಳುಹಿಸು</string>\n\t<string name=\"reportcrash_summ\">ಅನಾಮಿಕ ಅಪ್ಪಳಿಕೆ ವರದಿಗಳನ್ನು ಅನ್ವಯ ಅಭಿವೃದ್ಧಕರಿಗೆ ಕಳುಹಿಸಿ</string>\n\n\t<!-- Appearence Strings -->\n\t<string name=\"preftitle_app\">ನೋಟ</string>\n\t<string name=\"FontChat_title\">ಸಂವಾದ ಅಕ್ಷರ ಗಾತ್ರ</string>\n\t<string name=\"FontChat_summ\">ಸಂವಾದದ ಅಕ್ಷರ ಗಾತ್ರ ಆರಿಸಿ</string>\n\t<string name=\"FontChat_dialog\">ಸಂವಾದ ಅಕ್ಷರ ಗಾತ್ರ</string>\n\t<!--\n\t<string name=\"FontRost_title\">Roster font size</string>\n\t<string name=\"FontRost_summ\">Set roster font size</string>\n\t<string name=\"FontRost_dialog\">Roster font fize</string>\n\t<string name=\"setFontRoster\">Set roster font size</string>\n\t-->\n\t<string name=\"pref_theme\">ಬಣ್ಣ</string>\n\t<string name=\"pref_theme_dark\">ಕಪ್ಪು</string>\n\t<string name=\"pref_theme_light\">ಬಿಳಿ</string>\n\t<string name=\"pref_theme_pine\">ಕಾಯಿ</string>\n\t<string name=\"pref_theme_ice\">ಮಂಜು</string>\n\t<string name=\"preftitle_ui\">ನೋಟ</string>\n\t<string-array name=\"fontSizesChat\">\n\t\t<item>ಚಿಕ್ಕ</item>\n\t\t<item>ಸಹಜ</item>\n\t\t<item>ದೊಡ್ಡ</item>\n\t\t<item>ಬೃಹತ್</item>\n\t</string-array>\n\n\t<!-- Mainmenu \t-->\n\t<string name=\"Menu_addFriend\">ಸಂಪರ್ಕ ಸೇರಿಸು</string>\n\t<string name=\"Menu_addClipboard\">%s ಸೇರಿಸಿಕೊ</string>\n\t<string name=\"Menu_ShowOff\">ಅನುಪಸ್ಥಿತರನ್ನು ತೋರಿಸು</string>\n\t<string name=\"Menu_HideOff\">ಅನುಪಸ್ಥಿತರನ್ನು ಮರೆಮಾಡು</string>\n\t<string name=\"Menu_AccSettings\">ಖಾತೆ ತಿದ್ದು</string>\n\t<string name=\"Menu_Settings\">ಬದಲಾವಣೆ</string>\n\t<string name=\"Menu_Status\">ಸ್ಥಿತಿ</string>\n\t<string name=\"Menu_connect\">ಅಂತರ್ಜಾಲಕ್ಕೆ ಸಂಪರ್ಕಿಸು</string>\n\t<string name=\"Menu_disconnect\">ಅಂತರ್ಜಾಲ ಸಂಪರ್ಕ ಕಡಿಸು</string>\n\t<string name=\"Menu_about\">ಯಾಕ್ಸಿಂ ಬಗ್ಗೆ</string>\n\t<string name=\"Menu_about_bruno\">ಭಾಲೂ ಬಗ್ಗೆ</string>\n\t<string name=\"Menu_muc\">ಸೇರಿಸು / ಸಂಚಾರ…</string>\n\t<string name=\"Menu_matrix\">ಮ್ಯಾಟ್ರಿಕ್ಸ್ ಒಳಗೆ ಹೋಗಿ</string>\n\t<string name=\"Menu_mark_all_as_read\">ಎಲ್ಲಾ ಓದಿದೆಯೆಂದು ಗುರುತಿಸು</string>\n\t<string name=\"Menu_send_invitation\">ಆಹ್ವಾನ ರಚಿಸು</string>\n    <string name=\"Menu_userlist\">ಭಾಗಿಗಳು</string>\n\n\n\t<!-- AddFriend -->\n\t<string name=\"addFriend_Title\">ಸಂಪರ್ಕವನ್ನು ಸೇರಿಸು</string>\n\t<string name=\"addFriend_Summ\">ದಯವಿಟ್ಟು ನಿಮ್ಮ ಸ್ನೇಹಿತರ Jabber ID, ಬಯಸಿದ ಹೆಸರು ಹಾಕಿ ಮತ್ತು ಅವರ ಸಂಪರ್ಕವಿಭಾಗ ಆರಿಸಿ!</string>\n\t<string name=\"addFriend_aliasHint\">ನಿಮಗೆ ಮಾತ್ರ ಕಾಣುವ ಹೆಸರು</string>\n\t<string name=\"addrosteritemaddgroupchoice\">ಹೊಸ ವಿಭಾಗಕ್ಕೆ ಸೇರಿಸು</string>\n\t<string name=\"NewGroup_EditTextField_Hint\">ಹೊಸ ವಿಭಾಗದ ಹೆಸರು</string>\n\n\t<!-- Roster CONTEXTMENU -->\n\t<string name=\"roster_contextmenu_group_rename\">ವಿಭಾಗ ಹೆಸರು ತಿದ್ದು</string>\n\t<string name=\"roster_contextmenu_contact_mark_as_read\">ಓದಿದೆಯೆಂದು ಗುರುತಿಸು</string>\n\t<string name=\"roster_contextmenu_contact_delete\">ಸಂಪರ್ಕ ಅಳಿಸು</string>\n\t<string name=\"roster_contextmenu_contact_delmsg\">ಸಂವಾದ ಇತಿಹಾಸ ಅಳಿಸು</string>\n\t<string name=\"roster_contextmenu_contact_rename\">ಹೆಸರು ತಿದ್ದು</string>\n\t<string name=\"roster_contextmenu_contact_request_auth\">ಸ್ಥಿತಿ ಗೋಚರತೆ ಕೇಳು</string>\n\t<string name=\"roster_contextmenu_contact_change_group\">ವಿಭಾಗ ಬದಲಿಸು</string>\n\t<string name=\"roster_contextmenu_contact_share\">ವಿಳಾಸ ಹಂಚು</string>\n\t<string name=\"roster_contextmenu_contact_ringtone\">ರಿಂಗ್ಟೋನ್</string>\n\t<string name=\"roster_contextmenu_muc_edit\">ಗುಂಪು ತಿದ್ದು</string>\n\t<string name=\"roster_contextmenu_muc_leave\">ಗುಂಪಿನಿಂದ ಹೋಗು</string>\n\t<string name=\"muc_leave_question\">ಖಚಿತವಾಗಿ %s ಇಂದ ಹೋಗು?</string>\n\n\t<!-- Accountprefs -->\n\t<string name=\"account_settings_login\">ಲಾಗಿನ್ ಮಾಹಿತಿ</string>\n\t<string name=\"account_settings_title\">ಖಾತೆ ಸಿದ್ಧತೆಗಳು</string>\n\t<string name=\"account_options_title\">ಸಂಪರ್ಕಿಸುವ ಆಯ್ಕೆಗಳು</string>\n\t<string name=\"account_options_advanced\">ತಿಳಿದವರ ಆಯ್ಕೆಗಳು</string>\n\t<string name=\"carbons_title\">ಸಂದೇಶ ಪ್ರತಿಗಳು (XEP-0280)</string>\n\t<string name=\"carbons_summ\">ನಿಮ್ಮ ಇತರ ಅನ್ವಯ(ಗಳ) ಇಂದ ಸಂದೇಶ ಪ್ರತಿಗಳನ್ನು ವಿನಂತಿಸು</string>\n\t<string name=\"account_jabberID_title\">Jabber ID</string>\n\t<string name=\"account_jabberID_sum\">ಉದಾಹರಣೆ: ನಾನು@jabber.example. com</string>\n\t<string name=\"account_jabberID_dialog_title\">ನಿಮ್ಮ Jabber ID ವಿಳಾಸ ಹಾಕಿ:</string>\n\t<string name=\"account_jabberPW_title\">ಖಾತೆ ಗುಪ್ತಪದ</string>\n\t<string name=\"account_jabberPW_sum\">ನಿಮ್ಮ Jabber ಖಾತೆ ಗುಪ್ತಪದ</string>\n\t<string name=\"account_jabberPW_change_on_server\">ಸರ್ವರ್ ಅಲ್ಲಿ ಗುಪ್ತಪದ ಬದಲಾಯಿಸು</string>\n\t<string name=\"account_jabberPW_password_old\">ಹಳೆಯ ಗುಪ್ತಪದ:</string>\n\t<string name=\"account_jabberPW_password_new\">ಹೊಸ ಗುಪ್ತಪದ:</string>\n\t<string name=\"account_jabberPW_warning\">⚠️ಎಚ್ಚರಿಕೆ!⚠️ ಯಶಸ್ವಿ ಲಾಗಿನ್ಗಾಗಿ ನೀವು ಸರ್ವರ್‌ನಲ್ಲಿ ಸಹ ಅದೇ ಪಾಸ್‌ವರ್ಡ್ಅನ್ನು ಹೊಂದಿಸಬೇಕು!</string>\n\t<string name=\"account_jabberPW_progress\">ದಯವಿಟ್ಟು ತಾಳಿ, ಗುಪ್ತಪದ ಬದಲಿಸುತ್ತಿದೆ…</string>\n\t<string name=\"account_jabberPW_finished\">ಯಶಸ್ವಿಯಾಗಿ ಗುಪ್ತಪದ ಬದಲಾಯಿತು.</string>\n\t<string name=\"account_jabberPW_error\">ಗುಪ್ತಪದ ಬದಲಿಸುವಾಗ ದೋಷ: %s</string>\n\t<string name=\"account_nickname_title\">ಪ್ರದರ್ಶನ ಹೆಸರು</string>\n\t<string name=\"account_nickname_summ\">ಬೇರೆ ಬಳಕೆದಾರರಿಗೆ ತೋರಿಸುವ ನಿಮ್ಮ ಉಪನಾಮ</string>\n\t\n\t<!-- accountprefs -->\n\t<string name=\"account_resource_title\">ಅನ್ವಯ ಸಂಪನ್ಮೂಲ</string>\n\t<string name=\"account_resource_summ\">ಅನ್ವಯ ಪೂರ್ವನಿಯೋಜಿತ: ಯಾಕ್ಸಿಂ</string>\n\t<string name=\"account_resource_dialog_title\">ನಿಮ್ಮ ಸಂಪನ್ಮೂಲ ಒತ್ತಿ:</string>\n\t<string name=\"account_resource_hint\">ಯಾಕ್ಸಿಂ</string>\n\t<string name=\"account_prio_title\">ಅನ್ವಯ ಆದ್ಯತೆ</string>\n\t<string name=\"account_prio_summ\">ಅನ್ವಯ ಪೂರ್ವನಿಯೋಜಿತ: 0 (ಅನುಮತಿಸಲಾದ: -128 .. 127)</string>\n\t<string name=\"account_prio_error\">ಅನುಮತಿಸಲಾದ ಮೌಲ್ಯಗಳು: -128 .. 127</string>\n\t<string name=\"account_prio_dialog_title\">ನಿಮ್ಮ ಆದ್ಯತೆ ನಮೂದಿಸಿ:</string>\n\t<string name=\"account_port_title\">ಸರ್ವರ್ ಪೊರ್ಟು</string>\n\t<string name=\"account_port_sum\">ಅನ್ವಯ ಪೂರ್ವನಿಯೋಜಿತ: 5222</string>\n\t<string name=\"account_port_dialog_title\">ಸರ್ವರ್ ಪೋರ್ಟ್ ಸಂಖ್ಯೆ ಹಾಕಿ:</string>\n\t<string name=\"account_port_hint\">5222</string>\n\t<string name=\"account_customserver_title\">ಬೇರೆ ಸರ್ವರ್</string>\n\t<string name=\"account_customserver_summ\">(ಅನವಶ್ಯಕ) ಪರ್ಯಾಯ ಸರ್ವರ್ ಹಾಸ್ಟ್ ಹೆಸರು</string>\n\t<string name=\"account_customserver_dialog_title\">ಸರ್ವರ್‌ ಹಾಸ್ಟ್ ಹೆಸರು ಹಾಕಿ:</string>\n\t<string name=\"account_customserver_hint\">host.ಉದಾಹರಣೆ.com</string>\n\t<string name=\"require_ssl_title\">SSL/TLS ಬದ್ಧತೆ ಅಗತ್ಯ</string>\n\t<string name=\"require_ssl_summ\">ಸರ್ವರ್ ಸಂಪರ್ಕವನ್ನು ಯಾವಾಗಲೂ ಭದ್ರ ಮಾಡಿ</string>\n\n\t<!--StatusPopUp-->\n\t<string name=\"AddContact_SpinnerPrompt\">ವಿಭಾಗ ಆಯ್ಕೆ</string>\n\t<string name=\"setStatusmsgHint\">ನಿಮ್ಮ ಸ್ಥಿತಿ</string>\n\t<string name=\"setStatusTitle\">ಸ್ಥಿತಿ ಹಾಕು</string>\n\t<string name=\"RenameGroup_summ\">%s ವಿಭಾಗದ ಹೆಸರು ತಿದ್ದಿ ಇದಕ್ಕೆ ಇಡು:</string>\n\t<string name=\"RenameGroup_title\">ವಿಭಾಗ ಹೆಸರು ತಿದ್ದು</string>\n\t<string name=\"RenameEntry_summ\">%1$s (%2$s) ಹೆಸರು ತಿದ್ದಿ ಇದಕ್ಕೆ ಇಡು:</string>\n\t<string name=\"RenameEntry_title\">ಸಂಪರ್ಕ ಹೆಸರು ತಿದ್ದು</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_summ\">ಒಂದು ವಿಭಾಗವನ್ನು ಕೆಳಗೆ ಆಯ್ಕೆ ಮಾಡಿ</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_title\">ವಿಭಾಗ ಬದಲಿಸು</string>\n\t<string name=\"deleteRosterItem_text\">ನಿಜವಾಗಲೂ %1$s (%2$s) ಅನ್ನು ತೆಗೆದುಹಾಕು?</string>\n\t<string name=\"deleteRosterItem_title\">ಸಂಪರ್ಕ ಅಳಿಸು</string>\n\t<string name=\"deleteChatHistory_text\">%1$s (%2$s)ರೊಂದಿಗೆ ಎಲ್ಲಾ ಸಂದೇಶಗಳನ್ನು ನಿಜವಾಗಿಯೂ ತೆಗೆದುಹಾಕುವುದೇ ?</string>\n\t<string name=\"deleteChatHistory_title\">ಸಂವಾದ ಇತಿಹಾಸ ಅಳಿಸು</string>\n\t<string name=\"subscriptionRequest_text\">%1$s ನಿಮ್ಮನ್ನು ಸಂಪರ್ಕವಾಗಿ ಸೇರಿಸಲು ಬಯಸುತ್ತಿದ್ದಾರೆ: \\\"%2$s\\\"</string>\n\t<string name=\"subscriptionRequest_title\">ಸಂಪರ್ಕ ವಿನಂತಿ</string>\n\t<string name=\"subscription_accept\">ಒಪ್ಪಿಕೊ</string>\n\t<string name=\"subscription_reject\">ತಿರಸ್ಕರಿಸು</string>\n\t<string name=\"subscription_reject_all\">ಎಲ್ಲಾ ತಿರಸ್ಕರಿಸು</string>\n\t<string name=\"subscription_status_from\">ನಿಮ್ಮ ಸ್ಥಿತಿಯನ್ನು ನೋಡಬಹುದು</string>\n\n\t<!-- CHATWINDOW -->\n\t<string name=\"chat_from_me\">ನಾ:</string>\n\t<string name=\"toast_stored_offline\">ಸಂದೇಶವನ್ನು ಪ್ರಸಾರಕ್ಕಾಗಿ ಸಂಗ್ರಹಿಸಲಾಗಿದೆ.</string>\n\t<string name=\"chat_enterMsgHint\">ಸಂದೇಶ ಬರೆಯಿರಿ</string> \n\n\t<!-- Message context menu; use the verb form (to quote) -->\n\t<string name=\"chatmenu_quote\">ಉಲ್ಲೇಖಿಸು</string>\n\t<!-- Message context menu: repeat the same message -->\n\t<string name=\"chatmenu_resend\">ಸಂದೇಶ ತಿದ್ದು</string>\n\n\t<!-- GPS settings -->\n\t<!--\n\t<string name=\"showGPS_title\">GPS to status</string>\n\t<string name=\"showGPS_summ_on\">GPS is send to StatusMessage</string>\n\t<string name=\"showGPS_summ_off\">GPS is send to StatusMessage</string>\n\t-->\n\n\t<!-- About Dialog -->\n\t<string name=\"AboutDialog_title\">ಯಾಕ್ಸಿಂ ಬಗ್ಗೆ</string>\n\t<string name=\"AboutDialog_DevelopersTitle\">ಅನ್ವಯ ರಚನಾಕಾರರು</string>\n\t<!-- Contact the developer button -->\n\t<string name=\"AboutDialog_DevelopersText\">ಸಂಪರ್ಕಿಸು</string>\n\t<string name=\"AboutDialog_LicenceTitle\">ಪರವಾನಗಿ</string>\n\t<string name=\"AboutDialog_Vote\">ಅನ್ವಯ ಅಭಿಪ್ರಾಯ</string>\n\t<string name=\"AboutDialog_LicenceText\">ಈ ಪ್ರೋಗ್ರಾಂ (ಅನ್ವಯ) ಫ಼್ರೀ (ಸ್ವತಂತ್ರ) ಸಾಫ್ಟ್‌ವೇರ್ (ತಂತ್ರಾಂಶ) ಆಗಿದೆ;  ಸ್ವತಂತ್ರ ತಂತ್ರಾಂಶ ಫೌಂಡೇಶನ್ (ಪ್ರತಿಷ್ಠಾನ) ಪ್ರಕಟಿಸಿದಂತೆ ನೀವು ಅದನ್ನು ಪುನರ್ವಿತರಣೆ ಮಾಡಬಹುದು ಮತ್ತು / ಅಥವಾ ಗ್ನೂ ಜನರಲ್ ಪಬ್ಲಿಕ್ ಲೈಸೆನ್ಸ್ ಆವೃತ್ತಿ 2 ರ ನಿಯಮಗಳ ಅಡಿಯಲ್ಲಿ ಮಾರ್ಪಡಿಸಬಹುದು.  ಲಿಂಕ್: http://www.gnu.org/licenses/gpl-2.0.html\\n\\n ಈ ಸಾಫ್ಟ್‌ವೇರ್‌ನ ಭಾಗಗಳನ್ನು MIT ಪರವಾನಗಿ ಅಡಿಯಲ್ಲಿ ಒದಗಿಸಲಾಗಿದೆ:\\n\\n ಕೃತಿಸ್ವಾಮ್ಯ (Copyright) © 2009 ಮ್ಯಾಡ್ಸ್ ಕ್ರಿಸ್ಟಿಯೆನ್ಸೆನ್, ನಲ್ವೈಯರ್ ಎಪಿಎಸ್\\n\\n ಈ ಸಾಫ್ಟ್‌ವೇರ್ ಮತ್ತು ಅದಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ದಸ್ತಾವೇಜು ಫೈಲ್‌ಗಳ ( \\\"Software\\\") ಪ್ರತಿಯನ್ನು ಪಡೆಯುವ ಯಾವುದೇ ವ್ಯಕ್ತಿಗೆ ಸಾಫ್ಟ್‌ವೇರ್ ಅನ್ನು ನಿರ್ಬಂಧವಿಲ್ಲದೆ ವ್ಯವಹರಿಸಲು ಅನುಮತಿಯನ್ನು ನಿಷುಲ್ಕವಾಗಿ ನೀಡಲಾಗುತ್ತದೆ, ಇದನ್ನು ಯಾವುದೇ ಮಿತಿಗಳಿಲ್ಲದೆ, ನಕಲಿಸಲು, ಮಾರ್ಪಡಿಸಲು, ವಿಲೀನಗೊಳಿಸಲು, ಸಾಫ್ಟ್‌ವೇರ್‌ನ ಪ್ರತಿಗಳನ್ನು ಪ್ರಕಟಿಸಲು, ವಿತರಿಸಲು, ಉಪ-ಪರವಾನಗಿ ಮತ್ತು / ಅಥವಾ ಮಾರಾಟ ಮಾಡಲು, ಮತ್ತು ಸಾಫ್ಟ್‌ವೇರ್ ಅನ್ನು ಒದಗಿಸಲಾಗಿರುವ ವ್ಯಕ್ತಿಗಳಿಗೆ ಈ ಕೆಳಗಿನ ಷರತ್ತುಗಳಿಗೆ ಒಳಪಟ್ಟ ಅನುಮತಿ ನೀಡುವುದು:\\nಮೇಲಿನ ಹಕ್ಕುಸ್ವಾಮ್ಯ ಸೂಚನೆ ಮತ್ತು ಈ ಅನುಮತಿ ಪ್ರಕಟಣೆಯನ್ನು ಸಾಫ್ಟ್‌ವೇರ್‌ನ ಎಲ್ಲಾ ಪ್ರತಿಗಳು ಅಥವಾ ಗಣನೀಯ ಭಾಗಗಳಲ್ಲಿ ಸೇರಿಸಲಾಗುವುದು.\\nಸಾಫ್ಟ್‌ವೇರ್ \\'ಇದ್ದ ಹಾಗೆಯೇ\\', ಯಾವುದೇ ರೀತಿಯ ಖಾತರಿ ಇಲ್ಲದೆ, ವ್ಯಕ್ತಪಡಿಸಿರುವುದೋ ಅಥವಾ ಅಳವಡಿಸಿರುವುದೋ, ಕೊಡಲಾಗಿದೆ, ಹಾಗೂ ಆದರೆ ಅಷ್ಟೇ ಅಲ್ಲ ವ್ಯಾಪಾರದ ಖಾತರಿ ಕರಾರುಗಳಿಗೆ ಸೀಮಿತವಾಗಿಲ್ಲ ಹಾಗೂ, ಒಂದು ನಿರ್ದಿಷ್ಟ ಉದ್ದೇಶಕ್ಕಾಗಿ ಎಂದು ಒದಗಿಸಿಲ್ಲ.  ಯಾವುದೇ ಸಂದರ್ಭದಲ್ಲಿ, ಯಾವುದೇ ಹಕ್ಕು, ಹಾನಿ ಅಥವಾ ಇತರ ಹೊಣೆಗಾರಿಕೆಗಳಿಗೆ ಲೇಖಕರು ಅಥವಾ ಕಾಪಿರೈಟ್ ಹೋಲ್ಡರ್‌ಗಳು ಹೊಣೆಗಾರರಾಗಿರುವುದಿಲ್ಲ, ಸಂಪರ್ಕದ ಒಂದು ಕ್ರಿಯೆಯಲ್ಲಿ, ಟಾರ್ಟ್ ಅಥವಾ ಇತರವುಗಳಲ್ಲಿ, ಹೊರಹೊಮ್ಮುವ ಅಥವಾ ಹೊರಗಿನ ಅಥವಾ ಸಂಪರ್ಕದಲ್ಲಿ.</string>\n\n\t<string name=\"status_available\">ಉಪಸ್ಥಿತ</string>\n\t<string name=\"status_away\">ದೂರ</string>\n\t<string name=\"status_chat\">ಧಾರಾಳ ಮಾತಿಗೆ ಲಭ್ಯ</string>\n\t<string name=\"status_dnd\">ತೊಂದರೆ ಕೊಡಬೇಡಿ</string>\n\t<string name=\"status_xa\">ಲಭ್ಯವಿಲ್ಲ</string>\n\t<string name=\"status_offline\">ಅನುಪಸ್ಥಿತ</string>\n\n\t<string name=\"translator_credits\">Launchpad Contributions:\n  Sachin https://launchpad.net/~msachin</string>\n\n\t<!-- default roster group with no name -->\n\t<string name=\"default_group\">ಸಾಮಾನ್ಯ</string>\n\t<string name=\"all_contacts_group\">ಎಲ್ಲಾ ಸಂಪರ್ಕಗಳು</string>\n\t<string name=\"muc_group\">ಗುಂಪುಗಳು</string>\n\n\t<!-- SEND listener popup -->\n\t<string name=\"chooseContact\">ಸಂಪರ್ಕ ಆಯ್ಕೆ</string>\n\t<string name=\"action_settings\">ಬದಲಾವಣೆ</string>\n\n\t<!-- MUC strings -->\n\t<string name=\"muc_jid_hint\">ಗುಂಪಿನ ವಿಳಾಸ</string>\n\t<string name=\"muc_nickname_hint\">ಉಪನಾಮ</string>\n\t<string name=\"muc_password_hint\">ಗುಪ್ತ ಪದ (ಐಚ್ಛಿಕ)</string>\n\t<string name=\"title_activity_muc_invite\">ಗುಂಪಿಗೆ ಆಮಂತ್ರಣ</string>\n\t<!-- Groupchat invitation: \"Invitation from {contact name}\" -->\n\t<string name=\"muc_invitation_from\">%s ಇಂದ ಆಮಂತ್ರಣ</string>\n\t<!-- Groupchat info: {description} ({number} participants) -->\n\t<string name=\"muc_invitation_occupants\">%1$s (%2$d ಪ್ರತಿಭಾಗಿಗಳು)</string>\n\t<!-- Notification button: \"Join as {default nickname}\" (make SHORT string) -->\n\t<string name=\"muc_invitation_join\">%s ಆಗಿ ಸೇರಿ</string>\n\t<string name=\"muc_synchronizing\">ಒಟ್ಟಿಗೆ ಮಾಡುತ್ತಾ…</string>\n\t<!-- Title of user list, contains JID -->\n\t<string name=\"chat_muc_userlist\">ಗುಂಪಿನ ಪ್ರತಿಭಾಗಿಗಳು (%s)</string>\n\t<!-- Kicked from groupchat: \"Kicked: {reason} -->\n\t<string name=\"muc_kicked\">ಒದೆಯಲಾಗಿದೆ: %s</string>\n\t<!-- Kicked from groupchat: \"Kicked by {admin name}: {reason} -->\n\t<string name=\"muc_kicked_by\">%1$s ಒದ್ದರು: %2$s</string>\n\t<!-- Banned from groupchat: \"Banned: {reason} -->\n\t<string name=\"muc_banned\">ನಿಷೇದಿಸಲಾಗಿದೆ: %s</string>\n\t<!-- Banned from groupchat: \"Banned by {admin name}: {reason} -->\n\t<string name=\"muc_banned_by\">%1$s ನಿಷೇಧಿಸಿದರು: %2$s</string>\n\n\t<!-- File upload -->\n\t<string name=\"roster_contextmenu_send\">ಕಳಿಸು…</string>\n\t<string name=\"roster_contextmenu_take_image\">ಚಿತ್ರ ತೆಗೆ</string>\n\t<string name=\"roster_contextmenu_send_image\">ಚಿತ್ರ ಆಯ್ಕೆ</string>\n\t<string name=\"roster_contextmenu_send_file\">ಕಡತ ಕಳುಹಿಸು</string>\n\t<string name=\"upload_compress\">ಚಿತ್ರ ಸಂಕುಚಿಸುತ್ತಾ…</string>\n\t<string name=\"upload_uploading\">ಜಾಲಕ್ಕೆ ಏರಿಸುತ್ತಿದೇ…</string>\n\t<string name=\"upload_too_large\">ಕಡತ ತುಂಬಾ ದೊಡ್ದದು!</string>\n\t<string name=\"storage_permission\">%s ಗೆ ಕಡತಗಳ ಕಳುಹಿಸಲು ಶೇಖರಣಾ ಅನುಮತಿಯು ಅಗತ್ಯ!</string>\n\t<string name=\"notification_permission_denied\">Notifications are disabled in the Android app preferences.</string>\n\n\t<!-- Search -->\n\t<string name=\"search_msg_hint\">ಸಂದೇಶ ವಿಷಯ</string>\n\n\t<!-- MUC bookmarks -->\n\t<string name=\"group_bookmarks\">ನನ್ನ ಗುಂಪುಗಳು</string>\n\t<string name=\"group_mucsearch\">ಸಾರ್ವಜನಿಕ ಗುಂಪುಗಳು</string>\n\t<!-- Service Discovery -->\n\t<string name=\"title_service_disco\">ಸಂಚಾರ: %s</string>\n\n\t<!-- Android 9 notification preferences: permanent notification -->\n\t<string name=\"notification_status\">ಮುನ್ನೆಲೆ ಸೇವೆ</string>\n\t<!-- Android 9 notification preferences: message notifications -->\n\t<string name=\"notification_msg\">ಸಂದೇಶಗಳು</string>\n\n</resources>\n"
  },
  {
    "path": "res/values-lt/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"app_name\">Yaxim</string>\n\t<string name=\"app_name_bruno\">Bruno</string>\n\n\t<!-- Connection state -->\n\t<string name=\"conn_title\">Yaxim: %s</string>\n\t<string name=\"conn_title_bruno\">Bruno: %s</string>\n\t<string name=\"conn_connecting\">Jungiamasi prie serverio…</string>\n\t<string name=\"conn_disconnecting\">Disconnecting…</string>\n\t<string name=\"conn_online\">Prisijungęs (-usi)</string>\n\t<string name=\"conn_offline\">Neprisijungęs (-usi)</string>\n\t<string name=\"conn_empty_roster\">Nėra rodytinų kontaktų!</string>\n\t<string name=\"conn_empty_roster_hints\">There are many ways to add contacts:\\n\\n\n\t\t- Android Beam™: touch a friend\\'s phone\\n\\n\n\t\t- Scan a QR code\\n\\n\n\t\t- \\\"Create invitation\\\" and share it (e-mail, SMS, QR code, …)\\n\\n\n\t\t- \\\"Add contact\\\" if you know the JID</string>\n\t<string name=\"conn_reconnect\">Next connection attempt in %d seconds.</string>\n\t<string name=\"conn_disconnected\">Connection closed</string>\n\t<string name=\"conn_no_network\">No network connection</string>\n\t<string name=\"conn_ping_timeout\">No response</string>\n\t<string name=\"conn_error\">Error: %s</string>\n\n\t<!-- Global Strings -->\n\t<string name=\"Global_Exit\">Išeiti</string>\n\t<string name=\"Global_authenticate_first\">Pirma prisijunkite</string>\n\t<string name=\"Global_JID_hint\">user@yax.im</string>\n\t<!-- tooltip message when the user entered an invalid XMPP address -->\n\t<string name=\"Global_JID_malformed\">Check address format!</string>\n\n\t<!-- FirstStartUpDialog -->\n\t<string name=\"StartupDialog_Title\">Sveiki atvykę į yaxim!</string>\n\t<string name=\"StartupDialog_Summary\">Prieš naudojantis Jums reikia sukonfigūruoti yaxim. Įveskite savo Jabber ID ir slaptažodį.</string>\n\t<string name=\"StartupDialog_pwHint\">Įveskite slaptažodį</string>\n\t<string name=\"StartupDialog_pwshowHint\">Show password</string>\n\t<string name=\"StartupDialog_Username_title\">Jabber ID:</string>\n\t<string name=\"StartupDialog_passwd_title\">Slaptažodis:</string>\n\t<string name=\"StartupDialog_advanced\">Advanced…</string>\n\t<string name=\"StartupDialog_create_new\">Register new account</string>\n\t<string name=\"StartupDialog_error_password\">Password is too short!</string>\n\t<string name=\"StartupDialog_created_password\">Created secure password</string>\n\t<string name=\"StartupDialog_auth_failed\">Please check your username and password!</string>\n\t<string name=\"StartupDialog_server_failed\">Could not connect to %s!</string>\n\t<string name=\"StartupDialog_no_registration\">Server does not allow registration!</string>\n\n\t<string name=\"StartupDialog_invitation\">You have been invited to Jabber. Please complete your registration.</string>\n\t<string name=\"StartupDialog_no_more_accounts\">No additional account supported!</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_message\">Message from %s</string>\n\t<string name=\"notification_anonymous_message\">Message received</string>\n\t<!--  Group Chat notification, %1$s is the user name, %2$s is the room, e.g. \"{Ge0rG} in {yaxim Chat}\" -->\n\t<string name=\"notification_muc_message\">%1$s in %2$s</string>\n\t<!--  Group Group Chat private message notification, %1$s is the user name, %2$s is the room, e.g. \"Message from {Ge0rG} in {yaxim Chat}\" -->\n\t<!--string name=\"notification_muc_pm\">Message from %1$s in %2$s</string-->\n\t<!-- notification button: direct reply (make SHORT string) -->\n\t<string name=\"notification_reply\">Reply</string>\n\t<!-- notification button: mark as read (make SHORT string) -->\n\t<string name=\"notification_mark_read\">Mark Read</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_error\">Error while sending message!</string>\n\n\t<!-- Notification Settings -->\n\t<string name=\"preftitle_notify\">Notification Settings</string>\n\t<string name=\"preftitle_notify_msg\">Pranešimas apie žinutes</string>\n\t<string name=\"preftitle_notify_muc\">Group Chat Notification</string>\n\t<string name=\"notification_custom\">Custom Ringtone</string>\n\t<string name=\"muc_highlight_title\">Only notify on mention</string>\n\t<string name=\"muc_highlight_sum\">Notify when your nickname is mentioned in a room</string>\n\t<string name=\"led_title\">Mirgsintis LED indikatorius</string>\n\t<string name=\"led_summ\">Blink phone LED on incoming messages</string>\n\t<string name=\"vibr_title\">Vibracija</string>\n\t<string name=\"vibr_summ\">Vibrate on incoming messages</string>\n\t<string-array name=\"vibr_values_displayed\">\n\t\t<item>Never</item>\n\t\t<item>System preference</item>\n\t\t<item>Always</item>\n\t</string-array>\n\t<string name=\"ringtone_title\">Skambėjimo melodija</string>\n\t<string name=\"ringtone_summ\">Gautų žinučių signalas</string>\n\t<string name=\"ticker_title\">Message preview</string>\n\t<string name=\"ticker_summ\">Show sender and message in status bar</string>\n\n\t<!-- Startup Setting Strings -->\n\t<string name=\"preftitle_general\">General Settings</string>\n\t<string name=\"pref_dnd_when_silent\">\\\"Do not disturb\\\" in silent mode</string>\n\t<string name=\"pref_dnd_when_silent_summ\">Set your online status to \\\"DND\\\" when your phone is in silent mode</string>\n\t<string name=\"statuspopup_name\">Nustatykite savo būseną</string>\n\t<string name=\"showOffline_summ\">Always show all contacts in the roster</string>\n\t<string name=\"showOffline_title\">Rodyti atsijungusius adresatus</string>\n\t<string name=\"enableGroups_summ\">Arrange your contacts by their groups</string>\n\t<string name=\"enableGroups_title\">Show contact groups</string>\n\t<string name=\"foregroundService_summ\">Keep app in memory to ensure always-on connection (foreground service)</string>\n\t<string name=\"foregroundService_title\">Statusbar icon</string>\n\n\t<string name=\"preftitle_debug\">Programų derinimas</string>\n\t<string name=\"smackdebug_summ\">Packet and debug output via logcat (may contain personal information)</string>\n\t<string name=\"smackdebug_title\">SMACK derinimas</string>\n\n\t<string name=\"reportcrash_title\">Siųsti programos sutrikimų ataskaitas</string>\n\t<string name=\"reportcrash_summ\">Send anonymous crash reports to developer</string>\n\n\t<!-- Appearence Strings -->\n\t<string name=\"preftitle_app\">Appearance</string>\n\t<string name=\"FontChat_title\">Chat font size</string>\n\t<string name=\"FontChat_summ\">Set chat font size</string>\n\t<string name=\"FontChat_dialog\">Chat font size</string>\n\t<!--\n\t<string name=\"FontRost_title\">Roster font size</string>\n\t<string name=\"FontRost_summ\">Set roster font size</string>\n\t<string name=\"FontRost_dialog\">Roster font fize</string>\n\t<string name=\"setFontRoster\">Set roster font size</string>\n\t-->\n\t<string name=\"pref_theme\">Theme</string>\n\t<string name=\"pref_theme_dark\">Dark</string>\n\t<string name=\"pref_theme_light\">Light</string>\n\t<string name=\"pref_theme_pine\">Pine</string>\n\t<string name=\"pref_theme_ice\">Ice</string>\n\t<string name=\"preftitle_ui\">Appearance</string>\n\t<string-array name=\"fontSizesChat\">\n\t\t<item>small</item>\n\t\t<item>normal</item>\n\t\t<item>large</item>\n\t\t<item>huge</item>\n\t</string-array>\n\n\t<!-- Mainmenu \t-->\n\t<string name=\"Menu_addFriend\">Add contact</string>\n\t<string name=\"Menu_addClipboard\">Add %s</string>\n\t<string name=\"Menu_ShowOff\">Show offline</string>\n\t<string name=\"Menu_HideOff\">Hide offline</string>\n\t<string name=\"Menu_AccSettings\">Edit account</string>\n\t<string name=\"Menu_Settings\">Nustatymai</string>\n\t<string name=\"Menu_Status\">Būsena</string>\n\t<string name=\"Menu_connect\">Prisijungti</string>\n\t<string name=\"Menu_disconnect\">Atsijungti</string>\n\t<string name=\"Menu_about\">Apie yaxim</string>\n\t<string name=\"Menu_about_bruno\">About Bruno</string>\n\t<string name=\"Menu_muc\">Add / browse…</string>\n\t<string name=\"Menu_matrix\">Enter the Matrix…</string>\n\t<string name=\"Menu_mark_all_as_read\">Mark all as read</string>\n\t<string name=\"Menu_send_invitation\">Create invitation</string>\n    <string name=\"Menu_userlist\">Participants</string>\n\n\n\t<!-- AddFriend -->\n\t<string name=\"addFriend_Title\">Pridėti kontaktą</string>\n\t<string name=\"addFriend_Summ\">Įveskite Jūsų draugo Jabber ID, rodomą vardą ir pasirinkite kontaktų grupę!</string>\n\t<string name=\"addFriend_aliasHint\">Rodomas vardas</string>\n\t<string name=\"addrosteritemaddgroupchoice\">Priskirti naujai grupei</string>\n\t<string name=\"NewGroup_EditTextField_Hint\">Naujos grupės pavadinimas</string>\n\n\t<!-- Roster CONTEXTMENU -->\n\t<string name=\"roster_contextmenu_group_rename\">Pervadinti grupę</string>\n\t<string name=\"roster_contextmenu_contact_mark_as_read\">Mark as read</string>\n\t<string name=\"roster_contextmenu_contact_delete\">Delete contact</string>\n\t<string name=\"roster_contextmenu_contact_delmsg\">Delete chat history</string>\n\t<string name=\"roster_contextmenu_contact_rename\">Pervardinti</string>\n\t<string name=\"roster_contextmenu_contact_request_auth\">Request authorization</string>\n\t<string name=\"roster_contextmenu_contact_change_group\">Keisti grupę</string>\n\t<string name=\"roster_contextmenu_contact_share\">Share address</string>\n\t<string name=\"roster_contextmenu_contact_ringtone\">Skambėjimo melodija</string>\n\t<string name=\"roster_contextmenu_muc_edit\">Edit group chat</string>\n\t<string name=\"roster_contextmenu_muc_leave\">Leave group chat</string>\n\t<string name=\"muc_leave_question\">Really leave %s?</string>\n\n\t<!-- Accountprefs -->\n\t<string name=\"account_settings_login\">Prisijungimo informacija</string>\n\t<string name=\"account_settings_title\">Paskyros parametrai</string>\n\t<string name=\"account_options_title\">Prisijungimo parinktys</string>\n\t<string name=\"account_options_advanced\">Išplėstinės parinktys</string>\n\t<string name=\"carbons_title\">Message Carbons (XEP-0280)</string>\n\t<string name=\"carbons_summ\">Request message copies from your other client(s)</string>\n\t<string name=\"account_jabberID_title\">Jabber ID</string>\n\t<string name=\"account_jabberID_sum\">pvz: as@jabber.pavyzdys.com</string>\n\t<string name=\"account_jabberID_dialog_title\">Įveskite savo Jabber ID:</string>\n\t<string name=\"account_jabberPW_title\">Paskyros slaptažodis</string>\n\t<string name=\"account_jabberPW_sum\">Jūsų Jabber paskyros slaptažodis</string>\n\t<string name=\"account_jabberPW_change_on_server\">Change password on server</string>\n\t<string name=\"account_jabberPW_password_old\">Old Password:</string>\n\t<string name=\"account_jabberPW_password_new\">New Password:</string>\n\t<string name=\"account_jabberPW_warning\">WARNING! For successful login you must also set the same password on the server!</string>\n\t<string name=\"account_jabberPW_progress\">Please wait, changing password…</string>\n\t<string name=\"account_jabberPW_finished\">Password successfully changed.</string>\n\t<string name=\"account_jabberPW_error\">Error changing password: %s</string>\n\t<string name=\"account_nickname_title\">Display Name</string>\n\t<string name=\"account_nickname_summ\">Your nickname displayed to other users</string>\n\t\n\t<!-- accountprefs -->\n\t<string name=\"account_resource_title\">Kliento resursas</string>\n\t<string name=\"account_resource_summ\">Pagal nutylėjimą: yaxim</string>\n\t<string name=\"account_resource_dialog_title\">Įveskite resursą:</string>\n\t<string name=\"account_resource_hint\">Yaxim</string>\n\t<string name=\"account_prio_title\">Prioritetas</string>\n\t<string name=\"account_prio_summ\">Default: 0 (allowed: -128 .. 127)</string>\n\t<string name=\"account_prio_error\">Allowed values: -128 .. 127</string>\n\t<string name=\"account_prio_dialog_title\">Įveskite prioritetą:</string>\n\t<string name=\"account_port_title\">Serverio portas</string>\n\t<string name=\"account_port_sum\">Pagal nutylėjimą: 5222</string>\n\t<string name=\"account_port_dialog_title\">Įveskite serverio portą:</string>\n\t<string name=\"account_port_hint\">5222</string>\n\t<string name=\"account_customserver_title\">Pasirenkamas serveris</string>\n\t<string name=\"account_customserver_summ\">Alternatyvus serverio vardas</string>\n\t<string name=\"account_customserver_dialog_title\">Įveskite serverio vardą:</string>\n\t<string name=\"account_customserver_hint\">serveris.pavyzdys.com</string>\n\t<string name=\"require_ssl_title\">Reikalauti SSL/TLS</string>\n\t<string name=\"require_ssl_summ\">Always encrypt server connection</string>\n\n\t<!--StatusPopUp-->\n\t<string name=\"AddContact_SpinnerPrompt\">Pasirinkite grupę</string>\n\t<string name=\"setStatusmsgHint\">Jūsų vieša žinutė</string>\n\t<string name=\"setStatusTitle\">Nustatykite savo būseną</string>\n\t<string name=\"RenameGroup_summ\">Pervardinti grupę %s į:</string>\n\t<string name=\"RenameGroup_title\">Pervadinti grupę</string>\n\t<string name=\"RenameEntry_summ\">Pervardinti %1$s (%2$s) į:</string>\n\t<string name=\"RenameEntry_title\">Pervardinti kontaktą</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_summ\">Pasirinkite grupę iš suktuko,esančio žemiau</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_title\">Keisti grupę</string>\n\t<string name=\"deleteRosterItem_text\">Ar tikrai pašalinti %1$s (%2$s)?</string>\n\t<string name=\"deleteRosterItem_title\">Pašalinti kontaktą</string>\n\t<string name=\"deleteChatHistory_text\">Really remove all messages with %1$s (%2$s)?</string>\n\t<string name=\"deleteChatHistory_title\">Delete Chat History</string>\n\t<string name=\"subscriptionRequest_text\">%1$s wants to add you as a contact: \\\"%2$s\\\"</string>\n\t<string name=\"subscriptionRequest_title\">Subscription Request</string>\n\t<string name=\"subscription_accept\">Accept</string>\n\t<string name=\"subscription_reject\">Reject</string>\n\t<string name=\"subscription_reject_all\">Reject all</string>\n\t<string name=\"subscription_status_from\">can see your status</string>\n\n\t<!-- CHATWINDOW -->\n\t<string name=\"chat_from_me\">Aš:</string>\n\t<string name=\"toast_stored_offline\">Žinutė išsaugota perdavimui.</string>\n\t<string name=\"chat_enterMsgHint\">Enter message</string> \n\n\t<!-- Message context menu; use the verb form (to quote) -->\n\t<string name=\"chatmenu_quote\">Quote</string>\n\t<!-- Message context menu: repeat the same message -->\n\t<string name=\"chatmenu_resend\">Edit message</string>\n\n\t<!-- GPS settings -->\n\t<!--\n\t<string name=\"showGPS_title\">GPS to status</string>\n\t<string name=\"showGPS_summ_on\">GPS is send to StatusMessage</string>\n\t<string name=\"showGPS_summ_off\">GPS is send to StatusMessage</string>\n\t-->\n\n\t<!-- About Dialog -->\n\t<string name=\"AboutDialog_title\">Apie yaxim</string>\n\t<string name=\"AboutDialog_DevelopersTitle\">Plėtotojai</string>\n\t<!-- Contact the developer button -->\n\t<string name=\"AboutDialog_DevelopersText\">Contact</string>\n\t<string name=\"AboutDialog_LicenceTitle\">Licencija</string>\n\t<string name=\"AboutDialog_Vote\">Rate app</string>\n\t<string name=\"AboutDialog_LicenceText\">\n\t\tThis program is free software; you can redistribute\n\t\tit and/or\n\t\tmodify it under the terms of the GNU General Public License\n\t\tversion 2\n\t\tas published by the Free Software Foundation.\n\t\tLink:\n\t\thttp://www.gnu.org/licenses/gpl-2.0.html\\n\n\t\t\\n\n\t\tParts of this software are\n\t\tprovided under the MIT License:\\n\n\t\t\\n\n\t\tCopyright © 2009 Mads\n\t\tKristiansen, Nullwire ApS\\n\n\t\t\\n\n\t\tPermission is hereby granted, free of\n\t\tcharge, to any person obtaining\n\t\ta copy\n\t\tof this software and associated\n\t\tdocumentation files (the\n\t\t\"Software\"), to deal\n\t\tin the Software without\n\t\trestriction, including\n\t\twithout limitation the rights\n\t\tto use, copy,\n\t\tmodify, merge, publish,\n\t\tdistribute, sublicense, and/or sell\n\t\tcopies of\n\t\tthe Software, and to\n\t\tpermit persons to whom the Software is\n\t\tfurnished to\n\t\tdo so, subject to\n\t\tthe following conditions:\n\t\t\\n\n\t\tThe above copyright notice\n\t\tand this permission notice shall be\n\t\tincluded in all\n\t\tcopies or\n\t\tsubstantial portions of the Software.\n\t\t\\n\n\t\tTHE SOFTWARE IS PROVIDED \"AS\n\t\tIS\", WITHOUT WARRANTY OF ANY KIND,\n\t\tEXPRESS OR\n\t\tIMPLIED, INCLUDING BUT NOT\n\t\tLIMITED TO THE WARRANTIES OF\n\t\tMERCHANTABILITY,\n\t\tFITNESS FOR A PARTICULAR\n\t\tPURPOSE AND NONINFRINGEMENT.\n\t\tIN NO EVENT SHALL THE\n\t\tAUTHORS OR COPYRIGHT\n\t\tHOLDERS BE LIABLE FOR ANY\n\t\tCLAIM, DAMAGES OR OTHER\n\t\tLIABILITY, WHETHER IN\n\t\tAN ACTION OF CONTRACT,\n\t\tTORT OR OTHERWISE, ARISING FROM,\n\t\tOUT OF OR IN\n\t\tCONNECTION WITH THE\n\t\tSOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n\t\tSOFTWARE.\n    </string>\n\n\t<string name=\"status_available\">Prisijungęs (-usi)</string>\n\t<string name=\"status_away\">Pasitraukęs (-usi)</string>\n\t<string name=\"status_chat\">Laisvas pašnekesiams</string>\n\t<string name=\"status_dnd\">Netrukdyti</string>\n\t<string name=\"status_xa\">Nepasiekiamas</string>\n\t<string name=\"status_offline\">Neprisijungęs (-usi)</string>\n\n\t<string name=\"translator_credits\">Launchpad Contributions:\n  Antanas https://launchpad.net/~antanas\n  Georg Lukas https://launchpad.net/~ge0rg</string>\n\n\t<!-- default roster group with no name -->\n\t<string name=\"default_group\">General</string>\n\t<string name=\"all_contacts_group\">All contacts</string>\n\t<string name=\"muc_group\">Group Chats</string>\n\n\t<!-- SEND listener popup -->\n\t<string name=\"chooseContact\">Choose contact</string>\n\t<string name=\"action_settings\">Nustatymai</string>\n\n\t<!-- MUC strings -->\n\t<string name=\"muc_jid_hint\">Group chat JID</string>\n\t<string name=\"muc_nickname_hint\">Nickname</string>\n\t<string name=\"muc_password_hint\">Password (optional)</string>\n\t<string name=\"title_activity_muc_invite\">Group Chat Invitation</string>\n\t<!-- Groupchat invitation: \"Invitation from {contact name}\" -->\n\t<string name=\"muc_invitation_from\">Invitation from %s</string>\n\t<!-- Groupchat info: {description} ({number} participants) -->\n\t<string name=\"muc_invitation_occupants\">%1$s (%2$d participants)</string>\n\t<!-- Notification button: \"Join as {default nickname}\" (make SHORT string) -->\n\t<string name=\"muc_invitation_join\">Join as %s</string>\n\t<string name=\"muc_synchronizing\">Synchronizing…</string>\n\t<!-- Title of user list, contains JID -->\n\t<string name=\"chat_muc_userlist\">Group Chat Participants (%s)</string>\n\t<!-- Kicked from groupchat: \"Kicked: {reason} -->\n\t<string name=\"muc_kicked\">Kicked: %s</string>\n\t<!-- Kicked from groupchat: \"Kicked by {admin name}: {reason} -->\n\t<string name=\"muc_kicked_by\">Kicked by %1$s: %2$s</string>\n\t<!-- Banned from groupchat: \"Banned: {reason} -->\n\t<string name=\"muc_banned\">Banned: %s</string>\n\t<!-- Banned from groupchat: \"Banned by {admin name}: {reason} -->\n\t<string name=\"muc_banned_by\">Banned by %1$s: %2$s</string>\n\n\t<!-- File upload -->\n\t<string name=\"roster_contextmenu_send\">Send…</string>\n\t<string name=\"roster_contextmenu_take_image\">Take picture</string>\n\t<string name=\"roster_contextmenu_send_image\">Choose picture</string>\n\t<string name=\"roster_contextmenu_send_file\">Send file</string>\n\t<string name=\"upload_compress\">Compressing picture…</string>\n\t<string name=\"upload_uploading\">Uploading…</string>\n\t<string name=\"upload_too_large\">file too large!</string>\n\t<string name=\"storage_permission\">%s needs storage access to send files!</string>\n\t<string name=\"notification_permission_denied\">Notifications are disabled in the Android app preferences.</string>\n\n\t<!-- Search -->\n\t<string name=\"search_msg_hint\">Message content</string>\n\n\t<!-- MUC bookmarks -->\n\t<string name=\"group_bookmarks\">My group chats</string>\n\t<string name=\"group_mucsearch\">Public group chats</string>\n\t<!-- Service Discovery -->\n\t<string name=\"title_service_disco\">Browser: %s</string>\n\n\t<!-- Android 9 notification preferences: permanent notification -->\n\t<string name=\"notification_status\">Foreground service</string>\n\t<!-- Android 9 notification preferences: message notifications -->\n\t<string name=\"notification_msg\">Messages</string>\n\n</resources>\n"
  },
  {
    "path": "res/values-nb/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"app_name\">yaxim</string>\n\t<string name=\"app_name_bruno\">Bruno</string>\n\n\t<!-- Connection state -->\n\t<string name=\"conn_title\">yaxim: %s</string>\n\t<string name=\"conn_title_bruno\">Bruno: %s</string>\n\t<string name=\"conn_connecting\">Kobler til tjener…</string>\n\t<string name=\"conn_disconnecting\">Kobler fra…</string>\n\t<string name=\"conn_online\">Tilkoblet</string>\n\t<string name=\"conn_offline\">Frakoblet</string>\n\t<string name=\"conn_empty_roster\">Ingen kontakter å vise.</string>\n\t<string name=\"conn_empty_roster_hints\">Det er mange måter å legge til kontakter på:\\n\\n - Android Beam™: Berør en venns telefon\\n\\n - Skann en QR-kode\\n\\n - \\\"Opprett invitasjon\\\" og del den (e-post, SMS, QR-kode, …)\\n\\n - \\\"Legg til kontakt\\\" hvis du kjenner JID-en</string>\n\t<string name=\"conn_reconnect\">Neste tilkoblingsforsøk om %d sekunder.</string>\n\t<string name=\"conn_disconnected\">Tilkobling lukket</string>\n\t<string name=\"conn_no_network\">Ingen nettverkstilknytning</string>\n\t<string name=\"conn_ping_timeout\">No response</string>\n\t<string name=\"conn_error\">Feil: %s</string>\n\n\t<!-- Global Strings -->\n\t<string name=\"Global_Exit\">Avslutt</string>\n\t<string name=\"Global_authenticate_first\">Koble til først</string>\n\t<string name=\"Global_JID_hint\">bruker@yax.im</string>\n\t<!-- tooltip message when the user entered an invalid XMPP address -->\n\t<string name=\"Global_JID_malformed\">Se over adresseformatet.</string>\n\n\t<!-- FirstStartUpDialog -->\n\t<string name=\"StartupDialog_Title\">Velkommen til yaxim!</string>\n\t<string name=\"StartupDialog_Summary\">Du må sette opp yaxim før du bruker det. Skriv inn din Jabber-ID og passordet ditt.</string>\n\t<string name=\"StartupDialog_pwHint\">Skriv inn passord</string>\n\t<string name=\"StartupDialog_pwshowHint\">Show password</string>\n\t<string name=\"StartupDialog_Username_title\">Jabber-ID:</string>\n\t<string name=\"StartupDialog_passwd_title\">Passord:</string>\n\t<string name=\"StartupDialog_advanced\">Avansert…</string>\n\t<string name=\"StartupDialog_create_new\">Registrer ny konto</string>\n\t<string name=\"StartupDialog_error_password\">Password is too short!</string>\n\t<string name=\"StartupDialog_created_password\">Opprettet sikkert passord</string>\n\t<string name=\"StartupDialog_auth_failed\">Se over brukernavnet og passordet ditt!</string>\n\t<string name=\"StartupDialog_server_failed\">Could not connect to %s!</string>\n\t<string name=\"StartupDialog_no_registration\">Server does not allow registration!</string>\n\n\t<string name=\"StartupDialog_invitation\">You have been invited to Jabber. Please complete your registration.</string>\n\t<string name=\"StartupDialog_no_more_accounts\">No additional account supported!</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_message\">Melding fra %s</string>\n\t<string name=\"notification_anonymous_message\">Melding mottatt</string>\n\t<!--  Group Chat notification, %1$s is the user name, %2$s is the room, e.g. \"{Ge0rG} in {yaxim Chat}\" -->\n\t<string name=\"notification_muc_message\">%1$s i %2$s</string>\n\t<!--  Group Group Chat private message notification, %1$s is the user name, %2$s is the room, e.g. \"Message from {Ge0rG} in {yaxim Chat}\" -->\n\t<!--string name=\"notification_muc_pm\">Message from %1$s in %2$s</string-->\n\t<!-- notification button: direct reply (make SHORT string) -->\n\t<string name=\"notification_reply\">Svar</string>\n\t<!-- notification button: mark as read (make SHORT string) -->\n\t<string name=\"notification_mark_read\">Merk som lest</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_error\">Feil ved forsendelse av melding!</string>\n\n\t<!-- Notification Settings -->\n\t<string name=\"preftitle_notify\">Notification Settings</string>\n\t<string name=\"preftitle_notify_msg\">Meldingsmerknad</string>\n\t<string name=\"preftitle_notify_muc\">Gruppesluddermerknad</string>\n\t<string name=\"notification_custom\">Custom Ringtone</string>\n\t<string name=\"muc_highlight_title\">Kun merknad når nevnt</string>\n\t<string name=\"muc_highlight_sum\">Merknad når kallenavnet ditt blir nevnt i et rom</string>\n\t<string name=\"led_title\">Blinkende LED</string>\n\t<string name=\"led_summ\">Blink telefon-LED ved innkommende meldinger</string>\n\t<string name=\"vibr_title\">Vibrasjon</string>\n\t<string name=\"vibr_summ\">Vibrer ved innkommende meldinger</string>\n\t<string-array name=\"vibr_values_displayed\">\n\t\t<item>Aldri</item>\n\t\t<item>Systemforvalg</item>\n\t\t<item>Alltid</item>\n\t</string-array>\n\t<string name=\"ringtone_title\">Ringetone</string>\n\t<string name=\"ringtone_summ\">Tone for mottatte meldinger</string>\n\t<string name=\"ticker_title\">Meldingsforhåndsvisning</string>\n\t<string name=\"ticker_summ\">Vis sender og melding i statusfelt</string>\n\n\t<!-- Startup Setting Strings -->\n\t<string name=\"preftitle_general\">Hovedinnstillinger</string>\n\t<string name=\"pref_dnd_when_silent\">\\\"Ikke forstyrr\\\" i stille-modus</string>\n\t<string name=\"pref_dnd_when_silent_summ\">Sett din påkoblede status til \\\"Ikke forstyrr\\\" når din telefon er i stille-modus</string>\n\t<string name=\"statuspopup_name\">Sett din status</string>\n\t<string name=\"showOffline_summ\">Alltid vis alle kontakter på kontaktlisten</string>\n\t<string name=\"showOffline_title\">Vis frakoblede kontakter</string>\n\t<string name=\"enableGroups_summ\">Arranger kontakter etter gruppetilhørighet</string>\n\t<string name=\"enableGroups_title\">Vis kontaktgrupper</string>\n\t<string name=\"foregroundService_summ\">Keep app in memory to ensure always-on connection (foreground service)</string>\n\t<string name=\"foregroundService_title\">Statusfeltikon</string>\n\n\t<string name=\"preftitle_debug\">Feilsøking</string>\n\t<string name=\"smackdebug_summ\">Pakke og feilrettingsutdata via logcat (kan inneholde personlig informasjon)</string>\n\t<string name=\"smackdebug_title\">SMACK-feilretting</string>\n\n\t<string name=\"reportcrash_title\">Send kræsjrapporter</string>\n\t<string name=\"reportcrash_summ\">Send anonyme kræsjrapporter til utvikleren</string>\n\n\t<!-- Appearence Strings -->\n\t<string name=\"preftitle_app\">Utseende</string>\n\t<string name=\"FontChat_title\">Skriftstørrelse for sludring</string>\n\t<string name=\"FontChat_summ\">Sett skriftstørrelse for sludring</string>\n\t<string name=\"FontChat_dialog\">Skriftstørrelse for sludring</string>\n\t<!--\n\t<string name=\"FontRost_title\">Roster font size</string>\n\t<string name=\"FontRost_summ\">Set roster font size</string>\n\t<string name=\"FontRost_dialog\">Roster font fize</string>\n\t<string name=\"setFontRoster\">Set roster font size</string>\n\t-->\n\t<string name=\"pref_theme\">Drakt</string>\n\t<string name=\"pref_theme_dark\">Mørk</string>\n\t<string name=\"pref_theme_light\">Lys</string>\n\t<string name=\"pref_theme_pine\">Pine</string>\n\t<string name=\"pref_theme_ice\">Ice</string>\n\t<string name=\"preftitle_ui\">Utseende</string>\n\t<string-array name=\"fontSizesChat\">\n\t\t<item>liten</item>\n\t\t<item>normal</item>\n\t\t<item>stor</item>\n\t\t<item>kjempestor</item>\n\t</string-array>\n\n\t<!-- Mainmenu \t-->\n\t<string name=\"Menu_addFriend\">Legg til kontakt</string>\n\t<string name=\"Menu_addClipboard\">Add %s</string>\n\t<string name=\"Menu_ShowOff\">Vis frakoblede</string>\n\t<string name=\"Menu_HideOff\">Skjul frakoblede</string>\n\t<string name=\"Menu_AccSettings\">Rediger konto</string>\n\t<string name=\"Menu_Settings\">Innstillinger</string>\n\t<string name=\"Menu_Status\">Status</string>\n\t<string name=\"Menu_connect\">Koble til</string>\n\t<string name=\"Menu_disconnect\">Koble fra</string>\n\t<string name=\"Menu_about\">Om yaxim</string>\n\t<string name=\"Menu_about_bruno\">About Bruno</string>\n\t<string name=\"Menu_muc\">Add / browse…</string>\n\t<string name=\"Menu_matrix\">Enter the Matrix…</string>\n\t<string name=\"Menu_mark_all_as_read\">Merk alt som lest</string>\n\t<string name=\"Menu_send_invitation\">Opprett invitasjon</string>\n    <string name=\"Menu_userlist\">Deltagere</string>\n\n\n\t<!-- AddFriend -->\n\t<string name=\"addFriend_Title\">Legg til kontakt</string>\n\t<string name=\"addFriend_Summ\">Skriv inn Jabber-ID-en tilhørende din venn, ønsket skjermnavn og velg deres kontaktgruppe.</string>\n\t<string name=\"addFriend_aliasHint\">Skjermnavn</string>\n\t<string name=\"addrosteritemaddgroupchoice\">Legg til i ny gruppe</string>\n\t<string name=\"NewGroup_EditTextField_Hint\">Gi ny gruppe navn</string>\n\n\t<!-- Roster CONTEXTMENU -->\n\t<string name=\"roster_contextmenu_group_rename\">Gi gruppe nytt navn</string>\n\t<string name=\"roster_contextmenu_contact_mark_as_read\">Merk som lest</string>\n\t<string name=\"roster_contextmenu_contact_delete\">Slett kontakt</string>\n\t<string name=\"roster_contextmenu_contact_delmsg\">Slett sludrehistorikk</string>\n\t<string name=\"roster_contextmenu_contact_rename\">Gi nytt navn</string>\n\t<string name=\"roster_contextmenu_contact_request_auth\">Forespør godkjenning</string>\n\t<string name=\"roster_contextmenu_contact_change_group\">Endre gruppe</string>\n\t<string name=\"roster_contextmenu_contact_share\">Del adresse</string>\n\t<string name=\"roster_contextmenu_contact_ringtone\">Ringetone</string>\n\t<string name=\"roster_contextmenu_muc_edit\">Endre gruppesludring</string>\n\t<string name=\"roster_contextmenu_muc_leave\">Forlat gruppesludring</string>\n\t<string name=\"muc_leave_question\">Forlat %s?</string>\n\n\t<!-- Accountprefs -->\n\t<string name=\"account_settings_login\">Innloggingsinformasjon</string>\n\t<string name=\"account_settings_title\">Kontoinnstillinger</string>\n\t<string name=\"account_options_title\">Tilkoblingsvalg</string>\n\t<string name=\"account_options_advanced\">Avanserte valg</string>\n\t<string name=\"carbons_title\">Meldingskopier (XEP-0280)</string>\n\t<string name=\"carbons_summ\">Forespør meldingskopier fra dine andre klient(er)</string>\n\t<string name=\"account_jabberID_title\">Jabber-ID</string>\n\t<string name=\"account_jabberID_sum\">eksempel: meg@jabber.eksempel.no</string>\n\t<string name=\"account_jabberID_dialog_title\">Skriv inn din Jabber-ID:</string>\n\t<string name=\"account_jabberPW_title\">Kontopassord</string>\n\t<string name=\"account_jabberPW_sum\">Ditt Jabber-kontopassord</string>\n\t<string name=\"account_jabberPW_change_on_server\">Endre passordet på tjeneren</string>\n\t<string name=\"account_jabberPW_password_old\">Gammelt passord:</string>\n\t<string name=\"account_jabberPW_password_new\">Nytt passord:</string>\n\t<string name=\"account_jabberPW_warning\">ADVARSEL! For å kunne logge inn må du også sette samme passord på tjeneren!</string>\n\t<string name=\"account_jabberPW_progress\">Vent, endrer passord…</string>\n\t<string name=\"account_jabberPW_finished\">Bytte av passord fullført.</string>\n\t<string name=\"account_jabberPW_error\">Feil ved bytting av passord: %s</string>\n\t<string name=\"account_nickname_title\">Display Name</string>\n\t<string name=\"account_nickname_summ\">Your nickname displayed to other users</string>\n\t\n\t<!-- accountprefs -->\n\t<string name=\"account_resource_title\">Klientressurs</string>\n\t<string name=\"account_resource_summ\">Forvalg: yaxim</string>\n\t<string name=\"account_resource_dialog_title\">Skriv inn din ressurs:</string>\n\t<string name=\"account_resource_hint\">yaxim</string>\n\t<string name=\"account_prio_title\">Klientprioritet</string>\n\t<string name=\"account_prio_summ\">Forvalg: 0 (tillatt: -128 .. 127)</string>\n\t<string name=\"account_prio_error\">Tillatte verdier: -128 .. 127</string>\n\t<string name=\"account_prio_dialog_title\">Skriv inn din prioritet:</string>\n\t<string name=\"account_port_title\">Tjenerport</string>\n\t<string name=\"account_port_sum\">Forvalg: 5222</string>\n\t<string name=\"account_port_dialog_title\">Skriv inn tjenerporten:</string>\n\t<string name=\"account_port_hint\">5222</string>\n\t<string name=\"account_customserver_title\">Egendefinert tjener</string>\n\t<string name=\"account_customserver_summ\">(Valgfritt) alternativt tjener-vertsnavn</string>\n\t<string name=\"account_customserver_dialog_title\">Skriv inn tjener-vertsnavn:</string>\n\t<string name=\"account_customserver_hint\">vert.eksempel.no</string>\n\t<string name=\"require_ssl_title\">Krev SSL/TLS</string>\n\t<string name=\"require_ssl_summ\">Alltid krypter tjenertilkobling</string>\n\n\t<!--StatusPopUp-->\n\t<string name=\"AddContact_SpinnerPrompt\">Velg gruppe</string>\n\t<string name=\"setStatusmsgHint\">Din meldingsstatus</string>\n\t<string name=\"setStatusTitle\">Sett din status</string>\n\t<string name=\"RenameGroup_summ\">Gi gruppen %s nytt navn:</string>\n\t<string name=\"RenameGroup_title\">Gi gruppe nytt navn</string>\n\t<string name=\"RenameEntry_summ\">Endre navn på %1$s (%2$s) til:</string>\n\t<string name=\"RenameEntry_title\">Gi kontakt nytt navn</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_summ\">Velg en gruppe fra tallvelgeren nedenfor</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_title\">Endre gruppe</string>\n\t<string name=\"deleteRosterItem_text\">Bekreft fjerning av %1$s (%2$s).</string>\n\t<string name=\"deleteRosterItem_title\">Slett kontakt</string>\n\t<string name=\"deleteChatHistory_text\">Fjern alle meldinger med %1$s (%2$s)?</string>\n\t<string name=\"deleteChatHistory_title\">Slett sludrehistorikk</string>\n\t<string name=\"subscriptionRequest_text\">%1$s ønsker å legge deg til som kontakt: \\\"%2$s\\\"</string>\n\t<string name=\"subscriptionRequest_title\">Abonnementsforespørsel</string>\n\t<string name=\"subscription_accept\">Godta</string>\n\t<string name=\"subscription_reject\">Avvis</string>\n\t<string name=\"subscription_reject_all\">Reject all</string>\n\t<string name=\"subscription_status_from\">kan se din status</string>\n\n\t<!-- CHATWINDOW -->\n\t<string name=\"chat_from_me\">Meg:</string>\n\t<string name=\"toast_stored_offline\">Meldingen har blitt lagret i påvente av forsendelse:</string>\n\t<string name=\"chat_enterMsgHint\">Skriv inn melding</string> \n\n\t<!-- Message context menu; use the verb form (to quote) -->\n\t<string name=\"chatmenu_quote\">Quote</string>\n\t<!-- Message context menu: repeat the same message -->\n\t<string name=\"chatmenu_resend\">Edit message</string>\n\n\t<!-- GPS settings -->\n\t<!--\n\t<string name=\"showGPS_title\">GPS to status</string>\n\t<string name=\"showGPS_summ_on\">GPS is send to StatusMessage</string>\n\t<string name=\"showGPS_summ_off\">GPS is send to StatusMessage</string>\n\t-->\n\n\t<!-- About Dialog -->\n\t<string name=\"AboutDialog_title\">Om yaxim</string>\n\t<string name=\"AboutDialog_DevelopersTitle\">Utviklere</string>\n\t<!-- Contact the developer button -->\n\t<string name=\"AboutDialog_DevelopersText\">Contact</string>\n\t<string name=\"AboutDialog_LicenceTitle\">Lisens</string>\n\t<string name=\"AboutDialog_Vote\">Rate app</string>\n\t<string name=\"AboutDialog_LicenceText\">Dette programmet er fri programvare; du kan dele det og/eller endre det i henhold til kravene i GNU General Public License versjon 2 publisert av Free Software Foundation. Lenke: http://www.gnu.org/licenses/gpl-2.0.html\\n \\n Deler av programvaren er tilbudt under MIT-lisens :\\n \\n Kopirett © 2009 Mads Kristiansen, Nullwire ApS\\n \\n Tilgang gis herved, gratis, til enhver person som måtte få en kopi av dette programmet og tilknyttede dokumentasjonsfiler (\"Programvaren\"), til å bruke den uten hindring, inkludert og uten rettigheter til å bruke, kopiere, modifisere, flette, offentliggjøre, distribuere, viderelisensiere, og/eller selge kopier av programvaren, og å gi personer som programvaren kan brukes av, underlagt følgende forhold: \\n Kopirettsmerknaden og tilgangsmerknaden skal inkluderes i alle kopier og bestanddeler av viktighet av Programvaren. \\n PROGRAMVAREN ER TILBUDT \"SOM DEN ER\", UTEN NOEN FORM FOR GARANTI AV NOEN ART, UTTRYKT ELLER IMPLISERT, INKLUDERT MEN IKKE BEGRENSET TIL GARANTI FOR SALGBARHET, EGNETHET FOR ET TILTENKT FORMÅL OG IKKE-KOPIRETTSBRUDD. UNDER INGEN OMSTENDIGHETER SKAL UTVIKLERNE ELLER OPPHAVSMENNENE HOLDES ANSVARLIG FOR NOE KRAV, ERSTATNINGSANSVAR ELLER ANNEN ERSTATNING, HVORVIDT I EN HANDLING AV KONTRAKTEN, ERSTATNINGSRETT ELLER ANNET, SOM SKRIVER SEG FRA ELLER HAR TILKNYTNING TIL PROGRAMVAREN ELLER BRUKEN ELLER ANNEN OMGANG MED PROGRAMVAREN.</string>\n\n\t<string name=\"status_available\">Tilkoblet</string>\n\t<string name=\"status_away\">Borte</string>\n\t<string name=\"status_chat\">Ledig for samtale</string>\n\t<string name=\"status_dnd\">Ikke forstyrr</string>\n\t<string name=\"status_xa\">Ikke tilgjengelig</string>\n\t<string name=\"status_offline\">Frakoblet</string>\n\n\t<string name=\"translator_credits\">Launchpad Contributions:\n  Allan Nordhøy https://launchpad.net/~comradekingu</string>\n\n\t<!-- default roster group with no name -->\n\t<string name=\"default_group\">Gruppe</string>\n\t<string name=\"all_contacts_group\">Alle kontakter</string>\n\t<string name=\"muc_group\">Gruppesamtaler</string>\n\n\t<!-- SEND listener popup -->\n\t<string name=\"chooseContact\">Velg kontakt</string>\n\t<string name=\"action_settings\">Innstillinger</string>\n\n\t<!-- MUC strings -->\n\t<string name=\"muc_jid_hint\">Gruppesludrings-JID</string>\n\t<string name=\"muc_nickname_hint\">Kallenavn</string>\n\t<string name=\"muc_password_hint\">Passord (valgfritt)</string>\n\t<string name=\"title_activity_muc_invite\">Gruppesludringsinvitasjon</string>\n\t<!-- Groupchat invitation: \"Invitation from {contact name}\" -->\n\t<string name=\"muc_invitation_from\">Invitasjon fra %s</string>\n\t<!-- Groupchat info: {description} ({number} participants) -->\n\t<string name=\"muc_invitation_occupants\">%1$s (%2$d deltagere)</string>\n\t<!-- Notification button: \"Join as {default nickname}\" (make SHORT string) -->\n\t<string name=\"muc_invitation_join\">Ta del som %s</string>\n\t<string name=\"muc_synchronizing\">Synkroniserer…</string>\n\t<!-- Title of user list, contains JID -->\n\t<string name=\"chat_muc_userlist\">Gruppesludringsdeltagere (%s)</string>\n\t<!-- Kicked from groupchat: \"Kicked: {reason} -->\n\t<string name=\"muc_kicked\">Kastet ut: %s</string>\n\t<!-- Kicked from groupchat: \"Kicked by {admin name}: {reason} -->\n\t<string name=\"muc_kicked_by\">Kastet ut %1$s: %2$s</string>\n\t<!-- Banned from groupchat: \"Banned: {reason} -->\n\t<string name=\"muc_banned\">Bannlyst: %s</string>\n\t<!-- Banned from groupchat: \"Banned by {admin name}: {reason} -->\n\t<string name=\"muc_banned_by\">Bannlyst av %1$s: %2$s</string>\n\n\t<!-- File upload -->\n\t<string name=\"roster_contextmenu_send\">Send…</string>\n\t<string name=\"roster_contextmenu_take_image\">Take picture</string>\n\t<string name=\"roster_contextmenu_send_image\">Choose picture</string>\n\t<string name=\"roster_contextmenu_send_file\">Send file</string>\n\t<string name=\"upload_compress\">Compressing picture…</string>\n\t<string name=\"upload_uploading\">Uploading…</string>\n\t<string name=\"upload_too_large\">file too large!</string>\n\t<string name=\"storage_permission\">%s needs storage access to send files!</string>\n\t<string name=\"notification_permission_denied\">Notifications are disabled in the Android app preferences.</string>\n\n\t<!-- Search -->\n\t<string name=\"search_msg_hint\">Message content</string>\n\n\t<!-- MUC bookmarks -->\n\t<string name=\"group_bookmarks\">My group chats</string>\n\t<string name=\"group_mucsearch\">Public group chats</string>\n\t<!-- Service Discovery -->\n\t<string name=\"title_service_disco\">Browser: %s</string>\n\n\t<!-- Android 9 notification preferences: permanent notification -->\n\t<string name=\"notification_status\">Foreground service</string>\n\t<!-- Android 9 notification preferences: message notifications -->\n\t<string name=\"notification_msg\">Messages</string>\n\n</resources>\n"
  },
  {
    "path": "res/values-nl/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"app_name\">yaxim</string>\n\t<string name=\"app_name_bruno\">Bruno</string>\n\n\t<!-- Connection state -->\n\t<string name=\"conn_title\">yaxim: %s</string>\n\t<string name=\"conn_title_bruno\">Bruno: %s</string>\n\t<string name=\"conn_connecting\">Bezig met verbinden...</string>\n\t<string name=\"conn_disconnecting\">Verbinding verbreken…</string>\n\t<string name=\"conn_online\">Online</string>\n\t<string name=\"conn_offline\">Offline</string>\n\t<string name=\"conn_empty_roster\">Er zijn geen contacten beschikbaar!</string>\n\t<string name=\"conn_empty_roster_hints\">Je kunt op verschillende manieren contacten toevoegen aan je lijst: \\n\\n - Android Beam™: raak de telefoon van een vriend aan\\n - Scan een QR-code\\n\\n - \\\"Uitnodiging maken\\\" en deel het (via e-mail, SMS, QR code, …)\\n\\n - \\\"Contact toevoegen\\\" als je de gebruikersnaam al kent.</string>\n\t<string name=\"conn_reconnect\">Volgende poging in %d seconden</string>\n\t<string name=\"conn_disconnected\">Verbinding verbroken</string>\n\t<string name=\"conn_no_network\">Geen netwerkverbinding</string>\n\t<string name=\"conn_ping_timeout\">Geen antwoord</string>\n\t<string name=\"conn_error\">Fout: %s</string>\n\n\t<!-- Global Strings -->\n\t<string name=\"Global_Exit\">Sluiten</string>\n\t<string name=\"Global_authenticate_first\">Maak a.u.b. eerst verbinding</string>\n\t<string name=\"Global_JID_hint\">user@yax.im</string>\n\t<!-- tooltip message when the user entered an invalid XMPP address -->\n\t<string name=\"Global_JID_malformed\">Controleer adres!</string>\n\n\t<!-- FirstStartUpDialog -->\n\t<string name=\"StartupDialog_Title\">Welkom bij yaxim!</string>\n\t<string name=\"StartupDialog_Summary\">Je moet eerst wat dingen instellen voordat je yaxim kunt gebruiken. Voer a.u.b. een gebruikersnaam en wachtwoord in.</string>\n\t<string name=\"StartupDialog_pwHint\">Wachtwoord invoeren</string>\n\t<string name=\"StartupDialog_pwshowHint\">Toon wachtwoord</string>\n\t<string name=\"StartupDialog_Username_title\">Jabber ID:</string>\n\t<string name=\"StartupDialog_passwd_title\">Wachtwoord:</string>\n\t<string name=\"StartupDialog_advanced\">Geavanceerd…</string>\n\t<string name=\"StartupDialog_create_new\">Registreer nieuw account op server</string>\n\t<string name=\"StartupDialog_error_password\">Het wachtwoord is te kort!</string>\n\t<string name=\"StartupDialog_created_password\">Veilig wachtwoord aangemaakt</string>\n\t<string name=\"StartupDialog_auth_failed\">Loop je gebruikersnaam en wachtwoord na!</string>\n\t<string name=\"StartupDialog_server_failed\">Kon niet verbinden met %s!</string>\n\t<string name=\"StartupDialog_no_registration\">Server staat registreren niet toe!</string>\n\n\t<string name=\"StartupDialog_invitation\">Je bent uitgenodigd bij Jabber. Voltooi alstublieft uw registratie.</string>\n\t<string name=\"StartupDialog_no_more_accounts\">Geen extra account ondersteund!</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_message\">Bericht van %s</string>\n\t<string name=\"notification_anonymous_message\">Bericht ontvangen</string>\n\t<!--  Group Chat notification, %1$s is the user name, %2$s is the room, e.g. \"{Ge0rG} in {yaxim Chat}\" -->\n\t<string name=\"notification_muc_message\">%1$s in %2$s</string>\n\t<!--  Group Group Chat private message notification, %1$s is the user name, %2$s is the room, e.g. \"Message from {Ge0rG} in {yaxim Chat}\" -->\n\t<!--string name=\"notification_muc_pm\">Message from %1$s in %2$s</string-->\n\t<!-- notification button: direct reply (make SHORT string) -->\n\t<string name=\"notification_reply\">Reageren</string>\n\t<!-- notification button: mark as read (make SHORT string) -->\n\t<string name=\"notification_mark_read\">Markeer als gelezen</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_error\">Fout bij het verzenden van bericht!</string>\n\n\t<!-- Notification Settings -->\n\t<string name=\"preftitle_notify\">Notificatie-instellingen</string>\n\t<string name=\"preftitle_notify_msg\">Meldingen voor bericht</string>\n\t<string name=\"preftitle_notify_muc\">Meldingen voor groepsgesprek</string>\n\t<string name=\"notification_custom\">Aangepaste beltoon</string>\n\t<string name=\"muc_highlight_title\">Alleen bij vermelding</string>\n\t<string name=\"muc_highlight_sum\">Attenderen wanneer je gebruikersnaam in een groepsgesprek wordt genoemd</string>\n\t<string name=\"led_title\">Knipper LED</string>\n\t<string name=\"led_summ\">Laat telefoon LED knipperen bij binnenkomende berichten.</string>\n\t<string name=\"vibr_title\">Vibratie</string>\n\t<string name=\"vibr_summ\">Tril bij inkomende berichten</string>\n\t<string-array name=\"vibr_values_displayed\">\n\t\t<item>Nooit</item>\n\t\t<item>Systeemvoorkeuren</item>\n\t\t<item>Altijd</item>\n\t</string-array>\n\t<string name=\"ringtone_title\">Beltoon</string>\n\t<string name=\"ringtone_summ\">Geluid voor inkomende berichten</string>\n\t<string name=\"ticker_title\">Voorvertoning bericht</string>\n\t<string name=\"ticker_summ\">Toon afzender en bericht in de statusbalk</string>\n\n\t<!-- Startup Setting Strings -->\n\t<string name=\"preftitle_general\">Algemene instellingen</string>\n\t<string name=\"pref_dnd_when_silent\">\\\"Niet storen\\\" in stille modus</string>\n\t<string name=\"pref_dnd_when_silent_summ\">Stel je aanwezigheid in als \\\"niet storen\\\" wanneer je telefoon op stille modus staat</string>\n\t<string name=\"statuspopup_name\">Stel je status in</string>\n\t<string name=\"showOffline_summ\">Toon altijd alle contacten in de lijst</string>\n\t<string name=\"showOffline_title\">Offline contacten tonen</string>\n\t<string name=\"enableGroups_summ\">Contacten naar groep sorteren</string>\n\t<string name=\"enableGroups_title\">Contactengroepen tonen</string>\n\t<string name=\"foregroundService_summ\">Houd applicatie in werkgeheugen om altijd verbonden te zijn</string>\n\t<string name=\"foregroundService_title\">Statusbalk icoon</string>\n\n\t<string name=\"preftitle_debug\">Fouten opsporen</string>\n\t<string name=\"smackdebug_summ\">Pakket en debug output via logcat (kan persoonlijke informatie bevatten)</string>\n\t<string name=\"smackdebug_title\">SMACK debugging</string>\n\n\t<string name=\"reportcrash_title\">Stuur crash rapportages</string>\n\t<string name=\"reportcrash_summ\">Stuur anonieme crash-rapportages naar de ontwikkelaar</string>\n\n\t<!-- Appearence Strings -->\n\t<string name=\"preftitle_app\">Weergave</string>\n\t<string name=\"FontChat_title\">Lettertypegrootte</string>\n\t<string name=\"FontChat_summ\">Stel de lettertypegrootte in van gesprekken</string>\n\t<string name=\"FontChat_dialog\">Lettertypegrootte</string>\n\t<!--\n\t<string name=\"FontRost_title\">Roster font size</string>\n\t<string name=\"FontRost_summ\">Set roster font size</string>\n\t<string name=\"FontRost_dialog\">Roster font fize</string>\n\t<string name=\"setFontRoster\">Set roster font size</string>\n\t-->\n\t<string name=\"pref_theme\">Thema</string>\n\t<string name=\"pref_theme_dark\">Donker</string>\n\t<string name=\"pref_theme_light\">Licht</string>\n\t<string name=\"pref_theme_pine\">Pine</string>\n\t<string name=\"pref_theme_ice\">IJs</string>\n\t<string name=\"preftitle_ui\">Weergave</string>\n\t<string-array name=\"fontSizesChat\">\n\t\t<item>klein</item>\n\t\t<item>normaal</item>\n\t\t<item>groot</item>\n\t\t<item>extra groot</item>\n\t</string-array>\n\n\t<!-- Mainmenu \t-->\n\t<string name=\"Menu_addFriend\">Contact toevoegen</string>\n\t<string name=\"Menu_addClipboard\">Voeg %s toe</string>\n\t<string name=\"Menu_ShowOff\">Offline tonen</string>\n\t<string name=\"Menu_HideOff\">Offline verbergen</string>\n\t<string name=\"Menu_AccSettings\">Account bewerken</string>\n\t<string name=\"Menu_Settings\">Instellingen</string>\n\t<string name=\"Menu_Status\">Status</string>\n\t<string name=\"Menu_connect\">Verbinding maken</string>\n\t<string name=\"Menu_disconnect\">Verbinding verbreken</string>\n\t<string name=\"Menu_about\">Over yaxim</string>\n\t<string name=\"Menu_about_bruno\">Over Bruno</string>\n\t<string name=\"Menu_muc\">Voeg bestand toe...</string>\n\t<string name=\"Menu_matrix\">Enter the Matrix…</string>\n\t<string name=\"Menu_mark_all_as_read\">Markeer alles als gelezen</string>\n\t<string name=\"Menu_send_invitation\">Uitnodiging maken</string>\n    <string name=\"Menu_userlist\">Deelnemers</string>\n\n\n\t<!-- AddFriend -->\n\t<string name=\"addFriend_Title\">Contactpersoon toevoegen</string>\n\t<string name=\"addFriend_Summ\">Voer de Jabber ID van een vriend in, zijn/haar schermnaam en kies een groep om  hem/haar aan toe te voegen!</string>\n\t<string name=\"addFriend_aliasHint\">Schermnaam</string>\n\t<string name=\"addrosteritemaddgroupchoice\">Toevoegen aan een nieuwe groep</string>\n\t<string name=\"NewGroup_EditTextField_Hint\">Naam voor de nieuwe groep</string>\n\n\t<!-- Roster CONTEXTMENU -->\n\t<string name=\"roster_contextmenu_group_rename\">Groep hernoemen</string>\n\t<string name=\"roster_contextmenu_contact_mark_as_read\">Markeren als gelezen</string>\n\t<string name=\"roster_contextmenu_contact_delete\">Contact verwijderen</string>\n\t<string name=\"roster_contextmenu_contact_delmsg\">Chatgeschiedenis wissen</string>\n\t<string name=\"roster_contextmenu_contact_rename\">Naam wijzigen</string>\n\t<string name=\"roster_contextmenu_contact_request_auth\">Vraag om authorisering</string>\n\t<string name=\"roster_contextmenu_contact_change_group\">Groep wijzigen</string>\n\t<string name=\"roster_contextmenu_contact_share\">Adres delen</string>\n\t<string name=\"roster_contextmenu_contact_ringtone\">Beltoon</string>\n\t<string name=\"roster_contextmenu_muc_edit\">Groepsgesprek bewerken</string>\n\t<string name=\"roster_contextmenu_muc_leave\">Groepsgesprek verlaten</string>\n\t<string name=\"muc_leave_question\">Weet je zeker dat je %s wilt verlaten?</string>\n\n\t<!-- Accountprefs -->\n\t<string name=\"account_settings_login\">Inloggegevens</string>\n\t<string name=\"account_settings_title\">Accountinstellingen</string>\n\t<string name=\"account_options_title\">Verbindingsopties</string>\n\t<string name=\"account_options_advanced\">Geavanceerde Opties</string>\n\t<string name=\"carbons_title\">Message Carbons (XEP-0280)</string>\n\t<string name=\"carbons_summ\">Synchroniseer berichten met je andere apparaten</string>\n\t<string name=\"account_jabberID_title\">Jabber ID</string>\n\t<string name=\"account_jabberID_sum\">Voorbeeld: ik@jabber.voorbeeld.com</string>\n\t<string name=\"account_jabberID_dialog_title\">Voer uw Jabber ID in:</string>\n\t<string name=\"account_jabberPW_title\">Account wachtwoord</string>\n\t<string name=\"account_jabberPW_sum\">Uw Jabber account wachtwoord</string>\n\t<string name=\"account_jabberPW_change_on_server\">Wachtwoord op server veranderen</string>\n\t<string name=\"account_jabberPW_password_old\">Oud wachtwoord:</string>\n\t<string name=\"account_jabberPW_password_new\">Nieuw wachtwoord:</string>\n\t<string name=\"account_jabberPW_warning\">LET OP! Om je te kunnen aanmelden moet je het zelfde wachtwoord op de server instellen!</string>\n\t<string name=\"account_jabberPW_progress\">Wachtwoord veranderen, even geduld a.u.b.</string>\n\t<string name=\"account_jabberPW_finished\">Wachtwoord succesvol gewijzigd.</string>\n\t<string name=\"account_jabberPW_error\">Fout bij wijzigen wachtwoord: %s</string>\n\t<string name=\"account_nickname_title\">Weergavenaam</string>\n\t<string name=\"account_nickname_summ\">Jouw bijnaam (openbaar voor andere gebruikers)</string>\n\t\n\t<!-- accountprefs -->\n\t<string name=\"account_resource_title\">Naam apparaat</string>\n\t<string name=\"account_resource_summ\">Standaard: yaxim</string>\n\t<string name=\"account_resource_dialog_title\">Vul nieuwe naam apparaat in</string>\n\t<string name=\"account_resource_hint\">yaxim</string>\n\t<string name=\"account_prio_title\">Apparaat prioriteit</string>\n\t<string name=\"account_prio_summ\">Standaard: 0</string>\n\t<string name=\"account_prio_error\">Toegestane waarden: -128 .. 127</string>\n\t<string name=\"account_prio_dialog_title\">Voer uw prioriteit in:</string>\n\t<string name=\"account_port_title\">Serverpoort</string>\n\t<string name=\"account_port_sum\">Standaard: 5222</string>\n\t<string name=\"account_port_dialog_title\">Voer de serverpoort in:</string>\n\t<string name=\"account_port_hint\">5222</string>\n\t<string name=\"account_customserver_title\">Aangepaste Server</string>\n\t<string name=\"account_customserver_summ\">(Optioneel) alternatief domein</string>\n\t<string name=\"account_customserver_dialog_title\">Voer server hostnaam in:</string>\n\t<string name=\"account_customserver_hint\">host.voorbeeld.com</string>\n\t<string name=\"require_ssl_title\">SSL/TLS Vereist</string>\n\t<string name=\"require_ssl_summ\">Altijd de serververbinding versleutelen</string>\n\n\t<!--StatusPopUp-->\n\t<string name=\"AddContact_SpinnerPrompt\">Groep kiezen</string>\n\t<string name=\"setStatusmsgHint\">Nieuwe status instellen</string>\n\t<string name=\"setStatusTitle\">Stel je status in</string>\n\t<string name=\"RenameGroup_summ\">Groep %s hernoemen naar:</string>\n\t<string name=\"RenameGroup_title\">Groep hernoemen</string>\n\t<string name=\"RenameEntry_summ\">Hernoem  %1$s (%2$s) naar:</string>\n\t<string name=\"RenameEntry_title\">Contact hernoemen</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_summ\">Selecteer een groep van de spinner beneden</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_title\">Groep wijzigen</string>\n\t<string name=\"deleteRosterItem_text\">Weet u zeker dat u %1$s (%2$s) wilt verwijderen?</string>\n\t<string name=\"deleteRosterItem_title\">Contactpersoon verwijderen</string>\n\t<string name=\"deleteChatHistory_text\">Weet u zeker dat u alle berichten met %1$s (%2$s) wilt verwijderen?</string>\n\t<string name=\"deleteChatHistory_title\">Berichtgeschiedenis verwijderen</string>\n\t<string name=\"subscriptionRequest_text\">%1$s wil je toevogen als een contact:  \\\"%2$s\\\"</string>\n\t<string name=\"subscriptionRequest_title\">Inschrijvingsverzoek</string>\n\t<string name=\"subscription_accept\">Accepteren</string>\n\t<string name=\"subscription_reject\">Weigeren</string>\n\t<string name=\"subscription_reject_all\">Reject all</string>\n\t<string name=\"subscription_status_from\">Kan je status zien</string>\n\n\t<!-- CHATWINDOW -->\n\t<string name=\"chat_from_me\">Ik:</string>\n\t<string name=\"toast_stored_offline\">Het bericht is opgeslagen voor verzenden.</string>\n\t<string name=\"chat_enterMsgHint\">Typ een bericht</string> \n\n\t<!-- Message context menu; use the verb form (to quote) -->\n\t<string name=\"chatmenu_quote\">Citaat</string>\n\t<!-- Message context menu: repeat the same message -->\n\t<string name=\"chatmenu_resend\">Bewerk bericht</string>\n\n\t<!-- GPS settings -->\n\t<!--\n\t<string name=\"showGPS_title\">GPS to status</string>\n\t<string name=\"showGPS_summ_on\">GPS is send to StatusMessage</string>\n\t<string name=\"showGPS_summ_off\">GPS is send to StatusMessage</string>\n\t-->\n\n\t<!-- About Dialog -->\n\t<string name=\"AboutDialog_title\">Over yaxim</string>\n\t<string name=\"AboutDialog_DevelopersTitle\">Ontwikkelaars</string>\n\t<!-- Contact the developer button -->\n\t<string name=\"AboutDialog_DevelopersText\">Contact</string>\n\t<string name=\"AboutDialog_LicenceTitle\">Licentie</string>\n\t<string name=\"AboutDialog_Vote\">Beoordeel deze app</string>\n\t<string name=\"AboutDialog_LicenceText\">Dit Programma is vrije software; U kan het verspreiden en/of wijzigen onder de bepalingen van de GNU Algemene Publieke Licentie v 2, zoals uitgegeven door de Free Software Foundation. Zie http://www.gnu.org/licenses/gpl-2.0.html\\n \\n Delen van deze software zijn uitgegeven onder de MIT licentie:\\n \\n Copyright © 2009 Mads Kristiansen, Nullwire ApS\\n \\n OMDAT HET PROGRAMMA ZONDER KOSTEN IN LICENTIE GEGEVEN WORDT, IS ER GEEN GARANTIE VOOR HET PROGRAMMA, VOOR ZOVER MOGELIJK BINNEN DE GELDENDE WETGEVING. UITGEZONDERD WANNEER HET EXPLICIET GESCHREVEN STAAT LEVEREN DE\nAUTEURSRECHTHOUDERS HET PROGRAMMA \"ZOALS HET IS\", ZONDER EENDER WELKE GARANTIE, EXPLICIET UITGEDRUKT OF IMPLICIET BEDOELD, ZOALS, MAAR NIET GELIMITEERD TOT, DE IMPLICIETE GARANTIES VAN VERKOOPBAARHEID EN GESCHIKTHEID VOOR EEN BEPAALD DOEL. HET VOLLEDIGE RISICO BETREFFENDE DE KWALITEIT EN DE PRESTATIES VAN HET\nPROGRAMMA LIGT BIJ U. MOCHT HET PROGRAMMA DEFECT BLIJKEN DAN DRAAGT U DE KOSTEN VAN ALLE BENODIGDE DIENSTEN, REPARATIES OF CORRECTIES.</string>\n\n\t<string name=\"status_available\">Online</string>\n\t<string name=\"status_away\">Afwezig</string>\n\t<string name=\"status_chat\">Beschikbaar om te chatten</string>\n\t<string name=\"status_dnd\">Niet storen</string>\n\t<string name=\"status_xa\">Niet beschikbaar</string>\n\t<string name=\"status_offline\">Offline</string>\n\n\t<string name=\"translator_credits\">Launchpad Contributions:\n  Argafål https://launchpad.net/~argafal\n  Barry Zoot https://launchpad.net/~barryzoot\n  Eloy Degen https://launchpad.net/~eloydegen\n  Georg Lukas https://launchpad.net/~ge0rg\n  Jeroen Tietema https://launchpad.net/~jtietema\n  Mitchell Heijnen https://launchpad.net/~hi-im-mitchell\n  NightWhistler https://launchpad.net/~0k53dmx9cig8-alex-f830mk0e7z07\n  Roel RA https://launchpad.net/~roelra</string>\n\n\t<!-- default roster group with no name -->\n\t<string name=\"default_group\">Algemeen</string>\n\t<string name=\"all_contacts_group\">Alle contacten</string>\n\t<string name=\"muc_group\">Groepsgesprekken</string>\n\n\t<!-- SEND listener popup -->\n\t<string name=\"chooseContact\">Kies contact</string>\n\t<string name=\"action_settings\">Instellingen</string>\n\n\t<!-- MUC strings -->\n\t<string name=\"muc_jid_hint\">Schermnaam in groepsgesprek</string>\n\t<string name=\"muc_nickname_hint\">Schermnaam</string>\n\t<string name=\"muc_password_hint\">Wachtwoord (optioneel)</string>\n\t<string name=\"title_activity_muc_invite\">Uitnodiging voor groepsgesprek</string>\n\t<!-- Groupchat invitation: \"Invitation from {contact name}\" -->\n\t<string name=\"muc_invitation_from\">Uitnodiging van %s</string>\n\t<!-- Groupchat info: {description} ({number} participants) -->\n\t<string name=\"muc_invitation_occupants\">%1$s (%2$d deelnemers)</string>\n\t<!-- Notification button: \"Join as {default nickname}\" (make SHORT string) -->\n\t<string name=\"muc_invitation_join\">Deelnemen als %s</string>\n\t<string name=\"muc_synchronizing\">Bijwerken...</string>\n\t<!-- Title of user list, contains JID -->\n\t<string name=\"chat_muc_userlist\">Deelnemers groepsgesprek (%s)</string>\n\t<!-- Kicked from groupchat: \"Kicked: {reason} -->\n\t<string name=\"muc_kicked\">Verwijderd: %s</string>\n\t<!-- Kicked from groupchat: \"Kicked by {admin name}: {reason} -->\n\t<string name=\"muc_kicked_by\">Verwijderd door %1$s: %2$s</string>\n\t<!-- Banned from groupchat: \"Banned: {reason} -->\n\t<string name=\"muc_banned\">Verbannen: %s</string>\n\t<!-- Banned from groupchat: \"Banned by {admin name}: {reason} -->\n\t<string name=\"muc_banned_by\">Verbannen door %1$s: %2$s</string>\n\n\t<!-- File upload -->\n\t<string name=\"roster_contextmenu_send\">Verstuur...</string>\n\t<string name=\"roster_contextmenu_take_image\">Neem foto</string>\n\t<string name=\"roster_contextmenu_send_image\">Kies afbeelding</string>\n\t<string name=\"roster_contextmenu_send_file\">Send file</string>\n\t<string name=\"upload_compress\">Afbeelding comprimeren...</string>\n\t<string name=\"upload_uploading\">Uploaden…</string>\n\t<string name=\"upload_too_large\">Bestand te groot!</string>\n\t<string name=\"storage_permission\">%s needs storage access to send files!</string>\n\t<string name=\"notification_permission_denied\">Notifications are disabled in the Android app preferences.</string>\n\n\t<!-- Search -->\n\t<string name=\"search_msg_hint\">Berichtinhoud</string>\n\n\t<!-- MUC bookmarks -->\n\t<string name=\"group_bookmarks\">Mijn groepgesprekken</string>\n\t<string name=\"group_mucsearch\">Openbare groepgesprekken</string>\n\t<!-- Service Discovery -->\n\t<string name=\"title_service_disco\">Browser: %s</string>\n\n\t<!-- Android 9 notification preferences: permanent notification -->\n\t<string name=\"notification_status\">Foreground service</string>\n\t<!-- Android 9 notification preferences: message notifications -->\n\t<string name=\"notification_msg\">Berichten</string>\n\n</resources>\n"
  },
  {
    "path": "res/values-pl/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"app_name\">yaxim</string>\n\t<string name=\"app_name_bruno\">Bruno</string>\n\n\t<!-- Connection state -->\n\t<string name=\"conn_title\">yaxim: %s</string>\n\t<string name=\"conn_title_bruno\">Bruno: %s</string>\n\t<string name=\"conn_connecting\">Łączenie z serwerem…</string>\n\t<string name=\"conn_disconnecting\">Rozłączanie...</string>\n\t<string name=\"conn_online\">Połączony</string>\n\t<string name=\"conn_offline\">Rozłączony</string>\n\t<string name=\"conn_empty_roster\">Brak kontaktów</string>\n\t<string name=\"conn_empty_roster_hints\">Jest wiele sposobów dodania kontaktów:\\n\\n - Android Beam™: zetknij telefony ze sobą\\n\\n - Zeskanuj QR kod\\n\\n - \\\"Stwórz zaproszenie\\\" i udostępnij je (e-mail, SMS, QR kod, …)\\n\\n - \\\"Dodaj kontakt\\\" jeśli znasz identyfikator JID</string>\n\t<string name=\"conn_reconnect\">Następna próba połączenia za %d sekund.</string>\n\t<string name=\"conn_disconnected\">Połączenie zakończone</string>\n\t<string name=\"conn_no_network\">Brak połączenia sieciowego</string>\n\t<string name=\"conn_ping_timeout\">Brak odpowiedzi</string>\n\t<string name=\"conn_error\">Błąd: %s</string>\n\n\t<!-- Global Strings -->\n\t<string name=\"Global_Exit\">Wyjście</string>\n\t<string name=\"Global_authenticate_first\">Najpierw nawiąż połączenie</string>\n\t<string name=\"Global_JID_hint\">użytkownik@yax.im</string>\n\t<!-- tooltip message when the user entered an invalid XMPP address -->\n\t<string name=\"Global_JID_malformed\">Sprawdź format adresu!</string>\n\n\t<!-- FirstStartUpDialog -->\n\t<string name=\"StartupDialog_Title\">Witaj w yaxim!</string>\n\t<string name=\"StartupDialog_Summary\">Używanie yaxima wymaga konfiguracji. Podaj swój Jabber ID i hasło.</string>\n\t<string name=\"StartupDialog_pwHint\">Wprowadź hasło</string>\n\t<string name=\"StartupDialog_pwshowHint\">Pokaż hasło</string>\n\t<string name=\"StartupDialog_Username_title\">Jabber ID:</string>\n\t<string name=\"StartupDialog_passwd_title\">Hasło:</string>\n\t<string name=\"StartupDialog_advanced\">Zaawansowane…</string>\n\t<string name=\"StartupDialog_create_new\">Zarejestruj nowe konto</string>\n\t<string name=\"StartupDialog_error_password\">Hasło jest zbyt krótkie!</string>\n\t<string name=\"StartupDialog_created_password\">Utworzono bezpieczne hasło</string>\n\t<string name=\"StartupDialog_auth_failed\">Prosze sprawdź swóją nazwę użytkownika i hasło</string>\n\t<string name=\"StartupDialog_server_failed\">Could not connect to %s!</string>\n\t<string name=\"StartupDialog_no_registration\">Server does not allow registration!</string>\n\n\t<string name=\"StartupDialog_invitation\">Zostałeś zaproszony do Jabbera. Ukończ swoją rejestrację.</string>\n\t<string name=\"StartupDialog_no_more_accounts\">Dodatkowe konta nie są wspierane!</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_message\">Wiadomość od %s</string>\n\t<string name=\"notification_anonymous_message\">Otrzymano wiadomość</string>\n\t<!--  Group Chat notification, %1$s is the user name, %2$s is the room, e.g. \"{Ge0rG} in {yaxim Chat}\" -->\n\t<string name=\"notification_muc_message\">%1$s w %2$s</string>\n\t<!--  Group Group Chat private message notification, %1$s is the user name, %2$s is the room, e.g. \"Message from {Ge0rG} in {yaxim Chat}\" -->\n\t<!--string name=\"notification_muc_pm\">Message from %1$s in %2$s</string-->\n\t<!-- notification button: direct reply (make SHORT string) -->\n\t<string name=\"notification_reply\">Odpowiedz</string>\n\t<!-- notification button: mark as read (make SHORT string) -->\n\t<string name=\"notification_mark_read\">Oznacz jako przeczytane</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_error\">Błąd podczas wysyłania wiadomości!</string>\n\n\t<!-- Notification Settings -->\n\t<string name=\"preftitle_notify\">Ustawienia powiadomień</string>\n\t<string name=\"preftitle_notify_msg\">Powiadamianie o wiadomościach</string>\n\t<string name=\"preftitle_notify_muc\">Powiadamianie o czatach</string>\n\t<string name=\"notification_custom\">Własny dźwięk dzwonka</string>\n\t<string name=\"muc_highlight_title\">Powiadamiaj tylko przy wspomianiu</string>\n\t<string name=\"muc_highlight_sum\">Powiadamiaj gdy twój pseudonim zostanie wspomniany w pokoju czatu</string>\n\t<string name=\"led_title\">Powiadomienie diodą LED</string>\n\t<string name=\"led_summ\">Migaj diodą LED przy nowej wiadomości</string>\n\t<string name=\"vibr_title\">Wibracje</string>\n\t<string name=\"vibr_summ\">Wibruj przy nowej wiadomości</string>\n\t<string-array name=\"vibr_values_displayed\">\n\t\t<item>Nigdy</item>\n\t\t<item>Ustawienie systemowe</item>\n\t\t<item>Zawsze</item>\n\t</string-array>\n\t<string name=\"ringtone_title\">Dzwonek</string>\n\t<string name=\"ringtone_summ\">Dzwonek dla przychodzących wiadomości</string>\n\t<string name=\"ticker_title\">Podgląd wiadomości</string>\n\t<string name=\"ticker_summ\">Pokazuj wiadomość i nadawcę na pasku statusu</string>\n\n\t<!-- Startup Setting Strings -->\n\t<string name=\"preftitle_general\">Ustawienia ogólne</string>\n\t<string name=\"pref_dnd_when_silent\">\\\"Nie przeszkadzać\\\" w trybie cichym</string>\n\t<string name=\"pref_dnd_when_silent_summ\">Ustaw status połaczenia na \\\"Nie przeszkadzać\\\" kiedy telefon jest w trybie cichym</string>\n\t<string name=\"statuspopup_name\">Ustaw swój status</string>\n\t<string name=\"showOffline_summ\">Zawsze pokazuj wszystkie kontakty na liście</string>\n\t<string name=\"showOffline_title\">Pokaż kontakty w trybie offline</string>\n\t<string name=\"enableGroups_summ\">Uporządkuj kontakty według grup</string>\n\t<string name=\"enableGroups_title\">Wyświetlanie grup kontaktów</string>\n\t<string name=\"foregroundService_summ\">Keep app in memory to ensure always-on connection (foreground service)</string>\n\t<string name=\"foregroundService_title\">Ikona na pasku powiadomień</string>\n\n\t<string name=\"preftitle_debug\">Debugowanie</string>\n\t<string name=\"smackdebug_summ\">Włącz wyjście debugowania przez logcat (może zawierać informacje osobiste)</string>\n\t<string name=\"smackdebug_title\">Debugowanie SMACK</string>\n\n\t<string name=\"reportcrash_title\">Wysyłaj raporty o awariach</string>\n\t<string name=\"reportcrash_summ\">Wysyłanie anonimowych zgłoszeń awarii do programisty</string>\n\n\t<!-- Appearence Strings -->\n\t<string name=\"preftitle_app\">Wygląd</string>\n\t<string name=\"FontChat_title\">Rozmiar czcionki czatu</string>\n\t<string name=\"FontChat_summ\">Ustaw rozmiar czcionki czatu</string>\n\t<string name=\"FontChat_dialog\">Rozmiar czcionki czatu</string>\n\t<!--\n\t<string name=\"FontRost_title\">Roster font size</string>\n\t<string name=\"FontRost_summ\">Set roster font size</string>\n\t<string name=\"FontRost_dialog\">Roster font fize</string>\n\t<string name=\"setFontRoster\">Set roster font size</string>\n\t-->\n\t<string name=\"pref_theme\">Motyw</string>\n\t<string name=\"pref_theme_dark\">Ciemny</string>\n\t<string name=\"pref_theme_light\">Jasny</string>\n\t<string name=\"pref_theme_pine\">Sosna</string>\n\t<string name=\"pref_theme_ice\">Lód</string>\n\t<string name=\"preftitle_ui\">Wygląd</string>\n\t<string-array name=\"fontSizesChat\">\n\t\t<item>mały</item>\n\t\t<item>normalny</item>\n\t\t<item>duży</item>\n\t\t<item>wielki</item>\n\t</string-array>\n\n\t<!-- Mainmenu \t-->\n\t<string name=\"Menu_addFriend\">Dodaj kontakt</string>\n\t<string name=\"Menu_addClipboard\">Dodaj %s</string>\n\t<string name=\"Menu_ShowOff\">Pokaż offline</string>\n\t<string name=\"Menu_HideOff\">Ukryj offline</string>\n\t<string name=\"Menu_AccSettings\">Edytuj konto</string>\n\t<string name=\"Menu_Settings\">Ustawienia</string>\n\t<string name=\"Menu_Status\">Status</string>\n\t<string name=\"Menu_connect\">Połącz</string>\n\t<string name=\"Menu_disconnect\">Rozłącz</string>\n\t<string name=\"Menu_about\">O programie</string>\n\t<string name=\"Menu_about_bruno\">O programie</string>\n\t<string name=\"Menu_muc\">Dodaj / przeglądaj</string>\n\t<string name=\"Menu_matrix\">Wejdź do Matrixa...</string>\n\t<string name=\"Menu_mark_all_as_read\">Oznacz wszystkie jako przeczytane</string>\n\t<string name=\"Menu_send_invitation\">Utwórz zaproszenie</string>\n    <string name=\"Menu_userlist\">Uczestnicy</string>\n\n\n\t<!-- AddFriend -->\n\t<string name=\"addFriend_Title\">Dodaj kontakt</string>\n\t<string name=\"addFriend_Summ\">Podaj Jabber ID, nazwę kontaktu i wybierz grupę.</string>\n\t<string name=\"addFriend_aliasHint\">Wyświetlana nazwa</string>\n\t<string name=\"addrosteritemaddgroupchoice\">Dodaj do nowej grupy</string>\n\t<string name=\"NewGroup_EditTextField_Hint\">Nazwa nowej grupy</string>\n\n\t<!-- Roster CONTEXTMENU -->\n\t<string name=\"roster_contextmenu_group_rename\">Zmień nazwę grupy</string>\n\t<string name=\"roster_contextmenu_contact_mark_as_read\">Oznacz jako przeczytane</string>\n\t<string name=\"roster_contextmenu_contact_delete\">Usuń kontakt</string>\n\t<string name=\"roster_contextmenu_contact_delmsg\">Usuń historię czatu</string>\n\t<string name=\"roster_contextmenu_contact_rename\">Zmień nazwę</string>\n\t<string name=\"roster_contextmenu_contact_request_auth\">Zażądaj autoryzacji</string>\n\t<string name=\"roster_contextmenu_contact_change_group\">Zmień grupę</string>\n\t<string name=\"roster_contextmenu_contact_share\">Udostępnij adres</string>\n\t<string name=\"roster_contextmenu_contact_ringtone\">Dzwonek</string>\n\t<string name=\"roster_contextmenu_muc_edit\">Edytuj czat grupowy</string>\n\t<string name=\"roster_contextmenu_muc_leave\">Opuść czat grupowy</string>\n\t<string name=\"muc_leave_question\">Naprawdę opuścić %s?</string>\n\n\t<!-- Accountprefs -->\n\t<string name=\"account_settings_login\">Informacje logowania</string>\n\t<string name=\"account_settings_title\">Ustawienia konta</string>\n\t<string name=\"account_options_title\">Ustawienia połączenia</string>\n\t<string name=\"account_options_advanced\">Zaawansowane ustawienia</string>\n\t<string name=\"carbons_title\">Kopie wiadomości  (XEP-0280)</string>\n\t<string name=\"carbons_summ\">Żądaj kopii wiadomości z innych klientów</string>\n\t<string name=\"account_jabberID_title\">Jabber ID</string>\n\t<string name=\"account_jabberID_sum\">przykład: ja@jabber.serwer.com</string>\n\t<string name=\"account_jabberID_dialog_title\">Wprowadż swój  Jabber ID:</string>\n\t<string name=\"account_jabberPW_title\">Hasło</string>\n\t<string name=\"account_jabberPW_sum\">Hasło twojego konta Jabber</string>\n\t<string name=\"account_jabberPW_change_on_server\">Zmień hasło na serwerze</string>\n\t<string name=\"account_jabberPW_password_old\">Poprzednie hasło:</string>\n\t<string name=\"account_jabberPW_password_new\">Nowe hasło:</string>\n\t<string name=\"account_jabberPW_warning\">OSTRZEŻENIE: Dla poprawnego zalogowania musisz ustawić takie samo hasło na serwerze!</string>\n\t<string name=\"account_jabberPW_progress\">Proszę czekać, zmieniam hasło…</string>\n\t<string name=\"account_jabberPW_finished\">Hasło zostało zmienione.</string>\n\t<string name=\"account_jabberPW_error\">Błąd zmiany hasła: %s</string>\n\t<string name=\"account_nickname_title\">Wyświetlana nazwa</string>\n\t<string name=\"account_nickname_summ\">Your nickname displayed to other users</string>\n\t\n\t<!-- accountprefs -->\n\t<string name=\"account_resource_title\">Zasób</string>\n\t<string name=\"account_resource_summ\">Domyślnie: yaxim</string>\n\t<string name=\"account_resource_dialog_title\">Podaj zasób:</string>\n\t<string name=\"account_resource_hint\">yaxim</string>\n\t<string name=\"account_prio_title\">Priorytet klienta</string>\n\t<string name=\"account_prio_summ\">Domyślnie: 0 (dozwolone wartości: -128 .. 127)</string>\n\t<string name=\"account_prio_error\">Dozwolone wartości: -128 .. 127</string>\n\t<string name=\"account_prio_dialog_title\">Podaj priorytet klienta:</string>\n\t<string name=\"account_port_title\">Port serwera</string>\n\t<string name=\"account_port_sum\">Domyślnie: 5222</string>\n\t<string name=\"account_port_dialog_title\">Podaj port serwera:</string>\n\t<string name=\"account_port_hint\">5222</string>\n\t<string name=\"account_customserver_title\">Własny serwer</string>\n\t<string name=\"account_customserver_summ\">(Opcjonalnie) alternatywny adres serwera</string>\n\t<string name=\"account_customserver_dialog_title\">Podaj adres serwera:</string>\n\t<string name=\"account_customserver_hint\">host.serwer.com</string>\n\t<string name=\"require_ssl_title\">Wymagaj SSL/TLS</string>\n\t<string name=\"require_ssl_summ\">Zawsze szyfruj połączenie</string>\n\n\t<!--StatusPopUp-->\n\t<string name=\"AddContact_SpinnerPrompt\">Wybierz grupę</string>\n\t<string name=\"setStatusmsgHint\">Opis</string>\n\t<string name=\"setStatusTitle\">Ustaw swój status</string>\n\t<string name=\"RenameGroup_summ\">Zmień nazwę grupy %s na:</string>\n\t<string name=\"RenameGroup_title\">Zmień nazwę grupy</string>\n\t<string name=\"RenameEntry_summ\">Zmień nazwę %1$s (%2$s) na:</string>\n\t<string name=\"RenameEntry_title\">Zmień nazwę kontaktu</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_summ\">Wybierz grupę z poniższej listy</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_title\">Zmień grupę</string>\n\t<string name=\"deleteRosterItem_text\">Usunąć %1$s (%2$s)?</string>\n\t<string name=\"deleteRosterItem_title\">Usuń kontakt</string>\n\t<string name=\"deleteChatHistory_text\">Usunąć wszystkie wiadomości z %1$s (%2$s)?</string>\n\t<string name=\"deleteChatHistory_title\">Usuń historię czatu</string>\n\t<string name=\"subscriptionRequest_text\">%1$s chce Cię dodać jako kontakt: \\\"%2$s\\\"</string>\n\t<string name=\"subscriptionRequest_title\">Prośba o autoryzację</string>\n\t<string name=\"subscription_accept\">Akceptuj</string>\n\t<string name=\"subscription_reject\">Odrzuć</string>\n\t<string name=\"subscription_reject_all\">Odrzuć wszystkie</string>\n\t<string name=\"subscription_status_from\">możesz zobaczyć swój status</string>\n\n\t<!-- CHATWINDOW -->\n\t<string name=\"chat_from_me\">Ja:</string>\n\t<string name=\"toast_stored_offline\">Wiadomość została zapisana do wysłania.</string>\n\t<string name=\"chat_enterMsgHint\">Wpisz wiadomość</string> \n\n\t<!-- Message context menu; use the verb form (to quote) -->\n\t<string name=\"chatmenu_quote\">Cytuj</string>\n\t<!-- Message context menu: repeat the same message -->\n\t<string name=\"chatmenu_resend\">Edytuj wiadomość</string>\n\n\t<!-- GPS settings -->\n\t<!--\n\t<string name=\"showGPS_title\">GPS to status</string>\n\t<string name=\"showGPS_summ_on\">GPS is send to StatusMessage</string>\n\t<string name=\"showGPS_summ_off\">GPS is send to StatusMessage</string>\n\t-->\n\n\t<!-- About Dialog -->\n\t<string name=\"AboutDialog_title\">O programie</string>\n\t<string name=\"AboutDialog_DevelopersTitle\">Deweloperzy</string>\n\t<!-- Contact the developer button -->\n\t<string name=\"AboutDialog_DevelopersText\">Kontakt</string>\n\t<string name=\"AboutDialog_LicenceTitle\">Licencja</string>\n\t<string name=\"AboutDialog_Vote\">Oceń aplikację</string>\n\t<string name=\"AboutDialog_LicenceText\">Ten program jest wolnym oprogramowaniem; możesz go rozprowadzać dalej i/lub modyfikować na warunkach GNU General Public License wersja 2 opublikowanej przez Free Software Foundation. Link: http://www.gnu.org/licenses/gpl-2.0.html \\n \\n Części tego oprogramowania są dostarczane w ramach licencji MIT: \\n \\n Copyright © 2009 Mads Kristiansen, Nullwire ApS \\n \\n niniejszym udziela się bezpłatnie, każdej osobie uzyskanie kopii tego oprogramowania oraz powiązane pliki dokumentacji (\"Oprogramowanie\"), do czynienia w Oprogramowanie bez ograniczeń, w tym między innymi prawa do używania, kopiowania, modyfikowania , łączenia, publikowania, rozprowadzania, udzielania sublicencji, i/lub sprzedaży kopii Oprogramowania, oraz w celu umożliwienia osobom, do których jest dostarczane oprogramowanie, aby to zrobić, z zastrzeżeniem następujących warunków: \\n powyższe informacje o prawach autorskich i niniejsze pozwolenie należy umieszczone we wszystkich egzemplarzach lub istotnych fragmentach oprogramowania. \\n OPROGRAMOWANIE JEST DOSTARCZANE \"TAK JAK JEST\", BEZ JAKICHKOLWIEK GWARANCJI, WYRAŹNE LUB MIĘDZY INNYMI, LECZ NIE GWARANCJI PRZYDATNOŚCI HANDLOWEJ, PRZYDATNOŚCI DO OKREŚLONEGO CELU I NIENARUSZALNOŚCI. W ŻADNYM PRZYPADKU AUTORZY LUB WŁAŚCICIELE PRAW AUTORSKICH NIE BĘDĄ ODPOWIEDZIALNI ZA JAKIEKOLWIEK ROSZCZENIA, SZKODY LUB INNEJ ODPOWIEDZIALNOŚCI, CZY TO W RAMACH UMOWY, LUB INNYCH, WYNIKAJĄCE Z, LUB W ZWIĄZKU Z OPROGRAMOWANIEM LUB UŻYCIA LUB INNYCH ZWIĄZANYMI OPROGRAMOWANIA.</string>\n\n\t<string name=\"status_available\">Połączony</string>\n\t<string name=\"status_away\">Nieobecny</string>\n\t<string name=\"status_chat\">Chętny do rozmowy</string>\n\t<string name=\"status_dnd\">Nie przeszkadzać</string>\n\t<string name=\"status_xa\">Niedostępny</string>\n\t<string name=\"status_offline\">Rozłączony</string>\n\n\t<string name=\"translator_credits\">Launchpad Contributions:\n  Adam Maćkowiak https://launchpad.net/~admc\n  Antoni Kudelski https://launchpad.net/~antoni-kudelski-deactivatedaccount\n  Georg Lukas https://launchpad.net/~ge0rg\n  Paweł Jaremczak https://launchpad.net/~ak47pabl0\n  Piotr Kaczmarek https://launchpad.net/~szopen\n  Wiktor https://launchpad.net/~wiktor-k</string>\n\n\t<!-- default roster group with no name -->\n\t<string name=\"default_group\">Ogólne</string>\n\t<string name=\"all_contacts_group\">Wszystkie kontakty</string>\n\t<string name=\"muc_group\">Czaty</string>\n\n\t<!-- SEND listener popup -->\n\t<string name=\"chooseContact\">Wybierz kontakt</string>\n\t<string name=\"action_settings\">Ustawienia</string>\n\n\t<!-- MUC strings -->\n\t<string name=\"muc_jid_hint\">Jabber ID czatu</string>\n\t<string name=\"muc_nickname_hint\">Pseudonim</string>\n\t<string name=\"muc_password_hint\">Hasło (opcjonalnie)</string>\n\t<string name=\"title_activity_muc_invite\">Zaproszenie czatu</string>\n\t<!-- Groupchat invitation: \"Invitation from {contact name}\" -->\n\t<string name=\"muc_invitation_from\">Zaproszenie od  %s</string>\n\t<!-- Groupchat info: {description} ({number} participants) -->\n\t<string name=\"muc_invitation_occupants\">%1$s (%2$d uczestników)</string>\n\t<!-- Notification button: \"Join as {default nickname}\" (make SHORT string) -->\n\t<string name=\"muc_invitation_join\">Przyłącz się jako %s</string>\n\t<string name=\"muc_synchronizing\">Synchronizacja…</string>\n\t<!-- Title of user list, contains JID -->\n\t<string name=\"chat_muc_userlist\">Uczestnicy czatu  (%s)</string>\n\t<!-- Kicked from groupchat: \"Kicked: {reason} -->\n\t<string name=\"muc_kicked\">Wykopany: %s</string>\n\t<!-- Kicked from groupchat: \"Kicked by {admin name}: {reason} -->\n\t<string name=\"muc_kicked_by\">Wykopany przez %1$s: %2$s</string>\n\t<!-- Banned from groupchat: \"Banned: {reason} -->\n\t<string name=\"muc_banned\">Zbanowany: %s</string>\n\t<!-- Banned from groupchat: \"Banned by {admin name}: {reason} -->\n\t<string name=\"muc_banned_by\">Zbanowany przez %1$s: %2$s</string>\n\n\t<!-- File upload -->\n\t<string name=\"roster_contextmenu_send\">Wyślij...</string>\n\t<string name=\"roster_contextmenu_take_image\">Zrób zdjęcie</string>\n\t<string name=\"roster_contextmenu_send_image\">Wybierz zdjęcie</string>\n\t<string name=\"roster_contextmenu_send_file\">Wyślij plik</string>\n\t<string name=\"upload_compress\">Kompresowanie zdjęcia...</string>\n\t<string name=\"upload_uploading\">Wysyłanie…</string>\n\t<string name=\"upload_too_large\">plik jest zbyt duży!</string>\n\t<string name=\"storage_permission\">%s needs storage access to send files!</string>\n\t<string name=\"notification_permission_denied\">Notifications are disabled in the Android app preferences.</string>\n\n\t<!-- Search -->\n\t<string name=\"search_msg_hint\">Message content</string>\n\n\t<!-- MUC bookmarks -->\n\t<string name=\"group_bookmarks\">Moje czaty grupowe</string>\n\t<string name=\"group_mucsearch\">Publiczne czaty grupowe</string>\n\t<!-- Service Discovery -->\n\t<string name=\"title_service_disco\">Browser: %s</string>\n\n\t<!-- Android 9 notification preferences: permanent notification -->\n\t<string name=\"notification_status\">Foreground service</string>\n\t<!-- Android 9 notification preferences: message notifications -->\n\t<string name=\"notification_msg\">Wiadomości</string>\n\n</resources>\n"
  },
  {
    "path": "res/values-pt/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"app_name\">yaxim</string>\n\t<string name=\"app_name_bruno\">Bruno</string>\n\n\t<!-- Connection state -->\n\t<string name=\"conn_title\">yaxim: %s</string>\n\t<string name=\"conn_title_bruno\">Bruno: %s</string>\n\t<string name=\"conn_connecting\">Conectando ao servidor...</string>\n\t<string name=\"conn_disconnecting\">Desconectando</string>\n\t<string name=\"conn_online\">Ligado</string>\n\t<string name=\"conn_offline\">Desligado</string>\n\t<string name=\"conn_empty_roster\">Nenhum contato para mostrar!</string>\n\t<string name=\"conn_empty_roster_hints\">There are many ways to add contacts:\\n\\n\n\t\t- Android Beam™: touch a friend\\'s phone\\n\\n\n\t\t- Scan a QR code\\n\\n\n\t\t- \\\"Create invitation\\\" and share it (e-mail, SMS, QR code, …)\\n\\n\n\t\t- \\\"Add contact\\\" if you know the JID</string>\n\t<string name=\"conn_reconnect\">Next connection attempt in %d seconds.</string>\n\t<string name=\"conn_disconnected\">Conexão encerrada</string>\n\t<string name=\"conn_no_network\">Sem conexão de rede</string>\n\t<string name=\"conn_ping_timeout\">No response</string>\n\t<string name=\"conn_error\">Error: %s</string>\n\n\t<!-- Global Strings -->\n\t<string name=\"Global_Exit\">Sair</string>\n\t<string name=\"Global_authenticate_first\">Por favor, conecte antes</string>\n\t<string name=\"Global_JID_hint\">usuario@yax.im</string>\n\t<!-- tooltip message when the user entered an invalid XMPP address -->\n\t<string name=\"Global_JID_malformed\">Verifique o formato do endereço!</string>\n\n\t<!-- FirstStartUpDialog -->\n\t<string name=\"StartupDialog_Title\">Bem vindo ao yaxim!</string>\n\t<string name=\"StartupDialog_Summary\">Você precisa configurar o yaxim antes de usá-lo. Por favor, entre seu ID de Jabber e senha.</string>\n\t<string name=\"StartupDialog_pwHint\">Introduza a senha</string>\n\t<string name=\"StartupDialog_pwshowHint\">Show password</string>\n\t<string name=\"StartupDialog_Username_title\">ID de Jabber:</string>\n\t<string name=\"StartupDialog_passwd_title\">Senha:</string>\n\t<string name=\"StartupDialog_advanced\">Avançado...</string>\n\t<string name=\"StartupDialog_create_new\">Registar nova conta</string>\n\t<string name=\"StartupDialog_error_password\">Password is too short!</string>\n\t<string name=\"StartupDialog_created_password\">Created secure password</string>\n\t<string name=\"StartupDialog_auth_failed\">Please check your username and password!</string>\n\t<string name=\"StartupDialog_server_failed\">Could not connect to %s!</string>\n\t<string name=\"StartupDialog_no_registration\">Server does not allow registration!</string>\n\n\t<string name=\"StartupDialog_invitation\">You have been invited to Jabber. Please complete your registration.</string>\n\t<string name=\"StartupDialog_no_more_accounts\">No additional account supported!</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_message\">Mensagem de %s</string>\n\t<string name=\"notification_anonymous_message\">Mensagem recebida</string>\n\t<!--  Group Chat notification, %1$s is the user name, %2$s is the room, e.g. \"{Ge0rG} in {yaxim Chat}\" -->\n\t<string name=\"notification_muc_message\">%1$s in %2$s</string>\n\t<!--  Group Group Chat private message notification, %1$s is the user name, %2$s is the room, e.g. \"Message from {Ge0rG} in {yaxim Chat}\" -->\n\t<!--string name=\"notification_muc_pm\">Message from %1$s in %2$s</string-->\n\t<!-- notification button: direct reply (make SHORT string) -->\n\t<string name=\"notification_reply\">Reply</string>\n\t<!-- notification button: mark as read (make SHORT string) -->\n\t<string name=\"notification_mark_read\">Mark Read</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_error\">Erro ao enviar mensagem!</string>\n\n\t<!-- Notification Settings -->\n\t<string name=\"preftitle_notify\">Notification Settings</string>\n\t<string name=\"preftitle_notify_msg\">Notificação de mensagens</string>\n\t<string name=\"preftitle_notify_muc\">Group Chat Notification</string>\n\t<string name=\"notification_custom\">Custom Ringtone</string>\n\t<string name=\"muc_highlight_title\">Only notify on mention</string>\n\t<string name=\"muc_highlight_sum\">Notify when your nickname is mentioned in a room</string>\n\t<string name=\"led_title\">Led PIsca-Pisca</string>\n\t<string name=\"led_summ\">Piscar o LED do telefone ao receber mensagens</string>\n\t<string name=\"vibr_title\">Vibração</string>\n\t<string name=\"vibr_summ\">Vibra ao receber mensagens</string>\n\t<string-array name=\"vibr_values_displayed\">\n\t\t<item>Nunca</item>\n\t\t<item>Preferencias do sistema</item>\n\t\t<item>Sempre</item>\n\t</string-array>\n\t<string name=\"ringtone_title\">Toque de chamada</string>\n\t<string name=\"ringtone_summ\">Som para mensagens de entrada</string>\n\t<string name=\"ticker_title\">Pré-visualização da mensagem</string>\n\t<string name=\"ticker_summ\">Exibir contato e mensagem na barra de status</string>\n\n\t<!-- Startup Setting Strings -->\n\t<string name=\"preftitle_general\">General Settings</string>\n\t<string name=\"pref_dnd_when_silent\">\\\"Do not disturb\\\" in silent mode</string>\n\t<string name=\"pref_dnd_when_silent_summ\">Set your online status to \\\"DND\\\" when your phone is in silent mode</string>\n\t<string name=\"statuspopup_name\">Alterar o seu estado</string>\n\t<string name=\"showOffline_summ\">Sempre exibir todos os contatos na lista</string>\n\t<string name=\"showOffline_title\">Exibir os contactos desligados</string>\n\t<string name=\"enableGroups_summ\">Arrange your contacts by their groups</string>\n\t<string name=\"enableGroups_title\">Show contact groups</string>\n\t<string name=\"foregroundService_summ\">Keep app in memory to ensure always-on connection (foreground service)</string>\n\t<string name=\"foregroundService_title\">Ícone da barra de status</string>\n\n\t<string name=\"preftitle_debug\">Depuração</string>\n\t<string name=\"smackdebug_summ\">Pacotes e saída da depuração via logcat (pode conter informações pessoais)</string>\n\t<string name=\"smackdebug_title\">Depuração SMACK</string>\n\n\t<string name=\"reportcrash_title\">Enviar relatórios de erro</string>\n\t<string name=\"reportcrash_summ\">Enviar relatórios de erro anônimos para o desenvolvedor</string>\n\n\t<!-- Appearence Strings -->\n\t<string name=\"preftitle_app\">Aparência</string>\n\t<string name=\"FontChat_title\">Tamanho da fonte do chat</string>\n\t<string name=\"FontChat_summ\">Configurar tamanho da fonte do chat</string>\n\t<string name=\"FontChat_dialog\">Tamanho da fonte do chat</string>\n\t<!--\n\t<string name=\"FontRost_title\">Roster font size</string>\n\t<string name=\"FontRost_summ\">Set roster font size</string>\n\t<string name=\"FontRost_dialog\">Roster font fize</string>\n\t<string name=\"setFontRoster\">Set roster font size</string>\n\t-->\n\t<string name=\"pref_theme\">Tema</string>\n\t<string name=\"pref_theme_dark\">Escuro</string>\n\t<string name=\"pref_theme_light\">Claro</string>\n\t<string name=\"pref_theme_pine\">Pine</string>\n\t<string name=\"pref_theme_ice\">Ice</string>\n\t<string name=\"preftitle_ui\">Aparência</string>\n\t<string-array name=\"fontSizesChat\">\n\t\t<item>pequeno</item>\n\t\t<item>normal</item>\n\t\t<item>grande</item>\n\t\t<item>huge</item>\n\t</string-array>\n\n\t<!-- Mainmenu \t-->\n\t<string name=\"Menu_addFriend\">Add contact</string>\n\t<string name=\"Menu_addClipboard\">Add %s</string>\n\t<string name=\"Menu_ShowOff\">Show offline</string>\n\t<string name=\"Menu_HideOff\">Hide offline</string>\n\t<string name=\"Menu_AccSettings\">Edit account</string>\n\t<string name=\"Menu_Settings\">Configurações</string>\n\t<string name=\"Menu_Status\">Situação</string>\n\t<string name=\"Menu_connect\">Conectar</string>\n\t<string name=\"Menu_disconnect\">Desconectar</string>\n\t<string name=\"Menu_about\">Sobre yaxim</string>\n\t<string name=\"Menu_about_bruno\">About Bruno</string>\n\t<string name=\"Menu_muc\">Add / browse…</string>\n\t<string name=\"Menu_matrix\">Enter the Matrix…</string>\n\t<string name=\"Menu_mark_all_as_read\">Mark all as read</string>\n\t<string name=\"Menu_send_invitation\">Create invitation</string>\n    <string name=\"Menu_userlist\">Participants</string>\n\n\n\t<!-- AddFriend -->\n\t<string name=\"addFriend_Title\">Adicionar um contato</string>\n\t<string name=\"addFriend_Summ\">Por favor, entre o ID do seu contato, o apelido desejado e o grupo ao qual ele pertence!</string>\n\t<string name=\"addFriend_aliasHint\">Apelido</string>\n\t<string name=\"addrosteritemaddgroupchoice\">Adicionar a um novo grupo</string>\n\t<string name=\"NewGroup_EditTextField_Hint\">Nome do novo grupo</string>\n\n\t<!-- Roster CONTEXTMENU -->\n\t<string name=\"roster_contextmenu_group_rename\">Renomear grupo</string>\n\t<string name=\"roster_contextmenu_contact_mark_as_read\">Mark as read</string>\n\t<string name=\"roster_contextmenu_contact_delete\">Delete contact</string>\n\t<string name=\"roster_contextmenu_contact_delmsg\">Delete chat history</string>\n\t<string name=\"roster_contextmenu_contact_rename\">Renomear</string>\n\t<string name=\"roster_contextmenu_contact_request_auth\">Request authorization</string>\n\t<string name=\"roster_contextmenu_contact_change_group\">Alterar grupo</string>\n\t<string name=\"roster_contextmenu_contact_share\">Share address</string>\n\t<string name=\"roster_contextmenu_contact_ringtone\">Toque de chamada</string>\n\t<string name=\"roster_contextmenu_muc_edit\">Edit group chat</string>\n\t<string name=\"roster_contextmenu_muc_leave\">Leave group chat</string>\n\t<string name=\"muc_leave_question\">Really leave %s?</string>\n\n\t<!-- Accountprefs -->\n\t<string name=\"account_settings_login\">Informação de Autenticação</string>\n\t<string name=\"account_settings_title\">Configuração da Conta</string>\n\t<string name=\"account_options_title\">Opções de conexão</string>\n\t<string name=\"account_options_advanced\">Opções Avançadas</string>\n\t<string name=\"carbons_title\">Message Carbons (XEP-0280)</string>\n\t<string name=\"carbons_summ\">Solicitar cópias de mensagens de outro(s) cliente(s)</string>\n\t<string name=\"account_jabberID_title\">ID de Jabber</string>\n\t<string name=\"account_jabberID_sum\">exemplo: me@jabber.example.com</string>\n\t<string name=\"account_jabberID_dialog_title\">Informe o ID do seu Jabber:</string>\n\t<string name=\"account_jabberPW_title\">Senha da conta</string>\n\t<string name=\"account_jabberPW_sum\">Senha da sua conta de Jabber</string>\n\t<string name=\"account_jabberPW_change_on_server\">Change password on server</string>\n\t<string name=\"account_jabberPW_password_old\">Old Password:</string>\n\t<string name=\"account_jabberPW_password_new\">New Password:</string>\n\t<string name=\"account_jabberPW_warning\">WARNING! For successful login you must also set the same password on the server!</string>\n\t<string name=\"account_jabberPW_progress\">Please wait, changing password…</string>\n\t<string name=\"account_jabberPW_finished\">Password successfully changed.</string>\n\t<string name=\"account_jabberPW_error\">Error changing password: %s</string>\n\t<string name=\"account_nickname_title\">Display Name</string>\n\t<string name=\"account_nickname_summ\">Your nickname displayed to other users</string>\n\t\n\t<!-- accountprefs -->\n\t<string name=\"account_resource_title\">Recursos do cliente</string>\n\t<string name=\"account_resource_summ\">Padrão: yaxim</string>\n\t<string name=\"account_resource_dialog_title\">Entre a sua ferramenta:</string>\n\t<string name=\"account_resource_hint\">yaxim</string>\n\t<string name=\"account_prio_title\">Prioridade do cliente</string>\n\t<string name=\"account_prio_summ\">Padrão: 0 (permitidos: -128 .. 127)</string>\n\t<string name=\"account_prio_error\">Valores permitidos: -128 a 127</string>\n\t<string name=\"account_prio_dialog_title\">Informe sua prioridade:</string>\n\t<string name=\"account_port_title\">Porta do Servidor</string>\n\t<string name=\"account_port_sum\">Padrão: 5222</string>\n\t<string name=\"account_port_dialog_title\">Informe a porta do servidor:</string>\n\t<string name=\"account_port_hint\">5222</string>\n\t<string name=\"account_customserver_title\">Servidor personalizado</string>\n\t<string name=\"account_customserver_summ\">(Opcional) nome alternativo para o endereço do servidor</string>\n\t<string name=\"account_customserver_dialog_title\">Entre o endereço do servidor:</string>\n\t<string name=\"account_customserver_hint\">host.example.com</string>\n\t<string name=\"require_ssl_title\">Requer SSL/TLS</string>\n\t<string name=\"require_ssl_summ\">Sempre criptografa a conexão com servidor</string>\n\n\t<!--StatusPopUp-->\n\t<string name=\"AddContact_SpinnerPrompt\">Selecionar Grupo</string>\n\t<string name=\"setStatusmsgHint\">Sua mensagem de status</string>\n\t<string name=\"setStatusTitle\">Alterar o seu estado</string>\n\t<string name=\"RenameGroup_summ\">Renomear grupo %s para:</string>\n\t<string name=\"RenameGroup_title\">Renomear grupo</string>\n\t<string name=\"RenameEntry_summ\">Renomear %1$s (%2$s) para:</string>\n\t<string name=\"RenameEntry_title\">Renomear contato:</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_summ\">Selecionar grupo do spinner abaixo</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_title\">Alterar grupo</string>\n\t<string name=\"deleteRosterItem_text\">Deseja remover %1$s (%2$s)?</string>\n\t<string name=\"deleteRosterItem_title\">Apagar contato</string>\n\t<string name=\"deleteChatHistory_text\">Realmente remover todas as mensagens com %1$s (%2$s)?</string>\n\t<string name=\"deleteChatHistory_title\">Apagar histórico de conversas</string>\n\t<string name=\"subscriptionRequest_text\">%1$s quer adicionar você como contato: \\\"%2$s\\\"</string>\n\t<string name=\"subscriptionRequest_title\">Pedido de Inscrição</string>\n\t<string name=\"subscription_accept\">Accept</string>\n\t<string name=\"subscription_reject\">Reject</string>\n\t<string name=\"subscription_reject_all\">Reject all</string>\n\t<string name=\"subscription_status_from\">can see your status</string>\n\n\t<!-- CHATWINDOW -->\n\t<string name=\"chat_from_me\">Eu:</string>\n\t<string name=\"toast_stored_offline\">A mensagem foi armazenada para transmissão.</string>\n\t<string name=\"chat_enterMsgHint\">Escreva sua mensagem</string> \n\n\t<!-- Message context menu; use the verb form (to quote) -->\n\t<string name=\"chatmenu_quote\">Quote</string>\n\t<!-- Message context menu: repeat the same message -->\n\t<string name=\"chatmenu_resend\">Edit message</string>\n\n\t<!-- GPS settings -->\n\t<!--\n\t<string name=\"showGPS_title\">GPS to status</string>\n\t<string name=\"showGPS_summ_on\">GPS is send to StatusMessage</string>\n\t<string name=\"showGPS_summ_off\">GPS is send to StatusMessage</string>\n\t-->\n\n\t<!-- About Dialog -->\n\t<string name=\"AboutDialog_title\">Sobre yaxim</string>\n\t<string name=\"AboutDialog_DevelopersTitle\">Desenvolvedores</string>\n\t<!-- Contact the developer button -->\n\t<string name=\"AboutDialog_DevelopersText\">Contact</string>\n\t<string name=\"AboutDialog_LicenceTitle\">Licença</string>\n\t<string name=\"AboutDialog_Vote\">Rate app</string>\n\t<string name=\"AboutDialog_LicenceText\">Este programa é software livre, você pode redistribuí-lo e / ou modificá-lo sob os termos da Licença Pública Geral GNU versão 2 conforme publicada pela Free Software Foundation. Link: http://www.gnu.org/licenses/gpl-2.0.html \\ n \\ n Partes deste software são fornecidos sob a licença MIT: \\ n \\ n Copyright © 2009 Mads Kristiansen, Nullwire ApS \\ n \\ n a permissão é concedida, a título gratuito, para qualquer pessoa que obtenha uma cópia deste software e arquivos de documentação associados (o \"software\"), para lidar com o Software sem restrição, incluindo, sem limitação, os direitos de usar, copiar, modificar, mesclar , publicar, distribuir, sublicenciar e / ou vender cópias do Software, e para permitir que pessoas a quem o Software é fornecido façam isso, sujeitas às seguintes condições: \\ n o aviso de copyright acima e este aviso de permissão devem ser incluídos no todas as cópias ou partes substanciais do Software. \\ n O SOFTWARE É FORNECIDO \"COMO ESTÁ\", SEM GARANTIA DE QUALQUER TIPO, EXPRESSA OU IMPLÍCITA, INCLUINDO, SEM LIMITAÇÃO, AS GARANTIAS DE COMERCIALIZAÇÃO, ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA E LEGALIDADE. EM NENHUM CASO OS AUTORES OU TITULARES DE DIREITOS AUTORAIS SERÁ RESPONSÁVEL POR QUALQUER RECLAMAÇÃO, DANOS OU RESPONSABILIDADE, SEJA EM UMA AÇÃO DO CONTRATO, OU DE OUTRA FORMA, DECORRENTES DE, OU EM CONEXÃO COM O SOFTWARE OU O USO OU OUTROS NO SOFTWARE.</string>\n\n\t<string name=\"status_available\">Ligado</string>\n\t<string name=\"status_away\">Ausente</string>\n\t<string name=\"status_chat\">Disponível para conversar</string>\n\t<string name=\"status_dnd\">Não Perturbe</string>\n\t<string name=\"status_xa\">Indisponível</string>\n\t<string name=\"status_offline\">Desligado</string>\n\n\t<string name=\"translator_credits\">Launchpad Contributions:\n  Dedeco https://launchpad.net/~dedeco\n  Georg Lukas https://launchpad.net/~ge0rg\n  Jan Kiszka https://launchpad.net/~jan-kiszka\n  Leandro Forain https://launchpad.net/~forain\n  Tatiana Al-Chueyr https://launchpad.net/~tatiana-alchueyr</string>\n\n\t<!-- default roster group with no name -->\n\t<string name=\"default_group\">Geral</string>\n\t<string name=\"all_contacts_group\">All contacts</string>\n\t<string name=\"muc_group\">Group Chats</string>\n\n\t<!-- SEND listener popup -->\n\t<string name=\"chooseContact\">Selecione um contato</string>\n\t<string name=\"action_settings\">Configurações</string>\n\n\t<!-- MUC strings -->\n\t<string name=\"muc_jid_hint\">Group chat JID</string>\n\t<string name=\"muc_nickname_hint\">Nickname</string>\n\t<string name=\"muc_password_hint\">Password (optional)</string>\n\t<string name=\"title_activity_muc_invite\">Group Chat Invitation</string>\n\t<!-- Groupchat invitation: \"Invitation from {contact name}\" -->\n\t<string name=\"muc_invitation_from\">Invitation from %s</string>\n\t<!-- Groupchat info: {description} ({number} participants) -->\n\t<string name=\"muc_invitation_occupants\">%1$s (%2$d participants)</string>\n\t<!-- Notification button: \"Join as {default nickname}\" (make SHORT string) -->\n\t<string name=\"muc_invitation_join\">Join as %s</string>\n\t<string name=\"muc_synchronizing\">Synchronizing…</string>\n\t<!-- Title of user list, contains JID -->\n\t<string name=\"chat_muc_userlist\">Group Chat Participants (%s)</string>\n\t<!-- Kicked from groupchat: \"Kicked: {reason} -->\n\t<string name=\"muc_kicked\">Kicked: %s</string>\n\t<!-- Kicked from groupchat: \"Kicked by {admin name}: {reason} -->\n\t<string name=\"muc_kicked_by\">Kicked by %1$s: %2$s</string>\n\t<!-- Banned from groupchat: \"Banned: {reason} -->\n\t<string name=\"muc_banned\">Banned: %s</string>\n\t<!-- Banned from groupchat: \"Banned by {admin name}: {reason} -->\n\t<string name=\"muc_banned_by\">Banned by %1$s: %2$s</string>\n\n\t<!-- File upload -->\n\t<string name=\"roster_contextmenu_send\">Send…</string>\n\t<string name=\"roster_contextmenu_take_image\">Take picture</string>\n\t<string name=\"roster_contextmenu_send_image\">Choose picture</string>\n\t<string name=\"roster_contextmenu_send_file\">Send file</string>\n\t<string name=\"upload_compress\">Compressing picture…</string>\n\t<string name=\"upload_uploading\">Uploading…</string>\n\t<string name=\"upload_too_large\">file too large!</string>\n\t<string name=\"storage_permission\">%s needs storage access to send files!</string>\n\t<string name=\"notification_permission_denied\">Notifications are disabled in the Android app preferences.</string>\n\n\t<!-- Search -->\n\t<string name=\"search_msg_hint\">Message content</string>\n\n\t<!-- MUC bookmarks -->\n\t<string name=\"group_bookmarks\">My group chats</string>\n\t<string name=\"group_mucsearch\">Public group chats</string>\n\t<!-- Service Discovery -->\n\t<string name=\"title_service_disco\">Browser: %s</string>\n\n\t<!-- Android 9 notification preferences: permanent notification -->\n\t<string name=\"notification_status\">Foreground service</string>\n\t<!-- Android 9 notification preferences: message notifications -->\n\t<string name=\"notification_msg\">Messages</string>\n\n</resources>\n"
  },
  {
    "path": "res/values-pt-rBR/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"app_name\">yaxim</string>\n\t<string name=\"app_name_bruno\">Bruno</string>\n\n\t<!-- Connection state -->\n\t<string name=\"conn_title\">yaxim: %s</string>\n\t<string name=\"conn_title_bruno\">Bruno: %s</string>\n\t<string name=\"conn_connecting\">Conectando ao servidor...</string>\n\t<string name=\"conn_disconnecting\">Desconectando...</string>\n\t<string name=\"conn_online\">Online</string>\n\t<string name=\"conn_offline\">Offline</string>\n\t<string name=\"conn_empty_roster\">Sem contatos para mostrar!</string>\n\t<string name=\"conn_empty_roster_hints\">Existem muitas formas de adicionar contatos:\\n\\n  - Android Beam™: Tocar no telefone de um amigo\\n\\n - Ler um QR code\\n\\n - \\ \"Criar um convite\" \\ e compartilhar (e-mail, SMS, QR code...)\\n\\n \\\"Adicionar contato\"\\ se souber o JID</string>\n\t<string name=\"conn_reconnect\">Próxima tentativa de conexão em %d segundos.</string>\n\t<string name=\"conn_disconnected\">Conexão encerrada</string>\n\t<string name=\"conn_no_network\">Sem conexão de rede</string>\n\t<string name=\"conn_ping_timeout\">Sem resposta</string>\n\t<string name=\"conn_error\">Erro: %s</string>\n\n\t<!-- Global Strings -->\n\t<string name=\"Global_Exit\">Sair</string>\n\t<string name=\"Global_authenticate_first\">Por favor conecte-se primeiro</string>\n\t<string name=\"Global_JID_hint\">usuário@yax.im</string>\n\t<!-- tooltip message when the user entered an invalid XMPP address -->\n\t<string name=\"Global_JID_malformed\">Verifique o formato de endereço!</string>\n\n\t<!-- FirstStartUpDialog -->\n\t<string name=\"StartupDialog_Title\">Bem vindo ao yaxim!</string>\n\t<string name=\"StartupDialog_Summary\">Você precisa configurar o yaxim antes de poder usá-lo. Por favor coloque seu usuário XMPP e senha.</string>\n\t<string name=\"StartupDialog_pwHint\">Digite a senha</string>\n\t<string name=\"StartupDialog_pwshowHint\">Exibir senha</string>\n\t<string name=\"StartupDialog_Username_title\">ID do Jabber:</string>\n\t<string name=\"StartupDialog_passwd_title\">Senha:</string>\n\t<string name=\"StartupDialog_advanced\">Avançado...</string>\n\t<string name=\"StartupDialog_create_new\">Registrar nova conta</string>\n\t<string name=\"StartupDialog_error_password\">Senha muito curta!</string>\n\t<string name=\"StartupDialog_created_password\">Senha segura gerada</string>\n\t<string name=\"StartupDialog_auth_failed\">Por favor, confirme usuário e senha!</string>\n\t<string name=\"StartupDialog_server_failed\">Could not connect to %s!</string>\n\t<string name=\"StartupDialog_no_registration\">Server does not allow registration!</string>\n\n\t<string name=\"StartupDialog_invitation\">Você foi convidado ao Jabber. Por favor, complete seu registro.</string>\n\t<string name=\"StartupDialog_no_more_accounts\">Sem suporte para contas adicionais!</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_message\">Mensagem de %s</string>\n\t<string name=\"notification_anonymous_message\">Mensagem recebida</string>\n\t<!--  Group Chat notification, %1$s is the user name, %2$s is the room, e.g. \"{Ge0rG} in {yaxim Chat}\" -->\n\t<string name=\"notification_muc_message\">%1$s em %2$s</string>\n\t<!--  Group Group Chat private message notification, %1$s is the user name, %2$s is the room, e.g. \"Message from {Ge0rG} in {yaxim Chat}\" -->\n\t<!--string name=\"notification_muc_pm\">Message from %1$s in %2$s</string-->\n\t<!-- notification button: direct reply (make SHORT string) -->\n\t<string name=\"notification_reply\">Responder</string>\n\t<!-- notification button: mark as read (make SHORT string) -->\n\t<string name=\"notification_mark_read\">Marcar como lida</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_error\">Erro ao enviar mensagem!</string>\n\n\t<!-- Notification Settings -->\n\t<string name=\"preftitle_notify\">Configurações de Notificação</string>\n\t<string name=\"preftitle_notify_msg\">Notificação de Mensagens</string>\n\t<string name=\"preftitle_notify_muc\">Notificações de chat em grupo</string>\n\t<string name=\"notification_custom\">Toque personalizado</string>\n\t<string name=\"muc_highlight_title\">Notificar somente quando mencionado</string>\n\t<string name=\"muc_highlight_sum\">Notificar quando seu apelido for mencionado em uma sala</string>\n\t<string name=\"led_title\">Piscar LED</string>\n\t<string name=\"led_summ\">Piscar luz LED do celular quando receber mensagens</string>\n\t<string name=\"vibr_title\">Vibração</string>\n\t<string name=\"vibr_summ\">Vibrar ao ao chegar mensagens</string>\n\t<string-array name=\"vibr_values_displayed\">\n\t\t<item>Nunca</item>\n\t\t<item>Preferência de Sistema</item>\n\t\t<item>Sempre</item>\n\t</string-array>\n\t<string name=\"ringtone_title\">Toque de chamada</string>\n\t<string name=\"ringtone_summ\">Toque para mensagens recebidas</string>\n\t<string name=\"ticker_title\">Prévia da mensagem</string>\n\t<string name=\"ticker_summ\">Mostrar remetente e mensagem na barra de status</string>\n\n\t<!-- Startup Setting Strings -->\n\t<string name=\"preftitle_general\">Configurações Gerais</string>\n\t<string name=\"pref_dnd_when_silent\">\\\"Não perturbe\\\" no modo silencioso</string>\n\t<string name=\"pref_dnd_when_silent_summ\">definir statis como \\\"Não perturbe\\\"</string>\n\t<string name=\"statuspopup_name\">Definir o seu status</string>\n\t<string name=\"showOffline_summ\">Sempre mostrar todos os contatos na lista</string>\n\t<string name=\"showOffline_title\">Mostra contatos desconectados</string>\n\t<string name=\"enableGroups_summ\">Organizar contatos por grupo</string>\n\t<string name=\"enableGroups_title\">Mostrar grupos de contato</string>\n\t<string name=\"foregroundService_summ\">Manter o aplicativo na memória para garantir conexão constante (serviço em primeiro plano)</string>\n\t<string name=\"foregroundService_title\">Ícone na barra de status</string>\n\n\t<string name=\"preftitle_debug\">Depuração</string>\n\t<string name=\"smackdebug_summ\">Saída de depuração e pacotes de dados com logcat (pode conter informações pessoais)</string>\n\t<string name=\"smackdebug_title\">Depuração SMACK</string>\n\n\t<string name=\"reportcrash_title\">Enviar relatórios de erros</string>\n\t<string name=\"reportcrash_summ\">Enviar relatórios de erros aos desenvolvedores</string>\n\n\t<!-- Appearence Strings -->\n\t<string name=\"preftitle_app\">Aparência</string>\n\t<string name=\"FontChat_title\">Tamanho da fonte do chat</string>\n\t<string name=\"FontChat_summ\">Ajustar o tamanho da fonte do chat</string>\n\t<string name=\"FontChat_dialog\">Tamanho da fonte do chat</string>\n\t<!--\n\t<string name=\"FontRost_title\">Roster font size</string>\n\t<string name=\"FontRost_summ\">Set roster font size</string>\n\t<string name=\"FontRost_dialog\">Roster font fize</string>\n\t<string name=\"setFontRoster\">Set roster font size</string>\n\t-->\n\t<string name=\"pref_theme\">Tema</string>\n\t<string name=\"pref_theme_dark\">Escuro</string>\n\t<string name=\"pref_theme_light\">Claro</string>\n\t<string name=\"pref_theme_pine\">Pinho</string>\n\t<string name=\"pref_theme_ice\">Gelo</string>\n\t<string name=\"preftitle_ui\">Aparência</string>\n\t<string-array name=\"fontSizesChat\">\n\t\t<item>pequeno</item>\n\t\t<item>normal</item>\n\t\t<item>grande</item>\n\t\t<item>enorme</item>\n\t</string-array>\n\n\t<!-- Mainmenu \t-->\n\t<string name=\"Menu_addFriend\">Adicionar contato</string>\n\t<string name=\"Menu_addClipboard\">Adicionar %s</string>\n\t<string name=\"Menu_ShowOff\">Mostrar desconectados</string>\n\t<string name=\"Menu_HideOff\">Ocultar deconectados</string>\n\t<string name=\"Menu_AccSettings\">Editar conta</string>\n\t<string name=\"Menu_Settings\">Configurações</string>\n\t<string name=\"Menu_Status\">Status</string>\n\t<string name=\"Menu_connect\">Conectar</string>\n\t<string name=\"Menu_disconnect\">Desconectar</string>\n\t<string name=\"Menu_about\">Sobre o yaxim</string>\n\t<string name=\"Menu_about_bruno\">Sobre Bruno</string>\n\t<string name=\"Menu_muc\">Adicionar / navergar...</string>\n\t<string name=\"Menu_matrix\">Entre na Matrix...</string>\n\t<string name=\"Menu_mark_all_as_read\">Marcar todas como lidas</string>\n\t<string name=\"Menu_send_invitation\">Criar convite</string>\n    <string name=\"Menu_userlist\">Participantes</string>\n\n\n\t<!-- AddFriend -->\n\t<string name=\"addFriend_Title\">Adicionar um Contato</string>\n\t<string name=\"addFriend_Summ\">Por favor coloque o usuário XMPP de seu amigo, o apelido desejado para ele e escolha o seu grupo de contato!</string>\n\t<string name=\"addFriend_aliasHint\">Nome de tela</string>\n\t<string name=\"addrosteritemaddgroupchoice\">Adicionar a um novo grupo</string>\n\t<string name=\"NewGroup_EditTextField_Hint\">Nome do novo grupo</string>\n\n\t<!-- Roster CONTEXTMENU -->\n\t<string name=\"roster_contextmenu_group_rename\">Renomear grupo</string>\n\t<string name=\"roster_contextmenu_contact_mark_as_read\">Marcar como lida</string>\n\t<string name=\"roster_contextmenu_contact_delete\">Excluir contato</string>\n\t<string name=\"roster_contextmenu_contact_delmsg\">Deletar histórico de conversas</string>\n\t<string name=\"roster_contextmenu_contact_rename\">Renomear</string>\n\t<string name=\"roster_contextmenu_contact_request_auth\">Solicitar autorização</string>\n\t<string name=\"roster_contextmenu_contact_change_group\">Alterar grupo</string>\n\t<string name=\"roster_contextmenu_contact_share\">Compartilhar endereço</string>\n\t<string name=\"roster_contextmenu_contact_ringtone\">Toque de chamada</string>\n\t<string name=\"roster_contextmenu_muc_edit\">Editar grupo de bate papo</string>\n\t<string name=\"roster_contextmenu_muc_leave\">Deixar este bate papo</string>\n\t<string name=\"muc_leave_question\">Deseja realmente sair %s?</string>\n\n\t<!-- Accountprefs -->\n\t<string name=\"account_settings_login\">Informações de Login</string>\n\t<string name=\"account_settings_title\">Configurações da Conta</string>\n\t<string name=\"account_options_title\">Opções de conexão</string>\n\t<string name=\"account_options_advanced\">Opções Avançadas</string>\n\t<string name=\"carbons_title\">Mensagem Carbono (XEP-0280)</string>\n\t<string name=\"carbons_summ\">Pedir cópias de mensagens de seu(s) outro(s ) cliente(s)</string>\n\t<string name=\"account_jabberID_title\">ID do Jabber</string>\n\t<string name=\"account_jabberID_sum\">exemplo: eu@xmpp.exemplo.org</string>\n\t<string name=\"account_jabberID_dialog_title\">Entre o seu Jabber ID:</string>\n\t<string name=\"account_jabberPW_title\">Senha da Conta</string>\n\t<string name=\"account_jabberPW_sum\">Senha da sua conta do Jabber</string>\n\t<string name=\"account_jabberPW_change_on_server\">Mudar senha no servidor</string>\n\t<string name=\"account_jabberPW_password_old\">Senha antiga:</string>\n\t<string name=\"account_jabberPW_password_new\">Nova senha:</string>\n\t<string name=\"account_jabberPW_warning\">AVISO! Para conseguir acessar você também precisa usar a mesma senha no servidor!</string>\n\t<string name=\"account_jabberPW_progress\">Aguarde, alterando a senha...</string>\n\t<string name=\"account_jabberPW_finished\">Senha alterada com sucesso.</string>\n\t<string name=\"account_jabberPW_error\">Erro mudando a senha: %s</string>\n\t<string name=\"account_nickname_title\">Mostrar Nome</string>\n\t<string name=\"account_nickname_summ\">Seu apelido exibido aos demais usuários</string>\n\t\n\t<!-- accountprefs -->\n\t<string name=\"account_resource_title\">Cliente: Recurso</string>\n\t<string name=\"account_resource_summ\">Padrão: yaxim</string>\n\t<string name=\"account_resource_dialog_title\">Escolha seu recurso:</string>\n\t<string name=\"account_resource_hint\">yaxim</string>\n\t<string name=\"account_prio_title\">Prioridade do cliente</string>\n\t<string name=\"account_prio_summ\">Padrão: 0 (permitido: -128 .. 127)</string>\n\t<string name=\"account_prio_error\">Valores permitidos: -128 .. 127</string>\n\t<string name=\"account_prio_dialog_title\">Digite sua prioridade:</string>\n\t<string name=\"account_port_title\">Porta do servidor</string>\n\t<string name=\"account_port_sum\">Padrão: 5222</string>\n\t<string name=\"account_port_dialog_title\">Digite a porta do servidor</string>\n\t<string name=\"account_port_hint\">5222</string>\n\t<string name=\"account_customserver_title\">Servidor personalizado</string>\n\t<string name=\"account_customserver_summ\">(Opcional) nome do servidor alternativo</string>\n\t<string name=\"account_customserver_dialog_title\">Digite o nome do servidor:</string>\n\t<string name=\"account_customserver_hint\">servidor.exemplo.com</string>\n\t<string name=\"require_ssl_title\">Solicitar SSL/TLS</string>\n\t<string name=\"require_ssl_summ\">Sempre criptografar conexão com o servidor</string>\n\n\t<!--StatusPopUp-->\n\t<string name=\"AddContact_SpinnerPrompt\">Escolher grupo</string>\n\t<string name=\"setStatusmsgHint\">Sua mensagem de status</string>\n\t<string name=\"setStatusTitle\">Definir o seu status</string>\n\t<string name=\"RenameGroup_summ\">Renomear grupo %s para:</string>\n\t<string name=\"RenameGroup_title\">Renomear grupo</string>\n\t<string name=\"RenameEntry_summ\">Renomear %1$s (%2$s) para:</string>\n\t<string name=\"RenameEntry_title\">Renomear contaro</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_summ\">Selecione um grupo do seletor abaixo</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_title\">Alterar grupo</string>\n\t<string name=\"deleteRosterItem_text\">Deseja realmente remover %1$s (%2$s)?</string>\n\t<string name=\"deleteRosterItem_title\">Apagar Contato</string>\n\t<string name=\"deleteChatHistory_text\">Deseja realmente remover todas as mensagens de %1$s (%2$s)?</string>\n\t<string name=\"deleteChatHistory_title\">Apagar Histórico do Chat</string>\n\t<string name=\"subscriptionRequest_text\">%1$s deseja lhe adionar como contato: \\\"%2$s\\\"</string>\n\t<string name=\"subscriptionRequest_title\">Solicitação de Inscrição</string>\n\t<string name=\"subscription_accept\">Aceitar</string>\n\t<string name=\"subscription_reject\">Recusar</string>\n\t<string name=\"subscription_reject_all\">Recusar todas</string>\n\t<string name=\"subscription_status_from\">podem ver seu status</string>\n\n\t<!-- CHATWINDOW -->\n\t<string name=\"chat_from_me\">Eu:</string>\n\t<string name=\"toast_stored_offline\">A mensagem foi armazenada para transmissão.</string>\n\t<string name=\"chat_enterMsgHint\">Digite a mensagem</string> \n\n\t<!-- Message context menu; use the verb form (to quote) -->\n\t<string name=\"chatmenu_quote\">Citar</string>\n\t<!-- Message context menu: repeat the same message -->\n\t<string name=\"chatmenu_resend\">Editar mensagem</string>\n\n\t<!-- GPS settings -->\n\t<!--\n\t<string name=\"showGPS_title\">GPS to status</string>\n\t<string name=\"showGPS_summ_on\">GPS is send to StatusMessage</string>\n\t<string name=\"showGPS_summ_off\">GPS is send to StatusMessage</string>\n\t-->\n\n\t<!-- About Dialog -->\n\t<string name=\"AboutDialog_title\">Sobre o yaxim</string>\n\t<string name=\"AboutDialog_DevelopersTitle\">Desenvolvedores</string>\n\t<!-- Contact the developer button -->\n\t<string name=\"AboutDialog_DevelopersText\">Contato</string>\n\t<string name=\"AboutDialog_LicenceTitle\">Licensa</string>\n\t<string name=\"AboutDialog_Vote\">Avalie este app</string>\n\t<string name=\"AboutDialog_LicenceText\">Este programa é um software livre; você poderá redistribuí-lo, e/ou modificá-lo sob os termos da Licensa Pública Geral (GNU) versão 2 como publicada pela Fundação de Software Livre. Link: http://www.gnu.org/licenses/gpl-2.0.html\\n \\n  Partes deste software são providas sob a licensa MIT: \\n \\n Copyright © 2009 Mads Kristiansen, Nullwire ApS\\n \\n A permissão aqui concedida, livre de encargos, para qualquer pessoa que obtenha uma cópia deste software e os arquivos de documentação associada (o \"software\"), para trabalhar no software sem qualquer restrição, incluindo sem limitações os direitos de uso, cópia, modificação, junção, publicação, sub-licensiamento, e/ou venda das cópias do Software, e permissão para qualquer pessoa que o tenha remodelado a fazê-lo, seguindo as seguintes condições:\\n O aviso de direitos e de permissões acima deverá estar incluso em todas as cópias ou porções substanciais do Software.\\n O SOFTWARE É DISPONIBILIZADO \"COMO TAL\", SEM QUALQUER GARANTIA DE QUALQUER TIPO, EXPRESSA OU IMPLÍCITA, INCLUINDO MAS NÃO LIMITADAS AS GARANTIAS COMERCIAIS, DE ADAPATAÇÃO PARA PROPÓSITOS PARTICULARES E NÃO INFRIGIMENTOS. SOB HIPÓTESE NENHUMA OS DETENTORES DOS DIREITOS DE USO SERÃO CULPÁVEIS DE QUAISQUER QUEIXAS DANOS OU OUTROS, SEJA POR AÇÃO CONTRATUAL, PERDAS E DANOS OU QUALQUER OUTRO, EXIMINDO-OS DE QUALQUER CONEXÃO COM O SOFTWARE OU SEU USO E OUTRAS ALTERAÇÕES NO MESMO.</string>\n\n\t<string name=\"status_available\">Online</string>\n\t<string name=\"status_away\">Ausente</string>\n\t<string name=\"status_chat\">Disponível</string>\n\t<string name=\"status_dnd\">Não Perturbe</string>\n\t<string name=\"status_xa\">Indisponível</string>\n\t<string name=\"status_offline\">Offline</string>\n\n\t<string name=\"translator_credits\">Launchpad Contributions:\n  Dedeco https://launchpad.net/~dedeco\n  M. https://launchpad.net/~nbkhope\n  ThiagoRyuuga https://launchpad.net/~thiagoryuuga</string>\n\n\t<!-- default roster group with no name -->\n\t<string name=\"default_group\">Geral</string>\n\t<string name=\"all_contacts_group\">Todos os contatos</string>\n\t<string name=\"muc_group\">Conversa em grupo</string>\n\n\t<!-- SEND listener popup -->\n\t<string name=\"chooseContact\">Escolher contato</string>\n\t<string name=\"action_settings\">Configurações</string>\n\n\t<!-- MUC strings -->\n\t<string name=\"muc_jid_hint\">ID do grupo de bate papo</string>\n\t<string name=\"muc_nickname_hint\">Apelido</string>\n\t<string name=\"muc_password_hint\">Senha (opcional)</string>\n\t<string name=\"title_activity_muc_invite\">Convites de bate papo em grupo</string>\n\t<!-- Groupchat invitation: \"Invitation from {contact name}\" -->\n\t<string name=\"muc_invitation_from\">Convite de %s</string>\n\t<!-- Groupchat info: {description} ({number} participants) -->\n\t<string name=\"muc_invitation_occupants\">%1$s (%2$d participantes)</string>\n\t<!-- Notification button: \"Join as {default nickname}\" (make SHORT string) -->\n\t<string name=\"muc_invitation_join\">Entrar como %s</string>\n\t<string name=\"muc_synchronizing\">Sincronizando...</string>\n\t<!-- Title of user list, contains JID -->\n\t<string name=\"chat_muc_userlist\">Participantes do chat (%s)</string>\n\t<!-- Kicked from groupchat: \"Kicked: {reason} -->\n\t<string name=\"muc_kicked\">Removido: %s</string>\n\t<!-- Kicked from groupchat: \"Kicked by {admin name}: {reason} -->\n\t<string name=\"muc_kicked_by\">Removido por %1$s: %2$s</string>\n\t<!-- Banned from groupchat: \"Banned: {reason} -->\n\t<string name=\"muc_banned\">Banido: %s</string>\n\t<!-- Banned from groupchat: \"Banned by {admin name}: {reason} -->\n\t<string name=\"muc_banned_by\">Banido por %1$s: %2$s</string>\n\n\t<!-- File upload -->\n\t<string name=\"roster_contextmenu_send\">Enviar...</string>\n\t<string name=\"roster_contextmenu_take_image\">Tirar uma foto</string>\n\t<string name=\"roster_contextmenu_send_image\">Escolher imagem</string>\n\t<string name=\"roster_contextmenu_send_file\">Enviar arquivo</string>\n\t<string name=\"upload_compress\">Compactando imagem...</string>\n\t<string name=\"upload_uploading\">Enviando...</string>\n\t<string name=\"upload_too_large\">Arquivo muito grande!</string>\n\t<string name=\"storage_permission\">%s necessita acesso ao armazenamento para enviar arquivos!</string>\n\t<string name=\"notification_permission_denied\">Notifications are disabled in the Android app preferences.</string>\n\n\t<!-- Search -->\n\t<string name=\"search_msg_hint\">Conteúdo da mensagem</string>\n\n\t<!-- MUC bookmarks -->\n\t<string name=\"group_bookmarks\">Meus grupos de bate papo</string>\n\t<string name=\"group_mucsearch\">Grupos de bate papo publicos</string>\n\t<!-- Service Discovery -->\n\t<string name=\"title_service_disco\">Navegador: %s</string>\n\n\t<!-- Android 9 notification preferences: permanent notification -->\n\t<string name=\"notification_status\">serviço em execução</string>\n\t<!-- Android 9 notification preferences: message notifications -->\n\t<string name=\"notification_msg\">Mensagens</string>\n\n</resources>\n"
  },
  {
    "path": "res/values-ro/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"app_name\">yaxim</string>\n\t<string name=\"app_name_bruno\">Bruno</string>\n\n\t<!-- Connection state -->\n\t<string name=\"conn_title\">yaxim: %s</string>\n\t<string name=\"conn_title_bruno\">Bruno: %s</string>\n\t<string name=\"conn_connecting\">Conectare la server…</string>\n\t<string name=\"conn_disconnecting\">Deconectare…</string>\n\t<string name=\"conn_online\">Conectat(ă)</string>\n\t<string name=\"conn_offline\">Deconectat(ă)</string>\n\t<string name=\"conn_empty_roster\">Nici un contact de arătat!</string>\n\t<string name=\"conn_empty_roster_hints\">Există multe moduri de a adăuga contacte:\\n\\n - Android Beam™: atingeți dispozitivul contactului\\n\\n - Scanare cod QR\\n\\n - \\\"Creeare invitație\\\" și partajare (e-mail, SMS, cod QR, …)\\n\\n - \\\"Adăugare contact\\\" dacă cunoașteți ID-ul Jabber</string>\n\t<string name=\"conn_reconnect\">Următoarea încercare de conexiune în %d secunde.</string>\n\t<string name=\"conn_disconnected\">Conexiune închisă</string>\n\t<string name=\"conn_no_network\">Nici o conexiune la rețea</string>\n\t<string name=\"conn_ping_timeout\">Niciun răspuns</string>\n\t<string name=\"conn_error\">Eroare: %s</string>\n\n\t<!-- Global Strings -->\n\t<string name=\"Global_Exit\">Ieșire</string>\n\t<string name=\"Global_authenticate_first\">Vă rugăm să vă conectați întâi</string>\n\t<string name=\"Global_JID_hint\">utilizator@yax.im</string>\n\t<!-- tooltip message when the user entered an invalid XMPP address -->\n\t<string name=\"Global_JID_malformed\">Verificați formatul adresei!</string>\n\n\t<!-- FirstStartUpDialog -->\n\t<string name=\"StartupDialog_Title\">Bine ați venit la yaxim!</string>\n\t<string name=\"StartupDialog_Summary\">Trebuie să configurați yaxim înainte de a-l folosi. Vă rugăm să introduceți ID-ul Jabber și parola.</string>\n\t<string name=\"StartupDialog_pwHint\">Introduceți parola</string>\n\t<string name=\"StartupDialog_pwshowHint\">Arată parola</string>\n\t<string name=\"StartupDialog_Username_title\">ID Jabber:</string>\n\t<string name=\"StartupDialog_passwd_title\">Parolă:</string>\n\t<string name=\"StartupDialog_advanced\">Avansat…</string>\n\t<string name=\"StartupDialog_create_new\">Înregistrează un cont nou</string>\n\t<string name=\"StartupDialog_error_password\">Parola este prea scurtă!</string>\n\t<string name=\"StartupDialog_created_password\">Parola securizată a fost creată</string>\n\t<string name=\"StartupDialog_auth_failed\">Vă rugăm să verificați numele de utilizator și parola!</string>\n\t<string name=\"StartupDialog_server_failed\">Could not connect to %s!</string>\n\t<string name=\"StartupDialog_no_registration\">Server does not allow registration!</string>\n\n\t<string name=\"StartupDialog_invitation\">Ați fost invitați la Jabber. Vă rugăm să vă completați înregistrarea.</string>\n\t<string name=\"StartupDialog_no_more_accounts\">Nu este acceptat niciun cont suplimentar!</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_message\">Mesaj de la %s</string>\n\t<string name=\"notification_anonymous_message\">Mesaj primit</string>\n\t<!--  Group Chat notification, %1$s is the user name, %2$s is the room, e.g. \"{Ge0rG} in {yaxim Chat}\" -->\n\t<string name=\"notification_muc_message\">%1$s în %2$s</string>\n\t<!--  Group Group Chat private message notification, %1$s is the user name, %2$s is the room, e.g. \"Message from {Ge0rG} in {yaxim Chat}\" -->\n\t<!--string name=\"notification_muc_pm\">Message from %1$s in %2$s</string-->\n\t<!-- notification button: direct reply (make SHORT string) -->\n\t<string name=\"notification_reply\">Răspunde</string>\n\t<!-- notification button: mark as read (make SHORT string) -->\n\t<string name=\"notification_mark_read\">Marchează ca citit</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_error\">Eroare la trimiterea mesajului!</string>\n\n\t<!-- Notification Settings -->\n\t<string name=\"preftitle_notify\">Setări notificare</string>\n\t<string name=\"preftitle_notify_msg\">Notificări mesaje</string>\n\t<string name=\"preftitle_notify_muc\">Notificare discuție de grup</string>\n\t<string name=\"notification_custom\">Sunet personalizat</string>\n\t<string name=\"muc_highlight_title\">Notificare doar la mențiuni</string>\n\t<string name=\"muc_highlight_sum\">Notificare atunci când numele vă este menționat într-o discuție</string>\n\t<string name=\"led_title\">Notificare LED</string>\n\t<string name=\"led_summ\">Clipește lumina de notificare la primirea mesajelor</string>\n\t<string name=\"vibr_title\">Vibrație</string>\n\t<string name=\"vibr_summ\">Vibrează la mesajele primite</string>\n\t<string-array name=\"vibr_values_displayed\">\n\t\t<item>Niciodată</item>\n\t\t<item>Preferință de sistem</item>\n\t\t<item>Mereu</item>\n\t</string-array>\n\t<string name=\"ringtone_title\">Ton de apel</string>\n\t<string name=\"ringtone_summ\">Sunet la mesaj primit</string>\n\t<string name=\"ticker_title\">Previzualizare mesaj</string>\n\t<string name=\"ticker_summ\">Arată în bara de stare expeditorul și mesajul</string>\n\n\t<!-- Startup Setting Strings -->\n\t<string name=\"preftitle_general\">Setări generale</string>\n\t<string name=\"pref_dnd_when_silent\">\\\"Nu deranja\\\" în modul silențios</string>\n\t<string name=\"pref_dnd_when_silent_summ\">Setează starea de prezență ca \\\"Nu deranja\\\" atunci când dispozitivul este în mod silențios</string>\n\t<string name=\"statuspopup_name\">Setare stare</string>\n\t<string name=\"showOffline_summ\">Arată mereu toate contactele din listă</string>\n\t<string name=\"showOffline_title\">Arată contactele deconectate</string>\n\t<string name=\"enableGroups_summ\">Aranjare contacte în grupuri</string>\n\t<string name=\"enableGroups_title\">Arată grupurile contactelor</string>\n\t<string name=\"foregroundService_summ\">Păstrează aplicația în memorie pentru a asigura conectarea continuă (serviciul în prim-plan)</string>\n\t<string name=\"foregroundService_title\">Iconița în bara de stare</string>\n\n\t<string name=\"preftitle_debug\">Rapoarte erori</string>\n\t<string name=\"smackdebug_summ\">Jurnal de erori din logcat (poate conține informații personale)</string>\n\t<string name=\"smackdebug_title\">Raport erori SMACK</string>\n\n\t<string name=\"reportcrash_title\">Trimite rapoarte opriri neașteptate</string>\n\t<string name=\"reportcrash_summ\">Rapoartele de erori vor ajunge la dezvoltator</string>\n\n\t<!-- Appearence Strings -->\n\t<string name=\"preftitle_app\">Interfață</string>\n\t<string name=\"FontChat_title\">Mărime text</string>\n\t<string name=\"FontChat_summ\">Setează mărimea fontului</string>\n\t<string name=\"FontChat_dialog\">Mărime text</string>\n\t<!--\n\t<string name=\"FontRost_title\">Roster font size</string>\n\t<string name=\"FontRost_summ\">Set roster font size</string>\n\t<string name=\"FontRost_dialog\">Roster font fize</string>\n\t<string name=\"setFontRoster\">Set roster font size</string>\n\t-->\n\t<string name=\"pref_theme\">Temă</string>\n\t<string name=\"pref_theme_dark\">Întunecată</string>\n\t<string name=\"pref_theme_light\">Deschisă</string>\n\t<string name=\"pref_theme_pine\">Pin</string>\n\t<string name=\"pref_theme_ice\">Gheață</string>\n\t<string name=\"preftitle_ui\">Interfață</string>\n\t<string-array name=\"fontSizesChat\">\n\t\t<item>mic</item>\n\t\t<item>normal</item>\n\t\t<item>mare</item>\n\t\t<item>imens</item>\n\t</string-array>\n\n\t<!-- Mainmenu \t-->\n\t<string name=\"Menu_addFriend\">Adaugă contact</string>\n\t<string name=\"Menu_addClipboard\">Adaugă %s</string>\n\t<string name=\"Menu_ShowOff\">Arată deconectate</string>\n\t<string name=\"Menu_HideOff\">Ascunde deconectate</string>\n\t<string name=\"Menu_AccSettings\">Editare cont</string>\n\t<string name=\"Menu_Settings\">Setări</string>\n\t<string name=\"Menu_Status\">Stare</string>\n\t<string name=\"Menu_connect\">Conectare</string>\n\t<string name=\"Menu_disconnect\">Deconectare</string>\n\t<string name=\"Menu_about\">Despre yaxim</string>\n\t<string name=\"Menu_about_bruno\">Despre Bruno</string>\n\t<string name=\"Menu_muc\">Adaugă / răsfoire...</string>\n\t<string name=\"Menu_matrix\">Intră în Matrix</string>\n\t<string name=\"Menu_mark_all_as_read\">Marchează toate ca citite</string>\n\t<string name=\"Menu_send_invitation\">Creare invitație</string>\n    <string name=\"Menu_userlist\">Participanți</string>\n\n\n\t<!-- AddFriend -->\n\t<string name=\"addFriend_Title\">Adaugă un contact</string>\n\t<string name=\"addFriend_Summ\">Vă rugăm să introduceți ID-ul Jabber al prietenului(ei), numele dorit și alegeți grupul lor!</string>\n\t<string name=\"addFriend_aliasHint\">Nume afișat</string>\n\t<string name=\"addrosteritemaddgroupchoice\">Adaugă la un grup nou</string>\n\t<string name=\"NewGroup_EditTextField_Hint\">Numele noului grup</string>\n\n\t<!-- Roster CONTEXTMENU -->\n\t<string name=\"roster_contextmenu_group_rename\">Redenumire grup</string>\n\t<string name=\"roster_contextmenu_contact_mark_as_read\">Marchează ca citit</string>\n\t<string name=\"roster_contextmenu_contact_delete\">Şterge contact</string>\n\t<string name=\"roster_contextmenu_contact_delmsg\">Șterge istoricul discuției</string>\n\t<string name=\"roster_contextmenu_contact_rename\">Redenumire</string>\n\t<string name=\"roster_contextmenu_contact_request_auth\">Solicitare autorizare</string>\n\t<string name=\"roster_contextmenu_contact_change_group\">Schimbă grup</string>\n\t<string name=\"roster_contextmenu_contact_share\">Partajare adresă</string>\n\t<string name=\"roster_contextmenu_contact_ringtone\">Ton de apel</string>\n\t<string name=\"roster_contextmenu_muc_edit\">Editare grup</string>\n\t<string name=\"roster_contextmenu_muc_leave\">Părăsește grup</string>\n\t<string name=\"muc_leave_question\">Sigur doriți să părăsiți %s?</string>\n\n\t<!-- Accountprefs -->\n\t<string name=\"account_settings_login\">Informații de autentificare</string>\n\t<string name=\"account_settings_title\">Setări cont</string>\n\t<string name=\"account_options_title\">Opțiuni conectare</string>\n\t<string name=\"account_options_advanced\">Opțiuni avansate</string>\n\t<string name=\"carbons_title\">Copii indigo mesaje (XEP-0280)</string>\n\t<string name=\"carbons_summ\">Cere copii ale mesajelor de la ceilalți clienți ai dumneavoastră</string>\n\t<string name=\"account_jabberID_title\">ID Jabber</string>\n\t<string name=\"account_jabberID_sum\">examplu: eu@jabber.examplu.ro</string>\n\t<string name=\"account_jabberID_dialog_title\">Introduceți-vă ID-ul Jabber</string>\n\t<string name=\"account_jabberPW_title\">Parolă cont</string>\n\t<string name=\"account_jabberPW_sum\">Parola contului dumneavoastră Jabber</string>\n\t<string name=\"account_jabberPW_change_on_server\">Schimbă parola pe server</string>\n\t<string name=\"account_jabberPW_password_old\">Parola veche:</string>\n\t<string name=\"account_jabberPW_password_new\">Parola nouă:</string>\n\t<string name=\"account_jabberPW_warning\">ATENȚIE! Pentru a vă autentifica cu succes trebuie să setați aceeași parola și pe server!</string>\n\t<string name=\"account_jabberPW_progress\">Vă rugăm să așteptați, se schimbă parola...</string>\n\t<string name=\"account_jabberPW_finished\">Parola a fost schimbată cu succes.</string>\n\t<string name=\"account_jabberPW_error\">Eroare la schimbarea parolei: %s</string>\n\t<string name=\"account_nickname_title\">Nume afișat</string>\n\t<string name=\"account_nickname_summ\">Numele ce va fi afișat celorlalți utilizatori</string>\n\t\n\t<!-- accountprefs -->\n\t<string name=\"account_resource_title\">Resursă client</string>\n\t<string name=\"account_resource_summ\">Implicit: yaxim</string>\n\t<string name=\"account_resource_dialog_title\">Introduceți resursa:</string>\n\t<string name=\"account_resource_hint\">yaxim</string>\n\t<string name=\"account_prio_title\">Prioritate client</string>\n\t<string name=\"account_prio_summ\">Implicit: 0 (permis: -128 .. 127)</string>\n\t<string name=\"account_prio_error\">Valori permise: -128 .. 127</string>\n\t<string name=\"account_prio_dialog_title\">Introduceți prioritatea</string>\n\t<string name=\"account_port_title\">Port server</string>\n\t<string name=\"account_port_sum\">Implicit: 5222</string>\n\t<string name=\"account_port_dialog_title\">Introduceți portul serverului:</string>\n\t<string name=\"account_port_hint\">5222</string>\n\t<string name=\"account_customserver_title\">Server personalizat</string>\n\t<string name=\"account_customserver_summ\">(Opțional) nume alternativ server gazdă</string>\n\t<string name=\"account_customserver_dialog_title\">Introduceți nume server gazdă:</string>\n\t<string name=\"account_customserver_hint\">gazda.exemplu.ro</string>\n\t<string name=\"require_ssl_title\">Necesită SSL/TLS</string>\n\t<string name=\"require_ssl_summ\">Criptează mereu conexiunea la server</string>\n\n\t<!--StatusPopUp-->\n\t<string name=\"AddContact_SpinnerPrompt\">Alegeți grup</string>\n\t<string name=\"setStatusmsgHint\">Mesajull dumneavoastră de stare</string>\n\t<string name=\"setStatusTitle\">Setare stare</string>\n\t<string name=\"RenameGroup_summ\">Redenumire grup %s în:</string>\n\t<string name=\"RenameGroup_title\">Redenumire grup</string>\n\t<string name=\"RenameEntry_summ\">Redenumire %1$s (%2$s) în:</string>\n\t<string name=\"RenameEntry_title\">Redenumire contact</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_summ\">Alegeți un grup din meniul de mai jos</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_title\">Schimbă grup</string>\n\t<string name=\"deleteRosterItem_text\">Sigur doriți să eliminați %1$s (%2$s)?</string>\n\t<string name=\"deleteRosterItem_title\">Șterge contact</string>\n\t<string name=\"deleteChatHistory_text\">Sigur doriți să eliminați toate mesajele cu %1$s (%2$s)?</string>\n\t<string name=\"deleteChatHistory_title\">Ștergere istoric discuție</string>\n\t<string name=\"subscriptionRequest_text\">%1$s dorește să vă adauge în lista lor de contacte: \\\"%2$s\\\"</string>\n\t<string name=\"subscriptionRequest_title\">Cerere de abonare</string>\n\t<string name=\"subscription_accept\">Acceptă</string>\n\t<string name=\"subscription_reject\">Respinge</string>\n\t<string name=\"subscription_reject_all\">Respinge toate</string>\n\t<string name=\"subscription_status_from\">vă poate vedea starea</string>\n\n\t<!-- CHATWINDOW -->\n\t<string name=\"chat_from_me\">Eu:</string>\n\t<string name=\"toast_stored_offline\">Mesajul a fost stocat pentru transmisie.</string>\n\t<string name=\"chat_enterMsgHint\">Introduceți mesajul</string> \n\n\t<!-- Message context menu; use the verb form (to quote) -->\n\t<string name=\"chatmenu_quote\">Citează</string>\n\t<!-- Message context menu: repeat the same message -->\n\t<string name=\"chatmenu_resend\">Editare mesaj</string>\n\n\t<!-- GPS settings -->\n\t<!--\n\t<string name=\"showGPS_title\">GPS to status</string>\n\t<string name=\"showGPS_summ_on\">GPS is send to StatusMessage</string>\n\t<string name=\"showGPS_summ_off\">GPS is send to StatusMessage</string>\n\t-->\n\n\t<!-- About Dialog -->\n\t<string name=\"AboutDialog_title\">Despre yaxim</string>\n\t<string name=\"AboutDialog_DevelopersTitle\">Dezvoltatori</string>\n\t<!-- Contact the developer button -->\n\t<string name=\"AboutDialog_DevelopersText\">Contact</string>\n\t<string name=\"AboutDialog_LicenceTitle\">Licență</string>\n\t<string name=\"AboutDialog_Vote\">Evaluează aplicația</string>\n\t<string name=\"AboutDialog_LicenceText\">\n\t\tThis program is free software; you can redistribute\n\t\tit and/or\n\t\tmodify it under the terms of the GNU General Public License\n\t\tversion 2\n\t\tas published by the Free Software Foundation.\n\t\tLink:\n\t\thttp://www.gnu.org/licenses/gpl-2.0.html\\n\n\t\t\\n\n\t\tParts of this software are\n\t\tprovided under the MIT License:\\n\n\t\t\\n\n\t\tCopyright © 2009 Mads\n\t\tKristiansen, Nullwire ApS\\n\n\t\t\\n\n\t\tPermission is hereby granted, free of\n\t\tcharge, to any person obtaining\n\t\ta copy\n\t\tof this software and associated\n\t\tdocumentation files (the\n\t\t\"Software\"), to deal\n\t\tin the Software without\n\t\trestriction, including\n\t\twithout limitation the rights\n\t\tto use, copy,\n\t\tmodify, merge, publish,\n\t\tdistribute, sublicense, and/or sell\n\t\tcopies of\n\t\tthe Software, and to\n\t\tpermit persons to whom the Software is\n\t\tfurnished to\n\t\tdo so, subject to\n\t\tthe following conditions:\n\t\t\\n\n\t\tThe above copyright notice\n\t\tand this permission notice shall be\n\t\tincluded in all\n\t\tcopies or\n\t\tsubstantial portions of the Software.\n\t\t\\n\n\t\tTHE SOFTWARE IS PROVIDED \"AS\n\t\tIS\", WITHOUT WARRANTY OF ANY KIND,\n\t\tEXPRESS OR\n\t\tIMPLIED, INCLUDING BUT NOT\n\t\tLIMITED TO THE WARRANTIES OF\n\t\tMERCHANTABILITY,\n\t\tFITNESS FOR A PARTICULAR\n\t\tPURPOSE AND NONINFRINGEMENT.\n\t\tIN NO EVENT SHALL THE\n\t\tAUTHORS OR COPYRIGHT\n\t\tHOLDERS BE LIABLE FOR ANY\n\t\tCLAIM, DAMAGES OR OTHER\n\t\tLIABILITY, WHETHER IN\n\t\tAN ACTION OF CONTRACT,\n\t\tTORT OR OTHERWISE, ARISING FROM,\n\t\tOUT OF OR IN\n\t\tCONNECTION WITH THE\n\t\tSOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n\t\tSOFTWARE.\n    </string>\n\n\t<string name=\"status_available\">Conectat(ă)</string>\n\t<string name=\"status_away\">Plecat</string>\n\t<string name=\"status_chat\">Disponibil(ă) pentru conversație</string>\n\t<string name=\"status_dnd\">Nu deranja</string>\n\t<string name=\"status_xa\">Indisponibil(ă)</string>\n\t<string name=\"status_offline\">Deconectat(ă)</string>\n\n\t<string name=\"translator_credits\">Dezvoltatori\n\nLaunchpad Contributions:\n  Georg Lukas https://launchpad.net/~ge0rg\n  Licaon_Kter https://launchpad.net/~licaon-kter</string>\n\n\t<!-- default roster group with no name -->\n\t<string name=\"default_group\">General</string>\n\t<string name=\"all_contacts_group\">Toate contactele</string>\n\t<string name=\"muc_group\">Grupuri de discuție</string>\n\n\t<!-- SEND listener popup -->\n\t<string name=\"chooseContact\">Alegeți contact</string>\n\t<string name=\"action_settings\">Setări</string>\n\n\t<!-- MUC strings -->\n\t<string name=\"muc_jid_hint\">ID discuție de grup</string>\n\t<string name=\"muc_nickname_hint\">Nume</string>\n\t<string name=\"muc_password_hint\">Parolă</string>\n\t<string name=\"title_activity_muc_invite\">Invitație discuție de grup</string>\n\t<!-- Groupchat invitation: \"Invitation from {contact name}\" -->\n\t<string name=\"muc_invitation_from\">Invitație de la %s</string>\n\t<!-- Groupchat info: {description} ({number} participants) -->\n\t<string name=\"muc_invitation_occupants\">%1$s (%2$d participanți)</string>\n\t<!-- Notification button: \"Join as {default nickname}\" (make SHORT string) -->\n\t<string name=\"muc_invitation_join\">Alătură-te ca %s</string>\n\t<string name=\"muc_synchronizing\">Sincronizare...</string>\n\t<!-- Title of user list, contains JID -->\n\t<string name=\"chat_muc_userlist\">Participanți discuție de grup (%s)</string>\n\t<!-- Kicked from groupchat: \"Kicked: {reason} -->\n\t<string name=\"muc_kicked\">Ați fost dat(ă) afară: %s</string>\n\t<!-- Kicked from groupchat: \"Kicked by {admin name}: {reason} -->\n\t<string name=\"muc_kicked_by\">Ați fost dat(ă) afară de către %1$s: %2$s</string>\n\t<!-- Banned from groupchat: \"Banned: {reason} -->\n\t<string name=\"muc_banned\">Vi s-a interzis accesul: %s</string>\n\t<!-- Banned from groupchat: \"Banned by {admin name}: {reason} -->\n\t<string name=\"muc_banned_by\">Vi s-a interzis accesul de către %1$s: %2$s</string>\n\n\t<!-- File upload -->\n\t<string name=\"roster_contextmenu_send\">Trimite...</string>\n\t<string name=\"roster_contextmenu_take_image\">Fă o poză</string>\n\t<string name=\"roster_contextmenu_send_image\">Alege o imagine</string>\n\t<string name=\"roster_contextmenu_send_file\">Trimite fișier</string>\n\t<string name=\"upload_compress\">Se comprimă imaginea...</string>\n\t<string name=\"upload_uploading\">Se încarcă...</string>\n\t<string name=\"upload_too_large\">fișier prea mare!</string>\n\t<string name=\"storage_permission\">%s are nevoie de acces la stocare pentru a trimite fișiere!</string>\n\t<string name=\"notification_permission_denied\">Notifications are disabled in the Android app preferences.</string>\n\n\t<!-- Search -->\n\t<string name=\"search_msg_hint\">Conținut mesaj</string>\n\n\t<!-- MUC bookmarks -->\n\t<string name=\"group_bookmarks\">Discuțiile mele de grup</string>\n\t<string name=\"group_mucsearch\">Discuții publice de grup</string>\n\t<!-- Service Discovery -->\n\t<string name=\"title_service_disco\">Răsfoire: %s</string>\n\n\t<!-- Android 9 notification preferences: permanent notification -->\n\t<string name=\"notification_status\">Serviciu în prim-plan</string>\n\t<!-- Android 9 notification preferences: message notifications -->\n\t<string name=\"notification_msg\">Mesaje</string>\n\n</resources>\n"
  },
  {
    "path": "res/values-ru/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"app_name\">yaxim</string>\n\t<string name=\"app_name_bruno\">Бруно</string>\n\n\t<!-- Connection state -->\n\t<string name=\"conn_title\">yaxim: %s</string>\n\t<string name=\"conn_title_bruno\">Бруно: %s</string>\n\t<string name=\"conn_connecting\">Подключение к серверу…</string>\n\t<string name=\"conn_disconnecting\">Отключение…</string>\n\t<string name=\"conn_online\">В сети</string>\n\t<string name=\"conn_offline\">Отключён</string>\n\t<string name=\"conn_empty_roster\">Нет контактов для отображения!</string>\n\t<string name=\"conn_empty_roster_hints\">Можете добавить контакты несколькими способами:\\n\\n - Через Android Beam™ (приложите устройства друг к другу)\\n\\n - Сканировать QR-код\\n\\n - \\«Создать приглашение\\» и поделиться им через e-mail, SMS, QR-код и т. д.\\n\\n - \\«Добавить контакт\\», если известен JID</string>\n\t<string name=\"conn_reconnect\">Следующая попытка подключения через %d секунд.</string>\n\t<string name=\"conn_disconnected\">Соединение закрыто</string>\n\t<string name=\"conn_no_network\">Отсутствует сетевое подключение</string>\n\t<string name=\"conn_ping_timeout\">Нет ответа</string>\n\t<string name=\"conn_error\">Ошибка: %s</string>\n\n\t<!-- Global Strings -->\n\t<string name=\"Global_Exit\">Выйти</string>\n\t<string name=\"Global_authenticate_first\">Пожалуйста, сначала соединитесь</string>\n\t<string name=\"Global_JID_hint\">user@yax.im</string>\n\t<!-- tooltip message when the user entered an invalid XMPP address -->\n\t<string name=\"Global_JID_malformed\">Проверьте формат адреса!</string>\n\n\t<!-- FirstStartUpDialog -->\n\t<string name=\"StartupDialog_Title\">Добро пожаловать в yaxim!</string>\n\t<string name=\"StartupDialog_Summary\">Необходимо настроить yaxim перед использованием. Пожалуйста, введите Jabber ID и пароль.</string>\n\t<string name=\"StartupDialog_pwHint\">Введите пароль</string>\n\t<string name=\"StartupDialog_pwshowHint\">Показать пароль</string>\n\t<string name=\"StartupDialog_Username_title\">Jabber ID:</string>\n\t<string name=\"StartupDialog_passwd_title\">Пароль:</string>\n\t<string name=\"StartupDialog_advanced\">Дополнительно…</string>\n\t<string name=\"StartupDialog_create_new\">Зарегистрировать новую учётную запись</string>\n\t<string name=\"StartupDialog_error_password\">Пароль слишком короткий!</string>\n\t<string name=\"StartupDialog_created_password\">Создан надёжный пароль</string>\n\t<string name=\"StartupDialog_auth_failed\">Проверьте учётные данные и пароль!</string>\n\t<string name=\"StartupDialog_server_failed\">Не могу подключиться к %s!</string>\n\t<string name=\"StartupDialog_no_registration\">Сервер не поддерживает регистрацию!</string>\n\n\t<string name=\"StartupDialog_invitation\">Вас пригласили в Jabber. Пожалуйста, завершите регистрацию.</string>\n\t<string name=\"StartupDialog_no_more_accounts\">Дополнительная учетная запись не поддерживается!</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_message\">Сообщение от %s</string>\n\t<string name=\"notification_anonymous_message\">Получено сообщение</string>\n\t<!--  Group Chat notification, %1$s is the user name, %2$s is the room, e.g. \"{Ge0rG} in {yaxim Chat}\" -->\n\t<string name=\"notification_muc_message\">%1$s в %2$s</string>\n\t<!--  Group Group Chat private message notification, %1$s is the user name, %2$s is the room, e.g. \"Message from {Ge0rG} in {yaxim Chat}\" -->\n\t<!--string name=\"notification_muc_pm\">Message from %1$s in %2$s</string-->\n\t<!-- notification button: direct reply (make SHORT string) -->\n\t<string name=\"notification_reply\">Ответить</string>\n\t<!-- notification button: mark as read (make SHORT string) -->\n\t<string name=\"notification_mark_read\">Отметить прочитанным</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_error\">Ошибка при отправлении сообщения</string>\n\n\t<!-- Notification Settings -->\n\t<string name=\"preftitle_notify\">Настройки параметров уведомлений</string>\n\t<string name=\"preftitle_notify_msg\">Контакт ростера</string>\n\t<string name=\"preftitle_notify_muc\">Конференция</string>\n\t<string name=\"notification_custom\">Индивидуальные параметры</string>\n\t<string name=\"muc_highlight_title\">Только уведомить об упоминании</string>\n\t<string name=\"muc_highlight_sum\">Уведомлять при упоминании вашего ника в конференции</string>\n\t<string name=\"led_title\">LED-индикация</string>\n\t<string name=\"led_summ\">LED-индикация входящих сообщений</string>\n\t<string name=\"vibr_title\">Вибрация</string>\n\t<string name=\"vibr_summ\">Вибрировать при входящих сообщениях</string>\n\t<string-array name=\"vibr_values_displayed\">\n\t\t<item>Никогда</item>\n\t\t<item>Системные настройки</item>\n\t\t<item>Всегда</item>\n\t</string-array>\n\t<string name=\"ringtone_title\">Звук сообщения</string>\n\t<string name=\"ringtone_summ\">Проигрывать звук при получении сообщения</string>\n\t<string name=\"ticker_title\">Предпросмотр сообщения</string>\n\t<string name=\"ticker_summ\">Показывать отправителя и сообщение в статусной строке</string>\n\n\t<!-- Startup Setting Strings -->\n\t<string name=\"preftitle_general\">Общие настройки</string>\n\t<string name=\"pref_dnd_when_silent\">\\«Не беспокоить\\» в беззвучном режиме</string>\n\t<string name=\"pref_dnd_when_silent_summ\">Установить статус \\«Не беспокоить\\», если телефон в беззвучном режиме</string>\n\t<string name=\"statuspopup_name\">Установить ваш статус</string>\n\t<string name=\"showOffline_summ\">Всегда показывать все контакты в списке собеседников</string>\n\t<string name=\"showOffline_title\">Показывать отключённые контакты</string>\n\t<string name=\"enableGroups_summ\">Упорядочить контакты по группам</string>\n\t<string name=\"enableGroups_title\">Показывать группы</string>\n\t<string name=\"foregroundService_summ\">Держать приложение в памяти, чтобы обеспечить постоянное соединение (служба на переднем плане)</string>\n\t<string name=\"foregroundService_title\">Значок в статусной строке</string>\n\n\t<string name=\"preftitle_debug\">Отладка</string>\n\t<string name=\"smackdebug_summ\">Пакетная и отладочная информация через logcat (может содержать личную информацию)</string>\n\t<string name=\"smackdebug_title\">Отладка с помощью SMACK</string>\n\n\t<string name=\"reportcrash_title\">Отправлять отчёты об ошибках</string>\n\t<string name=\"reportcrash_summ\">Посылать анонимные отчёты о падениях разработчику</string>\n\n\t<!-- Appearence Strings -->\n\t<string name=\"preftitle_app\">Внешний вид</string>\n\t<string name=\"FontChat_title\">Размер шрифта в чате</string>\n\t<string name=\"FontChat_summ\">Установить размер шрифта в чате</string>\n\t<string name=\"FontChat_dialog\">Размер шрифта в чате</string>\n\t<!--\n\t<string name=\"FontRost_title\">Roster font size</string>\n\t<string name=\"FontRost_summ\">Set roster font size</string>\n\t<string name=\"FontRost_dialog\">Roster font fize</string>\n\t<string name=\"setFontRoster\">Set roster font size</string>\n\t-->\n\t<string name=\"pref_theme\">Оформление</string>\n\t<string name=\"pref_theme_dark\">Тёмное</string>\n\t<string name=\"pref_theme_light\">Светлое</string>\n\t<string name=\"pref_theme_pine\">Сосна</string>\n\t<string name=\"pref_theme_ice\">Лёд</string>\n\t<string name=\"preftitle_ui\">Внешний вид</string>\n\t<string-array name=\"fontSizesChat\">\n\t\t<item>маленький</item>\n\t\t<item>обычный</item>\n\t\t<item>большой</item>\n\t\t<item>огромный</item>\n\t</string-array>\n\n\t<!-- Mainmenu \t-->\n\t<string name=\"Menu_addFriend\">Добавить контакт</string>\n\t<string name=\"Menu_addClipboard\">Добавить %s</string>\n\t<string name=\"Menu_ShowOff\">Показать отключённых</string>\n\t<string name=\"Menu_HideOff\">Скрыть отключённых</string>\n\t<string name=\"Menu_AccSettings\">Редактировать учётную запись</string>\n\t<string name=\"Menu_Settings\">Настройки</string>\n\t<string name=\"Menu_Status\">Статус</string>\n\t<string name=\"Menu_connect\">Подключиться</string>\n\t<string name=\"Menu_disconnect\">Отключиться</string>\n\t<string name=\"Menu_about\">О yaxim</string>\n\t<string name=\"Menu_about_bruno\">О Бруно</string>\n\t<string name=\"Menu_muc\">Добавить / просмотреть…</string>\n\t<string name=\"Menu_matrix\">Войти в Matrix…</string>\n\t<string name=\"Menu_mark_all_as_read\">Отметить все как прочитанные</string>\n\t<string name=\"Menu_send_invitation\">Создать приглашение</string>\n    <string name=\"Menu_userlist\">Участники</string>\n\n\n\t<!-- AddFriend -->\n\t<string name=\"addFriend_Title\">Добавить контакт</string>\n\t<string name=\"addFriend_Summ\">Пожалуйста, введите Jabber ID друга, желаемое имя для отображения и выберите его группу!</string>\n\t<string name=\"addFriend_aliasHint\">Имя для отображения</string>\n\t<string name=\"addrosteritemaddgroupchoice\">Добавить в новую группу</string>\n\t<string name=\"NewGroup_EditTextField_Hint\">Название новой группы</string>\n\n\t<!-- Roster CONTEXTMENU -->\n\t<string name=\"roster_contextmenu_group_rename\">Переименовать группу</string>\n\t<string name=\"roster_contextmenu_contact_mark_as_read\">Отметить как прочитанное</string>\n\t<string name=\"roster_contextmenu_contact_delete\">Удалить контакт</string>\n\t<string name=\"roster_contextmenu_contact_delmsg\">Удалить историю чата</string>\n\t<string name=\"roster_contextmenu_contact_rename\">Переименовать</string>\n\t<string name=\"roster_contextmenu_contact_request_auth\">Запросить авторизацию</string>\n\t<string name=\"roster_contextmenu_contact_change_group\">Изменить группу</string>\n\t<string name=\"roster_contextmenu_contact_share\">Поделиться адресом</string>\n\t<string name=\"roster_contextmenu_contact_ringtone\">Звук сообщения</string>\n\t<string name=\"roster_contextmenu_muc_edit\">Изменить закладку</string>\n\t<string name=\"roster_contextmenu_muc_leave\">Покинуть конференцию</string>\n\t<string name=\"muc_leave_question\">Действительно покинуть %s?</string>\n\n\t<!-- Accountprefs -->\n\t<string name=\"account_settings_login\">Информация об учётной записи</string>\n\t<string name=\"account_settings_title\">Настройки учётной записи</string>\n\t<string name=\"account_options_title\">Настройки подключения</string>\n\t<string name=\"account_options_advanced\">Расширенные настройки</string>\n\t<string name=\"carbons_title\">Копирование сообщений (XEP-0280)</string>\n\t<string name=\"carbons_summ\">Запрашивать копии сообщений от других ваших клиентов</string>\n\t<string name=\"account_jabberID_title\">Jabber ID</string>\n\t<string name=\"account_jabberID_sum\">пример: me@jabber.example.com</string>\n\t<string name=\"account_jabberID_dialog_title\">Введите свой Jabber ID:</string>\n\t<string name=\"account_jabberPW_title\">Пароль учётной записи</string>\n\t<string name=\"account_jabberPW_sum\">Пароль вашей учётной записи Jabber</string>\n\t<string name=\"account_jabberPW_change_on_server\">Изменить пароль на сервере</string>\n\t<string name=\"account_jabberPW_password_old\">Старый пароль:</string>\n\t<string name=\"account_jabberPW_password_new\">Новый пароль:</string>\n\t<string name=\"account_jabberPW_warning\">ПРЕДУПРЕЖДЕНИЕ! Вводимые пароли должны совпадать!</string>\n\t<string name=\"account_jabberPW_progress\">Подождите, пожалуйста, изменение пароля…</string>\n\t<string name=\"account_jabberPW_finished\">Пароль успешно изменён.</string>\n\t<string name=\"account_jabberPW_error\">Ошибка изменения пароля: %s</string>\n\t<string name=\"account_nickname_title\">Отображаемое имя</string>\n\t<string name=\"account_nickname_summ\">Ваш ник показывается другим пользователям</string>\n\t\n\t<!-- accountprefs -->\n\t<string name=\"account_resource_title\">Ресурс клиента</string>\n\t<string name=\"account_resource_summ\">По умолчанию: yaxim</string>\n\t<string name=\"account_resource_dialog_title\">Введите ресурс:</string>\n\t<string name=\"account_resource_hint\">yaxim</string>\n\t<string name=\"account_prio_title\">Приоритет клиента</string>\n\t<string name=\"account_prio_summ\">По умолчанию: 0 (разрешено от -128 до 127)</string>\n\t<string name=\"account_prio_error\">Допустимые значения: -128…127</string>\n\t<string name=\"account_prio_dialog_title\">Введите приоритет:</string>\n\t<string name=\"account_port_title\">Порт сервера</string>\n\t<string name=\"account_port_sum\">По умолчанию: 5222</string>\n\t<string name=\"account_port_dialog_title\">Введите порт сервера:</string>\n\t<string name=\"account_port_hint\">5222</string>\n\t<string name=\"account_customserver_title\">Пользовательский сервер</string>\n\t<string name=\"account_customserver_summ\">(Опционально) альтернативный адрес сервера</string>\n\t<string name=\"account_customserver_dialog_title\">Введите имя сервера:</string>\n\t<string name=\"account_customserver_hint\">host.example.com</string>\n\t<string name=\"require_ssl_title\">Требовать SSL/TLS</string>\n\t<string name=\"require_ssl_summ\">Всегда шифровать соединение с сервером</string>\n\n\t<!--StatusPopUp-->\n\t<string name=\"AddContact_SpinnerPrompt\">Выберите группу</string>\n\t<string name=\"setStatusmsgHint\">Ваш статус</string>\n\t<string name=\"setStatusTitle\">Установить ваш статус</string>\n\t<string name=\"RenameGroup_summ\">Переименовать группу %s в:</string>\n\t<string name=\"RenameGroup_title\">Переименовать группу</string>\n\t<string name=\"RenameEntry_summ\">Переименовать %1$s (%2$s) в:</string>\n\t<string name=\"RenameEntry_title\">Переименовать контакт</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_summ\">Выберите группу из списка ниже</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_title\">Изменить группу</string>\n\t<string name=\"deleteRosterItem_text\">Действительно удалить %1$s (%2$s)?</string>\n\t<string name=\"deleteRosterItem_title\">Удалить контакт</string>\n\t<string name=\"deleteChatHistory_text\">Действительно удалить всю историю сообщений с %1$s (%2$s)?</string>\n\t<string name=\"deleteChatHistory_title\">Удалить историю сообщений</string>\n\t<string name=\"subscriptionRequest_text\">%1$s хочет добавить вас в контакты: \\\"%2$s\\\"</string>\n\t<string name=\"subscriptionRequest_title\">Запрос подписки</string>\n\t<string name=\"subscription_accept\">Принять</string>\n\t<string name=\"subscription_reject\">Отклонить</string>\n\t<string name=\"subscription_reject_all\">Отклонить все</string>\n\t<string name=\"subscription_status_from\">может видеть ваш статус</string>\n\n\t<!-- CHATWINDOW -->\n\t<string name=\"chat_from_me\">Я:</string>\n\t<string name=\"toast_stored_offline\">Сообщение было сохранено для отправки.</string>\n\t<string name=\"chat_enterMsgHint\">Введите сообщение</string> \n\n\t<!-- Message context menu; use the verb form (to quote) -->\n\t<string name=\"chatmenu_quote\">Цитировать</string>\n\t<!-- Message context menu: repeat the same message -->\n\t<string name=\"chatmenu_resend\">Редактировать</string>\n\n\t<!-- GPS settings -->\n\t<!--\n\t<string name=\"showGPS_title\">GPS to status</string>\n\t<string name=\"showGPS_summ_on\">GPS is send to StatusMessage</string>\n\t<string name=\"showGPS_summ_off\">GPS is send to StatusMessage</string>\n\t-->\n\n\t<!-- About Dialog -->\n\t<string name=\"AboutDialog_title\">О yaxim</string>\n\t<string name=\"AboutDialog_DevelopersTitle\">Разработчики</string>\n\t<!-- Contact the developer button -->\n\t<string name=\"AboutDialog_DevelopersText\">Контакт</string>\n\t<string name=\"AboutDialog_LicenceTitle\">Лицензирование</string>\n\t<string name=\"AboutDialog_Vote\">Оцените приложение</string>\n\t<string name=\"AboutDialog_LicenceText\">Эта программа является свободным программным обеспечением; вы можете распространять и/или изменять его в соответствии с условиями лицензии GNU General Public версии 2, опубликованной Фондом свободного программного обеспечения. Ссылка: https://www.gnu.org/licenses/old-licenses/gpl-2.0.ru.html\\n \\n Отдельные части этого программного обеспечения предоставляются в соответствии с лицензией MIT:\\n \\n Copyright © 2009 Mads Kristiansen, Nullwire ApS\\n \\n Настоящим предоставляется разрешение, бесплатно, любому лицу, получившему копию этого программного обеспечения и связанных файлов документации, («Программное обеспечение»), работать с Программным обеспечением без ограничений, включая, без ограничений, права на использование, копирование, изменение, объединение, публикацию, распространение, сублицензию и/или продажу копий Программного обеспечения и разрешать лицам, которым предоставляется Программное обеспечение, делать это, при соблюдении следующих условий: \\n Вышеупомянутое уведомление об авторских правах и это уведомление о разрешении должны быть включены во все копии или существенные части Программного обеспечения. \\n ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ГАРАНТИЯМИ КОММЕРЧЕСКОЙ ЦЕННОСТИ, ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ И НЕНАРУШЕНИЯ. НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ АВТОРЫ ИЛИ АВТОРСКИЕ ПАРТНЕРЫ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЕТЕНЗИИ, УБЫТКИ ИЛИ ДРУГИЕ ОТВЕТСТВЕННОСТИ, КАКИЕ-ЛИБО ДЕЙСТВИЯ КОНТРАКТА, ОТЛИЧНЫЕ ИЛИ ДРУГИЕ, ВОЗНИКАЮЩИЕ ИЗ, ВНЕ ИЛИ В СВЯЗИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ИЛИ ДРУГИМИ РАБОТАМИ В ПРОГРАММНОМ ОБЕСПЕЧЕНИИ.</string>\n\n\t<string name=\"status_available\">В сети</string>\n\t<string name=\"status_away\">Отсутствую</string>\n\t<string name=\"status_chat\">Готов поболтать</string>\n\t<string name=\"status_dnd\">Не беспокоить</string>\n\t<string name=\"status_xa\">Недоступен</string>\n\t<string name=\"status_offline\">Отключён</string>\n\n\t<string name=\"translator_credits\">Launchpad Contributions:\n  Alexandr https://launchpad.net/~k.a.a.\n  Drow_Ranger https://launchpad.net/~d3jow9y5j\n  Georg Lukas https://launchpad.net/~ge0rg\n  Ilya https://launchpad.net/~me-detected\n  Paul F. https://launchpad.net/~ultimius\n  Sergey Ponomarev https://launchpad.net/~stokito\n  Xiong Sung https://launchpad.net/~xiongsung\n  snm https://launchpad.net/~zastava-boty\n  Кощеев https://launchpad.net/~kashcheyeu\n  Кощеев https://launchpad.net/~zowenko</string>\n\n\t<!-- default roster group with no name -->\n\t<string name=\"default_group\">Общие</string>\n\t<string name=\"all_contacts_group\">Все контакты</string>\n\t<string name=\"muc_group\">Конференции</string>\n\n\t<!-- SEND listener popup -->\n\t<string name=\"chooseContact\">Выберите контакт</string>\n\t<string name=\"action_settings\">Настройки</string>\n\n\t<!-- MUC strings -->\n\t<string name=\"muc_jid_hint\">JID конференции</string>\n\t<string name=\"muc_nickname_hint\">Никнейм</string>\n\t<string name=\"muc_password_hint\">Пароль (опционально)</string>\n\t<string name=\"title_activity_muc_invite\">Приглашение в конференцию</string>\n\t<!-- Groupchat invitation: \"Invitation from {contact name}\" -->\n\t<string name=\"muc_invitation_from\">Приглашение от %s</string>\n\t<!-- Groupchat info: {description} ({number} participants) -->\n\t<string name=\"muc_invitation_occupants\">%1$s (%2$d участников)</string>\n\t<!-- Notification button: \"Join as {default nickname}\" (make SHORT string) -->\n\t<string name=\"muc_invitation_join\">Присоединиться как %s</string>\n\t<string name=\"muc_synchronizing\">Синхронизация…</string>\n\t<!-- Title of user list, contains JID -->\n\t<string name=\"chat_muc_userlist\">Участники конференции (%s)</string>\n\t<!-- Kicked from groupchat: \"Kicked: {reason} -->\n\t<string name=\"muc_kicked\">Выгнан: %s</string>\n\t<!-- Kicked from groupchat: \"Kicked by {admin name}: {reason} -->\n\t<string name=\"muc_kicked_by\">Выгнан %1$s: %2$s</string>\n\t<!-- Banned from groupchat: \"Banned: {reason} -->\n\t<string name=\"muc_banned\">Забанен: %s</string>\n\t<!-- Banned from groupchat: \"Banned by {admin name}: {reason} -->\n\t<string name=\"muc_banned_by\">Забанен %1$s: %2$s</string>\n\n\t<!-- File upload -->\n\t<string name=\"roster_contextmenu_send\">Отправка...</string>\n\t<string name=\"roster_contextmenu_take_image\">Камера</string>\n\t<string name=\"roster_contextmenu_send_image\">Выбрать фото</string>\n\t<string name=\"roster_contextmenu_send_file\">Отправить файл</string>\n\t<string name=\"upload_compress\">Сжатие...</string>\n\t<string name=\"upload_uploading\">Загрузка...</string>\n\t<string name=\"upload_too_large\">Слишком большой файл!</string>\n\t<string name=\"storage_permission\">%s нужен доступ к хранилищу для отправки файлов!</string>\n\t<string name=\"notification_permission_denied\">Notifications are disabled in the Android app preferences.</string>\n\n\t<!-- Search -->\n\t<string name=\"search_msg_hint\">Cодержимое сообщения</string>\n\n\t<!-- MUC bookmarks -->\n\t<string name=\"group_bookmarks\">Мои групповые чаты</string>\n\t<string name=\"group_mucsearch\">Публичные групповые чаты</string>\n\t<!-- Service Discovery -->\n\t<string name=\"title_service_disco\">Просмотр: %s</string>\n\n\t<!-- Android 9 notification preferences: permanent notification -->\n\t<string name=\"notification_status\">Служба на переднем плане</string>\n\t<!-- Android 9 notification preferences: message notifications -->\n\t<string name=\"notification_msg\">Сообщения</string>\n\n</resources>\n"
  },
  {
    "path": "res/values-sk/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"app_name\">yaxim</string>\n\t<string name=\"app_name_bruno\">Bruno</string>\n\n\t<!-- Connection state -->\n\t<string name=\"conn_title\">yaxim: %s</string>\n\t<string name=\"conn_title_bruno\">Bruno: %s</string>\n\t<string name=\"conn_connecting\">Pripájanie k serveru...</string>\n\t<string name=\"conn_disconnecting\">Odpájanie...</string>\n\t<string name=\"conn_online\">Pripojené</string>\n\t<string name=\"conn_offline\">Odpojené</string>\n\t<string name=\"conn_empty_roster\">Žiadne kontakty na zobrazenie!</string>\n\t<string name=\"conn_empty_roster_hints\">There are many ways to add contacts:\\n\\n\n\t\t- Android Beam™: touch a friend\\'s phone\\n\\n\n\t\t- Scan a QR code\\n\\n\n\t\t- \\\"Create invitation\\\" and share it (e-mail, SMS, QR code, …)\\n\\n\n\t\t- \\\"Add contact\\\" if you know the JID</string>\n\t<string name=\"conn_reconnect\">Pokus o ďalšie pripojenie o %d sekúnd.</string>\n\t<string name=\"conn_disconnected\">Spojenie ukončené</string>\n\t<string name=\"conn_no_network\">Bez sieťového pripojenia</string>\n\t<string name=\"conn_ping_timeout\">No response</string>\n\t<string name=\"conn_error\">Error: %s</string>\n\n\t<!-- Global Strings -->\n\t<string name=\"Global_Exit\">Ukončiť</string>\n\t<string name=\"Global_authenticate_first\">Prosím, najprv sa pripojte</string>\n\t<string name=\"Global_JID_hint\">user@yax.im</string>\n\t<!-- tooltip message when the user entered an invalid XMPP address -->\n\t<string name=\"Global_JID_malformed\">Overte formát adresy!</string>\n\n\t<!-- FirstStartUpDialog -->\n\t<string name=\"StartupDialog_Title\">Vitajte v yaxim!</string>\n\t<string name=\"StartupDialog_Summary\">Pred používaním musíte yaxim nastaviť. Prosím, zadajte vaše Jabber ID a heslo.</string>\n\t<string name=\"StartupDialog_pwHint\">Zadajte heslo</string>\n\t<string name=\"StartupDialog_pwshowHint\">Show password</string>\n\t<string name=\"StartupDialog_Username_title\">Jabber ID:</string>\n\t<string name=\"StartupDialog_passwd_title\">Heslo:</string>\n\t<string name=\"StartupDialog_advanced\">Pokročilé...</string>\n\t<string name=\"StartupDialog_create_new\">Zaregistrovať nový účet</string>\n\t<string name=\"StartupDialog_error_password\">Password is too short!</string>\n\t<string name=\"StartupDialog_created_password\">Created secure password</string>\n\t<string name=\"StartupDialog_auth_failed\">Please check your username and password!</string>\n\t<string name=\"StartupDialog_server_failed\">Could not connect to %s!</string>\n\t<string name=\"StartupDialog_no_registration\">Server does not allow registration!</string>\n\n\t<string name=\"StartupDialog_invitation\">You have been invited to Jabber. Please complete your registration.</string>\n\t<string name=\"StartupDialog_no_more_accounts\">No additional account supported!</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_message\">Správa od %s</string>\n\t<string name=\"notification_anonymous_message\">Prijatá správa</string>\n\t<!--  Group Chat notification, %1$s is the user name, %2$s is the room, e.g. \"{Ge0rG} in {yaxim Chat}\" -->\n\t<string name=\"notification_muc_message\">%1$s in %2$s</string>\n\t<!--  Group Group Chat private message notification, %1$s is the user name, %2$s is the room, e.g. \"Message from {Ge0rG} in {yaxim Chat}\" -->\n\t<!--string name=\"notification_muc_pm\">Message from %1$s in %2$s</string-->\n\t<!-- notification button: direct reply (make SHORT string) -->\n\t<string name=\"notification_reply\">Reply</string>\n\t<!-- notification button: mark as read (make SHORT string) -->\n\t<string name=\"notification_mark_read\">Mark Read</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_error\">Chyba počas odosielania správy!</string>\n\n\t<!-- Notification Settings -->\n\t<string name=\"preftitle_notify\">Notification Settings</string>\n\t<string name=\"preftitle_notify_msg\">Upozornenie na správu</string>\n\t<string name=\"preftitle_notify_muc\">Group Chat Notification</string>\n\t<string name=\"notification_custom\">Custom Ringtone</string>\n\t<string name=\"muc_highlight_title\">Only notify on mention</string>\n\t<string name=\"muc_highlight_sum\">Notify when your nickname is mentioned in a room</string>\n\t<string name=\"led_title\">Blikanie LED</string>\n\t<string name=\"led_summ\">Blikanie LED pri prijatí správy</string>\n\t<string name=\"vibr_title\">Vibrovanie</string>\n\t<string name=\"vibr_summ\">Vibrovať pri prijatí správy</string>\n\t<string-array name=\"vibr_values_displayed\">\n\t\t<item>Nikdy</item>\n\t\t<item>Systémové nastavenia</item>\n\t\t<item>Vždy</item>\n\t</string-array>\n\t<string name=\"ringtone_title\">Zvonenie</string>\n\t<string name=\"ringtone_summ\">Zvuk pre prichádzajúce správy</string>\n\t<string name=\"ticker_title\">Zobrazenie správy</string>\n\t<string name=\"ticker_summ\">Zobraziť odosielateľa a správu v stavovom riadku</string>\n\n\t<!-- Startup Setting Strings -->\n\t<string name=\"preftitle_general\">General Settings</string>\n\t<string name=\"pref_dnd_when_silent\">\\\"Do not disturb\\\" in silent mode</string>\n\t<string name=\"pref_dnd_when_silent_summ\">Set your online status to \\\"DND\\\" when your phone is in silent mode</string>\n\t<string name=\"statuspopup_name\">Nastavenie statusu</string>\n\t<string name=\"showOffline_summ\">Vždy zobraziť všetky kontakty v zozname</string>\n\t<string name=\"showOffline_title\">Zobraziť odpojené kontakty</string>\n\t<string name=\"enableGroups_summ\">Usporiadanie kontaktov do skupín</string>\n\t<string name=\"enableGroups_title\">Zobraziť skupiny kontaktov</string>\n\t<string name=\"foregroundService_summ\">Keep app in memory to ensure always-on connection (foreground service)</string>\n\t<string name=\"foregroundService_title\">Ikona v stavovom riadku</string>\n\n\t<string name=\"preftitle_debug\">Ladenie</string>\n\t<string name=\"smackdebug_summ\">Packet and debug output via logcat (may contain personal information)</string>\n\t<string name=\"smackdebug_title\">SMACK debugging</string>\n\n\t<string name=\"reportcrash_title\">Odoslať správu o zlyhaní</string>\n\t<string name=\"reportcrash_summ\">Odoslať anonymnú správu o zlyhaní vývojárom</string>\n\n\t<!-- Appearence Strings -->\n\t<string name=\"preftitle_app\">Vzhľad</string>\n\t<string name=\"FontChat_title\">Veľkosť písma chatu</string>\n\t<string name=\"FontChat_summ\">Nastaviť veľkosť písma chatu</string>\n\t<string name=\"FontChat_dialog\">Veľkosť písma chatu</string>\n\t<!--\n\t<string name=\"FontRost_title\">Roster font size</string>\n\t<string name=\"FontRost_summ\">Set roster font size</string>\n\t<string name=\"FontRost_dialog\">Roster font fize</string>\n\t<string name=\"setFontRoster\">Set roster font size</string>\n\t-->\n\t<string name=\"pref_theme\">Téma vzhľadu</string>\n\t<string name=\"pref_theme_dark\">Tmavá</string>\n\t<string name=\"pref_theme_light\">Svetlá</string>\n\t<string name=\"pref_theme_pine\">Pine</string>\n\t<string name=\"pref_theme_ice\">Ice</string>\n\t<string name=\"preftitle_ui\">Vzhľad</string>\n\t<string-array name=\"fontSizesChat\">\n\t\t<item>malé</item>\n\t\t<item>normálne</item>\n\t\t<item>veľké</item>\n\t\t<item>obrovské</item>\n\t</string-array>\n\n\t<!-- Mainmenu \t-->\n\t<string name=\"Menu_addFriend\">Add contact</string>\n\t<string name=\"Menu_addClipboard\">Add %s</string>\n\t<string name=\"Menu_ShowOff\">Show offline</string>\n\t<string name=\"Menu_HideOff\">Hide offline</string>\n\t<string name=\"Menu_AccSettings\">Edit account</string>\n\t<string name=\"Menu_Settings\">Nastavenia</string>\n\t<string name=\"Menu_Status\">Status</string>\n\t<string name=\"Menu_connect\">Pripojiť</string>\n\t<string name=\"Menu_disconnect\">Odpojiť</string>\n\t<string name=\"Menu_about\">O aplikácii yaxim</string>\n\t<string name=\"Menu_about_bruno\">About Bruno</string>\n\t<string name=\"Menu_muc\">Add / browse…</string>\n\t<string name=\"Menu_matrix\">Enter the Matrix…</string>\n\t<string name=\"Menu_mark_all_as_read\">Mark all as read</string>\n\t<string name=\"Menu_send_invitation\">Create invitation</string>\n    <string name=\"Menu_userlist\">Participants</string>\n\n\n\t<!-- AddFriend -->\n\t<string name=\"addFriend_Title\">Pridať kontakt</string>\n\t<string name=\"addFriend_Summ\">Prosím, zadajte Jabber ID vášho priateľa, jeho meno a vyberte skupinu kontaktov</string>\n\t<string name=\"addFriend_aliasHint\">Zobrazené meno</string>\n\t<string name=\"addrosteritemaddgroupchoice\">Pridať do novej skupiny</string>\n\t<string name=\"NewGroup_EditTextField_Hint\">Názov novej skupiny</string>\n\n\t<!-- Roster CONTEXTMENU -->\n\t<string name=\"roster_contextmenu_group_rename\">Premenovať skupinu</string>\n\t<string name=\"roster_contextmenu_contact_mark_as_read\">Označiť ako prečítané</string>\n\t<string name=\"roster_contextmenu_contact_delete\">Delete contact</string>\n\t<string name=\"roster_contextmenu_contact_delmsg\">Delete chat history</string>\n\t<string name=\"roster_contextmenu_contact_rename\">Premenovať</string>\n\t<string name=\"roster_contextmenu_contact_request_auth\">Request authorization</string>\n\t<string name=\"roster_contextmenu_contact_change_group\">Zmeniť skupinu</string>\n\t<string name=\"roster_contextmenu_contact_share\">Share address</string>\n\t<string name=\"roster_contextmenu_contact_ringtone\">Zvonenie</string>\n\t<string name=\"roster_contextmenu_muc_edit\">Edit group chat</string>\n\t<string name=\"roster_contextmenu_muc_leave\">Leave group chat</string>\n\t<string name=\"muc_leave_question\">Really leave %s?</string>\n\n\t<!-- Accountprefs -->\n\t<string name=\"account_settings_login\">Prihlasovacie informácie</string>\n\t<string name=\"account_settings_title\">Nastavenia účtu</string>\n\t<string name=\"account_options_title\">Nastavenie pripojenia</string>\n\t<string name=\"account_options_advanced\">Rozšírené nastavenia</string>\n\t<string name=\"carbons_title\">Message Carbons (XEP-0280)</string>\n\t<string name=\"carbons_summ\">Request message copies from your other client(s)</string>\n\t<string name=\"account_jabberID_title\">Jabber ID</string>\n\t<string name=\"account_jabberID_sum\">príklad: ja@jabber.example.com</string>\n\t<string name=\"account_jabberID_dialog_title\">Zadajte vaše Jabber ID</string>\n\t<string name=\"account_jabberPW_title\">Heslo</string>\n\t<string name=\"account_jabberPW_sum\">Vaše heslo k Jabber účtu</string>\n\t<string name=\"account_jabberPW_change_on_server\">Zmeniť heslo na serveri</string>\n\t<string name=\"account_jabberPW_password_old\">Staré heslo:</string>\n\t<string name=\"account_jabberPW_password_new\">Nové heslo:</string>\n\t<string name=\"account_jabberPW_warning\">Varovanie! Pre úspešné prihlásenie musíte zadať rovnaké heslo na serveri kde máte Jabber účet!</string>\n\t<string name=\"account_jabberPW_progress\">Prosím čakajte, mení sa heslo...</string>\n\t<string name=\"account_jabberPW_finished\">Heslo bolo úspešne zmenené.</string>\n\t<string name=\"account_jabberPW_error\">Chyba pri zmene hesla: %s</string>\n\t<string name=\"account_nickname_title\">Display Name</string>\n\t<string name=\"account_nickname_summ\">Your nickname displayed to other users</string>\n\t\n\t<!-- accountprefs -->\n\t<string name=\"account_resource_title\">Client Resource</string>\n\t<string name=\"account_resource_summ\">Štandardné: yaxim</string>\n\t<string name=\"account_resource_dialog_title\">Enter your resource:</string>\n\t<string name=\"account_resource_hint\">yaxim</string>\n\t<string name=\"account_prio_title\">Client Priority</string>\n\t<string name=\"account_prio_summ\">Základné: 0 (allowed: -128 .. 127)</string>\n\t<string name=\"account_prio_error\">Povolené hodnoty: -128 .. 127</string>\n\t<string name=\"account_prio_dialog_title\">Enter your priority:</string>\n\t<string name=\"account_port_title\">Port servera</string>\n\t<string name=\"account_port_sum\">Štandardný: 5222</string>\n\t<string name=\"account_port_dialog_title\">Zadajte port servera:</string>\n\t<string name=\"account_port_hint\">5222</string>\n\t<string name=\"account_customserver_title\">Iný server</string>\n\t<string name=\"account_customserver_summ\">(Voliteľné) alternatívny server hostname</string>\n\t<string name=\"account_customserver_dialog_title\">Zadajte hostname</string>\n\t<string name=\"account_customserver_hint\">host.example.com</string>\n\t<string name=\"require_ssl_title\">Vyžadovať SSL/TLS</string>\n\t<string name=\"require_ssl_summ\">Vždy šifrovať pripojenie na server</string>\n\n\t<!--StatusPopUp-->\n\t<string name=\"AddContact_SpinnerPrompt\">Vybrať skupinu</string>\n\t<string name=\"setStatusmsgHint\">Váš status</string>\n\t<string name=\"setStatusTitle\">Nastavenie statusu</string>\n\t<string name=\"RenameGroup_summ\">Premenovať skupinu %s na:</string>\n\t<string name=\"RenameGroup_title\">Premenovať skupinu</string>\n\t<string name=\"RenameEntry_summ\">Premenovať %1$s (%2$s) na:</string>\n\t<string name=\"RenameEntry_title\">Premenovať kontakt</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_summ\">Vyberte skupinu z nižšie uvedených</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_title\">Zmeniť skupinu</string>\n\t<string name=\"deleteRosterItem_text\">Naozaj odstrániť %1$s (%2$s)?</string>\n\t<string name=\"deleteRosterItem_title\">Vymazať kontakt</string>\n\t<string name=\"deleteChatHistory_text\">Naozaj odstrániť všetky správy s %1$s (%2$s)?</string>\n\t<string name=\"deleteChatHistory_title\">Vymazať históriu chatu</string>\n\t<string name=\"subscriptionRequest_text\">%1$s si vás chce pridať ako kontakt: \\\"%2$s\\\"</string>\n\t<string name=\"subscriptionRequest_title\">Požiadavka o zapísanie</string>\n\t<string name=\"subscription_accept\">Accept</string>\n\t<string name=\"subscription_reject\">Reject</string>\n\t<string name=\"subscription_reject_all\">Reject all</string>\n\t<string name=\"subscription_status_from\">can see your status</string>\n\n\t<!-- CHATWINDOW -->\n\t<string name=\"chat_from_me\">Ja:</string>\n\t<string name=\"toast_stored_offline\">Správa bola uložená na odoslanie</string>\n\t<string name=\"chat_enterMsgHint\">Napíšte správu</string> \n\n\t<!-- Message context menu; use the verb form (to quote) -->\n\t<string name=\"chatmenu_quote\">Quote</string>\n\t<!-- Message context menu: repeat the same message -->\n\t<string name=\"chatmenu_resend\">Edit message</string>\n\n\t<!-- GPS settings -->\n\t<!--\n\t<string name=\"showGPS_title\">GPS to status</string>\n\t<string name=\"showGPS_summ_on\">GPS is send to StatusMessage</string>\n\t<string name=\"showGPS_summ_off\">GPS is send to StatusMessage</string>\n\t-->\n\n\t<!-- About Dialog -->\n\t<string name=\"AboutDialog_title\">O aplikácii yaxim</string>\n\t<string name=\"AboutDialog_DevelopersTitle\">Vývojári</string>\n\t<!-- Contact the developer button -->\n\t<string name=\"AboutDialog_DevelopersText\">Contact</string>\n\t<string name=\"AboutDialog_LicenceTitle\">Licencia</string>\n\t<string name=\"AboutDialog_Vote\">Rate app</string>\n\t<string name=\"AboutDialog_LicenceText\">\n\t\tThis program is free software; you can redistribute\n\t\tit and/or\n\t\tmodify it under the terms of the GNU General Public License\n\t\tversion 2\n\t\tas published by the Free Software Foundation.\n\t\tLink:\n\t\thttp://www.gnu.org/licenses/gpl-2.0.html\\n\n\t\t\\n\n\t\tParts of this software are\n\t\tprovided under the MIT License:\\n\n\t\t\\n\n\t\tCopyright © 2009 Mads\n\t\tKristiansen, Nullwire ApS\\n\n\t\t\\n\n\t\tPermission is hereby granted, free of\n\t\tcharge, to any person obtaining\n\t\ta copy\n\t\tof this software and associated\n\t\tdocumentation files (the\n\t\t\"Software\"), to deal\n\t\tin the Software without\n\t\trestriction, including\n\t\twithout limitation the rights\n\t\tto use, copy,\n\t\tmodify, merge, publish,\n\t\tdistribute, sublicense, and/or sell\n\t\tcopies of\n\t\tthe Software, and to\n\t\tpermit persons to whom the Software is\n\t\tfurnished to\n\t\tdo so, subject to\n\t\tthe following conditions:\n\t\t\\n\n\t\tThe above copyright notice\n\t\tand this permission notice shall be\n\t\tincluded in all\n\t\tcopies or\n\t\tsubstantial portions of the Software.\n\t\t\\n\n\t\tTHE SOFTWARE IS PROVIDED \"AS\n\t\tIS\", WITHOUT WARRANTY OF ANY KIND,\n\t\tEXPRESS OR\n\t\tIMPLIED, INCLUDING BUT NOT\n\t\tLIMITED TO THE WARRANTIES OF\n\t\tMERCHANTABILITY,\n\t\tFITNESS FOR A PARTICULAR\n\t\tPURPOSE AND NONINFRINGEMENT.\n\t\tIN NO EVENT SHALL THE\n\t\tAUTHORS OR COPYRIGHT\n\t\tHOLDERS BE LIABLE FOR ANY\n\t\tCLAIM, DAMAGES OR OTHER\n\t\tLIABILITY, WHETHER IN\n\t\tAN ACTION OF CONTRACT,\n\t\tTORT OR OTHERWISE, ARISING FROM,\n\t\tOUT OF OR IN\n\t\tCONNECTION WITH THE\n\t\tSOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n\t\tSOFTWARE.\n    </string>\n\n\t<string name=\"status_available\">Pripojené</string>\n\t<string name=\"status_away\">Preč</string>\n\t<string name=\"status_chat\">Pripravený na chat</string>\n\t<string name=\"status_dnd\">Nerušiť</string>\n\t<string name=\"status_xa\">Nedostupný</string>\n\t<string name=\"status_offline\">Odpojené</string>\n\n\t<string name=\"translator_credits\">Launchpad Contributions:\n  Linuxfan https://launchpad.net/~linuxfan-timo</string>\n\n\t<!-- default roster group with no name -->\n\t<string name=\"default_group\">Všeobecné</string>\n\t<string name=\"all_contacts_group\">Všetky kontakty</string>\n\t<string name=\"muc_group\">Group Chats</string>\n\n\t<!-- SEND listener popup -->\n\t<string name=\"chooseContact\">Vybrať kontakt</string>\n\t<string name=\"action_settings\">Nastavenia</string>\n\n\t<!-- MUC strings -->\n\t<string name=\"muc_jid_hint\">Group chat JID</string>\n\t<string name=\"muc_nickname_hint\">Nickname</string>\n\t<string name=\"muc_password_hint\">Password (optional)</string>\n\t<string name=\"title_activity_muc_invite\">Group Chat Invitation</string>\n\t<!-- Groupchat invitation: \"Invitation from {contact name}\" -->\n\t<string name=\"muc_invitation_from\">Invitation from %s</string>\n\t<!-- Groupchat info: {description} ({number} participants) -->\n\t<string name=\"muc_invitation_occupants\">%1$s (%2$d participants)</string>\n\t<!-- Notification button: \"Join as {default nickname}\" (make SHORT string) -->\n\t<string name=\"muc_invitation_join\">Join as %s</string>\n\t<string name=\"muc_synchronizing\">Synchronizing…</string>\n\t<!-- Title of user list, contains JID -->\n\t<string name=\"chat_muc_userlist\">Group Chat Participants (%s)</string>\n\t<!-- Kicked from groupchat: \"Kicked: {reason} -->\n\t<string name=\"muc_kicked\">Kicked: %s</string>\n\t<!-- Kicked from groupchat: \"Kicked by {admin name}: {reason} -->\n\t<string name=\"muc_kicked_by\">Kicked by %1$s: %2$s</string>\n\t<!-- Banned from groupchat: \"Banned: {reason} -->\n\t<string name=\"muc_banned\">Banned: %s</string>\n\t<!-- Banned from groupchat: \"Banned by {admin name}: {reason} -->\n\t<string name=\"muc_banned_by\">Banned by %1$s: %2$s</string>\n\n\t<!-- File upload -->\n\t<string name=\"roster_contextmenu_send\">Send…</string>\n\t<string name=\"roster_contextmenu_take_image\">Take picture</string>\n\t<string name=\"roster_contextmenu_send_image\">Choose picture</string>\n\t<string name=\"roster_contextmenu_send_file\">Send file</string>\n\t<string name=\"upload_compress\">Compressing picture…</string>\n\t<string name=\"upload_uploading\">Uploading…</string>\n\t<string name=\"upload_too_large\">file too large!</string>\n\t<string name=\"storage_permission\">%s needs storage access to send files!</string>\n\t<string name=\"notification_permission_denied\">Notifications are disabled in the Android app preferences.</string>\n\n\t<!-- Search -->\n\t<string name=\"search_msg_hint\">Message content</string>\n\n\t<!-- MUC bookmarks -->\n\t<string name=\"group_bookmarks\">My group chats</string>\n\t<string name=\"group_mucsearch\">Public group chats</string>\n\t<!-- Service Discovery -->\n\t<string name=\"title_service_disco\">Browser: %s</string>\n\n\t<!-- Android 9 notification preferences: permanent notification -->\n\t<string name=\"notification_status\">Foreground service</string>\n\t<!-- Android 9 notification preferences: message notifications -->\n\t<string name=\"notification_msg\">Messages</string>\n\n</resources>\n"
  },
  {
    "path": "res/values-sr/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"app_name\">yaxim</string>\n\t<string name=\"app_name_bruno\">Bruno</string>\n\n\t<!-- Connection state -->\n\t<string name=\"conn_title\">yaxim: %s</string>\n\t<string name=\"conn_title_bruno\">Bruno: %s</string>\n\t<string name=\"conn_connecting\">Connecting to server…</string>\n\t<string name=\"conn_disconnecting\">Disconnecting…</string>\n\t<string name=\"conn_online\">На мрежи</string>\n\t<string name=\"conn_offline\">Ван мреже</string>\n\t<string name=\"conn_empty_roster\">No contacts to show!</string>\n\t<string name=\"conn_empty_roster_hints\">There are many ways to add contacts:\\n\\n\n\t\t- Android Beam™: touch a friend\\'s phone\\n\\n\n\t\t- Scan a QR code\\n\\n\n\t\t- \\\"Create invitation\\\" and share it (e-mail, SMS, QR code, …)\\n\\n\n\t\t- \\\"Add contact\\\" if you know the JID</string>\n\t<string name=\"conn_reconnect\">Next connection attempt in %d seconds.</string>\n\t<string name=\"conn_disconnected\">Веза је затворена.</string>\n\t<string name=\"conn_no_network\">Нема мрежне везе</string>\n\t<string name=\"conn_ping_timeout\">No response</string>\n\t<string name=\"conn_error\">Error: %s</string>\n\n\t<!-- Global Strings -->\n\t<string name=\"Global_Exit\">Изађи</string>\n\t<string name=\"Global_authenticate_first\">Please connect first</string>\n\t<string name=\"Global_JID_hint\">korisnik@yax.im</string>\n\t<!-- tooltip message when the user entered an invalid XMPP address -->\n\t<string name=\"Global_JID_malformed\">Check address format!</string>\n\n\t<!-- FirstStartUpDialog -->\n\t<string name=\"StartupDialog_Title\">Welcome to yaxim!</string>\n\t<string name=\"StartupDialog_Summary\">You need to configure yaxim before you can use it. Please enter your Jabber ID and password.</string>\n\t<string name=\"StartupDialog_pwHint\">Упишите лозинку</string>\n\t<string name=\"StartupDialog_pwshowHint\">Show password</string>\n\t<string name=\"StartupDialog_Username_title\">Џабер ИД:</string>\n\t<string name=\"StartupDialog_passwd_title\">Лозинка:</string>\n\t<string name=\"StartupDialog_advanced\">Advanced…</string>\n\t<string name=\"StartupDialog_create_new\">Register new account</string>\n\t<string name=\"StartupDialog_error_password\">Password is too short!</string>\n\t<string name=\"StartupDialog_created_password\">Created secure password</string>\n\t<string name=\"StartupDialog_auth_failed\">Please check your username and password!</string>\n\t<string name=\"StartupDialog_server_failed\">Could not connect to %s!</string>\n\t<string name=\"StartupDialog_no_registration\">Server does not allow registration!</string>\n\n\t<string name=\"StartupDialog_invitation\">You have been invited to Jabber. Please complete your registration.</string>\n\t<string name=\"StartupDialog_no_more_accounts\">No additional account supported!</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_message\">Message from %s</string>\n\t<string name=\"notification_anonymous_message\">Message received</string>\n\t<!--  Group Chat notification, %1$s is the user name, %2$s is the room, e.g. \"{Ge0rG} in {yaxim Chat}\" -->\n\t<string name=\"notification_muc_message\">%1$s in %2$s</string>\n\t<!--  Group Group Chat private message notification, %1$s is the user name, %2$s is the room, e.g. \"Message from {Ge0rG} in {yaxim Chat}\" -->\n\t<!--string name=\"notification_muc_pm\">Message from %1$s in %2$s</string-->\n\t<!-- notification button: direct reply (make SHORT string) -->\n\t<string name=\"notification_reply\">Reply</string>\n\t<!-- notification button: mark as read (make SHORT string) -->\n\t<string name=\"notification_mark_read\">Mark Read</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_error\">Error while sending message!</string>\n\n\t<!-- Notification Settings -->\n\t<string name=\"preftitle_notify\">Notification Settings</string>\n\t<string name=\"preftitle_notify_msg\">Message Notification</string>\n\t<string name=\"preftitle_notify_muc\">Group Chat Notification</string>\n\t<string name=\"notification_custom\">Custom Ringtone</string>\n\t<string name=\"muc_highlight_title\">Only notify on mention</string>\n\t<string name=\"muc_highlight_sum\">Notify when your nickname is mentioned in a room</string>\n\t<string name=\"led_title\">Blinking LED</string>\n\t<string name=\"led_summ\">Blink phone LED on incoming messages</string>\n\t<string name=\"vibr_title\">Vibration</string>\n\t<string name=\"vibr_summ\">Vibrate on incoming messages</string>\n\t<string-array name=\"vibr_values_displayed\">\n\t\t<item>Never</item>\n\t\t<item>System preference</item>\n\t\t<item>Always</item>\n\t</string-array>\n\t<string name=\"ringtone_title\">Ringtone</string>\n\t<string name=\"ringtone_summ\">Tone for incoming messages</string>\n\t<string name=\"ticker_title\">Message preview</string>\n\t<string name=\"ticker_summ\">Show sender and message in status bar</string>\n\n\t<!-- Startup Setting Strings -->\n\t<string name=\"preftitle_general\">General Settings</string>\n\t<string name=\"pref_dnd_when_silent\">\\\"Do not disturb\\\" in silent mode</string>\n\t<string name=\"pref_dnd_when_silent_summ\">Set your online status to \\\"DND\\\" when your phone is in silent mode</string>\n\t<string name=\"statuspopup_name\">Set your status</string>\n\t<string name=\"showOffline_summ\">Always show all contacts in the roster</string>\n\t<string name=\"showOffline_title\">Show offline contacts</string>\n\t<string name=\"enableGroups_summ\">Arrange your contacts by their groups</string>\n\t<string name=\"enableGroups_title\">Show contact groups</string>\n\t<string name=\"foregroundService_summ\">Keep app in memory to ensure always-on connection (foreground service)</string>\n\t<string name=\"foregroundService_title\">Statusbar icon</string>\n\n\t<string name=\"preftitle_debug\">Debugging</string>\n\t<string name=\"smackdebug_summ\">Packet and debug output via logcat (may contain personal information)</string>\n\t<string name=\"smackdebug_title\">SMACK debugging</string>\n\n\t<string name=\"reportcrash_title\">Send crash reports</string>\n\t<string name=\"reportcrash_summ\">Send anonymous crash reports to developer</string>\n\n\t<!-- Appearence Strings -->\n\t<string name=\"preftitle_app\">Appearance</string>\n\t<string name=\"FontChat_title\">Chat font size</string>\n\t<string name=\"FontChat_summ\">Set chat font size</string>\n\t<string name=\"FontChat_dialog\">Chat font size</string>\n\t<!--\n\t<string name=\"FontRost_title\">Roster font size</string>\n\t<string name=\"FontRost_summ\">Set roster font size</string>\n\t<string name=\"FontRost_dialog\">Roster font fize</string>\n\t<string name=\"setFontRoster\">Set roster font size</string>\n\t-->\n\t<string name=\"pref_theme\">Theme</string>\n\t<string name=\"pref_theme_dark\">Dark</string>\n\t<string name=\"pref_theme_light\">Light</string>\n\t<string name=\"pref_theme_pine\">Pine</string>\n\t<string name=\"pref_theme_ice\">Ice</string>\n\t<string name=\"preftitle_ui\">Appearance</string>\n\t<string-array name=\"fontSizesChat\">\n\t\t<item>small</item>\n\t\t<item>normal</item>\n\t\t<item>large</item>\n\t\t<item>huge</item>\n\t</string-array>\n\n\t<!-- Mainmenu \t-->\n\t<string name=\"Menu_addFriend\">Add contact</string>\n\t<string name=\"Menu_addClipboard\">Add %s</string>\n\t<string name=\"Menu_ShowOff\">Show offline</string>\n\t<string name=\"Menu_HideOff\">Hide offline</string>\n\t<string name=\"Menu_AccSettings\">Edit account</string>\n\t<string name=\"Menu_Settings\">Settings</string>\n\t<string name=\"Menu_Status\">Status</string>\n\t<string name=\"Menu_connect\">Connect</string>\n\t<string name=\"Menu_disconnect\">Disconnect</string>\n\t<string name=\"Menu_about\">About yaxim</string>\n\t<string name=\"Menu_about_bruno\">About Bruno</string>\n\t<string name=\"Menu_muc\">Add / browse…</string>\n\t<string name=\"Menu_matrix\">Enter the Matrix…</string>\n\t<string name=\"Menu_mark_all_as_read\">Mark all as read</string>\n\t<string name=\"Menu_send_invitation\">Create invitation</string>\n    <string name=\"Menu_userlist\">Participants</string>\n\n\n\t<!-- AddFriend -->\n\t<string name=\"addFriend_Title\">Add a Contact</string>\n\t<string name=\"addFriend_Summ\">Please enter the Jabber ID of your friend, the\n\t\tdesired screen name and choose their contact group!</string>\n\t<string name=\"addFriend_aliasHint\">Screen name</string>\n\t<string name=\"addrosteritemaddgroupchoice\">Add to a new group</string>\n\t<string name=\"NewGroup_EditTextField_Hint\">Name for the new group</string>\n\n\t<!-- Roster CONTEXTMENU -->\n\t<string name=\"roster_contextmenu_group_rename\">Rename group</string>\n\t<string name=\"roster_contextmenu_contact_mark_as_read\">Mark as read</string>\n\t<string name=\"roster_contextmenu_contact_delete\">Delete contact</string>\n\t<string name=\"roster_contextmenu_contact_delmsg\">Delete chat history</string>\n\t<string name=\"roster_contextmenu_contact_rename\">Rename</string>\n\t<string name=\"roster_contextmenu_contact_request_auth\">Request authorization</string>\n\t<string name=\"roster_contextmenu_contact_change_group\">Change group</string>\n\t<string name=\"roster_contextmenu_contact_share\">Share address</string>\n\t<string name=\"roster_contextmenu_contact_ringtone\">Ringtone</string>\n\t<string name=\"roster_contextmenu_muc_edit\">Edit group chat</string>\n\t<string name=\"roster_contextmenu_muc_leave\">Leave group chat</string>\n\t<string name=\"muc_leave_question\">Really leave %s?</string>\n\n\t<!-- Accountprefs -->\n\t<string name=\"account_settings_login\">Login Information</string>\n\t<string name=\"account_settings_title\">Account Settings</string>\n\t<string name=\"account_options_title\">Connecting Options</string>\n\t<string name=\"account_options_advanced\">Advanced Options</string>\n\t<string name=\"carbons_title\">Message Carbons (XEP-0280)</string>\n\t<string name=\"carbons_summ\">Request message copies from your other client(s)</string>\n\t<string name=\"account_jabberID_title\">Jabber ID</string>\n\t<string name=\"account_jabberID_sum\">example: me@jabber.example.com</string>\n\t<string name=\"account_jabberID_dialog_title\">Enter your Jabber ID:</string>\n\t<string name=\"account_jabberPW_title\">Account Password</string>\n\t<string name=\"account_jabberPW_sum\">Your Jabber account password</string>\n\t<string name=\"account_jabberPW_change_on_server\">Change password on server</string>\n\t<string name=\"account_jabberPW_password_old\">Old Password:</string>\n\t<string name=\"account_jabberPW_password_new\">New Password:</string>\n\t<string name=\"account_jabberPW_warning\">WARNING! For successful login you must also set the same password on the server!</string>\n\t<string name=\"account_jabberPW_progress\">Please wait, changing password…</string>\n\t<string name=\"account_jabberPW_finished\">Password successfully changed.</string>\n\t<string name=\"account_jabberPW_error\">Error changing password: %s</string>\n\t<string name=\"account_nickname_title\">Display Name</string>\n\t<string name=\"account_nickname_summ\">Your nickname displayed to other users</string>\n\t\n\t<!-- accountprefs -->\n\t<string name=\"account_resource_title\">Client Resource</string>\n\t<string name=\"account_resource_summ\">Default: yaxim</string>\n\t<string name=\"account_resource_dialog_title\">Enter your resource:</string>\n\t<string name=\"account_resource_hint\">yaxim</string>\n\t<string name=\"account_prio_title\">Client Priority</string>\n\t<string name=\"account_prio_summ\">Default: 0 (allowed: -128 .. 127)</string>\n\t<string name=\"account_prio_error\">Allowed values: -128 .. 127</string>\n\t<string name=\"account_prio_dialog_title\">Enter your priority:</string>\n\t<string name=\"account_port_title\">Server Port</string>\n\t<string name=\"account_port_sum\">Default: 5222</string>\n\t<string name=\"account_port_dialog_title\">Enter the server port:</string>\n\t<string name=\"account_port_hint\">5222</string>\n\t<string name=\"account_customserver_title\">Custom Server</string>\n\t<string name=\"account_customserver_summ\">(Optional) alternative server hostname</string>\n\t<string name=\"account_customserver_dialog_title\">Enter server hostname:</string>\n\t<string name=\"account_customserver_hint\">host.example.com</string>\n\t<string name=\"require_ssl_title\">Require SSL/TLS</string>\n\t<string name=\"require_ssl_summ\">Always encrypt server connection</string>\n\n\t<!--StatusPopUp-->\n\t<string name=\"AddContact_SpinnerPrompt\">Choose Group</string>\n\t<string name=\"setStatusmsgHint\">Your status message</string>\n\t<string name=\"setStatusTitle\">Set your status</string>\n\t<string name=\"RenameGroup_summ\">Rename group %s to:</string>\n\t<string name=\"RenameGroup_title\">Rename group</string>\n\t<string name=\"RenameEntry_summ\">Rename %1$s (%2$s) to: </string>\n\t<string name=\"RenameEntry_title\">Rename contact</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_summ\">Select a group from the spinner below</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_title\">Change group</string>\n\t<string name=\"deleteRosterItem_text\">Really remove %1$s (%2$s)?</string>\n\t<string name=\"deleteRosterItem_title\">Delete Contact</string>\n\t<string name=\"deleteChatHistory_text\">Really remove all messages with %1$s (%2$s)?</string>\n\t<string name=\"deleteChatHistory_title\">Delete Chat History</string>\n\t<string name=\"subscriptionRequest_text\">%1$s wants to add you as a contact: \\\"%2$s\\\"</string>\n\t<string name=\"subscriptionRequest_title\">Subscription Request</string>\n\t<string name=\"subscription_accept\">Accept</string>\n\t<string name=\"subscription_reject\">Reject</string>\n\t<string name=\"subscription_reject_all\">Reject all</string>\n\t<string name=\"subscription_status_from\">can see your status</string>\n\n\t<!-- CHATWINDOW -->\n\t<string name=\"chat_from_me\">Me:</string>\n\t<string name=\"toast_stored_offline\">The message has been stored for transmission.</string>\n\t<string name=\"chat_enterMsgHint\">Enter message</string> \n\n\t<!-- Message context menu; use the verb form (to quote) -->\n\t<string name=\"chatmenu_quote\">Quote</string>\n\t<!-- Message context menu: repeat the same message -->\n\t<string name=\"chatmenu_resend\">Edit message</string>\n\n\t<!-- GPS settings -->\n\t<!--\n\t<string name=\"showGPS_title\">GPS to status</string>\n\t<string name=\"showGPS_summ_on\">GPS is send to StatusMessage</string>\n\t<string name=\"showGPS_summ_off\">GPS is send to StatusMessage</string>\n\t-->\n\n\t<!-- About Dialog -->\n\t<string name=\"AboutDialog_title\">About yaxim</string>\n\t<string name=\"AboutDialog_DevelopersTitle\">Developers</string>\n\t<!-- Contact the developer button -->\n\t<string name=\"AboutDialog_DevelopersText\">Contact</string>\n\t<string name=\"AboutDialog_LicenceTitle\">Licensing</string>\n\t<string name=\"AboutDialog_Vote\">Rate app</string>\n\t<string name=\"AboutDialog_LicenceText\">\n\t\tThis program is free software; you can redistribute\n\t\tit and/or\n\t\tmodify it under the terms of the GNU General Public License\n\t\tversion 2\n\t\tas published by the Free Software Foundation.\n\t\tLink:\n\t\thttp://www.gnu.org/licenses/gpl-2.0.html\\n\n\t\t\\n\n\t\tParts of this software are\n\t\tprovided under the MIT License:\\n\n\t\t\\n\n\t\tCopyright © 2009 Mads\n\t\tKristiansen, Nullwire ApS\\n\n\t\t\\n\n\t\tPermission is hereby granted, free of\n\t\tcharge, to any person obtaining\n\t\ta copy\n\t\tof this software and associated\n\t\tdocumentation files (the\n\t\t\"Software\"), to deal\n\t\tin the Software without\n\t\trestriction, including\n\t\twithout limitation the rights\n\t\tto use, copy,\n\t\tmodify, merge, publish,\n\t\tdistribute, sublicense, and/or sell\n\t\tcopies of\n\t\tthe Software, and to\n\t\tpermit persons to whom the Software is\n\t\tfurnished to\n\t\tdo so, subject to\n\t\tthe following conditions:\n\t\t\\n\n\t\tThe above copyright notice\n\t\tand this permission notice shall be\n\t\tincluded in all\n\t\tcopies or\n\t\tsubstantial portions of the Software.\n\t\t\\n\n\t\tTHE SOFTWARE IS PROVIDED \"AS\n\t\tIS\", WITHOUT WARRANTY OF ANY KIND,\n\t\tEXPRESS OR\n\t\tIMPLIED, INCLUDING BUT NOT\n\t\tLIMITED TO THE WARRANTIES OF\n\t\tMERCHANTABILITY,\n\t\tFITNESS FOR A PARTICULAR\n\t\tPURPOSE AND NONINFRINGEMENT.\n\t\tIN NO EVENT SHALL THE\n\t\tAUTHORS OR COPYRIGHT\n\t\tHOLDERS BE LIABLE FOR ANY\n\t\tCLAIM, DAMAGES OR OTHER\n\t\tLIABILITY, WHETHER IN\n\t\tAN ACTION OF CONTRACT,\n\t\tTORT OR OTHERWISE, ARISING FROM,\n\t\tOUT OF OR IN\n\t\tCONNECTION WITH THE\n\t\tSOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n\t\tSOFTWARE.\n    </string>\n\n\t<string name=\"status_available\">На мрежи</string>\n\t<string name=\"status_away\">Away</string>\n\t<string name=\"status_chat\">Free for chat</string>\n\t<string name=\"status_dnd\">Do not disturb</string>\n\t<string name=\"status_xa\">Not available</string>\n\t<string name=\"status_offline\">Ван мреже</string>\n\n\t<string name=\"translator_credits\">Launchpad Contributions:\n  Мирослав Николић https://launchpad.net/~lipek</string>\n\n\t<!-- default roster group with no name -->\n\t<string name=\"default_group\">General</string>\n\t<string name=\"all_contacts_group\">All contacts</string>\n\t<string name=\"muc_group\">Group Chats</string>\n\n\t<!-- SEND listener popup -->\n\t<string name=\"chooseContact\">Choose contact</string>\n\t<string name=\"action_settings\">Settings</string>\n\n\t<!-- MUC strings -->\n\t<string name=\"muc_jid_hint\">Group chat JID</string>\n\t<string name=\"muc_nickname_hint\">Nickname</string>\n\t<string name=\"muc_password_hint\">Password (optional)</string>\n\t<string name=\"title_activity_muc_invite\">Group Chat Invitation</string>\n\t<!-- Groupchat invitation: \"Invitation from {contact name}\" -->\n\t<string name=\"muc_invitation_from\">Invitation from %s</string>\n\t<!-- Groupchat info: {description} ({number} participants) -->\n\t<string name=\"muc_invitation_occupants\">%1$s (%2$d participants)</string>\n\t<!-- Notification button: \"Join as {default nickname}\" (make SHORT string) -->\n\t<string name=\"muc_invitation_join\">Join as %s</string>\n\t<string name=\"muc_synchronizing\">Synchronizing…</string>\n\t<!-- Title of user list, contains JID -->\n\t<string name=\"chat_muc_userlist\">Group Chat Participants (%s)</string>\n\t<!-- Kicked from groupchat: \"Kicked: {reason} -->\n\t<string name=\"muc_kicked\">Kicked: %s</string>\n\t<!-- Kicked from groupchat: \"Kicked by {admin name}: {reason} -->\n\t<string name=\"muc_kicked_by\">Kicked by %1$s: %2$s</string>\n\t<!-- Banned from groupchat: \"Banned: {reason} -->\n\t<string name=\"muc_banned\">Banned: %s</string>\n\t<!-- Banned from groupchat: \"Banned by {admin name}: {reason} -->\n\t<string name=\"muc_banned_by\">Banned by %1$s: %2$s</string>\n\n\t<!-- File upload -->\n\t<string name=\"roster_contextmenu_send\">Send…</string>\n\t<string name=\"roster_contextmenu_take_image\">Take picture</string>\n\t<string name=\"roster_contextmenu_send_image\">Choose picture</string>\n\t<string name=\"roster_contextmenu_send_file\">Send file</string>\n\t<string name=\"upload_compress\">Compressing picture…</string>\n\t<string name=\"upload_uploading\">Uploading…</string>\n\t<string name=\"upload_too_large\">file too large!</string>\n\t<string name=\"storage_permission\">%s needs storage access to send files!</string>\n\t<string name=\"notification_permission_denied\">Notifications are disabled in the Android app preferences.</string>\n\n\t<!-- Search -->\n\t<string name=\"search_msg_hint\">Message content</string>\n\n\t<!-- MUC bookmarks -->\n\t<string name=\"group_bookmarks\">My group chats</string>\n\t<string name=\"group_mucsearch\">Public group chats</string>\n\t<!-- Service Discovery -->\n\t<string name=\"title_service_disco\">Browser: %s</string>\n\n\t<!-- Android 9 notification preferences: permanent notification -->\n\t<string name=\"notification_status\">Foreground service</string>\n\t<!-- Android 9 notification preferences: message notifications -->\n\t<string name=\"notification_msg\">Messages</string>\n\n</resources>\n"
  },
  {
    "path": "res/values-sv/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"app_name\">yaxim</string>\n\t<string name=\"app_name_bruno\">Bruno</string>\n\n\t<!-- Connection state -->\n\t<string name=\"conn_title\">yaxim: %s</string>\n\t<string name=\"conn_title_bruno\">Bruno: %s</string>\n\t<string name=\"conn_connecting\">Ansluter till server…</string>\n\t<string name=\"conn_disconnecting\">Kopplar från…</string>\n\t<string name=\"conn_online\">Ansluten</string>\n\t<string name=\"conn_offline\">Ej ansluten</string>\n\t<string name=\"conn_empty_roster\">Inga kontakter att visa!</string>\n\t<string name=\"conn_empty_roster_hints\">Det finns många sätt att lägg till kontakter:\\n\\n - Android Beam™: klicka på en väns telefon\\n\\n - Läs av en QR-kod\\n\\n - \\\"Skapa inbjudan\\\" och dela den (datorpost, SMS, QR-kod, …)\\n\\n - \\\"Lägg till kontakt\\\" om du känner till användarens JID</string>\n\t<string name=\"conn_reconnect\">Nytt anslutningsförsök om %d sekunder.</string>\n\t<string name=\"conn_disconnected\">Anslutning stängd</string>\n\t<string name=\"conn_no_network\">Ingen nätverksanslutning</string>\n\t<string name=\"conn_ping_timeout\">Inget svar</string>\n\t<string name=\"conn_error\">Fel: %s</string>\n\n\t<!-- Global Strings -->\n\t<string name=\"Global_Exit\">Avsluta</string>\n\t<string name=\"Global_authenticate_first\">Du behöver ansluta först</string>\n\t<string name=\"Global_JID_hint\">user@yax.im</string>\n\t<!-- tooltip message when the user entered an invalid XMPP address -->\n\t<string name=\"Global_JID_malformed\">Kontrollera adressformat!</string>\n\n\t<!-- FirstStartUpDialog -->\n\t<string name=\"StartupDialog_Title\">Välkommen till yaxim!</string>\n\t<string name=\"StartupDialog_Summary\">Vissa inställningar måste göras innan du kan börja använda programmet. Ange ditt Jabber-ID och lösenord.</string>\n\t<string name=\"StartupDialog_pwHint\">Ange lösenord</string>\n\t<string name=\"StartupDialog_pwshowHint\">Visa lösenord</string>\n\t<string name=\"StartupDialog_Username_title\">Jabber-ID:</string>\n\t<string name=\"StartupDialog_passwd_title\">Lösenord:</string>\n\t<string name=\"StartupDialog_advanced\">Avancerat…</string>\n\t<string name=\"StartupDialog_create_new\">Registrera nytt konto</string>\n\t<string name=\"StartupDialog_error_password\">För kort lösenord!</string>\n\t<string name=\"StartupDialog_created_password\">Skapade säkert lösenord</string>\n\t<string name=\"StartupDialog_auth_failed\">Kontrollera ditt användarnamn och lösenord!</string>\n\t<string name=\"StartupDialog_server_failed\">Could not connect to %s!</string>\n\t<string name=\"StartupDialog_no_registration\">Server does not allow registration!</string>\n\n\t<string name=\"StartupDialog_invitation\">Du har fått en inbjudan till Jabber.  Var vänlig slutför din registrering.</string>\n\t<string name=\"StartupDialog_no_more_accounts\">Flera konton stöds ej!</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_message\">Meddelande från %s</string>\n\t<string name=\"notification_anonymous_message\">Meddelande mottaget</string>\n\t<!--  Group Chat notification, %1$s is the user name, %2$s is the room, e.g. \"{Ge0rG} in {yaxim Chat}\" -->\n\t<string name=\"notification_muc_message\">%1$s i %2$s</string>\n\t<!--  Group Group Chat private message notification, %1$s is the user name, %2$s is the room, e.g. \"Message from {Ge0rG} in {yaxim Chat}\" -->\n\t<!--string name=\"notification_muc_pm\">Message from %1$s in %2$s</string-->\n\t<!-- notification button: direct reply (make SHORT string) -->\n\t<string name=\"notification_reply\">Svara</string>\n\t<!-- notification button: mark as read (make SHORT string) -->\n\t<string name=\"notification_mark_read\">Markera läst</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_error\">Fel när meddelandet skickades!</string>\n\n\t<!-- Notification Settings -->\n\t<string name=\"preftitle_notify\">Aviseringsinställningar</string>\n\t<string name=\"preftitle_notify_msg\">Meddelandeavisering</string>\n\t<string name=\"preftitle_notify_muc\">Gruppavisering</string>\n\t<string name=\"notification_custom\">Anpassad ringsignal</string>\n\t<string name=\"muc_highlight_title\">Avisera bara om nämnd</string>\n\t<string name=\"muc_highlight_sum\">Avisera även när ditt kortnamn är nämnt i ett rum</string>\n\t<string name=\"led_title\">Blinkande lysdiod</string>\n\t<string name=\"led_summ\">Blinka LED vid inkommande meddelande</string>\n\t<string name=\"vibr_title\">Vibration</string>\n\t<string name=\"vibr_summ\">Vibrera vid inkommande meddelande</string>\n\t<string-array name=\"vibr_values_displayed\">\n\t\t<item>Aldrig</item>\n\t\t<item>Systeminställning</item>\n\t\t<item>Alltid</item>\n\t</string-array>\n\t<string name=\"ringtone_title\">Ringsignal</string>\n\t<string name=\"ringtone_summ\">Ljud vid inkommande meddelande</string>\n\t<string name=\"ticker_title\">Förhandsgranskning</string>\n\t<string name=\"ticker_summ\">Visa avsändare och meddelande i statusfältet</string>\n\n\t<!-- Startup Setting Strings -->\n\t<string name=\"preftitle_general\">Allmänna inställningar</string>\n\t<string name=\"pref_dnd_when_silent\">\\\"Stör ej\\\" i tyst läge</string>\n\t<string name=\"pref_dnd_when_silent_summ\">Sätt din status till \\\"DND\\\" när din telefon är i tyst läge</string>\n\t<string name=\"statuspopup_name\">Ange din status</string>\n\t<string name=\"showOffline_summ\">Visa alltid alla kontakter i listan</string>\n\t<string name=\"showOffline_title\">Visa frånkopplade kontakter</string>\n\t<string name=\"enableGroups_summ\">Arrangera dina kontakter efter grupp</string>\n\t<string name=\"enableGroups_title\">Visa kontaktgrupper</string>\n\t<string name=\"foregroundService_summ\">Lås appen i minnet så att den är garanterat ansluten (förgrundstjänst)</string>\n\t<string name=\"foregroundService_title\">Statusfältikon</string>\n\n\t<string name=\"preftitle_debug\">Felsökning</string>\n\t<string name=\"smackdebug_summ\">Paket- och felsökningsinfo via logcat (kan innehålla privata data)</string>\n\t<string name=\"smackdebug_title\">SMACK-felsökning</string>\n\n\t<string name=\"reportcrash_title\">Skicka rapport vid programkrasch</string>\n\t<string name=\"reportcrash_summ\">Skicka anonyma kraschrapporter till utvecklare</string>\n\n\t<!-- Appearence Strings -->\n\t<string name=\"preftitle_app\">Utseende</string>\n\t<string name=\"FontChat_title\">Fontstorlek chatt</string>\n\t<string name=\"FontChat_summ\">Välj fontstorlek för chatt</string>\n\t<string name=\"FontChat_dialog\">Fontstorlek chatt</string>\n\t<!--\n\t<string name=\"FontRost_title\">Roster font size</string>\n\t<string name=\"FontRost_summ\">Set roster font size</string>\n\t<string name=\"FontRost_dialog\">Roster font fize</string>\n\t<string name=\"setFontRoster\">Set roster font size</string>\n\t-->\n\t<string name=\"pref_theme\">Tema</string>\n\t<string name=\"pref_theme_dark\">Mörk</string>\n\t<string name=\"pref_theme_light\">Ljus</string>\n\t<string name=\"pref_theme_pine\">Tall</string>\n\t<string name=\"pref_theme_ice\">Is</string>\n\t<string name=\"preftitle_ui\">Utseende</string>\n\t<string-array name=\"fontSizesChat\">\n\t\t<item>liten</item>\n\t\t<item>normal</item>\n\t\t<item>stor</item>\n\t\t<item>enorm</item>\n\t</string-array>\n\n\t<!-- Mainmenu \t-->\n\t<string name=\"Menu_addFriend\">Lägg till kontakt</string>\n\t<string name=\"Menu_addClipboard\">Lägg till %s</string>\n\t<string name=\"Menu_ShowOff\">Visa frånkopplat</string>\n\t<string name=\"Menu_HideOff\">Dölj frånkopplat</string>\n\t<string name=\"Menu_AccSettings\">Redigera konto</string>\n\t<string name=\"Menu_Settings\">Inställningar</string>\n\t<string name=\"Menu_Status\">Status</string>\n\t<string name=\"Menu_connect\">Anslut</string>\n\t<string name=\"Menu_disconnect\">Koppla från</string>\n\t<string name=\"Menu_about\">Om yaxim</string>\n\t<string name=\"Menu_about_bruno\">Om Bruno</string>\n\t<string name=\"Menu_muc\">Lägg till / bläddra...</string>\n\t<string name=\"Menu_matrix\">Träd in i Matrisen...</string>\n\t<string name=\"Menu_mark_all_as_read\">Markera allt som läst</string>\n\t<string name=\"Menu_send_invitation\">Skapa en inbjudan</string>\n    <string name=\"Menu_userlist\">Deltagare</string>\n\n\n\t<!-- AddFriend -->\n\t<string name=\"addFriend_Title\">Lägg till kontakt</string>\n\t<string name=\"addFriend_Summ\">Skriv in kontaktens Jabber-ID samt vilket namn som ska visas på skärmen och välj vilken grupp kontakten ska tillhöra!</string>\n\t<string name=\"addFriend_aliasHint\">Visningsnamn</string>\n\t<string name=\"addrosteritemaddgroupchoice\">Lägg till i en ny grupp</string>\n\t<string name=\"NewGroup_EditTextField_Hint\">Den nya gruppens namn</string>\n\n\t<!-- Roster CONTEXTMENU -->\n\t<string name=\"roster_contextmenu_group_rename\">Döp om grupp</string>\n\t<string name=\"roster_contextmenu_contact_mark_as_read\">Markera som läst</string>\n\t<string name=\"roster_contextmenu_contact_delete\">Radera kontakt</string>\n\t<string name=\"roster_contextmenu_contact_delmsg\">Radera chatthistoriken</string>\n\t<string name=\"roster_contextmenu_contact_rename\">Byt namn</string>\n\t<string name=\"roster_contextmenu_contact_request_auth\">Begär åtkomst</string>\n\t<string name=\"roster_contextmenu_contact_change_group\">Byt grupp</string>\n\t<string name=\"roster_contextmenu_contact_share\">Dela adress</string>\n\t<string name=\"roster_contextmenu_contact_ringtone\">Ringsignal</string>\n\t<string name=\"roster_contextmenu_muc_edit\">Redigera chattgrupp</string>\n\t<string name=\"roster_contextmenu_muc_leave\">Lämna chattgrupp</string>\n\t<string name=\"muc_leave_question\">Verkligen lämna %s?</string>\n\n\t<!-- Accountprefs -->\n\t<string name=\"account_settings_login\">Inloggningsuppgifter</string>\n\t<string name=\"account_settings_title\">Kontoinställningar</string>\n\t<string name=\"account_options_title\">Anslutningsalternativ</string>\n\t<string name=\"account_options_advanced\">Avancerade alternativ</string>\n\t<string name=\"carbons_title\">\"Message Carbons\" (XEP-0280)</string>\n\t<string name=\"carbons_summ\">Begär kopior av meddelanden från andra klienter</string>\n\t<string name=\"account_jabberID_title\">Jabber-ID</string>\n\t<string name=\"account_jabberID_sum\">example: jag@jabber.exempel.com</string>\n\t<string name=\"account_jabberID_dialog_title\">Ange ditt Jabber-ID:</string>\n\t<string name=\"account_jabberPW_title\">Lösenord</string>\n\t<string name=\"account_jabberPW_sum\">Jabberkontots lösenord</string>\n\t<string name=\"account_jabberPW_change_on_server\">Byt lösenord hos servern</string>\n\t<string name=\"account_jabberPW_password_old\">Gammalt lösenord:</string>\n\t<string name=\"account_jabberPW_password_new\">Nytt lösenord:</string>\n\t<string name=\"account_jabberPW_warning\">VARNING! För att kunna ansluta så måste du ange samma lösenord som hos servern!</string>\n\t<string name=\"account_jabberPW_progress\">Var vänlig vänta, byter lösenord...</string>\n\t<string name=\"account_jabberPW_finished\">Lösenordet har ändrats.</string>\n\t<string name=\"account_jabberPW_error\">Misslyckade att ändra lösenordet: %s</string>\n\t<string name=\"account_nickname_title\">Visningsnamn</string>\n\t<string name=\"account_nickname_summ\">Ditt kortnamn visas för andra användare</string>\n\t\n\t<!-- accountprefs -->\n\t<string name=\"account_resource_title\">Instans</string>\n\t<string name=\"account_resource_summ\">Förvalt: yaxim</string>\n\t<string name=\"account_resource_dialog_title\">Ange instans:</string>\n\t<string name=\"account_resource_hint\">yaxim</string>\n\t<string name=\"account_prio_title\">Prioritet</string>\n\t<string name=\"account_prio_summ\">Förvalt: 0 (tillåtet: -128 .. 127)</string>\n\t<string name=\"account_prio_error\">Tillåtna värden: -128 .. 127</string>\n\t<string name=\"account_prio_dialog_title\">Ange prioritet:</string>\n\t<string name=\"account_port_title\">Serverport</string>\n\t<string name=\"account_port_sum\">Förvalt: 5222</string>\n\t<string name=\"account_port_dialog_title\">Ange port:</string>\n\t<string name=\"account_port_hint\">5222</string>\n\t<string name=\"account_customserver_title\">Ange annan server</string>\n\t<string name=\"account_customserver_summ\">Ange alternativt namn på server (valfritt)</string>\n\t<string name=\"account_customserver_dialog_title\">Ange serverns namn:</string>\n\t<string name=\"account_customserver_hint\">host.exempel.com</string>\n\t<string name=\"require_ssl_title\">Kräver SSL/TLS</string>\n\t<string name=\"require_ssl_summ\">Krypterar alltid anslutning till servern</string>\n\n\t<!--StatusPopUp-->\n\t<string name=\"AddContact_SpinnerPrompt\">Välj grupp</string>\n\t<string name=\"setStatusmsgHint\">Statusmeddelande</string>\n\t<string name=\"setStatusTitle\">Ange din status</string>\n\t<string name=\"RenameGroup_summ\">Ändra namn på gruppen %s till:</string>\n\t<string name=\"RenameGroup_title\">Döp om grupp</string>\n\t<string name=\"RenameEntry_summ\">Döp om %1$s (%2$s) till:</string>\n\t<string name=\"RenameEntry_title\">Döp om kontakt</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_summ\">Välj en grupp nedan</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_title\">Byt grupp</string>\n\t<string name=\"deleteRosterItem_text\">Verkligen radera %1$s (%2$s)?</string>\n\t<string name=\"deleteRosterItem_title\">Radera kontakt</string>\n\t<string name=\"deleteChatHistory_text\">Verkligen radera alla meddelanden för %1$s (%2$s)?</string>\n\t<string name=\"deleteChatHistory_title\">Radera chatthistorik</string>\n\t<string name=\"subscriptionRequest_text\">%1$s vill lägga till dig som kontakt: \\\"%2$s\\\"</string>\n\t<string name=\"subscriptionRequest_title\">Prenumerationsförfrågan</string>\n\t<string name=\"subscription_accept\">Godkänn</string>\n\t<string name=\"subscription_reject\">Avvisa</string>\n\t<string name=\"subscription_reject_all\">Avvisa alla</string>\n\t<string name=\"subscription_status_from\">kan se din status</string>\n\n\t<!-- CHATWINDOW -->\n\t<string name=\"chat_from_me\">Jag:</string>\n\t<string name=\"toast_stored_offline\">Meddelandet har lagrats för att kunna skickas senare.</string>\n\t<string name=\"chat_enterMsgHint\">Skriv meddelande</string> \n\n\t<!-- Message context menu; use the verb form (to quote) -->\n\t<string name=\"chatmenu_quote\">Citat</string>\n\t<!-- Message context menu: repeat the same message -->\n\t<string name=\"chatmenu_resend\">Redigera meddelande</string>\n\n\t<!-- GPS settings -->\n\t<!--\n\t<string name=\"showGPS_title\">GPS to status</string>\n\t<string name=\"showGPS_summ_on\">GPS is send to StatusMessage</string>\n\t<string name=\"showGPS_summ_off\">GPS is send to StatusMessage</string>\n\t-->\n\n\t<!-- About Dialog -->\n\t<string name=\"AboutDialog_title\">Om yaxim</string>\n\t<string name=\"AboutDialog_DevelopersTitle\">Utvecklare</string>\n\t<!-- Contact the developer button -->\n\t<string name=\"AboutDialog_DevelopersText\">Kontakt</string>\n\t<string name=\"AboutDialog_LicenceTitle\">Licens</string>\n\t<string name=\"AboutDialog_Vote\">Bedöm app</string>\n\t<string name=\"AboutDialog_LicenceText\">Denna text har avsiktligt lämnats i sin helhet på orginalspråk: This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. Link: http://www.gnu.org/licenses/gpl-2.0.html\\n \\n Parts of this software are provided under the MIT License:\\n \\n Copyright © 2009 Mads Kristiansen, Nullwire ApS\\n \\n Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: \\n The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. \\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</string>\n\n\t<string name=\"status_available\">Ansluten</string>\n\t<string name=\"status_away\">Frånvarande</string>\n\t<string name=\"status_chat\">Ledig för chatt</string>\n\t<string name=\"status_dnd\">Stör ej</string>\n\t<string name=\"status_xa\">Inte tillgänglig</string>\n\t<string name=\"status_offline\">Ej ansluten</string>\n\n\t<string name=\"translator_credits\">Launchpad Contributions:\n  Anders Jackson https://launchpad.net/~anders-jackson\n  Argafål https://launchpad.net/~argafal\n  Fredrik Wendt https://launchpad.net/~fredrik-wendt\n  Förnamn Eftr https://launchpad.net/~erikl-deactivatedaccount</string>\n\n\t<!-- default roster group with no name -->\n\t<string name=\"default_group\">Generell</string>\n\t<string name=\"all_contacts_group\">Alla kontakter</string>\n\t<string name=\"muc_group\">Gruppchatt</string>\n\n\t<!-- SEND listener popup -->\n\t<string name=\"chooseContact\">Välj kontakt</string>\n\t<string name=\"action_settings\">Inställningar</string>\n\n\t<!-- MUC strings -->\n\t<string name=\"muc_jid_hint\">JID till gruppchat</string>\n\t<string name=\"muc_nickname_hint\">Smeknamn</string>\n\t<string name=\"muc_password_hint\">Lösenord (valfritt)</string>\n\t<string name=\"title_activity_muc_invite\">Inbjudan till gruppchatt</string>\n\t<!-- Groupchat invitation: \"Invitation from {contact name}\" -->\n\t<string name=\"muc_invitation_from\">Inbjudan från %s</string>\n\t<!-- Groupchat info: {description} ({number} participants) -->\n\t<string name=\"muc_invitation_occupants\">%1$s (%2$d deltagare)</string>\n\t<!-- Notification button: \"Join as {default nickname}\" (make SHORT string) -->\n\t<string name=\"muc_invitation_join\">Går med som %s</string>\n\t<string name=\"muc_synchronizing\">Synkroniserar...</string>\n\t<!-- Title of user list, contains JID -->\n\t<string name=\"chat_muc_userlist\">Deltagare i gruppchatt (%s)</string>\n\t<!-- Kicked from groupchat: \"Kicked: {reason} -->\n\t<string name=\"muc_kicked\">Utsparkad: %s</string>\n\t<!-- Kicked from groupchat: \"Kicked by {admin name}: {reason} -->\n\t<string name=\"muc_kicked_by\">Utsparkade av %1$s: %2$s</string>\n\t<!-- Banned from groupchat: \"Banned: {reason} -->\n\t<string name=\"muc_banned\">Blockad: %s</string>\n\t<!-- Banned from groupchat: \"Banned by {admin name}: {reason} -->\n\t<string name=\"muc_banned_by\">Blockad av %1$s: %2$s</string>\n\n\t<!-- File upload -->\n\t<string name=\"roster_contextmenu_send\">Skickar...</string>\n\t<string name=\"roster_contextmenu_take_image\">Tag ett foto</string>\n\t<string name=\"roster_contextmenu_send_image\">Välj ett foto</string>\n\t<string name=\"roster_contextmenu_send_file\">Skicka fil</string>\n\t<string name=\"upload_compress\">Komprimerar foto...</string>\n\t<string name=\"upload_uploading\">Skickar upp…</string>\n\t<string name=\"upload_too_large\">Filen är för stor!</string>\n\t<string name=\"storage_permission\">%s behöver tillgång till filsystem för att sända filer!</string>\n\t<string name=\"notification_permission_denied\">Notifications are disabled in the Android app preferences.</string>\n\n\t<!-- Search -->\n\t<string name=\"search_msg_hint\">Meddelandeinnehåll</string>\n\n\t<!-- MUC bookmarks -->\n\t<string name=\"group_bookmarks\">Mina gruppchatter</string>\n\t<string name=\"group_mucsearch\">Publika gruppchatter</string>\n\t<!-- Service Discovery -->\n\t<string name=\"title_service_disco\">Letar: %s</string>\n\n\t<!-- Android 9 notification preferences: permanent notification -->\n\t<string name=\"notification_status\">Förgrundstjänst</string>\n\t<!-- Android 9 notification preferences: message notifications -->\n\t<string name=\"notification_msg\">Meddelanden</string>\n\n</resources>\n"
  },
  {
    "path": "res/values-tr/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"app_name\">yaxim</string>\n\t<string name=\"app_name_bruno\">Bruno</string>\n\n\t<!-- Connection state -->\n\t<string name=\"conn_title\">yaxim: %s</string>\n\t<string name=\"conn_title_bruno\">Bruno: %s</string>\n\t<string name=\"conn_connecting\">Sunucuya bağlanılıyor…</string>\n\t<string name=\"conn_disconnecting\">Bağlantı kesiliyor…</string>\n\t<string name=\"conn_online\">Çevirimiçi</string>\n\t<string name=\"conn_offline\">Çevrimdışı</string>\n\t<string name=\"conn_empty_roster\">Görüntülenecek kişi yok!</string>\n\t<string name=\"conn_empty_roster_hints\">There are many ways to add contacts:\\n\\n\n\t\t- Android Beam™: touch a friend\\'s phone\\n\\n\n\t\t- Scan a QR code\\n\\n\n\t\t- \\\"Create invitation\\\" and share it (e-mail, SMS, QR code, …)\\n\\n\n\t\t- \\\"Add contact\\\" if you know the JID</string>\n\t<string name=\"conn_reconnect\">%d saniye sonra yeni bağlantı teşebbüsü.</string>\n\t<string name=\"conn_disconnected\">Bağlantı kesildi</string>\n\t<string name=\"conn_no_network\">Ağ bağlantısı yok</string>\n\t<string name=\"conn_ping_timeout\">No response</string>\n\t<string name=\"conn_error\">Error: %s</string>\n\n\t<!-- Global Strings -->\n\t<string name=\"Global_Exit\">Çıkış</string>\n\t<string name=\"Global_authenticate_first\">Lütfen önce bağlanınız</string>\n\t<string name=\"Global_JID_hint\">kullanıcı@yax.im</string>\n\t<!-- tooltip message when the user entered an invalid XMPP address -->\n\t<string name=\"Global_JID_malformed\">Adres biçimini kontrol ediniz!</string>\n\n\t<!-- FirstStartUpDialog -->\n\t<string name=\"StartupDialog_Title\">Yaxim\\'e hoş geldiniz!</string>\n\t<string name=\"StartupDialog_Summary\">Kullanabilmek için yaxim\\'i yapılandırmanız lazımdır. Jabber kimliğinizi ve parolanızı giriniz.</string>\n\t<string name=\"StartupDialog_pwHint\">Parola girin</string>\n\t<string name=\"StartupDialog_pwshowHint\">Show password</string>\n\t<string name=\"StartupDialog_Username_title\">Jabber kimliği:</string>\n\t<string name=\"StartupDialog_passwd_title\">Parola:</string>\n\t<string name=\"StartupDialog_advanced\">Gelişmiş:</string>\n\t<string name=\"StartupDialog_create_new\">Yeni hesap kaydet</string>\n\t<string name=\"StartupDialog_error_password\">Password is too short!</string>\n\t<string name=\"StartupDialog_created_password\">Created secure password</string>\n\t<string name=\"StartupDialog_auth_failed\">Please check your username and password!</string>\n\t<string name=\"StartupDialog_server_failed\">Could not connect to %s!</string>\n\t<string name=\"StartupDialog_no_registration\">Server does not allow registration!</string>\n\n\t<string name=\"StartupDialog_invitation\">You have been invited to Jabber. Please complete your registration.</string>\n\t<string name=\"StartupDialog_no_more_accounts\">No additional account supported!</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_message\">%s mesajı</string>\n\t<string name=\"notification_anonymous_message\">Mesaj alındı</string>\n\t<!--  Group Chat notification, %1$s is the user name, %2$s is the room, e.g. \"{Ge0rG} in {yaxim Chat}\" -->\n\t<string name=\"notification_muc_message\">%1$s in %2$s</string>\n\t<!--  Group Group Chat private message notification, %1$s is the user name, %2$s is the room, e.g. \"Message from {Ge0rG} in {yaxim Chat}\" -->\n\t<!--string name=\"notification_muc_pm\">Message from %1$s in %2$s</string-->\n\t<!-- notification button: direct reply (make SHORT string) -->\n\t<string name=\"notification_reply\">Reply</string>\n\t<!-- notification button: mark as read (make SHORT string) -->\n\t<string name=\"notification_mark_read\">Mark Read</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_error\">Mesajın gönderilmesinde hata!</string>\n\n\t<!-- Notification Settings -->\n\t<string name=\"preftitle_notify\">Notification Settings</string>\n\t<string name=\"preftitle_notify_msg\">Mesaj Uyarısı</string>\n\t<string name=\"preftitle_notify_muc\">Group Chat Notification</string>\n\t<string name=\"notification_custom\">Custom Ringtone</string>\n\t<string name=\"muc_highlight_title\">Only notify on mention</string>\n\t<string name=\"muc_highlight_sum\">Notify when your nickname is mentioned in a room</string>\n\t<string name=\"led_title\">Yanıp sönen LED</string>\n\t<string name=\"led_summ\">Gelen mesajlar için telefonun LED\\'ini yanıp söndür</string>\n\t<string name=\"vibr_title\">Titreşim</string>\n\t<string name=\"vibr_summ\">Gelen mesaj olduğunda titre</string>\n\t<string-array name=\"vibr_values_displayed\">\n\t\t<item>Asla</item>\n\t\t<item>Sistem tercihi</item>\n\t\t<item>Daima</item>\n\t</string-array>\n\t<string name=\"ringtone_title\">Melodi</string>\n\t<string name=\"ringtone_summ\">Gelen mesajlar için ses</string>\n\t<string name=\"ticker_title\">Mesaj önizlemesi</string>\n\t<string name=\"ticker_summ\">Göndereni ve mesajı durum çubuğunda göster</string>\n\n\t<!-- Startup Setting Strings -->\n\t<string name=\"preftitle_general\">General Settings</string>\n\t<string name=\"pref_dnd_when_silent\">\\\"Do not disturb\\\" in silent mode</string>\n\t<string name=\"pref_dnd_when_silent_summ\">Set your online status to \\\"DND\\\" when your phone is in silent mode</string>\n\t<string name=\"statuspopup_name\">Durumunuzu ayarlayın</string>\n\t<string name=\"showOffline_summ\">Listede daima tüm kişileri göster</string>\n\t<string name=\"showOffline_title\">Çevrimdışı kişileri göster</string>\n\t<string name=\"enableGroups_summ\">Kişileri gruplara göre sıralandır</string>\n\t<string name=\"enableGroups_title\">Kişi gruplarını göster</string>\n\t<string name=\"foregroundService_summ\">Keep app in memory to ensure always-on connection (foreground service)</string>\n\t<string name=\"foregroundService_title\">Durum çubuğu ikonu</string>\n\n\t<string name=\"preftitle_debug\">Hata ayıklama</string>\n\t<string name=\"smackdebug_summ\">Logcat aracılığıyla paket ve hata ayıklama çıktısı (kişisel bilgiler içerebilir)</string>\n\t<string name=\"smackdebug_title\">SMACK hata ayıklama</string>\n\n\t<string name=\"reportcrash_title\">Çökme raporları gönder</string>\n\t<string name=\"reportcrash_summ\">Geliştiriciye anonim çökme raporları gönder</string>\n\n\t<!-- Appearence Strings -->\n\t<string name=\"preftitle_app\">Görünüm</string>\n\t<string name=\"FontChat_title\">Sohbet yazıtipi boyutu</string>\n\t<string name=\"FontChat_summ\">Yazı tipi boyutunu ayarla</string>\n\t<string name=\"FontChat_dialog\">Sohbet yazıtipi boyutu</string>\n\t<!--\n\t<string name=\"FontRost_title\">Roster font size</string>\n\t<string name=\"FontRost_summ\">Set roster font size</string>\n\t<string name=\"FontRost_dialog\">Roster font fize</string>\n\t<string name=\"setFontRoster\">Set roster font size</string>\n\t-->\n\t<string name=\"pref_theme\">Tema</string>\n\t<string name=\"pref_theme_dark\">Koyu</string>\n\t<string name=\"pref_theme_light\">Açık</string>\n\t<string name=\"pref_theme_pine\">Pine</string>\n\t<string name=\"pref_theme_ice\">Ice</string>\n\t<string name=\"preftitle_ui\">Görünüm</string>\n\t<string-array name=\"fontSizesChat\">\n\t\t<item>küçük</item>\n\t\t<item>normal</item>\n\t\t<item>büyük</item>\n\t\t<item>çok büyük</item>\n\t</string-array>\n\n\t<!-- Mainmenu \t-->\n\t<string name=\"Menu_addFriend\">Add contact</string>\n\t<string name=\"Menu_addClipboard\">Add %s</string>\n\t<string name=\"Menu_ShowOff\">Show offline</string>\n\t<string name=\"Menu_HideOff\">Hide offline</string>\n\t<string name=\"Menu_AccSettings\">Edit account</string>\n\t<string name=\"Menu_Settings\">Ayarlar</string>\n\t<string name=\"Menu_Status\">Durum</string>\n\t<string name=\"Menu_connect\">Bağlan</string>\n\t<string name=\"Menu_disconnect\">Bağlantıyı kes</string>\n\t<string name=\"Menu_about\">Yaxim hakkında</string>\n\t<string name=\"Menu_about_bruno\">About Bruno</string>\n\t<string name=\"Menu_muc\">Add / browse…</string>\n\t<string name=\"Menu_matrix\">Enter the Matrix…</string>\n\t<string name=\"Menu_mark_all_as_read\">Mark all as read</string>\n\t<string name=\"Menu_send_invitation\">Create invitation</string>\n    <string name=\"Menu_userlist\">Participants</string>\n\n\n\t<!-- AddFriend -->\n\t<string name=\"addFriend_Title\">Kişi ekle</string>\n\t<string name=\"addFriend_Summ\">Arkadaşınızın Jabber kimliğini ve istediğiniz rumuzu girip kişi grubunu seçiniz!</string>\n\t<string name=\"addFriend_aliasHint\">Rumuz</string>\n\t<string name=\"addrosteritemaddgroupchoice\">Yeni gruba ekle</string>\n\t<string name=\"NewGroup_EditTextField_Hint\">Yeni grup için isim</string>\n\n\t<!-- Roster CONTEXTMENU -->\n\t<string name=\"roster_contextmenu_group_rename\">Grubu yeniden adlandır</string>\n\t<string name=\"roster_contextmenu_contact_mark_as_read\">Okunmuş olarak işaretle</string>\n\t<string name=\"roster_contextmenu_contact_delete\">Delete contact</string>\n\t<string name=\"roster_contextmenu_contact_delmsg\">Delete chat history</string>\n\t<string name=\"roster_contextmenu_contact_rename\">Yeniden adlandır</string>\n\t<string name=\"roster_contextmenu_contact_request_auth\">Request authorization</string>\n\t<string name=\"roster_contextmenu_contact_change_group\">Grup değiştir</string>\n\t<string name=\"roster_contextmenu_contact_share\">Share address</string>\n\t<string name=\"roster_contextmenu_contact_ringtone\">Melodi</string>\n\t<string name=\"roster_contextmenu_muc_edit\">Edit group chat</string>\n\t<string name=\"roster_contextmenu_muc_leave\">Leave group chat</string>\n\t<string name=\"muc_leave_question\">Really leave %s?</string>\n\n\t<!-- Accountprefs -->\n\t<string name=\"account_settings_login\">Giriş Verileri</string>\n\t<string name=\"account_settings_title\">Hesap Ayarları</string>\n\t<string name=\"account_options_title\">Bağlantı Seçenekleri</string>\n\t<string name=\"account_options_advanced\">Gelişmiş Seçenekler</string>\n\t<string name=\"carbons_title\">Mesajların Karbon Kopyaları (XEP-0280)</string>\n\t<string name=\"carbons_summ\">Diğer istemcilerden mesaj kopyaları talep et</string>\n\t<string name=\"account_jabberID_title\">Jabber Kimliği</string>\n\t<string name=\"account_jabberID_sum\">örnek: ben@jabber.misal.com</string>\n\t<string name=\"account_jabberID_dialog_title\">Jabber kimliğinizi girin:</string>\n\t<string name=\"account_jabberPW_title\">Hesap Parolası</string>\n\t<string name=\"account_jabberPW_sum\">Jabber hesabınızın parolası</string>\n\t<string name=\"account_jabberPW_change_on_server\">Parolayı sunucuda değiştir</string>\n\t<string name=\"account_jabberPW_password_old\">Eski Parola:</string>\n\t<string name=\"account_jabberPW_password_new\">Yeni Parola:</string>\n\t<string name=\"account_jabberPW_warning\">İKAZ! Başarılı giriş için aynı parolayı sunucuda da ayarlamanız lazımdır!</string>\n\t<string name=\"account_jabberPW_progress\">Bekleyiniz, parola değiştiriliyor…</string>\n\t<string name=\"account_jabberPW_finished\">Parola başarıyla değiştirildi.</string>\n\t<string name=\"account_jabberPW_error\">Parolanın değiştirilmesinde hata: %s</string>\n\t<string name=\"account_nickname_title\">Display Name</string>\n\t<string name=\"account_nickname_summ\">Your nickname displayed to other users</string>\n\t\n\t<!-- accountprefs -->\n\t<string name=\"account_resource_title\">İstemci Kaynağı</string>\n\t<string name=\"account_resource_summ\">Varsayılan: yaxim</string>\n\t<string name=\"account_resource_dialog_title\">Kaynağınızı giriniz:</string>\n\t<string name=\"account_resource_hint\">yaxim</string>\n\t<string name=\"account_prio_title\">İstemci Önceliği</string>\n\t<string name=\"account_prio_summ\">Varsayılan: 0 (izin verilen: -128 ilâ 127)</string>\n\t<string name=\"account_prio_error\">İzin verilen değerler: -128 ilâ 127</string>\n\t<string name=\"account_prio_dialog_title\">Önceliğinizi girin:</string>\n\t<string name=\"account_port_title\">Sunucu Portu</string>\n\t<string name=\"account_port_sum\">Varsayılan: 5222</string>\n\t<string name=\"account_port_dialog_title\">Sunucu portunu girin:</string>\n\t<string name=\"account_port_hint\">5222</string>\n\t<string name=\"account_customserver_title\">Özel Sunucu</string>\n\t<string name=\"account_customserver_summ\">(Seçime dayalı) alternatif sunucu makine ismi</string>\n\t<string name=\"account_customserver_dialog_title\">Sunucu makine ismini girin:</string>\n\t<string name=\"account_customserver_hint\">host.misal.com</string>\n\t<string name=\"require_ssl_title\">SSL/TLS iste</string>\n\t<string name=\"require_ssl_summ\">Sunucu bağlantısını daima şifrele</string>\n\n\t<!--StatusPopUp-->\n\t<string name=\"AddContact_SpinnerPrompt\">Grup Seç</string>\n\t<string name=\"setStatusmsgHint\">Durum mesajınız</string>\n\t<string name=\"setStatusTitle\">Durumunuzu ayarlayın</string>\n\t<string name=\"RenameGroup_summ\">%s grubunu şöyle adlandır:</string>\n\t<string name=\"RenameGroup_title\">Grubu yeniden adlandır</string>\n\t<string name=\"RenameEntry_summ\">%1$s (%2$s) şöyle adlandırılsın:</string>\n\t<string name=\"RenameEntry_title\">Kişiyi yeniden adlandır</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_summ\">Aşağıdan bir grup seçin</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_title\">Grup değiştir</string>\n\t<string name=\"deleteRosterItem_text\">%1$s (%2$s) gerçekten kaldırılsın mı?</string>\n\t<string name=\"deleteRosterItem_title\">Kişiyi Sil</string>\n\t<string name=\"deleteChatHistory_text\">%1$s (%2$s) ile tüm mesajlar silinsin mi?</string>\n\t<string name=\"deleteChatHistory_title\">Sohbet Tarihçesini Sil</string>\n\t<string name=\"subscriptionRequest_text\">%1$s sizi kişi olarak eklemek istiyor: \\\"%2$s\\\"</string>\n\t<string name=\"subscriptionRequest_title\">Abone olma talebi</string>\n\t<string name=\"subscription_accept\">Accept</string>\n\t<string name=\"subscription_reject\">Reject</string>\n\t<string name=\"subscription_reject_all\">Reject all</string>\n\t<string name=\"subscription_status_from\">can see your status</string>\n\n\t<!-- CHATWINDOW -->\n\t<string name=\"chat_from_me\">Ben:</string>\n\t<string name=\"toast_stored_offline\">Mesaj gönderilmek için kaydedilmiştir.</string>\n\t<string name=\"chat_enterMsgHint\">Mesaj girin</string> \n\n\t<!-- Message context menu; use the verb form (to quote) -->\n\t<string name=\"chatmenu_quote\">Quote</string>\n\t<!-- Message context menu: repeat the same message -->\n\t<string name=\"chatmenu_resend\">Edit message</string>\n\n\t<!-- GPS settings -->\n\t<!--\n\t<string name=\"showGPS_title\">GPS to status</string>\n\t<string name=\"showGPS_summ_on\">GPS is send to StatusMessage</string>\n\t<string name=\"showGPS_summ_off\">GPS is send to StatusMessage</string>\n\t-->\n\n\t<!-- About Dialog -->\n\t<string name=\"AboutDialog_title\">Yaxim hakkında</string>\n\t<string name=\"AboutDialog_DevelopersTitle\">Geliştiriciler</string>\n\t<!-- Contact the developer button -->\n\t<string name=\"AboutDialog_DevelopersText\">Contact</string>\n\t<string name=\"AboutDialog_LicenceTitle\">Lisans</string>\n\t<string name=\"AboutDialog_Vote\">Rate app</string>\n\t<string name=\"AboutDialog_LicenceText\">Bu program özgür yazılımdır; onu Özgür Yazılım Vakfının yayınladığı GNU Genel Kamu Lisansının 2. sürümü kapsamında dağıtabilir ve/veya değiştirebilirsiniz. Bağlantı: http://www.gnu.org/licenses/gpl-2.0.html\\n \\n Bu yazılımın bazı parçaları MIT lisansı kapsamındadır:\\n \\n Telif hakkı © 2009 Mads Kristiansen, Nullwire ApS\\n \\n Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: \\n The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. \\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</string>\n\n\t<string name=\"status_available\">Çevirimiçi</string>\n\t<string name=\"status_away\">Uzakta</string>\n\t<string name=\"status_chat\">Sohbete açık</string>\n\t<string name=\"status_dnd\">Rahatsız etmeyin</string>\n\t<string name=\"status_xa\">Meşgul</string>\n\t<string name=\"status_offline\">Çevrimdışı</string>\n\n\t<string name=\"translator_credits\">Launchpad Contributions:\n  Georg Lukas https://launchpad.net/~ge0rg\n  zapman https://launchpad.net/~zapman\n  zeugma https://launchpad.net/~sunder67</string>\n\n\t<!-- default roster group with no name -->\n\t<string name=\"default_group\">Genel</string>\n\t<string name=\"all_contacts_group\">Tüm kişiler</string>\n\t<string name=\"muc_group\">Group Chats</string>\n\n\t<!-- SEND listener popup -->\n\t<string name=\"chooseContact\">Kİşi seç</string>\n\t<string name=\"action_settings\">Ayarlar</string>\n\n\t<!-- MUC strings -->\n\t<string name=\"muc_jid_hint\">Group chat JID</string>\n\t<string name=\"muc_nickname_hint\">Nickname</string>\n\t<string name=\"muc_password_hint\">Password (optional)</string>\n\t<string name=\"title_activity_muc_invite\">Group Chat Invitation</string>\n\t<!-- Groupchat invitation: \"Invitation from {contact name}\" -->\n\t<string name=\"muc_invitation_from\">Invitation from %s</string>\n\t<!-- Groupchat info: {description} ({number} participants) -->\n\t<string name=\"muc_invitation_occupants\">%1$s (%2$d participants)</string>\n\t<!-- Notification button: \"Join as {default nickname}\" (make SHORT string) -->\n\t<string name=\"muc_invitation_join\">Join as %s</string>\n\t<string name=\"muc_synchronizing\">Synchronizing…</string>\n\t<!-- Title of user list, contains JID -->\n\t<string name=\"chat_muc_userlist\">Group Chat Participants (%s)</string>\n\t<!-- Kicked from groupchat: \"Kicked: {reason} -->\n\t<string name=\"muc_kicked\">Kicked: %s</string>\n\t<!-- Kicked from groupchat: \"Kicked by {admin name}: {reason} -->\n\t<string name=\"muc_kicked_by\">Kicked by %1$s: %2$s</string>\n\t<!-- Banned from groupchat: \"Banned: {reason} -->\n\t<string name=\"muc_banned\">Banned: %s</string>\n\t<!-- Banned from groupchat: \"Banned by {admin name}: {reason} -->\n\t<string name=\"muc_banned_by\">Banned by %1$s: %2$s</string>\n\n\t<!-- File upload -->\n\t<string name=\"roster_contextmenu_send\">Send…</string>\n\t<string name=\"roster_contextmenu_take_image\">Take picture</string>\n\t<string name=\"roster_contextmenu_send_image\">Choose picture</string>\n\t<string name=\"roster_contextmenu_send_file\">Send file</string>\n\t<string name=\"upload_compress\">Compressing picture…</string>\n\t<string name=\"upload_uploading\">Uploading…</string>\n\t<string name=\"upload_too_large\">file too large!</string>\n\t<string name=\"storage_permission\">%s needs storage access to send files!</string>\n\t<string name=\"notification_permission_denied\">Notifications are disabled in the Android app preferences.</string>\n\n\t<!-- Search -->\n\t<string name=\"search_msg_hint\">Message content</string>\n\n\t<!-- MUC bookmarks -->\n\t<string name=\"group_bookmarks\">My group chats</string>\n\t<string name=\"group_mucsearch\">Public group chats</string>\n\t<!-- Service Discovery -->\n\t<string name=\"title_service_disco\">Browser: %s</string>\n\n\t<!-- Android 9 notification preferences: permanent notification -->\n\t<string name=\"notification_status\">Foreground service</string>\n\t<!-- Android 9 notification preferences: message notifications -->\n\t<string name=\"notification_msg\">Messages</string>\n\n</resources>\n"
  },
  {
    "path": "res/values-uk/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"app_name\">yaxim</string>\n\t<string name=\"app_name_bruno\">Бруно</string>\n\n\t<!-- Connection state -->\n\t<string name=\"conn_title\">yaxim: %s</string>\n\t<string name=\"conn_title_bruno\">Бруно: %s</string>\n\t<string name=\"conn_connecting\">Підключення до сервера...</string>\n\t<string name=\"conn_disconnecting\">Відключення...</string>\n\t<string name=\"conn_online\">На зв’язку</string>\n\t<string name=\"conn_offline\">Відключено</string>\n\t<string name=\"conn_empty_roster\">Не має контактів для відображення!</string>\n\t<string name=\"conn_empty_roster_hints\">Можете додати контакти декількома способами:\\n\\n - Android Beam™: прикладіть пристрої один до одного\\n\\n - Сканувати QR код\\n\\n - \\\"Створити запрошення\\\" та поділіться ним (e-mail, SMS, QR code, …)\\n\\n - \\\"Додати контакт\\\" якщо відомий JID</string>\n\t<string name=\"conn_reconnect\">Наступна спроба підключення через %d секунд.</string>\n\t<string name=\"conn_disconnected\">З’єднання закрито</string>\n\t<string name=\"conn_no_network\">Не має підключення до мережі</string>\n\t<string name=\"conn_ping_timeout\">Немає відповіді</string>\n\t<string name=\"conn_error\">Помилка: %s</string>\n\n\t<!-- Global Strings -->\n\t<string name=\"Global_Exit\">Вийти</string>\n\t<string name=\"Global_authenticate_first\">Будь ласка, спочатку під’єднайтесь</string>\n\t<string name=\"Global_JID_hint\">user@yax.im</string>\n\t<!-- tooltip message when the user entered an invalid XMPP address -->\n\t<string name=\"Global_JID_malformed\">Перевірте формат!</string>\n\n\t<!-- FirstStartUpDialog -->\n\t<string name=\"StartupDialog_Title\">Вітаємо в yaxim</string>\n\t<string name=\"StartupDialog_Summary\">Для початку користування вам необхідно налаштувати програму. Будь ласка, введіть ваш Jabber ID та пароль.</string>\n\t<string name=\"StartupDialog_pwHint\">Введіть пароль</string>\n\t<string name=\"StartupDialog_pwshowHint\">Показати пароль</string>\n\t<string name=\"StartupDialog_Username_title\">Jabber ID</string>\n\t<string name=\"StartupDialog_passwd_title\">Пароль</string>\n\t<string name=\"StartupDialog_advanced\">Додатково...</string>\n\t<string name=\"StartupDialog_create_new\">Створити новий обліковий запис</string>\n\t<string name=\"StartupDialog_error_password\">Пароль занадто короткий</string>\n\t<string name=\"StartupDialog_created_password\">Створено надійний пароль</string>\n\t<string name=\"StartupDialog_auth_failed\">Перевірте облікові дані і пароль!</string>\n\t<string name=\"StartupDialog_server_failed\">Не вдалося підключитися до %s!</string>\n\t<string name=\"StartupDialog_no_registration\">Сервер не дозволяє реєстрацію!</string>\n\n\t<string name=\"StartupDialog_invitation\">Вас запросили в Jabber. Будь ласка, завершіть реєстрацію.</string>\n\t<string name=\"StartupDialog_no_more_accounts\">Додатковий обліковий запис не дозволений!</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_message\">Повідомлення від %s</string>\n\t<string name=\"notification_anonymous_message\">Отримано повідомлення</string>\n\t<!--  Group Chat notification, %1$s is the user name, %2$s is the room, e.g. \"{Ge0rG} in {yaxim Chat}\" -->\n\t<string name=\"notification_muc_message\">%1$s в %2$s</string>\n\t<!--  Group Group Chat private message notification, %1$s is the user name, %2$s is the room, e.g. \"Message from {Ge0rG} in {yaxim Chat}\" -->\n\t<!--string name=\"notification_muc_pm\">Message from %1$s in %2$s</string-->\n\t<!-- notification button: direct reply (make SHORT string) -->\n\t<string name=\"notification_reply\">Відповісти</string>\n\t<!-- notification button: mark as read (make SHORT string) -->\n\t<string name=\"notification_mark_read\">Відмітити як прочитане</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_error\">Помилка при відправленні повідомлення!</string>\n\n\t<!-- Notification Settings -->\n\t<string name=\"preftitle_notify\">Налаштування сповіщень</string>\n\t<string name=\"preftitle_notify_msg\">Сповіщення про повідомлення</string>\n\t<string name=\"preftitle_notify_muc\">Повідомлення конференції</string>\n\t<string name=\"notification_custom\">Користувацький рингтон</string>\n\t<string name=\"muc_highlight_title\">Тільки повідомити про згадку</string>\n\t<string name=\"muc_highlight_sum\">Повідомляти при згадці вашого ника в конференції</string>\n\t<string name=\"led_title\">Сповіщення LED</string>\n\t<string name=\"led_summ\">Сповіщати про повідомлення морганням</string>\n\t<string name=\"vibr_title\">Режим вібрації</string>\n\t<string name=\"vibr_summ\">Сповіщати про повідомлення вібрацією</string>\n\t<string-array name=\"vibr_values_displayed\">\n\t\t<item>Ніколи</item>\n\t\t<item>Системні налаштунки</item>\n\t\t<item>Завжди</item>\n\t</string-array>\n\t<string name=\"ringtone_title\">Звук повідомлення</string>\n\t<string name=\"ringtone_summ\">Програвати звук для вхідних повідомлень</string>\n\t<string name=\"ticker_title\">Попередній перегляд повідомлення</string>\n\t<string name=\"ticker_summ\">Відображати відправника та повідомлення у статусному рядку</string>\n\n\t<!-- Startup Setting Strings -->\n\t<string name=\"preftitle_general\">Загальні налаштування</string>\n\t<string name=\"pref_dnd_when_silent\">\\\"Не турбувати\\\" в беззвучному режимі</string>\n\t<string name=\"pref_dnd_when_silent_summ\">Встановити статус \\\"Не турбувати\\\" якщо телефон в беззвучному режимі</string>\n\t<string name=\"statuspopup_name\">Вкажіть ваш статус</string>\n\t<string name=\"showOffline_summ\">Завжди показувати всі контакти у ростері</string>\n\t<string name=\"showOffline_title\">Показувати співрозмовників, що відключені</string>\n\t<string name=\"enableGroups_summ\">Впорядкувати контакти по групам</string>\n\t<string name=\"enableGroups_title\">Показувати групи контактів</string>\n\t<string name=\"foregroundService_summ\">Тримати додаток в пам\\'яті, щоб забезпечити постійне з\\'єднання (служба на передньому плані)</string>\n\t<string name=\"foregroundService_title\">Іконка в статусному рідку</string>\n\n\t<string name=\"preftitle_debug\">Діагностика</string>\n\t<string name=\"smackdebug_summ\">Пакетна і діагностична інформація через logcat (може містити персональні дані)</string>\n\t<string name=\"smackdebug_title\">Діагностика за допомогою SMACK</string>\n\n\t<string name=\"reportcrash_title\">Відправляти звіти про падіння</string>\n\t<string name=\"reportcrash_summ\">Відправляти анонімні звіти про падіння розробнику</string>\n\n\t<!-- Appearence Strings -->\n\t<string name=\"preftitle_app\">Зовнішній вигляд</string>\n\t<string name=\"FontChat_title\">Розмір шрифту в чаті</string>\n\t<string name=\"FontChat_summ\">Встановити розмір шрифту в чаті</string>\n\t<string name=\"FontChat_dialog\">Розмір шрифту в чаті</string>\n\t<!--\n\t<string name=\"FontRost_title\">Roster font size</string>\n\t<string name=\"FontRost_summ\">Set roster font size</string>\n\t<string name=\"FontRost_dialog\">Roster font fize</string>\n\t<string name=\"setFontRoster\">Set roster font size</string>\n\t-->\n\t<string name=\"pref_theme\">Тема</string>\n\t<string name=\"pref_theme_dark\">Темна</string>\n\t<string name=\"pref_theme_light\">Світла</string>\n\t<string name=\"pref_theme_pine\">Сосна</string>\n\t<string name=\"pref_theme_ice\">Лід</string>\n\t<string name=\"preftitle_ui\">Зовнішній вигляд</string>\n\t<string-array name=\"fontSizesChat\">\n\t\t<item>малий</item>\n\t\t<item>звичайний</item>\n\t\t<item>великий</item>\n\t\t<item>величезний</item>\n\t</string-array>\n\n\t<!-- Mainmenu \t-->\n\t<string name=\"Menu_addFriend\">Додати контакт</string>\n\t<string name=\"Menu_addClipboard\">Додати %s</string>\n\t<string name=\"Menu_ShowOff\">Показати відключених</string>\n\t<string name=\"Menu_HideOff\">Приховати відключених</string>\n\t<string name=\"Menu_AccSettings\">Правка облікового запису</string>\n\t<string name=\"Menu_Settings\">Налаштування</string>\n\t<string name=\"Menu_Status\">Статус</string>\n\t<string name=\"Menu_connect\">З’єднатися</string>\n\t<string name=\"Menu_disconnect\">Від’єднатися</string>\n\t<string name=\"Menu_about\">Про yaxim</string>\n\t<string name=\"Menu_about_bruno\">Про Бруно</string>\n\t<string name=\"Menu_muc\">Додати / подивитись...</string>\n\t<string name=\"Menu_matrix\">Увійти в Matrix...</string>\n\t<string name=\"Menu_mark_all_as_read\">Позначити всі як прочитані</string>\n\t<string name=\"Menu_send_invitation\">Створити запрошення</string>\n    <string name=\"Menu_userlist\">Учасники</string>\n\n\n\t<!-- AddFriend -->\n\t<string name=\"addFriend_Title\">Додати контакт</string>\n\t<string name=\"addFriend_Summ\">Будь ласка, введіть Jabber ID співрозмовника, бажаний псевдонім для відображення та оберіть групу!</string>\n\t<string name=\"addFriend_aliasHint\">Ім\\'я для відображення</string>\n\t<string name=\"addrosteritemaddgroupchoice\">Додати в нову групу</string>\n\t<string name=\"NewGroup_EditTextField_Hint\">Назва нової групи</string>\n\n\t<!-- Roster CONTEXTMENU -->\n\t<string name=\"roster_contextmenu_group_rename\">Перейменувати групу</string>\n\t<string name=\"roster_contextmenu_contact_mark_as_read\">Позначити як прочитане</string>\n\t<string name=\"roster_contextmenu_contact_delete\">Видалити контакт</string>\n\t<string name=\"roster_contextmenu_contact_delmsg\">Видалити історію переписки</string>\n\t<string name=\"roster_contextmenu_contact_rename\">Перейменувати</string>\n\t<string name=\"roster_contextmenu_contact_request_auth\">Запит авторизації</string>\n\t<string name=\"roster_contextmenu_contact_change_group\">Змінити групу</string>\n\t<string name=\"roster_contextmenu_contact_share\">Поділитись адресою</string>\n\t<string name=\"roster_contextmenu_contact_ringtone\">Звук повідомлення</string>\n\t<string name=\"roster_contextmenu_muc_edit\">Перезайти в конференцію</string>\n\t<string name=\"roster_contextmenu_muc_leave\">Покинути конференцію</string>\n\t<string name=\"muc_leave_question\">Дійсно покинути %s?</string>\n\n\t<!-- Accountprefs -->\n\t<string name=\"account_settings_login\">Реєстраційні відомості</string>\n\t<string name=\"account_settings_title\">Налаштування облікового запису</string>\n\t<string name=\"account_options_title\">Налаштування підключення</string>\n\t<string name=\"account_options_advanced\">Додаткові параметри</string>\n\t<string name=\"carbons_title\">Копіювання повідомлень (XEP-0280)</string>\n\t<string name=\"carbons_summ\">Запитувати копії повідомлень від інших ваших клієнтів</string>\n\t<string name=\"account_jabberID_title\">Jabber ID:</string>\n\t<string name=\"account_jabberID_sum\">наприклад: me@jabber.example.com</string>\n\t<string name=\"account_jabberID_dialog_title\">введіть ваш Jabber ID:</string>\n\t<string name=\"account_jabberPW_title\">Пароль облікового запису</string>\n\t<string name=\"account_jabberPW_sum\">Пароль вашого облікового запису Jabber</string>\n\t<string name=\"account_jabberPW_change_on_server\">Змінити пароль на сервері</string>\n\t<string name=\"account_jabberPW_password_old\">Старий пароль:</string>\n\t<string name=\"account_jabberPW_password_new\">Новий Пароль:</string>\n\t<string name=\"account_jabberPW_warning\">УВАГА! Для успішної реєстрації необхідно також встановити один і той же пароль на сервері!</string>\n\t<string name=\"account_jabberPW_progress\">Будь ласка, зачекайте, пароль змінюється...</string>\n\t<string name=\"account_jabberPW_finished\">Пароль успішно змінено.</string>\n\t<string name=\"account_jabberPW_error\">Помилка зміни пароля: %s</string>\n\t<string name=\"account_nickname_title\">Показуване ім’я</string>\n\t<string name=\"account_nickname_summ\">Ваш ник показується іншим користувачам</string>\n\t\n\t<!-- accountprefs -->\n\t<string name=\"account_resource_title\">Ресурс</string>\n\t<string name=\"account_resource_summ\">За замовчування: yaxim</string>\n\t<string name=\"account_resource_dialog_title\">Введіть ваш ресурс:</string>\n\t<string name=\"account_resource_hint\">yaxim</string>\n\t<string name=\"account_prio_title\">Приоритет</string>\n\t<string name=\"account_prio_summ\">За замовчуванням: 0 (дозволено: -128 .. 127)</string>\n\t<string name=\"account_prio_error\">Допустимі значення: -128 .. 127</string>\n\t<string name=\"account_prio_dialog_title\">Введіть пріоритет:</string>\n\t<string name=\"account_port_title\">Порт сервера</string>\n\t<string name=\"account_port_sum\">За замовчування: 5222</string>\n\t<string name=\"account_port_dialog_title\">Введіть порт сервера:</string>\n\t<string name=\"account_port_hint\">5222</string>\n\t<string name=\"account_customserver_title\">Опційний сервер</string>\n\t<string name=\"account_customserver_summ\">Альтернативна адреса сервера (опційно)</string>\n\t<string name=\"account_customserver_dialog_title\">Введіть адресу сервера:</string>\n\t<string name=\"account_customserver_hint\">host.example.com</string>\n\t<string name=\"require_ssl_title\">Вимагати SSL/TLS</string>\n\t<string name=\"require_ssl_summ\">Завжди вимагати шифрування з’єднання</string>\n\n\t<!--StatusPopUp-->\n\t<string name=\"AddContact_SpinnerPrompt\">Змінити групу</string>\n\t<string name=\"setStatusmsgHint\">Ваш статус</string>\n\t<string name=\"setStatusTitle\">Вкажіть ваш статус</string>\n\t<string name=\"RenameGroup_summ\">Перейменувати групу %s у:</string>\n\t<string name=\"RenameGroup_title\">Перейменувати групу</string>\n\t<string name=\"RenameEntry_summ\">Перейменувати %1$s (%2$s) у:</string>\n\t<string name=\"RenameEntry_title\">Прейменувати контакт</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_summ\">Виберіть групу зі списку нижче</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_title\">Змінити групу</string>\n\t<string name=\"deleteRosterItem_text\">Дійсно видалити %1$s (%2$s)?</string>\n\t<string name=\"deleteRosterItem_title\">Видалити контакт</string>\n\t<string name=\"deleteChatHistory_text\">Дійсно видалити всю історію повідомлень з %1$s (%2$s)?</string>\n\t<string name=\"deleteChatHistory_title\">Очистити історію чату</string>\n\t<string name=\"subscriptionRequest_text\">%1$s хоче додати вас в контакти: \\\"%2$s\\\"</string>\n\t<string name=\"subscriptionRequest_title\">Запит на підписку</string>\n\t<string name=\"subscription_accept\">Прийняти</string>\n\t<string name=\"subscription_reject\">Відхилити</string>\n\t<string name=\"subscription_reject_all\">Відхилити всі</string>\n\t<string name=\"subscription_status_from\">може бачити ваш статус</string>\n\n\t<!-- CHATWINDOW -->\n\t<string name=\"chat_from_me\">Я:</string>\n\t<string name=\"toast_stored_offline\">Повідомлення було збережено для відправлення.</string>\n\t<string name=\"chat_enterMsgHint\">Введіть повідомлення</string> \n\n\t<!-- Message context menu; use the verb form (to quote) -->\n\t<string name=\"chatmenu_quote\">Цитата</string>\n\t<!-- Message context menu: repeat the same message -->\n\t<string name=\"chatmenu_resend\">Редагувати повідомлення</string>\n\n\t<!-- GPS settings -->\n\t<!--\n\t<string name=\"showGPS_title\">GPS to status</string>\n\t<string name=\"showGPS_summ_on\">GPS is send to StatusMessage</string>\n\t<string name=\"showGPS_summ_off\">GPS is send to StatusMessage</string>\n\t-->\n\n\t<!-- About Dialog -->\n\t<string name=\"AboutDialog_title\">Про yaxim</string>\n\t<string name=\"AboutDialog_DevelopersTitle\">Розробники</string>\n\t<!-- Contact the developer button -->\n\t<string name=\"AboutDialog_DevelopersText\">Контакт</string>\n\t<string name=\"AboutDialog_LicenceTitle\">Ліцензія</string>\n\t<string name=\"AboutDialog_Vote\">Оцініть додаток</string>\n\t<string name=\"AboutDialog_LicenceText\">This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. Link: http://www.gnu.org/licenses/gpl-2.0.html\\n \\n Parts of this software are provided under the MIT License:\\n \\n Copyright © 2009 Mads Kristiansen, Nullwire ApS\\n \\n Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: \\n The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. \\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</string>\n\n\t<string name=\"status_available\">На зв’язку</string>\n\t<string name=\"status_away\">Немає на місці</string>\n\t<string name=\"status_chat\">Готовий спілкуватись</string>\n\t<string name=\"status_dnd\">Не турбувати</string>\n\t<string name=\"status_xa\">Недоступний</string>\n\t<string name=\"status_offline\">Відключено</string>\n\n\t<string name=\"translator_credits\">Launchpad Contributions:\n  baytuch https://launchpad.net/~baytuch</string>\n\n\t<!-- default roster group with no name -->\n\t<string name=\"default_group\">Загальна</string>\n\t<string name=\"all_contacts_group\">Всі контакти</string>\n\t<string name=\"muc_group\">Конференції</string>\n\n\t<!-- SEND listener popup -->\n\t<string name=\"chooseContact\">Змінити контакт</string>\n\t<string name=\"action_settings\">Налаштування</string>\n\n\t<!-- MUC strings -->\n\t<string name=\"muc_jid_hint\">JID конференції</string>\n\t<string name=\"muc_nickname_hint\">Нікнейм</string>\n\t<string name=\"muc_password_hint\">Пароль (опціонально)</string>\n\t<string name=\"title_activity_muc_invite\">Запрошення в конференцію</string>\n\t<!-- Groupchat invitation: \"Invitation from {contact name}\" -->\n\t<string name=\"muc_invitation_from\">Запрошення від %s</string>\n\t<!-- Groupchat info: {description} ({number} participants) -->\n\t<string name=\"muc_invitation_occupants\">%1$s (%2$d учасники)</string>\n\t<!-- Notification button: \"Join as {default nickname}\" (make SHORT string) -->\n\t<string name=\"muc_invitation_join\">Реєстрація в якості %s</string>\n\t<string name=\"muc_synchronizing\">Синхронізація...</string>\n\t<!-- Title of user list, contains JID -->\n\t<string name=\"chat_muc_userlist\">Учасники конференції (%s)</string>\n\t<!-- Kicked from groupchat: \"Kicked: {reason} -->\n\t<string name=\"muc_kicked\">Виключено: %s</string>\n\t<!-- Kicked from groupchat: \"Kicked by {admin name}: {reason} -->\n\t<string name=\"muc_kicked_by\">Виключено з %1$s: %2$s</string>\n\t<!-- Banned from groupchat: \"Banned: {reason} -->\n\t<string name=\"muc_banned\">Заблоковано: %s</string>\n\t<!-- Banned from groupchat: \"Banned by {admin name}: {reason} -->\n\t<string name=\"muc_banned_by\">Заблоковано з %1$s: %2$s</string>\n\n\t<!-- File upload -->\n\t<string name=\"roster_contextmenu_send\">Відправлення...</string>\n\t<string name=\"roster_contextmenu_take_image\">Камера</string>\n\t<string name=\"roster_contextmenu_send_image\">Обрати фото</string>\n\t<string name=\"roster_contextmenu_send_file\">Надіслати файл</string>\n\t<string name=\"upload_compress\">Стиснення картинки…</string>\n\t<string name=\"upload_uploading\">Вивантаження...</string>\n\t<string name=\"upload_too_large\">Занадто великий файл!</string>\n\t<string name=\"storage_permission\">%s потрібен доступ до сховища для відправки файлів!</string>\n\t<string name=\"notification_permission_denied\">Notifications are disabled in the Android app preferences.</string>\n\n\t<!-- Search -->\n\t<string name=\"search_msg_hint\">Вміст повідомлення</string>\n\n\t<!-- MUC bookmarks -->\n\t<string name=\"group_bookmarks\">Мої групові чати</string>\n\t<string name=\"group_mucsearch\">Публічні групові чати</string>\n\t<!-- Service Discovery -->\n\t<string name=\"title_service_disco\">Перегляд: %s</string>\n\n\t<!-- Android 9 notification preferences: permanent notification -->\n\t<string name=\"notification_status\">Служба на передньому плані</string>\n\t<!-- Android 9 notification preferences: message notifications -->\n\t<string name=\"notification_msg\">Повідомлення</string>\n\n</resources>\n"
  },
  {
    "path": "res/values-uz/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"app_name\">yaxim</string>\n\t<string name=\"app_name_bruno\">Bruno</string>\n\n\t<!-- Connection state -->\n\t<string name=\"conn_title\">yaxim: %s</string>\n\t<string name=\"conn_title_bruno\">Bruno: %s</string>\n\t<string name=\"conn_connecting\">Connecting to server…</string>\n\t<string name=\"conn_disconnecting\">Disconnecting…</string>\n\t<string name=\"conn_online\">Online</string>\n\t<string name=\"conn_offline\">Offline</string>\n\t<string name=\"conn_empty_roster\">No contacts to show!</string>\n\t<string name=\"conn_empty_roster_hints\">There are many ways to add contacts:\\n\\n\n\t\t- Android Beam™: touch a friend\\'s phone\\n\\n\n\t\t- Scan a QR code\\n\\n\n\t\t- \\\"Create invitation\\\" and share it (e-mail, SMS, QR code, …)\\n\\n\n\t\t- \\\"Add contact\\\" if you know the JID</string>\n\t<string name=\"conn_reconnect\">Next connection attempt in %d seconds.</string>\n\t<string name=\"conn_disconnected\">Connection closed</string>\n\t<string name=\"conn_no_network\">No network connection</string>\n\t<string name=\"conn_ping_timeout\">No response</string>\n\t<string name=\"conn_error\">Error: %s</string>\n\n\t<!-- Global Strings -->\n\t<string name=\"Global_Exit\">Exit</string>\n\t<string name=\"Global_authenticate_first\">Please connect first</string>\n\t<string name=\"Global_JID_hint\">user@yax.im</string>\n\t<!-- tooltip message when the user entered an invalid XMPP address -->\n\t<string name=\"Global_JID_malformed\">Check address format!</string>\n\n\t<!-- FirstStartUpDialog -->\n\t<string name=\"StartupDialog_Title\">Welcome to yaxim!</string>\n\t<string name=\"StartupDialog_Summary\">You need to configure yaxim before you can use it. Please enter your Jabber ID and password.</string>\n\t<string name=\"StartupDialog_pwHint\">Enter password</string>\n\t<string name=\"StartupDialog_pwshowHint\">Show password</string>\n\t<string name=\"StartupDialog_Username_title\">Jabber ID:</string>\n\t<string name=\"StartupDialog_passwd_title\">Password:</string>\n\t<string name=\"StartupDialog_advanced\">Advanced…</string>\n\t<string name=\"StartupDialog_create_new\">Register new account</string>\n\t<string name=\"StartupDialog_error_password\">Password is too short!</string>\n\t<string name=\"StartupDialog_created_password\">Created secure password</string>\n\t<string name=\"StartupDialog_auth_failed\">Please check your username and password!</string>\n\t<string name=\"StartupDialog_server_failed\">Could not connect to %s!</string>\n\t<string name=\"StartupDialog_no_registration\">Server does not allow registration!</string>\n\n\t<string name=\"StartupDialog_invitation\">You have been invited to Jabber. Please complete your registration.</string>\n\t<string name=\"StartupDialog_no_more_accounts\">No additional account supported!</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_message\">Message from %s</string>\n\t<string name=\"notification_anonymous_message\">Message received</string>\n\t<!--  Group Chat notification, %1$s is the user name, %2$s is the room, e.g. \"{Ge0rG} in {yaxim Chat}\" -->\n\t<string name=\"notification_muc_message\">%1$s in %2$s</string>\n\t<!--  Group Group Chat private message notification, %1$s is the user name, %2$s is the room, e.g. \"Message from {Ge0rG} in {yaxim Chat}\" -->\n\t<!--string name=\"notification_muc_pm\">Message from %1$s in %2$s</string-->\n\t<!-- notification button: direct reply (make SHORT string) -->\n\t<string name=\"notification_reply\">Reply</string>\n\t<!-- notification button: mark as read (make SHORT string) -->\n\t<string name=\"notification_mark_read\">Mark Read</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_error\">Error while sending message!</string>\n\n\t<!-- Notification Settings -->\n\t<string name=\"preftitle_notify\">Notification Settings</string>\n\t<string name=\"preftitle_notify_msg\">Message Notification</string>\n\t<string name=\"preftitle_notify_muc\">Group Chat Notification</string>\n\t<string name=\"notification_custom\">Custom Ringtone</string>\n\t<string name=\"muc_highlight_title\">Only notify on mention</string>\n\t<string name=\"muc_highlight_sum\">Notify when your nickname is mentioned in a room</string>\n\t<string name=\"led_title\">Blinking LED</string>\n\t<string name=\"led_summ\">Blink phone LED on incoming messages</string>\n\t<string name=\"vibr_title\">Vibration</string>\n\t<string name=\"vibr_summ\">Vibrate on incoming messages</string>\n\t<string-array name=\"vibr_values_displayed\">\n\t\t<item>Hech qachon</item>\n\t\t<item>System preference</item>\n\t\t<item>Hamisha</item>\n\t</string-array>\n\t<string name=\"ringtone_title\">Ringtone</string>\n\t<string name=\"ringtone_summ\">Tone for incoming messages</string>\n\t<string name=\"ticker_title\">Message preview</string>\n\t<string name=\"ticker_summ\">Show sender and message in status bar</string>\n\n\t<!-- Startup Setting Strings -->\n\t<string name=\"preftitle_general\">General Settings</string>\n\t<string name=\"pref_dnd_when_silent\">\\\"Do not disturb\\\" in silent mode</string>\n\t<string name=\"pref_dnd_when_silent_summ\">Set your online status to \\\"DND\\\" when your phone is in silent mode</string>\n\t<string name=\"statuspopup_name\">Set your status</string>\n\t<string name=\"showOffline_summ\">Always show all contacts in the roster</string>\n\t<string name=\"showOffline_title\">Show offline contacts</string>\n\t<string name=\"enableGroups_summ\">Arrange your contacts by their groups</string>\n\t<string name=\"enableGroups_title\">Show contact groups</string>\n\t<string name=\"foregroundService_summ\">Keep app in memory to ensure always-on connection (foreground service)</string>\n\t<string name=\"foregroundService_title\">Statusbar icon</string>\n\n\t<string name=\"preftitle_debug\">Debugging</string>\n\t<string name=\"smackdebug_summ\">Packet and debug output via logcat (may contain personal information)</string>\n\t<string name=\"smackdebug_title\">SMACK debugging</string>\n\n\t<string name=\"reportcrash_title\">Send crash reports</string>\n\t<string name=\"reportcrash_summ\">Send anonymous crash reports to developer</string>\n\n\t<!-- Appearence Strings -->\n\t<string name=\"preftitle_app\">Tashqi koʻrinishi</string>\n\t<string name=\"FontChat_title\">Chat font size</string>\n\t<string name=\"FontChat_summ\">Set chat font size</string>\n\t<string name=\"FontChat_dialog\">Chat font size</string>\n\t<!--\n\t<string name=\"FontRost_title\">Roster font size</string>\n\t<string name=\"FontRost_summ\">Set roster font size</string>\n\t<string name=\"FontRost_dialog\">Roster font fize</string>\n\t<string name=\"setFontRoster\">Set roster font size</string>\n\t-->\n\t<string name=\"pref_theme\">Theme</string>\n\t<string name=\"pref_theme_dark\">Dark</string>\n\t<string name=\"pref_theme_light\">Light</string>\n\t<string name=\"pref_theme_pine\">Pine</string>\n\t<string name=\"pref_theme_ice\">Ice</string>\n\t<string name=\"preftitle_ui\">Tashqi koʻrinishi</string>\n\t<string-array name=\"fontSizesChat\">\n\t\t<item>small</item>\n\t\t<item>normal</item>\n\t\t<item>large</item>\n\t\t<item>huge</item>\n\t</string-array>\n\n\t<!-- Mainmenu \t-->\n\t<string name=\"Menu_addFriend\">Add contact</string>\n\t<string name=\"Menu_addClipboard\">Add %s</string>\n\t<string name=\"Menu_ShowOff\">Show offline</string>\n\t<string name=\"Menu_HideOff\">Hide offline</string>\n\t<string name=\"Menu_AccSettings\">Edit account</string>\n\t<string name=\"Menu_Settings\">Settings</string>\n\t<string name=\"Menu_Status\">Status</string>\n\t<string name=\"Menu_connect\">Connect</string>\n\t<string name=\"Menu_disconnect\">Disconnect</string>\n\t<string name=\"Menu_about\">About yaxim</string>\n\t<string name=\"Menu_about_bruno\">About Bruno</string>\n\t<string name=\"Menu_muc\">Add / browse…</string>\n\t<string name=\"Menu_matrix\">Enter the Matrix…</string>\n\t<string name=\"Menu_mark_all_as_read\">Mark all as read</string>\n\t<string name=\"Menu_send_invitation\">Create invitation</string>\n    <string name=\"Menu_userlist\">Participants</string>\n\n\n\t<!-- AddFriend -->\n\t<string name=\"addFriend_Title\">Add a Contact</string>\n\t<string name=\"addFriend_Summ\">Please enter the Jabber ID of your friend, the\n\t\tdesired screen name and choose their contact group!</string>\n\t<string name=\"addFriend_aliasHint\">Screen name</string>\n\t<string name=\"addrosteritemaddgroupchoice\">Add to a new group</string>\n\t<string name=\"NewGroup_EditTextField_Hint\">Name for the new group</string>\n\n\t<!-- Roster CONTEXTMENU -->\n\t<string name=\"roster_contextmenu_group_rename\">Rename group</string>\n\t<string name=\"roster_contextmenu_contact_mark_as_read\">Mark as read</string>\n\t<string name=\"roster_contextmenu_contact_delete\">Delete contact</string>\n\t<string name=\"roster_contextmenu_contact_delmsg\">Delete chat history</string>\n\t<string name=\"roster_contextmenu_contact_rename\">Rename</string>\n\t<string name=\"roster_contextmenu_contact_request_auth\">Request authorization</string>\n\t<string name=\"roster_contextmenu_contact_change_group\">Change group</string>\n\t<string name=\"roster_contextmenu_contact_share\">Share address</string>\n\t<string name=\"roster_contextmenu_contact_ringtone\">Ringtone</string>\n\t<string name=\"roster_contextmenu_muc_edit\">Edit group chat</string>\n\t<string name=\"roster_contextmenu_muc_leave\">Leave group chat</string>\n\t<string name=\"muc_leave_question\">Really leave %s?</string>\n\n\t<!-- Accountprefs -->\n\t<string name=\"account_settings_login\">Login Information</string>\n\t<string name=\"account_settings_title\">Account Settings</string>\n\t<string name=\"account_options_title\">Connecting Options</string>\n\t<string name=\"account_options_advanced\">Advanced Options</string>\n\t<string name=\"carbons_title\">Message Carbons (XEP-0280)</string>\n\t<string name=\"carbons_summ\">Request message copies from your other client(s)</string>\n\t<string name=\"account_jabberID_title\">Jabber ID</string>\n\t<string name=\"account_jabberID_sum\">example: me@jabber.example.com</string>\n\t<string name=\"account_jabberID_dialog_title\">Enter your Jabber ID:</string>\n\t<string name=\"account_jabberPW_title\">Account Password</string>\n\t<string name=\"account_jabberPW_sum\">Your Jabber account password</string>\n\t<string name=\"account_jabberPW_change_on_server\">Change password on server</string>\n\t<string name=\"account_jabberPW_password_old\">Old Password:</string>\n\t<string name=\"account_jabberPW_password_new\">New Password:</string>\n\t<string name=\"account_jabberPW_warning\">WARNING! For successful login you must also set the same password on the server!</string>\n\t<string name=\"account_jabberPW_progress\">Please wait, changing password…</string>\n\t<string name=\"account_jabberPW_finished\">Password successfully changed.</string>\n\t<string name=\"account_jabberPW_error\">Error changing password: %s</string>\n\t<string name=\"account_nickname_title\">Display Name</string>\n\t<string name=\"account_nickname_summ\">Your nickname displayed to other users</string>\n\t\n\t<!-- accountprefs -->\n\t<string name=\"account_resource_title\">Client Resource</string>\n\t<string name=\"account_resource_summ\">Default: yaxim</string>\n\t<string name=\"account_resource_dialog_title\">Enter your resource:</string>\n\t<string name=\"account_resource_hint\">yaxim</string>\n\t<string name=\"account_prio_title\">Client Priority</string>\n\t<string name=\"account_prio_summ\">Default: 0 (allowed: -128 .. 127)</string>\n\t<string name=\"account_prio_error\">Allowed values: -128 .. 127</string>\n\t<string name=\"account_prio_dialog_title\">Enter your priority:</string>\n\t<string name=\"account_port_title\">Server Port</string>\n\t<string name=\"account_port_sum\">Default: 5222</string>\n\t<string name=\"account_port_dialog_title\">Enter the server port:</string>\n\t<string name=\"account_port_hint\">5222</string>\n\t<string name=\"account_customserver_title\">Custom Server</string>\n\t<string name=\"account_customserver_summ\">(Optional) alternative server hostname</string>\n\t<string name=\"account_customserver_dialog_title\">Enter server hostname:</string>\n\t<string name=\"account_customserver_hint\">host.example.com</string>\n\t<string name=\"require_ssl_title\">Require SSL/TLS</string>\n\t<string name=\"require_ssl_summ\">Always encrypt server connection</string>\n\n\t<!--StatusPopUp-->\n\t<string name=\"AddContact_SpinnerPrompt\">Choose Group</string>\n\t<string name=\"setStatusmsgHint\">Your status message</string>\n\t<string name=\"setStatusTitle\">Set your status</string>\n\t<string name=\"RenameGroup_summ\">Rename group %s to:</string>\n\t<string name=\"RenameGroup_title\">Rename group</string>\n\t<string name=\"RenameEntry_summ\">Rename %1$s (%2$s) to: </string>\n\t<string name=\"RenameEntry_title\">Rename contact</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_summ\">Select a group from the spinner below</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_title\">Change group</string>\n\t<string name=\"deleteRosterItem_text\">Really remove %1$s (%2$s)?</string>\n\t<string name=\"deleteRosterItem_title\">Delete Contact</string>\n\t<string name=\"deleteChatHistory_text\">Really remove all messages with %1$s (%2$s)?</string>\n\t<string name=\"deleteChatHistory_title\">Delete Chat History</string>\n\t<string name=\"subscriptionRequest_text\">%1$s wants to add you as a contact: \\\"%2$s\\\"</string>\n\t<string name=\"subscriptionRequest_title\">Subscription Request</string>\n\t<string name=\"subscription_accept\">Accept</string>\n\t<string name=\"subscription_reject\">Reject</string>\n\t<string name=\"subscription_reject_all\">Reject all</string>\n\t<string name=\"subscription_status_from\">can see your status</string>\n\n\t<!-- CHATWINDOW -->\n\t<string name=\"chat_from_me\">Me:</string>\n\t<string name=\"toast_stored_offline\">The message has been stored for transmission.</string>\n\t<string name=\"chat_enterMsgHint\">Enter message</string> \n\n\t<!-- Message context menu; use the verb form (to quote) -->\n\t<string name=\"chatmenu_quote\">Quote</string>\n\t<!-- Message context menu: repeat the same message -->\n\t<string name=\"chatmenu_resend\">Edit message</string>\n\n\t<!-- GPS settings -->\n\t<!--\n\t<string name=\"showGPS_title\">GPS to status</string>\n\t<string name=\"showGPS_summ_on\">GPS is send to StatusMessage</string>\n\t<string name=\"showGPS_summ_off\">GPS is send to StatusMessage</string>\n\t-->\n\n\t<!-- About Dialog -->\n\t<string name=\"AboutDialog_title\">About yaxim</string>\n\t<string name=\"AboutDialog_DevelopersTitle\">Developers</string>\n\t<!-- Contact the developer button -->\n\t<string name=\"AboutDialog_DevelopersText\">Contact</string>\n\t<string name=\"AboutDialog_LicenceTitle\">Licensing</string>\n\t<string name=\"AboutDialog_Vote\">Rate app</string>\n\t<string name=\"AboutDialog_LicenceText\">TATU talabasi</string>\n\n\t<string name=\"status_available\">Online</string>\n\t<string name=\"status_away\">Away</string>\n\t<string name=\"status_chat\">Free for chat</string>\n\t<string name=\"status_dnd\">Do not disturb</string>\n\t<string name=\"status_xa\">Not available</string>\n\t<string name=\"status_offline\">Offline</string>\n\n\t<string name=\"translator_credits\">Launchpad Contributions:\n  bekzod https://launchpad.net/~buranov-bekzod</string>\n\n\t<!-- default roster group with no name -->\n\t<string name=\"default_group\">General</string>\n\t<string name=\"all_contacts_group\">All contacts</string>\n\t<string name=\"muc_group\">Group Chats</string>\n\n\t<!-- SEND listener popup -->\n\t<string name=\"chooseContact\">Choose contact</string>\n\t<string name=\"action_settings\">Settings</string>\n\n\t<!-- MUC strings -->\n\t<string name=\"muc_jid_hint\">Group chat JID</string>\n\t<string name=\"muc_nickname_hint\">Nickname</string>\n\t<string name=\"muc_password_hint\">Password (optional)</string>\n\t<string name=\"title_activity_muc_invite\">Group Chat Invitation</string>\n\t<!-- Groupchat invitation: \"Invitation from {contact name}\" -->\n\t<string name=\"muc_invitation_from\">Invitation from %s</string>\n\t<!-- Groupchat info: {description} ({number} participants) -->\n\t<string name=\"muc_invitation_occupants\">%1$s (%2$d participants)</string>\n\t<!-- Notification button: \"Join as {default nickname}\" (make SHORT string) -->\n\t<string name=\"muc_invitation_join\">Join as %s</string>\n\t<string name=\"muc_synchronizing\">Synchronizing…</string>\n\t<!-- Title of user list, contains JID -->\n\t<string name=\"chat_muc_userlist\">Group Chat Participants (%s)</string>\n\t<!-- Kicked from groupchat: \"Kicked: {reason} -->\n\t<string name=\"muc_kicked\">Kicked: %s</string>\n\t<!-- Kicked from groupchat: \"Kicked by {admin name}: {reason} -->\n\t<string name=\"muc_kicked_by\">Kicked by %1$s: %2$s</string>\n\t<!-- Banned from groupchat: \"Banned: {reason} -->\n\t<string name=\"muc_banned\">Banned: %s</string>\n\t<!-- Banned from groupchat: \"Banned by {admin name}: {reason} -->\n\t<string name=\"muc_banned_by\">Banned by %1$s: %2$s</string>\n\n\t<!-- File upload -->\n\t<string name=\"roster_contextmenu_send\">Send…</string>\n\t<string name=\"roster_contextmenu_take_image\">Take picture</string>\n\t<string name=\"roster_contextmenu_send_image\">Choose picture</string>\n\t<string name=\"roster_contextmenu_send_file\">Send file</string>\n\t<string name=\"upload_compress\">Compressing picture…</string>\n\t<string name=\"upload_uploading\">Uploading…</string>\n\t<string name=\"upload_too_large\">file too large!</string>\n\t<string name=\"storage_permission\">%s needs storage access to send files!</string>\n\t<string name=\"notification_permission_denied\">Notifications are disabled in the Android app preferences.</string>\n\n\t<!-- Search -->\n\t<string name=\"search_msg_hint\">Message content</string>\n\n\t<!-- MUC bookmarks -->\n\t<string name=\"group_bookmarks\">My group chats</string>\n\t<string name=\"group_mucsearch\">Public group chats</string>\n\t<!-- Service Discovery -->\n\t<string name=\"title_service_disco\">Browser: %s</string>\n\n\t<!-- Android 9 notification preferences: permanent notification -->\n\t<string name=\"notification_status\">Foreground service</string>\n\t<!-- Android 9 notification preferences: message notifications -->\n\t<string name=\"notification_msg\">Messages</string>\n\n</resources>\n"
  },
  {
    "path": "res/values-zh-rCN/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\t<string name=\"app_name\">yaxim</string>\n\t<string name=\"app_name_bruno\">Bruno</string>\n\n\t<!-- Connection state -->\n\t<string name=\"conn_title\">yaxim: %s</string>\n\t<string name=\"conn_title_bruno\">Bruno: %s</string>\n\t<string name=\"conn_connecting\">正在连接到服务器…</string>\n\t<string name=\"conn_disconnecting\">正在断开连接…</string>\n\t<string name=\"conn_online\">在线</string>\n\t<string name=\"conn_offline\">离线</string>\n\t<string name=\"conn_empty_roster\">没有可显示的联系人！</string>\n\t<string name=\"conn_empty_roster_hints\">添加联系人的方法有多种：\\n\\n - Android Beam™：使用朋友的手机\\n\\n - 扫描二维码\\n\\n - \\“创建邀请\\”并分享（电子邮件、短信、二维码…）\\n\\n - 如果您知道 JID，则“添加联系人”</string>\n\t<string name=\"conn_reconnect\">%d 秒后尝试下一次连接。</string>\n\t<string name=\"conn_disconnected\">连接已关闭</string>\n\t<string name=\"conn_no_network\">无网络连接</string>\n\t<string name=\"conn_ping_timeout\">无响应</string>\n\t<string name=\"conn_error\">错误：%s</string>\n\n\t<!-- Global Strings -->\n\t<string name=\"Global_Exit\">退出</string>\n\t<string name=\"Global_authenticate_first\">请先连接</string>\n\t<string name=\"Global_JID_hint\">user@yax.im</string>\n\t<!-- tooltip message when the user entered an invalid XMPP address -->\n\t<string name=\"Global_JID_malformed\">请检查地址格式！</string>\n\n\t<!-- FirstStartUpDialog -->\n\t<string name=\"StartupDialog_Title\">欢迎使用 yaxim！</string>\n\t<string name=\"StartupDialog_Summary\">在使用 yaxim 之前，您需要对其进行配置。请输入您的 Jabber ID 和密码。</string>\n\t<string name=\"StartupDialog_pwHint\">输入密码</string>\n\t<string name=\"StartupDialog_pwshowHint\">显示密码</string>\n\t<string name=\"StartupDialog_Username_title\">Jabber ID:</string>\n\t<string name=\"StartupDialog_passwd_title\">密码：</string>\n\t<string name=\"StartupDialog_advanced\">高级…</string>\n\t<string name=\"StartupDialog_create_new\">注册新账号</string>\n\t<string name=\"StartupDialog_error_password\">密码太短！</string>\n\t<string name=\"StartupDialog_created_password\">已创建安全密码</string>\n\t<string name=\"StartupDialog_auth_failed\">请检查您的用户名和密码！</string>\n\t<string name=\"StartupDialog_server_failed\">无法连接到 %s！</string>\n\t<string name=\"StartupDialog_no_registration\">服务器不允许注册！</string>\n\n\t<string name=\"StartupDialog_invitation\">您已受邀加入 Jabber。请完成您的注册。</string>\n\t<string name=\"StartupDialog_no_more_accounts\">不支持额外账号！</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_message\">来自 %s 的消息</string>\n\t<string name=\"notification_anonymous_message\">消息已收到</string>\n\t<!--  Group Chat notification, %1$s is the user name, %2$s is the room, e.g. \"{Ge0rG} in {yaxim Chat}\" -->\n\t<string name=\"notification_muc_message\">%1$s 在 %2$s</string>\n\t<!--  Group Group Chat private message notification, %1$s is the user name, %2$s is the room, e.g. \"Message from {Ge0rG} in {yaxim Chat}\" -->\n\t<!--string name=\"notification_muc_pm\">Message from %1$s in %2$s</string-->\n\t<!-- notification button: direct reply (make SHORT string) -->\n\t<string name=\"notification_reply\">回复</string>\n\t<!-- notification button: mark as read (make SHORT string) -->\n\t<string name=\"notification_mark_read\">标记为已读</string>\n\n\t<!-- Notifications -->\n\t<string name=\"notification_error\">发送消息时出错！</string>\n\n\t<!-- Notification Settings -->\n\t<string name=\"preftitle_notify\">通知设置</string>\n\t<string name=\"preftitle_notify_msg\">消息通知</string>\n\t<string name=\"preftitle_notify_muc\">群聊通知</string>\n\t<string name=\"notification_custom\">自定义铃声</string>\n\t<string name=\"muc_highlight_title\">仅在提及时通知</string>\n\t<string name=\"muc_highlight_sum\">当群聊中提及您的昵称时通知</string>\n\t<string name=\"led_title\">闪烁 LED</string>\n\t<string name=\"led_summ\">收到消息时手机 LED 闪烁</string>\n\t<string name=\"vibr_title\">振动</string>\n\t<string name=\"vibr_summ\">收到消息时振动</string>\n\t<string-array name=\"vibr_values_displayed\">\n\t\t<item>永不</item>\n\t\t<item>系统首选项</item>\n\t\t<item>始终</item>\n\t</string-array>\n\t<string name=\"ringtone_title\">铃声</string>\n\t<string name=\"ringtone_summ\">收到消息的提示音</string>\n\t<string name=\"ticker_title\">消息预览</string>\n\t<string name=\"ticker_summ\">在状态栏中显示发送者和消息</string>\n\n\t<!-- Startup Setting Strings -->\n\t<string name=\"preftitle_general\">常规设置</string>\n\t<string name=\"pref_dnd_when_silent\">静音模式时“请勿打扰”</string>\n\t<string name=\"pref_dnd_when_silent_summ\">当您的手机处于静音模式时，将您的在线状态设置为“请勿打扰”</string>\n\t<string name=\"statuspopup_name\">设置您的状态</string>\n\t<string name=\"showOffline_summ\">始终显示联系人列表中的所有联系人</string>\n\t<string name=\"showOffline_title\">显示离线联系人</string>\n\t<string name=\"enableGroups_summ\">按联系人所在的组排列联系人</string>\n\t<string name=\"enableGroups_title\">显示联系人分组</string>\n\t<string name=\"foregroundService_summ\">将应用保留在内存中以确保始终处于连接状态（前台服务）</string>\n\t<string name=\"foregroundService_title\">状态栏图标</string>\n\n\t<string name=\"preftitle_debug\">调试</string>\n\t<string name=\"smackdebug_summ\">通过 logcat 进行数据包和调试输出（可能包含个人信息）</string>\n\t<string name=\"smackdebug_title\">SMACK 调试</string>\n\n\t<string name=\"reportcrash_title\">发送崩溃报告</string>\n\t<string name=\"reportcrash_summ\">向开发人员发送匿名崩溃报告</string>\n\n\t<!-- Appearence Strings -->\n\t<string name=\"preftitle_app\">外观</string>\n\t<string name=\"FontChat_title\">聊天字体大小</string>\n\t<string name=\"FontChat_summ\">设置聊天字体大小</string>\n\t<string name=\"FontChat_dialog\">聊天字体大小</string>\n\t<!--\n\t<string name=\"FontRost_title\">Roster font size</string>\n\t<string name=\"FontRost_summ\">Set roster font size</string>\n\t<string name=\"FontRost_dialog\">Roster font fize</string>\n\t<string name=\"setFontRoster\">Set roster font size</string>\n\t-->\n\t<string name=\"pref_theme\">主题</string>\n\t<string name=\"pref_theme_dark\">深色</string>\n\t<string name=\"pref_theme_light\">浅色</string>\n\t<string name=\"pref_theme_pine\">松绿</string>\n\t<string name=\"pref_theme_ice\">冰蓝</string>\n\t<string name=\"preftitle_ui\">外观</string>\n\t<string-array name=\"fontSizesChat\">\n\t\t<item>小</item>\n\t\t<item>中</item>\n\t\t<item>大</item>\n\t\t<item>巨大</item>\n\t</string-array>\n\n\t<!-- Mainmenu \t-->\n\t<string name=\"Menu_addFriend\">添加联系人</string>\n\t<string name=\"Menu_addClipboard\">添加 %s</string>\n\t<string name=\"Menu_ShowOff\">显示离线</string>\n\t<string name=\"Menu_HideOff\">隐藏离线</string>\n\t<string name=\"Menu_AccSettings\">编辑账号</string>\n\t<string name=\"Menu_Settings\">设置</string>\n\t<string name=\"Menu_Status\">状态</string>\n\t<string name=\"Menu_connect\">连接</string>\n\t<string name=\"Menu_disconnect\">断开连接</string>\n\t<string name=\"Menu_about\">关于 yaxim</string>\n\t<string name=\"Menu_about_bruno\">关于 Bruno</string>\n\t<string name=\"Menu_muc\">添加/浏览…</string>\n\t<string name=\"Menu_matrix\">进入 Matrix…</string>\n\t<string name=\"Menu_mark_all_as_read\">全部标记为已读</string>\n\t<string name=\"Menu_send_invitation\">创建邀请</string>\n    <string name=\"Menu_userlist\">参与者</string>\n\n\n\t<!-- AddFriend -->\n\t<string name=\"addFriend_Title\">添加联系人</string>\n\t<string name=\"addFriend_Summ\">请输入您好友的 Jabber ID、所需的屏幕名称并选择他们的联系人分组！</string>\n\t<string name=\"addFriend_aliasHint\">屏幕名称</string>\n\t<string name=\"addrosteritemaddgroupchoice\">添加到新分组</string>\n\t<string name=\"NewGroup_EditTextField_Hint\">新的分组名</string>\n\n\t<!-- Roster CONTEXTMENU -->\n\t<string name=\"roster_contextmenu_group_rename\">重命名分组</string>\n\t<string name=\"roster_contextmenu_contact_mark_as_read\">标记为已读</string>\n\t<string name=\"roster_contextmenu_contact_delete\">删除联系人</string>\n\t<string name=\"roster_contextmenu_contact_delmsg\">删除聊天记录</string>\n\t<string name=\"roster_contextmenu_contact_rename\">重命名</string>\n\t<string name=\"roster_contextmenu_contact_request_auth\">请求授权</string>\n\t<string name=\"roster_contextmenu_contact_change_group\">更改分组</string>\n\t<string name=\"roster_contextmenu_contact_share\">分享地址</string>\n\t<string name=\"roster_contextmenu_contact_ringtone\">铃声</string>\n\t<string name=\"roster_contextmenu_muc_edit\">编辑群聊</string>\n\t<string name=\"roster_contextmenu_muc_leave\">离开群聊</string>\n\t<string name=\"muc_leave_question\">确定离开 %s？</string>\n\n\t<!-- Accountprefs -->\n\t<string name=\"account_settings_login\">登录信息</string>\n\t<string name=\"account_settings_title\">账号设置</string>\n\t<string name=\"account_options_title\">连接选项</string>\n\t<string name=\"account_options_advanced\">高级选项</string>\n\t<string name=\"carbons_title\">消息抄送（XEP-0280）</string>\n\t<string name=\"carbons_summ\">从其他客户端请求消息副本</string>\n\t<string name=\"account_jabberID_title\">Jabber ID</string>\n\t<string name=\"account_jabberID_sum\">example: me@jabber.example.com</string>\n\t<string name=\"account_jabberID_dialog_title\">输入 Jabber ID：</string>\n\t<string name=\"account_jabberPW_title\">账号密码</string>\n\t<string name=\"account_jabberPW_sum\">您的 Jabber 账号密码</string>\n\t<string name=\"account_jabberPW_change_on_server\">在服务器上更改密码</string>\n\t<string name=\"account_jabberPW_password_old\">旧密码：</string>\n\t<string name=\"account_jabberPW_password_new\">新密码：</string>\n\t<string name=\"account_jabberPW_warning\">警告！要成功登录，您还必须在服务器上设置相同的密码！</string>\n\t<string name=\"account_jabberPW_progress\">请稍候，正在更改密码…</string>\n\t<string name=\"account_jabberPW_finished\">密码已成功更改。</string>\n\t<string name=\"account_jabberPW_error\">更改密码时出错：%s</string>\n\t<string name=\"account_nickname_title\">显示名称</string>\n\t<string name=\"account_nickname_summ\">您向其他用户显示的昵称</string>\n\t\n\t<!-- accountprefs -->\n\t<string name=\"account_resource_title\">客户端资源</string>\n\t<string name=\"account_resource_summ\">默认：yaxim</string>\n\t<string name=\"account_resource_dialog_title\">输入资源：</string>\n\t<string name=\"account_resource_hint\">yaxim</string>\n\t<string name=\"account_prio_title\">客户端优先级</string>\n\t<string name=\"account_prio_summ\">默认：0（允许：-128 … 127）</string>\n\t<string name=\"account_prio_error\">允许值：-128 … 127</string>\n\t<string name=\"account_prio_dialog_title\">输入优先级：</string>\n\t<string name=\"account_port_title\">服务器端口</string>\n\t<string name=\"account_port_sum\">默认：5222</string>\n\t<string name=\"account_port_dialog_title\">输入服务器端口：</string>\n\t<string name=\"account_port_hint\">5222</string>\n\t<string name=\"account_customserver_title\">自定义服务器</string>\n\t<string name=\"account_customserver_summ\">（可选）备用服务器主机名</string>\n\t<string name=\"account_customserver_dialog_title\">输入服务器主机名：</string>\n\t<string name=\"account_customserver_hint\">host.example.com</string>\n\t<string name=\"require_ssl_title\">需要 SSL/TLS</string>\n\t<string name=\"require_ssl_summ\">始终加密服务器连接</string>\n\n\t<!--StatusPopUp-->\n\t<string name=\"AddContact_SpinnerPrompt\">选择分组</string>\n\t<string name=\"setStatusmsgHint\">您的状态信息</string>\n\t<string name=\"setStatusTitle\">设置您的状态</string>\n\t<string name=\"RenameGroup_summ\">将分组 %s 重命名为：</string>\n\t<string name=\"RenameGroup_title\">重命名分组</string>\n\t<string name=\"RenameEntry_summ\">重命名 %1$s (%2$s) 为：</string>\n\t<string name=\"RenameEntry_title\">重命名联系人</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_summ\">从下方选择分组</string>\n\t<string name=\"MoveRosterEntryToGroupDialog_title\">更改分组</string>\n\t<string name=\"deleteRosterItem_text\">确定移除 %1$s (%2$s)？</string>\n\t<string name=\"deleteRosterItem_title\">删除联系人</string>\n\t<string name=\"deleteChatHistory_text\">确定移除所有与 %1$s (%2$s) 的消息？</string>\n\t<string name=\"deleteChatHistory_title\">删除聊天记录</string>\n\t<string name=\"subscriptionRequest_text\">%1$s 想将您添加为联系人：“%2$s”</string>\n\t<string name=\"subscriptionRequest_title\">订阅请求</string>\n\t<string name=\"subscription_accept\">接受</string>\n\t<string name=\"subscription_reject\">拒绝</string>\n\t<string name=\"subscription_reject_all\">全部拒绝</string>\n\t<string name=\"subscription_status_from\">可以看到您的状态</string>\n\n\t<!-- CHATWINDOW -->\n\t<string name=\"chat_from_me\">我：</string>\n\t<string name=\"toast_stored_offline\">此消息已存储以供传输。</string>\n\t<string name=\"chat_enterMsgHint\">输入消息</string> \n\n\t<!-- Message context menu; use the verb form (to quote) -->\n\t<string name=\"chatmenu_quote\">引用</string>\n\t<!-- Message context menu: repeat the same message -->\n\t<string name=\"chatmenu_resend\">编辑消息</string>\n\n\t<!-- GPS settings -->\n\t<!--\n\t<string name=\"showGPS_title\">GPS to status</string>\n\t<string name=\"showGPS_summ_on\">GPS is send to StatusMessage</string>\n\t<string name=\"showGPS_summ_off\">GPS is send to StatusMessage</string>\n\t-->\n\n\t<!-- About Dialog -->\n\t<string name=\"AboutDialog_title\">关于 yaxim</string>\n\t<string name=\"AboutDialog_DevelopersTitle\">开发人员</string>\n\t<!-- Contact the developer button -->\n\t<string name=\"AboutDialog_DevelopersText\">联系</string>\n\t<string name=\"AboutDialog_LicenceTitle\">许可</string>\n\t<string name=\"AboutDialog_Vote\">评价此应用</string>\n\t<string name=\"AboutDialog_LicenceText\">This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. Link: http://www.gnu.org/licenses/gpl-2.0.html\\n \\n Parts of this software are provided under the MIT License:\\n \\n Copyright © 2009 Mads Kristiansen, Nullwire ApS\\n \\n Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: \\n The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. \\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</string>\n\n\t<string name=\"status_available\">在线</string>\n\t<string name=\"status_away\">离开</string>\n\t<string name=\"status_chat\">有空聊天</string>\n\t<string name=\"status_dnd\">请勿打扰</string>\n\t<string name=\"status_xa\">没空</string>\n\t<string name=\"status_offline\">离线</string>\n\n\t<string name=\"translator_credits\">Launchpad Contributions:\n  Chasel Li https://launchpad.net/~chasel-java\n  Frank Tang https://launchpad.net/~roadtang\n  Mariotaku https://launchpad.net/~mariotaku\n  Strongman6987 https://launchpad.net/~strongman6987\n  wangbin https://launchpad.net/~wangbin-zibo</string>\n\n\t<!-- default roster group with no name -->\n\t<string name=\"default_group\">常规</string>\n\t<string name=\"all_contacts_group\">全部联系人</string>\n\t<string name=\"muc_group\">群聊</string>\n\n\t<!-- SEND listener popup -->\n\t<string name=\"chooseContact\">选择联系人</string>\n\t<string name=\"action_settings\">设置</string>\n\n\t<!-- MUC strings -->\n\t<string name=\"muc_jid_hint\">群聊 JID</string>\n\t<string name=\"muc_nickname_hint\">昵称</string>\n\t<string name=\"muc_password_hint\">密码（可选）</string>\n\t<string name=\"title_activity_muc_invite\">群聊邀请</string>\n\t<!-- Groupchat invitation: \"Invitation from {contact name}\" -->\n\t<string name=\"muc_invitation_from\">来自 %s 的邀请</string>\n\t<!-- Groupchat info: {description} ({number} participants) -->\n\t<string name=\"muc_invitation_occupants\">%1$s（%2$d 位参与者）</string>\n\t<!-- Notification button: \"Join as {default nickname}\" (make SHORT string) -->\n\t<string name=\"muc_invitation_join\">作为 %s 加入</string>\n\t<string name=\"muc_synchronizing\">正在同步…</string>\n\t<!-- Title of user list, contains JID -->\n\t<string name=\"chat_muc_userlist\">群聊参与者（%s）</string>\n\t<!-- Kicked from groupchat: \"Kicked: {reason} -->\n\t<string name=\"muc_kicked\">已踢出：%s</string>\n\t<!-- Kicked from groupchat: \"Kicked by {admin name}: {reason} -->\n\t<string name=\"muc_kicked_by\">由 %1$s 踢出：%2$s</string>\n\t<!-- Banned from groupchat: \"Banned: {reason} -->\n\t<string name=\"muc_banned\">已封禁：%s</string>\n\t<!-- Banned from groupchat: \"Banned by {admin name}: {reason} -->\n\t<string name=\"muc_banned_by\">由 %1$s 封禁：%2$s</string>\n\n\t<!-- File upload -->\n\t<string name=\"roster_contextmenu_send\">发送…</string>\n\t<string name=\"roster_contextmenu_take_image\">拍摄照片</string>\n\t<string name=\"roster_contextmenu_send_image\">选择图片</string>\n\t<string name=\"roster_contextmenu_send_file\">发送文件</string>\n\t<string name=\"upload_compress\">正在压缩图片…</string>\n\t<string name=\"upload_uploading\">正在上传…</string>\n\t<string name=\"upload_too_large\">文件太大！</string>\n\t<string name=\"storage_permission\">%s 需要访问存储权限才能发送文件！</string>\n\t<string name=\"notification_permission_denied\">Notifications are disabled in the Android app preferences.</string>\n\n\t<!-- Search -->\n\t<string name=\"search_msg_hint\">消息内容</string>\n\n\t<!-- MUC bookmarks -->\n\t<string name=\"group_bookmarks\">我的群聊</string>\n\t<string name=\"group_mucsearch\">公开群聊</string>\n\t<!-- Service Discovery -->\n\t<string name=\"title_service_disco\">浏览：%s</string>\n\n\t<!-- Android 9 notification preferences: permanent notification -->\n\t<string name=\"notification_status\">前台服务</string>\n\t<!-- Android 9 notification preferences: message notifications -->\n\t<string name=\"notification_msg\">消息</string>\n\n</resources>\n"
  },
  {
    "path": "res/xml/accountprefs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<PreferenceScreen\n\txmlns:android=\"http://schemas.android.com/apk/res/android\">\n\t<PreferenceCategory android:title=\"@string/account_settings_login\">\n\t\t<org.yaxim.androidclient.preferences.EditTextPreferenceWithValue\n\t\t\tandroid:id=\"@+id/account_jabberID\"\n\t\t\tandroid:key=\"account_jabberID\"\n\t\t\tandroid:title=\"@string/account_jabberID_title\"\n\t\t\tandroid:summary=\"@string/account_jabberID_sum\"\n\t\t\tandroid:dialogTitle=\"@string/account_jabberID_dialog_title\"\n\t\t\tandroid:hint=\"@string/Global_JID_hint\"\n\t\t\tandroid:singleLine=\"true\"\n\t\t\tandroid:inputType=\"textEmailAddress\"\n\t\t />\n\t\t<Preference\n\t\t\tandroid:id=\"@+id/account_jabberPW\"\n\t\t\tandroid:key=\"account_jabberPW\"\n\t\t\tandroid:title=\"@string/account_jabberPW_title\"\n\t\t\tandroid:summary=\"@string/account_jabberPW_sum\" \n\t\t />\n\t\t<org.yaxim.androidclient.preferences.EditTextPreferenceWithValue\n\t\t\tandroid:id=\"@+id/account_screenname\"\n\t\t\tandroid:key=\"screen_name\"\n\t\t\tandroid:title=\"@string/account_nickname_title\"\n\t\t\tandroid:summary=\"@string/account_nickname_summ\"\n\t\t\tandroid:dialogTitle=\"@string/account_nickname_title\"\n\t\t\tandroid:singleLine=\"true\"\n\t\t/>\n\t</PreferenceCategory>\n\t<PreferenceCategory android:title=\"@string/account_options_title\">\n\t\t<CheckBoxPreference\n\t\t\tandroid:id=\"@+id/carbons\"\n\t\t\tandroid:key=\"carbons\"\n\t\t\tandroid:defaultValue=\"true\"\n\t\t\tandroid:title=\"@string/carbons_title\"\n\t\t\tandroid:summary=\"@string/carbons_summ\"\n\t\t/>\n\t</PreferenceCategory>\n\t<PreferenceCategory android:title=\"@string/account_options_advanced\">\n\t\t<org.yaxim.androidclient.preferences.EditTextPreferenceWithValue\n\t\t\tandroid:id=\"@+id/account_resource\"\n\t\t\tandroid:key=\"account_resource\"\n\t\t\tandroid:title=\"@string/account_resource_title\"\n\t\t\tandroid:summary=\"@string/account_resource_summ\" \n\t\t\tandroid:dialogTitle=\"@string/account_resource_dialog_title\"\n\t\t\tandroid:singleLine=\"true\"\n\t\t\tandroid:hint=\"@string/account_resource_hint\"\n\t\t />\n\t\t<org.yaxim.androidclient.preferences.EditTextPreferenceWithValue\n\t\t\tandroid:id=\"@+id/account_prio\"\n\t\t\tandroid:key=\"account_prio\"\n\t\t\tandroid:title=\"@string/account_prio_title\"\n\t\t\tandroid:summary=\"@string/account_prio_summ\"\n\t\t\tandroid:dialogTitle=\"@string/account_prio_dialog_title\"\n\t\t\tandroid:singleLine=\"true\"\n\t\t\tandroid:numeric=\"integer|signed\"\n\t\t/>\t\n\t\t<org.yaxim.androidclient.preferences.EditTextPreferenceWithValue\n\t\t\tandroid:id=\"@+id/account_customserver\"\n\t\t\tandroid:key=\"account_customserver\"\n\t\t\tandroid:title=\"@string/account_customserver_title\"\n\t\t\tandroid:summary=\"@string/account_customserver_summ\"\n\t\t\tandroid:dialogTitle=\"@string/account_customserver_dialog_title\"\n\t\t\tandroid:hint=\"@string/account_customserver_hint\"\n\t\t\tandroid:singleLine=\"true\"\n\t\t\tandroid:inputType=\"textUri\"\n\t\t/>\t\n\t\t<org.yaxim.androidclient.preferences.EditTextPreferenceWithValue\n\t\t\tandroid:id=\"@+id/account_port\"\n\t\t\tandroid:key=\"account_port\"\n\t\t\tandroid:title=\"@string/account_port_title\"\n\t\t\tandroid:summary=\"@string/account_port_sum\"\n\t\t\tandroid:dialogTitle=\"@string/account_port_dialog_title\"\n\t\t\tandroid:hint=\"@string/account_port_hint\"\n\t\t\tandroid:singleLine=\"true\"\n\t\t\tandroid:numeric=\"integer\"\n\t\t/>\t\n\t\t<CheckBoxPreference\n\t\t\tandroid:id=\"@+id/require_ssl\"\n\t\t\tandroid:key=\"require_ssl\"\n\t\t\tandroid:defaultValue=\"true\"\n\t\t\tandroid:title=\"@string/require_ssl_title\"\n\t\t\tandroid:summary=\"@string/require_ssl_summ\"\n\t\t/>\n\t</PreferenceCategory>\n</PreferenceScreen>\n"
  },
  {
    "path": "res/xml/automotive_app_desc.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<automotiveApp>\n\t<uses name=\"notification\"/>\n</automotiveApp>\n"
  },
  {
    "path": "res/xml/mainprefs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<PreferenceScreen\n\txmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n\t<PreferenceCategory android:title=\"@string/account_settings_title\">\n\t<PreferenceScreen\n\t\tandroid:title=\"@string/Menu_AccSettings\"\n\t\tandroid:summary=\"\">\n\n\t\t<intent android:action=\"android.intent.action.MAIN\"\n\t\t\tandroid:targetPackage=\"@string/application_id\"\n\t\t\tandroid:targetClass=\"org.yaxim.androidclient.preferences.AccountPrefs\" />\n\t</PreferenceScreen>\n\t</PreferenceCategory>\n\n\t<PreferenceCategory android:title=\"@string/preftitle_notify\">\n\t\t<PreferenceScreen\n\t\t\tandroid:title=\"@string/preftitle_notify_msg\"\n\t\t\tandroid:summary=\"\">\n\n\t\t\t<intent android:action=\"android.intent.action.MAIN\"\n\t\t\t\t\tandroid:targetPackage=\"@string/application_id\"\n\t\t\t\t\tandroid:targetClass=\"org.yaxim.androidclient.preferences.NotificationPrefs\" />\n\t\t</PreferenceScreen>\n\t\t<PreferenceScreen\n\t\t\tandroid:title=\"@string/preftitle_notify_muc\"\n\t\t\tandroid:summary=\"\">\n\n\t\t\t<intent android:action=\"android.intent.action.MAIN\"\n\t\t\t\t\tandroid:data=\"muc\"\n\t\t\t\t\tandroid:targetPackage=\"@string/application_id\"\n\t\t\t\t\tandroid:targetClass=\"org.yaxim.androidclient.preferences.NotificationPrefs\" />\n\t\t</PreferenceScreen>\n\t</PreferenceCategory>\n\t<PreferenceCategory android:title=\"@string/preftitle_general\">\n\t\t<CheckBoxPreference\n\t\t\tandroid:id=\"@+id/dndInSilent\"\n\t\t\tandroid:key=\"status_dndsilent\"\n\t\t\tandroid:title=\"@string/pref_dnd_when_silent\"\n\t\t\tandroid:summary=\"@string/pref_dnd_when_silent_summ\"\n\t\t\tandroid:defaultValue=\"true\"\n\t\t/>\n\t\t<CheckBoxPreference\n\t\t\tandroid:id=\"@+id/showOffline\"\n\t\t\tandroid:key=\"showOffline\"\n\t\t\tandroid:title=\"@string/showOffline_title\"\n\t\t\tandroid:summary=\"@string/showOffline_summ\"\n\t\t\tandroid:defaultValue=\"true\"\n\t\t/>\n\t\t<CheckBoxPreference\n\t\t\tandroid:id=\"@+id/foregroundService\"\n\t\t\tandroid:key=\"foregroundService\"\n\t\t\tandroid:title=\"@string/foregroundService_title\"\n\t\t\tandroid:summary=\"@string/foregroundService_summ\"\n\t\t\tandroid:defaultValue=\"true\"\n\t\t/>\t\n\t</PreferenceCategory>\n\t<PreferenceCategory android:title=\"@string/preftitle_app\">\n\t\t<ListPreference android:title=\"@string/pref_theme\"\n\t\t    android:entryValues=\"@array/pref_theme_values\"\n\t\t    android:entries=\"@array/pref_theme_entries\"\n\t\t    android:defaultValue=\"dark\"\n\t\t    android:key=\"theme\">\n\t\t</ListPreference>\n\t\t<ListPreference\n\t\t\tandroid:id=\"@+id/setSizeChat\"\n\t\t\tandroid:key=\"setSizeChat\"\n\t\t\tandroid:title=\"@string/FontChat_title\"\n\t\t\tandroid:summary=\"@string/FontChat_summ\"\n\t\t\tandroid:entries=\"@array/fontSizesChat\"\n\t\t\tandroid:entryValues=\"@array/fontSizesChatCodes\"\n\t\t\tandroid:dialogTitle=\"@string/FontChat_dialog\"\n\t\t    android:defaultValue=\"18\"\n\t\t/>\n\t\t<CheckBoxPreference\n\t\t\tandroid:id=\"@+id/enableGroups\"\n\t\t\tandroid:key=\"enableGroups\"\n\t\t\tandroid:title=\"@string/enableGroups_title\"\n\t\t\tandroid:summary=\"@string/enableGroups_summ\"\n\t\t\tandroid:defaultValue=\"true\"\n\t\t/>\n\t</PreferenceCategory>\n\t<PreferenceCategory android:title=\"@string/preftitle_debug\">\n\t\t<CheckBoxPreference\n\t\t\tandroid:id=\"@+id/smackdebug\"\n\t\t\tandroid:key=\"smackdebug\"\n\t\t\tandroid:title=\"@string/smackdebug_title\"\n\t\t\tandroid:summary=\"@string/smackdebug_summ\"\n\t\t\tandroid:defaultValue=\"false\"\n\t\t/>\n\t\t\n\t\t<CheckBoxPreference\n\t\t\tandroid:id=\"@+id/reportcrash\"\n\t\t\tandroid:key=\"reportcrash\"\n\t\t\tandroid:title=\"@string/reportcrash_title\"\n\t\t\tandroid:summary=\"@string/reportcrash_summ\"\n\t\t\tandroid:defaultValue=\"false\"\n\t\t/>\t\n\t</PreferenceCategory>\n\t<!--<PreferenceCategory android:title=\"@string/preftitle_app\">\n\t\t<ListPreference\n\t\t\tandroid:id=\"@+id/setSizeClist\"\n\t\t\tandroid:key=\"setSizeClist\"\n\t\t\tandroid:title=\"@string/FontRost_title\"\n\t\t\tandroid:summary=\"@string/FontChat_summ\"\n\t\t\tandroid:entries=\"@array/fontSizesClist\"\n\t\t\tandroid:entryValues=\"@array/fontSizesClistCodes\"\n\t\t\tandroid:dialogTitle=\"@string/FontChat_dialog\"\n\t\t/>\n\t</PreferenceCategory>\n--></PreferenceScreen>\n\n\n"
  },
  {
    "path": "res/xml/notificationprefs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<PreferenceScreen\n\txmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n        <!-- override MUST be FIRST preference for dependency injection to work -->\n\t\t<CheckBoxPreference\n\t\t\tandroid:id=\"@+id/override\"\n\t\t\tandroid:key=\"override\"\n\t\t\tandroid:title=\"@string/notification_custom\"\n\t\t\tandroid:summary=\"\"\n\t\t\tandroid:defaultValue=\"false\"\n\t\t\t/>\n\t\t<CheckBoxPreference\n\t\t\tandroid:id=\"@+id/highlight\"\n\t\t\tandroid:key=\"highlight\"\n\t\t\tandroid:title=\"@string/muc_highlight_title\"\n\t\t\tandroid:summary=\"@string/muc_highlight_sum\"\n\t\t\tandroid:defaultValue=\"true\"\n\t\t\t/>\n\t\t<CheckBoxPreference\n\t\t\tandroid:id=\"@+id/led\"\n\t\t\tandroid:key=\"led\"\n\t\t\tandroid:title=\"@string/led_title\"\n\t\t\tandroid:summary=\"@string/led_summ\"\n\t\t\tandroid:defaultValue=\"true\"\n\t\t/>\n\t\t<ListPreference\n\t\t\tandroid:id=\"@+id/vibration\"\n\t\t\tandroid:title=\"@string/vibr_title\"\n\t\t\tandroid:summary=\"@string/vibr_summ\"\n\t\t\tandroid:key=\"vibration_list\"\n\t\t\tandroid:defaultValue=\"OFF\"\n\t\t\tandroid:entries=\"@array/vibr_values_displayed\"\n\t\t\tandroid:entryValues=\"@array/vibr_values\"\n\t\t/>\n\t\t<RingtonePreference\n\t\t\tandroid:id=\"@+id/ringtone\"\n\t\t\tandroid:key=\"ringtone\"\n\t\t\tandroid:title=\"@string/ringtone_title\"\n\t\t\tandroid:ringtoneType=\"notification\"\n\t\t\tandroid:showDefault=\"true\"\n\t\t\tandroid:showSilent=\"true\"\n\t\t\tandroid:summary=\"@string/ringtone_summ\"\n\t\t/>\n\t\t<CheckBoxPreference\n\t\t\tandroid:id=\"@+id/ticker\"\n\t\t\tandroid:key=\"ticker\"\n\t\t\tandroid:title=\"@string/ticker_title\"\n\t\t\tandroid:summary=\"@string/ticker_summ\"\n\t\t\tandroid:defaultValue=\"true\"\n\t\t/>\n</PreferenceScreen>\n\n\n"
  },
  {
    "path": "res/xml/provider_paths.xml",
    "content": "<paths xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\t<external-files-path name=\"pics\" path=\"Pictures/\"/>\n</paths>\n"
  },
  {
    "path": "settings.gradle",
    "content": "include ':MemorizingTrustManager'\n"
  },
  {
    "path": "src/eu/siacs/conversations/ui/text/DividerSpan.java",
    "content": "package eu.siacs.conversations.ui.text;\n\nimport android.text.TextPaint;\nimport android.text.style.MetricAffectingSpan;\n\npublic class DividerSpan extends MetricAffectingSpan {\n\n\tprivate static final float PROPORTION = 0.3f;\n\n\tprivate final boolean large;\n\n\tpublic DividerSpan(boolean large) {\n\t\tthis.large = large;\n\t}\n\n\tpublic boolean isLarge() {\n\t\treturn large;\n\t}\n\n\t@Override\n\tpublic void updateDrawState(TextPaint tp) {\n\t\ttp.setTextSize(tp.getTextSize() * PROPORTION);\n\t}\n\n\t@Override\n\tpublic void updateMeasureState(TextPaint p) {\n\t\tp.setTextSize(p.getTextSize() * PROPORTION);\n\t}\n}"
  },
  {
    "path": "src/eu/siacs/conversations/ui/text/QuoteSpan.java",
    "content": "package eu.siacs.conversations.ui.text;\n\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.support.annotation.ColorInt;\nimport android.text.Layout;\nimport android.text.TextPaint;\nimport android.text.style.CharacterStyle;\nimport android.text.style.LeadingMarginSpan;\nimport android.util.DisplayMetrics;\nimport android.util.TypedValue;\n\npublic class QuoteSpan extends CharacterStyle implements LeadingMarginSpan {\n\n\tprivate final int color;\n\n\tprivate final int width;\n\tprivate final int paddingLeft;\n\tprivate final int paddingRight;\n\n\tprivate static final float WIDTH_SP = 2f;\n\tprivate static final float PADDING_LEFT_SP = 1.5f;\n\tprivate static final float PADDING_RIGHT_SP = 8f;\n\n\tpublic QuoteSpan(int color, DisplayMetrics metrics) {\n\t\tthis.color = color;\n\t\tthis.width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, WIDTH_SP, metrics);\n\t\tthis.paddingLeft = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, PADDING_LEFT_SP, metrics);\n\t\tthis.paddingRight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, PADDING_RIGHT_SP, metrics);\n\t}\n\n\t@Override\n\tpublic void updateDrawState(TextPaint tp) {\n\t\ttp.setColor(this.color);\n\t}\n\n\t@Override\n\tpublic int getLeadingMargin(boolean first) {\n\t\treturn paddingLeft + width + paddingRight;\n\t}\n\n\t@Override\n\tpublic void drawLeadingMargin(Canvas c, Paint p, int x, int dir, int top, int baseline, int bottom,\n\t\t\tCharSequence text, int start, int end, boolean first, Layout layout) {\n\t\tPaint.Style style = p.getStyle();\n\t\tint color = p.getColor();\n\t\tp.setStyle(Paint.Style.FILL);\n\t\tp.setColor(this.color);\n\t\tc.drawRect(x + dir * paddingLeft, top, x + dir * (paddingLeft + width), bottom, p);\n\t\tp.setStyle(style);\n\t\tp.setColor(color);\n\t}\n\n\t@ColorInt\n\tpublic int getColor() {\n\t\treturn this.color;\n\t}\n}"
  },
  {
    "path": "src/eu/siacs/conversations/utils/ImStyleParser.java",
    "content": "/*\n * Copyright (c) 2017, Daniel Gultsch All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n *\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\npackage eu.siacs.conversations.utils;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\n\npublic class ImStyleParser {\n\n\tprivate final static List<Character> KEYWORDS = Arrays.asList('*', '_', '~', '`');\n\tprivate final static List<Character> NO_SUB_PARSING_KEYWORDS = Arrays.asList('`');\n\tprivate final static List<Character> BLOCK_KEYWORDS = Arrays.asList('`');\n\tprivate final static boolean ALLOW_EMPTY = false;\n\n\tpublic static List<Style> parse(CharSequence text) {\n\t\treturn parse(text, 0, text.length() - 1);\n\t}\n\n\tpublic static List<Style> parse(CharSequence text, int start, int end) {\n\t\tList<Style> styles = new ArrayList<>();\n\t\tfor (int i = start; i <= end; ++i) {\n\t\t\tchar c = text.charAt(i);\n\t\t\tif (KEYWORDS.contains(c) && precededByWhiteSpace(text, i, start) && !followedByWhitespace(text, i, end)) {\n\t\t\t\tif (BLOCK_KEYWORDS.contains(c) && isCharRepeatedTwoTimes(text, c, i + 1, end)) {\n\t\t\t\t\tint to = seekEndBlock(text, c, i + 3, end);\n\t\t\t\t\tif (to != -1 && (to != i + 5 || ALLOW_EMPTY)) {\n\t\t\t\t\t\tString keyword = String.valueOf(c) + String.valueOf(c) + String.valueOf(c);\n\t\t\t\t\t\tstyles.add(new Style(keyword, i, to));\n\t\t\t\t\t\ti = to;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tint to = seekEnd(text, c, i + 1, end);\n\t\t\t\tif (to != -1 && (to != i + 1 || ALLOW_EMPTY)) {\n\t\t\t\t\tstyles.add(new Style(c, i, to));\n\t\t\t\t\tif (!NO_SUB_PARSING_KEYWORDS.contains(c)) {\n\t\t\t\t\t\tstyles.addAll(parse(text, i + 1, to - 1));\n\t\t\t\t\t}\n\t\t\t\t\ti = to;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn styles;\n\t}\n\n\tprivate static boolean isCharRepeatedTwoTimes(CharSequence text, char c, int index, int end) {\n\t\treturn index + 1 <= end && text.charAt(index) == c && text.charAt(index+1) == c;\n\t}\n\n\tprivate static boolean precededByWhiteSpace(CharSequence text, int index, int start) {\n\t\treturn index == start || Character.isWhitespace(text.charAt(index - 1));\n\t}\n\n\tprivate static boolean followedByWhitespace(CharSequence text, int index, int end) {\n\t\treturn index >= end || Character.isWhitespace(text.charAt(index + 1));\n\t}\n\n\tprivate static int seekEnd(CharSequence text, char needle, int start, int end) {\n\t\tfor (int i = start; i <= end; ++i) {\n\t\t\tchar c = text.charAt(i);\n\t\t\tif (c == needle && !Character.isWhitespace(text.charAt(i - 1))) {\n\t\t\t\treturn i;\n\t\t\t} else if (c == '\\n') {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\n\n\tprivate static int seekEndBlock(CharSequence text, char needle, int start, int end) {\n\t\tfor (int i = start; i <= end; ++i) {\n\t\t\tchar c = text.charAt(i);\n\t\t\tif (c == needle && isCharRepeatedTwoTimes(text, needle, i + 1, end)) {\n\t\t\t\treturn i + 2;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\n\n\tpublic static class Style {\n\n\t\tprivate final String keyword;\n\t\tprivate final int start;\n\t\tprivate final int end;\n\n\t\tpublic Style(char character, int start, int end) {\n\t\t\tthis(String.valueOf(character), start, end);\n\t\t}\n\n\t\tpublic Style(String keyword, int start, int end) {\n\t\t\tthis.keyword = keyword;\n\t\t\tthis.start = start;\n\t\t\tthis.end = end;\n\t\t}\n\n\t\tpublic String getKeyword() {\n\t\t\treturn keyword;\n\t\t}\n\n\t\tpublic int getStart() {\n\t\t\treturn start;\n\t\t}\n\n\t\tpublic int getEnd() {\n\t\t\treturn end;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/eu/siacs/conversations/utils/StylingHelper.java",
    "content": "/*\n * Copyright (c) 2017, Daniel Gultsch All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation and/or\n * other materials provided with the distribution.\n *\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\npackage eu.siacs.conversations.utils;\n\nimport android.graphics.Color;\nimport android.graphics.Typeface;\nimport android.support.annotation.ColorInt;\nimport android.text.Editable;\nimport android.text.ParcelableSpan;\nimport android.text.Spannable;\nimport android.text.SpannableStringBuilder;\nimport android.text.Spanned;\nimport android.text.TextWatcher;\nimport android.text.style.ForegroundColorSpan;\nimport android.text.style.RelativeSizeSpan;\nimport android.text.style.StrikethroughSpan;\nimport android.text.style.StyleSpan;\nimport android.text.style.TypefaceSpan;\nimport android.util.DisplayMetrics;\nimport android.widget.EditText;\n\nimport org.yaxim.androidclient.util.MessageStylingHelper;\n\nimport java.util.Arrays;\nimport java.util.List;\n\nimport eu.siacs.conversations.ui.text.DividerSpan;\nimport eu.siacs.conversations.ui.text.QuoteSpan;\n\npublic class StylingHelper {\n\n\tprivate static List<? extends Class<? extends ParcelableSpan>> SPAN_CLASSES = Arrays.asList(\n\t\t\tRelativeSizeSpan.class,\n\t\t\tStyleSpan.class,\n\t\t\tStrikethroughSpan.class,\n\t\t\tTypefaceSpan.class,\n\t\t\tForegroundColorSpan.class\n\t);\n\n\tpublic static void clear(final Editable editable) {\n\t\tfinal int end = editable.length() - 1;\n\t\tfor (Class<? extends ParcelableSpan> clazz : SPAN_CLASSES) {\n\t\t\tfor (ParcelableSpan span : editable.getSpans(0, end, clazz)) {\n\t\t\t\teditable.removeSpan(span);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic static void format(final Editable editable, int start, int end, @ColorInt int textColor) {\n\t\tfor (ImStyleParser.Style style : ImStyleParser.parse(editable,start,end)) {\n\t\t\tfinal int keywordLength = style.getKeyword().length();\n\t\t\teditable.setSpan(createSpanForStyle(style), style.getStart() + keywordLength, style.getEnd() - keywordLength + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);\n\t\t\tmakeKeywordOpaque(editable, style.getStart(), style.getStart() + keywordLength, textColor);\n\t\t\tmakeKeywordOpaque(editable, style.getEnd() - keywordLength + 1, style.getEnd() + 1, textColor);\n\t\t}\n\t}\n\n\tpublic static class MergeSeparator {}\n\n\tpublic static void format(final Editable editable, @ColorInt int textColor) {\n\t\tint end = 0;\n\t\tMergeSeparator[] spans = editable.getSpans(0, editable.length() - 1, MergeSeparator.class);\n\t\tfor(MergeSeparator span : spans) {\n\t\t\tformat(editable,end,editable.getSpanStart(span),textColor);\n\t\t\tend = editable.getSpanEnd(span);\n\t\t}\n\t\tformat(editable,end,editable.length() -1,textColor);\n\t}\n\n\tprivate static ParcelableSpan createSpanForStyle(ImStyleParser.Style style) {\n\t\tswitch (style.getKeyword()) {\n\t\t\tcase \"*\":\n\t\t\t\treturn new StyleSpan(Typeface.BOLD);\n\t\t\tcase \"_\":\n\t\t\t\treturn new StyleSpan(Typeface.ITALIC);\n\t\t\tcase \"~\":\n\t\t\t\treturn new StrikethroughSpan();\n\t\t\tcase \"`\":\n\t\t\tcase \"```\":\n\t\t\t\treturn new TypefaceSpan(\"monospace\");\n\t\t\tdefault:\n\t\t\t\tthrow new AssertionError(\"Unknown Style\");\n\t\t}\n\t}\n\n\tprivate static void makeKeywordOpaque(final Editable editable, int start, int end, @ColorInt int fallbackTextColor) {\n\t\tQuoteSpan[] quoteSpans = editable.getSpans(start, end, QuoteSpan.class);\n\t\t@ColorInt int textColor = quoteSpans.length > 0 ? quoteSpans[0].getColor() : fallbackTextColor;\n\t\t@ColorInt int keywordColor = transformColor(textColor);\n\t\teditable.setSpan(new ForegroundColorSpan(keywordColor), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);\n\t}\n\n\tprivate static\n\t@ColorInt\n\tint transformColor(@ColorInt int c) {\n\t\treturn Color.argb(Math.round(Color.alpha(c) * 0.6f), Color.red(c), Color.green(c), Color.blue(c));\n\t}\n\n\tpublic static class MessageEditorStyler implements TextWatcher {\n\n\t\tprivate final EditText mEditText;\n\n\t\tpublic MessageEditorStyler(EditText editText) {\n\t\t\tthis.mEditText = editText;\n\t\t}\n\n\t\t@Override\n\t\tpublic void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {\n\n\t\t}\n\n\t\t@Override\n\t\tpublic void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {\n\n\t\t}\n\n\t\t@Override\n\t\tpublic void afterTextChanged(Editable editable) {\n\t\t\tclear(editable);\n\t\t\tformat(editable, mEditText.getCurrentTextColor());\n\t\t\tMessageStylingHelper.applyEmojiScaling(editable, 5.0f); /* >5.0 will exceed Emoji rendering limit of 150px */\n\t\t\t//handleTextQuotes(editable, mEditText.getCurrentTextColor(), mEditText.getResources().getDisplayMetrics());\n\t\t}\n\t}\n\n\tpublic static boolean handleTextQuotes(Editable body, int color, DisplayMetrics dm) {\n\t\tboolean startsWithQuote = false;\n\t\tchar previous = '\\n';\n\t\tint lineStart = -1;\n\t\tint lineTextStart = -1;\n\t\tint quoteStart = -1;\n\t\tfor (int i = 0; i <= body.length(); i++) {\n\t\t\tchar current = body.length() > i ? body.charAt(i) : '\\n';\n\t\t\tchar next = body.length() > (i+1) ? body.charAt(i+1) : ' ';\n\t\t\tif (lineStart == -1) {\n\t\t\t\tif (previous == '\\n') {\n\t\t\t\t\tif (current == '>' && next == ' ') {\n\t\t\t\t\t\t// Line start with quote\n\t\t\t\t\t\tlineStart = i;\n\t\t\t\t\t\tif (quoteStart == -1) quoteStart = i;\n\t\t\t\t\t\tif (i == 0) startsWithQuote = true;\n\t\t\t\t\t} else if (quoteStart >= 0) {\n\t\t\t\t\t\t// Line start without quote, apply spans there\n\t\t\t\t\t\tapplyQuoteSpan(body, quoteStart, i - 1, color, dm);\n\t\t\t\t\t\tquoteStart = -1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Remove extra spaces between > and first character in the line\n\t\t\t\t// > character will be removed too\n\t\t\t\tif (current != ' ' && lineTextStart == -1) {\n\t\t\t\t\tlineTextStart = i;\n\t\t\t\t}\n\t\t\t\tif (current == '\\n') {\n\t\t\t\t\tbody.delete(lineStart, lineTextStart);\n\t\t\t\t\ti -= lineTextStart - lineStart;\n\t\t\t\t\tif (i == lineStart) {\n\t\t\t\t\t\t// Avoid empty lines because span over empty line can be hidden\n\t\t\t\t\t\tbody.insert(i++, \" \");\n\t\t\t\t\t}\n\t\t\t\t\tlineStart = -1;\n\t\t\t\t\tlineTextStart = -1;\n\t\t\t\t}\n\t\t\t}\n\t\t\tprevious = current;\n\t\t}\n\t\tif (quoteStart >= 0) {\n\t\t\t// Apply spans to finishing open quote\n\t\t\tapplyQuoteSpan(body, quoteStart, body.length(), color, dm);\n\t\t}\n\t\treturn startsWithQuote;\n\t}\n\n\tprivate static int applyQuoteSpan(Editable body, int start, int end, int color, DisplayMetrics dm) {\n\t\tif (start > 1 && !\"\\n\\n\".equals(body.subSequence(start - 2, start).toString())) {\n\t\t\tbody.insert(start++, \"\\n\");\n\t\t\tbody.setSpan(new DividerSpan(false), start - 2, start, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);\n\t\t\tend++;\n\t\t}\n\t\tif (end < body.length() - 1 && !\"\\n\\n\".equals(body.subSequence(end, end + 2).toString())) {\n\t\t\tbody.insert(end, \"\\n\");\n\t\t\tbody.setSpan(new DividerSpan(false), end, end + 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);\n\t\t}\n\t\tbody.setSpan(new QuoteSpan(color, dm), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);\n\t\treturn 0;\n\t}\n\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/FileHttpUploadTask.java",
    "content": "package org.yaxim.androidclient;\n\nimport android.content.Context;\nimport android.net.Uri;\nimport android.os.AsyncTask;\nimport android.util.Log;\nimport android.widget.Toast;\n\nimport org.jivesoftware.smack.StanzaCollector;\nimport org.jivesoftware.smack.XMPPConnection;\nimport org.jivesoftware.smack.filter.*;\nimport org.jivesoftware.smack.packet.IQ;\nimport org.jivesoftware.smackx.httpfileupload.HttpFileUploadManager;\nimport org.jivesoftware.smackx.httpfileupload.UploadService;\nimport org.jivesoftware.smackx.httpfileupload.element.Slot;\nimport org.jivesoftware.smackx.httpfileupload.element.SlotRequest;\nimport org.jxmpp.jid.BareJid;\nimport org.jxmpp.jid.impl.JidCreate;\nimport org.yaxim.androidclient.data.YaximConfiguration;\nimport org.yaxim.androidclient.service.Smackable;\nimport org.yaxim.androidclient.util.FileHelper;\n\nimport java.io.*;\nimport java.net.HttpURLConnection;\nimport java.net.URL;\n\npublic class FileHttpUploadTask extends AsyncTask<Void, String, FileHttpUploadTask.UploadResponse> {\n    private static final String TAG = \"yaxim.FileHttpUpload\";\n\n    public static final int F_RESIZE = 1;\n\n    private Context ctx;\n    private YaximConfiguration config;\n    private Smackable smackable;\n    private Uri path;\n    private String user;\n    private int flags;\n    private Toast status;\n\n    public FileHttpUploadTask(Context ctx, YaximConfiguration config, Smackable smackable, Uri path, String user, int flags) {\n        this.ctx = ctx;\n        this.config = config;\n        this.smackable = smackable;\n        this.path = path;\n        this.user = user;\n        this.flags = flags;\n    }\n\n    private void publishProgress(int res_id) {\n        publishProgress(ctx.getString(res_id));\n    }\n    @Override\n    protected UploadResponse doInBackground(Void... params) {\n        try {\n            if (path == null) {\n                return failResponse(\"path is null\");\n            }\n            FileHelper.FileInfo fi = FileHelper.getFileInfo(ctx, path);\n\n            if (fi == null || fi.size == 0)\n                return failResponse(\"File not found\");\n\n            XMPPConnection connection = smackable.getConnection();\n\n            HttpFileUploadManager hfum = HttpFileUploadManager.getInstanceFor(connection);\n\n            if (!hfum.isUploadServiceDiscovered()) {\n                return failResponse(\"No server support\");\n            }\n\t\t\tUploadService us = hfum.getDefaultUploadService();\n            long fileUploadSizeLimit = us.hasMaxFileSizeLimit() ? us.getMaxFileSize() : 0;\n\n\t\t\tbyte[] bytes = null;\n            try {\n                if ((flags & F_RESIZE) != 0) {\n                    publishProgress(R.string.upload_compress);\n                    bytes = FileHelper.shrinkPicture(ctx, path, fileUploadSizeLimit);\n                }\n                if (bytes == null)\n                    bytes = readFile(path, fi.size);\n                if (fileUploadSizeLimit > 0 && bytes.length > fileUploadSizeLimit) {\n                    return failResponse(ctx.getString(R.string.upload_too_large));\n                }\n            } catch (Exception e) {\n                return failResponse(e);\n            }\n\n            publishProgress(R.string.upload_uploading);\n            Slot slot = HttpFileUploadManager.getInstanceFor(connection).requestSlot(fi.displayName, bytes.length, fi.mimeType);\n\n\t\t\tURL putUrl = slot.getPutUrl();\n\t\t\tURL getUrl = slot.getGetUrl();\n\n\t\t\tHttpURLConnection conn = null;\n\n\t\t\ttry {\n\t\t\t\tconn = (HttpURLConnection) putUrl.openConnection();\n\t\t\t\tconn.setDoOutput(true);\n\t\t\t\tconn.setDoInput(true);\n\t\t\t\tconn.setUseCaches(false);\n\t\t\t\tconn.setRequestMethod(\"PUT\");\n\t\t\t\tconn.setRequestProperty(\"Content-Type\", fi.mimeType);\n\n\t\t\t\tDataOutputStream out = new DataOutputStream(conn.getOutputStream());\n\t\t\t\tout.write(bytes, 0, bytes.length);\n\t\t\t\tout.flush();\n\t\t\t\tout.close();\n\n\t\t\t\tint responseCode = conn.getResponseCode();\n\t\t\t\tif (responseCode != 200 && responseCode != 201) {\n\t\t\t\t\treturn failResponse(new Throwable(\"HTTP Status Code \" + responseCode));\n\t\t\t\t} else {\n\t\t\t\t\treturn new UploadResponse(true, getUrl.toString());\n\t\t\t\t}\n\t\t\t} catch (Exception e) {\n\t\t\t\tlog(e.getLocalizedMessage());\n\t\t\t\treturn failResponse(e);\n\t\t\t} finally {\n\t\t\t\tif (conn != null) {\n\t\t\t\t\tconn.disconnect();\n\t\t\t\t}\n\t\t\t}\n        } catch (Exception e) {\n\t\t\treturn failResponse(e);\n\t\t}\n    }\n\n    @Override\n    protected void onProgressUpdate(String... values) {\n        if (status != null)\n            status.cancel();\n        status = Toast.makeText(ctx, values[0], Toast.LENGTH_LONG);\n        status.show();\n    }\n\n    @Override\n    protected void onPreExecute() { }\n\n    @Override\n    protected void onPostExecute(UploadResponse response) {\n        if (status != null)\n            status.cancel();\n        if (response.success) {\n            String message = response.response;\n            smackable.sendMessage(user, message, null, message, -1);\n        } else {\n            Toast.makeText(ctx, response.toString(), Toast.LENGTH_LONG).show();\n        }\n    }\n\n    private byte[] readFile(Uri path, long size) throws IOException {\n        int length = (int) size;\n        if (length != size)\n            throw new IOException(\"File size >= 2 GB\");\n        InputStream is = ctx.getContentResolver().openInputStream(path);\n        try {\n            // Read file and return data\n            byte[] data = new byte[length];\n            int offset = 0;\n            while (offset < length)\n\t\t\t\toffset += is.read(data, offset, length-offset);\n            return data;\n        } finally {\n            is.close();\n        }\n    }\n\n    private void log(String message) {\n        Log.e(TAG, message);\n    }\n\n    private UploadResponse failResponse(String reason) {\n        return new UploadResponse(false, reason);\n    }\n    private UploadResponse failResponse(Throwable exception) {\n        exception.printStackTrace();\n        return new UploadResponse(false, exception.getLocalizedMessage());\n    }\n\n\n    public class UploadResponse {\n        boolean success;\n        String response;\n\n        public UploadResponse(boolean success, String response) {\n            this.success = success;\n            this.response = response;\n            if (!success)\n                Log.e(\"yaxim.HttpUpload\", this.toString());\n        }\n\n        public String toString() {\n            if (success)\n                return response;\n            else return ctx.getString(R.string.conn_error, response);\n        }\n    }\n}"
  },
  {
    "path": "src/org/yaxim/androidclient/IXMPPRosterCallback.aidl",
    "content": "package org.yaxim.androidclient;\n\n/*\n\tIPC interface for XMPPService to send broadcasts to UI\n*/\n\ninterface IXMPPRosterCallback {\n\tvoid connectionStateChanged(int connectionstate);\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/MainWindow.java",
    "content": "package org.yaxim.androidclient;\n\nimport java.util.HashMap;\nimport java.util.List;\n\nimport org.jivesoftware.smack.sasl.SASLErrorException;\nimport org.yaxim.androidclient.data.ChatHelper;\nimport org.yaxim.androidclient.data.ChatProvider;\nimport org.yaxim.androidclient.data.ChatProvider.ChatConstants;\nimport org.yaxim.androidclient.data.ChatRoomHelper;\nimport org.yaxim.androidclient.data.RosterProvider;\nimport org.yaxim.androidclient.data.RosterProvider.RosterConstants;\nimport org.yaxim.androidclient.dialogs.AddRosterItemDialog;\nimport org.yaxim.androidclient.dialogs.ChangeStatusDialog;\nimport org.yaxim.androidclient.dialogs.EditMUCDialog;\nimport org.yaxim.androidclient.dialogs.FirstStartDialog;\nimport org.yaxim.androidclient.list.SearchActivity;\nimport org.yaxim.androidclient.list.ServiceDiscoveryActivity;\nimport org.yaxim.androidclient.preferences.AccountPrefs;\nimport org.yaxim.androidclient.preferences.MainPrefs;\nimport org.yaxim.androidclient.preferences.NotificationPrefs;\nimport org.yaxim.androidclient.service.InvitationTask;\nimport org.yaxim.androidclient.service.SmackableImp;\nimport org.yaxim.androidclient.service.XMPPService;\nimport org.yaxim.androidclient.util.ConnectionState;\nimport org.yaxim.androidclient.util.PreferenceConstants;\nimport org.yaxim.androidclient.util.StatusMode;\nimport org.yaxim.androidclient.util.XMPPHelper;\n\nimport android.Manifest;\nimport android.content.pm.PackageManager;\nimport android.support.v4.app.ActivityCompat;\nimport android.support.v4.content.ContextCompat;\nimport android.support.v7.app.AlertDialog;\nimport android.content.Context;\nimport android.content.ComponentName;\nimport android.content.Intent;\nimport android.content.ServiceConnection;\nimport android.content.SharedPreferences;\nimport android.content.DialogInterface;\nimport android.content.pm.PackageInfo;\nimport android.content.pm.PackageManager.NameNotFoundException;\nimport android.content.res.Configuration;\nimport android.database.ContentObserver;\nimport android.database.Cursor;\nimport android.net.Uri;\nimport android.os.AsyncTask;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.os.IBinder;\nimport android.os.PowerManager;\nimport android.os.RemoteException;\nimport android.preference.PreferenceManager;\nimport android.provider.Settings;\nimport android.text.ClipboardManager;\nimport android.text.TextUtils;\nimport android.util.Log;\nimport android.view.ContextMenu;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.MenuItem;\nimport android.widget.ExpandableListView;\nimport android.widget.ImageView;\n\nimport org.yaxim.androidclient.util.SimpleCursorTreeAdapter;\nimport android.widget.TextView;\nimport android.widget.Toast;\nimport android.widget.ExpandableListView.ExpandableListContextMenuInfo;\nimport org.yaxim.androidclient.IXMPPRosterCallback.Stub;\nimport org.yaxim.androidclient.service.IXMPPRosterService;\n\nimport android.view.Menu;\n\nimport me.leolin.shortcutbadger.ShortcutBadger;\n\npublic class MainWindow extends ThemedActivity implements ExpandableListView.OnChildClickListener {\n\n\tprivate static final String TAG = \"yaxim.MainWindow\";\n\tprivate static final int REQUEST_NOTIFICATION_UPGRADE = 1;\n\tprivate static final int REQUEST_NOTIFICATION_LOGIN = 2;\n\tprivate static final int REQUEST_NOTIFICATION_REGISTER = 3;\n\n\tExpandableListView elv;\n\n\tprivate Handler mainHandler = new Handler();\n\n\tprivate Intent xmppServiceIntent;\n\tprivate ServiceConnection xmppServiceConnection;\n\tprivate XMPPRosterServiceAdapter serviceAdapter;\n\tprivate Stub rosterCallback;\n\tprivate RosterExpListAdapter rosterListAdapter;\n\tprivate TextView mConnectingText;\n\n\tprivate ContentObserver mRosterObserver = new RosterObserver();\n\tprivate ContentObserver mChatObserver = new ChatObserver();\n\tprivate HashMap<String, Boolean> mGroupsExpanded = new HashMap<String, Boolean>();\n\n\tprivate boolean mHandledIntent = false;\n\tFirstStartDialog mFirstStartDialog;\n\n\t@Override\n\tpublic void onCreate(Bundle savedInstanceState) {\n\t\tLog.i(TAG, getString(R.string.build_version));\n\t\tsuper.onCreate(savedInstanceState);\n\t\t\n\t\tgetContentResolver().registerContentObserver(RosterProvider.CONTENT_URI,\n\t\t\t\ttrue, mRosterObserver);\n\t\tgetContentResolver().registerContentObserver(ChatProvider.CONTENT_URI,\n\t\t\t\ttrue, mChatObserver);\n\t\tregisterXMPPService();\n\t\tsetupContentView();\n\t\tcreateUICallback();\n\t\tregisterListAdapter();\n\n\t\tmHandledIntent = (getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0;\n\t}\n\n\t@Override\n\tpublic void onDestroy() {\n\t\tsuper.onDestroy();\n\t\tgetContentResolver().unregisterContentObserver(mRosterObserver);\n\t\tgetContentResolver().unregisterContentObserver(mChatObserver);\n\t}\n\n\tpublic void onClickClipboard(View v) {\n\t\tClipboardManager cm = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);\n\t\tcm.setText(((TextView)v).getText());\n\t\tif (Build.VERSION.SDK_INT < 33) {\n\t\t\tToast.makeText(this, \"📋\", Toast.LENGTH_SHORT).show();\n\t\t}\n\t}\n\n\n\tpublic int getStatusActionIcon() {\n\t\tboolean showOffline = !isConnected() || isConnecting()\n\t\t\t\t\t|| getStatusMode() == null;\n\n\t\tif (showOffline) {\n\t\t\treturn StatusMode.offline.getDrawableId();\n\t\t}\n\n\t\treturn getStatusMode().getDrawableId();\n\t}\n\n\t// need this to workaround unwanted OnGroupCollapse/Expand events\n\tboolean groupClicked = false;\n\tvoid handleGroupChange(int groupPosition, boolean isExpanded) {\n\t\tif (groupClicked) {\n\t\t\ttry {\n\t\t\t\tString groupName = getGroupName(groupPosition);\n\t\t\t\tLog.d(TAG, \"group status change: \" + groupName + \" -> \" + isExpanded);\n\t\t\t\tmGroupsExpanded.put(groupName, isExpanded);\n\t\t\t} catch (NullPointerException e) {\n\t\t\t\t// sometimes, it fails to obtain the cursor. We can ignore it\n\t\t\t}\n\t\t\tgroupClicked = false;\n\t\t}\n\t}\n\n\n\tvoid setupContentView() {\n\t\tsetContentView(R.layout.main);\n\t\tmConnectingText = (TextView)findViewById(R.id.error_view);\n\t\telv = (ExpandableListView)findViewById(android.R.id.list);\n\t\tregisterForContextMenu(elv);\n\t\telv.requestFocus();\n\n\t\telv.setOnChildClickListener(this);\n\t\telv.setOnGroupClickListener(\n\t\t\tnew ExpandableListView.OnGroupClickListener() {\n\t\t\t\tpublic boolean onGroupClick(ExpandableListView parent, View v, int groupPosition,\n\t\t\t\t\t\tlong id) {\n\t\t\t\t\tgroupClicked = true;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\telv.setOnGroupCollapseListener(\n\t\t\tnew ExpandableListView.OnGroupCollapseListener() {\n\t\t\t\tpublic void onGroupCollapse(int groupPosition) {\n\t\t\t\t\thandleGroupChange(groupPosition, false);\n\t\t\t\t}\n\t\t\t});\n\t\telv.setOnGroupExpandListener(\n\t\t\tnew ExpandableListView.OnGroupExpandListener() {\n\t\t\t\tpublic void onGroupExpand(int groupPosition) {\n\t\t\t\t\thandleGroupChange(groupPosition, true);\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\t@Override\n\tprotected void onTitleClicked(View view) {\n\t\tnew ChangeStatusDialog(this, mConfig).show();\n\t}\n\n\t@Override\n\tprotected void onNewIntent(Intent i) {\n\t\tsetIntent(i);\n\t\tmHandledIntent = false;\n\t}\n\n\tprotected void clearIntent() {\n\t\tgetIntent().setData(null);\n\t\tmHandledIntent = true;\n\t}\n\n\t@Override\n\tprotected void onPause() {\n\t\tsuper.onPause();\n\t\tif (serviceAdapter != null)\n\t\t\tserviceAdapter.unregisterUICallback(rosterCallback);\n\n\t\tYaximApplication.getApp().mMTM.unbindDisplayActivity(this);\n\t\tunbindXMPPService();\n\t\tstoreExpandedState();\n\t}\n\n\t@Override\n\tprotected void onResume() {\n\t\tsuper.onResume();\n\t\tif (mConfig.theme.equals(mTheme) == false) {\n\t\t\t// restart\n\t\t\tIntent restartIntent = new Intent(this, MainWindow.class);\n\t\t\trestartIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);\n\t\t\tstartActivity(restartIntent);\n\t\t\tfinish();\n\t\t}\n\n\t\tshowFirstStartUpDialogIfPrefsEmpty();\n\n\t\tdisplayOwnStatus();\n\t\tbindXMPPService();\n\n\t\tYaximApplication.getApp().mMTM.bindDisplayActivity(this);\n\n\t\t// handle SEND action\n\t\thandleSendIntent();\n\t}\n\n\tpublic void handleSendIntent() {\n\t\tIntent intent = getIntent();\n\t\tString action = intent.getAction();\n\t\tif (!mHandledIntent && (action != null) && (action.equals(Intent.ACTION_SEND))) {\n\t\t\tshowToastNotification(R.string.chooseContact);\n\t\t\tsetTitle(R.string.chooseContact);\n\t\t}\n\t}\n\n\t/** opens a ChatWindow / MUCChat window to the given JID, potentially sending the attached text.\n\t *\n\t * @return true if the chat was successfully opened.\n\t */\n\tpublic boolean openChatWithJid(String jid, String text) {\n\t\tLog.d(TAG, \"openChatWithJid: \" + jid);\n\n\t\t// search for JID in roster, to obtain display name\n\t\tList<String[]> contacts = ChatHelper.getRosterContacts(this, ChatHelper.ROSTER_FILTER_ALL);\n\t\tfor (String[] c : contacts) {\n\t\t\tif (jid.equalsIgnoreCase(c[0])) {\n\t\t\t\t// found it\n\t\t\t\tChatHelper.startChatActivity(this, c[0], c[1], text);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t// if we have a message, open chat to JID irregardless of roster\n\t\tif (text != null) {\n\t\t\tChatHelper.startChatActivity(this, jid, jid, text);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tpublic boolean isJabberIntentAction(String action) {\n\t\treturn Intent.ACTION_VIEW.equals(action) ||\n\t\t\tandroid.nfc.NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action);\n\t}\n\n\tpublic synchronized void handleJabberIntent() {\n\t\tIntent intent = getIntent();\n\t\tLog.d(TAG, \"handleJabberIntent: \" + intent);\n\t\tString action = intent.getAction();\n\t\tUri data = intent.getData();\n\t\tif (action == null || data == null || mHandledIntent)\n\t\t\treturn;\n\t\t// ignore event if no account registered; TODO: handle xmpp://account@server?register\n\t\tif (mConfig.jabberID.length() < 3 || PreferenceManager.getDefaultSharedPreferences(this).contains(PreferenceConstants.FIRSTRUN))\n\t\t\treturn;\n\t\tif (action.equals(Intent.ACTION_SENDTO) && data.getHost().equals(\"jabber\")) {\n\t\t\t// 1. look for JID in roster; 2. attempt to add\n\t\t\tString jid = data.getPathSegments().get(0);\n\t\t\tif (openChatWithJid(jid, null) || addToRosterDialog(jid))\n\t\t\t\tclearIntent();\n\t\t} else if (isJabberIntentAction(action) && XMPPHelper.transmogrifyXmppUri(intent)) {\n\t\t\tif (handleXmppUri(intent.getData()))\n\t\t\t\tclearIntent();\n\t\t}\n\t}\n\n\tpublic boolean handleXmppUri(Uri data) {\n\t\tString jid = data.getAuthority();\n\t\tString body = data.getQueryParameter(\"body\");\n\t\tif (TextUtils.isEmpty(jid)) {\n\t\t\tif (!TextUtils.isEmpty(body)) {\n\t\t\t\t// this is a body-less `xmpp:?message;body=TEXT` - convert to ACTION_SEND\n\t\t\t\tgetIntent().setAction(Intent.ACTION_SEND)\n\t\t\t\t\t\t.setData(null)\n\t\t\t\t\t\t.putExtra(Intent.EXTRA_TEXT, body);\n\t\t\t\thandleSendIntent();\n\t\t\t}\n\t\t\t// stop processing if JID is empty\n\t\t\treturn false;\n\t\t}\n\t\tString name = data.getQueryParameter(\"name\");\n\t\tString preauth = data.getQueryParameter(\"preauth\");\n\t\tif (data.getQueryParameter(\"register\") != null) {\n\t\t\tshowToastNotification(R.string.StartupDialog_no_more_accounts);\n\t\t\t// consume the event, even though not supported\n\t\t\treturn true;\n\t\t}\n\t\tif (data.getQueryParameter(\"roster\") != null || data.getQueryParameter(\"subscribe\") != null) {\n\t\t\treturn addToRosterDialog(jid, name, preauth);\n\t\t} else if (data.getQueryParameter(\"join\") != null && !openChatWithJid(jid, null)) {\n\t\t\tnew EditMUCDialog(this, jid, data.getQueryParameter(\"body\"),\n\t\t\t\t\tnull, data.getQueryParameter(\"password\")).show();\n\t\t\treturn true;\n\t\t} else if (openChatWithJid(jid, body) || addToRosterDialog(jid, name, preauth)) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t@SuppressWarnings(\"deprecation\") /* recent ClipboardManager only available since API 11 */\n\tpublic Uri xmppUriFromClipboard() {\n\t\tClipboardManager cm = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);\n\t\tCharSequence clipcs = cm.getText();\n\t\tif (clipcs == null)\n\t\t\treturn null;\n\t\tString clip = clipcs.toString();\n\t\tif (clip == null || \"\".equals(clip))\n\t\t\treturn null;\n\t\tif (clip.contains(\"@\") && XMPPHelper.XMPP_PATTERN.matcher(\"xmpp:\" + clip).matches()) {\n\t\t\treturn new Uri.Builder().scheme(\"xmpp\").authority(clip).build();\n\t\t}\n\t\treturn XMPPHelper.transmogrifyXmppUriHelper(Uri.parse(clip));\n\t}\n\n\t@Override\n\tpublic void onConfigurationChanged(Configuration newConfig) {\n\t\tsuper.onConfigurationChanged(newConfig);\n\t\tLog.d(TAG, \"onConfigurationChanged\");\n\t\telv.requestFocus();\n\t}\n\n\tprivate boolean isConnected() {\n\t\treturn serviceAdapter != null && serviceAdapter.isAuthenticated();\n\t}\n\tprivate boolean isConnecting() {\n\t\treturn serviceAdapter != null &&\n\t\t\t(serviceAdapter.getConnectionState() == ConnectionState.CONNECTING ||\n\t\t\t serviceAdapter.getConnectionState() == ConnectionState.LOADING);\n\t}\n\n\tpublic void updateRoster() {\n\t\trosterListAdapter.requery();\n\t\trestoreGroupsExpanded();\n\t\tnew LoadUnreadTask().execute();\n\t}\n\n\tprivate StatusMode getContactStatusMode(Cursor c) {\n\t\ttry {\n\t\t\treturn StatusMode.values()[c.getInt(c.getColumnIndexOrThrow(RosterConstants.STATUS_MODE))];\n\t\t} catch (Exception e) {\n\t\t\tLog.e(TAG, \"Invalid status for contact \" + e.getMessage());\n\t\t\treturn StatusMode.unknown;\n\t\t}\n\t}\n\n\tprivate StatusMode getItemStatusMode(long packedPosition) {\n\t\tint flatPosition = elv.getFlatListPosition(packedPosition);\n\t\tCursor c = (Cursor)elv.getItemAtPosition(flatPosition);\n\t\treturn getContactStatusMode(c);\n\t}\n\n\tprivate String getPackedItemRow(long packedPosition, String rowName) {\n\t\tint flatPosition = elv.getFlatListPosition(packedPosition);\n\t\tCursor c = (Cursor)elv.getItemAtPosition(flatPosition);\n\t\treturn c.getString(c.getColumnIndex(rowName));\n\t}\n\n\t@Override\n\tpublic void onCreateContextMenu(ContextMenu menu, View v,\n\t\t\tContextMenu.ContextMenuInfo menuInfo) {\n\t\tExpandableListView.ExpandableListContextMenuInfo info;\n\n\t\ttry {\n\t\t\tinfo = (ExpandableListView.ExpandableListContextMenuInfo) menuInfo;\n\t\t} catch (ClassCastException e) {\n\t\t\tLog.e(TAG, \"bad menuinfo: \", e);\n\t\t\treturn;\n\t\t}\n\n\t\tlong packedPosition = info.packedPosition;\n\t\tboolean isChild = isChild(packedPosition);\n\n\t\t// get the entry name for the item\n\t\tString menuName;\n\t\tboolean isMuc=false;\n\t\tif (isChild) {\n\t\t\t// do not show context menu before a contact has been added\n\t\t\tif (getItemStatusMode(packedPosition) == StatusMode.subscribe)\n\t\t\t\treturn;\n\t\t\tgetMenuInflater().inflate(R.menu.roster_item_contextmenu, menu);\n\t\t\tmenuName = String.format(\"%s (%s)\",\n\t\t\t\tgetPackedItemRow(packedPosition, RosterConstants.ALIAS),\n\t\t\t\tgetPackedItemRow(packedPosition, RosterConstants.JID));\n\t\t\tisMuc = ChatRoomHelper.isRoom(this, getPackedItemRow(packedPosition, RosterConstants.JID));\n\t\t\tif (isMuc) {\n\t\t\t\tgetMenuInflater().inflate(R.menu.muc_options, menu);\n\t\t\t\tmenu.findItem(R.id.chat_optionsmenu_userlist).setVisible(false);\n\t\t\t} else\n\t\t\t\tgetMenuInflater().inflate(R.menu.contact_options, menu);\n\t\t} else {\n\t\t\tmenuName = getPackedItemRow(packedPosition, RosterConstants.GROUP);\n\t\t\tif (menuName.equals(\"\") || menuName.equals(RosterConstants.MUCS))\n\t\t\t\treturn; // no options for default menu\n\t\t\tgetMenuInflater().inflate(R.menu.roster_group_contextmenu, menu);\n\t\t}\n\t\tmenu.setHeaderTitle(menuName);\n\t}\n\n\tboolean addToRosterDialog(String jid, String alias, String token) {\n\t\tif (serviceAdapter != null && serviceAdapter.isAuthenticated()) {\n\t\t\tnew AddRosterItemDialog(this, jid)\n\t\t\t\t.setAlias(alias)\n\t\t\t\t.setToken(token)\n\t\t\t\t.show();\n\t\t\treturn true;\n\t\t} else {\n\t\t\tshowToastNotification(R.string.Global_authenticate_first);\n\t\t\treturn false;\n\t\t}\n\t}\n\tboolean addToRosterDialog(String jid) {\n\t\treturn addToRosterDialog(jid, null, null);\n\t}\n\n\tvoid rosterAddRequestedDialog(final String jid, final String alias, String message) {\n\t\tnew AlertDialog.Builder(this)\n\t\t\t.setTitle(R.string.subscriptionRequest_title)\n\t\t\t.setMessage(getString(R.string.subscriptionRequest_text, alias,\n\t\t\t\t\t\tmessage != null ? message : \"\"))\n\t\t\t.setPositiveButton(R.string.subscription_accept,\n\t\t\t\t\tnew DialogInterface.OnClickListener() {\n\t\t\t\t\t\tpublic void onClick(DialogInterface dialog, int which) {\n\t\t\t\t\t\t\tserviceAdapter.sendPresenceRequest(jid, \"subscribed\");\n\t\t\t\t\t\t\t// show dialog if not yet configured\n\t\t\t\t\t\t\tif (alias.equals(jid))\n\t\t\t\t\t\t\t\taddToRosterDialog(jid);\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t.setNeutralButton(R.string.subscription_reject_all,\n\t\t\t\t\tnew DialogInterface.OnClickListener() {\n\t\t\t\t\t\tpublic void onClick(DialogInterface dialog, int which) {\n\t\t\t\t\t\t\tserviceAdapter.sendPresenceRequest(null, \"unsubscribed\");\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t.setNegativeButton(R.string.subscription_reject,\n\t\t\t\t\tnew DialogInterface.OnClickListener() {\n\t\t\t\t\t\tpublic void onClick(DialogInterface dialog, int which) {\n\t\t\t\t\t\t\tserviceAdapter.sendPresenceRequest(jid, \"unsubscribed\");\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t.create().show();\n\t}\n\n\tvoid renameRosterGroupDialog(final String groupName) {\n\t\tChatHelper.editTextDialog(this, R.string.RenameGroup_title,\n\t\t\t\tgetString(R.string.RenameGroup_summ, groupName),\n\t\t\t\tgroupName, false, new ChatHelper.EditOk() {\n\t\t\t\t\tpublic void ok(String result) {\n\t\t\t\t\t\tserviceAdapter.renameRosterGroup(groupName, result);\n\t\t\t\t\t}\n\t\t\t\t});\n\t}\n\n\tpublic boolean onContextItemSelected(MenuItem item) {\n\t\treturn applyMenuContextChoice(item);\n\t}\n\n\tprivate boolean applyMenuContextChoice(MenuItem item) {\n\n\t\tExpandableListContextMenuInfo contextMenuInfo = (ExpandableListContextMenuInfo) item\n\t\t\t\t.getMenuInfo();\n\t\tlong packedPosition = contextMenuInfo.packedPosition;\n\n\t\tif (isChild(packedPosition)) {\n\n\t\t\tString userJid = getPackedItemRow(packedPosition, RosterConstants.JID);\n\t\t\tString userName = getPackedItemRow(packedPosition, RosterConstants.ALIAS);\n\t\t\tLog.d(TAG, \"action for contact \" + userName + \"/\" + userJid);\n\n\t\t\tint itemID = item.getItemId();\n\n\t\t\tswitch (itemID) {\n\t\t\t// items that require an authenticated connection\n\t\t\tcase R.id.roster_contextmenu_contact_delete:\n\t\t\tcase R.id.roster_contextmenu_contact_rename:\n\t\t\tcase R.id.roster_contextmenu_contact_request_auth:\n\t\t\tcase R.id.roster_contextmenu_contact_change_group:\n\t\t\t\tif (!isConnected()) { showToastNotification(R.string.Global_authenticate_first); return true; }\n\t\t\t\t// fall through to default handler\n\t\t\tdefault:\n\t\t\t\treturn ChatHelper.handleJidOptions(this, itemID, userJid, userName);\n\t\t\t}\n\t\t} else {\n\n\t\t\tint itemID = item.getItemId();\n\t\t\tString seletedGroup = getPackedItemRow(packedPosition, RosterConstants.GROUP);\n\t\t\tLog.d(TAG, \"action for group \" + seletedGroup);\n\n\t\t\tswitch (itemID) {\n\t\t\tcase R.id.roster_contextmenu_group_rename:\n\t\t\t\tif (!isConnected()) { showToastNotification(R.string.Global_authenticate_first); return true; }\n\t\t\t\trenameRosterGroupDialog(seletedGroup);\n\t\t\t\treturn true;\n\t\t\tcase R.id.roster_contextmenu_ringtone:\n\t\t\t\tIntent ringToneIntent = new Intent(this, NotificationPrefs.class);\n\t\t\t\tringToneIntent.putExtra(\"jid\", seletedGroup);\n\t\t\t\tstartActivity(ringToneIntent);\n\t\t\t\treturn true;\n\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate boolean isChild(long packedPosition) {\n\t\tint type = ExpandableListView.getPackedPositionType(packedPosition);\n\t\treturn (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD);\n\t}\n\n\t@Override\n\tpublic boolean onCreateOptionsMenu(Menu menu) {\n\t\tgetMenuInflater().inflate(R.menu.roster_options, menu);\n\t\treturn true;\n\t}\n\n\tvoid setMenuItem(Menu menu, int itemId, int iconId, CharSequence title) {\n\t\tMenuItem item = menu.findItem(itemId);\n\t\tif (item == null)\n\t\t\treturn;\n\t\titem.setIcon(iconId);\n\t\titem.setTitle(title);\n\t}\n\tvoid setMenuItemFromClipboard(Menu menu, int itemId) {\n\t\tMenuItem item = menu.findItem(itemId);\n\t\tif (item == null)\n\t\t\treturn;\n\t\tUri link = xmppUriFromClipboard();\n\t\titem.setVisible(link != null);\n\t\tif (link != null)\n\t\t\titem.setTitle(getString(R.string.Menu_addClipboard, link.getAuthority()));\n\t}\n\n\t@Override\n\tpublic boolean onPrepareOptionsMenu(Menu menu) {\n\t\tsetMenuItem(menu, R.id.menu_connect, 0,\n\t\t\t\tgetConnectDisconnectText());\n\t\tsetMenuItem(menu, R.id.menu_show_hide,\n\t\t\t\tmConfig.showOffline ? R.drawable.ic_action_contacts_all : R.drawable.ic_action_contacts_online,\n\t\t\t\tmConfig.showOffline ? getString(R.string.Menu_HideOff) : getString(R.string.Menu_ShowOff));\n\t\tsetMenuItemFromClipboard(menu, R.id.menu_add_clipboard);\n\t\treturn true;\n\t}\n\n\t@Override\n\tpublic boolean onOptionsItemSelected(MenuItem item) {\n\t\treturn applyMainMenuChoice(item);\n\t}\n\n\n\tpublic StatusMode getStatusMode() {\n\t\treturn mConfig.getPresenceMode();\n\t}\n\n\tpublic void updateStatus(StatusMode statusMode) {\n\t\tdisplayOwnStatus();\n\t\tif (serviceAdapter == null)\n\t\t\treturn; // we can't do anything, let's pray service will update from config\n\n\t\t// check if we are connected and want to go offline\n\t\tboolean needToDisconnect = (statusMode == StatusMode.offline) && isConnected();\n\t\t// check if we want to reconnect\n\t\tboolean needToConnect = (statusMode != StatusMode.offline) &&\n\t\t\t\tserviceAdapter.getConnectionState() == ConnectionState.OFFLINE;\n\n\t\tif (needToConnect || needToDisconnect)\n\t\t\ttoggleConnection();\n\t\telse if (isConnected())\n\t\t\tserviceAdapter.setStatusFromConfig();\n\t}\n\n\tprivate void displayOwnStatus() {\n\t\t// This and many other things like it should be done with observer\n\t\tsetIcon(getStatusActionIcon());\n\t\tsetSubtitle(mConfig.statusMessage);\n\t}\n\n\tprivate void aboutDialog() {\n\t\tLayoutInflater inflater = (LayoutInflater)getSystemService(\n\t\t\t      LAYOUT_INFLATER_SERVICE);\n\t\tView about = inflater.inflate(R.layout.aboutview, null, false);\n\t\tString versionTitle = getString(R.string.AboutDialog_title);\n\t\ttry {\n\t\t\tPackageInfo pi = getPackageManager()\n\t\t\t\t\t\t.getPackageInfo(getPackageName(), 0);\n\t\t\tversionTitle += \" v\" + pi.versionName;\n\t\t} catch (NameNotFoundException e) {\n\t\t}\n\n\t\t// fix translator-credits: hide if unset, format otherwise\n\t\tTextView tcv = (TextView)about.findViewById(R.id.translator_credits);\n\t\tif (tcv.getText().equals(\"translator-credits\"))\n\t\t\ttcv.setVisibility(View.GONE);\n\n\t\tnew AlertDialog.Builder(this)\n\t\t\t.setTitle(versionTitle)\n\t\t\t.setIcon(android.R.drawable.ic_dialog_info)\n\t\t\t.setView(about)\n\t\t\t.setNegativeButton(R.string.AboutDialog_DevelopersText, new DialogInterface.OnClickListener() {\n\t\t\t\tpublic void onClick(DialogInterface dialog, int item) {\n\t\t\t\t\tif (mConfig.jabberID.length() < 3 || TextUtils.isEmpty(mConfig.userName)) {\n\t\t\t\t\t\tshowToastNotification(R.string.Global_authenticate_first);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tString jid = getString(R.string.yaxim_muc);\n\t\t\t\t\tif (!openChatWithJid(jid, null)) {\n\t\t\t\t\t\tnew EditMUCDialog(MainWindow.this, jid, null,\n\t\t\t\t\t\t\t\tnull, null).show();\n\t\t\t\t\t}\n\t\t\t\t}})\n\t\t\t.setPositiveButton(android.R.string.ok, null)\n\t\t\t.setNeutralButton(R.string.AboutDialog_Vote, new DialogInterface.OnClickListener() {\n\t\t\t\tpublic void onClick(DialogInterface dialog, int item) {\n\t\t\t\t\tIntent market = new Intent(Intent.ACTION_VIEW,\n\t\t\t\t\t\tUri.parse(\"market://details?id=\" + getPackageName()));\n\t\t\t\t\tmarket.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tstartActivity(market);\n\t\t\t\t\t} catch (Exception e) {\n\t\t\t\t\t\t// do not crash\n\t\t\t\t\t\tLog.e(TAG, \"could not go to market: \" + e);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t\t.create().show();\n\t}\n\n\tprivate boolean applyMainMenuChoice(MenuItem item) {\n\n\t\tint itemID = item.getItemId();\n\n\t\tswitch (itemID) {\n\t\tcase R.id.menu_connect:\n\t\t\ttoggleConnection();\n\t\t\treturn true;\n\n\t\tcase R.id.menu_add_clipboard:\n\t\t\tUri link = xmppUriFromClipboard();\n\t\t\tif (link != null)\n\t\t\t\thandleXmppUri(link);\n\t\t\treturn true;\n\n\t\tcase R.id.menu_add_friend:\n\t\t\taddToRosterDialog(null);\n\t\t\treturn true;\n\n\t\tcase R.id.menu_show_hide:\n\t\t\tsetOfflinceContactsVisibility(!mConfig.showOffline);\n\t\t\tupdateRoster();\n\t\t\treturn true;\n\t\t\t\n\t\tcase R.id.menu_markallread:\n\t\t\tChatHelper.markAllAsRead(this);\n\t\t\tShortcutBadger.applyCount(this, 0);\n\t\t\treturn true;\n\n\t\tcase android.R.id.home:\n\t\t\tnew ChangeStatusDialog(this, mConfig).show();\n\t\t\treturn true;\n\n\t\tcase R.id.menu_exit:\n\t\t\tPreferenceManager.getDefaultSharedPreferences(this).edit().\n\t\t\t\tputBoolean(PreferenceConstants.CONN_STARTUP, false).commit();\n\t\t\tstopService(xmppServiceIntent);\n\t\t\tfinish();\n\t\t\treturn true;\n\n\t\tcase R.id.menu_settings:\n\t\t\tstartActivity(new Intent(this, MainPrefs.class));\n\t\t\treturn true;\n\n\t\tcase R.id.menu_about:\n\t\t\taboutDialog();\n\t\t\treturn true;\n\t\tcase R.id.menu_muc:\n\t\t\tstartActivity(new Intent(this, SearchActivity.class));\n\t\t\treturn true;\n\t\tcase R.id.menu_matrix:\n\t\t\tstartActivity(new Intent(this, ServiceDiscoveryActivity.class).setData(Uri.parse(XMPPHelper.MATRIX_BRIDGE)));\n\t\t\treturn true;\n\t\tcase R.id.menu_send_invitation:\n\t\t\tnew InvitationTask(this, mConfig, YaximApplication.getApp().getSmackable()).execute();\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/** Sets if all contacts are shown in the roster or online contacts only. */\n\tprivate void setOfflinceContactsVisibility(boolean showOffline) {\n\t\tPreferenceManager.getDefaultSharedPreferences(this).edit().\n\t\t\tputBoolean(PreferenceConstants.SHOW_OFFLINE, showOffline).commit();\n\t\tinvalidateOptionsMenu();\n\t}\n\n\t@Override\n\tpublic boolean onChildClick(ExpandableListView parent, View v,\n\t\t\tint groupPosition, int childPosition, long id) {\n\n\t\tlong packedPosition = ExpandableListView.getPackedPositionForChild(groupPosition, childPosition);\n\t\tCursor c = (Cursor)elv.getItemAtPosition(elv.getFlatListPosition(packedPosition));\n\t\tString userJid = c.getString(c.getColumnIndexOrThrow(RosterConstants.JID));\n\t\tString userName = c.getString(c.getColumnIndexOrThrow(RosterConstants.ALIAS));\n\t\tIntent i = getIntent();\n\t\tif (!mHandledIntent && i.getAction() != null && i.getAction().equals(Intent.ACTION_SEND)) {\n\t\t\t// delegate ACTION_SEND to child window and close self\n\t\t\tUri stream = (Uri)i.getParcelableExtra(Intent.EXTRA_STREAM);\n\t\t\tChatHelper.startChatActivity(this, userJid, userName, i.getStringExtra(Intent.EXTRA_TEXT), stream);\n\t\t\tfinish();\n\t\t} else {\n\t\t\tStatusMode s = getContactStatusMode(c);\n\t\t\tif (s == StatusMode.subscribe)\n\t\t\t\trosterAddRequestedDialog(userJid, userName,\n\t\t\t\t\tc.getString(c.getColumnIndexOrThrow(RosterConstants.STATUS_MESSAGE)));\n\t\t\telse\n\t\t\t\tChatHelper.startChatActivity(this, userJid, userName, null);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tprivate void updateConnectionState(ConnectionState cs) {\n\t\tLog.d(TAG, \"updateConnectionState: \" + cs);\n\t\tdisplayOwnStatus();\n\t\tboolean spinTheSpinner = false;\n\t\tswitch (cs) {\n\t\tcase CONNECTING:\n\t\tcase LOADING:\n\t\tcase DISCONNECTING:\n\t\t\tspinTheSpinner = true;\n\t\tcase DISCONNECTED:\n\t\tcase RECONNECT_NETWORK:\n\t\tcase RECONNECT_DELAYED:\n\t\tcase OFFLINE:\n\t\t\tif (cs == ConnectionState.DISCONNECTED) {\n\t\t\t\tboolean firstRun = PreferenceManager.getDefaultSharedPreferences(this)\n\t\t\t\t\t\t\t\t\t.contains(PreferenceConstants.FIRSTRUN);\n\t\t\t\tSmackableImp s = YaximApplication.getApp().getSmackable();\n\t\t\t\tException login_error = s.getLastLoginError();\n\t\t\t\tif (login_error instanceof SASLErrorException) {\n\t\t\t\t\t// login failed, bring up first-start dialog\n\t\t\t\t\tfirstRun = true;\n\t\t\t\t}\n\n\t\t\t\tif (firstRun) {\n\t\t\t\t\tshowFirstStartUpDialog(login_error);\n\t\t\t\t}\n\t\t\t} else\n\t\t\tif (cs == ConnectionState.OFFLINE) // override with \"Offline\" string, no error message\n\t\t\t\tmConnectingText.setText(R.string.conn_offline);\n\t\t\telse\n\t\t\t\tmConnectingText.setText(serviceAdapter.getConnectionStateString());\n\t\t\tmConnectingText.setVisibility(View.VISIBLE);\n\t\t\tsetSupportProgressBarIndeterminateVisibility(spinTheSpinner);\n\t\t\tbreak;\n\t\tcase ONLINE:\n\t\t\tmConnectingText.setVisibility(View.GONE);\n\t\t\tsetSupportProgressBarIndeterminateVisibility(false);\n\t\t\tSharedPreferences prefs = PreferenceManager\n\t\t\t\t\t.getDefaultSharedPreferences(this);\n\t\t\tif (prefs.contains(PreferenceConstants.FIRSTRUN)) {\n\t\t\t\t// in case we just registered, re-fire the Intent\n\t\t\t\tprefs.edit().remove(PreferenceConstants.FIRSTRUN).commit();\n\t\t\t\thandleJabberIntent();\n\t\t\t}\n\t\t}\n\t}\n\t\n\tpublic void startConnection(boolean create_account) {\n\t\txmppServiceIntent.putExtra(\"create_account\", create_account);\n\t\tstartService(xmppServiceIntent);\n\t}\n\n\tpublic void startConnectionWithNotificationPermission(boolean create_account) {\n\t\trequestNotificationPermission(create_account ? REQUEST_NOTIFICATION_REGISTER : REQUEST_NOTIFICATION_LOGIN);\n\t}\n\tpublic void requestNotificationPermission(final int requestCode) {\n\t\tif (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {\n\t\t\tonNotificationPermissionGrantedOrDenied(requestCode);\n\t\t\treturn;\n\t\t}\n\t\tif (ContextCompat.checkSelfPermission(this,\n\t\t\t\tManifest.permission.POST_NOTIFICATIONS)\n\t\t\t\t!= PackageManager.PERMISSION_GRANTED) {\n\t\t\tActivityCompat.requestPermissions(MainWindow.this,\n\t\t\t\t\tnew String[]{Manifest.permission.POST_NOTIFICATIONS},\n\t\t\t\t\trequestCode);\n\t\t} else {\n\t\t\t// Permission has already been granted\n\t\t\tonNotificationPermissionGrantedOrDenied(requestCode);\n\t\t}\n\t}\n\n\tpublic void onNotificationPermissionGrantedOrDenied(int requestCode) {\n\t\tif (requestCode != REQUEST_NOTIFICATION_UPGRADE)\n\t\t\tstartConnection(requestCode == REQUEST_NOTIFICATION_REGISTER);\n\t}\n\n\t@Override\n\tpublic void onRequestPermissionsResult(final int requestCode,\n\t\t\t\t\t\t\t\t\t\t   String permissions[], int[] grantResults) {\n\t\tif (grantResults.length < 1 || grantResults[0] != PackageManager.PERMISSION_GRANTED) {\n\t\t\tif (ActivityCompat.shouldShowRequestPermissionRationale(this,\n\t\t\t\t\tManifest.permission.POST_NOTIFICATIONS)) {\n\t\t\t\t/* we don't show the dialog, just pass through - we can't re-request from here anyway */\n\t\t\t}\n\t\t\telse {\n\t\t\t\tToast.makeText(this, getString(R.string.notification_permission_denied), Toast.LENGTH_LONG).show();\n\t\t\t}\n\t\t}\n\t\tonNotificationPermissionGrantedOrDenied(requestCode);\n\t}\n\t// this function changes the prefs to keep the connection\n\t// according to the requested state\n\tprivate void toggleConnection() {\n\t\tif (!mConfig.jid_configured) {\n\t\t\tstartActivity(new Intent(this, AccountPrefs.class));\n\t\t\treturn;\n\t\t}\n\t\tboolean oldState = isConnected() || isConnecting();\n\n\t\tPreferenceManager.getDefaultSharedPreferences(this).edit().\n\t\t\tputBoolean(PreferenceConstants.CONN_STARTUP, !oldState).commit();\n\t\tif (oldState) {\n\t\t\tserviceAdapter.disconnect();\n\t\t\tstopService(xmppServiceIntent);\n\t\t} else\n\t\t\tstartConnectionWithNotificationPermission(false);\n\t}\n\n\tprivate String getConnectDisconnectText() {\n\t\tif (isConnected() || isConnecting()) {\n\t\t\treturn getString(R.string.Menu_disconnect);\n\t\t}\n\t\treturn getString(R.string.Menu_connect);\n\t}\n\n\tprivate void registerXMPPService() {\n\t\tLog.i(TAG, \"called startXMPPService()\");\n\t\txmppServiceIntent = new Intent(this, XMPPService.class);\n\t\t//xmppServiceIntent.setAction(\"org.yaxim.androidclient.XMPPSERVICE\");\n\n\t\txmppServiceConnection = new ServiceConnection() {\n\n\t\t\tpublic void onServiceConnected(ComponentName name, IBinder service) {\n\t\t\t\tLog.i(TAG, \"called onServiceConnected()\");\n\t\t\t\tserviceAdapter = new XMPPRosterServiceAdapter(\n\t\t\t\t\t\tIXMPPRosterService.Stub.asInterface(service));\n\t\t\t\tserviceAdapter.registerUICallback(rosterCallback);\n\t\t\t\tLog.i(TAG, \"getConnectionState(): \"\n\t\t\t\t\t\t+ serviceAdapter.getConnectionState());\n\t\t\t\tinvalidateOptionsMenu();\t// to load the action bar contents on time for access to icons/progressbar\n\t\t\t\tConnectionState cs = serviceAdapter.getConnectionState();\n\t\t\t\tupdateConnectionState(cs);\n\t\t\t\tupdateRoster();\n\n\t\t\t\t// when returning from prefs to main activity, apply new config\n\t\t\t\tif (mConfig.reconnect_required && cs == ConnectionState.ONLINE) {\n\t\t\t\t\t// login config changed, force reconnection\n\t\t\t\t\tserviceAdapter.disconnect();\n\t\t\t\t\tserviceAdapter.connect();\n\t\t\t\t} else if (mConfig.presence_required && isConnected()) {\n\t\t\t\t\tserviceAdapter.setStatusFromConfig();\n\t\t\t\t} else if (mConfig.nickchange_required && isConnected()) {\n\t\t\t\t\tYaximApplication.getApp().getSmackable().updateNickname();\n\t\t\t\t}\n\n\t\t\t\t// handle server-related intents after connecting to the backend\n\t\t\t\thandleJabberIntent();\n\t\t\t}\n\n\t\t\tpublic void onServiceDisconnected(ComponentName name) {\n\t\t\t\tLog.i(TAG, \"called onServiceDisconnected()\");\n\t\t\t}\n\t\t};\n\t}\n\n\tprivate void unbindXMPPService() {\n\t\ttry {\n\t\t\tunbindService(xmppServiceConnection);\n\t\t} catch (IllegalArgumentException e) {\n\t\t\tLog.e(TAG, \"Service wasn't bound!\");\n\t\t}\n\t}\n\n\tprivate void bindXMPPService() {\n\t\tbindService(xmppServiceIntent, xmppServiceConnection, BIND_AUTO_CREATE);\n\t}\n\n\tprivate void registerListAdapter() {\n\n\t\trosterListAdapter = new RosterExpListAdapter(this);\n\t\telv.setAdapter(rosterListAdapter);\n\t}\n\n\tprivate void createUICallback() {\n\t\trosterCallback = new IXMPPRosterCallback.Stub() {\n\t\t\t@Override\n\t\t\tpublic void connectionStateChanged(final int connectionstate)\n\t\t\t\t\t\tthrows RemoteException {\n\t\t\t\tmainHandler.post(new Runnable() {\n\t\t\t\t\tpublic void run() {\n\t\t\t\t\t\tConnectionState cs = ConnectionState.values()[connectionstate];\n\t\t\t\t\t\t//Log.d(TAG, \"connectionStatusChanged: \" + cs);\n\t\t\t\t\t\tupdateConnectionState(cs);\n\t\t\t\t\t\tinvalidateOptionsMenu();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\t}\n\n\t// store mGroupsExpanded into prefs (this is a hack, but SQLite /\n\t// content providers suck wrt. virtual groups)\n\tpublic void storeExpandedState() {\n\t\tSharedPreferences.Editor prefedit = PreferenceManager\n\t\t\t\t.getDefaultSharedPreferences(this).edit();\n\t\tfor (HashMap.Entry<String, Boolean> item : mGroupsExpanded.entrySet()) {\n\t\t\tprefedit.putBoolean(\"expanded_\" + item.getKey(), item.getValue());\n\t\t}\n\t\tprefedit.commit();\n\t}\n\n\t// get the name of a roster group from the cursor\n\tpublic String getGroupName(int groupId) {\n\t\t// default group is \"\" and MUC group is \"\\uFFFF\"\n\t\treturn java.net.URLEncoder.encode(getPackedItemRow(\n\t\t\t\t\tExpandableListView.getPackedPositionForGroup(groupId),\n\t\t\t\t\t\tRosterConstants.GROUP));\n\t}\n\n\tpublic void restoreGroupsExpanded() {\n\t\tSharedPreferences prefs = PreferenceManager\n\t\t\t\t.getDefaultSharedPreferences(this);\n\t\tfor (int count = 0; count < rosterListAdapter.getGroupCount(); count++) {\n\t\t\tString name = getGroupName(count);\n\t\t\tif (!mGroupsExpanded.containsKey(name))\n\t\t\t\tmGroupsExpanded.put(name, prefs.getBoolean(\"expanded_\" + name, true));\n\t\t\tif (mGroupsExpanded.get(name))\n\t\t\t\telv.expandGroup(count);\n\t\t\telse\n\t\t\t\telv.collapseGroup(count);\n\t\t}\n\t}\n\n\tprivate void checkIgnoreBatteryOptimization() {\n\t\tSharedPreferences prefs = PreferenceManager\n\t\t\t\t.getDefaultSharedPreferences(this);\n\t\tif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {\n\t\t\tif (prefs.getLong(PreferenceConstants.DOZE_NAG, 0) > 0)\n\t\t\t\treturn; // we asked the user already\n\t\t\tString pn = getPackageName();\n\t\t\tif (!((PowerManager) getSystemService(POWER_SERVICE)).isIgnoringBatteryOptimizations(pn)) {\n\t\t\t\tprefs.edit().putLong(PreferenceConstants.DOZE_NAG, System.currentTimeMillis()).commit();\n\t\t\t\tstartActivity(new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)\n\t\t\t\t\t\t.setData(Uri.parse(\"package:\" + pn)));\n\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate void showFirstStartUpDialog(Exception error) {\n\t\tString ibr_domain = null;\n\t\tString jid = null;\n\t\tString preauth = null;\n\t\tIntent i = getIntent();\n\t\tif (!mHandledIntent && isJabberIntentAction(i.getAction()) && XMPPHelper.transmogrifyXmppUri(i)) {\n\t\t\tUri data = i.getData();\n\t\t\tif (data.getQueryParameter(\"register\") != null) {\n\t\t\t\tjid = data.getAuthority();\n\t\t\t\tif (!jid.contains(\"@\")) {\n\t\t\t\t\tibr_domain = jid;\n\t\t\t\t\tjid = null;\n\t\t\t\t}\n\t\t\t\tmHandledIntent = true;\n\t\t\t} else if (data.getQueryParameter(\"ibr\") != null) {\n\t\t\t\tString inviter = data.getAuthority();\n\t\t\t\tif (!TextUtils.isEmpty(inviter) && inviter.contains(\"@\"))\n\t\t\t\t\tibr_domain = inviter.split(\"@\")[1];\n\t\t\t}\n\t\t\tpreauth = data.getQueryParameter(\"preauth\");\n\t\t}\n\t\tif (mFirstStartDialog != null)\n\t\t\tmFirstStartDialog.dismiss();\n\t\tmFirstStartDialog = new FirstStartDialog(this, serviceAdapter);\n\t\tmFirstStartDialog.show();\n\t\t// show JID after showing dialog to trigger change listener\n\t\tif (!TextUtils.isEmpty(jid))\n\t\t\tmFirstStartDialog.setJID(jid, preauth);\n\t\telse if (!TextUtils.isEmpty(ibr_domain))\n\t\t\tmFirstStartDialog.setPreAuth(ibr_domain, preauth);\n\t\tif (error != null)\n\t\t\tmFirstStartDialog.setError(error);\n\t}\n\n\tprivate void showFirstStartUpDialogIfPrefsEmpty() {\n\t\tLog.i(TAG, \"showFirstStartUpDialogIfPrefsEmpty, JID: \"\n\t\t\t\t\t\t+ mConfig.jabberID);\n\t\tSharedPreferences prefs = PreferenceManager\n\t\t\t\t.getDefaultSharedPreferences(this);\n\t\tif (mConfig.jabberID.length() < 3 || prefs.contains(PreferenceConstants.FIRSTRUN)) {\n\t\t\t// load preference defaults\n\t\t\tPreferenceManager.setDefaultValues(this, R.xml.mainprefs, false);\n\t\t\tPreferenceManager.setDefaultValues(this, R.xml.accountprefs, false);\n\n\t\t\t// prevent a start-up with empty JID\n\t\t\tprefs.edit().putBoolean(PreferenceConstants.CONN_STARTUP, false).commit();\n\n\t\t\t// show welcome dialog\n\t\t\tshowFirstStartUpDialog(null);\n\t\t} else {\n\t\t\tXMPPHelper.setNFCInvitation(this, mConfig);\n\t\t\t// implement auto-connect when started from launcher\n\t\t\tif (!mConfig.autoConnect && Intent.ACTION_MAIN.equals(getIntent().getAction()))\n\t\t\t\tprefs.edit().putBoolean(PreferenceConstants.CONN_STARTUP, true).commit();\n\t\t\tcheckIgnoreBatteryOptimization();\n\t\t}\n\t}\n\n\tpublic static Intent createIntent(Context context) {\n\t\tIntent i = new Intent(context, MainWindow.class);\n\t\ti.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);\n\t\treturn i;\n\t}\n\n\tprotected void showToastNotification(int message) {\n\t\tToast tmptoast = Toast.makeText(this, message, Toast.LENGTH_SHORT);\n\t\ttmptoast.show();\n\t}\n\n\tprivate static final String OFFLINE_EXCLUSION =\n\t\t\tRosterConstants.STATUS_MODE + \" > \" + StatusMode.offline.ordinal();\n\tprivate static final String countAvailableMembers =\n\t\t\t\"SELECT COUNT() FROM \" + RosterProvider.TABLE_ROSTER + \" inner_query\" +\n\t\t\t\t\t\" WHERE inner_query.\" + RosterConstants.GROUP + \" = \" +\n\t\t\t\t\tRosterProvider.QUERY_ALIAS + \".\" + RosterConstants.GROUP +\n\t\t\t\t\t\" AND inner_query.\" + OFFLINE_EXCLUSION;\n\tprivate static final String countMembers =\n\t\t\t\"SELECT COUNT() FROM \" + RosterProvider.TABLE_ROSTER + \" inner_query\" +\n\t\t\t\t\t\" WHERE inner_query.\" + RosterConstants.GROUP + \" = \" +\n\t\t\t\t\tRosterProvider.QUERY_ALIAS + \".\" + RosterConstants.GROUP;\n\tprivate static final String[] GROUPS_QUERY_COUNTED = new String[] {\n\t\tRosterConstants._ID,\n\t\tRosterConstants.GROUP,\n\t\t\"(\" + countAvailableMembers + \") || '/' || (\" + countMembers + \") AS members\"\n\t};\n\n\tfinal String countAvailableMembersTotals =\n\t\t\t\"SELECT COUNT() FROM \" + RosterProvider.TABLE_ROSTER + \" inner_query\" +\n\t\t\t\t\t\" WHERE inner_query.\" + OFFLINE_EXCLUSION;\n\tfinal String countMembersTotals =\n\t\t\t\"SELECT COUNT() FROM \" + RosterProvider.TABLE_ROSTER;\n\tfinal String[] GROUPS_QUERY_CONTACTS_DISABLED = new String[] {\n\t\t\tRosterConstants._ID,\n\t\t\t\"'' AS \" + RosterConstants.GROUP,\n\t\t\t\"(\" + countAvailableMembersTotals + \") || '/' || (\" + countMembersTotals + \") AS members\",\n\t\t\t\"MIN(\" + RosterConstants._ID + \")\" // cheat: aggregate function to only return a single entry\n\t};\n\n\tprivate static final String[] GROUPS_FROM = new String[] {\n\t\tRosterConstants.GROUP,\n\t\t\"members\"\n\t};\n\tprivate static final int[] GROUPS_TO = new int[] {\n\t\tR.id.groupname,\n\t\tR.id.members\n\t};\n\t// virtual boolean column `subscribe` to sort pending subscriptions to the top\n\tprivate static final String[] ROSTER_QUERY = new String[] {\n\t\tRosterConstants._ID,\n\t\tRosterConstants.JID,\n\t\tRosterConstants.ALIAS,\n\t\tRosterConstants.STATUS_MODE,\n\t\tRosterConstants.STATUS_MESSAGE,\n\t\t\"(\" + RosterConstants.STATUS_MODE + \" == \" + StatusMode.subscribe.ordinal() + \") AS subscribe\",\n\t};\n\n\tpublic class RosterExpListAdapter extends SimpleCursorTreeAdapter {\n\n\t\tpublic RosterExpListAdapter(Context context) {\n\t\t\tsuper(context, /* cursor = */ null, \n\t\t\t\t\tR.layout.maingroup_row, GROUPS_FROM, GROUPS_TO,\n\t\t\t\t\tR.layout.mainchild_row,\n\t\t\t\t\tnew String[] {\n\t\t\t\t\t\tRosterConstants.ALIAS,\n\t\t\t\t\t\tRosterConstants.STATUS_MESSAGE,\n\t\t\t\t\t\tRosterConstants.STATUS_MODE\n\t\t\t\t\t},\n\t\t\t\t\tnew int[] {\n\t\t\t\t\t\tR.id.roster_screenname,\n\t\t\t\t\t\tR.id.roster_statusmsg,\n\t\t\t\t\t\tR.id.roster_icon\n\t\t\t\t\t});\n\t\t}\n\n\t\tpublic void requery() {\n\t\t\tString selectWhere = null;\n\t\t\tif (!mConfig.showOffline)\n\t\t\t\tselectWhere = OFFLINE_EXCLUSION;\n\n\t\t\tUri query_uri = RosterProvider.GROUPS_URI;\n\t\t\tString[] query = GROUPS_QUERY_COUNTED;\n\t\t\tif(!mConfig.enableGroups) {\n\t\t\t\tquery = GROUPS_QUERY_CONTACTS_DISABLED;\n\t\t\t\tquery_uri = RosterProvider.CONTENT_URI;\n\t\t\t}\n\t\t\tCursor cursor = getContentResolver().query(query_uri,\n\t\t\t\t\tquery, selectWhere, null, RosterConstants.GROUP);\n\t\t\tCursor oldCursor = getCursor();\n\t\t\tchangeCursor(cursor);\n\t\t\tif (oldCursor != null)\n\t\t\t\tstopManagingCursor(oldCursor);\n\t\t}\n\n\t\t@Override\n\t\tprotected Cursor getChildrenCursor(Cursor groupCursor) {\n\t\t\t// Given the group, we return a cursor for all the children within that group\n\t\t\tString selectWhere;\n\t\t\tint idx = groupCursor.getColumnIndex(RosterConstants.GROUP);\n\t\t\tString groupname = groupCursor.getString(idx);\n\t\t\tString[] args = null;\n\n\t\t\tif(!mConfig.enableGroups) {\n\t\t\t\tselectWhere = mConfig.showOffline ? \"\" : OFFLINE_EXCLUSION;\n\t\t\t} else {\n\t\t\t\tselectWhere = mConfig.showOffline ? \"\" : OFFLINE_EXCLUSION + \" AND \";\n\t\t\t\tselectWhere += RosterConstants.GROUP + \" = ?\";\n\t\t\t\targs = new String[] { groupname };\n\t\t\t}\n\t\t\treturn getContentResolver().query(RosterProvider.CONTENT_URI, ROSTER_QUERY,\n\t\t\t\tselectWhere, args, \"subscribe DESC, \" + RosterConstants.ALIAS + \" COLLATE NOCASE\");\n\t\t}\n\n\t\t@Override\n\t\tprotected void bindGroupView(View view, Context context, Cursor cursor, boolean isExpanded) {\n\t\t\tsuper.bindGroupView(view, context, cursor, isExpanded);\n\t\t\tif (cursor.getString(cursor.getColumnIndexOrThrow(RosterConstants.GROUP)).length() == 0) {\n\t\t\t\tTextView groupname = (TextView)view.findViewById(R.id.groupname);\n\t\t\t\tgroupname.setText(mConfig.enableGroups ? R.string.default_group : R.string.all_contacts_group);\n\t\t\t} else\n\t\t\tif (cursor.getString(cursor.getColumnIndexOrThrow(RosterConstants.GROUP)).equals(RosterProvider.RosterConstants.MUCS)) {\n\t\t\t\t((TextView)view.findViewById(R.id.groupname)).setText(R.string.muc_group);\n\t\t\t}\n\t\t}\n\n\t\t@Override\n\t\tprotected void bindChildView(View view, Context context, Cursor cursor, boolean isLastChild) {\n\t\t\tsuper.bindChildView(view, context, cursor, isLastChild);\n\t\t\tTextView statusmsg = (TextView)view.findViewById(R.id.roster_statusmsg);\n\t\t\tboolean hasStatus = statusmsg.getText() != null && statusmsg.getText().length() > 0;\n\t\t\tstatusmsg.setVisibility(hasStatus ? View.VISIBLE : View.GONE);\n\n\t\t\tString jid = cursor.getString(cursor.getColumnIndex(RosterConstants.JID));\n\t\t\tTextView unreadmsg = (TextView)view.findViewById(R.id.roster_unreadmsg_cnt);\n\t\t\tInteger count = mUnreadCounters.get(jid);\n\t\t\tif (count == null)\n\t\t\t\tcount = 0;\n\t\t\tunreadmsg.setText(count.toString());\n\t\t\tunreadmsg.setVisibility(count > 0 ? View.VISIBLE : View.GONE);\n\t\t\tunreadmsg.bringToFront();\n\t\t}\n\n\t\t protected void setViewImage(ImageView v, String value) {\n\t\t\tint presenceMode = Integer.parseInt(value);\n\t\t\tv.setImageResource(getIconForPresenceMode(presenceMode));\n\t\t }\n\n\t\tprivate int getIconForPresenceMode(int presenceMode) {\n\t\t\tif (!isConnected()) // override icon if we are offline\n\t\t\t\tpresenceMode = 0;\n\t\t\treturn StatusMode.values()[presenceMode].getDrawableId();\n\t\t}\n\t}\n\n\tprivate class RosterObserver extends ContentObserver {\n\t\tpublic RosterObserver() {\n\t\t\tsuper(mainHandler);\n\t\t}\n\t\tpublic void onChange(boolean selfChange) {\n\t\t\tLog.d(TAG, \"RosterObserver.onChange: \" + selfChange);\n\t\t\t// work around race condition in ExpandableListView, which collapses\n\t\t\t// groups rand-f**king-omly\n\t\t\tif (rosterListAdapter != null)\n\t\t\t\tmainHandler.postDelayed(new Runnable() {\n\t\t\t\t\tpublic void run() {\n\t\t\t\t\t\trestoreGroupsExpanded();\n\t\t\t\t\t}}, 100);\n\t\t}\n\t}\n\n\tprivate HashMap<String, Integer> mUnreadCounters = new HashMap<String, Integer>();\n\tprivate class LoadUnreadTask extends AsyncTask<Void, Void, HashMap<String, Integer>> {\n\t\t@Override\n\t\tprotected HashMap<String, Integer> doInBackground(Void...voids) {\n\t\t\tfinal String[] PROJECTION = new String[] { ChatConstants.JID, \"count(*)\" };\n\t\t\tfinal String SELECTION = ChatConstants.DIRECTION + \" = \" + ChatConstants.INCOMING + \" AND \" +\n\t\t\t\t\tChatConstants.DELIVERY_STATUS + \" = \" + ChatConstants.DS_NEW +\n\t\t\t\t\t\") GROUP BY (\" + ChatConstants.JID; // hack!\n\n\t\t\tCursor c = getContentResolver().query(ChatProvider.CONTENT_URI,\n\t\t\t\t\tPROJECTION, SELECTION, null, null);\n\t\t\tHashMap<String, Integer> result = new HashMap<String, Integer>();\n\t\t\tif(c!=null){\n\t\t\t\twhile (c.moveToNext())\n\t\t\t\t\tresult.put(c.getString(0), c.getInt(1));\n\t\t\t\tc.close();\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\n\t\t@Override\n\t\tprotected void onPostExecute(HashMap<String, Integer> result) {\n\t\t\tmUnreadCounters = result;\n\t\t\telv.invalidateViews();\n\t\t}\n\n\t}\n\n\tlong mLoadUnreadLast = 0;\n\tprivate Runnable mLoadUnread = new Runnable() {\n\t\t@Override\n\t\tpublic void run() {\n\t\t\tnew LoadUnreadTask().execute();\n\t\t\tmLoadUnreadLast = System.currentTimeMillis();\n\t\t}\n\t};\n\n\tprivate class ChatObserver extends ContentObserver {\n\t\tpublic ChatObserver() {\n\t\t\tsuper(mainHandler);\n\t\t}\n\t\tpublic void onChange(boolean selfChange) {\n\t\t\tmainHandler.removeCallbacks(mLoadUnread);\n\t\t\tlong ts = System.currentTimeMillis();\n\t\t\tif (ts > mLoadUnreadLast + 1000)\n\t\t\t\tmLoadUnread.run();\n\t\t\telse\n\t\t\t\tmainHandler.postDelayed(mLoadUnread, 200);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/ThemedActivity.java",
    "content": "package org.yaxim.androidclient;\n\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.support.v7.app.ActionBar;\nimport android.support.v7.app.AppCompatActivity;\nimport android.text.TextUtils;\nimport android.util.Log;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport org.yaxim.androidclient.data.YaximConfiguration;\n\n/**\n * Base Activity for all non-preference yaxim activities.\n *\n * Provides theme, config and custom ActionBar.\n */\n\npublic class ThemedActivity extends AppCompatActivity {\n\tprotected ActionBar actionBar;\n\tprotected YaximConfiguration mConfig;\n\tprotected String mTheme;\n\tprotected ImageView mStatusMode;\n\tprotected TextView mTitle;\n\tprotected TextView mSubTitle;\n\n\t@Override\n\tprotected void onCreate(@Nullable Bundle savedInstanceState) {\n\t\tsuper.onCreate(savedInstanceState);\n\t\tmConfig = YaximApplication.getConfig();\n\t\tmTheme = mConfig.theme;\n\t\tsetTheme(mConfig.getTheme());\n\t\tactionBar = getSupportActionBar();\n\t\t// set custom title layout\n\t\tLayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);\n\t\tView layout = inflater.inflate(R.layout.chat_action_title, null);\n\t\tmStatusMode = (ImageView)layout.findViewById(R.id.action_bar_status);\n\t\tmTitle = (TextView)layout.findViewById(R.id.action_bar_title);\n\t\tmSubTitle = (TextView)layout.findViewById(R.id.action_bar_subtitle);\n\t\tmTitle.setText(getTitle());\n\t\tactionBar.setTitle(null);\n\t\tactionBar.setCustomView(layout);\n\t\tactionBar.setDisplayShowCustomEnabled(true);\n\t\tlayout.setClickable(true);\n\t\tlayout.setOnClickListener(new View.OnClickListener() {\n\t\t\t@Override\n\t\t\tpublic void onClick(View view) {\n\t\t\t\tonTitleClicked(view);\n\t\t\t}\n\t\t});\n\t}\n\t@Override\n\tpublic void setTitle(CharSequence title) {\n\t\tmTitle.setText(title);\n\n\t}\n\tpublic void setSubtitle(CharSequence subtitle) {\n\t\tmSubTitle.setText(subtitle);\n\t\tmSubTitle.setVisibility(TextUtils.isEmpty(subtitle) ? View.GONE : View.VISIBLE);\n\n\t}\n\tpublic void setIcon(int drawable) {\n\t\tmStatusMode.setImageDrawable(getResources().getDrawable(drawable /*, mConfig.getTheme()*/));\n\t}\n\tprotected void onTitleClicked(View view) {\n\t\tLog.d(\"ThemedActivity\", \"Title clicked: \" + view);\n\t}\n}\n\n"
  },
  {
    "path": "src/org/yaxim/androidclient/XMPPRosterServiceAdapter.java",
    "content": "package org.yaxim.androidclient;\n\nimport org.yaxim.androidclient.util.ConnectionState;\n\nimport android.os.RemoteException;\nimport android.util.Log;\nimport org.yaxim.androidclient.IXMPPRosterCallback;\nimport org.yaxim.androidclient.service.IXMPPRosterService;\n\npublic class XMPPRosterServiceAdapter {\n\t\n\tprivate static final String TAG = \"yaxim.XMPPRSAdapter\";\n\tprivate IXMPPRosterService xmppServiceStub;\n\t\n\tpublic XMPPRosterServiceAdapter(IXMPPRosterService xmppServiceStub) {\n\t\tLog.i(TAG, \"New XMPPRosterServiceAdapter construced\");\n\t\tthis.xmppServiceStub = xmppServiceStub;\n\t}\n\t\n\tpublic void setStatusFromConfig() {\n\t\ttry {\n\t\t\txmppServiceStub.setStatusFromConfig();\n\t\t} catch (RemoteException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t}\n\n\tpublic void addRosterItem(String user, String alias, String group, String token) {\n\t\ttry {\n\t\t\txmppServiceStub.addRosterItem(user, alias, group, token);\n\t\t} catch (RemoteException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t}\n\t\n\tpublic void renameRosterGroup(String group, String newGroup){\n\t\ttry {\n\t\t\txmppServiceStub.renameRosterGroup(group, newGroup);\n\t\t} catch (RemoteException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t}\n\t\n\tpublic void renameRosterItem(String contact, String newItemName){\n\t\ttry {\n\t\t\txmppServiceStub.renameRosterItem(contact, newItemName);\n\t\t} catch (RemoteException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t}\n\t\n\t\n\tpublic void moveRosterItemToGroup(String user, String group){\n\t\ttry {\n\t\t\txmppServiceStub.moveRosterItemToGroup(user, group);\n\t\t} catch (RemoteException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t}\n\t\n\tpublic void addRosterGroup(String group){\n\t\ttry {\n\t\t\txmppServiceStub.addRosterGroup(group);\n\t\t} catch (RemoteException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t}\n\t\n\tpublic void removeRosterItem(String user) {\n\t\ttry {\n\t\t\txmppServiceStub.removeRosterItem(user);\n\t\t} catch (RemoteException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t}\n\t\n\tpublic void disconnect() {\n\t\ttry {\n\t\t\txmppServiceStub.disconnect();\n\t\t} catch (RemoteException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t}\n\t\n\tpublic void connect() {\n\t\ttry {\n\t\t\txmppServiceStub.connect();\n\t\t} catch (RemoteException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t}\n\n\tpublic void registerUICallback(IXMPPRosterCallback uiCallback) {\n\t\ttry {\n\t\t\txmppServiceStub.registerRosterCallback(uiCallback);\n\t\t} catch (RemoteException e) {\n\t\t\te.printStackTrace();\n\t\t} catch (NullPointerException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t}\n\n\tpublic void unregisterUICallback(IXMPPRosterCallback uiCallback) {\n\t\ttry {\n\t\t\txmppServiceStub.unregisterRosterCallback(uiCallback);\n\t\t} catch (RemoteException e) {\n\t\t\te.printStackTrace();\n\t\t} catch (NullPointerException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t}\n\n\tpublic ConnectionState getConnectionState() {\n\t\ttry {\n\t\t\treturn ConnectionState.values()[xmppServiceStub.getConnectionState()];\n\t\t} catch (RemoteException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t\treturn ConnectionState.OFFLINE;\n\t}\n\n\tpublic String getConnectionStateString() {\n\t\ttry {\n\t\t\treturn xmppServiceStub.getConnectionStateString();\n\t\t} catch (RemoteException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t\treturn null;\n\t}\n\n\tpublic boolean isAuthenticated() {\n\t\treturn getConnectionState() == ConnectionState.ONLINE || getConnectionState() == ConnectionState.LOADING;\n\t}\n\n\tpublic void sendPresenceRequest(String user, String type) {\n\t\ttry {\n\t\t\txmppServiceStub.sendPresenceRequest(user, type);\n\t\t} catch (RemoteException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t}\n\n\tpublic String changePassword(String newPassword) {\n\t\ttry {\n\t\t\treturn xmppServiceStub.changePassword(newPassword);\n\t\t} catch (RemoteException e) {\n\t\t\te.printStackTrace();\n\t\t\treturn \"Internal yaxim service connection failure.\";\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/YaximApplication.java",
    "content": "package org.yaxim.androidclient;\n\nimport org.jivesoftware.smack.android.AndroidSmackInitializer;\nimport org.yaxim.androidclient.data.YaximConfiguration;\nimport org.yaxim.androidclient.service.InstallReferrerReceiver;\nimport org.yaxim.androidclient.service.SmackableImp;\nimport org.yaxim.androidclient.service.YaximBroadcastReceiver;\nimport org.yaxim.androidclient.util.ErrorReportManager;\nimport org.yaxim.androidclient.util.JULHandler;\nimport org.yaxim.androidclient.util.PreferenceConstants;\n\nimport android.app.Application;\nimport android.content.BroadcastReceiver;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.IntentFilter;\nimport android.content.SharedPreferences;\nimport android.os.Build;\nimport android.preference.PreferenceManager;\nimport android.support.v7.app.AppCompatDelegate;\n\nimport java.util.logging.Level;\nimport java.util.logging.LogManager;\nimport java.util.logging.Logger;\n\nimport de.duenndns.ssl.MemorizingTrustManager;\n\npublic class YaximApplication extends Application {\n\t// identity type, see:\n\t// http://xmpp.org/registrar/disco-categories.html\n\t// identity name is `app_name` string\n\tpublic static final String XMPP_IDENTITY_TYPE = \"phone\";\n\n\tprivate static YaximApplication app;\n\n\t// MTM is needed globally for both the backend (connect)\n\t// and the frontend (display dialog)\n\tpublic MemorizingTrustManager mMTM;\n\n\tprivate YaximConfiguration mConfig;\n\tprivate SmackableImp mSmackable;\n\n\tpublic static YaximApplication getInstance() {\n\t\treturn app;\n\t}\n\n\tpublic YaximApplication() {\n\t\tsuper();\n\t\tapp = this;\n\t}\n\n\t@Override\n\tpublic void onCreate() {\n\t\tsuper.onCreate();\n\t\tnew ErrorReportManager(this);\n\t\tAppCompatDelegate.setCompatVectorFromResourcesEnabled(true);\n\t\tmMTM = new MemorizingTrustManager(this);\n\t\tmConfig = new YaximConfiguration(this);\n\t\tJULHandler.reset(new JULHandler());\n\t\tLogManager.getLogManager().getLogger(Logger.GLOBAL_LOGGER_NAME).setLevel(Level.FINE);\n\t\t// Initialize DNS, https://discourse.igniterealtime.org/t/smack-only-using-google-dns-for-srv-android/88164\n\t\tAndroidSmackInitializer.initialize(this);\n\n\t\tSharedPreferences prefs = PreferenceManager\n\t\t\t.getDefaultSharedPreferences(this);\n\t\tif (mConfig.jabberID.length() < 3 || prefs.contains(PreferenceConstants.FIRSTRUN)) {\n\t\t\tInstallReferrerReceiver.queryInstallReferrerLibrary(this);\n\t\t}\n\n\t\t// since Android 7, you need to manually register for network changes\n\t\t// https://developer.android.com/training/monitoring-device-state/connectivity-monitoring.html#MonitorChanges\n\t\tregisterReceiver(new YaximBroadcastReceiver(), new IntentFilter(android.net.ConnectivityManager.CONNECTIVITY_ACTION), Context.RECEIVER_EXPORTED);\n\t}\n\n\t// TODO: remove this when migrating to AndroidX\n\t@Override\n\tpublic Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, int flags) {\n\t\tif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE)\n\t\t\treturn super.registerReceiver(receiver, filter, flags);\n\t\telse\n\t\t\treturn super.registerReceiver(receiver, filter);\n\t}\n\n\tpublic static YaximApplication getApp() { return app; }\n\tpublic static YaximConfiguration getConfig() { return app.mConfig; }\n\n\t// short-cut from the UI to the network\n\tpublic SmackableImp getSmackable() {\n\t\treturn mSmackable;\n\t}\n\tpublic void setSmackable(SmackableImp smackable) {\n\t\tmSmackable = smackable;\n\t}\n}\n\n"
  },
  {
    "path": "src/org/yaxim/androidclient/chat/ChatWindow.java",
    "content": "package org.yaxim.androidclient.chat;\n\nimport java.io.File;\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.Locale;\nimport java.util.regex.Matcher;\n\nimport android.Manifest;\nimport android.content.*;\nimport android.content.pm.PackageManager;\nimport android.graphics.Bitmap;\nimport android.os.*;\nimport android.provider.MediaStore;\n\nimport org.yaxim.androidclient.BuildConfig;\nimport org.yaxim.androidclient.FileHttpUploadTask;\n\nimport org.yaxim.androidclient.MainWindow;\nimport org.yaxim.androidclient.R;\nimport org.yaxim.androidclient.ThemedActivity;\nimport org.yaxim.androidclient.data.ChatHelper;\nimport org.yaxim.androidclient.data.ChatProvider;\nimport org.yaxim.androidclient.data.ChatProvider.ChatConstants;\nimport org.yaxim.androidclient.data.RosterProvider;\nimport org.yaxim.androidclient.service.IXMPPChatService;\nimport org.yaxim.androidclient.service.XMPPService;\nimport org.yaxim.androidclient.util.FileHelper;\nimport org.yaxim.androidclient.util.MessageStylingHelper;\nimport org.yaxim.androidclient.util.StatusMode;\nimport org.yaxim.androidclient.util.XMPPHelper;\n\nimport eu.siacs.conversations.utils.StylingHelper;\n\nimport android.support.v4.app.ActivityCompat;\nimport android.support.v4.content.ContextCompat;\nimport android.support.v4.content.FileProvider;\nimport android.support.v4.view.MenuItemCompat;\nimport android.support.v7.widget.SearchView;\n\nimport android.view.Menu;\nimport android.view.MenuInflater;\nimport android.view.MenuItem;\nimport android.view.Window;\n\nimport android.database.ContentObserver;\nimport android.database.Cursor;\nimport android.graphics.drawable.ColorDrawable;\nimport android.graphics.drawable.TransitionDrawable;\nimport android.net.Uri;\nimport android.support.v4.app.LoaderManager;\nimport android.support.v4.content.CursorLoader;\nimport android.support.v4.content.Loader;\nimport android.text.ClipboardManager;\nimport android.text.Editable;\nimport android.text.SpannableStringBuilder;\nimport android.text.TextUtils;\nimport android.text.TextWatcher;\nimport android.text.util.Linkify;\nimport android.util.Log;\nimport android.util.TypedValue;\nimport android.view.ContextMenu;\nimport android.view.KeyEvent;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.View.OnKeyListener;\nimport android.view.inputmethod.InputMethodManager;\nimport android.view.WindowManager;\nimport android.widget.*;\nimport android.widget.AdapterView.AdapterContextMenuInfo;\n\nimport com.koushikdutta.urlimageviewhelper.UrlImageViewCallback;\nimport com.koushikdutta.urlimageviewhelper.UrlImageViewHelper;\n\n@SuppressWarnings(\"deprecation\") /* recent ClipboardManager only available since API 11 */\npublic class ChatWindow extends ThemedActivity implements OnKeyListener,\n\t\tTextWatcher, LoaderManager.LoaderCallbacks<Cursor>, AbsListView.OnScrollListener {\n\n\tprivate static final int REQUEST_FILE = 1;\n\tprivate static final int REQUEST_IMAGE = 2;\n\tprivate static final int REQUEST_CAMERA = 3;\n\n\tpublic static final String INTENT_EXTRA_USERNAME = ChatWindow.class.getName() + \".username\";\n\tpublic static final String INTENT_EXTRA_MESSAGE = ChatWindow.class.getName() + \".message\";\n\t\n\tprivate static final String TAG = \"yaxim.ChatWindow\";\n\tprivate static final String[] PROJECTION_FROM = new String[] {\n\t\t\tChatConstants._ID, ChatConstants.DATE,\n\t\t\tChatConstants.DIRECTION, ChatConstants.JID,\n\t\t\tChatConstants.RESOURCE, ChatConstants.MESSAGE, ChatConstants.MSGFLAGS,\n\t\t\tChatConstants.ERROR, ChatConstants.CORRECTION, ChatConstants.EXTRA,\n\t\t\tChatConstants.DELIVERY_STATUS, ChatConstants.PACKET_ID };\n\n\tprivate static final int[] PROJECTION_TO = new int[] { R.id.chat_date,\n\t\t\tR.id.chat_from, R.id.chat_message, R.id.chat_error };\n\t\n\tprivate static final int DELAY_NEWMSG = 3000;\n\tprivate static final int CHAT_MSG_LOADER = 0;\n\tprivate int lastlog_size = 200;\n\tprivate int lastlog_index = -1;\n\tprivate File cameraPictureFile = null;\n\tprivate Uri cameraPictureUri = null;\n\n\tprivate static HashMap<String, String> messageDrafts = new HashMap<String, String>();\n\n\tprivate ContentObserver mContactObserver = new ContactObserver();\n\tprivate Button mSendButton = null;\n\tprivate ProgressBar mLoadingProgress;\n\tprotected EditText mChatInput = null;\n\tprotected String mWithJabberID = null;\n\tprotected String mUserScreenName = null;\n\tprotected boolean mIsMucPM = false;\n\tprivate boolean isContact = false;\n\tprivate Intent mChatServiceIntent;\n\tprivate ServiceConnection mChatServiceConnection;\n\tprivate XMPPChatServiceAdapter mChatServiceAdapter;\n\tprivate int mChatFontSize;\n\tprivate ListView mListView;\n\tprotected ChatWindowAdapter mChatAdapter;\n\tprotected SearchView mSearchView;\n\tprotected String mSearchQuery = \"\";\n\n\tvolatile boolean mMarkRunnableQuit = false;\n\tprivate Runnable mMarkRunnable = new Runnable() {\n\t\t@Override\n\t\tpublic void run() {\n\t\t\tLog.d(TAG, \"mMarkRunnable: running...\");\n\t\t\tmarkReadMessagesInDb();\n\t\t\tLog.d(TAG, \"mMarkRunnable: done...\");\n\t\t\tif (mMarkRunnableQuit)\n\t\t\t\tmMarkThread.quit();\n\t\t}\n\t};\n\tprivate HandlerThread mMarkThread;\n\tprivate Handler mMarkHandler;\n\tprivate final HashSet<Long> mReadMessages = new HashSet<Long>();\n\n\tprivate boolean mShowOrHide = true;\n\n\t@Override\n\tpublic void onCreate(Bundle savedInstanceState) {\n\t\tString titleUserid = setContactFromUri();\n\t\tLog.d(TAG, \"onCreate, registering XMPP service\");\n\t\tregisterXMPPService();\n\n\t\tsuper.onCreate(savedInstanceState);\n\t\tif (!mIsMucPM)\n\t\t\tXMPPHelper.setStaticNFC(this, \"xmpp:\" + java.net.URLEncoder.encode(mWithJabberID) + \"?roster;name=\" + java.net.URLEncoder.encode(mUserScreenName));\n\n\t\tmChatFontSize = Integer.valueOf(mConfig.chatFontSize);\n\n\t\tgetWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED);\n\n\t\tsetContentView(R.layout.mainchat);\n\n\t\tgetContentResolver().registerContentObserver(RosterProvider.CONTENT_URI,\n\t\t\t\ttrue, mContactObserver);\n\t\t\n\t\t// Setup the actual chat view\n\t\tmListView = (ListView) findViewById(android.R.id.list);\n\t\tmChatAdapter = new ChatWindowAdapter(null, PROJECTION_FROM, PROJECTION_TO,\n\t\t\t\tmWithJabberID, null);\n\t\tmListView.setAdapter(mChatAdapter);\n\t\tmListView.setOnScrollListener(this);\n\n\t\tLog.d(TAG, \"registrs for contextmenu...\");\n\t\tregisterForContextMenu(mListView);\n\t\tsetSendButton();\n\t\tsetUserInput();\n\t\t\n\t\tsetTitle(titleUserid);\n\n\t\t// Setup the loader\n\t\tgetSupportLoaderManager().initLoader(CHAT_MSG_LOADER, null, this);\n\n\t\t// Loading progress\n\t\tmLoadingProgress = (ProgressBar) findViewById(R.id.loading_progress);\n\t\tmLoadingProgress.setVisibility(View.VISIBLE);\n\n\t\tmMarkThread = new HandlerThread(\"MarkAsReadThread: \" + mWithJabberID);\n\t\tmMarkThread.start();\n\t\tmMarkHandler = new Handler(mMarkThread.getLooper());\n\t}\n\n\t@Override\n\tpublic Loader<Cursor> onCreateLoader(int i, Bundle bundle) {\n\t\t// There's only one Loader, so ...\n\t\tif (!TextUtils.isEmpty(mSearchQuery)) {\n\t\t\treturn new CursorLoader(this, ChatProvider.CONTENT_URI, PROJECTION_FROM,\n\t\t\t\t\t\"jid = ? AND message LIKE ?\", new String[]{mWithJabberID, \"%\" + mSearchQuery + \"%\"}, \"date\");\n\t\t}\n\t\tlong start_id = ChatHelper.getChatHistoryStartId(this, mWithJabberID, lastlog_size);\n\t\treturn new CursorLoader(this, ChatProvider.CONTENT_URI, PROJECTION_FROM,\n\t\t\t\t\"jid = ? AND _id > ?\", new String[] { mWithJabberID, \"\" + start_id }, \"date\");\n\t}\n\n\t@Override\n\tpublic void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {\n\t\tmLoadingProgress.setVisibility(View.GONE);\n\t\tmChatAdapter.changeCursor(cursor);\n\n\t\t// Only do this the first time (show or hide the keyboard)\n\t\tif (mShowOrHide) {\n\t\t\tif (cursor.getCount() == 0) {\n\t\t\t\tshowKeyboard();\n\t\t\t}\n\t\t\tmShowOrHide = false;\n\t\t}\n\n\t\t// correct position after loading more lastlog\n\t\tif (lastlog_index >= 0 && TextUtils.isEmpty(mSearchQuery)) {\n\t\t\tint delta = 1 + mChatAdapter.getCursor().getCount() - lastlog_index;\n\t\t\tmListView.setSelection(delta);\n\t\t\tlastlog_index = -1;\n\t\t}\n\t}\n\n\t@Override\n\tpublic void onLoaderReset(Loader<Cursor> cursorLoader) {\n\t\t// Make sure we don't leak the (memory of the) cursor\n\t\tmChatAdapter.changeCursor(null);\n\t}\n\n\tpublic void increaseLastLog() {\n\t\t// only trigger this if we already have a cursor and that was LIMITed by lastlog_size\n\t\tif (mChatAdapter.getCursor() != null && mChatAdapter.getCursor().getCount() >= lastlog_size) {\n\t\t\tLog.d(TAG, \"increaseLastLog: \" + mChatAdapter.getCursor().getCount() + \" += 200\");\n\t\t\tlastlog_index = mChatAdapter.getCursor().getCount();\n\t\t\tlastlog_size = lastlog_index + 200;\n\t\t\tgetSupportLoaderManager().restartLoader(CHAT_MSG_LOADER, null, this /*LoaderCallbacks<Cursor>*/);\n\t\t}\n\t}\n\n\t/* AbsListView.OnScrollListener */\n\t@Override\n\tpublic void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {\n\t\t// if we have pending mark-read messages, delay them further. ScrollView doesn't like it otherwise\n\t\tif (mReadMessages.size() > 0) {\n\t\t\tmMarkHandler.removeCallbacks(mMarkRunnable);\n\t\t\tmMarkHandler.postDelayed(mMarkRunnable, DELAY_NEWMSG);\n\t\t}\n\t\t// re-query the lastlog when reaching the first item\n\t\tif (visibleItemCount > 0 && firstVisibleItem == 0)\n\t\t\tincreaseLastLog();\n\t}\n\t@Override\n\tpublic void onScrollStateChanged (AbsListView view, int scrollState) {\n\t\t// ignore, not needed for infinite scrolling\n\t}\n\n\n\t// onPause/onResume are not called on older Androids when the lockscreen is\n\t// right in front of a chat window. onWindowFocusChanged is toggled\n\t// when the MUC contacts are shown.\n\t// We need to count both events to reliably bind/unbind our service. Sigh.\n\t// We bind if at least one of them happens, and unbind when both are\n\t// reversed.\n\tprotected int needs_to_bind_unbind = 0;\n\n\tprotected void changeBoundness(int direction) {\n\t\tif (needs_to_bind_unbind == 0)\n\t\t\tbindXMPPService();\n\t\tneeds_to_bind_unbind += direction;\n\t\tif (needs_to_bind_unbind == 0)\n\t\t\tunbindXMPPService();\n\t}\n\n\tpublic void sendFile(Uri path, int flags) {\n\t\tmChatServiceAdapter.sendFile(path, mWithJabberID, flags);\n\t}\n\n\tpublic void requestStoragePermissionAndRun(int request_id) {\n\t\tif (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q &&\n\t\t\tContextCompat.checkSelfPermission(this,\n\t\t\t\tManifest.permission.WRITE_EXTERNAL_STORAGE)\n\t\t\t\t!= PackageManager.PERMISSION_GRANTED) {\n\t\t\tif (ActivityCompat.shouldShowRequestPermissionRationale(this,\n\t\t\t\t\tManifest.permission.WRITE_EXTERNAL_STORAGE)) {\n\t\t\t\t// Show an explanation to the user *asynchronously* -- don't block\n\t\t\t\t// this thread waiting for the user's response! After the user\n\t\t\t\t// sees the explanation, try again to request the permission.\n\t\t\t\tToast.makeText(this, getString(R.string.storage_permission, getString(R.string.app_name)), Toast.LENGTH_LONG).show();\n\t\t\t}\n\t\t\tActivityCompat.requestPermissions(this,\n\t\t\t\t\tnew String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},\n\t\t\t\t\trequest_id);\n\n\t\t} else {\n\t\t\t// Permission has already been granted\n\t\t\trunPermissionAction(request_id);\n\t\t}\n\t}\n\n\tpublic int requestIdForMenuId(int menu_id) {\n\t\tswitch (menu_id) {\n\t\tcase R.id.roster_contextmenu_take_image: return REQUEST_CAMERA;\n\t\tcase R.id.roster_contextmenu_send_image: return REQUEST_IMAGE;\n\t\tcase R.id.roster_contextmenu_send_file: return REQUEST_FILE;\n\t\tdefault: throw new IllegalStateException(\"Unknown menu ID!\");\n\t\t}\n\t}\n\tpublic void runPermissionAction(int request_id) {\n\t\tIntent intent;\n\t\tswitch (request_id) {\n\t\tcase REQUEST_CAMERA:\n\t\t\tintent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);\n\t\t\tcameraPictureFile = FileHelper.createImageFile(this);\n\t\t\tif (cameraPictureFile == null) {\n\t\t\t\tToast.makeText(this, \"Error creating file!\", Toast.LENGTH_SHORT).show();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcameraPictureUri = FileProvider.getUriForFile(this,\n\t\t\t\t\tBuildConfig.APPLICATION_ID + \".provider.Files\",\n\t\t\t\t\tcameraPictureFile);\n\t\t\tintent.putExtra(MediaStore.EXTRA_OUTPUT, cameraPictureUri);\n\t\t\tstartActivityForResult(Intent.createChooser(intent, getString(R.string.roster_contextmenu_take_image)), REQUEST_CAMERA);\n\t\t\treturn;\n\t\tcase REQUEST_IMAGE:\n\t\t\tintent = new Intent(Intent.ACTION_GET_CONTENT);\n\t\t\tintent.setType(\"image/*\");\n\t\t\tintent.addCategory(Intent.CATEGORY_OPENABLE);\n\t\t\tstartActivityForResult(Intent.createChooser(intent, getString(R.string.roster_contextmenu_send_image)), REQUEST_IMAGE);\n\t\t\treturn;\n\t\tcase REQUEST_FILE:\n\t\t\tIntent fileIntent = new Intent(Intent.ACTION_GET_CONTENT);\n\t\t\tfileIntent.setType(\"*/*\");\n\t\t\tfileIntent.addCategory(Intent.CATEGORY_OPENABLE);\n\t\t\tstartActivityForResult(Intent.createChooser(fileIntent, getString(R.string.roster_contextmenu_send_file)), REQUEST_FILE);\n\t\t\treturn;\n\t\t}\n\t}\n\t@Override\n\tpublic void onRequestPermissionsResult(int requestCode,\n\t\t   String permissions[], int[] grantResults) {\n\t\tif (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)\n\t\t\trunPermissionAction(requestCode);\n\t\telse\n\t\t\tToast.makeText(this, getString(R.string.storage_permission, getString(R.string.app_name)), Toast.LENGTH_LONG).show();\n\t}\n\n\t\t@Override\n\tpublic void onActivityResult(int requestCode, int resultCode, Intent data) {\n\t\tif (resultCode != RESULT_OK)\n\t\t\treturn;\n\t\tif (requestCode == REQUEST_FILE || requestCode == REQUEST_IMAGE) {\n\t\t\tUri uri = data.getData();\n\t\t\tif (uri != null) {\n\t\t\t\tint flags = 0;\n\t\t\t\tif (requestCode == REQUEST_IMAGE)\n\t\t\t\t\tflags |= FileHttpUploadTask.F_RESIZE;\n\t\t\t\tsendFile(uri, flags);\n\t\t\t}\n\t\t} else if (requestCode == REQUEST_CAMERA && cameraPictureUri != null) {\n\t\t\tsendFile(Uri.fromFile(cameraPictureFile), FileHttpUploadTask.F_RESIZE);\n\t\t}\n\t}\n\n\t@Override\n\tprotected void onResume() {\n\t\tLog.d(TAG, \"onResume\");\n\t\tsuper.onResume();\n\t\tupdateContactStatus();\n\t\tchangeBoundness(+1);\n\t}\n\n\t@Override\n\tprotected void onPause() {\n\t\tLog.d(TAG, \"onPause\");\n\t\tString inputText = mChatInput.getText().toString();\n\t\tif (!TextUtils.isEmpty(inputText))\n\t\t\tmessageDrafts.put(mWithJabberID, inputText);\n\t\telse\n\t\t\tmessageDrafts.remove(mWithJabberID);\n\t\tsuper.onPause();\n\t\tchangeBoundness(-1);\n\t}\n\n\t@Override\n\tpublic void onWindowFocusChanged(boolean hasFocus) {\n\t\tLog.d(TAG, \"onWindowFocusChanged: \" + hasFocus);\n\t\tsuper.onWindowFocusChanged(hasFocus);\n\t\tchangeBoundness(hasFocus ? +1 : -1);\n\t}\n\n\t@Override\n\tpublic void onDestroy() {\n\t\tsuper.onDestroy();\n\t\tgetContentResolver().unregisterContentObserver(mContactObserver);\n\t\t// XXX: quitSafely would be better, but needs API r18\n\t\tmMarkRunnableQuit = true;\n\t\tmMarkHandler.post(mMarkRunnable);\n\t}\n\n\tprotected void registerXMPPService() {\n\t\tLog.i(TAG, \"called startXMPPService()\");\n\t\tmChatServiceIntent = new Intent(this, XMPPService.class);\n\t\tUri chatURI = Uri.parse(mWithJabberID);\n\t\tmChatServiceIntent.setData(chatURI);\n\t\tmChatServiceIntent.setAction(\"org.yaxim.androidclient.XMPPSERVICE\");\n\t\t\n\t\tmChatServiceConnection = new ServiceConnection() {\n\t\t\tpublic void onServiceConnected(ComponentName name, IBinder service) {\n\t\t\t\tLog.i(TAG, \"called onServiceConnected() (for ChatService)\");\n\t\t\t\tmChatServiceAdapter = new XMPPChatServiceAdapter(\n\t\t\t\t\t\tIXMPPChatService.Stub.asInterface(service),\n\t\t\t\t\t\tmWithJabberID);\n\t\t\t\t\n\t\t\t\tmChatServiceAdapter.clearNotifications(mWithJabberID);\n\t\t\t\tupdateContactStatus();\n\t\t\t\thandleSendIntent();\n\t\t\t}\n\n\t\t\tpublic void onServiceDisconnected(ComponentName name) {\n\t\t\t\tLog.i(TAG, \"called onServiceDisconnected() (for ChatService)\");\n\t\t\t}\n\n\t\t};\n\t}\n\n\tprotected void unbindXMPPService() {\n\t\ttry {\n\t\t\tunbindService(mChatServiceConnection);\n\t\t} catch (IllegalArgumentException e) {\n\t\t\tLog.e(TAG, \"Service wasn't bound!\");\n\t\t}\n\t}\n\n\tprotected void bindXMPPService() {\n\t\tbindService(mChatServiceIntent, mChatServiceConnection, BIND_AUTO_CREATE);\n\t}\n\n\tprivate void setSendButton() {\n\t\tmSendButton = (Button) findViewById(R.id.Chat_SendButton);\n\t\tView.OnClickListener onSend = getOnSetListener();\n\t\tmSendButton.setOnClickListener(onSend);\n\t\tmSendButton.setEnabled(false);\n\t}\n\n\tprivate void setUserInput() {\n\t\tString inputText = (messageDrafts.containsKey(mWithJabberID)) ? messageDrafts.get(mWithJabberID) : \"\";\n\t\tIntent i = getIntent();\n\t\tmChatInput = (EditText) findViewById(R.id.Chat_UserInput);\n\t\tmChatInput.addTextChangedListener(this);\n\t\tmChatInput.setOnKeyListener(this);\n\t\tmChatInput.addTextChangedListener(new StylingHelper.MessageEditorStyler(mChatInput));\n\t\tif (i.hasExtra(INTENT_EXTRA_MESSAGE)) {\n\t\t\tinputText += i.getExtras().getString(INTENT_EXTRA_MESSAGE);\n\t\t\ti.removeExtra(INTENT_EXTRA_MESSAGE);\n\t\t}\n\t\tmChatInput.setText(inputText);\n\t\tmessageDrafts.remove(mWithJabberID);\n\t}\n\tprivate void handleSendIntent() {\n\t\tIntent i = getIntent();\n\t\tif (i.hasExtra(Intent.EXTRA_STREAM)) {\n\t\t\tUri stream = (Uri)i.getParcelableExtra(Intent.EXTRA_STREAM);\n\t\t\tsendFile(stream, FileHttpUploadTask.F_RESIZE);\n\t\t\ti.removeExtra(Intent.EXTRA_STREAM);\n\t\t}\n\t}\n\n\tprivate String setContactFromUri() {\n\t\tIntent i = getIntent();\n\t\tLog.d(TAG, \"setting contact from URI: \"+mWithJabberID);\n\t\tmWithJabberID = i.getDataString(); // TODO: lowercase bare-JID, stringprep-normalize\n\t\tmIsMucPM = mWithJabberID.contains(\"/\");\n\t\tString longName;\n\t\tif (i.hasExtra(INTENT_EXTRA_USERNAME)) {\n\t\t\tlongName = i.getExtras().getString(INTENT_EXTRA_USERNAME);\n\t\t\tmUserScreenName = longName;\n\t\t} else {\n\t\t\t// we don't have a screen name, use the localpart of the JID (or domain JID if it is a domain)\n\t\t\tlongName = mWithJabberID;\n\t\t\tmUserScreenName = mWithJabberID.split(\"@\")[0];\n\t\t}\n\t\tif (mIsMucPM) {\n\t\t\t// re-extract nickname from localpart\n\t\t\tmUserScreenName = mWithJabberID.split(\"/\")[1];\n\t\t}\n\t\treturn longName;\n\t}\n\n\t// hack to work around item positions being invalidated on cursor change while the menu is open\n\t// the values will be populated\n\tString mContextMenuMessage = null;\n\tString mContextMenuQuote = null;\n\tString mContextMenuPacketID = null;\n\tlong mContextMenuID = -1;\n\n\t@Override\n\tpublic void onCreateContextMenu(ContextMenu menu, View v,\n\t\t\tContextMenu.ContextMenuInfo menuInfo) {\n\t\tsuper.onCreateContextMenu(menu, v, menuInfo);\n\n\t\tAdapterContextMenuInfo info = (AdapterContextMenuInfo)menuInfo;\n\t\tCursor c = (Cursor)mListView.getItemAtPosition(info.position);\n\t\tmContextMenuMessage = c.getString(c.getColumnIndex(ChatProvider.ChatConstants.MESSAGE));\n\t\tString packet_id = c.getString(c.getColumnIndex(ChatConstants.PACKET_ID));\n\t\tString correction_id = c.getString(c.getColumnIndex(ChatConstants.CORRECTION));\n\t\tmContextMenuPacketID = TextUtils.isEmpty(correction_id) ? packet_id : correction_id;\n\t\tmContextMenuID = c.getLong(c.getColumnIndex(\"_id\"));\n\t\tboolean from_me = c.getInt(c.getColumnIndex(ChatConstants.DIRECTION)) == ChatConstants.OUTGOING;\n\t\tString resource = c.getString(c.getColumnIndex(ChatConstants.RESOURCE));\n\t\tfrom_me = isFromMe(from_me, resource);\n\t\tmContextMenuQuote = getQuotedMessageFromContextMenu(from_me, info);\n\n\t\tgetMenuInflater().inflate(R.menu.chat_contextmenu, menu);\n\t\tmenu.findItem(R.id.chat_contextmenu_resend).setEnabled(from_me);\n\t}\n\n\tprivate String getQuotedMessageFromContextMenu(boolean from_me, AdapterContextMenuInfo info) {\n\t\tCursor c = (Cursor)mListView.getItemAtPosition(info.position);\n\t\tString message = mContextMenuMessage;\n\t\tif (!from_me) {\n\t\t\tString jid = c.getString(c.getColumnIndex(ChatProvider.ChatConstants.JID));\n\t\t\tString resource = c.getString(c.getColumnIndex(ChatProvider.ChatConstants.RESOURCE));\n\t\t\tlong timestamp = c.getLong(c.getColumnIndex(ChatProvider.ChatConstants.DATE));\n\t\t\tString ts = new SimpleDateFormat(\"HH:mm\").format(new Date(timestamp));\n\t\t\treturn String.format(\"%s [%s]:\\n%s\", jid2nickname(jid, resource), ts, XMPPHelper.quoteStringWithoutQuotes(message));\n\t\t}\n\t\treturn XMPPHelper.quoteStringWithoutQuotes(message);\n\t}\n\n\t@Override\n\tpublic boolean onContextItemSelected(MenuItem item) {\n\t\tswitch (item.getItemId()) {\n\t\tcase R.id.chat_contextmenu_copy_text:\n\t\t\tClipboardManager cm = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);\n\t\t\tcm.setText(mContextMenuMessage);\n\t\t\treturn true;\n\t\tcase R.id.chat_contextmenu_quote:\n\t\t\t// insert quote into the current cursor position\n\t\t\tString quote = mContextMenuQuote;\n\t\t\tint position = Math.max(mChatInput.getSelectionStart(), 0);\n\t\t\tmChatInput.getText().insert(position, quote);\n\t\t\tposition += quote.length();\n\t\t\tmChatInput.setSelection(position, position);\n\t\t\tLog.d(TAG, \"quote!\");\n\t\t\treturn true;\n\t\tcase R.id.chat_contextmenu_resend:\n\t\t\tfinal String pid = mContextMenuPacketID;\n\t\t\tfinal long upsert_id = mContextMenuID;\n\t\t\tChatHelper.editTextDialog(this, R.string.chatmenu_resend, null,\n\t\t\t\t\tmContextMenuMessage, true, new ChatHelper.EditOk() {\n\t\t\t\t\t\t@Override\n\t\t\t\t\t\tpublic void ok(String result) {\n\t\t\t\t\t\t\tmChatServiceAdapter.sendMessage(mWithJabberID, result, pid, upsert_id);\n\t\t\t\t\t\t\tif (!mChatServiceAdapter.isServiceAuthenticated())\n\t\t\t\t\t\t\t\tshowToastNotification(R.string.toast_stored_offline);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\tLog.d(TAG, \"resend!\");\n\t\t\treturn true;\n\t\tdefault:\n\t\t\treturn super.onContextItemSelected((MenuItem) item);\n\t\t}\n\t}\n\n\t// specific for a roster/PM menu, overridden by MUC\n\tpublic boolean onCreateOptionsMenu(Menu menu) {\n\t\tMenuInflater inflater = getMenuInflater();\n\t\tif (isContact)\n\t\t\tinflater.inflate(R.menu.contact_options, menu);\n\t\telse {\n\t\t\tinflater.inflate(R.menu.noncontact_options, menu);\n\t\t\tmenu.findItem(R.id.menu_add_friend).setVisible(!mIsMucPM);\n\t\t}\n\t\treturn inflateGenericContactOptions(menu);\n\t}\n\n\t// used by subclasses\n\tpublic boolean inflateGenericContactOptions(Menu menu) {\n\t\tMenuInflater inflater = getMenuInflater();\n\t\t//inflater.inflate(R.menu.contact_options, menu);\n\t\tinflater.inflate(R.menu.roster_item_contextmenu, menu);\n\n\t\tmSearchView = (SearchView)MenuItemCompat.getActionView(menu.findItem(R.id.app_bar_search));\n\t\tmSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {\n\t\t\t@Override\n\t\t\tpublic boolean onQueryTextSubmit(String query) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t@Override\n\t\t\tpublic boolean onQueryTextChange(String query) {\n\t\t\t\tif (TextUtils.isEmpty(query))\n\t\t\t\t\tquery = \"\";\n\t\t\t\tif (query.equals(mSearchQuery))\n\t\t\t\t\treturn true;\n\t\t\t\telse mSearchQuery = query;\n\t\t\t\tgetSupportLoaderManager().restartLoader(CHAT_MSG_LOADER, null, ChatWindow.this);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t});\n\t\tmSearchView.setQueryHint(getString(R.string.search_msg_hint));\n\t\tif (mChatServiceAdapter != null && mChatServiceAdapter.hasFileUpload()) {\n\t\t\tmenu.findItem(R.id.roster_contextmenu_send).setVisible(true);\n\t\t}\n\t\treturn true;\n\t}\n\t\n\t@Override\n\tpublic boolean onOptionsItemSelected(MenuItem item) {\n\t\tLog.d(TAG, \"options item selected\");\n\t\tswitch (item.getItemId()) {\n\t\tcase android.R.id.home:\n\t\t\tIntent intent = new Intent(this, MainWindow.class);\n\t\t\tintent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);\n\t\t\tstartActivity(intent);\n\t\t\tfinish();\n\t\t\treturn true;\n\t\tcase R.id.roster_contextmenu_take_image:\n\t\tcase R.id.roster_contextmenu_send_image:\n\t\tcase R.id.roster_contextmenu_send_file:\n\t\t\tif (!mChatServiceAdapter.isServiceAuthenticated()) { showToastNotification(R.string.Global_authenticate_first); return true; }\n\t\t\t//runPermissionAction(requestIdForMenuId(item.getItemId()));\n\t\t\trequestStoragePermissionAndRun(requestIdForMenuId(item.getItemId()));\n\t\t\treturn true;\n\n\t\t// items that require an authenticated connection\n\t\tcase R.id.roster_contextmenu_contact_delete:\n\t\tcase R.id.roster_contextmenu_contact_rename:\n\t\tcase R.id.roster_contextmenu_contact_request_auth:\n\t\tcase R.id.roster_contextmenu_contact_change_group:\n\t\t\tif (!mChatServiceAdapter.isServiceAuthenticated()) { showToastNotification(R.string.Global_authenticate_first); return true; }\n\t\t\t// fall through to default handler\n\t\tdefault:\n\t\t\treturn ChatHelper.handleJidOptions(this, item.getItemId(), mWithJabberID, mUserScreenName);\n\t\t}\n\t}\n\t\n\tprivate View.OnClickListener getOnSetListener() {\n\t\treturn new View.OnClickListener() {\n\n\t\t\tpublic void onClick(View v) {\n\t\t\t\tsendMessageIfNotNull();\n\t\t\t}\n\t\t};\n\t}\n\n\tprivate void sendMessageIfNotNull() {\n\t\tif (mChatInput.getText().length() >= 1) {\n\t\t\tsendMessage(mChatInput.getText().toString());\n\t\t}\n\t}\n\n\tprivate void sendMessage(String message) {\n\t\tmChatInput.setText(null);\n\t\tmSendButton.setEnabled(false);\n\t\tmChatServiceAdapter.sendMessage(mWithJabberID, message, null, -1);\n\t\tif (!mChatServiceAdapter.isServiceAuthenticated())\n\t\t\tshowToastNotification(R.string.toast_stored_offline);\n\t}\n\n\tprivate boolean markAsReadDelayed(final long id, final int delay) {\n\t\tif (mReadMessages.contains(id)) {\n\t\t\treturn false;\n\t\t}\n\t\tmMarkHandler.removeCallbacks(mMarkRunnable);\n\t\tmReadMessages.add(id);\n\t\tmMarkHandler.postDelayed(mMarkRunnable, delay);\n\t\treturn true;\n\t}\n\t\n\tprivate void markReadMessagesInDb() {\n\t\tif (mReadMessages.size() == 0)\n\t\t\treturn;\n\t\tHashSet<Long> hs = (HashSet)mReadMessages.clone();\n\t\tUri rowuri = Uri.parse(\"content://\" + ChatProvider.AUTHORITY\n\t\t\t+ \"/\" + ChatProvider.TABLE_NAME);\n\t\t// create custom WHERE statement instead of relying on ContentResolvers whereArgs\n\t\tStringBuilder where = new StringBuilder();\n\t\twhere.append(\"_id IN (\");\n\t\tfor (long id : hs) {\n\t\t\twhere.append(id);\n\t\t\twhere.append(\",\");\n\t\t}\n\t\t// ',' --> ')'\n\t\twhere.setCharAt(where.length()-1, ')');\n\t\tLog.d(TAG, \"markAsRead: \" + where);\n\t\tContentValues values = new ContentValues();\n\t\tvalues.put(ChatConstants.DELIVERY_STATUS, ChatConstants.DS_SENT_OR_READ);\n\t\tgetContentResolver().update(rowuri, values, where.toString(), null);\n\t\t// XXX: is this the right place?\n\t\tmReadMessages.removeAll(hs);\n\t}\n\t\n\tpublic String jid2nickname(String jid, String resource) {\n\t\tString from = jid;\n\t\tif (jid.equals(mWithJabberID))\n\t\t\tfrom = mUserScreenName;\n\t\treturn from;\n\t}\n\n\tclass ChatWindowAdapter extends SimpleCursorAdapter {\n\t\tString mScreenName, mJID;\n\n\t\tChatWindowAdapter(Cursor cursor, String[] from, int[] to,\n\t\t\t\tString JID, String screenName) {\n\t\t\tsuper(ChatWindow.this, android.R.layout.simple_list_item_1, cursor,\n\t\t\t\t\tfrom, to);\n\t\t\tmScreenName = screenName;\n\t\t\tmJID = JID;\n\t\t}\n\n\t\t@Override\n\t\tpublic View getView(int position, View convertView, ViewGroup parent) {\n\t\t\tView row = convertView;\n\t\t\tChatItemWrapper wrapper = null;\n\t\t\tCursor cursor = this.getCursor();\n\t\t\tcursor.moveToPosition(position);\n\n\t\t\tlong dateMilliseconds = cursor.getLong(cursor\n\t\t\t\t\t.getColumnIndex(ChatProvider.ChatConstants.DATE));\n\n\t\t\tlong _id = cursor.getLong(cursor\n\t\t\t\t\t.getColumnIndex(ChatProvider.ChatConstants._ID));\n\t\t\tString date = getDateString(dateMilliseconds);\n\t\t\tString message = cursor.getString(cursor\n\t\t\t\t\t.getColumnIndex(ChatProvider.ChatConstants.MESSAGE));\n\t\t\tint msgFlags = cursor.getInt(cursor\n\t\t\t\t\t.getColumnIndex(ChatConstants.MSGFLAGS));\n\t\t\tString error = cursor.getString(cursor\n\t\t\t\t\t.getColumnIndex(ChatConstants.ERROR));\n\t\t\tboolean correction = !TextUtils.isEmpty(cursor.getString(cursor\n\t\t\t\t\t.getColumnIndex(ChatConstants.CORRECTION)));\n\t\t\tString extra = cursor.getString(cursor\n\t\t\t\t\t.getColumnIndex(ChatConstants.EXTRA));\n\t\t\tboolean from_me = (cursor.getInt(cursor\n\t\t\t\t\t.getColumnIndex(ChatProvider.ChatConstants.DIRECTION)) ==\n\t\t\t\t\tChatConstants.OUTGOING);\n\t\t\tString jid = cursor.getString(cursor\n\t\t\t\t\t.getColumnIndex(ChatProvider.ChatConstants.JID));\n\t\t\tString resource = cursor.getString(\n\t\t\t\t\tcursor.getColumnIndex(ChatProvider.ChatConstants.RESOURCE)\n\t\t\t\t\t);\n\t\t\tint delivery_status = cursor.getInt(cursor\n\t\t\t\t\t.getColumnIndex(ChatProvider.ChatConstants.DELIVERY_STATUS));\n\n\t\t\tif (row == null) {\n\t\t\t\tLayoutInflater inflater = getLayoutInflater();\n\t\t\t\trow = inflater.inflate(R.layout.chatrow, null);\n\t\t\t\twrapper = new ChatItemWrapper(row, ChatWindow.this);\n\t\t\t\trow.setTag(wrapper);\n\t\t\t} else {\n\t\t\t\twrapper = (ChatItemWrapper) row.getTag();\n\t\t\t}\n\n\t\t\tif (!from_me && delivery_status == ChatConstants.DS_NEW) {\n\t\t\t\tif (!markAsReadDelayed(_id, DELAY_NEWMSG))\n\t\t\t\t\tdelivery_status = ChatConstants.DS_SENT_OR_READ;\n\n\t\t\t}\n\t\t\t// work around for 0.9.3 not setting MF_CORRECT but storing LMC field\n\t\t\tif (correction)\n\t\t\t\tmsgFlags |= ChatConstants.MF_CORRECT;\n\n\t\t\twrapper.populateFrom(date, from_me, jid2nickname(jid, resource), message, msgFlags,\n\t\t\t\t\terror, extra, delivery_status, mScreenName);\n\t\t\treturn row;\n\t\t}\n\t}\n\n\tprivate String getDateString(long milliSeconds) {\n\t\tSimpleDateFormat dateFormater = new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\");\n\t\tDate date = new Date(milliSeconds);\n\t\treturn dateFormater.format(date);\n\t}\n\n\tpublic class ChatItemWrapper {\n\t\tprivate TextView mDateView = null;\n\t\tprivate TextView mFromView = null;\n\t\tprivate TextView mMessageView = null;\n\t\tprivate TextView mErrorView = null;\n\t\tprivate ImageView mIconView = null;\n\n\t\tprivate final View mRowView;\n\t\tprivate ChatWindow chatWindow;\n\n\t\tChatItemWrapper(View row, ChatWindow chatWindow) {\n\t\t\tthis.mRowView = row;\n\t\t\tthis.chatWindow = chatWindow;\n\t\t\tmDateView = (TextView) mRowView.findViewById(R.id.chat_date);\n\t\t\tmFromView = (TextView) mRowView.findViewById(R.id.chat_from);\n\t\t\tmMessageView = (TextView) mRowView.findViewById(R.id.chat_message);\n\t\t\tmErrorView = (TextView) mRowView.findViewById(R.id.chat_error);\n\t\t\tmIconView = (ImageView) mRowView.findViewById(R.id.iconView);\n\t\t}\n\n\n\t\tvoid populateFrom(String date, boolean from_me, String from, String message, int msgFlags,\n\t\t\t\tString error, final String extra, int delivery_status, String highlight_text) {\n\t\t\tif ((msgFlags & ChatConstants.MF_CORRECT) != 0)\n\t\t\t\tdate = \"\\u270d \" + date; /* prepend Writing Hand */\n\t\t\telse if ((msgFlags & ChatConstants.MF_DELAY) != 0)\n\t\t\t\tdate = \"\\u23F1 \" + date; /* prepend Stopwatch */\n\t\t\tmDateView.setText(date);\n\t\t\tTypedValue tv = new TypedValue();\n\t\t\tif (from_me) {\n\t\t\t\tgetTheme().resolveAttribute(R.attr.ChatMsgHeaderMeColor, tv, true);\n\t\t\t\tmFromView.setText(getString(R.string.chat_from_me));\n\t\t\t\tmFromView.setTextColor(tv.data);\n\t\t\t\tfrom = mConfig.userName;\n\t\t\t} else {\n\t\t\t\tnick2Color(from, tv);\n\t\t\t\tmFromView.setText(from + \":\");\n\t\t\t\tmFromView.setTextColor(tv.data);\n\t\t\t}\n\t\t\tswitch (delivery_status) {\n\t\t\tcase ChatConstants.DS_NEW:\n\t\t\t\tColorDrawable layers[] = new ColorDrawable[2];\n\t\t\t\tgetTheme().resolveAttribute(R.attr.ChatNewMessageColor, tv, true);\n\t\t\t\tlayers[0] = new ColorDrawable(tv.data);\n\t\t\t\tif (from_me) {\n\t\t\t\t\t// message stored for later transmission\n\t\t\t\t\tgetTheme().resolveAttribute(R.attr.ChatStoredMessageColor, tv, true);\n\t\t\t\t\tlayers[1] = new ColorDrawable(tv.data);\n\t\t\t\t} else {\n\t\t\t\t\tlayers[1] = new ColorDrawable(0x00000000);\n\t\t\t\t}\n\t\t\t\tTransitionDrawable backgroundColorAnimation = new\n\t\t\t\t\tTransitionDrawable(layers);\n\t\t\t\tint l = mRowView.getPaddingLeft();\n\t\t\t\tint t = mRowView.getPaddingTop();\n\t\t\t\tint r = mRowView.getPaddingRight();\n\t\t\t\tint b = mRowView.getPaddingBottom();\n\t\t\t\tmRowView.setBackgroundDrawable(backgroundColorAnimation);\n\t\t\t\tmRowView.setPadding(l, t, r, b);\n\t\t\t\tbackgroundColorAnimation.setCrossFadeEnabled(true);\n\t\t\t\tbackgroundColorAnimation.startTransition(DELAY_NEWMSG);\n\t\t\t\tmIconView.setImageResource(R.drawable.ic_chat_msg_status_queued);\n\t\t\t\tbreak;\n\t\t\tcase ChatConstants.DS_SENT_OR_READ:\n\t\t\t\tmIconView.setImageResource(R.drawable.ic_chat_msg_status_unread);\n\t\t\t\tmRowView.setBackgroundColor(0x00000000); // default is transparent\n\t\t\t\tbreak;\n\t\t\tcase ChatConstants.DS_ACKED:\n\t\t\t\tmIconView.setImageResource(R.drawable.ic_chat_msg_status_ok);\n\t\t\t\tmRowView.setBackgroundColor(0x00000000); // default is transparent\n\t\t\t\tbreak;\n\t\t\tcase ChatConstants.DS_FAILED:\n\t\t\t\tmIconView.setImageResource(R.drawable.ic_chat_msg_status_failed);\n\t\t\t\tmRowView.setBackgroundColor(0x30ff0000); // default is transparent\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tSpannableStringBuilder body = MessageStylingHelper.formatMessage(message,\n\t\t\t\t\tfrom, highlight_text, mMessageView.getCurrentTextColor());\n\t\t\teu.siacs.conversations.utils.StylingHelper.handleTextQuotes(body, mMessageView.getCurrentTextColor(), getResources().getDisplayMetrics());\n\t\t\tMessageStylingHelper.applyEmojiScaling(body, 5.0f); /* >5.0 will exceed Emoji rendering limit of 150px */\n\t\t\tmMessageView.setText(body);\n\n\t\t\tmMessageView.setTextSize(TypedValue.COMPLEX_UNIT_SP, chatWindow.mChatFontSize);\n\t\t\tmDateView.setTextSize(TypedValue.COMPLEX_UNIT_SP, chatWindow.mChatFontSize*2/3);\n\t\t\tmFromView.setTextSize(TypedValue.COMPLEX_UNIT_SP, chatWindow.mChatFontSize*2/3);\n\t\t\tmErrorView.setTextSize(TypedValue.COMPLEX_UNIT_SP, chatWindow.mChatFontSize*2/3);\n\t\t\tmErrorView.setText(error);\n\t\t\tmErrorView.setVisibility(TextUtils.isEmpty(error) ? View.GONE : View.VISIBLE);\n\t\t\t// these calls must be in the exact right order.\n\t\t\tLinkify.addLinks(mMessageView, Linkify.MAP_ADDRESSES | Linkify.WEB_URLS);\n\t\t\tLinkify.addLinks(mMessageView, XMPPHelper.XEP_PATTERN, null, null, new Linkify.TransformFilter() {\n\t\t\t\t@Override\n\t\t\t\tpublic String transformUrl(Matcher matcher, String s) {\n\t\t\t\t\treturn String.format((Locale)null, \"https://xmpp.org/extensions/xep-%s.html\", matcher.group(1));\n\t\t\t\t\t//return s.replace(\"XEP-\", \"https://xmpp.org/extensions/xep-\") + \".html\";\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Android's default phone linkifuckation makes 13:37 two phone numbers\n\t\t\tLinkify.addLinks(mMessageView, XMPPHelper.PHONE, \"tel:\", Linkify.sPhoneNumberMatchFilter, Linkify.sPhoneNumberTransformFilter);\n\t\t\t// Android's default email linkifuckation breaks xmpp: URIs\n\t\t\tLinkify.addLinks(mMessageView, XMPPHelper.XMPP_PATTERN, \"xmpp\");\n\t\t\tLinkify.addLinks(mMessageView, XMPPHelper.EMAIL_ADDRESS, \"mailto:\");\n\t\t\tImageView iv = (ImageView)mRowView.findViewById(R.id.chat_image);\n\t\t\tboolean has_extra = !TextUtils.isEmpty(extra);\n\t\t\tiv.setVisibility(has_extra ? View.VISIBLE : View.GONE);\n\t\t\tif (has_extra) {\n\t\t\t\tif (extra.equals(message))\n\t\t\t\t\tmMessageView.setVisibility(View.GONE);\n\t\t\t\tUrlImageViewHelper.setUrlDrawable(iv, extra, android.R.drawable.ic_menu_report_image, new UrlImageViewCallback() {\n\t\t\t\t\t@Override\n\t\t\t\t\tpublic void onLoaded(ImageView imageView, Bitmap bitmap, String s, boolean b) {\n\t\t\t\t\t\tif (bitmap == null) {\n\t\t\t\t\t\t\t// error loading, display URL again\n\t\t\t\t\t\t\tmMessageView.setVisibility(View.VISIBLE);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tiv.setOnClickListener(new View.OnClickListener() {\n\t\t\t\t\t@Override\n\t\t\t\t\tpublic void onClick(View view) {\n\t\t\t\t\t\tstartActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse(extra)));\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tiv.setOnLongClickListener(new View.OnLongClickListener() {\n\t\t\t\t\t@Override\n\t\t\t\t\tpublic boolean onLongClick(View view) {\n\t\t\t\t\t\tChatWindow.this.openContextMenu(view);\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else\n\t\t\t\tmMessageView.setVisibility(View.VISIBLE);\n\t\t}\n\t\t\n\t}\n\n\t// OnKeyListener\n\t@Override\n\tpublic boolean onKey(View v, int keyCode, KeyEvent event) {\n\t\tif (event.getAction() == KeyEvent.ACTION_DOWN\n\t\t\t\t&& keyCode == KeyEvent.KEYCODE_ENTER) {\n\t\t\tsendMessageIfNotNull();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\n\t}\n\n\t// TextWatcher\n\t@Override\n\tpublic void afterTextChanged(Editable s) {\n\t\tmSendButton.setEnabled(mChatInput.getText().length() >= 1);\n\t}\n\n\t@Override\n\tpublic void beforeTextChanged(CharSequence s, int start, int count,\n\t\t\tint after) {\n\t}\n\n\t@Override\n\tpublic void onTextChanged(CharSequence s, int start, int before, int count) {\n\t}\n\n\tprivate void showToastNotification(int message) {\n\t\tToast toastNotification = Toast.makeText(this, message,\n\t\t\t\tToast.LENGTH_SHORT);\n\t\ttoastNotification.show();\n\t}\n\n\tprivate static final String[] STATUS_QUERY = new String[] {\n\t\tRosterProvider.RosterConstants.ALIAS,\n\t\tRosterProvider.RosterConstants.STATUS_MODE,\n\t\tRosterProvider.RosterConstants.STATUS_MESSAGE,\n\t};\n\tprivate void updateContactStatus() {\n\t\tCursor cursor = getContentResolver().query(RosterProvider.CONTENT_URI, STATUS_QUERY,\n\t\t\t\t\tRosterProvider.RosterConstants.JID + \" = ?\", new String[] { mWithJabberID }, null);\n\t\tint ALIAS_IDX = cursor.getColumnIndex(RosterProvider.RosterConstants.ALIAS);\n\t\tint MODE_IDX = cursor.getColumnIndex(RosterProvider.RosterConstants.STATUS_MODE);\n\t\tint MSG_IDX = cursor.getColumnIndex(RosterProvider.RosterConstants.STATUS_MESSAGE);\n\n\t\tisContact = cursor.getCount() == 1;\n\t\tif (isContact) {\n\t\t\tcursor.moveToFirst();\n\t\t\tint status_mode = cursor.getInt(MODE_IDX);\n\t\t\tif (status_mode == StatusMode.subscribe.ordinal())\n\t\t\t\tisContact = false;\n\t\t\tString status_message = cursor.getString(MSG_IDX);\n\t\t\tLog.d(TAG, \"contact status changed: \" + status_mode + \" \" + status_message);\n\t\t\tmTitle.setText(cursor.getString(ALIAS_IDX));\n\t\t\tmSubTitle.setVisibility((status_message != null && status_message.length() != 0)?\n\t\t\t\t\tView.VISIBLE : View.GONE);\n\t\t\tmSubTitle.setText(status_message);\n\t\t\t\n\t\t\tif (mChatServiceAdapter == null || !mChatServiceAdapter.isServiceAuthenticated())\n\t\t\t\tstatus_mode = 0; // override icon if we are offline\n\t\t\tmStatusMode.setImageResource(StatusMode.values()[status_mode].getDrawableId());\n\t\t}\n\t\tcursor.close();\n\t\t// work around deleting the search text on menu update\n\t\tif (TextUtils.isEmpty(mSearchQuery))\n\t\t\tinvalidateOptionsMenu();\n\t}\n\n\t// this method is a \"virtual\" placeholder for the MUC activity\n\tpublic void nick2Color(String nick, TypedValue tv) {\n\t\tgetTheme().resolveAttribute(R.attr.ChatMsgHeaderYouColor, tv, true);\n\t}\n\n\t// this method is a \"virtual\" placeholder for the MUC activity\n\tpublic boolean isFromMe(boolean from_me, String resource) {\n\t\t\treturn from_me;\n\t}\n\n\tpublic ListView getListView() {\n\t\treturn mListView;\n\t}\n\n\tprivate void showKeyboard() {\n\t\tmChatInput.requestFocus();\n\t\tnew Handler(getMainLooper()).postDelayed(new Runnable() {\n\t\t\t@Override\n\t\t\tpublic void run() {\n\t\t\t\tInputMethodManager keyboard = (InputMethodManager)\n\t\t\t\t\t\tgetSystemService(Context.INPUT_METHOD_SERVICE);\n\t\t\t\tkeyboard.showSoftInput(mChatInput, InputMethodManager.SHOW_IMPLICIT);\n\t\t\t}\n\t\t}, 200);\n\t}\n\n\tprivate class ContactObserver extends ContentObserver {\n\t\tpublic ContactObserver() {\n\t\t\tsuper(new Handler());\n\t\t}\n\n\t\tpublic void onChange(boolean selfChange) {\n\t\t\tLog.d(TAG, \"ContactObserver.onChange: \" + selfChange);\n\t\t\tupdateContactStatus();\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/chat/MUCChatWindow.java",
    "content": "package org.yaxim.androidclient.chat;\n\nimport java.util.List;\n\nimport org.yaxim.androidclient.R;\nimport org.yaxim.androidclient.YaximApplication;\nimport org.yaxim.androidclient.data.ChatProvider.ChatConstants;\nimport org.yaxim.androidclient.data.ChatHelper;\nimport org.yaxim.androidclient.data.ChatRoomHelper;\nimport org.yaxim.androidclient.data.EntityInfo;\nimport org.yaxim.androidclient.dialogs.ConfirmDialog;\nimport org.yaxim.androidclient.dialogs.EditMUCDialog;\nimport org.yaxim.androidclient.list.EntityListAdapter;\nimport org.yaxim.androidclient.service.IXMPPMucService;\nimport org.yaxim.androidclient.service.SmackableImp;\nimport org.yaxim.androidclient.service.XMPPService;\nimport org.yaxim.androidclient.util.XEP0392Helper;\nimport org.yaxim.androidclient.util.XMPPHelper;\n\nimport android.support.v7.app.AlertDialog;\nimport android.content.ComponentName;\nimport android.content.Context;\nimport android.content.DialogInterface;\nimport android.content.Intent;\nimport android.content.ServiceConnection;\nimport android.content.DialogInterface.OnClickListener;\nimport android.database.Cursor;\nimport android.graphics.Color;\nimport android.net.Uri;\nimport android.os.Bundle;\nimport android.os.IBinder;\nimport android.text.TextUtils;\nimport android.util.Log;\nimport android.util.TypedValue;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.AdapterView;\nimport android.widget.AdapterView.OnItemClickListener;\nimport android.widget.AdapterView.OnItemLongClickListener;\nimport android.widget.ArrayAdapter;\nimport android.widget.ImageView;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport android.view.Menu;\nimport android.view.MenuInflater;\nimport android.view.MenuItem;\n\npublic class MUCChatWindow extends ChatWindow {\n\tprivate static final String TAG = \"yaxim.MUCChatWindow\";\n\n\tprivate Intent mMucServiceIntent;\n\tprivate ServiceConnection mMucServiceConnection;\n\tprivate XMPPMucServiceAdapter mMucServiceAdapter;\n\tprivate String myNick;\n\n\t@Override\n\tpublic void onCreate(Bundle savedInstanceState) {\n\t\tsuper.onCreate(savedInstanceState);\n\t\t// fill in nickname on tap\n\t\tgetListView().setOnItemClickListener(new OnItemClickListener() {\n\t\t\t@Override\n\t\t\tpublic void onItemClick(AdapterView<?> parent,\n\t\t\t\t\tView view, int position, long id) {\n\t\t\t\tCursor c = (Cursor)parent.getItemAtPosition(position);\n\t\t\t\taddNicknameToInput(c.getString(c.getColumnIndex(ChatConstants.RESOURCE)));\n\t\t\t}});\n\t\tXMPPHelper.setStaticNFC(this, \"xmpp:\" + java.net.URLEncoder.encode(mWithJabberID) + \"?join\");\n\t}\n\n\t@Override\n\tprotected void registerXMPPService() {\n\t\tsuper.registerXMPPService();\n\n\t\tmMucServiceIntent = new Intent(this, XMPPService.class);\n\t\tUri dtaUri = Uri.parse(mWithJabberID+\"?chat\");\n\t\tmMucServiceIntent.setData(dtaUri);\n\t\tmMucServiceIntent.setAction(\"org.yaxim.androidclient.XMPPSERVICE\");\n\n\t\tmMucServiceConnection = new ServiceConnection() {\n\t\t\tpublic void onServiceConnected(ComponentName name, IBinder service) {\n\t\t\t\tmMucServiceAdapter = new XMPPMucServiceAdapter(\n\t\t\t\t\t\tIXMPPMucService.Stub.asInterface(service), \n\t\t\t\t\t\tmWithJabberID);\n\t\t\t\tmyNick = mMucServiceAdapter.getMyMucNick();\n\t\t\t\tmChatAdapter.mScreenName = myNick;\n\t\t\t\tsupportInvalidateOptionsMenu();\n\t\t\t\tgetListView().invalidateViews();\n\t\t\t}\n\t\t\tpublic void onServiceDisconnected(ComponentName name) {\n\t\t\t}\n\t\t};\n\t\n\n\t}\n\n\t@Override\n\tprotected void unbindXMPPService() {\n\t\tsuper.unbindXMPPService();\n\t\ttry {\n\t\t\tunbindService(mMucServiceConnection);\n\t\t} catch (IllegalArgumentException e) {\n\t\t\tLog.e(TAG, \"Service wasn't bound!\");\n\t\t}\n\t}\n\n\t@Override\n\tprotected void bindXMPPService() {\n\t\tsuper.bindXMPPService();\n\t\tbindService(mMucServiceIntent, mMucServiceConnection, BIND_AUTO_CREATE);\n\t}\n\n\n\t@Override\n\tpublic boolean onCreateOptionsMenu(Menu menu) {\n\t\tLog.d(TAG, \"creating options menu, we're a muc\");\n\t\tMenuInflater inflater = getMenuInflater();\n\t\tinflater.inflate(R.menu.muc_options, menu);\n\t\tinflateGenericContactOptions(menu);\n\t\treturn true;\n\t}\n\t\n\t@Override\n\tpublic boolean onOptionsItemSelected(MenuItem item) {\n\t\tLog.d(TAG, \"options item selected\");\n\t\tswitch (item.getItemId()) {\n\t\tcase R.id.chat_optionsmenu_userlist:\n\t\t\tshowUserList();\n\t\t\treturn true;\n\t\tcase R.id.roster_contextmenu_muc_edit:\n\t\t\tnew EditMUCDialog(this, mWithJabberID).dontOpen().show();\n\t\t\treturn true;\n\t\tcase R.id.roster_contextmenu_muc_share:\n\t\t\tChatHelper.showQrDialog(this, mWithJabberID,\n\t\t\t\tXMPPHelper.createMucLinkHTTPS(mWithJabberID), mUserScreenName);\n\t\t\treturn true;\n\t\tcase R.id.roster_contextmenu_muc_leave:\n\t\t\tConfirmDialog.show(this, R.string.roster_contextmenu_muc_leave,\n\t\t\t\t\tgetString(R.string.muc_leave_question, mWithJabberID), mWithJabberID,\n\t\t\t\t\tnew ConfirmDialog.Ok() {\n\t\t\t\t\t\t@Override\n\t\t\t\t\t\tpublic void ok(final String jid) {\n\t\t\t\t\t\t\tif (ChatRoomHelper.leaveRoom(MUCChatWindow.this, jid))\n\t\t\t\t\t\t\t\tChatRoomHelper.syncDbRooms(MUCChatWindow.this);\n\t\t\t\t\t\t\t// XXX: if we do not unbind here, we will leak the service\n\t\t\t\t\t\t\tunbindXMPPService();\n\t\t\t\t\t\t\tfinish();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\treturn true;\n\t\tdefault:\n\t\t\treturn super.onOptionsItemSelected(item);\n\t\t}\n\t}\n\t\n\tprivate void addNicknameToInput(String nickname) {\n\t\tif (TextUtils.isEmpty(nickname) || nickname.equalsIgnoreCase(myNick))\n\t\t\treturn;\n\t\tint cursor_position = mChatInput.getSelectionStart();\n\t\tString postfix = (cursor_position == 0) ? \": \" : \" \";\n\t\tmChatInput.getText().insert(cursor_position, nickname + postfix);\n\t}\n\n\tprivate void showUserList() {\n\t\tSmackableImp s = YaximApplication.getInstance().getSmackable();\n\t\tif (s == null)\n\t\t\treturn;\n\t\tfinal List<EntityInfo> users = s.getUserList(mWithJabberID);\n\t\tif (users == null) {\n\t\t\tToast.makeText(this, R.string.Global_authenticate_first, Toast.LENGTH_SHORT).show();\n\t\t\treturn;\n\t\t}\n\t\tAlertDialog.Builder dialogBuilder = new AlertDialog.Builder(MUCChatWindow.this)\n\t\t.setTitle(getString(R.string.chat_muc_userlist, mWithJabberID))\n\t\t.setNegativeButton(android.R.string.cancel, null);\n\n\t\tPresenceArrayAdapter adapter = new PresenceArrayAdapter(MUCChatWindow.this, users);\n\n\t\tLog.d(TAG, \"adapter has values: \"+adapter.getCount());\n\t\tdialogBuilder.setAdapter(adapter, new OnClickListener() {\n\t\t\t@Override\n\t\t\tpublic void onClick(DialogInterface dialog, int which) {\n\t\t\t\taddNicknameToInput(users.get(which).name);\n\t\t\t}\n\t\t});\n\t\tfinal AlertDialog dialog = dialogBuilder.create();\n\t\tdialog.getListView().setOnItemLongClickListener(new OnItemLongClickListener() {\n\t\t\t@Override\n\t\t\tpublic boolean onItemLongClick(AdapterView<?> parent,\n\t\t\t\t\tView view, int position, long id) {\n\t\t\t\tString jid = users.get(position).jid;\n\t\t\t\tString nickname = users.get(position).name;\n\t\t\t\tboolean is_anon = jid.contains(\"/\"); // hack in backend, full JID in user list = anon\n\t\t\t\tString screenname = is_anon ? String.format(\"%s (%s)\", nickname, mUserScreenName) : jid;\n\t\t\t\tChatHelper.startChatActivity(MUCChatWindow.this, users.get(position).jid,\n\t\t\t\t\t\tscreenname, null);\n\t\t\t\tdialog.dismiss();\n\t\t\t\treturn true;\n\t\t\t}});\n\t\tdialog.show();\n\t}\n\n\t\n\tpublic String jid2nickname(String jid, String resource) {\n\t\treturn resource;\n\t}\n\n\t@Override\n\tpublic boolean isFromMe(boolean from_me, String resource) {\n\t\treturn from_me || (!TextUtils.isEmpty(myNick) && myNick.equals(resource));\n\t}\n\n\t@Override\n\tpublic void nick2Color(String nick, TypedValue tv) {\n\t\tif (nick == null || nick.length() == 0) // no color for empty nickname\n\t\t\treturn;\n\t\ttv.data = XEP0392Helper.mixNickWithBackground(nick, getTheme(), mConfig.getTheme());\n\t}\n\t\n\n\tprivate class PresenceArrayAdapter extends ArrayAdapter<EntityInfo> {\n\t\tTypedValue tv = new TypedValue();\n\n\t\tpublic PresenceArrayAdapter(Context context, List<EntityInfo> ei) {\n\t\t\tsuper(context, R.layout.mainchild_row, ei);\n\t\t}\n\n\t\t@Override\n\t\tpublic View getView(int position, View convertView, ViewGroup parent) {\n\t\t\tEntityInfo ei = getItem(position);\n\n\t\t\tif (convertView == null)\n\t\t\t\tconvertView = getLayoutInflater().inflate(R.layout.mainchild_row, parent, false);\n\t\t\t\n\t\t\tTextView nick = ((TextView)convertView.findViewById(R.id.roster_screenname));\n\t\t\tTextView statusmsg = ((TextView)convertView.findViewById(R.id.roster_statusmsg));\n\t\t\t\n\t\t\tnick.setText(ei.name);\n\t\t\tnick2Color(ei.name, tv);\n\t\t\tnick.setTextColor(tv.data);\n\t\t\tnick.setTypeface(null, android.graphics.Typeface.BOLD);\n\t\t\t\n\t\t\tboolean hasStatus = ei.status != null && ei.status.length() > 0;\n\t\t\tstatusmsg.setText(ei.status);\n\t\t\tstatusmsg.setVisibility(hasStatus ? View.VISIBLE : View.GONE);\n\t\t\t\n\t\t\t((ImageView)convertView.findViewById(R.id.roster_icon)).setImageResource(ei.statusMode.getDrawableId());\n\t\t\t\n\t\t\treturn convertView;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/chat/XMPPChatServiceAdapter.java",
    "content": "package org.yaxim.androidclient.chat;\n\nimport android.net.Uri;\nimport android.os.RemoteException;\nimport android.util.Log;\nimport org.yaxim.androidclient.service.IXMPPChatService;\n\npublic class XMPPChatServiceAdapter {\n\n\tprivate static final String TAG = \"yaxim.XMPPCSAdapter\";\n\tprivate IXMPPChatService xmppServiceStub;\n\tprivate String jabberID;\n\n\tpublic XMPPChatServiceAdapter(IXMPPChatService xmppServiceStub,\n\t\t\tString jabberID) {\n\t\tLog.i(TAG, \"New XMPPChatServiceAdapter construced\");\n\t\tthis.xmppServiceStub = xmppServiceStub;\n\t\tthis.jabberID = jabberID;\n\t}\n\n\tpublic void sendMessage(String user, String message, String lmc, long upsert_id) {\n\t\ttry {\n\t\t\tLog.i(TAG, \"Called sendMessage(): \" + jabberID + \": \" + message);\n\t\t\txmppServiceStub.sendMessage(user, message, lmc, upsert_id);\n\t\t} catch (RemoteException e) {\n\t\t\tLog.e(TAG, \"caught RemoteException: \" + e.getMessage());\n\t\t}\n\t}\n\t\n\tpublic boolean isServiceAuthenticated() {\n\t\ttry {\n\t\t\treturn xmppServiceStub.isAuthenticated();\n\t\t} catch (RemoteException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t\treturn false;\n\t}\n\n\tpublic void clearNotifications(String Jid) {\n\t\ttry {\n\t\t\txmppServiceStub.clearNotifications(Jid);\n\t\t} catch (RemoteException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t}\n\n\tpublic boolean hasFileUpload() {\n\t\ttry {\n\t\t\treturn xmppServiceStub.hasFileUpload();\n\t\t} catch (RemoteException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t\treturn false;\n\t}\n\tpublic void sendFile(Uri path, String user, int flags) {\n\t\ttry {\n\t\t\txmppServiceStub.sendFile(path, user, flags);\n\t\t} catch (RemoteException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/chat/XMPPMucServiceAdapter.java",
    "content": "package org.yaxim.androidclient.chat;\n\nimport java.util.List;\n\nimport android.net.Uri;\nimport android.os.RemoteException;\nimport android.util.Log;\nimport org.yaxim.androidclient.service.IXMPPMucService;\n\npublic class XMPPMucServiceAdapter {\n\n\tprivate static final String TAG = \"yaxim.XMPPCSAdapter\";\n\tprivate IXMPPMucService xmppServiceStub;\n\tprivate String jabberID;\n\n\tpublic XMPPMucServiceAdapter(final IXMPPMucService xmppServiceStub,\n\t\t\tString jabberID) {\n\t\tLog.i(TAG, \"New XMPPMucServiceAdapter construced\");\n\t\tthis.xmppServiceStub = xmppServiceStub;\n\t\tthis.jabberID = jabberID;\n\t\tnew Thread() {public void run() {\n\t\t\tLog.d(TAG, \"HACK: starting background sync...\");\n\t\t\ttry {\n\t\t\t\txmppServiceStub.syncDbRooms();\n\t\t\t} catch (RemoteException e) {\n\t\t\t\te.printStackTrace();\n\t\t\t}\n\t\t\tLog.d(TAG, \"HACK: finished background sync...\");\n\t\t\t};\n\t\t}.start();\n\t}\n\t\n\tpublic String getMyMucNick() {\n\t\ttry {\n\t\t\treturn xmppServiceStub.getMyMucNick(this.jabberID);\n\t\t} catch (RemoteException e) {\n\t\t\treturn null;\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/data/ChatHelper.java",
    "content": "package org.yaxim.androidclient.data;\n\nimport org.yaxim.androidclient.YaximApplication;\nimport org.yaxim.androidclient.chat.ChatWindow;\nimport org.yaxim.androidclient.chat.MUCChatWindow;\nimport org.yaxim.androidclient.data.ChatProvider.ChatConstants;\nimport org.yaxim.androidclient.data.RosterProvider.RosterConstants;\nimport org.yaxim.androidclient.dialogs.AddRosterItemDialog;\nimport org.yaxim.androidclient.dialogs.ConfirmDialog;\nimport org.yaxim.androidclient.dialogs.EditMUCDialog;\nimport org.yaxim.androidclient.dialogs.GroupNameView;\nimport org.yaxim.androidclient.exceptions.YaximXMPPException;\nimport org.yaxim.androidclient.preferences.NotificationPrefs;\nimport org.yaxim.androidclient.service.IXMPPChatService;\nimport org.yaxim.androidclient.util.StatusMode;\nimport org.yaxim.androidclient.util.XMPPHelper;\nimport org.yaxim.androidclient.R;\n\nimport android.app.Activity;\nimport android.support.v7.app.AlertDialog;\nimport android.content.BroadcastReceiver;\nimport android.content.ComponentName;\nimport android.content.ContentValues;\nimport android.content.Context;\nimport android.content.DialogInterface;\nimport android.content.Intent;\nimport android.content.ServiceConnection;\nimport android.database.Cursor;\nimport android.graphics.Bitmap;\nimport android.graphics.Color;\nimport android.net.Uri;\nimport android.os.IBinder;\nimport android.os.RemoteException;\nimport android.text.TextUtils;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.EditText;\nimport android.widget.ImageView;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport com.google.zxing.BarcodeFormat;\nimport com.google.zxing.EncodeHintType;\nimport com.google.zxing.WriterException;\nimport com.google.zxing.common.BitMatrix;\nimport com.google.zxing.qrcode.QRCodeWriter;\nimport com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;\n\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.HashSet;\nimport java.util.Hashtable;\nimport java.util.List;\n\nimport eu.siacs.conversations.utils.StylingHelper;\n\npublic class ChatHelper {\n\n\tpublic static void markAllAsRead(Context ctx) {\n\t\tContentValues cv = new ContentValues();\n\t\tcv.put(ChatConstants.DELIVERY_STATUS, ChatConstants.DS_SENT_OR_READ);\n\t\tctx.getContentResolver().update(ChatProvider.CONTENT_URI, cv,\n\t\t\t\t\t\tChatConstants.DIRECTION + \" = \" + ChatConstants.INCOMING + \" AND \"\n\t\t\t\t\t\t+ ChatConstants.DELIVERY_STATUS + \" = \" + ChatConstants.DS_NEW, null);\n\t}\n\n\tpublic static long getChatHistoryStartId(Context ctx, String jid, long history_size) {\n\t\tCursor c = ctx.getContentResolver().query(ChatProvider.CONTENT_URI,\n\t\t\t\tnew String[] { \"_id\" }, \"jid = ?\", new String[] { jid },\n\t\t\t\t\"_id DESC LIMIT 1 OFFSET \" + history_size);\n\t\tlong result_id = -1;\n\t\tif (c.moveToFirst()) {\n\t\t\tresult_id = c.getLong(0);\n\t\t}\n\t\tc.close();\n\t\treturn result_id;\n\t}\n\n\tpublic static void markAsRead(Context ctx, String jid) {\n\t\tContentValues cv = new ContentValues();\n\t\tcv.put(ChatConstants.DELIVERY_STATUS, ChatConstants.DS_SENT_OR_READ);\n\t\tctx.getContentResolver().update(ChatProvider.CONTENT_URI, cv,\n\t\t\t\tChatProvider.ChatConstants.JID + \" = ? AND \"\n\t\t\t\t\t\t+ ChatConstants.DIRECTION + \" = \" + ChatConstants.INCOMING + \" AND \"\n\t\t\t\t\t\t+ ChatConstants.DELIVERY_STATUS + \" = \" + ChatConstants.DS_NEW,\n\t\t\t\tnew String[]{jid});\n\t}\n\n\tpublic static void clearAndRespond(Context ctx, BroadcastReceiver br, String jid, String response) {\n\t\t// mark message(s) as read\n\t\tmarkAsRead(ctx, jid);\n\n\t\t// obtain service reference if possible\n\t\tIntent serviceIntent = new Intent(ctx, org.yaxim.androidclient.service.XMPPService.class);\n\t\tserviceIntent.setAction(\"org.yaxim.androidclient.XMPPSERVICE\");\n\t\tIXMPPChatService.Stub cs = (IXMPPChatService.Stub)br.peekService(ctx, serviceIntent);\n\t\tif (cs == null) {\n\t\t\tandroid.util.Log.d(\"ChatHelper\", \"Could not peek Service for \" + jid);\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tcs.clearNotifications(jid);\n\t\t\tif (response != null && response.length() > 0)\n\t\t\t\tcs.sendMessage(jid, response, null, -1);\n\t\t} catch (RemoteException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t}\n\n\tpublic static void sendMessage(final Context ctx, final String jid, final String message) {\n\t\tIntent serviceIntent = new Intent(ctx, org.yaxim.androidclient.service.XMPPService.class);\n\t\tserviceIntent.setAction(\"org.yaxim.androidclient.XMPPSERVICE\");\n\t\tServiceConnection c = new ServiceConnection() {\n\t\t\tpublic void onServiceConnected(ComponentName name, IBinder service) {\n\t\t\t\tIXMPPChatService chatService = IXMPPChatService.Stub.asInterface(service);\n\t\t\t\ttry {\n\t\t\t\t\tif (message != null)\n\t\t\t\t\t\tchatService.sendMessage(jid, message, null, -1);\n\t\t\t\t} catch (RemoteException e) {\n\t\t\t\t\te.printStackTrace();\n\t\t\t\t}\n\t\t\t\tctx.unbindService(this);\n\t\t\t}\n\t\t\tpublic void onServiceDisconnected(ComponentName name) {}\n\t\t};\n\t\tctx.bindService(serviceIntent, c, Context.BIND_AUTO_CREATE);\n\t}\n\n\tpublic static void removeChatHistory(Context ctx, String jid) {\n\t\t// TODO: MUC PM history\n\t\tctx.getContentResolver().delete(ChatProvider.CONTENT_URI,\n\t\t\t\tChatProvider.ChatConstants.JID + \" = ?\", new String[] { jid });\n\t}\n\n\tpublic static void startChatActivity(Context ctx, String user, String userName, String message, Uri image) {\n\t\tIntent chatIntent = new Intent(ctx, ChatWindow.class);\n\t\tif (ChatRoomHelper.isRoom(ctx, user))\n\t\t\tchatIntent.setClass(ctx, MUCChatWindow.class);\n\t\tUri userNameUri = Uri.parse(user);\n\t\tchatIntent.setData(userNameUri);\n\t\tchatIntent.putExtra(ChatWindow.INTENT_EXTRA_USERNAME, userName);\n\t\tif (message != null) {\n\t\t\tchatIntent.putExtra(ChatWindow.INTENT_EXTRA_MESSAGE, message);\n\t\t}\n\t\tif (image != null) {\n\t\t\tchatIntent.putExtra(Intent.EXTRA_STREAM, image);\n\t\t\tchatIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);\n\t\t}\n\t\tctx.startActivity(chatIntent);\n\t}\n\tpublic static void startChatActivity(Context ctx, String user, String userName, String message) {\n\t\tstartChatActivity(ctx, user, userName, message, null);\n\t}\n\n\tpublic static Bitmap generateQr(String value, int size) {\n\t\tQRCodeWriter qr = new QRCodeWriter();\n\t\tfinal Hashtable<EncodeHintType, Object> hints = new Hashtable<>();\n\t\thints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);\n\t\ttry {\n\t\t\tBitMatrix matrix = qr.encode(value, BarcodeFormat.QR_CODE, 0, 0, hints);\n\t\t\tint final_width = matrix.getWidth();\n\t\t\tint final_height = matrix.getHeight();\n\t\t\tint[] pixels = new int[final_width * final_height];\n\t\t\tfor (int y = 0; y < final_height; y++)\n\t\t\t\tfor (int x = 0; x < final_width; x++)\n\t\t\t\t\tpixels[x + final_width*y] = matrix.get(x, y) ? Color.BLACK : Color.WHITE;\n\t\t\tBitmap bmp = Bitmap.createBitmap(final_width, final_height, Bitmap.Config.ARGB_8888);\n\t\t\tbmp.setPixels(pixels, 0, final_width, 0, 0, final_width, final_height);\n\t\t\treturn Bitmap.createScaledBitmap(bmp, size, size, false);\n\t\t} catch (WriterException e) {\n\t\t\te.printStackTrace();\n\t\t\treturn null;\n\t\t}\n\t}\n\tpublic static void showQrDialog(final Activity act, final String jid, final String link,\n\t\t\tfinal String userName) {\n\t\tLayoutInflater inflater = (LayoutInflater) act.getSystemService(act.LAYOUT_INFLATER_SERVICE);\n\t\tView layout = inflater.inflate(R.layout.qrcode_dialog,\n\t\t\t\t(ViewGroup) act.findViewById(R.id.layout_root));\n\n\t\tint x = act.getWindowManager().getDefaultDisplay().getWidth();\n\t\tint y = act.getWindowManager().getDefaultDisplay().getHeight();\n\t\tint width = (x < y ? x : y) * 4 / 5;\n\n\t\tTextView messageView = (TextView) layout.findViewById(R.id.text);\n\t\tmessageView.setText(jid);\n\n\t\tImageView qrCode = (ImageView) layout.findViewById(R.id.qr_code);\n\t\tqrCode.setImageBitmap(generateQr(link, width));\n\t\tfinal AlertDialog d = new AlertDialog.Builder(act)\n\t\t\t\t.setTitle(userName)\n\t\t\t\t.setView(layout)\n\t\t\t\t.setPositiveButton(R.string.roster_contextmenu_contact_share,\n\t\t\t\t\t\tnew DialogInterface.OnClickListener() {\n\t\t\t\t\t\t\tpublic void onClick(DialogInterface dialog, int which) {\n\t\t\t\t\t\t\t\tXMPPHelper.shareLink(act, R.string.roster_contextmenu_contact_share,\n\t\t\t\t\t\t\t\t\t\tlink);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t.create();\n\t\tView.OnClickListener l = new View.OnClickListener() {\n\t\t\tpublic void onClick(View v) {\n\t\t\t\tXMPPHelper.shareLink(act, R.string.roster_contextmenu_contact_share,\n\t\t\t\t\t\tlink);\n\t\t\t\td.dismiss();\n\t\t\t}\n\t\t};\n\t\tmessageView.setOnClickListener(l);\n\t\tqrCode.setOnClickListener(l);\n\t\td.show();\n\t}\n\n\tpublic static void removeChatHistoryDialog(final Context ctx, final String jid, final String userName) {\n\t\tnew AlertDialog.Builder(ctx)\n\t\t\t.setTitle(R.string.deleteChatHistory_title)\n\t\t\t.setMessage(ctx.getString(R.string.deleteChatHistory_text, userName, jid))\n\t\t\t.setPositiveButton(android.R.string.yes,\n\t\t\t\t\tnew DialogInterface.OnClickListener() {\n\t\t\t\t\t\tpublic void onClick(DialogInterface dialog, int which) {\n\t\t\t\t\t\t\tremoveChatHistory(ctx, jid);\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t.setNegativeButton(android.R.string.no, null)\n\t\t\t.create().show();\n\t}\n\n\tpublic interface EditOk {\n\t\tabstract public void ok(String result);\n\t}\n\n\tpublic static void editTextDialog(Activity act, int titleId, CharSequence message, String text,\n\t\t\t\t\t\t\t\t\t  boolean applyStyling, final EditOk ok) {\n\t\tLayoutInflater inflater = (LayoutInflater) act.getSystemService(act.LAYOUT_INFLATER_SERVICE);\n\t\tView layout = inflater.inflate(R.layout.edittext_dialog,\n\t\t\t\t(ViewGroup) act.findViewById(R.id.layout_root));\n\n\t\tTextView messageView = (TextView) layout.findViewById(R.id.text);\n\t\tmessageView.setText(message);\n\t\tmessageView.setVisibility(TextUtils.isEmpty(message) ? View.GONE : View.VISIBLE);\n\t\tfinal EditText input = (EditText) layout.findViewById(R.id.editText);\n\t\tif (applyStyling)\n\t\t\tinput.addTextChangedListener(new StylingHelper.MessageEditorStyler(input));\n\t\telse\n\t\t\tinput.setTransformationMethod(android.text.method.SingleLineTransformationMethod.getInstance());\n\t\tinput.setText(text);\n\t\tnew AlertDialog.Builder(act)\n\t\t\t\t.setTitle(titleId)\n\t\t\t\t.setView(layout)\n\t\t\t\t.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {\n\t\t\t\t\tpublic void onClick(DialogInterface dialog, int which) {\n\t\t\t\t\t\tString newName = input.getText().toString();\n\t\t\t\t\t\tif (newName.length() != 0)\n\t\t\t\t\t\t\tok.ok(newName);\n\t\t\t\t\t}})\n\t\t\t\t.setNegativeButton(android.R.string.cancel, null)\n\t\t\t\t.create().show();\n\t}\n\n\tpublic static void removeRosterItemDialog(final Activity act, final String jid, final String userName) {\n\t\tnew AlertDialog.Builder(act)\n\t\t\t\t.setTitle(R.string.deleteRosterItem_title)\n\t\t\t\t.setMessage(act.getString(R.string.deleteRosterItem_text, userName, jid))\n\t\t\t\t.setPositiveButton(android.R.string.yes,\n\t\t\t\t\t\tnew DialogInterface.OnClickListener() {\n\t\t\t\t\t\t\tpublic void onClick(DialogInterface dialog, int which) {\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tYaximApplication.getApp().getSmackable().removeRosterItem(jid);\n\t\t\t\t\t\t\t\t\tif (act instanceof ChatWindow)\n\t\t\t\t\t\t\t\t\t\tact.finish();\n\t\t\t\t\t\t\t\t} catch (Exception e) {\n\t\t\t\t\t\t\t\t\tshortToastNotify(act, e);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t.setNegativeButton(android.R.string.no, null)\n\t\t\t\t.create().show();\n\t}\n\tpublic static void renameRosterItemDialog(final Activity act, final String jid, final String userName) {\n\t\tString newUserName = userName;\n\t\tif (jid.equals(userName))\n\t\t\tnewUserName = XMPPHelper.capitalizeString(jid.split(\"@\")[0]);\n\t\teditTextDialog(act, R.string.RenameEntry_title,\n\t\t\t\tact.getString(R.string.RenameEntry_summ, userName, jid),\n\t\t\t\tnewUserName, false, new EditOk() {\n\t\t\t\t\tpublic void ok(String result) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tYaximApplication.getApp().getSmackable().renameRosterItem(jid, result);\n\t\t\t\t\t\t} catch (Exception e) {\n\t\t\t\t\t\t\tshortToastNotify(act, e);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t}\n\tpublic static void moveRosterItemToGroupDialog(final Activity act, final String jabberID) {\n\t\tLayoutInflater inflater = (LayoutInflater)act.getSystemService(\n\t\t\t\tact.LAYOUT_INFLATER_SERVICE);\n\t\tView group = inflater.inflate(R.layout.moverosterentrytogroupview, null, false);\n\t\tfinal GroupNameView gv = (GroupNameView)group.findViewById(R.id.moverosterentrytogroupview_gv);\n\t\tgv.setGroupList(getRosterGroups(act));\n\t\tnew AlertDialog.Builder(act)\n\t\t\t\t.setTitle(R.string.MoveRosterEntryToGroupDialog_title)\n\t\t\t\t.setView(group)\n\t\t\t\t.setPositiveButton(android.R.string.ok,\n\t\t\t\t\t\tnew DialogInterface.OnClickListener() {\n\t\t\t\t\t\t\tpublic void onClick(DialogInterface dialog, int which) {\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tYaximApplication.getApp().getSmackable().moveRosterItemToGroup(jabberID,\n\t\t\t\t\t\t\t\t\t\t\tgv.getGroupName());\n\t\t\t\t\t\t\t\t} catch (Exception e) {\n\t\t\t\t\t\t\t\t\tshortToastNotify(act, e);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t.setNegativeButton(android.R.string.cancel, null)\n\t\t\t\t.create().show();\n\t}\n\n\n\n\tpublic static boolean handleJidOptions(Activity act, int menu_id, String jid, String userName) {\n\t\tIntent ringToneIntent = new Intent(act, NotificationPrefs.class);\n\t\tswitch (menu_id) {\n\t\t// generic options (roster_item_contextmenu.xml)\n\t\tcase R.id.roster_contextmenu_contact_mark_as_read:\n\t\t\tmarkAsRead(act, jid);\n\t\t\treturn true;\n\t\tcase R.id.roster_contextmenu_contact_delmsg:\n\t\t\tremoveChatHistoryDialog(act, jid, userName);\n\t\t\treturn true;\n\n\t\t// contact specific options (contact_options.xml)\n\t\tcase R.id.roster_contextmenu_contact_delete:\n\t\t\tremoveRosterItemDialog(act, jid, userName);\n\t\t\treturn true;\n\t\tcase R.id.roster_contextmenu_contact_rename:\n\t\t\trenameRosterItemDialog(act, jid, userName);\n\t\t\treturn true;\n\t\tcase R.id.roster_contextmenu_contact_request_auth:\n\t\t\ttry {\n\t\t\t\tYaximApplication.getApp().getSmackable().sendPresenceRequest(jid, \"subscribe\");\n\t\t\t} catch (YaximXMPPException e) {\n\t\t\t\tshortToastNotify(act, e);\n\t\t\t}\n\t\t\treturn true;\n\t\tcase R.id.roster_contextmenu_contact_change_group:\n\t\t\tmoveRosterItemToGroupDialog(act, jid);\n\t\t\treturn true;\n\n\t\tcase R.id.menu_add_friend:\n\t\t\tnew AddRosterItemDialog(act, jid).show();\n\t\t\treturn true;\n\n\t\tcase R.id.roster_contextmenu_contact_share:\n\t\t\tshowQrDialog(act, jid, XMPPHelper.createRosterLinkHTTPS(jid), userName);\n\t\t\treturn true;\n\n\t\t// MUC specific options (muc_options.xml)\n\t\tcase R.id.roster_contextmenu_muc_edit:\n\t\t\tnew EditMUCDialog(act, jid).dontOpen().show();\n\t\t\treturn true;\n\t\tcase R.id.roster_contextmenu_muc_leave:\n\t\t\tConfirmDialog.showMucLeave(act, jid);\n\t\t\treturn true;\n\t\tcase R.id.roster_contextmenu_muc_ringtone:\n\t\t\tringToneIntent.setData(Uri.parse(\"muc\"));\n\t\tcase R.id.roster_contextmenu_ringtone:\n\t\t\tringToneIntent.putExtra(\"jid\", jid);\n\t\t\tringToneIntent.putExtra(\"name\", userName);\n\t\t\tact.startActivity(ringToneIntent);\n\t\t\treturn true;\n\t\tcase R.id.roster_contextmenu_muc_share:\n\t\t\tshowQrDialog(act, jid, XMPPHelper.createMucLinkHTTPS(jid), userName);\n\t\t\treturn true;\n\t\tdefault:\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tpublic static void shortToastNotify(Context ctx, String msg) {\n\t\tToast toast = Toast.makeText(ctx, msg, Toast.LENGTH_SHORT);\n\t\ttoast.show();\n\t}\n\tpublic static void shortToastNotify(Context ctx, Throwable e) {\n\t\te.printStackTrace();\n\t\twhile (e.getCause() != null)\n\t\t\te = e.getCause();\n\t\tshortToastNotify(ctx,e.getMessage());\n\t}\n\n\tprivate static final String[] ROSTER_QUERY = new String[] {\n\t\tRosterConstants.JID,\n\t\tRosterConstants.ALIAS,\n\t};\n\tpublic static final int ROSTER_FILTER_ALL = 0;\n\tpublic static final int ROSTER_FILTER_CONTACTS = 1;\n\tpublic static final int ROSTER_FILTER_MUCS = 2;\n\tpublic static final int ROSTER_FILTER_SUBSCRIPTIONS = 3;\n\tpublic static List<String[]> getRosterContacts(Context ctx, int filter) {\n\t\t// we want all, online and offline\n\t\tList<String[]> list = new ArrayList<String[]>();\n\t\tString selection = null;\n\t\tif (filter == ROSTER_FILTER_CONTACTS)\n\t\t\tselection = \"roster_group != '\" + RosterConstants.MUCS + \"'\";\n\t\telse if (filter == ROSTER_FILTER_MUCS)\n\t\t\tselection = \"roster_group == '\" + RosterConstants.MUCS + \"'\";\n\t\telse if (filter == ROSTER_FILTER_SUBSCRIPTIONS)\n\t\t\tselection = \"status_mode == \" + StatusMode.subscribe.ordinal();\n\t\tCursor cursor = ctx.getContentResolver().query(RosterProvider.CONTENT_URI, ROSTER_QUERY,\n\t\t\t\t\tselection, null, RosterConstants.ALIAS);\n\t\tint JIDIdx = cursor.getColumnIndex(RosterConstants.JID);\n\t\tint aliasIdx = cursor.getColumnIndex(RosterConstants.ALIAS);\n\t\tcursor.moveToFirst();\n\t\twhile (!cursor.isAfterLast()) {\n\t\t\tString jid = cursor.getString(JIDIdx);\n\t\t\tString alias = cursor.getString(aliasIdx);\n\t\t\tif ((alias == null) || (alias.length() == 0)) alias = jid;\n\t\t\tlist.add(new String[] { jid, alias });\n\t\t\tcursor.moveToNext();\n\t\t}\n\t\tcursor.close();\n\t\treturn list;\n\t}\n\n\tprivate static final String[] GROUPS_QUERY = new String[] {\n\t\t\tRosterConstants._ID,\n\t\t\tRosterConstants.GROUP,\n\t};\n\tpublic static List<String> getRosterGroups(Context ctx) {\n\t\t// we want all, online and offline\n\t\tList<String> list = new ArrayList<String>();\n\t\tCursor cursor = ctx.getContentResolver().query(RosterProvider.GROUPS_URI, GROUPS_QUERY,\n\t\t\t\tnull, null, RosterConstants.GROUP);\n\t\tint idx = cursor.getColumnIndex(RosterConstants.GROUP);\n\t\tcursor.moveToFirst();\n\t\twhile (!cursor.isAfterLast()) {\n\t\t\tlist.add(cursor.getString(idx));\n\t\t\tcursor.moveToNext();\n\t\t}\n\t\tcursor.close();\n\t\tlist.remove(RosterProvider.RosterConstants.MUCS);\n\t\treturn list;\n\t}\n\n\n\tpublic static Collection<String> getXMPPDomains(Context ctx, int filter) {\n\t\tHashSet<String> servers = new HashSet<String>();\n\t\tfor (String[] c : getRosterContacts(ctx, filter)) {\n\t\t\tString[] jid_split = c[0].split(\"@\", 2);\n\t\t\tif (jid_split.length > 1)\n\t\t\t\tservers.add(jid_split[1]);\n\t\t}\n\t\treturn servers;\n\t}\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/data/ChatProvider.java",
    "content": "package org.yaxim.androidclient.data;\n\nimport java.util.ArrayList;\n\nimport org.yaxim.androidclient.BuildConfig;\nimport org.yaxim.androidclient.util.LogConstants;\n\nimport android.content.ContentProvider;\nimport android.content.ContentUris;\nimport android.content.ContentValues;\nimport android.content.Context;\nimport android.content.UriMatcher;\nimport android.database.Cursor;\nimport android.database.SQLException;\nimport android.database.sqlite.SQLiteDatabase;\nimport android.database.sqlite.SQLiteOpenHelper;\nimport android.database.sqlite.SQLiteQueryBuilder;\nimport android.net.Uri;\nimport android.provider.BaseColumns;\nimport android.text.TextUtils;\nimport android.util.Log;\n\npublic class ChatProvider extends ContentProvider {\n\n\tpublic static final String AUTHORITY = BuildConfig.APPLICATION_ID + \".provider.Chats\";\n\tpublic static final String TABLE_NAME = \"chats\";\n\tpublic static final String TABLE_ARCHIVE = \"archive\";\n\tpublic static final Uri CONTENT_URI = Uri.parse(\"content://\" + AUTHORITY\n\t\t\t+ \"/\" + TABLE_NAME);\n\tpublic static final Uri ARCHIVE_URI = Uri.parse(\"content://\" + AUTHORITY\n\t\t\t+ \"/\" + TABLE_ARCHIVE);\n\n\tprivate static final UriMatcher URI_MATCHER = new UriMatcher(\n\t\t\tUriMatcher.NO_MATCH);\n\n\tprivate static final int MESSAGES = 1;\n\tprivate static final int MESSAGE_ID = 2;\n\tprivate static final int ARCHIVE = 3;\n\n\tstatic {\n\t\tURI_MATCHER.addURI(AUTHORITY, \"chats\", MESSAGES);\n\t\tURI_MATCHER.addURI(AUTHORITY, \"chats/#\", MESSAGE_ID);\n\t\tURI_MATCHER.addURI(AUTHORITY, \"archive\", ARCHIVE);\n\t}\n\n\tprivate static final String TAG = \"yaxim.ChatProvider\";\n\n\tprivate SQLiteOpenHelper mOpenHelper;\n\n\tpublic ChatProvider() {\n\t}\n\n\t@Override\n\tpublic int delete(Uri url, String where, String[] whereArgs) {\n\t\tSQLiteDatabase db = mOpenHelper.getWritableDatabase();\n\t\tint count;\n\t\tswitch (URI_MATCHER.match(url)) {\n\n\t\tcase MESSAGES:\n\t\t\tcount = db.delete(TABLE_NAME, where, whereArgs);\n\t\t\tbreak;\n\t\tcase MESSAGE_ID:\n\t\t\tString segment = url.getPathSegments().get(1);\n\n\t\t\tif (TextUtils.isEmpty(where)) {\n\t\t\t\twhere = \"_id=\" + segment;\n\t\t\t} else {\n\t\t\t\twhere = \"_id=\" + segment + \" AND (\" + where + \")\";\n\t\t\t}\n\n\t\t\tcount = db.delete(TABLE_NAME, where, whereArgs);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new IllegalArgumentException(\"Cannot delete from URL: \" + url);\n\t\t}\n\n\t\tgetContext().getContentResolver().notifyChange(url, null);\n\t\treturn count;\n\t}\n\n\t@Override\n\tpublic String getType(Uri url) {\n\t\tint match = URI_MATCHER.match(url);\n\t\tswitch (match) {\n\t\tcase MESSAGES:\n\t\t\treturn ChatConstants.CONTENT_TYPE;\n\t\tcase MESSAGE_ID:\n\t\t\treturn ChatConstants.CONTENT_ITEM_TYPE;\n\t\tdefault:\n\t\t\tthrow new IllegalArgumentException(\"Unknown URL\");\n\t\t}\n\t}\n\n\t@Override\n\tpublic Uri insert(Uri url, ContentValues initialValues) {\n\t\tswitch (URI_MATCHER.match(url)) {\n\t\tcase ARCHIVE:\n\t\t\tSQLiteDatabase db = mOpenHelper.getWritableDatabase();\n\t\t\tdb.insert(TABLE_ARCHIVE, null, initialValues);\n\t\t\treturn null;\n\t\tcase MESSAGES:\n\t\t\tbreak; // fall through\n\t\tdefault:\n\t\t\tthrow new IllegalArgumentException(\"Cannot insert into URL: \" + url);\n\t\t}\n\n\t\tContentValues values = (initialValues != null) ? new ContentValues(\n\t\t\t\tinitialValues) : new ContentValues();\n\n\t\tfor (String colName : ChatConstants.getRequiredColumns()) {\n\t\t\tif (values.containsKey(colName) == false) {\n\t\t\t\tthrow new IllegalArgumentException(\"Missing column: \" + colName);\n\t\t\t}\n\t\t}\n\n\t\tSQLiteDatabase db = mOpenHelper.getWritableDatabase();\n\n\t\tlong rowId = db.insert(TABLE_NAME, ChatConstants.DATE, values);\n\n\t\tif (rowId < 0) {\n\t\t\tthrow new SQLException(\"Failed to insert row into \" + url);\n\t\t}\n\n\t\tUri noteUri = ContentUris.withAppendedId(CONTENT_URI, rowId);\n\t\tgetContext().getContentResolver().notifyChange(noteUri, null);\n\t\treturn noteUri;\n\t}\n\n\t@Override\n\tpublic boolean onCreate() {\n\t\tmOpenHelper = new ChatDatabaseHelper(getContext());\n\t\treturn true;\n\t}\n\n\tprivate void appendWhereJidCount(SQLiteQueryBuilder qBuilder, String jid, String count) {\n\t\t// optimized query to get last N entries:\n\t\t//    SELECT * FROM chats\n\t\t//    WHERE jid=\"?\"\n\t\t//    AND _id > IFNULL((SELECT _id FROM chats WHERE jid=\"?\" ORDER BY _id DESC LIMIT 1 OFFSET 200), 0)\n\t\tqBuilder.appendWhere(\"jid=\");\n\t\tqBuilder.appendWhereEscapeString(jid);\n\t\tlong lCount = Long.valueOf(count);\n\t\tif (lCount < 0) {\n\t\t\t// negative count - everything starting with _id == -count\n\t\t\tqBuilder.appendWhere(\"AND _id >= \");\n\t\t\tqBuilder.appendWhereEscapeString(String.valueOf(-lCount));\n\t\t} else {\n\t\t\tqBuilder.appendWhere(\"AND _id > IFNULL((SELECT _id FROM chats WHERE jid=\");\n\t\t\tqBuilder.appendWhereEscapeString(jid);\n\t\t\tqBuilder.appendWhere(\"ORDER BY _id DESC LIMIT 1 OFFSET \");\n\t\t\tqBuilder.appendWhereEscapeString(count);\n\t\t\tqBuilder.appendWhere(\"), 0)\");\n\t\t}\n\t}\n\n\t@Override\n\tpublic Cursor query(Uri url, String[] projectionIn, String selection,\n\t\t\tString[] selectionArgs, String sortOrder) {\n\n\t\tSQLiteQueryBuilder qBuilder = new SQLiteQueryBuilder();\n\t\tint match = URI_MATCHER.match(url);\n\n\t\tswitch (match) {\n\t\tcase MESSAGES:\n\t\t\tqBuilder.setTables(TABLE_NAME);\n\t\t\tbreak;\n\t\tcase MESSAGE_ID:\n\t\t\tqBuilder.setTables(TABLE_NAME);\n\t\t\tqBuilder.appendWhere(\"_id=\");\n\t\t\tqBuilder.appendWhere(url.getPathSegments().get(1));\n\t\t\tbreak;\n\t\tcase ARCHIVE:\n\t\t\tqBuilder.setTables(TABLE_ARCHIVE);\n\t\t\tif (TextUtils.isEmpty(sortOrder))\n\t\t\t\tsortOrder = \"jid\";\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new IllegalArgumentException(\"Unknown URL \" + url);\n\t\t}\n\n\t\tString orderBy;\n\t\tif (TextUtils.isEmpty(sortOrder)) {\n\t\t\torderBy = ChatConstants.DEFAULT_SORT_ORDER;\n\t\t} else {\n\t\t\torderBy = sortOrder;\n\t\t}\n\n\t\tSQLiteDatabase db = mOpenHelper.getReadableDatabase();\n\t\tCursor ret = qBuilder.query(db, projectionIn, selection, selectionArgs,\n\t\t\t\tnull, null, orderBy);\n\n\t\tif (ret == null) {\n\t\t\tinfoLog(\"ChatProvider.query: failed\");\n\t\t} else {\n\t\t\tret.setNotificationUri(getContext().getContentResolver(), CONTENT_URI);\n\t\t}\n\n\t\treturn ret;\n\t}\n\n\t@Override\n\tpublic int update(Uri url, ContentValues values, String where,\n\t\t\tString[] whereArgs) {\n\t\tint count;\n\t\tlong rowId = 0;\n\t\tint match = URI_MATCHER.match(url);\n\t\tSQLiteDatabase db = mOpenHelper.getWritableDatabase();\n\n\t\tswitch (match) {\n\t\tcase MESSAGES:\n\t\t\tcount = db.update(TABLE_NAME, values, where, whereArgs);\n\t\t\tbreak;\n\t\tcase MESSAGE_ID:\n\t\t\tString segment = url.getPathSegments().get(1);\n\t\t\trowId = Long.parseLong(segment);\n\t\t\tcount = db.update(TABLE_NAME, values, \"_id=\" + rowId, null);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new UnsupportedOperationException(\"Cannot update URL: \" + url);\n\t\t}\n\n\t\tinfoLog(\"*** notifyChange() rowId: \" + rowId + \" url \" + url);\n\n\t\tgetContext().getContentResolver().notifyChange(url, null);\n\t\treturn count;\n\n\t}\n\n\tprivate static void infoLog(String data) {\n\t\tif (LogConstants.LOG_INFO) {\n\t\t\tLog.i(TAG, data);\n\t\t}\n\t}\n\n\tprivate static class ChatDatabaseHelper extends SQLiteOpenHelper {\n\n\t\tprivate static final String DATABASE_NAME = \"yaxim.db\";\n\t\tprivate static final int DATABASE_VERSION = 9;\n\n\t\tpublic ChatDatabaseHelper(Context context) {\n\t\t\tsuper(context, DATABASE_NAME, null, DATABASE_VERSION);\n\t\t}\n\n\t\t@Override\n\t\tpublic void onCreate(SQLiteDatabase db) {\n\t\t\tif (LogConstants.LOG_DEBUG) {\n\t\t\t\tinfoLog(\"creating new chat table\");\n\t\t\t}\n\n\t\t\tdb.execSQL(\"CREATE TABLE \" + TABLE_NAME + \" (\" \n\t\t\t\t\t+ ChatConstants._ID + \" INTEGER PRIMARY KEY AUTOINCREMENT,\"\n\t\t\t\t\t+ ChatConstants.DATE + \" INTEGER,\"\n\t\t\t\t\t+ ChatConstants.DIRECTION + \" INTEGER,\"\n\t\t\t\t\t+ ChatConstants.JID + \" TEXT,\"\n\t\t\t\t\t+ ChatConstants.MESSAGE + \" TEXT,\"\n\t\t\t\t\t+ ChatConstants.MSGFLAGS + \" INT,\"\n\t\t\t\t\t+ ChatConstants.EXTRA + \" TEXT,\"\n\t\t\t\t\t+ ChatConstants.ERROR + \" TEXT,\"\n\t\t\t\t\t+ ChatConstants.CORRECTION + \" TEXT,\"\n\t\t\t\t\t+ ChatConstants.DELIVERY_STATUS + \" INTEGER,\"\n\t\t\t\t\t+ ChatConstants.PACKET_ID + \" TEXT,\"\n\t\t\t\t\t+ ChatConstants.UNIQUE_ID + \" TEXT,\"\n\t\t\t\t\t+ ChatConstants.RESOURCE + \" TEXT DEFAULT NULL);\");\n\n\t\t\tdb.execSQL(\"CREATE TABLE IF NOT EXISTS archive (\" +\n\t\t\t\t\t\"jid TEXT PRIMARY KEY ON CONFLICT REPLACE,\" +\n\t\t\t\t\t\"uid TEXT,\" +\n\t\t\t\t\t\"date INTEGER)\");\n\t\t\tdb.execSQL(\"CREATE INDEX IF NOT EXISTS idx_chat_pid on chats (pid)\");\n\t\t\tdb.execSQL(\"CREATE INDEX IF NOT EXISTS idx_chat_jid_date on chats (jid, date)\");\n\t\t\tdb.execSQL(\"CREATE INDEX IF NOT EXISTS idx_chat_jid_uid on chats (jid, uid)\");\n\t\t\tdb.execSQL(\"CREATE INDEX IF NOT EXISTS idx_chat_jid_from_read on chats (jid, from_me, read)\");\n\t\t}\n\n\t\t@Override\n\t\tpublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {\n\t\t\tinfoLog(\"onUpgrade: from \" + oldVersion + \" to \" + newVersion);\n\t\t\tswitch (oldVersion) {\n\t\t\tcase 3:\n\t\t\t\tdb.execSQL(\"UPDATE \" + TABLE_NAME + \" SET READ=1\");\n\t\t\tcase 4:\n\t\t\t\tdb.execSQL(\"ALTER TABLE \" + TABLE_NAME + \" ADD \" + ChatConstants.PACKET_ID + \" TEXT\");\n\t\t\tcase 5:\n\t\t\t\tdb.execSQL(\"ALTER TABLE \" + TABLE_NAME + \" ADD \" + ChatConstants.RESOURCE + \" TEXT DEFAULT NULL\");\n\t\t\tcase 6:\n\t\t\t\t// moved INDEX creation to version 8->9, because it wasn't in onCreate()\n\t\t\tcase 7:\n\t\t\t\tdb.execSQL(\"ALTER TABLE \" + TABLE_NAME + \" ADD \" + ChatConstants.MSGFLAGS + \" INT DEFAULT 0\");\n\t\t\t\tdb.execSQL(\"ALTER TABLE \" + TABLE_NAME + \" ADD \" + ChatConstants.EXTRA + \" TEXT DEFAULT NULL\");\n\t\t\t\tdb.execSQL(\"ALTER TABLE \" + TABLE_NAME + \" ADD \" + ChatConstants.ERROR + \" TEXT DEFAULT NULL\");\n\t\t\t\tdb.execSQL(\"ALTER TABLE \" + TABLE_NAME + \" ADD \" + ChatConstants.CORRECTION + \" TEXT DEFAULT NULL\");\n\t\t\tcase 8:\n\t\t\t\tdb.execSQL(\"ALTER TABLE \" + TABLE_NAME + \" ADD \" + ChatConstants.UNIQUE_ID + \" TEXT DEFAULT NULL\");\n\t\t\t\tdb.execSQL(\"CREATE TABLE IF NOT EXISTS archive (\" +\n\t\t\t\t\t\t\"jid TEXT PRIMARY KEY ON CONFLICT REPLACE,\" +\n\t\t\t\t\t\t\"uid TEXT,\" +\n\t\t\t\t\t\t\"date INTEGER)\");\n\n\t\t\t\tdb.execSQL(\"CREATE INDEX IF NOT EXISTS idx_chat_pid on chats (pid)\");\n\t\t\t\tdb.execSQL(\"CREATE INDEX IF NOT EXISTS idx_chat_jid_date on chats (jid, date)\");\n\t\t\t\tdb.execSQL(\"CREATE INDEX IF NOT EXISTS idx_chat_jid_uid on chats (jid, uid)\");\n\t\t\t\tdb.execSQL(\"CREATE INDEX IF NOT EXISTS idx_chat_jid_from_read on chats (jid, from_me, read)\");\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tdb.execSQL(\"DROP TABLE IF EXISTS \" + TABLE_NAME);\n\t\t\t\tonCreate(db);\n\t\t\t}\n\t\t}\n\n\t}\n\n\tpublic static final class ChatConstants implements BaseColumns {\n\n\t\tprivate ChatConstants() {\n\t\t}\n\n\t\tpublic static final String CONTENT_TYPE = \"vnd.android.cursor.dir/vnd.yaxim.chat\";\n\t\tpublic static final String CONTENT_ITEM_TYPE = \"vnd.android.cursor.item/vnd.yaxim.chat\";\n\t\tpublic static final String DEFAULT_SORT_ORDER = \"_id ASC\"; // sort by auto-id\n\n\t\tpublic static final String DATE = \"date\";\n\t\tpublic static final String DIRECTION = \"from_me\";\n\t\tpublic static final String JID = \"jid\";\n\t\tpublic static final String MESSAGE = \"message\";\n\t\tpublic static final String MSGFLAGS = \"msgtype\";\n\t\tpublic static final String EXTRA = \"extra\";\n\t\tpublic static final String ERROR = \"error\";\n\t\tpublic static final String CORRECTION = \"correction\";\n\t\tpublic static final String DELIVERY_STATUS = \"read\"; // SQLite can not rename columns, reuse old name\n\t\tpublic static final String PACKET_ID = \"pid\";\n\t\tpublic static final String UNIQUE_ID = \"uid\";\n\t\tpublic static final String RESOURCE = \"resource\"; // to identify senders in MUCs (among others)\n\n\t\t// boolean mappings\n\t\tpublic static final int INCOMING = 0;\n\t\tpublic static final int OUTGOING = 1;\n\t\t// delivery status mappings\n\t\tpublic static final int DS_NEW = 0; //< this message has not been sent/displayed yet\n\t\tpublic static final int DS_SENT_OR_READ = 1; //< this message was sent but not yet acked, or it was received and read\n\t\tpublic static final int DS_ACKED = 2; //< this message was XEP-0184 acknowledged\n\t\tpublic static final int DS_FAILED = 3; //< this message was returned as failed\n\n\t\t// message flags mappings\n\t\tpublic static final int MF_TEXT = 0; //< this is a regular chat message\n\t\tpublic static final int MF_FILE = 1; //< this is a file upload URL / SIMS / OOB\n\t\tpublic static final int MT_INVITE = 2; //< this is a chatroom invitation\n\t\tpublic static final int MF_DELAY = 4; //< this message was delayed\n\t\tpublic static final int MF_CORRECT = 8; //< this message was corrected\n\n\t\tpublic static ArrayList<String> getRequiredColumns() {\n\t\t\tArrayList<String> tmpList = new ArrayList<String>();\n\t\t\ttmpList.add(DATE);\n\t\t\ttmpList.add(DIRECTION);\n\t\t\ttmpList.add(JID);\n\t\t\ttmpList.add(MESSAGE);\n\t\t\treturn tmpList;\n\t\t}\n\n\t}\n\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/data/ChatRoomHelper.java",
    "content": "package org.yaxim.androidclient.data;\n\nimport org.yaxim.androidclient.data.RosterProvider.RosterConstants;\nimport org.yaxim.androidclient.service.IXMPPMucService;\nimport org.yaxim.androidclient.util.XMPPHelper;\n\nimport android.content.ComponentName;\nimport android.content.ContentValues;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.ServiceConnection;\nimport android.database.Cursor;\nimport android.net.Uri;\nimport android.os.IBinder;\nimport android.os.RemoteException;\nimport android.text.TextUtils;\n\nimport java.util.Collection;\nimport java.util.List;\n\npublic class ChatRoomHelper {\n\n\tpublic static boolean addRoom(Context ctx, String jid, String password, String nickname, boolean autojoin) {\n\t\tContentValues cv = new ContentValues();\n\t\tcv.put(RosterProvider.RosterConstants.JID, jid.toLowerCase());\n\t\tcv.put(RosterProvider.RosterConstants.NICKNAME, nickname);\n\t\tcv.put(RosterProvider.RosterConstants.PASSWORD, password);\n\t\tcv.put(RosterProvider.RosterConstants.AUTOJOIN, autojoin);\n\t\tUri ret = ctx.getContentResolver().insert(RosterProvider.MUCS_URI, cv);\n\t\treturn (ret != null);\n\t}\n\t\n\tpublic static boolean leaveRoom(Context ctx, String jid) {\n\t\tContentValues cv = new ContentValues();\n\t\tcv.put(RosterProvider.RosterConstants.AUTOJOIN, 0);\n\t\tint updated = ctx.getContentResolver().update(RosterProvider.MUCS_URI,\n\t\t\t\tcv, RosterConstants.JID+\" = ?\", new String[] {jid.toLowerCase()});\n\t\treturn (updated > 0);\n\t}\n\n\tpublic static void cleanupUnimportantRooms(Context ctx, Collection<String> jids) {\n\t\tStringBuilder exclusion = new StringBuilder(\"autojoin = 0 AND \"\n\t\t\t\t+ RosterConstants.JID + \" NOT IN ('\");\n\t\texclusion.append(TextUtils.join(\"', '\", jids));\n\t\texclusion.append(\"');\");\n\t\tctx.getContentResolver().delete(RosterProvider.MUCS_URI,\n\t\t\t\texclusion.toString(), null);\n\t}\n\n\tpublic static boolean isRoom(Context ctx, String jid) {\n\t\tCursor cursor = ctx.getContentResolver().query(RosterProvider.MUCS_URI, \n\t\t\t\tnew String[] {RosterProvider.RosterConstants._ID,\n\t\t\t\t\tRosterProvider.RosterConstants.JID}, \n\t\t\t\t\tRosterConstants.JID + \" = ?\", new String[] { jid.toLowerCase() }, null);\n\t\tboolean is_room = (cursor.getCount() == 1);\n\t\tcursor.close();\n\t\treturn is_room;\n\t}\n\n\tpublic static void syncDbRooms(final Context ctx) {\n\t\tIntent serviceIntent = new Intent(ctx, org.yaxim.androidclient.service.XMPPService.class);\n\t\tserviceIntent.setAction(\"org.yaxim.androidclient.XMPPSERVICE\");\n\t\tserviceIntent.setData(Uri.parse(\"?chat\"));\n\t\tServiceConnection c = new ServiceConnection() {\n\t\t\tpublic void onServiceConnected(ComponentName name, IBinder service) {\n\t\t\t\tIXMPPMucService mucService = IXMPPMucService.Stub.asInterface(service);\n\t\t\t\ttry {\n\t\t\t\t\tmucService.syncDbRooms();\n\t\t\t\t} catch (RemoteException e) {\n\t\t\t\t\te.printStackTrace();\n\t\t\t\t}\n\t\t\t\tctx.unbindService(this);\n\t\t\t}\n\t\t\tpublic void onServiceDisconnected(ComponentName name) {}\n\t\t};\n\t\tctx.bindService(serviceIntent, c, Context.BIND_AUTO_CREATE);\n\t}\n\n\tpublic static String guessMyNickname(Context ctx, String fallback) {\n\t\t// obtain a sorted list of MUC nicknames; manually counting the\n\t\t// occurences is a workaround for the missing \"GROUP BY nickname\"\n\t\tCursor cursor = ctx.getContentResolver().query(RosterProvider.MUCS_URI,\n\t\t\t\tnew String[] { RosterConstants.NICKNAME },\n\t\t\t\tnull, null, RosterConstants.NICKNAME );\n\t\tString best = fallback;\n\t\tint best_count = 0;\n\t\tString current = null;\n\t\tint current_count = 0;\n\t\t// count the occurences of every nickname in 'current', update 'best' with most-often used one\n\t\twhile (cursor.moveToNext()) {\n\t\t\tandroid.util.Log.d(\"ChatRoomHelper\", String.format(\"guessMyNickname: %s(%d) %s(%d) %s\", best, best_count, current, current_count, cursor.getString(0)));\n\t\t\tif (cursor.getString(0).equals(current))\n\t\t\t\tcurrent_count++;\n\t\t\telse {\n\t\t\t\tcurrent = cursor.getString(0);\n\t\t\t\tcurrent_count = 1;\n\t\t\t}\n\t\t\tif (current_count > best_count) {\n\t\t\t\tbest = current;\n\t\t\t\tbest_count = current_count;\n\t\t\t}\n\t\t}\n\t\tcursor.close();\n\t\treturn best;\n\t}\n\n\tpublic static String getRoomName(Context ctx, String jid) {\n\t\t// query the DB as we do not have the room name in memory\n\t\tCursor c = ctx.getContentResolver().query(RosterProvider.CONTENT_URI, new String[] { RosterConstants.ALIAS },\n\t\t\t\tRosterConstants.JID + \" = ?\", new String[] { jid }, null);\n\t\tString result = jid;\n\t\tif (c.moveToFirst())\n\t\t\tresult = c.getString(0);\n\t\tc.close();\n\t\treturn result;\n\t}\n\n\tpublic static RoomInfo getRoomInfo(Context ctx, String jid) {\n\t\tCursor cursor = ctx.getContentResolver().query(RosterProvider.MUCS_URI,\n\t\t\t\tnew String[] { RosterConstants._ID, RosterConstants.JID,\n\t\t\t\t\t       RosterConstants.NICKNAME, RosterConstants.PASSWORD },\n\t\t\t\tRosterConstants.JID + \" = ?\", new String[] { jid.toLowerCase() }, null);\n\t\tif (cursor.getCount() == 1) {\n\t\t\tcursor.moveToFirst();\n\t\t\tRoomInfo ri = new RoomInfo(cursor);\n\t\t\tcursor.close();\n\t\t\treturn ri;\n\t\t} else {\n\t\t\tcursor.close();\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tpublic static class RoomInfo {\n\t\tpublic String jid;\n\t\tpublic String nickname;\n\t\tpublic String password;\n\t\t//public String status_message;\n\n\t\tRoomInfo(Cursor c) {\n\t\t\tjid = c.getString(c.getColumnIndexOrThrow(RosterConstants.JID));\n\t\t\tnickname = c.getString(c.getColumnIndexOrThrow(RosterConstants.NICKNAME));\n\t\t\tpassword = c.getString(c.getColumnIndexOrThrow(RosterConstants.PASSWORD));\n\t\t\t//status_message = c.getString(c.getColumnIndexOrThrow(RosterConstants.STATUS_MESSAGE));\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/data/EntityInfo.java",
    "content": "package org.yaxim.androidclient.data;\n\nimport android.text.TextUtils;\n\nimport org.jivesoftware.smack.XMPPException;\nimport org.jivesoftware.smack.packet.Presence;\nimport org.jivesoftware.smack.packet.StanzaError;\nimport org.jivesoftware.smackx.disco.packet.DiscoverInfo;\nimport org.jivesoftware.smackx.disco.packet.DiscoverItems;\nimport org.jivesoftware.smackx.muc.RoomInfo;\nimport org.jivesoftware.smackx.muc.packet.MUCInitialPresence;\nimport org.yaxim.androidclient.util.StatusMode;\nimport org.yaxim.androidclient.util.XMPPHelper;\n\nimport java.util.EnumSet;\nimport java.util.List;\n\npublic class EntityInfo {\n\tpublic String jid;\n\tpublic StatusMode statusMode;\n\tpublic int unread;\n\tpublic String name;\n\tpublic String status;\n\tpublic int users;\n\t// TODO: timestamp\n\t// TODO: last message body\n\t// TODO: avatar\n\n\tpublic EnumSet<Type> type;\n\tpublic Object data;\n\n\tpublic EntityInfo() {\n\t}\n\n\tpublic EntityInfo(EnumSet<Type> type, String jid, StatusMode statusMode, int unread, String name, String status, int users, Object data) {\n\t\tthis.type = type;\n\t\tthis.jid = jid;\n\t\tthis.statusMode = statusMode;\n\t\tthis.unread = unread;\n\t\tthis.name = name;\n\t\tthis.status = status;\n\t\tthis.users = users;\n\t\tthis.data = data;\n\t}\n\n\tpublic EntityInfo(EnumSet<Type> type, Presence p) {\n\t\tthis.type = type;\n\t\tthis.jid = p.getFrom().asBareJid().toString();\n\t\tsetPresenceStatus(p);\n\t\tthis.data = p;\n\t}\n\n\tpublic static EntityInfo fromJidName(String jid, String name) {\n\t\treturn new EntityInfo(EnumSet.of(Type.User), jid, StatusMode.unknown, 0, name, jid, 0, null);\n\t}\n\tpublic static EntityInfo fromJid(String jid) {\n\t\treturn new EntityInfo(EnumSet.of(Type.User), jid, StatusMode.unknown, 0, jid, null, 0, null);\n\t}\n\tpublic static EntityInfo fromError(Throwable ex) {\n\t\tString msg = ex.getLocalizedMessage();\n\t\tif (ex instanceof XMPPException.XMPPErrorException) {\n\t\t\tStanzaError se = ((XMPPException.XMPPErrorException) ex).getStanzaError();\n\t\t\tif (se.getDescriptiveText() != null)\n\t\t\t\tmsg = se.getDescriptiveText();\n\t\t\telse\n\t\t\t\tmsg = se.toString();\n\t\t}\n\t\treturn new EntityInfo(EnumSet.noneOf(Type.class),null, null, 0, msg, null, 0, ex);\n\t}\n\n\n\tpublic static EntityInfo fromDisco(String jid, DiscoverInfo di) {\n\t\tEntityInfo ei = new EntityInfo();\n\t\tei.jid = jid;\n\t\tei.type = EnumSet.of(Type.User);\n\t\t// boring: set name to JID\n\t\tei.name = XMPPHelper.jid2mxid(jid);\n\t\t// obtain fallback name from first identity, if available\n\t\tList<DiscoverInfo.Identity> i = di.getIdentities();\n\t\tif (i != null && i.size() > 0 && !TextUtils.isEmpty(i.get(0).getName())) {\n\t\t\tei.name = i.get(0).getName();\n\t\t\tei.status = jid;\n\t\t}\n\t\tif (di.containsFeature(MUCInitialPresence.NAMESPACE)) {\n\t\t\t// check for MUC\n\t\t\t// MUC disco sucks, no way to distinguish a MUC service from a room!?!\n\t\t\tif (jid.contains(\"@\")) {\n\t\t\t\tei.statusMode = StatusMode.available;\n\t\t\t\tei.type = EnumSet.of(EntityInfo.Type.MUC);\n\t\t\t} else {\n\t\t\t\tei.statusMode = StatusMode.chat;\n\t\t\t\tei.type = EnumSet.of(EntityInfo.Type.Domain);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tRoomInfo ri = new RoomInfo(di);\n\t\t\t\tei.name = ri.getName();\n\t\t\t\tei.status = ri.getDescription();\n\t\t\t\tif (TextUtils.isEmpty(ei.status))\n\t\t\t\t\tei.status = ri.getSubject();\n\t\t\t\tif (TextUtils.isEmpty(ei.status))\n\t\t\t\t\tei.status = jid;\n\t\t\t\tei.users = ri.getOccupantsCount();\n\t\t\t\tif (ei.users < 0)\n\t\t\t\t\tei.users = 0;\n\t\t\t} catch (Exception e) { /* ignore */ }\n\n\t\t} else\n\t\tif (di.containsFeature(DiscoverItems.NAMESPACE)) {\n\t\t\t// check for disco#items\n\t\t\tei.statusMode = StatusMode.chat;\n\t\t\tei.type = EnumSet.of(EntityInfo.Type.Domain);\n\t\t} else\n\t\tif (di.hasIdentity(\"account\", \"registered\")) {\n\t\t\t// add as contact\n\t\t\tei.statusMode = StatusMode.unknown;\n\t\t\tei.type = EnumSet.of(EntityInfo.Type.User);\n\t\t}\n\t\treturn ei;\n\t}\n\n\tpublic void setPresenceStatus(Presence p) {\n\t\tif (p == null)\n\t\t\treturn;\n\t\tthis.status = p.getStatus();\n\t\tPresence.Mode pm = p.getMode();\n\t\tthis.statusMode = (pm == null) ? StatusMode.available : StatusMode.valueOf(pm.name());\n\t}\n\t/**\n\t * Type of EntityInfo\n\t *\n\t * Needs to map:\n\t *  - user JID\n\t *  - MUC\n\t *  - MUC-PM person\n\t *  - server-side list / adhoc / somesuch?\n\t *  - is a contact/bookmark?\n\t *  - is an invitation?\n\t */\n\tpublic enum Type {\n\t\tUser(1),\n\t\tMUC(2),\n\t\tMUC_PM(3),\n\t\tDomain(4),\n\t\tKnown(256),\n\t\tSearchResult(512);\n\n\t\tprivate int bits;\n\t\tType(int bits) {\n\t\t\tthis.bits = bits;\n\t\t}\n\t\tpublic int getValue() {\n\t\t\treturn bits;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/data/EntityList.java",
    "content": "package org.yaxim.androidclient.data;\n\nimport android.text.TextUtils;\nimport android.widget.Filter;\nimport android.widget.Filterable;\n\nimport org.yaxim.androidclient.list.EntityListAdapter;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\n\n/**\n * Filterable list of entities for a sub-tree in an EntityListAdapter.\n *\n * This list preserves the insertion order and allows addressing / replacing by JID.\n *\n * It supports the states \"loading\" and \"error\".\n */\n\npublic class EntityList implements Filterable {\n\tEntityListAdapter adapter;\n\n\tprivate ArrayList<EntityInfo> unfiltered_items = new ArrayList<>();\n\tprivate HashMap<String, Integer> jid_index = new HashMap<>();\n\tprivate EntityInfoFilter pif = new EntityInfoFilter();\n\n\tpublic String groupName;\n\tpublic ArrayList<EntityInfo> items = unfiltered_items;\n\tprivate boolean loading;\n\tprivate boolean error;\n\n\tpublic EntityList(EntityListAdapter adapter, String groupName) {\n\t\tthis.adapter = adapter;\n\t\tthis.groupName = groupName;\n\t\tloading = false;\n\t\terror = false;\n\t}\n\n\tpublic void startLoading() {\n\t\tloading = true;\n\t\terror = false;\n\t\tadapter.notifyDataSetChanged();\n\t}\n\tpublic void finishLoading() {\n\t\tloading = false;\n\t\terror = false;\n\t\tadapter.notifyDataSetChanged();\n\t}\n\n\tpublic boolean isLoading() {\n\t\treturn loading;\n\t}\n\n\tpublic boolean isError() {\n\t\treturn error;\n\t}\n\n\tpublic void add(EntityInfo pp, boolean notify) {\n\t\tInteger idx = jid_index.get(pp.jid);\n\t\tif (idx != null)\n\t\t\tunfiltered_items.set(idx, pp);\n\t\telse {\n\t\t\tjid_index.put(pp.jid, unfiltered_items.size());\n\t\t\tunfiltered_items.add(pp);\n\t\t}\n\t\tif (notify)\n\t\t\tadapter.notifyDataSetChanged();\n\t}\n\tpublic void clear() {\n\t\tunfiltered_items.clear();\n\t\tjid_index.clear();\n\t\tloading = true;\n\t\terror = false;\n\t\tadapter.notifyDataSetChanged();\n\t}\n\n\tpublic void setError(Throwable ex) {\n\t\tunfiltered_items.clear();\n\t\tunfiltered_items.add(EntityInfo.fromError(ex));\n\t\tloading = false;\n\t\terror = true;\n\t\tadapter.notifyDataSetChanged();\n\t}\n\n\t@Override\n\tpublic Filter getFilter() {\n\t\treturn pif;\n\t}\n\n\tclass EntityInfoFilter extends Filter {\n\t\t@Override\n\t\tprotected FilterResults performFiltering(CharSequence search) {\n\t\t\tArrayList<EntityInfo> filtered = new ArrayList<>();\n\t\t\tString needle = search.toString().toLowerCase();\n\t\t\tfor (EntityInfo item : unfiltered_items) {\n\t\t\t\tif (item.jid.contains(needle) || item.name.contains(needle))\n\t\t\t\t\tfiltered.add(item);\n\t\t\t}\n\t\t\tFilterResults fr = new FilterResults();\n\t\t\tfr.values = filtered;\n\t\t\tfr.count = filtered.size();\n\t\t\treturn fr;\n\t\t}\n\n\t\t@Override\n\t\tprotected void publishResults(CharSequence charSequence, FilterResults filterResults) {\n\t\t\tif (TextUtils.isEmpty(charSequence))\n\t\t\t\titems = unfiltered_items;\n\t\t\telse\n\t\t\t\titems = (ArrayList<EntityInfo>) filterResults.values;\n\t\t\tadapter.notifyDataSetChanged();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/data/RosterProvider.java",
    "content": "package org.yaxim.androidclient.data;\n\nimport java.util.ArrayList;\n\nimport org.yaxim.androidclient.BuildConfig;\nimport org.yaxim.androidclient.util.LogConstants;\n\nimport android.content.ContentProvider;\nimport android.content.ContentUris;\nimport android.content.ContentValues;\nimport android.content.Context;\nimport android.content.UriMatcher;\nimport android.database.Cursor;\nimport android.database.SQLException;\nimport android.database.sqlite.SQLiteDatabase;\nimport android.database.sqlite.SQLiteOpenHelper;\nimport android.database.sqlite.SQLiteQueryBuilder;\nimport android.net.Uri;\nimport android.provider.BaseColumns;\nimport android.text.TextUtils;\nimport android.os.Handler;\nimport android.util.Log;\n\npublic class RosterProvider extends ContentProvider {\n\n\tpublic static final String AUTHORITY = BuildConfig.APPLICATION_ID + \".provider.Roster\";\n\tpublic static final String TABLE_ROSTER = \"roster\";\n\tpublic static final String TABLE_GROUPS = \"groups\";\n\tpublic static final String TABLE_MUCS = \"mucs\";\n\tpublic static final Uri CONTENT_URI = Uri.parse(\"content://\" + AUTHORITY\n\t\t\t+ \"/\" + TABLE_ROSTER);\n\tpublic static final Uri GROUPS_URI = Uri.parse(\"content://\" + AUTHORITY\n\t\t\t+ \"/\" + TABLE_GROUPS);\n\tpublic static final Uri MUCS_URI = Uri.parse(\"content://\" + AUTHORITY\n\t\t\t+ \"/\" + TABLE_MUCS);\n\tpublic static final String QUERY_ALIAS = \"main_result\";\n\n\tprivate static final UriMatcher URI_MATCHER = new UriMatcher(\n\t\t\tUriMatcher.NO_MATCH);\n\tprivate static final int CONTACTS = 1;\n\tprivate static final int CONTACT_ID = 2;\n\tprivate static final int GROUPS = 3;\n\tprivate static final int GROUP_MEMBERS = 4;\n\tprivate static final int MUCS = 5;\n\t\n\n\tstatic {\n\t\tURI_MATCHER.addURI(AUTHORITY, \"roster\", CONTACTS);\n\t\tURI_MATCHER.addURI(AUTHORITY, \"roster/#\", CONTACT_ID);\n\t\tURI_MATCHER.addURI(AUTHORITY, \"groups\", GROUPS);\n\t\tURI_MATCHER.addURI(AUTHORITY, \"groups/*\", GROUP_MEMBERS);\n\t\tURI_MATCHER.addURI(AUTHORITY, \"mucs\", MUCS);\n\t}\n\n\tprivate static final String TAG = \"yaxim.RosterProvider\";\n\n\tprivate Runnable mNotifyChange = new Runnable() {\n\t\tpublic void run() {\n\t\t\tLog.d(TAG, \"notifying change\");\n\t\t\tgetContext().getContentResolver().notifyChange(CONTENT_URI, null);\n\t\t\tgetContext().getContentResolver().notifyChange(GROUPS_URI, null);\n\t\t\tgetContext().getContentResolver().notifyChange(MUCS_URI, null);\n\t\t}\n\t};\n\tprivate Handler mNotifyHandler = new Handler();\n\n\tprivate SQLiteOpenHelper mOpenHelper;\n\n\n\tpublic RosterProvider() {\n\t}\n\n\t@Override\n\tpublic int delete(Uri url, String where, String[] whereArgs) {\n\t\tSQLiteDatabase db = mOpenHelper.getWritableDatabase();\n\t\tint count;\n\t\t\t\t\n\t\tswitch (URI_MATCHER.match(url)) {\n\n\t\tcase CONTACTS:\n\t\t\tcount = db.delete(TABLE_ROSTER, where, whereArgs);\n\t\t\tbreak;\n\n\t\tcase CONTACT_ID:\n\t\t\tString segment = url.getPathSegments().get(1);\n\n\t\t\tif (TextUtils.isEmpty(where)) {\n\t\t\t\twhere = \"_id=\" + segment;\n\t\t\t} else {\n\t\t\t\twhere = \"_id=\" + segment + \" AND (\" + where + \")\";\n\t\t\t}\n\n\t\t\tcount = db.delete(TABLE_ROSTER, where, whereArgs);\n\t\t\tbreak;\n\n\t\tcase MUCS:\n\t\t\tcount = db.delete(TABLE_MUCS, where, whereArgs);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new IllegalArgumentException(\"Cannot delete from URL: \" + url);\n\t\t}\n\n\t\tgetContext().getContentResolver().notifyChange(GROUPS_URI, null);\n\t\tnotifyChange();\n\n\t\treturn count;\n\t}\n\n\t@Override\n\tpublic String getType(Uri url) {\n\t\tint match = URI_MATCHER.match(url);\n\t\tswitch (match) {\n\t\tcase CONTACTS:\n\t\t\treturn RosterConstants.CONTENT_TYPE;\n\t\tcase CONTACT_ID:\n\t\t\treturn RosterConstants.CONTENT_ITEM_TYPE;\n\t\tcase MUCS:\n\t\t\treturn RosterConstants.MUC_TYPE;\n\t\tdefault:\n\t\t\tthrow new IllegalArgumentException(\"Unknown URL\");\n\t\t}\n\t}\n\n\t@Override\n\tpublic Uri insert(Uri url, ContentValues initialValues) {\n\t\t\n\t\tif(URI_MATCHER.match(url) == CONTACTS) {\n\t\tContentValues values = (initialValues != null) ? new ContentValues(\n\t\t\t\tinitialValues) : new ContentValues();\n\t\tfor (String colName : RosterConstants.getRequiredContactColumns()) {\n\t\t\tif (values.containsKey(colName) == false) {\n\t\t\t\tthrow new IllegalArgumentException(\"Missing column: \" + colName);\n\t\t\t}\n\t\t}\n\n\t\tSQLiteDatabase db = mOpenHelper.getWritableDatabase();\n\t\tlong rowId = db.insert(TABLE_ROSTER, RosterConstants.JID, values);\n\t\tif (rowId < 0) {\n\t\t\tthrow new SQLException(\"Failed to insert row into \" + url);\n\t\t}\n\t\tUri noteUri = ContentUris.withAppendedId(CONTENT_URI, rowId);\n\t\tnotifyChange();\n\n\t\treturn noteUri;\n\t\t} else if (URI_MATCHER.match(url) == MUCS) {\n\t\t\tContentValues values = (initialValues != null) ? new ContentValues(\n\t\t\t\t\tinitialValues) : new ContentValues();\n\t\t\tfor (String colName : RosterConstants.getRequiredMUCColumns()) {\n\t\t\t\tif (values.containsKey(colName) == false) {\n\t\t\t\t\tthrow new IllegalArgumentException(\"Missing column: \" + colName);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tSQLiteDatabase db = mOpenHelper.getWritableDatabase();\n\t\t\tlong rowId = db.insert(TABLE_MUCS, RosterConstants.JID, values);\n\t\t\tif (rowId < 0) {\n\t\t\t\tthrow new SQLException(\"Failed to insert row into \" + url);\n\t\t\t}\n\t\t\tUri noteUri = ContentUris.withAppendedId(CONTENT_URI, rowId);\n\t\t\tnotifyChange();\n\t\t\t\n\t\t\treturn noteUri;\n\t\t} else {\n\t\t\tthrow new IllegalArgumentException(\"Cannot insert into URL: \" + url);\n\t\t}\n\t\t\n\t}\n\n\t@Override\n\tpublic boolean onCreate() {\n\t\tmOpenHelper = new RosterDatabaseHelper(getContext());\n\t\treturn true;\n\t}\n\n\t@Override\n\tpublic Cursor query(Uri url, String[] projectionIn, String selection,\n\t\t\tString[] selectionArgs, String sortOrder) {\n\t\t\n\t\tSQLiteQueryBuilder qBuilder = new SQLiteQueryBuilder();\n\t\tint match = URI_MATCHER.match(url);\n\t\t\n\t\tString groupBy = null;\n\t\tswitch (match) {\n\n\t\tcase GROUPS:\n\t\t\tqBuilder.setTables(TABLE_ROSTER + \" \" + QUERY_ALIAS);\n\t\t\tgroupBy = RosterConstants.GROUP;\n\t\t\tbreak;\n\n\t\tcase GROUP_MEMBERS:\n\t\t\tqBuilder.setTables(TABLE_ROSTER + \" \" + QUERY_ALIAS);\n\t\t\tqBuilder.appendWhere(RosterConstants.GROUP + \"=\");\n\t\t\tqBuilder.appendWhere(url.getPathSegments().get(1));\n\t\t\tbreak;\n\n\t\tcase CONTACTS:\n\t\t\tqBuilder.setTables(TABLE_ROSTER + \" \" + QUERY_ALIAS);\n\t\t\tbreak;\n\n\t\tcase CONTACT_ID:\n\t\t\tqBuilder.setTables(TABLE_ROSTER + \" \" + QUERY_ALIAS);\n\t\t\tqBuilder.appendWhere(\"_id=\");\n\t\t\tqBuilder.appendWhere(url.getPathSegments().get(1));\n\t\t\tbreak;\n\t\t\t\n\t\tcase MUCS:\n\t\t\tqBuilder.setTables(TABLE_MUCS + \" \" + QUERY_ALIAS);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tthrow new IllegalArgumentException(\"Unknown URL \" + url);\n\t\t}\n\n\t\tString orderBy;\n\t\tif (TextUtils.isEmpty(sortOrder) && match == CONTACTS) {\n\t\t\torderBy = RosterConstants.DEFAULT_SORT_ORDER;\n\t\t} else {\n\t\t\torderBy = sortOrder;\n\t\t}\n\n\t\tSQLiteDatabase db = mOpenHelper.getReadableDatabase();\n\t\tCursor ret = qBuilder.query(db, projectionIn, selection, selectionArgs,\n\t\t\t\tgroupBy, null, orderBy);\n\n\t\tif (ret == null) {\n\t\t\tinfoLog(\"RosterProvider.query: failed\");\n\t\t} else {\n\t\t\tret.setNotificationUri(getContext().getContentResolver(), url);\n\t\t}\n\n\t\treturn ret;\n\t}\n\n\t@Override\n\tpublic int update(Uri url, ContentValues values, String where,\n\t\t\tString[] whereArgs) {\n\t\tint count;\n\t\tlong rowId = 0;\n\t\tint match = URI_MATCHER.match(url);\n\t\tSQLiteDatabase db = mOpenHelper.getWritableDatabase();\n\n\t\tswitch (match) {\n\t\tcase CONTACTS:\n\t\t\tcount = db.update(TABLE_ROSTER, values, where, whereArgs);\n\t\t\tbreak;\n\t\tcase CONTACT_ID:\n\t\t\tString segment = url.getPathSegments().get(1);\n\t\t\trowId = Long.parseLong(segment);\n\t\t\tcount = db.update(TABLE_ROSTER, values, \"_id=\" + rowId, whereArgs);\n\t\t\tbreak;\n\t\tcase MUCS:\n\t\t\tcount = db.update(TABLE_MUCS, values, where, whereArgs); \n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new UnsupportedOperationException(\"Cannot update URL: \" + url);\n\t\t}\n\n\t\tnotifyChange();\n\n\t\treturn count;\n\n\t}\n\n\t/* delay change notification, cancel previous attempts.\n\t * this implements rate throttling on fast update sequences\n\t */\n\tlong last_notify = 0;\n\tprivate void notifyChange() {\n\t\tmNotifyHandler.removeCallbacks(mNotifyChange);\n\t\tlong ts = System.currentTimeMillis();\n\t\tif (ts > last_notify + 500)\n\t\t\tmNotifyChange.run();\n\t\telse\n\t\t\tmNotifyHandler.postDelayed(mNotifyChange, 200);\n\t\tlast_notify = ts;\n\t}\n\n\tprivate static void infoLog(String data) {\n\t\tif (LogConstants.LOG_INFO) {\n\t\t\tLog.i(TAG, data);\n\t\t}\n\t}\n\n\tprivate static class RosterDatabaseHelper extends SQLiteOpenHelper {\n\n\t\tprivate static final String DATABASE_NAME = \"roster.db\";\n\t\tprivate static final int DATABASE_VERSION = 7;\n\n\t\tpublic RosterDatabaseHelper(Context context) {\n\t\t\tsuper(context, DATABASE_NAME, null, DATABASE_VERSION);\n\t\t}\n\n\t\tprivate void onCreateRoster(SQLiteDatabase db) {\n\t\t\tinfoLog(\"creating new roster table\");\n\n\t\t\tdb.execSQL(\"CREATE TABLE \" + TABLE_ROSTER + \" (\"\n\t\t\t\t\t+ RosterConstants._ID + \" INTEGER PRIMARY KEY AUTOINCREMENT, \"\n\t\t\t\t\t+ RosterConstants.JID + \" TEXT UNIQUE ON CONFLICT REPLACE, \"\n\t\t\t\t\t+ RosterConstants.ALIAS + \" TEXT, \" \n\t\t\t\t\t+ RosterConstants.STATUS_MODE + \" INTEGER, \"\n\t\t\t\t\t+ RosterConstants.STATUS_MESSAGE + \" TEXT, \"\n\t\t\t\t\t+ RosterConstants.GROUP + \" TEXT);\");\n\t\t\tdb.execSQL(\"CREATE INDEX idx_roster_group ON \" + TABLE_ROSTER\n\t\t\t\t        + \" (\" + RosterConstants.GROUP + \")\");\n\t\t\tdb.execSQL(\"CREATE INDEX idx_roster_alias ON \" + TABLE_ROSTER\n\t\t\t\t        + \" (\" + RosterConstants.ALIAS + \")\");\n\t\t\tdb.execSQL(\"CREATE INDEX idx_roster_status ON \" + TABLE_ROSTER\n\t\t\t\t        + \" (\" + RosterConstants.STATUS_MODE + \")\");\n\t\t}\n\n\t\t@Override\n\t\tpublic void onCreate(SQLiteDatabase db) {\n\t\t\tonCreateRoster(db);\n\t\t\tdb.execSQL(\"CREATE TABLE \" + TABLE_MUCS + \" (\"\n\t\t\t\t\t+ RosterConstants._ID + \" INTEGER PRIMARY KEY AUTOINCREMENT, \"\n\t\t\t\t\t+ RosterConstants.JID + \" TEXT UNIQUE ON CONFLICT REPLACE, \"\n\t\t\t\t\t+ RosterConstants.NICKNAME + \" TEXT, \"\n\t\t\t\t\t+ RosterConstants.PASSWORD + \" TEXT, \"\n\t\t\t\t\t+ RosterConstants.AUTOJOIN + \" INTEGER\"\n\t\t\t\t\t+ \");\");\n\t\t\t\n\t\t}\n\n\t\t@Override\n\t\tpublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {\n\t\t\tinfoLog(\"onUpgrade: from \" + oldVersion + \" to \" + newVersion);\n\t\t\tswitch (oldVersion) {\n\t\t\tcase 4:\n\t\t\tcase 5:\n\t\t\t\tdb.execSQL(\"CREATE TABLE \" + TABLE_MUCS + \" (\"\n\t\t\t\t\t\t+ RosterConstants._ID + \" INTEGER PRIMARY KEY AUTOINCREMENT, \"\n\t\t\t\t\t\t+ RosterConstants.JID + \" TEXT UNIQUE ON CONFLICT REPLACE, \"\n\t\t\t\t\t\t+ RosterConstants.NICKNAME + \" TEXT, \"\n\t\t\t\t\t\t+ RosterConstants.PASSWORD + \" TEXT\"\n\t\t\t\t\t\t+ \");\");\n\t\t\tcase 6:\n\t\t\t\tdb.execSQL(\"ALTER TABLE \" + TABLE_MUCS + \" ADD COLUMN \"\n\t\t\t\t\t\t+ RosterConstants.AUTOJOIN + \" INTEGER DEFAULT 1\");\n\t\t\tdefault:\n\t\t\t\tdb.execSQL(\"DROP TABLE IF EXISTS \" + TABLE_GROUPS);\n\t\t\t\tdb.execSQL(\"DROP TABLE IF EXISTS \" + TABLE_ROSTER);\n\t\t\t\tonCreateRoster(db);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic static final class RosterConstants implements BaseColumns {\n\n\t\tprivate RosterConstants() {\n\t\t}\n\n\t\tpublic static final String CONTENT_TYPE = \"vnd.android.cursor.dir/vnd.yaxim.roster\";\n\t\tpublic static final String CONTENT_ITEM_TYPE = \"vnd.android.cursor.item/vnd.yaxim.roster\";\n\t\tpublic static final String MUC_TYPE = \"TODO\";\n\n\t\tpublic static final String JID = \"jid\";\n\t\tpublic static final String ALIAS = \"alias\";\n\t\tpublic static final String STATUS_MODE = \"status_mode\";\n\t\tpublic static final String STATUS_MESSAGE = \"status_message\";\n\t\tpublic static final String GROUP = \"roster_group\";\n\t\tpublic static final String MUCS = \"\\uFFFF\"; // XXX: hack to end up at the end of the alphabetical list\n\t\t\n\t\tpublic static final String PASSWORD = \"password\";\n\t\tpublic static final String NICKNAME = \"nickname\";\n\t\tpublic static final String AUTOJOIN = \"autojoin\";\n\n\t\tpublic static final String DEFAULT_SORT_ORDER = STATUS_MODE + \" DESC, \" + ALIAS + \" COLLATE NOCASE\";\n\n\t\tpublic static ArrayList<String> getRequiredContactColumns() {\n\t\t\tArrayList<String> tmpList = new ArrayList<String>();\n\t\t\ttmpList.add(JID);\n\t\t\ttmpList.add(ALIAS);\n\t\t\ttmpList.add(STATUS_MODE);\n\t\t\ttmpList.add(STATUS_MESSAGE);\n\t\t\ttmpList.add(GROUP);\n\t\t\treturn tmpList;\n\t\t}\n\t\t\n\t\tpublic static ArrayList<String> getRequiredMUCColumns() {\n\t\t\tArrayList<String> tmpList = new ArrayList<String>();\n\t\t\ttmpList.add(JID);\n\t\t\ttmpList.add(NICKNAME);\n\t\t\ttmpList.add(PASSWORD);\n\t\t\treturn tmpList;\n\t\t}\n\n\t}\n\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/data/YaximConfiguration.java",
    "content": "package org.yaxim.androidclient.data;\n\nimport org.jxmpp.jid.BareJid;\nimport org.jxmpp.jid.impl.JidCreate;\nimport org.yaxim.androidclient.FlavorConfig;\nimport org.yaxim.androidclient.exceptions.YaximXMPPAdressMalformedException;\nimport org.yaxim.androidclient.util.PreferenceConstants;\nimport org.yaxim.androidclient.util.StatusMode;\nimport org.yaxim.androidclient.util.XMPPHelper;\n\nimport android.app.NotificationChannel;\nimport android.app.NotificationManager;\nimport android.content.Context;\nimport android.content.SharedPreferences;\nimport android.content.SharedPreferences.OnSharedPreferenceChangeListener;\nimport android.graphics.Color;\nimport android.net.Uri;\nimport android.os.Build;\nimport android.preference.PreferenceManager;\nimport android.text.TextUtils;\nimport android.util.Log;\n\nimport java.net.URLEncoder;\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.Iterator;\n\npublic class YaximConfiguration implements OnSharedPreferenceChangeListener {\n\n\tprivate static final String TAG = \"yaxim.Configuration\";\n\n\tprivate static final String GMAIL_SERVER = \"talk.google.com\";\n\n\tprivate static final long DEFAULT_INVITATION_TIME = 14*24*3600; // two weeks in seconds\n\n\tprivate static final HashSet<String> RECONNECT_PREFS = new HashSet<String>(Arrays.asList(\n\t\t\t\tPreferenceConstants.JID,\n\t\t\t\tPreferenceConstants.PASSWORD,\n\t\t\t\tPreferenceConstants.CUSTOM_SERVER,\n\t\t\t\tPreferenceConstants.PORT,\n\t\t\t\tPreferenceConstants.RESSOURCE,\n\t\t\t\tPreferenceConstants.FOREGROUND,\n\t\t\t\tPreferenceConstants.REQUIRE_SSL,\n\t\t\t\tPreferenceConstants.SMACKDEBUG\n\t\t\t));\n\tprivate static final HashSet<String> PRESENCE_PREFS = new HashSet<String>(Arrays.asList(\n\t\t\t\tPreferenceConstants.MESSAGE_CARBONS,\n\t\t\t\tPreferenceConstants.PRIORITY,\n\t\t\t\tPreferenceConstants.STATUS_DNDSILENT,\n\t\t\t\tPreferenceConstants.STATUS_MODE,\n\t\t\t\tPreferenceConstants.STATUS_MESSAGE\n\t\t\t));\n\n\tpublic String password;\n\tpublic String ressource;\n\tpublic int port;\n\tpublic int priority;\n\tpublic boolean foregroundService;\n\tpublic boolean autoConnect;\n\tpublic boolean messageCarbons;\n\tpublic boolean reportCrash;\n\tpublic String userName;\n\tpublic String server;\n\tpublic String customServer;\n\tpublic String jabberID;\n\tpublic BareJid jid;\n\tpublic String screenName;\n\tpublic String initialPreAuth;\n\tpublic boolean jid_configured;\n\tpublic boolean require_ssl;\n\n\tpublic String statusMode;\n\tpublic boolean statusDndSilent;\n\tpublic StatusMode smartAwayMode;\n\tpublic String statusMessage;\n\tpublic String[] statusMessageHistory;\n\n\tpublic String mucDomain = null; // used in AutoCompleteJidEdit, null fallbacks to first static entry\n\tpublic boolean mamSupported = false;\n\n\tpublic String pushNodeId;\n\n\tpublic boolean smackdebug;\n    public String theme;\n    public String chatFontSize;\n    public boolean showOffline;\n\tpublic boolean enableGroups;\n\n\tpublic boolean reconnect_required = false;\n\tpublic boolean rosterreset_required = false;\n\tpublic boolean presence_required = false;\n\tpublic boolean nickchange_required = false;\n\n\t/// this stores tuples of (JID, valid_until) or (token, valid_until) for PARS\n\tprivate HashMap<String, Long> invitationCodes = new HashMap<String, Long>();\n\n\tprivate final Context ctx;\n\tprivate final SharedPreferences prefs;\n\n\tpublic YaximConfiguration(Context _ctx) {\n\t\tctx = _ctx;\n\t\tprefs = PreferenceManager.getDefaultSharedPreferences(_ctx);\n\t\tprefs.registerOnSharedPreferenceChangeListener(this);\n\t\tloadPrefs(prefs);\n\t}\n\n\t@Override\n\tprotected void finalize() {\n\t\tprefs.unregisterOnSharedPreferenceChangeListener(this);\n\t}\n\n\tpublic void onSharedPreferenceChanged(SharedPreferences prefs, String key) {\n\t\tLog.i(TAG, \"onSharedPreferenceChanged(): \" + key);\n\t\tloadPrefs(prefs);\n\t\tif (PreferenceConstants.JID.equals(key)) {\n\t\t\trosterreset_required = true;\n\t\t\tprefs.edit().remove(PreferenceConstants.DOZE_NAG).commit();\n\t\t}\n\t\tif (RECONNECT_PREFS.contains(key))\n\t\t\treconnect_required = true;\n\t\tif (PRESENCE_PREFS.contains(key))\n\t\t\tpresence_required = true;\n\t\tif (PreferenceConstants.SCREEN_NAME.equals(key))\n\t\t\tnickchange_required = true;\n\t}\n\n\tprivate void splitAndSetJabberID(String jid) {\n\t\tString[] res = jid.split(\"@\");\n\t\tthis.userName = res[0];\n\t\tthis.server = res[1];\n\t\tthis.jid = JidCreate.bareFromOrNull(jid);\n\t\t// check for gmail.com and other google hosted jabber accounts\n\t\tif (\"gmail.com\".equals(res[1]) || \"googlemail.com\".equals(res[1])\n\t\t\t\t|| GMAIL_SERVER.equals(this.customServer)) {\n\t\t\t// work around for gmail's incompatible jabber implementation:\n\t\t\t// send the whole JID as the login, connect to talk.google.com\n\t\t\tthis.userName = jid;\n\t\t\tif (this.customServer.length() == 0)\n\t\t\t\tthis.customServer = GMAIL_SERVER;\n\t\t}\n\t}\n\n\tprivate int validatePriority(int jabPriority) {\n\t\tif (jabPriority > 127)\n\t\t\treturn 127;\n\t\telse if (jabPriority < -127)\n\t\t\treturn -127;\n\t\treturn jabPriority;\n\t}\n\n\tprivate void loadPrefs(SharedPreferences prefs) {\n\t\tthis.jid_configured = false;\n\n\t\tthis.password = prefs.getString(PreferenceConstants.PASSWORD, \"\");\n\t\tthis.ressource = prefs\n\t\t\t\t.getString(PreferenceConstants.RESSOURCE, \"yaxim\");\n\t\tthis.port = XMPPHelper.tryToParseInt(prefs.getString(\n\t\t\t\tPreferenceConstants.PORT, \"\"),\n\t\t\t\t-1);\n\n\t\tthis.priority = validatePriority(XMPPHelper.tryToParseInt(prefs\n\t\t\t\t.getString(PreferenceConstants.PRIORITY, \"0\"), 0));\n\n\t\tthis.foregroundService = prefs.getBoolean(PreferenceConstants.FOREGROUND, true);\n\t\t// force foreground notification on Android 8+\n\t\tif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)\n\t\t\tthis.foregroundService = true;\n\n\t\tthis.autoConnect = prefs.getBoolean(PreferenceConstants.CONN_STARTUP,\n\t\t\t\tfalse);\n\t\tthis.messageCarbons = prefs.getBoolean(\n\t\t\t\tPreferenceConstants.MESSAGE_CARBONS, true);\n\n\t\tthis.smackdebug = prefs.getBoolean(PreferenceConstants.SMACKDEBUG,\n\t\t\t\tfalse);\n\t\tthis.reportCrash = prefs.getBoolean(PreferenceConstants.REPORT_CRASH,\n\t\t\t\tfalse);\n\t\tthis.jabberID = prefs.getString(PreferenceConstants.JID, \"\");\n\t\tthis.customServer = prefs.getString(PreferenceConstants.CUSTOM_SERVER,\n\t\t\t\t\"\");\n\t\tthis.initialPreAuth = prefs.getString(PreferenceConstants.INITIAL_PREAUTH,\n\t\t\t\tnull);\n\t\tthis.require_ssl = prefs.getBoolean(PreferenceConstants.REQUIRE_SSL,\n\t\t\t\tfalse);\n\t\tthis.statusMode = prefs.getString(PreferenceConstants.STATUS_MODE, \"available\");\n\t\tthis.statusDndSilent = prefs.getBoolean(PreferenceConstants.STATUS_DNDSILENT, true);\n\t\tthis.statusMessage = prefs.getString(PreferenceConstants.STATUS_MESSAGE, \"\");\n\t\tthis.statusMessageHistory = prefs.getString(PreferenceConstants.STATUS_MESSAGE_HISTORY, statusMessage).split(\"\\036\");\n\t\tthis.pushNodeId = prefs.getString(PreferenceConstants.PUSH_NODE_ID, null);\n\t\tthis.theme = prefs.getString(PreferenceConstants.THEME, \"dark\");\n\t\tthis.chatFontSize = prefs.getString(\"setSizeChat\", \"18\");\n\t\tthis.showOffline = prefs.getBoolean(PreferenceConstants.SHOW_OFFLINE, false);\n\t\tthis.enableGroups = prefs.getBoolean(PreferenceConstants.ENABLE_GROUPS, true);\n\n\t\tthis.invitationCodes.clear();\n\t\tLog.d(TAG, \"invitation_codes = \" + prefs.getString(PreferenceConstants.INVITATION_CODES, \"\"));\n\t\ttry {\n\t\t\tfor (String record : prefs.getString(PreferenceConstants.INVITATION_CODES, \"\").split(\"\\036\")) {\n\t\t\t\tif (record.length() >= 3) {\n\t\t\t\t\t// records are JID or token plus timestamp, separated by Unit Separator\n\t\t\t\t\tString[] r = record.split(\"\\037\");\n\t\t\t\t\tlong valid = Long.parseLong(r[1]);\n\t\t\t\t\tinvitationCodes.put(r[0], valid);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (Exception e) {\n\t\t\tLog.e(TAG, \"Exception parsing tokens: \" + e);\n\t\t}\n\n\n\t\ttry {\n\t\t\tsplitAndSetJabberID(XMPPHelper.verifyJabberID(jabberID));\n\t\t\t// fix up custom server / port if only one of them is set\n\t\t\tif (customServer.length() > 0 && port == -1)\n\t\t\t\tport = PreferenceConstants.DEFAULT_PORT_INT;\n\t\t\telse if (customServer.length() == 0 && port != -1)\n\t\t\t\tcustomServer = server;\n\t\t\tthis.jid_configured = true;\n\t\t\tthis.screenName = prefs.getString(PreferenceConstants.SCREEN_NAME, XMPPHelper.capitalizeString(this.userName));\n\t\t} catch (YaximXMPPAdressMalformedException e) {\n\t\t\tLog.e(TAG, \"Exception in getPreferences(): \" + e);\n\t\t}\n\t}\n\n\tpublic boolean getJidOverride(boolean muc, String jid) {\n\t\treturn getJidPrefs(jid).getBoolean(\"override\", false);\n\t}\n\tpublic String getEffectiveNotificationChannelId(boolean muc, String jid) {\n\t\tif (TextUtils.isEmpty(jid) || !getJidOverride(muc, jid)) {\n\t\t\treturn muc ? \"msg_muc\" : \"msg\";\n\t\t} else return \"msg_\" + jid;\n\t}\n\tpublic NotificationChannel createNotificationChannelFor(boolean muc, String jid, String name) {\n\t\tif (Build.VERSION.SDK_INT < Build.VERSION_CODES.O)\n\t\t\treturn null;\n\t\tNotificationChannel nc_msg = new NotificationChannel(\n\t\t\t\tgetEffectiveNotificationChannelId(muc, jid),\n\t\t\t\tname, NotificationManager.IMPORTANCE_DEFAULT);\n\t\t// LED\n\t\tboolean blink = getJidBoolean(muc, PreferenceConstants.LEDNOTIFY, jid, false);\n\t\tnc_msg.enableLights(blink);\n\t\tnc_msg.setLightColor(Color.MAGENTA);\n\t\t// vibration\n\t\tString vibration = getJidString(muc, PreferenceConstants.VIBRATIONNOTIFY, jid, \"OFF\");\n\t\tnc_msg.enableVibration(!\"OFF\".equals(vibration));\n\t\t//nc_msg.setVibrationPattern();\n\t\t// ringtone\n\t\tUri sound = Uri.parse(getJidString(muc, PreferenceConstants.RINGTONENOTIFY, jid, \"\"));\n\t\tnc_msg.setSound(sound, null);\n\t\tnc_msg.setShowBadge(true);\n\t\treturn nc_msg;\n\t}\n\n\tpublic SharedPreferences getJidPrefs(String jid) {\n\t\treturn ctx.getSharedPreferences(\"notification_\" + URLEncoder.encode(jid), Context.MODE_PRIVATE);\n\t}\n\tpublic String getJidString(boolean muc, String pref, String jid, String defValue) {\n\t\tif (jid != null) {\n\t\t\t/* try to obtain JID-specific value */\n\t\t\tSharedPreferences jidPrefs = getJidPrefs(jid);\n\t\t\tif (jidPrefs.getBoolean(\"override\", false))\n\t\t\t\treturn jidPrefs.getString(pref, defValue);\n\t\t}\n\t\t/* fall back to generic value */\n\t\tSharedPreferences default_prefs = muc ? getJidPrefs(\"muc\") : prefs;\n\t\treturn default_prefs.getString(pref, defValue);\n\t}\n\tpublic boolean getJidBoolean(boolean muc, String pref, String jid, boolean defValue) {\n\t\tif (jid != null) {\n\t\t\t/* try to obtain JID-specific value */\n\t\t\tSharedPreferences jidPrefs = getJidPrefs(jid);\n\t\t\tif (jidPrefs.getBoolean(\"override\", false))\n\t\t\t\treturn jidPrefs.getBoolean(pref, defValue);\n\t\t}\n\t\t/* fall back to generic value */\n\t\tSharedPreferences default_prefs = muc ? getJidPrefs(\"muc\") : prefs;\n\t\treturn default_prefs.getBoolean(pref, defValue);\n\t}\n\n\tpublic boolean needMucNotification(String jid, String nick, String message) {\n\t\t// highlight==false --> notify on all messages\n\t\tif (getJidBoolean(true, PreferenceConstants.HIGHLIGHT, jid, true) == false)\n\t\t\treturn true;\n\t\treturn message.toLowerCase().contains(nick.toLowerCase());\n\t}\n\n\tpublic int getTheme() {\n\t\treturn FlavorConfig.getTheme(theme);\n\t}\n\n\tpublic synchronized void generateNewResource() {\n\t\tprefs.edit().putString(PreferenceConstants.RESSOURCE, XMPPHelper.createResource(ctx)).commit();\n\t}\n\tpublic synchronized boolean storeScreennameIfChanged(String name) {\n\t\tif (TextUtils.isEmpty(name))\n\t\t\tname = XMPPHelper.capitalizeString(this.userName);\n\t\tif (!name.equals(screenName)) {\n\t\t\tscreenName = name;\n\t\t\tprefs.edit().putString(PreferenceConstants.SCREEN_NAME, screenName).commit();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\tpublic synchronized void storeInstallReferrer(String referrer) {\n\t\tprefs.edit().putString(PreferenceConstants.INSTALL_REFERRER, referrer).commit();\n\n\t}\n\tprivate synchronized void storeInvitationCodes() {\n\t\tIterator<String> it = invitationCodes.keySet().iterator();\n\t\t// remove all expired codes\n\t\tlong ts = System.currentTimeMillis()/1000;\n\t\twhile (it.hasNext()) {\n\t\t\tLong valid = invitationCodes.get(it.next());\n\t\t\tif (valid < ts)\n\t\t\t\tit.remove();\n\t\t}\n\t\tString[] records = new String[invitationCodes.size()];\n\t\tint i = 0;\n\t\tit = invitationCodes.keySet().iterator();\n\t\t// create string records with code|timestamp\n\t\twhile (it.hasNext()) {\n\t\t\tString code = it.next();\n\t\t\trecords[i++] = code + \"\\037\" + invitationCodes.get(code);\n\t\t}\n\t\t// concatenate all records to one string\n\t\tString ic_joined = android.text.TextUtils.join(\"\\036\", records);\n\t\tLog.d(TAG, \"invitation_codes = \" + ic_joined);\n\t\tprefs.edit().putString(PreferenceConstants.INVITATION_CODES, ic_joined).commit();\n\t}\n\n\tpublic boolean redeemInvitationCode(String code_or_jid) {\n\t\tif (invitationCodes.containsKey(code_or_jid) &&\n\t\t\t(invitationCodes.get(code_or_jid) > System.currentTimeMillis()/1000)) {\n\t\t\tinvitationCodes.remove(code_or_jid);\n\t\t\tstoreInvitationCodes();\n\t\t\treturn true;\n\t\t} else return false;\n\t}\n\t\n\tpublic String createInvitationCode(long validity) {\n\t\t// create an 80-bit random code, encode as BASE-36\n\t\tString code = new java.math.BigInteger(80, new java.security.SecureRandom()).toString(36);\n\t\tinvitationCodes.put(code, System.currentTimeMillis()/1000 + validity);\n\t\tLog.d(TAG, \"createInvitationCode: \" + code + \" for \" + validity + \"s\");\n\t\tstoreInvitationCodes();\n\t\treturn code;\n\t}\n\tpublic String createInvitationCode() {\n\t\treturn createInvitationCode(DEFAULT_INVITATION_TIME);\n\t}\n\t\n\tpublic void whitelistInvitationJID(String jid) {\n\t\tinvitationCodes.put(jid, System.currentTimeMillis()/1000 + DEFAULT_INVITATION_TIME);\n\t\tstoreInvitationCodes();\n\t}\n\n\tpublic StatusMode getPresenceMode() {\n\t\tStatusMode sm = StatusMode.fromString(statusMode);\n\t\tif (!statusDndSilent || smartAwayMode == null)\n\t\t\treturn sm;\n\t\treturn (smartAwayMode.compareTo(sm) < 0) ? smartAwayMode : sm;\n\t}\n\n\tpublic String getPushNodeId() {\n\t\tif (pushNodeId == null) {\n\t\t\tpushNodeId = XMPPHelper.securePassword();\n\t\t\tprefs.edit().putString(PreferenceConstants.PUSH_NODE_ID, pushNodeId).commit();\n\t\t}\n\t\treturn pushNodeId;\n\t}\n\n\t/** return the hostname / service domain used for connection purposes */\n\tpublic String getServerHost() {\n\t\tif (TextUtils.isEmpty(customServer))\n\t\t\treturn server;\n\t\telse return customServer;\n\t}\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/dialogs/AddRosterItemDialog.java",
    "content": "package org.yaxim.androidclient.dialogs;\r\n\r\nimport org.yaxim.androidclient.XMPPRosterServiceAdapter;\r\nimport org.yaxim.androidclient.data.ChatHelper;\r\nimport org.yaxim.androidclient.exceptions.YaximXMPPAdressMalformedException;\r\nimport org.yaxim.androidclient.util.XMPPHelper;\r\nimport org.yaxim.androidclient.widget.AutoCompleteJidEdit;\r\nimport org.yaxim.androidclient.YaximApplication;\r\n\r\nimport android.app.Activity;\r\nimport android.support.v7.app.AlertDialog;\r\nimport android.content.Context;\r\nimport android.content.DialogInterface;\r\nimport android.os.Bundle;\r\nimport android.text.Editable;\r\nimport android.text.TextWatcher;\r\nimport android.view.LayoutInflater;\r\nimport android.view.View;\r\nimport android.widget.Button;\r\nimport android.widget.EditText;\r\nimport org.yaxim.androidclient.R;\r\n\r\npublic class AddRosterItemDialog extends AlertDialog implements\r\n\t\tDialogInterface.OnClickListener, TextWatcher {\r\n\r\n\tprivate Activity mActivity;\r\n\r\n\tprivate Button okButton;\r\n\tprivate AutoCompleteJidEdit userInputField;\r\n\tprivate EditText aliasInputField;\r\n\tprivate String generatedAlias = \"\";\r\n\tprivate String mToken = null;\r\n\tprivate GroupNameView mGroupNameView;\r\n\r\n\tpublic AddRosterItemDialog(Activity act) {\r\n\t\tsuper(act);\r\n\t\tmActivity = act;\r\n\r\n\t\tsetTitle(R.string.addFriend_Title);\r\n\r\n\t\tLayoutInflater inflater = (LayoutInflater) act\r\n\t\t\t\t.getSystemService(Context.LAYOUT_INFLATER_SERVICE);\r\n\t\tView group = inflater.inflate(R.layout.addrosteritemdialog, null, false);\r\n\t\tsetView(group);\r\n\r\n\t\tuserInputField = (AutoCompleteJidEdit)group.findViewById(R.id.AddContact_EditTextField);\r\n\t\tuserInputField.setServerList(YaximApplication.getConfig().server,\r\n\t\t\t\tChatHelper.getXMPPDomains(act, ChatHelper.ROSTER_FILTER_CONTACTS), R.array.xmpp_servers);\r\n\t\taliasInputField = (EditText)group.findViewById(R.id.AddContactAlias_EditTextField);\r\n\r\n\t\tmGroupNameView = (GroupNameView)group.findViewById(R.id.AddRosterItem_GroupName);\r\n\t\tmGroupNameView.setGroupList(ChatHelper.getRosterGroups(mActivity));\r\n\r\n\t\tsetButton(BUTTON_POSITIVE, act.getString(android.R.string.ok), this);\r\n\t\tsetButton(BUTTON_NEGATIVE, act.getString(android.R.string.cancel),\r\n\t\t\t\t(DialogInterface.OnClickListener)null);\r\n\r\n\t}\r\n\tpublic AddRosterItemDialog(Activity act, String jid) {\r\n\t\tthis(act);\r\n\t\tuserInputField.setText(jid);\r\n\t}\r\n\r\n\tpublic void onCreate(Bundle icicle) {\r\n\t\tsuper.onCreate(icicle);\r\n\r\n\t\tokButton = getButton(BUTTON_POSITIVE);\r\n\t\tafterTextChanged(userInputField.getText());\r\n\r\n\t\tif (aliasInputField.getText().length() == 0)\r\n\t\t\taliasInputField.setText(generatedAlias);\r\n\t\tuserInputField.addTextChangedListener(this);\r\n\t}\r\n\r\n\tpublic AddRosterItemDialog setAlias(String alias) {\r\n\t\tif (alias != null && alias.length() > 0)\r\n\t\t\taliasInputField.setText(alias);\r\n\t\treturn this;\r\n\t}\r\n\tpublic AddRosterItemDialog setToken(String token) {\r\n\t\tif (token != null && token.length() > 0)\r\n\t\t\tmToken = token;\r\n\t\treturn this;\r\n\t}\r\n\r\n\tpublic void onClick(DialogInterface dialog, int which) {\r\n\t\tString alias = aliasInputField.getText().toString();\r\n\t\tif (alias.length() == 0)\r\n\t\t\talias = generatedAlias;\r\n\t\tString realJid;\r\n\t\ttry {\r\n\t\t\trealJid = XMPPHelper.verifyJabberID(userInputField.getText());\r\n\t\t} catch (YaximXMPPAdressMalformedException e) {\r\n\t\t\te.printStackTrace();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\ttry {\r\n\t\t\tYaximApplication.getApp().getSmackable().addRosterItem(\r\n\t\t\t\t\trealJid,\r\n\t\t\t\t\talias,\r\n\t\t\t\t\tmGroupNameView.getGroupName(),\r\n\t\t\t\t\tmToken);\r\n\t\t} catch (Exception e) {\r\n\t\t\tChatHelper.shortToastNotify(mActivity, e);\r\n\t\t\tnew AddRosterItemDialog(mActivity, userInputField.getText().toString())\r\n\t\t\t\t\t.setAlias(aliasInputField.getText().toString())\r\n\t\t\t\t\t.setToken(mToken)\r\n\t\t\t\t\t.show();\r\n\t\t}\r\n\t}\r\n\r\n\tpublic void afterTextChanged(Editable s) {\r\n\t\ttry {\r\n\t\t\tXMPPHelper.verifyJabberID(s);\r\n\t\t\tokButton.setEnabled(true);\r\n\t\t\tuserInputField.setError(null);\r\n\t\t} catch (YaximXMPPAdressMalformedException e) {\r\n\t\t\tokButton.setEnabled(false);\r\n\t\t\tif (s.length() > 0)\r\n\t\t\t\tuserInputField.setError(mActivity.getString(R.string.Global_JID_malformed));\r\n\t\t}\r\n\t\tif (s.length() > 0) {\r\n\t\t\tString userpart[] = s.toString().split(\"@\");\r\n\t\t\tif (userpart.length > 0 && userpart[0].length() > 0) {\r\n\t\t\t\tgeneratedAlias = XMPPHelper.capitalizeString(userpart[0]);\r\n\t\t\t\taliasInputField.setHint(generatedAlias);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tpublic void beforeTextChanged(CharSequence s, int start, int count,\r\n\t\t\tint after) {}\r\n\tpublic void onTextChanged(CharSequence s, int start, int before, int count) {}\r\n}\r\n"
  },
  {
    "path": "src/org/yaxim/androidclient/dialogs/ChangePasswordDialog.java",
    "content": "package org.yaxim.androidclient.dialogs;\r\n\r\nimport org.yaxim.androidclient.XMPPRosterServiceAdapter;\r\nimport org.yaxim.androidclient.service.IXMPPRosterService;\r\nimport org.yaxim.androidclient.service.XMPPService;\r\nimport org.yaxim.androidclient.util.ConnectionState;\r\nimport org.yaxim.androidclient.util.PreferenceConstants;\r\n\r\nimport android.annotation.TargetApi;\r\nimport android.support.v7.app.AlertDialog;\r\nimport android.app.ProgressDialog;\r\nimport android.content.ComponentName;\r\nimport android.content.Context;\r\nimport android.content.DialogInterface;\r\nimport android.content.Intent;\r\nimport android.content.ServiceConnection;\r\nimport android.os.AsyncTask;\r\nimport android.os.Build;\r\nimport android.os.Bundle;\r\nimport android.os.IBinder;\r\nimport android.preference.PreferenceManager;\r\nimport android.text.Editable;\r\nimport android.text.TextWatcher;\r\nimport android.util.Log;\r\nimport android.view.LayoutInflater;\r\nimport android.view.View;\r\nimport android.widget.Button;\r\nimport android.widget.CheckBox;\r\nimport android.widget.CompoundButton;\r\nimport android.widget.EditText;\r\nimport android.widget.TextView;\r\n\r\nimport org.yaxim.androidclient.R;\r\n\r\npublic class ChangePasswordDialog extends AlertDialog implements\r\n\t\tDialogInterface.OnClickListener, TextWatcher {\r\n\r\n\tprivate Context mContext;\r\n\tprivate ServiceConnection mXmppServiceConnection;\r\n\tprivate XMPPRosterServiceAdapter mServiceAdapter;\r\n\r\n\tprivate CheckBox mChangeOnServer;\r\n\tprivate EditText mOldPassword;\r\n\tprivate EditText mEditPassword;\r\n\tprivate CheckBox mShowPassword;\r\n\tprivate View mPasswordWarning;\r\n\tprivate Button mOkButton;\r\n\t\r\n\tprivate ProgressDialog mProgressDialog;\r\n\r\n\tpublic ChangePasswordDialog(Context context) {\r\n\t\tsuper(context);\r\n\t\tmContext = context;\r\n\r\n\t\tsetTitle(R.string.account_jabberPW_title);\r\n\r\n\t\tLayoutInflater inflater = (LayoutInflater) context\r\n\t\t\t\t.getSystemService(Context.LAYOUT_INFLATER_SERVICE);\r\n\t\tView group = inflater.inflate(R.layout.password_view, null, false);\r\n\t\tsetView(group);\r\n\r\n\t\tmChangeOnServer = (CheckBox) group.findViewById(R.id.password_change_on_server);\r\n\t\tmChangeOnServer.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {\r\n\t\t\t\t@Override\r\n\t\t\t\tpublic void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {\r\n\t\t\t\t\tupdateDialog();\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\tmOldPassword = (EditText) group.findViewById(R.id.password_old);\r\n\t\tmEditPassword = (EditText) group.findViewById(R.id.password_new);\r\n\t\tmShowPassword = (CheckBox) group.findViewById(R.id.password_show);\r\n\t\tmShowPassword.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {\r\n\t\t\t\t@Override\r\n\t\t\t\tpublic void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {\r\n\t\t\t\t\tmEditPassword.setTransformationMethod(isChecked ? null :\r\n\t\t\t\t\t\t\tnew android.text.method.PasswordTransformationMethod());\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\tmPasswordWarning = group.findViewById(R.id.password_warning);\r\n\r\n\t\tsetButton(BUTTON_POSITIVE, context.getString(android.R.string.ok), this);\r\n\t\tsetButton(BUTTON_NEGATIVE, context.getString(android.R.string.cancel),\r\n\t\t\t\t(DialogInterface.OnClickListener)null);\r\n\r\n\t}\r\n\r\n\tpublic void onCreate(Bundle icicle) {\r\n\t\tsuper.onCreate(icicle);\r\n\r\n\t\tmOkButton = getButton(BUTTON_POSITIVE);\r\n\r\n\t\tmOldPassword.addTextChangedListener(this);\r\n\t\tmEditPassword.addTextChangedListener(this);\r\n\r\n\t\tmChangeOnServer.setEnabled(false);\r\n\t\tmOkButton.setEnabled(false);\r\n\t\t\r\n\t\tIntent serviceIntent = new Intent(mContext, XMPPService.class);\r\n\t\tserviceIntent.setAction(\"org.yaxim.androidclient.XMPPSERVICE\");\r\n\r\n\t\tmXmppServiceConnection = new ServiceConnection() {\r\n\r\n\t\t\tpublic void onServiceConnected(ComponentName name, IBinder service) {\r\n\t\t\t\tmServiceAdapter = new XMPPRosterServiceAdapter(\r\n\t\t\t\t\t\tIXMPPRosterService.Stub.asInterface(service));\r\n\t\t\t\t//if (mServiceAdapter.getConnectionState() == ConnectionState.ONLINE)\r\n\t\t\t\t\tmChangeOnServer.setChecked(true);\r\n\t\t\t\tupdateDialog();\r\n\t\t\t}\r\n\r\n\t\t\tpublic void onServiceDisconnected(ComponentName name) {\r\n\t\t\t}\r\n\t\t};\r\n\t\tmContext.bindService(serviceIntent, mXmppServiceConnection, 0);\r\n\t}\r\n\r\n\t@Override\r\n\tpublic void dismiss() {\r\n\t\tmContext.unbindService(mXmppServiceConnection);\r\n\t\tsuper.dismiss();\r\n\t}\r\n\r\n\tpublic void onClick(DialogInterface dialog, int which) {\r\n\t\tString password = mEditPassword.getText().toString();\r\n\t\tif (mChangeOnServer.isChecked()) {\r\n\t\t\tmProgressDialog = ProgressDialog.show(mContext,\r\n\t\t\t\t\tmContext.getString(R.string.account_jabberPW_title),\r\n\t\t\t\t\tmContext.getString(R.string.account_jabberPW_progress), true);\r\n\t\t\tnew PasswordChangeTask().execute(password);\r\n\t\t} else\r\n\t\t\tupdateLocalPassword(password);\r\n\t}\r\n\r\n\tprivate void updateDialog() {\r\n\t\tboolean is_logged_in = (mServiceAdapter != null && mServiceAdapter.getConnectionState() == ConnectionState.ONLINE);\r\n\r\n\t\t// set checkbox / warning\r\n\t\tmChangeOnServer.setEnabled(true);\r\n\t\tif (!is_logged_in)\r\n\t\t\tmChangeOnServer.setChecked(false);\r\n\t\tmChangeOnServer.setEnabled(is_logged_in);\r\n\r\n\t\tmPasswordWarning.setVisibility(mChangeOnServer.isChecked() ? View.GONE : View.VISIBLE);\r\n\r\n\t\tboolean is_ok = (mEditPassword.length() >= 6);\r\n\t\t// TODO: check old password length and match\r\n\t\tmEditPassword.setError((is_ok || mEditPassword.length() == 0) ?\r\n\t\t\t\tnull : mContext.getString(R.string.StartupDialog_error_password));\r\n\r\n\t\tmOkButton.setEnabled(is_ok);\r\n\t}\r\n\r\n\tpublic void afterTextChanged(Editable s) {\r\n\t\tupdateDialog();\r\n\t}\r\n\r\n\tpublic void beforeTextChanged(CharSequence s, int start, int count,\r\n\t\t\tint after) {}\r\n\tpublic void onTextChanged(CharSequence s, int start, int before, int count) {}\r\n\r\n\tprivate void updateLocalPassword(String password) {\r\n\t\tPreferenceManager.getDefaultSharedPreferences(mContext).edit()\r\n\t\t\t\t.putString(PreferenceConstants.PASSWORD, password).commit();\r\n\t\t//YaximApplication.getConfig(mMainWindow).reconnect_required = false;\r\n\r\n\t}\r\n\r\n\tprivate class PasswordChangeTask extends AsyncTask<String, Void, String> {\r\n\t\tString mPassword;\r\n\t\t\r\n\t\t@Override\r\n\t\tprotected String doInBackground(String... params) {\r\n\t\t\tmPassword = params[0];\r\n\t\t\t// blocking method on the server\r\n\t\t\treturn mServiceAdapter.changePassword(mPassword);\r\n\t\t}\r\n\r\n\t\t@Override\r\n\t\tprotected void onPostExecute(String result) {\r\n\t\t\tmProgressDialog.dismiss();\r\n\t\t\tint icon_id = android.R.drawable.ic_dialog_alert;\r\n\t\t\tif (\"OK\".equals(result)) {\r\n\t\t\t\tupdateLocalPassword(mPassword);\r\n\t\t\t\tresult = mContext.getString(R.string.account_jabberPW_finished);\r\n\t\t\t\ticon_id = android.R.drawable.ic_dialog_info;\r\n\t\t\t} else {\r\n\t\t\t\tresult = mContext.getString(R.string.account_jabberPW_error, result);\r\n\t\t\t}\r\n\t\t\tnew AlertDialog.Builder(mContext)\r\n\t\t\t\t.setTitle(R.string.account_jabberPW_title)\r\n\t\t\t\t.setIcon(icon_id)\r\n\t\t\t\t.setMessage(result)\r\n\t\t\t\t.setPositiveButton(mContext.getString(android.R.string.ok), null)\r\n\t\t\t\t.create().show();\r\n\t\t}\r\n\t\t\r\n\t}\r\n}\r\n"
  },
  {
    "path": "src/org/yaxim/androidclient/dialogs/ChangeStatusDialog.java",
    "content": "package org.yaxim.androidclient.dialogs;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.Collections;\nimport java.util.Comparator;\nimport java.util.List;\n\nimport org.yaxim.androidclient.MainWindow;\nimport org.yaxim.androidclient.YaximApplication;\nimport org.yaxim.androidclient.R;\nimport org.yaxim.androidclient.data.YaximConfiguration;\nimport org.yaxim.androidclient.util.PreferenceConstants;\nimport org.yaxim.androidclient.util.StatusMode;\n\nimport android.support.v7.app.AlertDialog;\nimport android.content.Context;\nimport android.content.DialogInterface;\nimport android.content.SharedPreferences;\nimport android.preference.PreferenceManager;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ArrayAdapter;\nimport android.widget.Button;\nimport android.widget.CheckBox;\nimport android.widget.EditText;\nimport android.widget.ImageView;\nimport android.widget.Spinner;\nimport android.widget.TextView;\nimport android.widget.AutoCompleteTextView;\n\npublic class ChangeStatusDialog extends AlertDialog {\n\n\tprivate final CheckBox mDndSilent;\n\n\tprivate final Spinner mStatus;\n\n\tprivate final AutoCompleteTextView mMessage;\n\n\tprivate final MainWindow mContext;\n\n\tprivate final YaximConfiguration mConfig;\n\n\tpublic ChangeStatusDialog(final MainWindow context, final YaximConfiguration config) {\n\t\tsuper(context);\n\n\t\tmContext = context;\n\t\tmConfig = config;\n\n\t\tLayoutInflater inflater = (LayoutInflater) context\n\t\t\t\t.getSystemService(Context.LAYOUT_INFLATER_SERVICE);\n\n\t\tView group = inflater.inflate(R.layout.statusview, null, false);\n\n\t\tfinal List<StatusMode> modes = new ArrayList<StatusMode>(\n\t\t\t\tArrays.asList(StatusMode.values()));\n\t\t// the user can not set statusmode \"subscribe\", it is only for incoming presences\n\t\tmodes.remove(StatusMode.unknown);\n\t\tmodes.remove(StatusMode.subscribe);\n\n\t\tCollections.sort(modes, new Comparator<StatusMode>() {\n\t\t\tpublic int compare(StatusMode object1, StatusMode object2) {\n\t\t\t\treturn object2.compareTo(object1);\n\t\t\t}\n\t\t});\n\n\t\tmDndSilent = (CheckBox) group.findViewById(R.id.statusview_dnd_when_silent);\n\t\tmDndSilent.setOnClickListener(new View.OnClickListener() {\n\t\t\tpublic void onClick(View view) {\n\t\t\t\tmStatus.setEnabled(true);\n\t\t\t\tsetSpinnerSelection(modes, StatusMode.fromString(mConfig.statusMode));\n\t\t\t\tmDndSilent.setVisibility(View.GONE);\n\t\t\t}\n\t\t});\n\t\tmStatus = (Spinner) group.findViewById(R.id.statusview_spinner);\n\t\tStatusModeAdapter mStatusAdapter;\n\t\tmStatusAdapter = new StatusModeAdapter(context, R.layout.status_spinner_item, modes);\n\t\tmStatus.setAdapter(mStatusAdapter);\n\n\t\tsetSpinnerSelection(modes, mConfig.getPresenceMode());\n\n\t\tif (mConfig.smartAwayMode != null) {\n\t\t\tmStatus.setEnabled(false);\n\t\t\tmDndSilent.setVisibility(View.VISIBLE);\n\t\t\tmDndSilent.setChecked(true);\n\t\t}\n\n\t\tmMessage = (AutoCompleteTextView) group.findViewById(R.id.statusview_message);\n\t\tmMessage.setText(mConfig.statusMessage);\n\t\tmMessage.setAdapter(new ArrayAdapter<String>(context,\n\t\t\t\t\tandroid.R.layout.simple_dropdown_item_1line, mConfig.statusMessageHistory));\n\t\tmMessage.setThreshold(1);\n\n\t\tButton messageClearButton = (Button) group.findViewById(R.id.statusview_message_button_clear);\n\t\tmessageClearButton.setOnClickListener(new View.OnClickListener() {\n\t\t\tpublic void onClick(View view) {\n\t\t\t\tmMessage.setText(\"\");\n\t\t\t}\n\t\t});\n\n\t\tsetTitle(R.string.statuspopup_name);\n\t\tsetView(group);\n\n\t\tsetButton(BUTTON_POSITIVE, context.getString(android.R.string.ok),\n\t\t\t\tnew OkListener());\n\n\t\tsetButton(BUTTON_NEGATIVE, context.getString(android.R.string.cancel),\n\t\t\t\t(OnClickListener) null);\n\t}\n\n\tprivate void setSpinnerSelection(List<StatusMode> modes, StatusMode status_mode) {\n\t\tfor (int i = 0; i < modes.size(); i++) {\n\t\t\tif (modes.get(i).equals(status_mode)) {\n\t\t\t\tmStatus.setSelection(i);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate void setAndSaveStatus() {\n\t\tStatusMode statusMode = (StatusMode) mStatus.getSelectedItem();\n\t\tString message = mMessage.getText().toString();\n\n\t\t// save update into prefs\n\t\tSharedPreferences.Editor prefedit = PreferenceManager\n\t\t\t\t.getDefaultSharedPreferences(mContext).edit();\n\t\t// do not save \"offline\" to prefs, do not save when DND-silent is enabled\n\t\tif (statusMode != StatusMode.offline && !mDndSilent.isChecked())\n\t\t\tprefedit.putString(PreferenceConstants.STATUS_MODE, statusMode.name());\n\t\tif (!message.equals(mConfig.statusMessage)) {\n\t\t\tList<String> smh = new ArrayList<String>(java.util.Arrays.asList(mConfig.statusMessageHistory));\n\t\t\tif (!smh.contains(message))\n\t\t\t\tsmh.add(message);\n\t\t\tString smh_joined = android.text.TextUtils.join(\"\\036\", smh);\n\t\t\tprefedit.putString(PreferenceConstants.STATUS_MESSAGE_HISTORY, smh_joined);\n\t\t}\n\t\tprefedit.putString(PreferenceConstants.STATUS_MESSAGE, message);\n\t\t// check if DND-silent was disabled by the user\n\t\tif (!mDndSilent.isChecked() && mConfig.smartAwayMode != null) {\n\t\t\tprefedit.putBoolean(PreferenceConstants.STATUS_DNDSILENT, false);\n\t\t\tmConfig.smartAwayMode = null;\n\t\t}\n\t\tprefedit.commit();\n\n\t\tmContext.updateStatus(statusMode);\n\t}\n\n\tprivate class OkListener implements OnClickListener {\n\t\t@Override\n\t\tpublic void onClick(DialogInterface dialog, int which) {\n\t\t\tsetAndSaveStatus();\n\t\t}\n\t}\n\n\tprivate class StatusModeAdapter extends ArrayAdapter<StatusMode> {\n\n\t\tpublic StatusModeAdapter(Context context, int textViewResourceId,\n\t\t\t\tList<StatusMode> modes) {\n\n\t\t\tsuper(context, textViewResourceId, modes);\n\t\t}\n\n\t\t@Override\n\t\tpublic View getDropDownView(int position, View convertView, ViewGroup parent) {\n\t\t\treturn getCustomView(position, convertView, parent, true);\n\t\t}\n\n\t\t@Override\n\t\tpublic View getView(int position, View convertView, ViewGroup parent) {\n\t\t\treturn getCustomView(position, convertView, parent, false);\n\t\t}\n\n\t\tpublic View getCustomView(int position, View convertView, ViewGroup parent, boolean padding) {\n\t\t\tLayoutInflater inflater = getLayoutInflater();\n\t\t\tView spinner = inflater.inflate(R.layout.status_spinner_item, parent, false);\n\n\t\t\tTextView text = (TextView) spinner.findViewById(R.id.status_text);\n\t\t\ttext.setText(getItem(position).getTextId());\n\n\t\t\tImageView icon = (ImageView) spinner.findViewById(R.id.status_icon);\n\t\t\ticon.setImageResource(getItem(position).getDrawableId());\n\n\t\t\tif (!padding)\n\t\t\t\tspinner.setPadding(0, 0, 0, 0);\n\n\t\t\treturn spinner;\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/dialogs/ConfirmDialog.java",
    "content": "package org.yaxim.androidclient.dialogs;\r\n\r\nimport android.support.v7.app.AlertDialog;\r\nimport android.content.Context;\r\nimport android.content.DialogInterface;\r\n\r\nimport org.yaxim.androidclient.data.ChatRoomHelper;\r\nimport org.yaxim.androidclient.R;\r\n\r\npublic class ConfirmDialog {\r\n\r\n\tpublic static void show(Context context, int title_id,\r\n\t\t\tString message, final String jid, final Ok ok) {\r\n\t\tnew AlertDialog.Builder(context)\r\n\t\t\t.setTitle(title_id)\r\n\t\t\t.setMessage(message)\r\n\t\t\t.setPositiveButton(android.R.string.yes,\r\n\t\t\t\t\tnew DialogInterface.OnClickListener() {\r\n\t\t\t\t\t\tpublic void onClick(DialogInterface dialog, int which) {\r\n\t\t\t\t\t\t\tok.ok(jid);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t})\r\n\t\t\t.setNegativeButton(android.R.string.no, null)\r\n\t\t\t.create().show();\r\n\t}\r\n\r\n\tpublic static void showMucLeave(final Context context, final String jid) {\r\n\t\tshow(context, R.string.roster_contextmenu_muc_leave,\r\n\t\t\t\tcontext.getString(R.string.muc_leave_question, jid), jid,\r\n\t\t\t\tnew ConfirmDialog.Ok() {\r\n\t\t\t\t\t@Override\r\n\t\t\t\t\tpublic void ok(final String jid) {\r\n\t\t\t\t\t\tChatRoomHelper.leaveRoom(context, jid);\r\n\t\t\t\t\t\tChatRoomHelper.syncDbRooms(context);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t}\r\n\r\n\tpublic interface Ok {\r\n\t\tpublic void ok(final String jid);\r\n\t}\r\n}\r\n"
  },
  {
    "path": "src/org/yaxim/androidclient/dialogs/EditMUCDialog.java",
    "content": "package org.yaxim.androidclient.dialogs;\r\n\r\nimport org.yaxim.androidclient.data.ChatHelper;\r\nimport org.yaxim.androidclient.data.ChatRoomHelper;\r\nimport org.yaxim.androidclient.exceptions.YaximXMPPAdressMalformedException;\r\nimport org.yaxim.androidclient.util.XMPPHelper;\r\nimport org.yaxim.androidclient.widget.AutoCompleteJidEdit;\r\nimport org.yaxim.androidclient.YaximApplication;\r\n\r\nimport android.app.Activity;\r\nimport android.support.v7.app.AlertDialog;\r\nimport android.content.Context;\r\nimport android.content.DialogInterface;\r\nimport android.os.Bundle;\r\nimport android.text.Editable;\r\nimport android.text.TextWatcher;\r\nimport android.view.LayoutInflater;\r\nimport android.view.View;\r\nimport android.widget.Button;\r\nimport android.widget.CheckBox;\r\nimport android.widget.CompoundButton;\r\nimport android.widget.EditText;\r\nimport android.widget.TextView;\r\nimport org.yaxim.androidclient.R;\r\n\r\npublic class EditMUCDialog extends AlertDialog implements\r\n\t\tDialogInterface.OnClickListener, TextWatcher {\r\n\r\n\tprivate Activity mContext;\r\n\r\n\tprivate Button okButton;\r\n\tprivate TextView mInvitation;\r\n\tprivate AutoCompleteJidEdit mRoomJID;\r\n\tprivate EditText mNickName;\r\n\tprivate EditText mPassword;\r\n\tprivate CheckBox mShowPassword;\r\n\tprivate boolean openChat = true;\r\n\r\n\tpublic EditMUCDialog(Activity context) {\r\n\t\tsuper(context);\r\n\t\tmContext = context;\r\n\r\n\t\tsetTitle(R.string.Menu_muc);\r\n\r\n\t\tLayoutInflater inflater = (LayoutInflater) context\r\n\t\t\t\t.getSystemService(Context.LAYOUT_INFLATER_SERVICE);\r\n\t\tView group = inflater.inflate(R.layout.muc_new_dialog, null, false);\r\n\t\tsetView(group);\r\n\r\n\t\tmInvitation = (TextView)group.findViewById(R.id.muc_invitation);\r\n\t\tmRoomJID = (AutoCompleteJidEdit)group.findViewById(R.id.muc_new_jid);\r\n\t\tString mucDomain = YaximApplication.getConfig().mucDomain;\r\n\t\tmRoomJID.setServerList(mucDomain, ChatHelper.getXMPPDomains(context, ChatHelper.ROSTER_FILTER_MUCS),\r\n\t\t\t\tR.array.muc_services);\r\n\t\tmNickName = (EditText)group.findViewById(R.id.muc_new_nick);\r\n\t\tmNickName.setHint(YaximApplication.getConfig().screenName);\r\n\t\tmPassword = (EditText)group.findViewById(R.id.muc_new_pw);\r\n\t\tmShowPassword = (CheckBox) group.findViewById(R.id.password_show);\r\n\t\tmShowPassword.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {\r\n\t\t\t@Override\r\n\t\t\tpublic void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {\r\n\t\t\t\tmPassword.setTransformationMethod(isChecked ? null :\r\n\t\t\t\t\t\tnew android.text.method.PasswordTransformationMethod());\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tsetButton(BUTTON_POSITIVE, context.getString(android.R.string.ok), this);\r\n\t\tsetButton(BUTTON_NEGATIVE, context.getString(android.R.string.cancel),\r\n\t\t\t\t(DialogInterface.OnClickListener)null);\r\n\r\n\t}\r\n\r\n\t// this constructor is called for actual editing of an existing MUC\r\n\tpublic EditMUCDialog(Activity context, String roomJID) {\r\n\t\tthis(context);\r\n\t\tsetTitle(R.string.roster_contextmenu_muc_edit);\r\n\r\n\t\tChatRoomHelper.RoomInfo ri = ChatRoomHelper.getRoomInfo(mContext, roomJID);\r\n\t\tmRoomJID.setText(roomJID);\r\n\t\tmRoomJID.setInputType(android.text.InputType.TYPE_NULL);\r\n\t\tmNickName.setText(ri.nickname);\r\n\t\tmPassword.setText(ri.password);\r\n\t\tmNickName.requestFocus();\r\n\t}\r\n\r\n\t// this is called when following an invitation\r\n\tpublic EditMUCDialog(Activity context, String roomJID, String invitation,\r\n\t\t\tString nickname, String password) {\r\n\t\tthis(context);\r\n\r\n\t\tif (invitation != null) {\r\n\t\t\tsetTitle(R.string.title_activity_muc_invite);\r\n\t\t\tmInvitation.setText(invitation);\r\n\t\t\tmInvitation.setVisibility(View.VISIBLE);\r\n\t\t}\r\n\t\tmRoomJID.setText(roomJID);\r\n\t\tmRoomJID.setInputType(android.text.InputType.TYPE_NULL);\r\n\t\tmNickName.setText(nickname);\r\n\t\tmPassword.setText(password);\r\n\t\tmNickName.requestFocus();\r\n\t}\r\n\r\n\t// chained function call to set the nickname\r\n\tpublic EditMUCDialog withNick(String fallback) {\r\n\t\tmNickName.setText(ChatRoomHelper.guessMyNickname(mContext, fallback));\r\n\t\treturn this;\r\n\t}\r\n\r\n\t// chained function to prevent opening\r\n\tpublic EditMUCDialog dontOpen() {\r\n\t\topenChat = false;\r\n\t\treturn this;\r\n\t}\r\n\r\n\tpublic void onCreate(Bundle icicle) {\r\n\t\tsuper.onCreate(icicle);\r\n\r\n\t\tokButton = getButton(BUTTON_POSITIVE);\r\n\t\tafterTextChanged(mRoomJID.getText());\r\n\r\n\t\tmRoomJID.addTextChangedListener(this);\r\n\t\tmNickName.addTextChangedListener(this);\r\n\t}\r\n\r\n\tpublic void addAndOpen(String jid, String password, String nickname) {\r\n\t\tChatRoomHelper.addRoom(mContext, jid, password, nickname, true);\r\n\t\tif (openChat)\r\n\t\t\tChatHelper.startChatActivity(mContext, jid, jid, null);\r\n\t\tChatRoomHelper.syncDbRooms(mContext);\r\n\t}\r\n\r\n\tpublic void onClick(DialogInterface dialog, int which) {\r\n\t\taddAndOpen(mRoomJID.getText().toString(),\r\n\t\t\t\tmPassword.getText().toString(),\r\n\t\t\t\tmNickName.getText().toString());\r\n\t}\r\n\r\n\tpublic void afterTextChanged(Editable s) {\r\n\t\ttry {\r\n\t\t\tXMPPHelper.verifyJabberID(mRoomJID.getText());\r\n\t\t\t//okButton.setEnabled(mNickName.getText().length() > 0);\r\n\t\t\tmRoomJID.setError(null);\r\n\t\t} catch (YaximXMPPAdressMalformedException e) {\r\n\t\t\tokButton.setEnabled(false);\r\n\t\t\tif (s.length() > 0)\r\n\t\t\t\tmRoomJID.setError(mContext.getString(R.string.Global_JID_malformed));\r\n\t\t}\r\n\t}\r\n\r\n\tpublic void beforeTextChanged(CharSequence s, int start, int count,\r\n\t\t\tint after) {}\r\n\tpublic void onTextChanged(CharSequence s, int start, int before, int count) {}\r\n}\r\n"
  },
  {
    "path": "src/org/yaxim/androidclient/dialogs/FirstStartDialog.java",
    "content": "package org.yaxim.androidclient.dialogs;\n\nimport org.jivesoftware.smack.SmackException;\nimport org.jivesoftware.smack.XMPPException;\nimport org.jivesoftware.smack.packet.StanzaError;\nimport org.jivesoftware.smack.sasl.SASLErrorException;\nimport org.yaxim.androidclient.XMPPRosterServiceAdapter;\nimport org.yaxim.androidclient.YaximApplication;\nimport org.yaxim.androidclient.data.YaximConfiguration;\nimport org.yaxim.androidclient.exceptions.YaximXMPPAdressMalformedException;\nimport org.yaxim.androidclient.preferences.AccountPrefs;\nimport org.yaxim.androidclient.util.PreferenceConstants;\nimport org.yaxim.androidclient.util.XMPPHelper;\nimport org.yaxim.androidclient.widget.AutoCompleteJidEdit;\n\nimport android.support.v7.app.AlertDialog;\nimport android.content.Context;\nimport android.content.DialogInterface;\nimport android.content.Intent;\nimport android.content.SharedPreferences;\nimport android.content.SharedPreferences.Editor;\nimport android.os.Bundle;\nimport android.preference.PreferenceManager;\nimport android.text.Editable;\nimport android.text.InputType;\nimport android.text.TextWatcher;\nimport android.util.TypedValue;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.widget.Button;\nimport android.widget.CheckBox;\nimport android.widget.CompoundButton;\nimport android.widget.EditText;\nimport android.widget.TextView;\nimport android.widget.Toast;\nimport org.yaxim.androidclient.MainWindow;\nimport org.yaxim.androidclient.R;\n\npublic class FirstStartDialog extends AlertDialog implements DialogInterface.OnClickListener,\n\t\tCompoundButton.OnCheckedChangeListener, TextWatcher {\n\n\tprivate MainWindow mainWindow;\n\tprivate Button mOkButton;\n\tprivate AutoCompleteJidEdit mEditJabberID;\n\tprivate EditText mEditPassword;\n\tprivate CheckBox mShowPassword;\n\tprivate CheckBox mCreateAccount;\n\tprivate String preauth;\n\n\tpublic FirstStartDialog(MainWindow mainWindow,\n\t\t\tXMPPRosterServiceAdapter serviceAdapter) {\n\t\tsuper(mainWindow);\n\t\tthis.mainWindow = mainWindow;\n\n\t\tsetTitle(R.string.StartupDialog_Title);\n\n\t\tLayoutInflater inflater = (LayoutInflater) mainWindow\n\t\t\t\t.getSystemService(Context.LAYOUT_INFLATER_SERVICE);\n\t\tView group = inflater.inflate(R.layout.firststartdialog, null, false);\n\t\tsetView(group);\n\n\t\tsetButton(BUTTON_POSITIVE, mainWindow.getString(android.R.string.ok), this);\n\t\tsetButton(BUTTON_NEUTRAL, mainWindow.getString(R.string.StartupDialog_advanced), this);\n\n\t\tmEditJabberID = (AutoCompleteJidEdit) group.findViewById(R.id.StartupDialog_JID_EditTextField);\n\t\tmEditPassword = (EditText) group.findViewById(R.id.StartupDialog_PASSWD_EditTextField);\n\t\tmCreateAccount = (CheckBox) group.findViewById(R.id.create_account);\n\t\tmShowPassword = (CheckBox) group.findViewById(R.id.password_show);\n\n\t\tmEditJabberID.setServerList(R.array.xmpp_servers);\n\t}\n\n\tpublic void onCreate(Bundle savedInstanceState) {\n\t\tsuper.onCreate(savedInstanceState);\n\n\t\tmOkButton = getButton(BUTTON_POSITIVE);\n\n\t\tSharedPreferences sharedPreferences = PreferenceManager\n\t\t\t\t.getDefaultSharedPreferences(mainWindow);\n\t\tmEditJabberID.setText(sharedPreferences.getString(PreferenceConstants.JID, \"\"));\n\t\tmEditPassword.setText(sharedPreferences.getString(PreferenceConstants.PASSWORD, \"\"));\n\n\t\tmEditJabberID.addTextChangedListener(this);\n\t\tmEditPassword.addTextChangedListener(this);\n\t\tmCreateAccount.setOnCheckedChangeListener(this);\n\t\tmShowPassword.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {\n\t\t\t@Override\n\t\t\tpublic void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {\n\t\t\t\tmEditPassword.setTransformationMethod(isChecked ? null :\n\t\t\t\t\t\tnew android.text.method.PasswordTransformationMethod());\n\t\t\t}\n\t\t});\n\t\t// if create is set, simulate click on checkbox\n\t\tif (sharedPreferences.getBoolean(PreferenceConstants.INITIAL_CREATE, false)) {\n\t\t\tmCreateAccount.setChecked(true);\n\t\t}\n\t\tupdateDialog(false);\n\t}\n\n\tpublic FirstStartDialog setJID(String jid, String preauth) {\n\t\tandroid.util.Log.d(\"FirstStartDialog\", \"setJID: \" + jid + \" / \" + preauth);\n\t\t((TextView)findViewById(R.id.StartupDialog_Summary)).setText(R.string.StartupDialog_invitation);\n\t\tthis.preauth = preauth;\n\t\tmEditJabberID.setText(jid);\n\t\tmEditJabberID.setInputType(android.text.InputType.TYPE_NULL);\n\t\tmEditJabberID.dismissDropDown();\n\t\tmCreateAccount.setChecked(true);\n\t\tmCreateAccount.setEnabled(false);\n\t\treturn this;\n\t}\n\tpublic FirstStartDialog setPreAuth(String ibr_domain, String preauth) {\n\t\tandroid.util.Log.d(\"FirstStartDialog\", \"setPreAuth: \" + preauth);\n\t\t((TextView)findViewById(R.id.StartupDialog_Summary)).setText(R.string.StartupDialog_invitation);\n\t\tthis.preauth = preauth;\n\t\tmEditJabberID.setServerList(ibr_domain, null, R.array.xmpp_servers);\n\t\t// TODO: refactor IBR hint for global domain\n\t\tmEditJabberID.setHint(mainWindow.getString(R.string.Global_JID_hint).replace(\"yax.im\", ibr_domain));\n\t\tmCreateAccount.setChecked(true);\n\t\treturn this;\n\t}\n\n\tpublic FirstStartDialog setError(Exception e) {\n\t\tString jid_message = e.getLocalizedMessage();\n\t\tString password_message = null;\n\t\tif (e instanceof SASLErrorException) {\n\t\t\tjid_message = mainWindow.getString(R.string.StartupDialog_auth_failed);\n\t\t} else if (e instanceof XMPPException.XMPPErrorException) {\n\t\t\tStanzaError se = ((XMPPException.XMPPErrorException)e).getStanzaError();\n\t\t\tjid_message = se.getDescriptiveText();\n\t\t\tif (jid_message == null) {\n\t\t\t\tif (se.getCondition() == StanzaError.Condition.service_unavailable || se.getCondition() == StanzaError.Condition.not_allowed)\n\t\t\t\t\tjid_message = mainWindow.getString(R.string.StartupDialog_no_registration);\n\t\t\t\telse\n\t\t\t\t\tjid_message = se.toString();\n\t\t\t}\n\t\t} else if (e instanceof SmackException.ConnectionException) {\n\t\t\tString domain = YaximApplication.getConfig().getServerHost();\n\t\t\tjid_message = mainWindow.getString(R.string.StartupDialog_server_failed, domain);\n\t\t}\n\t\tmEditJabberID.setError(jid_message);\n\t\tmEditPassword.setError(password_message);\n\t\tmEditJabberID.requestFocus();\n\t\treturn this;\n\t}\n\tpublic void onClick(DialogInterface dialog, int which) {\n\t\tswitch (which) {\n\t\tcase BUTTON_POSITIVE:\n\t\t\tverifyAndSavePreferences();\n\t\t\tboolean create_account = mCreateAccount.isChecked();\n\t\t\tmainWindow.startConnectionWithNotificationPermission(create_account);\n\t\t\tbreak;\n\t\tcase BUTTON_NEUTRAL:\n\t\t\tverifyAndSavePreferences();\n\t\t\tmainWindow.startActivity(new Intent(mainWindow, AccountPrefs.class));\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tprivate void verifyAndSavePreferences() {\n\t\tString password = mEditPassword.getText().toString();\n\t\tString jabberID;\n\t\ttry {\n\t\t\tjabberID = XMPPHelper.verifyJabberID(mEditJabberID.getText());\n\t\t} catch (YaximXMPPAdressMalformedException e) {\n\t\t\te.printStackTrace();\n\t\t\tjabberID = mEditJabberID.getText().toString();\n\t\t}\n\t\tsavePreferences(jabberID, password, XMPPHelper.createResource(mainWindow), mCreateAccount.isChecked());\n\t\tdismiss();\n\t}\n\n\tprivate void updateDialog(boolean show_errors) {\n\t\tboolean is_ok = true;\n\t\t// verify jabber ID\n\t\tEditable jid = mEditJabberID.getText();\n\t\ttry {\n\t\t\tXMPPHelper.verifyJabberID(jid);\n\t\t\t//mOkButton.setOnClickListener(this);\n\t\t\tmEditJabberID.setError(null);\n\t\t} catch (YaximXMPPAdressMalformedException e) {\n\t\t\tif (show_errors && (jid.length() > 0))\n\t\t\t\tmEditJabberID.setError(mainWindow.getString(R.string.Global_JID_malformed));\n\t\t\tis_ok = false;\n\t\t}\n\t\tif (mEditPassword.length() == 0)\n\t\t\tis_ok = false;\n\t\tif (mCreateAccount.isChecked()) {\n\t\t\tboolean good_password = (mEditPassword.length() >= 6);\n\t\t\tis_ok = is_ok && good_password;\n\t\t\tmEditPassword.setError((!show_errors || good_password || mEditPassword.length() == 0) ?\n\t\t\t\t\tnull : mainWindow.getString(R.string.StartupDialog_error_password));\n\t\t}\n\t\tmOkButton.setEnabled(is_ok);\n\t}\n\n\t/* CompoundButton.OnCheckedChangeListener for mCreateAccount */\n\t@Override\n\tpublic void onCheckedChanged(CompoundButton btn,boolean isChecked) {\n\t\tif (isChecked) {\n\t\t\tif (mEditPassword.length() == 0) {\n\t\t\t\t// create secure random password\n\t\t\t\tString pw = XMPPHelper.securePassword();\n\t\t\t\tToast.makeText(mainWindow, R.string.StartupDialog_created_password, Toast.LENGTH_SHORT).show();\n\t\t\t\tmEditPassword.setText(pw);\n\t\t\t} else if (mEditJabberID.getError() != null)\n\t\t\t\tmEditPassword.requestFocus();\n\t\t}\n\t\tupdateDialog(true);\n\t}\n\tpublic void afterTextChanged(Editable s) {\n\t\tupdateDialog(true);\n\t}\n\n\tpublic void beforeTextChanged(CharSequence s, int start, int count,\n\t\t\tint after) {\n\t}\n\n\tpublic void onTextChanged(CharSequence s, int start, int before, int count) {\n\t}\n\n\tprivate void savePreferences(String jabberID, String password, String resource, boolean initial_create) {\n\t\tSharedPreferences sharedPreferences = PreferenceManager\n\t\t\t\t.getDefaultSharedPreferences(mainWindow);\n\t\tEditor editor = sharedPreferences.edit();\n\n\t\teditor.putString(PreferenceConstants.JID, jabberID);\n\t\teditor.putString(PreferenceConstants.PASSWORD, password);\n\t\teditor.putBoolean(PreferenceConstants.FIRSTRUN, true);\n\t\tif (sharedPreferences.getString(PreferenceConstants.RESSOURCE, null) == null)\n\t\t\teditor.putString(PreferenceConstants.RESSOURCE, resource);\n\t\teditor.putBoolean(PreferenceConstants.INITIAL_CREATE, initial_create);\n\t\tif (preauth != null)\n\t\t\teditor.putString(PreferenceConstants.INITIAL_PREAUTH, preauth);\n\t\teditor.commit();\n\t}\n\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/dialogs/GroupNameView.java",
    "content": "package org.yaxim.androidclient.dialogs;\n\nimport java.util.List;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport android.util.Log;\nimport android.view.View;\nimport android.view.LayoutInflater;\nimport android.widget.AdapterView;\nimport android.widget.AdapterView.OnItemSelectedListener;\nimport android.widget.ArrayAdapter;\nimport android.widget.EditText;\nimport android.widget.LinearLayout;\nimport android.widget.Spinner;\n\nimport org.yaxim.androidclient.R;\n\npublic class GroupNameView extends LinearLayout implements OnItemSelectedListener {\n\tprivate Context mContext;\n\tprivate List<String> mGroupList;\n\tprivate ArrayAdapter<String> mGroupAdapter;\n\tprivate Spinner mGroupSpinner;\n\tprivate EditText mNewGroupInput;\n\tprivate String mAddGroupString;\n\tprivate String mDefaultGroup;\n\n\tpublic GroupNameView(Context ctx, AttributeSet attrs) {\n\t\tsuper(ctx, attrs);\n\n\t\t((LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE))\n\t\t\t.inflate(R.layout.groupnameview, this);\n\n\t\tmContext = ctx;\n\t\tmGroupSpinner = (Spinner)findViewById(R.id.groupspinner);\n\t\tmNewGroupInput = (EditText)findViewById(R.id.newgroupinput);\n\n\t\tmAddGroupString = ctx.getString(R.string.addrosteritemaddgroupchoice);\n\t\tmDefaultGroup = ctx.getString(R.string.default_group);\n\t}\n\n\tpublic void setGroupList(List<String> groupList) {\n\t\tmGroupList = groupList;\n\t\t// replace the internal representation of the default group\n\t\tmGroupList.remove(\"\");\n\t\tmGroupList.add(0, mDefaultGroup);\n\n\t\t// add the string for \"new group\"\n\t\tmGroupList.add(mAddGroupString);\n\n\t\t// XXX\n\t\tmGroupAdapter = new ArrayAdapter<String>(mContext,\n\t\t\t\tandroid.R.layout.simple_spinner_item, mGroupList);\n\t\tmGroupAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);\n\t\tmGroupSpinner.setAdapter(mGroupAdapter);\n\t\tmGroupSpinner.setOnItemSelectedListener(this);\n\t}\n\n\tpublic String getGroupName() {\n\t\tString spinnerItem = mGroupSpinner.getSelectedItem().toString();\n\t\tif (spinnerItem.equals(mDefaultGroup)) {\n\t\t\t// return internal representation\n\t\t\treturn \"\";\n\t\t} else if (spinnerItem.equals(mAddGroupString)) {\n\t\t\treturn mNewGroupInput.getText().toString();\n\t\t} else {\n\t\t\treturn spinnerItem;\n\t\t}\n\t}\n\n\tvoid setInputVisibility(boolean vis) {\n\t\tLog.d(\"GroupNameView\", \"setInputVisibility: \" + vis);\n\t\tmNewGroupInput.setVisibility(vis ? View.VISIBLE : View.GONE);\n\t\tmNewGroupInput.setEnabled(vis);\n\t}\n\n\tpublic void onItemSelected(AdapterView<?> view, View arg1, int arg2,\n\t\t\tlong arg3) {\n\t\tLog.d(\"GroupNameView\", \"onItemSelected: \" + view.getSelectedItem());\n\t\tsetInputVisibility(view.getSelectedItem().toString().equals(mAddGroupString));\n\t}\n\n\tpublic void onNothingSelected(AdapterView<?> arg0) {\n\t\t// this event is ignored\n\t}\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/exceptions/YaximXMPPAdressMalformedException.java",
    "content": "package org.yaxim.androidclient.exceptions;\n\npublic class YaximXMPPAdressMalformedException extends Exception {\n\t\n\tprivate static final long serialVersionUID = 1L;\n\n\tpublic YaximXMPPAdressMalformedException(Throwable cause) {\n\t\tsuper(cause);\n\t}\n\n\tpublic YaximXMPPAdressMalformedException(String msg) {\n\t\tsuper(msg);\n\t}\n\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/exceptions/YaximXMPPException.java",
    "content": "package org.yaxim.androidclient.exceptions;\n\npublic class YaximXMPPException extends Exception {\n\t\n\tprivate static final long serialVersionUID = 1L;\n\n\tpublic YaximXMPPException(String message) {\n\t\tsuper(message);\n\t}\n\n\tpublic YaximXMPPException(String message, Throwable cause) {\n\t\tsuper(message, cause);\n\t}\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/list/EntityListActivity.java",
    "content": "package org.yaxim.androidclient.list;\n\nimport android.content.Intent;\nimport android.net.Uri;\nimport android.os.Bundle;\nimport android.os.Handler;\nimport android.support.v4.view.MenuItemCompat;\nimport android.support.v7.widget.SearchView;\nimport android.text.InputType;\nimport android.text.TextUtils;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.view.View;\nimport android.widget.ExpandableListView;\n\nimport org.jivesoftware.smackx.bookmarks.BookmarkedConference;\nimport org.yaxim.androidclient.R;\nimport org.yaxim.androidclient.ThemedActivity;\nimport org.yaxim.androidclient.YaximApplication;\nimport org.yaxim.androidclient.data.ChatHelper;\nimport org.yaxim.androidclient.data.EntityInfo;\nimport org.yaxim.androidclient.dialogs.EditMUCDialog;\n\n/** Base activity for a tree of entities (e.g. Roster, Service Disco, ...).\n *\n * This activity provides:\n *   - a RAM-based EntityListAdapter\n *   - a search menu widget with 500ms delayed auto-search\n *   - default click handlers for known entity types\n *\n * If searchByDefault=true is set <b>befrore onCreate</b>, the\n * activity will be opened with search, and closed when search is closed.\n *\n */\npublic class EntityListActivity extends ThemedActivity implements ExpandableListView.OnChildClickListener, SearchView.OnQueryTextListener {\n\tExpandableListView elv;\n\tEntityListAdapter ela;\n\tprotected SearchView sv;\n\tboolean searchByDefault = false;\n\n\t@Override\n\tprotected void onCreate(Bundle savedInstanceState) {\n\t\tsuper.onCreate(savedInstanceState);\n\t\tsetContentView(R.layout.activity_entitylist);\n\n\t\t// Search View\n\t\tfinal boolean sbd = searchByDefault;\n\t\tsv = new SearchView(getSupportActionBar().getThemedContext()) {\n\t\t\t@Override\n\t\t\tpublic void onActionViewCollapsed() {\n\t\t\t\tsuper.onActionViewCollapsed();\n\t\t\t\tif (sbd)\n\t\t\t\t\tfinish();\n\t\t\t}\n\t\t};\n\t\tsv.setOnQueryTextListener(this);\n\t\tsv.setInputType(InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);\n\n\t\telv = (ExpandableListView) findViewById(android.R.id.list);\n\t\telv.setOnChildClickListener(this);\n\t\tela = new EntityListAdapter(this);\n\n\t}\n\n\t@Override\n\tpublic boolean onCreateOptionsMenu(Menu menu) {\n\t\tMenuItem si = menu.add(android.R.string.search_go);\n\t\tsi.setIcon(R.drawable.ic_action_search);\n\t\tMenuItemCompat.setActionView(si, sv);\n\t\tMenuItemCompat.setShowAsAction(si, MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);\n\t\tif (searchByDefault)\n\t\t\tMenuItemCompat.expandActionView(si);\n\n\t\treturn true;\n\t}\n\n\tpublic boolean onEntityClick(EntityInfo ei) {\n\t\tif (ei.type.contains(EntityInfo.Type.Domain)) {\n\t\t\tstartActivity(new Intent(this, ServiceDiscoveryActivity.class).setData(Uri.parse(ei.jid)));\n\t\t\treturn true;\n\t\t} else\n\t\tif (ei.type.contains(EntityInfo.Type.User)) {\n\t\t\tChatHelper.startChatActivity(this, ei.jid, ei.name, null);\n\t\t} else\n\t\tif (ei.type.contains(EntityInfo.Type.MUC)) {\n\t\t\tString nickname = null;\n\t\t\tString password = null;\n\t\t\tif (ei.data instanceof BookmarkedConference) {\n\t\t\t\tBookmarkedConference bc = (BookmarkedConference)ei.data;\n\t\t\t\tif (bc.getNickname() != null)\n\t\t\t\t\tnickname = bc.getNickname().toString();\n\t\t\t\tpassword = bc.getPassword();\n\t\t\t}\n\t\t\tnew EditMUCDialog(this, ei.jid, ei.name, nickname, password).show();\n\t\t}\n\t\treturn true;\n\n\t}\n\t// ExpandableListView.OnChildClickListener\n\t@Override\n\tpublic boolean onChildClick(ExpandableListView parent, View view, int groupPosition, int itemPosition, long id) {\n\t\tEntityListAdapter.EntityHolder eh = (EntityListAdapter.EntityHolder) view.getTag();\n\t\treturn onEntityClick(eh.ei);\n\t}\n\n\tprivate String mSearchQuery;\n\tprivate Handler mSearchHandler = new Handler();\n\tprivate Runnable mSearchLater = new Runnable() {\n\t\t@Override\n\t\tpublic void run() {\n\t\t\tsearchLater(mSearchQuery);\n\t\t}\n\t};\n\n\tpublic void searchNow(String query) {\n\t\t// override this to perform an immediate search\n\t}\n\n\tpublic void searchLater(String query) {\n\t\t// override this to perform an \"expensive\"/delayed search\n\t}\n\n\t// SearchView.OnQueryTextListener\n\t@Override\n\tpublic boolean onQueryTextSubmit(String query) {\n\t\tmSearchQuery = query;\n\t\tmSearchHandler.removeCallbacks(mSearchLater);\n\t\tmSearchHandler.post(mSearchLater);\n\t\treturn true;\n\t}\n\n\t@Override\n\tpublic boolean onQueryTextChange(String query) {\n\t\tsearchNow(query);\n\t\tmSearchQuery = query;\n\t\tmSearchHandler.removeCallbacks(mSearchLater);\n\t\tmSearchHandler.postDelayed(mSearchLater, 500);\n\t\treturn true;\n\t}\n\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/list/EntityListAdapter.java",
    "content": "package org.yaxim.androidclient.list;\n\nimport android.app.Activity;\nimport android.text.TextUtils;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.BaseExpandableListAdapter;\nimport android.widget.Filter;\nimport android.widget.Filterable;\nimport android.widget.ImageView;\nimport android.widget.ProgressBar;\nimport android.widget.TextView;\n\nimport org.yaxim.androidclient.R;\nimport org.yaxim.androidclient.data.EntityInfo;\nimport org.yaxim.androidclient.data.EntityList;\n\nimport java.util.ArrayList;\n\n/**\n * Expandable adapter based on lists of entities.\n */\n\npublic class EntityListAdapter extends BaseExpandableListAdapter implements Filterable {\n\tpublic ArrayList<EntityList> groups = new ArrayList<EntityList>();\n\tLayoutInflater inflater;\n\tActivity act;\n\n\n\tpublic EntityListAdapter(Activity act) {\n\t\tthis.act = act;\n\t\tinflater = (LayoutInflater)act.getSystemService(act.LAYOUT_INFLATER_SERVICE);\n\t}\n\n\tpublic void add(EntityList pg) {\n\t\tgroups.add(pg);\n\t\tnotifyDataSetChanged();\n\t}\n\n\t@Override\n\tpublic int getGroupCount() {\n\t\treturn groups.size();\n\t}\n\n\t@Override\n\tpublic int getChildrenCount(int groupId) {\n\t\tEntityList el = groups.get(groupId);\n\t\tif (el == null || el.items == null)\n\t\t\treturn 0;\n\t\treturn el.items.size();\n\t}\n\n\t@Override\n\tpublic Object getGroup(int groupId) {\n\t\treturn groups.get(groupId);\n\t}\n\n\t@Override\n\tpublic Object getChild(int groupId, int childId) {\n\t\treturn groups.get(groupId).items.get(childId);\n\t}\n\n\t@Override\n\tpublic long getGroupId(int groupId) {\n\t\treturn groupId;\n\t}\n\n\t@Override\n\tpublic long getChildId(int groupId, int childId) {\n\t\treturn getCombinedChildId(groupId, childId);\n\t}\n\n\t@Override\n\tpublic boolean hasStableIds() {\n\t\treturn false;\n\t}\n\n\tpublic static class GroupHolder {\n\t\tTextView groupname;\n\t\tProgressBar progressBar;\n\t\tTextView members;\n\t}\n\n\tpublic static class EntityHolder {\n\t\tTextView unread;\n\t\tImageView icon;\n\t\tTextView name;\n\t\tTextView nusers;\n\t\tTextView status;\n\t\tEntityInfo ei;\n\t}\n\n\t@Override\n\tpublic View getGroupView(int groupId, boolean isExpanded, View view, ViewGroup parent) {\n\t\tGroupHolder holder;\n\t\tif (view == null) {\n\t\t\tview = inflater.inflate(R.layout.maingroup_row, parent, false);\n\t\t\tholder = new GroupHolder();\n\t\t\tholder.groupname = (TextView)view.findViewById(R.id.groupname);\n\t\t\tholder.progressBar = (ProgressBar) view.findViewById(R.id.loading_progress);\n\t\t\tholder.members = (TextView)view.findViewById(R.id.members);\n\t\t\tview.setTag(holder);\n\t\t} else\n\t\t\tholder = (GroupHolder)view.getTag();\n\t\tEntityList el = groups.get(groupId);\n\t\tholder.groupname.setText(el.groupName);\n\t\tString countText = (el.isError()) ? \"\" : \"\"+el.items.size();\n\t\tholder.progressBar.setVisibility(el.isLoading() ? View.VISIBLE : View.GONE);\n\t\tholder.members.setText(countText);\n\t\treturn view;\n\t}\n\n\t@Override\n\tpublic View getChildView(int groupId, int childId, boolean isLastChild, View view, ViewGroup parent) {\n\t\treturn getChildView(inflater, groups.get(groupId).items.get(childId), isLastChild, view, parent);\n\t}\n\n\tpublic static View getChildView(LayoutInflater inflater, EntityInfo ei, boolean isLastChild, View view, ViewGroup parent) {\n\t\tEntityHolder holder;\n\t\tif (view == null) {\n\t\t\tview = inflater.inflate(R.layout.mainchild_row, parent, false);\n\t\t\tholder = new EntityHolder();\n\t\t\tholder.unread = (TextView) view.findViewById(R.id.roster_unreadmsg_cnt);\n\t\t\tholder.icon = (ImageView)view.findViewById(R.id.roster_icon);\n\t\t\tholder.name = (TextView) view.findViewById(R.id.roster_screenname);\n\t\t\tholder.nusers = (TextView) view.findViewById(R.id.roster_nusers);\n\t\t\tholder.status = (TextView) view.findViewById(R.id.roster_statusmsg);\n\t\t\tview.setTag(holder);\n\t\t} else\n\t\t\tholder = (EntityHolder)view.getTag();\n\t\tint drawableId = android.R.drawable.ic_dialog_alert;\n\n\t\t// error handling: SM == null --> error\n\t\tif (ei.statusMode != null)\n\t\t\tdrawableId = ei.statusMode.getDrawableId();\n\t\tholder.name.setSingleLine(ei.statusMode != null);\n\n\t\tholder.icon.setImageResource(drawableId);\n\t\tholder.unread.setText(ei.unread > 0 ? \"\" + ei.unread : \"\");\n\t\tholder.name.setText(ei.name);\n\t\tholder.nusers.setText(\"\" + ei.users);\n\t\tholder.nusers.setVisibility(ei.users == 0 ? View.GONE : View.VISIBLE);\n\t\tholder.status.setText(ei.status);\n\t\tholder.status.setVisibility(TextUtils.isEmpty(ei.status) ? View.GONE : View.VISIBLE);\n\t\tholder.ei = ei;\n\t\treturn view;\n\t}\n\n\t@Override\n\tpublic boolean isChildSelectable(int groupId, int childId) {\n\t\treturn !groups.get(groupId).isError();\n\t}\n\n\t@Override\n\tpublic Filter getFilter() {\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/list/EntityListLoader.java",
    "content": "package org.yaxim.androidclient.list;\n\nimport android.os.AsyncTask;\nimport android.text.TextUtils;\nimport android.util.Log;\n\nimport org.jivesoftware.smack.XMPPConnection;\nimport org.jivesoftware.smack.XMPPException;\nimport org.jivesoftware.smack.packet.IQ;\nimport org.jivesoftware.smackx.bookmarks.BookmarkManager;\nimport org.jivesoftware.smackx.bookmarks.BookmarkedConference;\nimport org.jivesoftware.smackx.disco.ServiceDiscoveryManager;\nimport org.jivesoftware.smackx.disco.packet.DiscoverInfo;\nimport org.jivesoftware.smackx.disco.packet.DiscoverItems;\nimport org.jivesoftware.smackx.muc.HostedRoom;\nimport org.jivesoftware.smackx.muc.MultiUserChatManager;\nimport org.jxmpp.jid.DomainBareJid;\nimport org.jxmpp.jid.EntityBareJid;\nimport org.jxmpp.jid.impl.JidCreate;\nimport org.yaxim.androidclient.YaximApplication;\nimport org.yaxim.androidclient.data.EntityInfo;\nimport org.yaxim.androidclient.data.EntityList;\nimport org.yaxim.androidclient.packet.MuclumbusIQ;\nimport org.yaxim.androidclient.packet.MuclumbusResult;\nimport org.yaxim.androidclient.util.StatusMode;\nimport org.yaxim.androidclient.util.XMPPHelper;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.Comparator;\nimport java.util.EnumSet;\nimport java.util.List;\nimport java.util.Locale;\nimport java.util.Map;\n\n/**\n * AsyncTask for loading a list of entities from the XMPP connection.\n *\n * TODO: refactor this into an abstract base class and sub-class for each use case.\n */\nclass EntityListLoader extends AsyncTask<String, EntityInfo, Throwable> {\n\tpublic static final int MODE_BOOKMARKS = 0;\n\tpublic static final int MODE_DOMAIN = 1;\n\tpublic static final int MODE_MUCLUMBUS = 2;\n\tint mode;\n\tprivate EntityList el;\n\tString search;\n\n\tpublic EntityListLoader(int mode, EntityList el) {\n\t\tthis.mode = mode;\n\t\tthis.el = el;\n\t\tel.startLoading();\n\t}\n\n\tvoid loadBookmarksOrThrow(XMPPConnection c) throws Exception {\n\t\tList<BookmarkedConference> list = BookmarkManager.getBookmarkManager(c).getBookmarkedConferences();\n\t\tif (isCancelled())\n\t\t\treturn;\n\t\t/* make a mutable array of the response, sort by name */\n\t\tlist = new ArrayList<>(list);\n\t\tCollections.sort(list, new Comparator<BookmarkedConference>() {\n\t\t\tprivate String sortableName(BookmarkedConference bc) {\n\t\t\t\tif (!TextUtils.isEmpty(bc.getName()))\n\t\t\t\t\treturn bc.getName();\n\t\t\t\treturn bc.getJid().toString();\n\t\t\t}\n\t\t\t@Override\n\t\t\tpublic int compare(BookmarkedConference bookmarkedConference, BookmarkedConference with) {\n\t\t\t\treturn sortableName(bookmarkedConference).compareToIgnoreCase(sortableName(with));\n\t\t\t}\n\t\t});\n\t\tfor (BookmarkedConference conf : list) {\n\t\t\tStatusMode sm = conf.isAutoJoin() ? StatusMode.available : StatusMode.offline;\n\t\t\tString name = conf.getName();\n\t\t\tif (TextUtils.isEmpty(name))\n\t\t\t\tname = XMPPHelper.capitalizeString(conf.getJid().getLocalpart().toString());\n\t\t\tpublishProgress(new EntityInfo(EnumSet.of(EntityInfo.Type.MUC, EntityInfo.Type.Known), conf.getJid().toString(), sm, 0, name, conf.getJid().toString(), 0, conf));\n\t\t}\n\n\t}\n\n\tprivate String langToDisplay(String lang) {\n\t\tif (TextUtils.isEmpty(lang))\n\t\t\treturn null;\n\t\tLocale l;\n\t\tString[] tagsoup = lang.split(\"-\");\n\t\tif (tagsoup.length >= 2)\n\t\t\tl = new Locale(tagsoup[0], tagsoup[1]);\n\t\telse if (tagsoup.length == 1)\n\t\t\tl = new Locale(tagsoup[0]);\n\t\telse\n\t\t\treturn null;\n\t\tif (l != null && l.getDisplayLanguage() != null)\n\t\t\treturn l.getDisplayLanguage();\n\t\treturn null;\n\t}\n\n\tvoid loadMyMUCs(XMPPConnection c) throws Exception {\n\t\tMultiUserChatManager mucmgr = MultiUserChatManager.getInstanceFor(c);\n\t\t//muc_domains.add(JidCreate.domainBareFrom(\"chat.yax.im\"));\n\t\tList<DomainBareJid> muc_domains = mucmgr.getMucServiceDomains();\n\t\tfor (DomainBareJid jid : muc_domains) {\n\t\t\tif (isCancelled())\n\t\t\t\treturn;\n\t\t\tMap<EntityBareJid, HostedRoom> mucs = mucmgr.getRoomsHostedBy(jid);\n\t\t\tfor (HostedRoom muc : mucs.values()) {\n\t\t\t\tStatusMode sm = StatusMode.offline;\n\t\t\t\tString name = muc.getName();\n\t\t\t\tif (TextUtils.isEmpty(name))\n\t\t\t\t\tname = XMPPHelper.capitalizeString(muc.getJid().getLocalpart().toString());\n\t\t\t\tpublishProgress(new EntityInfo(EnumSet.of(EntityInfo.Type.MUC), muc.getJid().toString(), sm, 0, name, muc.getJid().toString(), 0, muc));\n\t\t\t}\n\n\t\t}\n\t}\n\n\tvoid loadServerList(XMPPConnection c, String muc_domains[]) throws Exception {\n\t\tServiceDiscoveryManager sdm = ServiceDiscoveryManager.getInstanceFor(c);\n\t\tpublishProgress((EntityInfo[])null);\n\t\tfor (String jid : muc_domains) {\n\t\t\tboolean is_matrix = jid.equals(XMPPHelper.MATRIX_BRIDGE);\n\t\t\tif (isCancelled())\n\t\t\t\treturn;\n\t\t\tDiscoverItems items = sdm.discoverItems(JidCreate.from(jid));\n\t\t\tfor (DiscoverItems.Item item : items.getItems()) {\n\t\t\t\tStatusMode sm = StatusMode.available;\n\t\t\t\tString name = item.getName();\n\t\t\t\tif (TextUtils.isEmpty(name)) {\n\t\t\t\t\tname = item.getEntityID().toString();\n\t\t\t\t}\n\t\t\t\tif (is_matrix)\n\t\t\t\t\tpublishProgress(new EntityInfo(EnumSet.of(EntityInfo.Type.MUC),\n\t\t\t\t\t\titem.getEntityID().toString(), sm, 0, name,\n\t\t\t\t\t\tXMPPHelper.jid2mxid(item.getEntityID().toString()), 0, item));\n\t\t\t\telse\n\t\t\t\t\tpublishProgress(new EntityInfo(EnumSet.of(EntityInfo.Type.Domain), item.getEntityID().toString(), sm, 0, name, \"\", 0, item));\n\t\t\t}\n\t\t\tif (is_matrix)\n\t\t\t\tcontinue;\n\t\t\t// second round: disco#info them all!\n\t\t\tfor (DiscoverItems.Item item : items.getItems()) {\n\t\t\t\tif (isCancelled())\n\t\t\t\t\treturn;\n\t\t\t\ttry {\n\t\t\t\t\tDiscoverInfo di = sdm.discoverInfo(item.getEntityID());\n\t\t\t\t\tpublishProgress(EntityInfo.fromDisco(item.getEntityID().toString(), di));\n\t\t\t\t} catch (Exception e) {\n\t\t\t\t\t// we can ignore this\n\t\t\t\t\te.printStackTrace();\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (isCancelled())\n\t\t\t\treturn;\n\n\t\t}\n\t}\n\n\tvoid loadMUClumbus(XMPPConnection c, String query) throws Exception {\n\t\tIQ search = MuclumbusIQ.searchFor(query);\n\t\t//search.setTo(JidCreate.from(\"rodrigo.de.mucobedo@dreckshal.de\"));\n\t\tsearch.setTo(JidCreate.from(\"muc@yax.im/bot\"));\n\t\tIQ result = c.sendIqRequestAndWaitForResponse(search);\n\t\tLog.d(\"MUClumbus\", result.toString());\n\t\tif (result.getType() == IQ.Type.error)\n\t\t\tthrow new XMPPException.XMPPErrorException(result, result.getError());\n\t\telse if (result instanceof MuclumbusResult) {\n\t\t\tMuclumbusResult r = (MuclumbusResult) result;\n\t\t\tpublishProgress((EntityInfo[])null);\n\t\t\tfor (MuclumbusResult.Item muc : r.getItems()) {\n\t\t\t\tStatusMode sm = muc.is_open ? StatusMode.available : StatusMode.dnd;\n\t\t\t\tString desc = muc.description;\n\t\t\t\tString lang = langToDisplay(muc.language);\n\t\t\t\tif (lang != null) {\n\t\t\t\t\tmuc.name = muc.name + \" (\" + lang + \")\";\n\t\t\t\t}\n\t\t\t\tpublishProgress(new EntityInfo(EnumSet.of(EntityInfo.Type.MUC, EntityInfo.Type.SearchResult),\n\t\t\t\t\t\tmuc.address.toString(), sm, 0, muc.name, desc, muc.nusers, muc));\n\t\t\t}\n\n\t\t}\n\t}\n\n\t/** run a query on the background thread.\n\t *\n\t * @param query search query to perform (domain JID or MUClumbus search query)\n\t * @return an error if something went wrong or null\n\t */\n\t@Override\n\tprotected Throwable doInBackground(String... query) {\n\t\tif (query.length > 0)\n\t\t\tsearch = query[0];\n\t\tXMPPConnection c = YaximApplication.getInstance().getSmackable().getConnection();\n\t\ttry {\n\t\t\tswitch (mode) {\n\t\t\t\tcase MODE_BOOKMARKS:\n\t\t\t\t\tloadBookmarksOrThrow(c);\n\t\t\t\t\tbreak;\n\t\t\t\tcase MODE_DOMAIN:\n\t\t\t\t\tloadServerList(c, query);\n\t\t\t\t\tbreak;\n\t\t\t\tcase MODE_MUCLUMBUS:\n\t\t\t\t\tloadMUClumbus(c, query[0]);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t} catch (Exception e) {\n\t\t\treturn e;\n\t\t}\n\t\treturn null;\n\t}\n\n\t/** foreground sibling of publishProgress.\n\t *\n\t * @param ei entity to add to the list\n\t *    Semantics of the parameter:\n\t *      - no parameter - empty the underlying list, e.g. when we want to re-populate\n\t *      - null parameter - ignore\n\t *      - EntityInfo parameter - add/update ei to the underlying list and notify\n\t */\n\t@Override\n\tprotected void onProgressUpdate(EntityInfo... ei) {\n\t\tif (ei != null && ei.length > 0) {\n\t\t\t// EntityInfo.fromDisco() will return null sometimes\n\t\t\tif (ei[0] == null)\n\t\t\t\treturn;\n\t\t\tel.add(ei[0], true);\n\t\t} else\n\t\t\tel.clear();\n\t}\n\n\t@Override\n\tprotected void onPostExecute(Throwable ex) {\n\t\tif (ex != null) {\n\t\t\tel.setError(ex);\n\t\t\treturn;\n\t\t}\n\t\tel.finishLoading();\n\t}\n\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/list/EntityViewLoader.java",
    "content": "package org.yaxim.androidclient.list;\n\nimport android.app.Activity;\nimport android.os.AsyncTask;\nimport android.view.LayoutInflater;\nimport android.view.View;\n\nimport org.jivesoftware.smack.XMPPConnection;\nimport org.jivesoftware.smack.XMPPException;\nimport org.jivesoftware.smack.packet.StanzaError;\nimport org.jivesoftware.smackx.disco.ServiceDiscoveryManager;\nimport org.jivesoftware.smackx.disco.packet.DiscoverInfo;\nimport org.jivesoftware.smackx.vcardtemp.VCardManager;\nimport org.jivesoftware.smackx.vcardtemp.packet.VCard;\nimport org.jxmpp.jid.Jid;\nimport org.jxmpp.jid.impl.JidCreate;\nimport org.yaxim.androidclient.YaximApplication;\nimport org.yaxim.androidclient.data.EntityInfo;\n\n/**\n * AsyncTask for loading info about a given JID, and storing it into an entity view.\n *\n */\nclass EntityViewLoader extends AsyncTask<String, EntityInfo, Throwable> {\n\tString search;\n\tLayoutInflater inflater;\n\tView view;\n\n\tpublic EntityViewLoader(Activity act, View view) {\n\t\tinflater = (LayoutInflater) act.getSystemService(act.LAYOUT_INFLATER_SERVICE);\n\t\tthis.view = view;\n\t}\n\n\tvoid loadJid(XMPPConnection c, String jid) throws Exception {\n\t\t// validate that it's a bare JID or a domain JID\n\t\tJid smackJid;\n\t\ttry {\n\t\t\tsmackJid = JidCreate.from(jid);\n\t\t} catch (Exception e) {\n\t\t\tpublishProgress((EntityInfo[])null);\n\t\t\treturn;\n\t\t}\n\t\tServiceDiscoveryManager sm = ServiceDiscoveryManager.getInstanceFor(c);\n\t\ttry {\n\t\t\tDiscoverInfo di = sm.discoverInfo(smackJid);\n\t\t\tpublishProgress(EntityInfo.fromDisco(jid, di));\n\t\t} catch (XMPPException.XMPPErrorException e) {\n\t\t\tswitch (e.getStanzaError().getCondition()) {\n\t\t\tcase remote_server_not_found: // user hasn't finished typing yet\n\t\t\t\tpublishProgress((EntityInfo[])null);\n\t\t\t\tbreak;\n\t\t\tcase service_unavailable: // this is maybe a user account\n\t\t\tcase subscription_required: // this is probably a user account (from ejabberd)\n\t\t\t\tpublishProgress(EntityInfo.fromJid(jid));\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t}\n\t\ttry {\n\t\t\tVCard vc = VCardManager.getInstanceFor(c).loadVCard(smackJid.asEntityBareJidOrThrow());\n\t\t\tString nick = vc.getNickName();\n\t\t\tString fn = vc.getField(\"FN\");\n\t\t\tString name;\n\t\t\tif (nick.length() > 0 && fn.length() > 0)\n\t\t\t\tname = nick + \" (\" + fn + \")\";\n\t\t\telse if (nick.length() > 0)\n\t\t\t\tname = nick;\n\t\t\telse if (fn.length() > 0)\n\t\t\t\tname = fn;\n\t\t\telse return;\n\t\t\tpublishProgress(EntityInfo.fromJidName(jid, name));\n\t\t} catch (Exception e2) {\n\t\t\t// ignore\n\t\t}\n\t}\n\n\t@Override\n\tprotected Throwable doInBackground(String... param) {\n\t\tif (param.length > 0 && param[0].length() > 0) {\n\t\t\tsearch = param[0];\n\t\t\tXMPPConnection c = YaximApplication.getInstance().getSmackable().getConnection();\n\t\t\ttry {\n\t\t\t\tloadJid(c, search);\n\t\t\t} catch (Exception e) {\n\t\t\t\tpublishProgress(EntityInfo.fromError(e));\n\t\t\t}\n\t\t} else publishProgress((EntityInfo[])null);\n\t\treturn null;\n\t}\n\n\t@Override\n\tprotected void onProgressUpdate(EntityInfo... pp) {\n\t\tif (view == null && pp == null)\n\t\t\treturn; // nothing to do\n\t\telse if (view != null) {\n\t\t\tint v = (pp == null) ? View.GONE : View.VISIBLE;\n\t\t\tEntityInfo ei = (pp != null) ? pp[0] : new EntityInfo();\n\t\t\tview = EntityListAdapter.getChildView(inflater, ei, false, view, null);\n\t\t\tview.setVisibility(v);\n\t\t}\n\t}\n\n\t@Override\n\tprotected void onPostExecute(Throwable ex) {\n\t}\n\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/list/SearchActivity.java",
    "content": "package org.yaxim.androidclient.list;\n\nimport android.os.Bundle;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.widget.ExpandableListView;\nimport android.widget.LinearLayout;\n\nimport org.yaxim.androidclient.R;\nimport org.yaxim.androidclient.data.EntityInfo;\nimport org.yaxim.androidclient.data.EntityList;\nimport org.yaxim.androidclient.util.XMPPHelper;\n\n/**\n * Activity used to search for JIDs, MUCs, etc.\n *\n * This provides access to:\n *   - a small \"popup\" view with details for entered JIDs\n *   - a (search query filtered) bookmarks list\n *   - MUC search from MUClumbus\n */\n\npublic class SearchActivity extends EntityListActivity {\n\tEntityList bookmarks;\n\tEntityList search;\n\tEntityListLoader mucSearchLoader;\n\tEntityViewLoader jidLoader;\n\tView jidView;\n\n\t@Override\n\tprotected void onCreate(Bundle savedInstanceState) {\n\t\tsearchByDefault = true;\n\t\tsuper.onCreate(savedInstanceState);\n\t\tsv.setQueryHint(getString(android.R.string.search_go));\n\n\t\t// initialize and auto-load bookmarks\n\t\tbookmarks = new EntityList(ela, getString(R.string.group_bookmarks));\n\t\tela.add(bookmarks);\n\t\tnew EntityListLoader(EntityListLoader.MODE_BOOKMARKS, bookmarks).execute();\n\n\t\t// initialize MUC search and delay loading until user taps\n\t\tsearch = new EntityList(ela, getString(R.string.group_mucsearch));\n\t\tela.add(search);\n\n\t\t// initialize head view for direct JID addition\n\t\tLayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);\n\t\tjidView = EntityListAdapter.getChildView(inflater, new EntityInfo(), false, null, elv);\n\t\tjidView.setVisibility(View.GONE);\n\t\tjidView.setOnClickListener(new View.OnClickListener() {\n\t\t\t@Override\n\t\t\tpublic void onClick(View view) {\n\t\t\t\tEntityListAdapter.EntityHolder eh = (EntityListAdapter.EntityHolder) view.getTag();\n\t\t\t\tonEntityClick(eh.ei);\n\t\t\t}\n\t\t});\n\t\t//Android sucks: you can't have a GONE HeaderView!?!\n\t\t//elv.addHeaderView(jidView);\n\t\t((LinearLayout)findViewById(R.id.muclist_layout)).addView(jidView, 0);\n\n\t\telv.setAdapter(ela);\n\t\t// start MUC search on group expansion, because privacy and bot load\n\t\telv.setOnGroupExpandListener(\n\t\t\t\tnew ExpandableListView.OnGroupExpandListener() {\n\t\t\t\t\tpublic void onGroupExpand(int groupPosition) {\n\t\t\t\t\t\tswitch (groupPosition) {\n\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\tif (mucSearchLoader != null)\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\tmucSearchLoader = new EntityListLoader(EntityListLoader.MODE_MUCLUMBUS, search);\n\t\t\t\t\t\t\t\tinitiateMUCSearch(sv.getQuery().toString());\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t}\n\n\t@Override\n\tprotected void onResume() {\n\t\tsuper.onResume();\n\t\t// auto-expand bookmarks\n\t\telv.expandGroup(0);\n\t}\n\n\tprotected void initiateMUCSearch(String query) {\n\t\tif (mucSearchLoader == null)\n\t\t\treturn; // user didn't enable remote search yet\n\t\tif (mucSearchLoader.search != null && mucSearchLoader.search.equals(query))\n\t\t\treturn; // no need to reload the same list\n\t\tmucSearchLoader.cancel(true);\n\t\tmucSearchLoader = new EntityListLoader(EntityListLoader.MODE_MUCLUMBUS, search);\n\t\tmucSearchLoader.execute(query);\n\t}\n\n\t@Override\n\tpublic void searchLater(String query) {\n\t\tquery = XMPPHelper.mxid2jid(query);\n\t\tif (jidLoader != null) {\n\t\t\tjidLoader.cancel(true);\n\t\t}\n\t\tjidLoader = new EntityViewLoader(SearchActivity.this, jidView);\n\t\tjidLoader.execute(query);\n\t\tinitiateMUCSearch(query);\n\t}\n\n\t@Override\n\tpublic void searchNow(String query) {\n\t\tbookmarks.getFilter().filter(query);\n\t}\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/list/ServiceDiscoveryActivity.java",
    "content": "package org.yaxim.androidclient.list;\n\nimport android.os.Bundle;\n\nimport org.yaxim.androidclient.R;\nimport org.yaxim.androidclient.data.EntityList;\nimport org.yaxim.androidclient.util.XMPPHelper;\n\n/**\n * An activity to browse the Service Discovery (disco#items) list on a JID.\n */\npublic class ServiceDiscoveryActivity extends EntityListActivity {\n\tString jid;\n\tEntityList results;\n\n\t@Override\n\tprotected void onCreate(Bundle savedInstanceState) {\n\t\tsuper.onCreate(savedInstanceState);\n\t\tif (getIntent().getData() == null) {\n\t\t\tfinish();\n\t\t\treturn;\n\t\t}\n\t\tjid = getIntent().getDataString();\n\t\tresults = new EntityList(ela, XMPPHelper.jid2mxid(jid));\n\t\tela.add(results);\n\t\telv.setAdapter(ela);\n\t\tnew EntityListLoader(EntityListLoader.MODE_DOMAIN, results).execute(jid);\n\t\tif (jid.equals(XMPPHelper.MATRIX_BRIDGE))\n\t\t\tsetTitle(getString(R.string.Menu_matrix));\n\t\telse\n\t\t\tsetTitle(getString(R.string.title_service_disco, XMPPHelper.jid2mxid(jid)));\n\t\tsv.setQueryHint(getString(android.R.string.search_go));\n\n\t}\n\n\t@Override\n\tprotected void onResume() {\n\t\tsuper.onResume();\n\t\telv.expandGroup(0);\n\t}\n\t@Override\n\tpublic void searchNow(String query) {\n\t\tresults.getFilter().filter(query);\n\t}\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/packet/InviteRegister.java",
    "content": "package org.yaxim.androidclient.packet;\n\nimport org.jivesoftware.smack.packet.ExtensionElement;\nimport org.jivesoftware.smack.provider.ExtensionElementProvider;\nimport org.jivesoftware.smack.util.XmlStringBuilder;\nimport org.xmlpull.v1.XmlPullParser;\n\npublic class InviteRegister implements ExtensionElement {\n\tpublic final static String NAMESPACE = \"urn:xmpp:invite\";\n\tpublic final static String ELEMENT = \"register\";\n\t@Override\n\tpublic String getNamespace() {\n\t\treturn NAMESPACE;\n\t}\n\n\t@Override\n\tpublic String getElementName() {\n\t\treturn ELEMENT;\n\t}\n\n\t@Override\n\tpublic CharSequence toXML(String enclosingNamespace) {\n\t\tXmlStringBuilder xml = new XmlStringBuilder(this);\n\t\txml.closeEmptyElement();\n\t\treturn xml;\n\t}\n\n\tpublic static class StreamFeatureProvider extends ExtensionElementProvider<ExtensionElement> {\n\t\t@Override\n\t\tpublic InviteRegister parse(XmlPullParser parser, int initialDepth) throws Exception {\n\t\t\treturn new InviteRegister();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/packet/MuclumbusIQ.java",
    "content": "package org.yaxim.androidclient.packet;\n\nimport org.jivesoftware.smack.packet.IQ;\nimport org.jivesoftware.smack.provider.IQProvider;\nimport org.jivesoftware.smackx.xdata.FormField;\nimport org.jivesoftware.smackx.xdata.packet.DataForm;\nimport org.jivesoftware.smackx.xdata.provider.DataFormProvider;\nimport org.xmlpull.v1.XmlPullParser;\n\n/**\n * Implements the protocol currently used to search MUCs on a MUClumbus bot.\n *\n * This part is the request IQ and parser.\n *\n * Documentation at https://search.jabber.network/docs/api\n *\n * @author Georg Lukas\n */\n\npublic class MuclumbusIQ extends IQ {\n\tpublic final static String ELEMENT = \"search\";\n\tpublic final static String NAMESPACE = \"https://xmlns.zombofant.net/muclumbus/search/1.0\";\n\n\tDataForm searchform;\n\n\t/** Create a Muclumbus request IQ with a pre-filled data form.\n\t *\n\t * @param searchform the request data form to send to the search bot\n\t */\n\tpublic MuclumbusIQ(DataForm searchform) {\n\t\tsuper(ELEMENT, NAMESPACE);\n\t\tthis.searchform = searchform;\n\t\tif (searchform != null)\n\t\t\taddExtension(searchform);\n\t}\n\tpublic MuclumbusIQ() {\n\t\tthis(null);\n\t}\n\n\n\t/** Create a default search request for a given query string.\n\t *\n\t * This will return a pre-filled request to search for a string, with the\n\t * results sorted by number of users (a.k.a. relevance).\n\t *\n\t * @param query string to search for\n\t *\n\t * @return an IQ that can be sent to the search bot\n\t */\n\tpublic static MuclumbusIQ searchFor(String query) {\n\t\tDataForm sf = new DataForm(DataForm.Type.submit);\n\t\tFormField fieldType = new FormField(FormField.FORM_TYPE);\n\t\tfieldType.setType(FormField.Type.hidden);\n\t\tfieldType.addValue(NAMESPACE + \"#params\");\n\t\tsf.addField(fieldType);\n\t\tFormField fieldKey = new FormField(\"key\");\n\t\tfieldKey.addValue(\"nusers\");\n\t\tsf.addField(fieldKey);\n\t\tFormField queryKey = new FormField(\"q\");\n\t\tqueryKey.addValue(query);\n\t\tsf.addField(queryKey);\n\t\treturn new MuclumbusIQ(sf);\n\t}\n\n\tpublic DataForm getSearchForm() {\n\t\treturn searchform;\n\t}\n\n\t@Override\n\tprotected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) {\n\t\txml.rightAngleBracket();\n\t\treturn xml;\n\t}\n\n\tpublic static class Provider extends IQProvider<MuclumbusIQ> {\n\t\t@Override\n\t\tpublic MuclumbusIQ parse(XmlPullParser parser, int initialDepth) throws Exception {\n\t\t\tDataForm dataForm = null;\n\n\t\t\touterloop: while (true) {\n\t\t\t\tfinal int eventType = parser.next();\n\t\t\t\tfinal String name = parser.getName();\n\n\t\t\t\tswitch (eventType) {\n\t\t\t\t\tcase XmlPullParser.START_TAG:\n\t\t\t\t\t\tswitch (name) {\n\t\t\t\t\t\t\tcase DataForm.ELEMENT:\n\t\t\t\t\t\t\t\tdataForm = DataFormProvider.INSTANCE.parse(parser);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase XmlPullParser.END_TAG:\n\t\t\t\t\t\tif (parser.getDepth() == initialDepth) {\n\t\t\t\t\t\t\tbreak outerloop;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn new MuclumbusIQ(dataForm);\n\t\t}\n\n\t}\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/packet/MuclumbusResult.java",
    "content": "/**\n *\n * Copyright 2003-2007 Jive Software.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\npackage org.yaxim.androidclient.packet;\n\nimport org.jivesoftware.smack.packet.IQ;\nimport org.jivesoftware.smack.packet.SimpleIQ;\nimport org.jivesoftware.smack.provider.IQProvider;\n\nimport org.jxmpp.jid.EntityBareJid;\nimport org.jxmpp.jid.impl.JidCreate;\nimport org.xmlpull.v1.XmlPullParser;\nimport org.xmlpull.v1.XmlPullParserException;\n\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Implements the protocol currently used to search MUCs on a MUClumbus bot.\n *\n * This part is the response IQ and parser.\n *\n * Documentation at https://search.jabber.network/docs/api\n *\n * @author Georg Lukas\n */\npublic class MuclumbusResult extends SimpleIQ {\n\n    public static final String ELEMENT = \"result\";\n\n    /**\n     * List of search result items.\n     */\n    List<Item> items;\n\n    /**\n     * Creates a new IQ result with a list of search result items.\n     */\n    public MuclumbusResult(List<Item> items) {\n        super(ELEMENT, MuclumbusIQ.NAMESPACE);\n        this.items = items;\n    }\n\n    /**\n     * Obtain the search results.\n     *\n     * @return the list of search results from this response\n     */\n    public List<Item> getItems() {\n        return items;\n    }\n\n    public static class Item {\n        public EntityBareJid address;\n        public String name;\n        public String description;\n        public int nusers;\n        public String language;\n        public boolean is_open;\n        public String anonymity_mode;\n    }\n\n    /** Parse an individual <item/> from the XML parser.\n     *\n     */\n    protected static Item parseItem(XmlPullParser parser, EntityBareJid jid) throws XmlPullParserException, IOException {\n        boolean done = false;\n        Item item = new Item();\n        item.address = jid;\n        while (!done) {\n            int eventType = parser.next();\n            if ((eventType == XmlPullParser.START_TAG) && (\"name\".equals(parser.getName()))) {\n                item.name = parser.nextText();\n            }\n            else if ((eventType == XmlPullParser.START_TAG) && (\"description\".equals(parser.getName()))) {\n                item.description = parser.nextText();\n            }\n            else if ((eventType == XmlPullParser.START_TAG) && (\"nusers\".equals(parser.getName()))) {\n                item.nusers = Integer.valueOf(parser.nextText()).intValue();\n            }\n            else if ((eventType == XmlPullParser.START_TAG) && (\"language\".equals(parser.getName()))) {\n                item.language = parser.nextText();\n            }\n            else if ((eventType == XmlPullParser.START_TAG) && (\"is-open\".equals(parser.getName()))) {\n                item.is_open = true;\n            }\n            else if ((eventType == XmlPullParser.START_TAG) && (\"anonymity-mode\".equals(parser.getName()))) {\n                item.anonymity_mode = parser.nextText();\n            }\n            else if (eventType == XmlPullParser.END_TAG && \"item\".equals(parser.getName())) {\n                done = true;\n            }\n        }\n        return item;\n\t}\n\n    /**\n     * Result parsing Provider.\n     */\n    public static class Provider extends IQProvider<IQ> {\n        @Override\n        public IQ parse(XmlPullParser parser, int initialDepth) throws Exception {\n            ArrayList<Item> items = new ArrayList<>();\n\n            boolean done = false;\n\n            while (!done) {\n                int eventType = parser.next();\n                if (eventType == XmlPullParser.START_TAG && parser.getName().equals(\"item\")) {\n                    EntityBareJid jid = JidCreate.entityBareFrom(parser.getAttributeValue(\"\", \"address\"));\n                    items.add(parseItem(parser, jid));\n                }\n                else if (eventType == XmlPullParser.END_TAG && parser.getName().equals(ELEMENT)) {\n                    done = true;\n                }\n            }\n            return new MuclumbusResult(items);\n        }\n    }\n\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/packet/Oob.java",
    "content": "package org.yaxim.androidclient.packet;\n\nimport org.bouncycastle.asn1.cmp.OOBCertHash;\nimport org.jivesoftware.smack.packet.ExtensionElement;\nimport org.jivesoftware.smack.provider.ExtensionElementProvider;\nimport org.jivesoftware.smack.util.StringUtils;\nimport org.jivesoftware.smack.util.XmlStringBuilder;\nimport org.xmlpull.v1.XmlPullParser;\n\n/**\n * XEP-0066: Out-of-Band Data\n * Used to inform HTTP Upload capable clients of an inline image\n *\n * TODO: implement <desc/>\n */\n\npublic class Oob implements ExtensionElement {\n\tpublic final static String NAMESPACE = \"jabber:x:oob\";\n\tpublic final static String ELEMENT = \"x\";\n\tprivate String url;\n\tprivate String desc;\n\n\tpublic Oob(String url) {\n\t\tthis.url = url;\n\t}\n\n\tpublic Oob(String url, String desc) {\n\t\tthis.url = url;\n\t\tthis.desc = desc;\n\t}\n\n\tpublic String getElementName() {\n\t\treturn ELEMENT;\n\t}\n\n\tpublic String getNamespace() {\n\t\treturn NAMESPACE;\n\t}\n\n\tpublic String getUrl() {\n\t\treturn url;\n\t}\n\n\tpublic void setUrl(String url) {\n\t\tthis.url = StringUtils.requireNotNullOrEmpty(url, \"URL must not be empty\");\n\t}\n\n\tpublic String getDesc() {\n\t\treturn desc;\n\t}\n\n\tpublic void setDesc(String desc) {\n\t\tthis.desc = desc;\n\t}\n\n\tpublic CharSequence toXML(String enclosingNamespace) {\n\t\tXmlStringBuilder xml = new XmlStringBuilder(this);\n\t\txml.rightAngleBracket().element(\"url\", url);\n\t\tif (StringUtils.isNotEmpty(desc))\n\t\t\txml.element(\"desc\", desc);\n\t\txml.closeElement(ELEMENT);\n\t\treturn xml;\n\t}\n\n\tpublic static class Provider extends ExtensionElementProvider<Oob> {\n\t\tpublic Oob parse(XmlPullParser parser, int initialDepth) throws Exception {\n\t\t\tString url = null;\n\t\t\tString desc = null;\n\t\t\tboolean done = false;\n\t\t\twhile (!done) {\n\t\t\t\tparser.next();\n\t\t\t\tString elementName = parser.getName();\n\t\t\t\tif (parser.getEventType() == XmlPullParser.START_TAG) {\n\t\t\t\t\tif (\"url\".equals(elementName)) {\n\t\t\t\t\t\turl = parser.nextText();\n\t\t\t\t\t} else if (\"desc\".equals(elementName)) {\n\t\t\t\t\t\tdesc = parser.nextText();\n\t\t\t\t\t}\n\t\t\t\t} else if (parser.getEventType() == XmlPullParser.END_TAG && ELEMENT.equals(elementName)) {\n\t\t\t\t\tdone = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn new Oob(url, desc);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/packet/PreAuth.java",
    "content": "package org.yaxim.androidclient.packet;\r\n\r\nimport org.jivesoftware.smack.packet.ExtensionElement;\r\nimport org.jivesoftware.smack.packet.IQ;\r\nimport org.jivesoftware.smack.provider.ExtensionElementProvider;\r\n\r\nimport org.jivesoftware.smack.util.StringUtils;\r\nimport org.jivesoftware.smack.util.XmlStringBuilder;\r\nimport org.xmlpull.v1.XmlPullParser;\r\n\r\npublic class PreAuth implements ExtensionElement {\r\n\tpublic final static String NAMESPACE = \"urn:xmpp:pars:0\";\r\n\tpublic final static String ELEMENT = \"preauth\";\r\n\tprivate String token;\r\n\r\n\tpublic PreAuth(String token) {\r\n\t\tthis.token = token;\r\n\t}\r\n\r\n\tpublic String getElementName() {\r\n\t\treturn ELEMENT;\r\n\t}\r\n\r\n\tpublic String getNamespace() {\r\n\t\treturn NAMESPACE;\r\n\t}\r\n\r\n\tpublic String getToken() {\r\n\t\treturn token;\r\n\t}\r\n\r\n\t@Override\r\n\tpublic CharSequence toXML(String enclosingNamespace) {\r\n\t\tXmlStringBuilder xml = new XmlStringBuilder(this);\r\n\t\txml.attribute(\"token\", token);\r\n\t\txml.closeEmptyElement();\r\n\t\treturn xml;\r\n\t}\r\n\r\n\tpublic static class Provider extends ExtensionElementProvider<PreAuth> {\r\n\t\tpublic PreAuth parse(XmlPullParser parser, int initialDepth) throws Exception {\r\n\t\t\treturn new PreAuth(parser.getAttributeValue(null, \"token\"));\r\n\t\t}\r\n\t}\r\n\r\n\tpublic static class PreAuthIQ extends IQ {\r\n\t\tprivate String token;\r\n\r\n\t\tpublic PreAuthIQ(String token) {\r\n\t\t\tsuper(ELEMENT, NAMESPACE);\r\n\t\t\tthis.token = token;\r\n\t\t\tthis.setType(Type.set);\r\n\t\t}\r\n\r\n\t\t@Override\r\n\t\tprotected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) {\r\n\t\t\txml.optAttribute(\"token\", token);\r\n\t\t\txml.setEmptyElement();\r\n\t\t\treturn xml;\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "src/org/yaxim/androidclient/preferences/AccountPrefs.java",
    "content": "package org.yaxim.androidclient.preferences;\n\nimport org.yaxim.androidclient.YaximApplication;\nimport org.yaxim.androidclient.dialogs.ChangePasswordDialog;\nimport org.yaxim.androidclient.exceptions.YaximXMPPAdressMalformedException;\nimport org.yaxim.androidclient.util.PreferenceConstants;\nimport org.yaxim.androidclient.util.XMPPHelper;\n\nimport android.content.Intent;\nimport android.content.SharedPreferences;\nimport android.os.Bundle;\nimport android.preference.EditTextPreference;\nimport android.preference.Preference;\nimport android.preference.Preference.OnPreferenceClickListener;\nimport android.preference.PreferenceManager;\nimport android.text.Editable;\nimport android.text.TextWatcher;\n\nimport android.view.MenuItem;\nimport android.support.v7.app.ActionBar;\n\n\nimport org.yaxim.androidclient.R;\n\npublic class AccountPrefs extends AppCompatPreferenceActivity {\n\n\tprivate SharedPreferences sharedPreference;\n\n\tprivate static int prioIntValue = 0;\n\n\tprivate EditTextPreference prefPrio;\n\tprivate EditTextPreference prefAccountID;\n\n\tpublic void onCreate(Bundle savedInstanceState) {\n\t\tsetTheme(YaximApplication.getConfig().getTheme());\n\t\tsuper.onCreate(savedInstanceState);\n\t\taddPreferencesFromResource(R.xml.accountprefs);\n\n\t\tActionBar actionBar = getSupportActionBar();\n\t\tactionBar.setHomeButtonEnabled(true);\n\t\tactionBar.setDisplayHomeAsUpEnabled(true);\n\n\t\tsharedPreference = PreferenceManager.getDefaultSharedPreferences(this);\n\n\t\tthis.prefAccountID = (EditTextPreference) findPreference(PreferenceConstants.JID);\n\t\tthis.prefAccountID.getEditText().addTextChangedListener(\n\t\t\t\tnew TextWatcher() {\n\t\t\t\t\tpublic void afterTextChanged(Editable s) {\n\t\t\t\t\t\t// Nothing\n\t\t\t\t\t}\n\n\t\t\t\t\tpublic void beforeTextChanged(CharSequence s, int start,\n\t\t\t\t\t\t\tint count, int after) {\n\t\t\t\t\t\t// Nothing\n\t\t\t\t\t}\n\n\t\t\t\t\tpublic void onTextChanged(CharSequence s, int start,\n\t\t\t\t\t\t\tint before, int count) {\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tXMPPHelper.verifyJabberID(s.toString());\n\t\t\t\t\t\t\tprefAccountID.getEditText().setError(null);\n\t\t\t\t\t\t} catch (YaximXMPPAdressMalformedException e) {\n\t\t\t\t\t\t\tprefAccountID.getEditText().setError(getString(R.string.Global_JID_malformed));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\tthis.prefPrio = (EditTextPreference) findPreference(PreferenceConstants.PRIORITY);\n\t\tthis.prefPrio\n\t\t\t\t.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {\n\t\t\t\t\tpublic boolean onPreferenceChange(Preference preference,\n\t\t\t\t\t\t\tObject newValue) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tint prioIntValue = Integer.parseInt(newValue\n\t\t\t\t\t\t\t\t\t.toString());\n\t\t\t\t\t\t\tif (prioIntValue <= 127 && prioIntValue >= -128) {\n\t\t\t\t\t\t\t\tsharedPreference.edit().putInt(PreferenceConstants.PRIORITY,\n\t\t\t\t\t\t\t\t\t\tprioIntValue);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tsharedPreference.edit().putInt(PreferenceConstants.PRIORITY, 0);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t\t} catch (NumberFormatException ex) {\n\t\t\t\t\t\t\tsharedPreference.edit().putInt(PreferenceConstants.PRIORITY, 0);\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\tthis.prefPrio.getEditText().addTextChangedListener(new TextWatcher() {\n\t\t\tpublic void afterTextChanged(Editable s) {\n\t\t\t\ttry {\n\t\t\t\t\tprioIntValue = Integer.parseInt(s.toString());\n\t\t\t\t\tif (prioIntValue <= 127 && prioIntValue >= -128) {\n\t\t\t\t\t\tprefPrio.getEditText().setError(null);\n\t\t\t\t\t\tprefPrio.setPositiveButtonText(android.R.string.ok);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tprefPrio.getEditText().setError(getString(R.string.account_prio_error));\n\t\t\t\t\t}\n\t\t\t\t} catch (NumberFormatException numF) {\n\t\t\t\t\tprioIntValue = 0;\n\t\t\t\t\tprefPrio.getEditText().setError(getString(R.string.account_prio_error));\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tpublic void beforeTextChanged(CharSequence s, int start, int count,\n\t\t\t\t\tint after) {\n\t\t\t\t// Nothing\n\t\t\t}\n\n\t\t\tpublic void onTextChanged(CharSequence s, int start, int before,\n\t\t\t\t\tint count) {\n\n\t\t\t}\n\n\t\t});\n\n\t\tfindPreference(PreferenceConstants.PASSWORD).setOnPreferenceClickListener(new OnPreferenceClickListener() {\n\t\t\tpublic boolean onPreferenceClick(Preference preference) {\n\t\t\t\tnew ChangePasswordDialog(AccountPrefs.this).show();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t});\n\t}\n\n\t@Override\n\tpublic boolean onOptionsItemSelected(MenuItem item) {\n\t\tswitch (item.getItemId()) {\n\t\tcase android.R.id.home:\n\t\t\tIntent intent = new Intent(this, MainPrefs.class);\n\t\t\tintent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);\n\t\t\tstartActivity(intent);\n\t\t\treturn true;\n\t\tdefault:\n\t\t\treturn super.onOptionsItemSelected(item);\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/preferences/AppCompatPreferenceActivity.java",
    "content": "/*\n * Copyright (C) 2014 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage org.yaxim.androidclient.preferences;\n\nimport android.content.res.Configuration;\nimport android.os.Bundle;\nimport android.preference.PreferenceActivity;\nimport android.support.annotation.LayoutRes;\nimport android.support.annotation.Nullable;\nimport android.support.v7.app.ActionBar;\nimport android.support.v7.app.AppCompatDelegate;\nimport android.support.v7.widget.Toolbar;\nimport android.view.MenuInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\n/**\n * A {@link android.preference.PreferenceActivity} which implements and proxies the necessary calls\n * to be used with AppCompat.\n *\n * This technique can be used with an {@link android.app.Activity} class, not just\n * {@link android.preference.PreferenceActivity}.\n */\npublic abstract class AppCompatPreferenceActivity extends PreferenceActivity {\n\n    private AppCompatDelegate mDelegate;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        getDelegate().installViewFactory();\n        getDelegate().onCreate(savedInstanceState);\n        super.onCreate(savedInstanceState);\n    }\n\n    @Override\n    protected void onPostCreate(Bundle savedInstanceState) {\n        super.onPostCreate(savedInstanceState);\n        getDelegate().onPostCreate(savedInstanceState);\n    }\n\n    public ActionBar getSupportActionBar() {\n        return getDelegate().getSupportActionBar();\n    }\n\n    public void setSupportActionBar(@Nullable Toolbar toolbar) {\n        getDelegate().setSupportActionBar(toolbar);\n    }\n\n    @Override\n    public MenuInflater getMenuInflater() {\n        return getDelegate().getMenuInflater();\n    }\n\n    @Override\n    public void setContentView(@LayoutRes int layoutResID) {\n        getDelegate().setContentView(layoutResID);\n    }\n\n    @Override\n    public void setContentView(View view) {\n        getDelegate().setContentView(view);\n    }\n\n    @Override\n    public void setContentView(View view, ViewGroup.LayoutParams params) {\n        getDelegate().setContentView(view, params);\n    }\n\n    @Override\n    public void addContentView(View view, ViewGroup.LayoutParams params) {\n        getDelegate().addContentView(view, params);\n    }\n\n    @Override\n    protected void onPostResume() {\n        super.onPostResume();\n        getDelegate().onPostResume();\n    }\n\n    @Override\n    protected void onTitleChanged(CharSequence title, int color) {\n        super.onTitleChanged(title, color);\n        getDelegate().setTitle(title);\n    }\n\n    @Override\n    public void onConfigurationChanged(Configuration newConfig) {\n        super.onConfigurationChanged(newConfig);\n        getDelegate().onConfigurationChanged(newConfig);\n    }\n\n    @Override\n    protected void onStop() {\n        super.onStop();\n        getDelegate().onStop();\n    }\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n        getDelegate().onDestroy();\n    }\n\n    public void invalidateOptionsMenu() {\n        getDelegate().invalidateOptionsMenu();\n    }\n\n    private AppCompatDelegate getDelegate() {\n        if (mDelegate == null) {\n            mDelegate = AppCompatDelegate.create(this, null);\n        }\n        return mDelegate;\n    }\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/preferences/EditTextPreferenceWithValue.java",
    "content": "package org.yaxim.androidclient.preferences;\n\nimport android.content.Context;\nimport android.preference.EditTextPreference;\nimport android.util.AttributeSet;\nimport android.view.View;\n\npublic class EditTextPreferenceWithValue extends EditTextPreference {\n\tCharSequence mSummary;\n\n\tpublic EditTextPreferenceWithValue(Context context, AttributeSet attrs) {\n\t\tsuper(context, attrs);\n\t}\n\n\tpublic EditTextPreferenceWithValue(Context context) {\n\t\tsuper(context);\n\t}\n\n\tprivate void setSummaryToText(String text) {\n\t\tif (mSummary == null)\n\t\t\tmSummary = getSummary();\n\t\tif (text == null || text.length() == 0)\n\t\t\tsetSummary(mSummary);\n\t\telse\n\t\t\tsetSummary(text);\n\t}\n\t@Override\n\tprotected void onBindView(View view) {\n\t\tsuper.onBindView(view);\n\t\tsetSummaryToText(getText());\n\t}\n\n\t@Override\n\tpublic void setText(String text) {\n\t\tsuper.setText(text);\n\t\tsetSummaryToText(text);\n\t}\n\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/preferences/MainPrefs.java",
    "content": "package org.yaxim.androidclient.preferences;\n\nimport android.content.Intent;\nimport android.content.SharedPreferences;\nimport android.os.Build;\nimport android.os.Bundle;\n\nimport android.preference.CheckBoxPreference;\nimport android.preference.PreferenceManager;\nimport android.view.MenuItem;\nimport android.support.v7.app.ActionBar;\n\nimport org.yaxim.androidclient.MainWindow;\nimport org.yaxim.androidclient.R;\nimport org.yaxim.androidclient.YaximApplication;\nimport org.yaxim.androidclient.util.PreferenceConstants;\n\npublic class MainPrefs extends AppCompatPreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener {\n\tpublic void onCreate(Bundle savedInstanceState) {\n\t\tsetTheme(YaximApplication.getConfig().getTheme());\n\t\tsuper.onCreate(savedInstanceState);\n\t\taddPreferencesFromResource(R.xml.mainprefs);\n\t\tif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n\t\t\tCheckBoxPreference foreground = (CheckBoxPreference)findPreference(PreferenceConstants.FOREGROUND);\n\t\t\tforeground.setEnabled(false);\n\t\t\tforeground.setChecked(true);\n\t\t}\n\n\t\tActionBar actionBar = getSupportActionBar();\n\t\tactionBar.setHomeButtonEnabled(true);\n\t\tactionBar.setDisplayHomeAsUpEnabled(true);\n\t\t// track theme changes dynamically\n\t\tPreferenceManager.getDefaultSharedPreferences(this)\n\t\t\t\t.registerOnSharedPreferenceChangeListener(this);\n\t}\n\n\t@Override\n\tprotected void onDestroy() {\n\t\tPreferenceManager.getDefaultSharedPreferences(this)\n\t\t\t\t.unregisterOnSharedPreferenceChangeListener(this);\n\t\tsuper.onDestroy();\n\t}\n\n\t@Override\n\tpublic void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) {\n\t\tif (s.equals(PreferenceConstants.THEME))\n\t\t\trecreate();\n\t}\n\n\t@Override\n\tpublic boolean onOptionsItemSelected(MenuItem item) {\n\t\tswitch (item.getItemId()) {\n\t\tcase android.R.id.home:\n\t\t\tIntent intent = new Intent(this, MainWindow.class);\n\t\t\tintent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);\n\t\t\tstartActivity(intent);\n\t\t\treturn true;\n\t\tdefault:\n\t\t\treturn super.onOptionsItemSelected(item);\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/preferences/NotificationPrefs.java",
    "content": "package org.yaxim.androidclient.preferences;\n\nimport android.app.NotificationManager;\nimport android.content.Intent;\nimport android.content.SharedPreferences;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.preference.PreferenceScreen;\nimport android.support.v7.app.ActionBar;\nimport android.text.TextUtils;\n\nimport org.yaxim.androidclient.R;\nimport org.yaxim.androidclient.YaximApplication;\nimport org.yaxim.androidclient.data.YaximConfiguration;\n\nimport java.net.URLEncoder;\n\npublic class NotificationPrefs extends AppCompatPreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener {\n\tprivate ActionBar actionBar;\n\tYaximConfiguration mConfig;\n\tprivate boolean isMuc = false;\n\tprivate String jid = null;\n\tprivate String name = null;\n\tprivate boolean has_changed = false;\n\n\tpublic void onCreate(Bundle savedInstanceState) {\n\t\tsetTheme(YaximApplication.getConfig().getTheme());\n\t\tsuper.onCreate(savedInstanceState);\n\t\tmConfig = org.yaxim.androidclient.YaximApplication.getConfig();\n\n\t\tIntent intent = getIntent();\n\t\tif (intent != null) {\n\t\t\tjid = intent.getStringExtra(\"jid\");\n\t\t\tname = intent.getStringExtra(\"name\");\n\t\t\tif (\"muc\".equals(intent.getDataString()))\n\t\t\t\tisMuc = true;\n\t\t}\n\t\tif (jid != null)\n\t\t\tgetPreferenceManager().setSharedPreferencesName(\"notification_\" + URLEncoder.encode(jid));\n\t\telse if (isMuc)\n\t\t\tgetPreferenceManager().setSharedPreferencesName(\"notification_muc\");\n\n\t\taddPreferencesFromResource(R.xml.notificationprefs);\n\t\tPreferenceScreen ps = getPreferenceScreen();\n\t\tif (!isMuc)\n\t\t\tps.removePreference(ps.findPreference(\"highlight\"));\n\t\tif (jid == null) {\n\t\t\tps.removePreference(ps.findPreference(\"override\"));\n\t\t} else {\n\t\t\tfor (int i = 1; i < ps.getPreferenceCount(); i++)\n\t\t\t\tps.getPreference(i).setDependency(\"override\");\n\t\t}\n\n\t\tactionBar = getSupportActionBar();\n\t\tactionBar.setHomeButtonEnabled(true);\n\t\tactionBar.setDisplayHomeAsUpEnabled(true);\n\t\tactionBar.setTitle(isMuc ? R.string.preftitle_notify_muc : R.string.preftitle_notify_msg);\n\t\tactionBar.setSubtitle(name);\n\n\t\tgetPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);\n\t}\n\n\t@Override\n\tprotected void onResume() {\n\t\tsuper.onResume();\n\t}\n\n\t/* only set channel on actual notification, otherwise user can't change ringtone any more :(\n\t@Override\n\tprotected void onStop() {\n\t\tsuper.onStop();\n\t\tif (!has_changed)\n\t\t\treturn;\n\t\thas_changed = false;\n\t\tif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n\t\t\tif (!TextUtils.isEmpty(jid))\n\t\t\t\tgetSystemService(NotificationManager.class).deleteNotificationChannel(\"msg_\" + jid);\n\t\t\tif (mConfig.getJidOverride(isMuc, jid)) {\n\t\t\t\tgetSystemService(NotificationManager.class).createNotificationChannel(\n\t\t\t\t\t\tmConfig.createNotificationChannelFor(isMuc, jid, name));\n\t\t\t}\n\t\t}\n\t}\n\t*/\n\n\t@Override\n\tpublic boolean onOptionsItemSelected(android.view.MenuItem item) {\n\t\tswitch (item.getItemId()) {\n\t\t\tcase android.R.id.home:\n\t\t\t\tfinish();\n\t\t\t\treturn true;\n\t\t\tdefault:\n\t\t\t\treturn super.onOptionsItemSelected(item);\n\t\t}\n\t}\n\n\t@Override\n\tpublic void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) {\n\t\thas_changed = true;\n\t}\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/service/GenericService.java",
    "content": "package org.yaxim.androidclient.service;\n\nimport java.text.SimpleDateFormat;\nimport java.util.ArrayList;\nimport java.util.Date;\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.jivesoftware.smack.packet.Message;\nimport org.yaxim.androidclient.chat.ChatWindow;\nimport org.yaxim.androidclient.chat.MUCChatWindow;\nimport org.yaxim.androidclient.data.YaximConfiguration;\nimport org.yaxim.androidclient.util.LogConstants;\n\nimport android.app.Notification;\nimport android.app.NotificationChannel;\nimport android.app.NotificationManager;\nimport android.app.PendingIntent;\nimport android.app.Service;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.graphics.Color;\nimport android.graphics.Typeface;\nimport android.media.RingtoneManager;\nimport android.net.Uri;\nimport android.os.Build;\nimport android.os.PowerManager;\nimport android.os.PowerManager.WakeLock;\nimport android.os.Vibrator;\nimport android.support.v4.app.NotificationCompat;\nimport android.support.v4.app.NotificationCompat.CarExtender;\nimport android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation;\nimport android.support.v4.app.NotificationManagerCompat;\nimport android.support.v4.app.RemoteInput;\nimport android.support.v4.app.TaskStackBuilder;\nimport android.text.SpannableStringBuilder;\nimport android.text.Spanned;\nimport android.text.TextUtils;\nimport android.text.style.StyleSpan;\nimport android.util.Log;\nimport android.widget.Toast;\nimport org.yaxim.androidclient.R;\nimport org.yaxim.androidclient.util.MessageStylingHelper;\nimport org.yaxim.androidclient.util.PreferenceConstants;\n\nimport me.leolin.shortcutbadger.ShortcutBadger;\n\nimport static android.support.v4.app.NotificationCompat.DEFAULT_VIBRATE;\n\npublic abstract class GenericService extends Service {\n\n\tprivate static final String TAG = \"yaxim.Service\";\n\tprivate static final String APP_NAME = \"yaxim\";\n\tprivate static final int MAX_TICKER_MSG_LEN = 45;\n\n\tprivate static final int SECONDS_OF_SILENCE = 144; /* Conversations: grace_period = \"short\" */\n\n\tprotected NotificationManagerCompat mNotificationMGR;\n\tprivate Vibrator mVibrator;\n\tprivate Intent mNotificationIntent;\n\tprotected WakeLock mWakeLock;\n\n\tstatic class NotificationData {\n\t\tint id;\n\t\tString displayName;\n\t\tArrayList<String> messages;\n\t\tSpannableStringBuilder bigText;\n\t\tCharSequence lastMessage;\n\t\tString lastNickname;\n\t\tlong timestamp;\n\t\tboolean isMuc;\n\t\tboolean shown;\n\n\t\tpublic NotificationData(int id) {\n\t\t\tthis.id = id;\n\t\t\tmessages = new ArrayList<String>();\n\t\t\tbigText = new SpannableStringBuilder();\n\t\t}\n\t}\n\n\tprotected Map<String, NotificationData> notifications = new HashMap<String, NotificationData>(2);\n\n\tprotected static int SERVICE_NOTIFICATION = 1;\n\tprotected int lastNotificationId = 2;\n\tprotected long gracePeriodStart = 0;\n\n\tprotected YaximConfiguration mConfig;\n\n\t@Override\n\tpublic void onCreate() {\n\t\tLog.i(TAG, \"called onCreate()\");\n\t\tsuper.onCreate();\n\t\tmConfig = org.yaxim.androidclient.YaximApplication.getConfig();\n\t\tmVibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);\n\t\tmWakeLock = ((PowerManager)getSystemService(Context.POWER_SERVICE))\n\t\t\t\t.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, APP_NAME);\n\t\taddNotificationMGR();\n\t\tupdateBadger();\n\t}\n\n\t@Override\n\tpublic void onDestroy() {\n\t\tLog.i(TAG, \"called onDestroy()\");\n\t\tsuper.onDestroy();\n\t}\n\n\t@Override\n\tpublic int onStartCommand(Intent intent, int flags, int startId) {\n\t\tLog.i(TAG, \"called onStartCommand()\");\n\t\treturn START_STICKY;\n\t}\n\n\tpublic void setGracePeriod(long when) {\n\t\tif (when > gracePeriodStart || when == 0) {\n\t\t\tString when_s = (when == 0) ? \"cleared\" :\n\t\t\t\tnew SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss.SSS\").format(new Date(when));\n\t\t\tLog.d(TAG, \"user activity from different device: \" + when_s);\n\t\t\tgracePeriodStart = when;\n\t\t}\n\t}\n\n\tprivate void addNotificationMGR() {\n\t\tmNotificationMGR = NotificationManagerCompat.from(this);\n\t\tif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n\t\t\tNotificationManager oreoDamager = getSystemService(NotificationManager.class);\n\t\t\tNotificationChannel nc_status = new NotificationChannel(\"status\",\n\t\t\t\t\tgetString(R.string.notification_status), NotificationManager.IMPORTANCE_LOW);\n\t\t\toreoDamager.createNotificationChannel(nc_status);\n\t\t\toreoDamager.deleteNotificationChannel(\"messages\"); // is \"msg\" now\n\t\t\toreoDamager.createNotificationChannel(mConfig.createNotificationChannelFor(false, null, getString(R.string.preftitle_notify_msg)));\n\t\t\toreoDamager.createNotificationChannel(mConfig.createNotificationChannelFor(true, null, getString(R.string.preftitle_notify_muc)));\n\t\t}\n\t\tmNotificationIntent = new Intent(this, ChatWindow.class);\n\t}\n\n\tprotected NotificationData appendToNotification(String[] jid, String fromDisplayName, String message,\n\t\t\tMessage.Type msgType, long timestamp) {\n\t\tif (message == null) {\n\t\t\tclearNotification(jid[0]);\n\t\t\treturn null;\n\t\t}\n\n\t\tString fromJid = jid[0];\n\n\t\tNotificationData nd = notifications.get(fromJid);\n\t\tif (nd == null) {\n\t\t\tnd = new NotificationData(++lastNotificationId);\n\t\t\tnotifications.put(fromJid, nd);\n\t\t}\n\t\tnd.isMuc = (msgType==Message.Type.groupchat);\n\t\tnd.displayName = fromDisplayName;\n\n\t\t// /me processing\n\t\tboolean slash_me = message.startsWith(\"/me \");\n\t\tString from_nickname = nd.isMuc ? jid[1] : fromDisplayName;\n\t\tnd.lastNickname = nd.isMuc ? jid[1] : null;\n\n\t\tif (nd.bigText.length() > 0)\n\t\t\tnd.bigText.append(\"\\n\");\n\t\tif (nd.isMuc && !slash_me) {\n\t\t\t// work around .append(stylable) only available in SDK 21+\n\t\t\tint start = nd.bigText.length();\n\t\t\tnd.bigText.append(jid[1]).append(\":\");\n\t\t\tnd.bigText.setSpan(new StyleSpan(Typeface.BOLD),\n\t\t\t\t\tstart, nd.bigText.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);\n\t\t\tnd.bigText.append(\" \");\n\t\t}\n\t\t// TODO: get real Notification color; using #808080 for now as Styling fallback\n\t\tSpannableStringBuilder body = MessageStylingHelper.formatMessage(message,\n\t\t\t\tfrom_nickname, null, 0xff808080);\n\t\tnd.bigText.append(body);\n\n\t\t//adding the messages into the messageList\n\t\tnd.messages.add(body.toString());\n\n\t\tnd.lastMessage = body;\n\t\tnd.timestamp = timestamp;\n\t\tnd.shown = false;\n\t\treturn nd;\n\t}\n\n\tprotected void notifyClient(String[] jid, String fromDisplayName, String message,\n\t\t\t\t\t\t\t\tboolean showNotification, boolean silent_notification, Message.Type msgType,\n\t\t\t\t\t\t\t\tlong timestamp) {\n\t\tif (message == null) {\n\t\t\tclearNotification(jid[0]);\n\t\t\treturn;\n\t\t}\n\n\t\tboolean isMuc = (msgType == Message.Type.groupchat);\n\t\tboolean is_error = (msgType == Message.Type.error);\n\n\t\t// Override silence when activity from other client happened recently\n\t\tlong silent_seconds = (System.currentTimeMillis() - gracePeriodStart)/1000;\n\t\tif (!silent_notification && silent_seconds < SECONDS_OF_SILENCE) {\n\t\t\tLog.d(TAG, \"Silent notification: last activity was \" + silent_seconds + \"s ago.\");\n\t\t\tsilent_notification = true;\n\t\t}\n\n\t\tUri sound = Uri.parse(mConfig.getJidString(isMuc, PreferenceConstants.RINGTONENOTIFY, jid[0], \"\"));\n\t\tif (!showNotification) {\n\t\t\tif (is_error)\n\t\t\t\tshortToastNotify(getString(R.string.notification_error) + \" \" + message);\n\t\t\t// only play sound and return\n\t\t\ttry {\n\t\t\t\tif (!silent_notification && !Uri.EMPTY.equals(sound))\n\t\t\t\t\tRingtoneManager.getRingtone(getApplicationContext(), sound).play();\n\t\t\t} catch (NullPointerException e) {\n\t\t\t\t// ignore NPE when ringtone was not found\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tNotificationData nd = appendToNotification(jid, fromDisplayName, message, msgType, timestamp);\n\t\tdisplayNotification(jid[0], nd, silent_notification);\n\t}\n\n\tprotected void displayNotification(String jid, NotificationData nd, boolean silent_notification) {\n\t\tmWakeLock.acquire();\n\t\tUri sound = Uri.parse(mConfig.getJidString(nd.isMuc, PreferenceConstants.RINGTONENOTIFY, jid, \"\"));\n\t\tboolean vibrate = false;\n\t\tif(!silent_notification) {\n\t\t\tString vibration = mConfig.getJidString(nd.isMuc, PreferenceConstants.VIBRATIONNOTIFY, jid, \"OFF\");\n\t\t\tswitch (vibration) {\n\t\t\t\tcase \"SYSTEM\":\n\t\t\t\t\tvibrate = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"ALWAYS\":\n\t\t\t\t\tmVibrator.vibrate(400);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t} else\n\t\t\tsound = null; // override ringtone with silent_notification\n\t\tboolean blink = mConfig.getJidBoolean(nd.isMuc, PreferenceConstants.LEDNOTIFY, jid, false);\n\n\t\tNotification n = setNotification(jid, nd,\n\t\t\t\tblink, sound, vibrate);\n\n\t\tnd.shown = true;\n\t\tmNotificationMGR.notify(nd.id, n);\n\t\tupdateBadger();\n\t\tmWakeLock.release();\n\n\t}\n\n\tprivate Notification setNotification(String fromJid, NotificationData nd,\n\t\t\t boolean blink, Uri ringtone, boolean vibrate) {\n\n\t\tString author_title;\n\t\tif (nd.lastNickname != null)\n\t\t\tauthor_title = getString(R.string.notification_muc_message, nd.lastNickname, nd.displayName/* = name of chatroom */);\n\t\telse\n\t\t\tauthor_title = nd.displayName; // removed \"Message from\" prefix for brevity\n\t\tString ticker;\n\t\tif (mConfig.getJidBoolean(nd.isMuc, PreferenceConstants.TICKER, fromJid, true)) {\n\t\t\tString msg_string = nd.lastMessage.toString();\n\t\t\tint newline = msg_string.indexOf('\\n');\n\t\t\tint limit = 0;\n\t\t\tString messageSummary = msg_string;\n\t\t\tif (newline >= 0)\n\t\t\t\tlimit = newline;\n\t\t\tif (limit > MAX_TICKER_MSG_LEN || nd.lastMessage.length() > MAX_TICKER_MSG_LEN)\n\t\t\t\tlimit = MAX_TICKER_MSG_LEN;\n\t\t\tif (limit > 0)\n\t\t\t\tmessageSummary = msg_string.substring(0, limit) + \"…\";\n\t\t\tticker = author_title + \": \" + messageSummary;\n\t\t} else\n\t\t\tticker = getString(R.string.notification_anonymous_message);\n\n\t\tIntent msgHeardIntent = new Intent(this, YaximBroadcastReceiver.class)\n\t\t\t.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES)\n\t\t\t.setAction(\"org.yaxim.androidclient.ACTION_MESSAGE_HEARD\")\n\t\t\t.putExtra(\"jid\", fromJid);\n\n\t\tIntent msgResponseIntent = new Intent(this, YaximBroadcastReceiver.class)\n\t\t\t.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES)\n\t\t\t.setAction(\"org.yaxim.androidclient.ACTION_MESSAGE_REPLY\")\n\t\t\t.putExtra(\"jid\", fromJid);\n\n\t\tPendingIntent msgHeardPendingIntent = PendingIntent.getBroadcast(\n\t\t\t\t\tgetApplicationContext(),\n\t\t\t\t\tnotifications.get(fromJid).id,\n\t\t\t\t\tmsgHeardIntent,\n\t\t\t\t\tPendingIntent.FLAG_UPDATE_CURRENT|PendingIntent.FLAG_IMMUTABLE);\n\t\tPendingIntent msgResponsePendingIntent = PendingIntent.getBroadcast(\n\t\t\t\t\tgetApplicationContext(),\n\t\t\t\t\tnotifications.get(fromJid).id,\n\t\t\t\t\tmsgResponseIntent,\n\t\t\t\t\tPendingIntent.FLAG_UPDATE_CURRENT|PendingIntent.FLAG_MUTABLE);\n\t\tRemoteInput remoteInput = new RemoteInput.Builder(\"voicereply\")\n\t\t\t.setLabel(getString(R.string.notification_reply))\n\t\t\t.build();\n\t\tUnreadConversation.Builder ucb = new UnreadConversation.Builder(nd.displayName)\n\t\t\t.setReadPendingIntent(msgHeardPendingIntent)\n\t\t\t.setReplyAction(msgResponsePendingIntent, remoteInput);\n\n\t\t//adding a loop outside\n\t\tfor (String msg_one : nd.messages){\n\t\t\tucb.addMessage(msg_one).setLatestTimestamp(System.currentTimeMillis());\n\t\t}\n\t\t//ucb.addMessage(msg_long.toString()).setLatestTimestamp(System.currentTimeMillis());\n\n\t\tUri userNameUri = Uri.parse(fromJid);\n\t\tIntent chatIntent = new Intent(this, nd.isMuc ? MUCChatWindow.class : ChatWindow.class);\n\t\tchatIntent.setData(userNameUri);\n\t\tchatIntent.putExtra(ChatWindow.INTENT_EXTRA_USERNAME, nd.displayName);\n\t\t//XXX chatIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);\n\n\t\t// create back-stack (WTF were you smoking, Google!?)\n\t\t//need to set flag FLAG_UPDATE_CURRENT to get extras transferred\n\t\tPendingIntent pi = TaskStackBuilder.create(this)\n\t\t\t.addNextIntentWithParentStack(chatIntent)\n\t\t\t.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT|PendingIntent.FLAG_IMMUTABLE);\n\n\t\tString notification_channel = mConfig.getEffectiveNotificationChannelId(nd.isMuc, fromJid);\n\t\tif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n\t\t\tif (mConfig.getJidOverride(nd.isMuc, fromJid)) {\n\t\t\t\tgetSystemService(NotificationManager.class).createNotificationChannel(\n\t\t\t\t\t\tmConfig.createNotificationChannelFor(nd.isMuc, fromJid, nd.displayName));\n\t\t\t}\n\t\t}\n\n\t\tNotificationCompat.Action actMarkRead = new NotificationCompat.Action.Builder(\n\t\t\t\tandroid.R.drawable.ic_menu_close_clear_cancel,\n\t\t\t\tgetString(R.string.notification_mark_read), msgHeardPendingIntent).build();\n\t\tNotificationCompat.Action actReply = new NotificationCompat.Action.Builder(\n\t\t\t\tandroid.R.drawable.ic_menu_edit,\n\t\t\t\tgetString(R.string.notification_reply), msgResponsePendingIntent)\n\t\t\t.addRemoteInput(remoteInput).build();\n\t\t// TODO: split public and private parts, use .setPublicVersion()\n\t\tNotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, notification_channel)\n\t\t\t.setContentTitle(author_title)\n\t\t\t.setContentText(nd.lastMessage)\n\t\t\t.setStyle(new NotificationCompat.BigTextStyle()\n\t\t\t\t\t .setBigContentTitle(nd.displayName)\n\t\t\t\t\t.bigText(nd.bigText))\n\t\t\t.setTicker(ticker)\n\t\t\t.setWhen(nd.timestamp)\n\t\t\t.setSmallIcon(R.drawable.sb_message)\n\t\t\t.setCategory(Notification.CATEGORY_MESSAGE)\n\t\t\t.setContentIntent(pi)\n\t\t\t.setAutoCancel(true);\n\t\tif (Build.VERSION.SDK_INT >= 24) // use Android7 in-notification reply, fall back to Activity\n\t\t\tnotificationBuilder.addAction(actReply);\n\t\tnotificationBuilder\n\t\t\t.addAction(actMarkRead)\n\t\t\t//.addAction(android.R.drawable.ic_menu_share, \"Forward\", msgHeardPendingIntent)\n\t\t\t.extend(new CarExtender().setUnreadConversation(ucb.build()))\n\t\t\t.extend(new NotificationCompat.WearableExtender()\n\t\t\t\t\t.addAction(actReply)\n\t\t\t\t\t.addAction(actMarkRead))\n\t\t\t.setDefaults(vibrate ? DEFAULT_VIBRATE : 0)\n\t\t\t.setNumber(nd.messages.size())\n\t\t\t;\n\t\tif (blink)\n\t\t\tnotificationBuilder.setLights(Color.MAGENTA, 300, 1000);\n\t\tif (ringtone != null)\n\t\t\tnotificationBuilder.setSound(ringtone);\n\t\treturn notificationBuilder.build();\n\t}\n\n\tprotected void displayPendingNonMUCNotifications() {\n\t\tfor (Map.Entry<String, NotificationData> entry : notifications.entrySet()) {\n\t\t\tNotificationData nd = entry.getValue();\n\t\t\tif (!nd.shown && !nd.isMuc) {\n\t\t\t\tlogInfo(\"Showing delayed notification for \" + entry.getKey());\n\t\t\t\tdisplayNotification(entry.getKey(), nd, false);\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected void shortToastNotify(String msg) {\n\t\tToast toast = Toast.makeText(this, msg, Toast.LENGTH_SHORT);\n\t\ttoast.show();\n\t}\n\tprotected void shortToastNotify(Throwable e) {\n\t\te.printStackTrace();\n\t\twhile (e.getCause() != null)\n\t\t\te = e.getCause();\n\t\tshortToastNotify(e.getMessage());\n\t}\n\n\tpublic void updateBadger() {\n\t\tint count = 0;\n\t\tfor (NotificationData nd : notifications.values())\n\t\t\tcount += nd.messages.size();\n\t\tShortcutBadger.applyCount(this, count);\n\t}\n\n\tprotected void logError(String data) {\n\t\tif (LogConstants.LOG_ERROR) {\n\t\t\tLog.e(TAG, data);\n\t\t}\n\t}\n\n\tprotected void logInfo(String data) {\n\t\tif (LogConstants.LOG_INFO) {\n\t\t\tLog.i(TAG, data);\n\t\t}\n\t}\n\n\tpublic void clearNotification(String Jid) {\n\t\tNotificationData nd = notifications.get(Jid);\n\t\tif (nd != null) {\n\t\t\tmNotificationMGR.cancel(nd.id);\n\t\t\tnotifications.remove(Jid);\n\t\t\tupdateBadger();\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/service/IXMPPChatService.aidl",
    "content": "package org.yaxim.androidclient.service;\n\ninterface IXMPPChatService {\n\tvoid sendMessage(String user, String message, String lmc, long _id);\n\tboolean isAuthenticated();\n\tvoid clearNotifications(String Jid);\n\tboolean hasFileUpload();\n\tvoid sendFile(in Uri path, String user, int flags);\n}"
  },
  {
    "path": "src/org/yaxim/androidclient/service/IXMPPMucService.aidl",
    "content": "package org.yaxim.androidclient.service;\n\ninterface IXMPPMucService {\n\tvoid syncDbRooms();\n\tboolean inviteToRoom(String contactJid, String roomJid);\n\tString getMyMucNick(String jid);\n\n\t// TODO: private chat in a room\n\t//RoomInfo getRoomInfo(String room); TODO: make RoomInfo \"parcelable\"??\n\t// TODO: manage roles\n\t// TODO: manage subjects\n\t// TODO: manage affiliations\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/service/IXMPPRosterService.aidl",
    "content": "package org.yaxim.androidclient.service;\n\n/*\n\tIPC interface for methods on XMPPService called by an activity\n*/\n\nimport org.yaxim.androidclient.IXMPPRosterCallback;\n\ninterface IXMPPRosterService {\n\t/* hack: use int because enums are not trivially parcellable */\n\tint getConnectionState();\n\tString getConnectionStateString();\n\t\n\t/* xmpp methods */\n\t\n\tvoid setStatusFromConfig();\n\tvoid disconnect();\n\tvoid connect();\n\tvoid addRosterItem(String user, String alias, String group, String token);\n\tvoid addRosterGroup(String group);\n\tvoid renameRosterGroup(String group, String newGroup);\n\tvoid removeRosterItem(String user);\n\tvoid sendPresenceRequest(String user, String type);\n\tvoid renameRosterItem(String user, String newName);\n\tvoid moveRosterItemToGroup(String user, String group);\n\tString changePassword(String newPassword);\n\t\n\t/* callback methods */\n\t\n\tvoid registerRosterCallback(IXMPPRosterCallback callback);\n\tvoid unregisterRosterCallback(IXMPPRosterCallback callback);\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/service/InvitationTask.java",
    "content": "package org.yaxim.androidclient.service;\n\nimport android.app.Activity;\nimport android.os.AsyncTask;\nimport android.text.TextUtils;\nimport android.util.Log;\nimport android.widget.Toast;\n\nimport java.lang.ref.WeakReference;\n\nimport org.jivesoftware.smack.XMPPConnection;\nimport org.jivesoftware.smack.XMPPException;\nimport org.jivesoftware.smack.packet.StanzaError;\nimport org.jivesoftware.smackx.commands.AdHocCommand;\nimport org.jivesoftware.smackx.commands.AdHocCommandManager;\nimport org.jxmpp.jid.impl.JidCreate;\nimport org.yaxim.androidclient.R;\nimport org.yaxim.androidclient.data.ChatHelper;\nimport org.yaxim.androidclient.data.YaximConfiguration;\nimport org.yaxim.androidclient.util.XMPPHelper;\n\npublic class InvitationTask extends AsyncTask<Void, String, InvitationTask.InvitationResponse> {\n    private static final String TAG = \"yaxim.InvitationTask\";\n\n    private WeakReference<Activity> ctx;\n    private YaximConfiguration config;\n    private Smackable smackable;\n    private Toast status;\n\n    public InvitationTask(Activity ctx, YaximConfiguration config, Smackable smackable) {\n        this.ctx = new WeakReference(ctx);\n        this.config = config;\n        this.smackable = smackable;\n    }\n\n    @Override\n    protected InvitationResponse doInBackground(Void... params) {\n        try {\n            XMPPConnection connection = smackable.getConnection();\n\n\t\t\tAdHocCommandManager mgr = AdHocCommandManager.getAddHocCommandsManager(connection);\n            AdHocCommand cmd = mgr.getRemoteCommand(JidCreate.domainBareFromOrThrowUnchecked(config.server), \"urn:xmpp:invite#invite\");\n            try {\n                cmd.execute();\n            } catch (XMPPException.XMPPErrorException e) {\n                if (e.getStanzaError().getCondition() == StanzaError.Condition.service_unavailable)\n                    return failResponse((String)null);\n                else throw e;\n            }\n            if (cmd.isCompleted()) {\n                String landing = cmd.getForm().getField(\"landing-url\").getFirstValue();\n                if (TextUtils.isEmpty(landing))\n                    landing = cmd.getForm().getField(\"uri\").getFirstValue().replace(\"xmpp:\", \"https://yax.im/i/#\");\n                return new InvitationResponse(true, landing);\n            }\n            return failResponse(\"Ad-Hoc command did not complete: \" + cmd.getStatus());\n\n        } catch (Exception e) {\n\t\t\treturn failResponse(e);\n\t\t}\n    }\n\n    private void showLongToast(String toast, boolean is_error) {\n        Activity act = ctx.get();\n        if (act != null) {\n            if (is_error)\n                toast = act.getString(R.string.conn_error, toast);\n            status = Toast.makeText(act, toast, Toast.LENGTH_LONG);\n            status.show();\n        }\n    }\n\n    @Override\n    protected void onProgressUpdate(String... values) {\n        if (status != null)\n            status.cancel();\n        showLongToast(values[0], false);\n    }\n\n    @Override\n    protected void onPreExecute() { }\n\n    @Override\n    protected void onPostExecute(InvitationResponse response) {\n        String landing_page = null;\n        if (status != null)\n            status.cancel();\n        if (response.success) {\n            landing_page = response.response;\n        } else {\n            if (response.response != null)\n                showLongToast(response.response, !response.success);\n            landing_page = XMPPHelper.createInvitationLinkHTTPS(config.jabberID,\n                    config.createInvitationCode());\n        }\n        Activity act = ctx.get();\n        if (act != null && !act.isFinishing())\n            ChatHelper.showQrDialog(act, config.jabberID, landing_page, act.getString(R.string.Menu_send_invitation));\n    }\n\n    private InvitationResponse failResponse(String reason) {\n        return new InvitationResponse(false, reason);\n    }\n    private InvitationResponse failResponse(Throwable exception) {\n        exception.printStackTrace();\n        return new InvitationResponse(false, exception.getLocalizedMessage());\n    }\n\n\n    public class InvitationResponse {\n        boolean success;\n        String response;\n\n        public InvitationResponse(boolean success, String response) {\n            this.success = success;\n            this.response = response;\n            if (!success)\n                Log.e(\"yaxim.InvitationTask\", this.toString());\n        }\n    }\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/service/MUCController.java",
    "content": "package org.yaxim.androidclient.service;\n\nimport android.content.ContentResolver;\nimport android.content.ContentUris;\nimport android.database.Cursor;\nimport android.net.Uri;\n\nimport android.support.v4.util.CircularArray;\nimport android.util.Log;\n\nimport org.jivesoftware.smack.XMPPConnection;\nimport org.jivesoftware.smackx.muc.MultiUserChat;\n\nimport org.jivesoftware.smackx.muc.MultiUserChatManager;\nimport org.jivesoftware.smackx.muc.RoomInfo;\nimport org.jxmpp.jid.impl.JidCreate;\nimport org.jxmpp.stringprep.XmppStringprepException;\nimport org.yaxim.androidclient.data.ChatProvider;\nimport org.yaxim.androidclient.data.ChatProvider.ChatConstants;\n\n/* The MUCController implements common MUC related management tasks.\n *\n * Tasks are:\n *  - keep track of recent message `_id`s (because SQLite lookup is SLOW)\n *  - keep track of ping/pong\n *  - keep track of joining/leaving\n */\npublic class MUCController {\n\tstatic final String TAG = \"yaxim.MUCController\";\n\tfinal String jid;\n\tpublic MultiUserChat muc;\n\tboolean isSynchronized = false;\n\tboolean isTimeout = false;\n\n\n\tpublic static final int LOOKUP_SIZE = 250;\n\tprivate CircularArray lastIDs = new CircularArray<Long>(LOOKUP_SIZE);\n\tlong lastPong = -1;\n\n\tMUCController(XMPPConnection c, String jid) {\n\t\tthis.jid = jid;\n\t\tmuc = MultiUserChatManager.getInstanceFor(c).getMultiUserChat(JidCreate.entityBareFromUnescapedOrThrowUnchecked(jid));\n\t}\n\n\tpublic synchronized void setLastActivity() {\n\t\tlastPong = System.currentTimeMillis();\n\t}\n\tpublic synchronized void addPacketID(long id) {\n\t\twhile (lastIDs.size() >= LOOKUP_SIZE)\n\t\t\tlastIDs.popFirst();\n\t\t//Log.d(TAG, jid + \" -> \" + id);\n\t\tlastIDs.addLast(id);\n\t\tsetLastActivity();\n\t}\n\tpublic synchronized void addPacketID(Uri contentUri) {\n\t\taddPacketID(ContentUris.parseId(contentUri));\n\t}\n\n\tpublic synchronized long getFirstPacketID() {\n\t\tif (lastIDs.isEmpty())\n\t\t\treturn 0;\n\t\tlong id = (Long)lastIDs.getFirst();\n\t\treturn id;\n\t}\n\n\tpublic synchronized void loadPacketIDs(ContentResolver cr) {\n\t\tlastIDs.clear();\n\t\tCursor c = cr.query(ChatProvider.CONTENT_URI, new String[] { ChatConstants._ID /*, ChatConstants.PACKET_ID*/ },\n\t\t\t\t\"jid = ?\", new String[] { jid }, \"_id DESC LIMIT \" + LOOKUP_SIZE);\n\t\tlong result = -1;\n\t\twhile (c.moveToNext()) {\n\t\t\t//Log.d(TAG, jid + \": \" + c.getString(1) +  \" -> \" + c.getLong(0));\n\t\t\tlastIDs.addFirst(c.getLong(0));\n\t\t}\n\t\tc.close();\n\t}\n\n\tpublic void cleanup() {\n\t\t//SMAXX muc.cleanup();\n\t\tisSynchronized = false;\n\t\tisTimeout = false;\n\t}\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/service/Smackable.java",
    "content": "package org.yaxim.androidclient.service;\n\nimport java.util.List;\n\nimport org.jivesoftware.smack.XMPPConnection;\nimport org.yaxim.androidclient.exceptions.YaximXMPPException;\nimport org.yaxim.androidclient.util.ConnectionState;\n\n\npublic interface Smackable {\n\tboolean isAuthenticated();\n\tvoid requestConnectionState(ConnectionState new_state);\n\tvoid requestConnectionState(ConnectionState new_state, boolean create_account);\n\tConnectionState getConnectionState();\n\tlong getConnectionStateTimestamp();\n\tString getLastError();\n\n\tvoid addRosterItem(String user, String alias, String group, String token) throws YaximXMPPException;\n\tvoid removeRosterItem(String user) throws YaximXMPPException;\n\tvoid renameRosterItem(String user, String newName) throws YaximXMPPException;\n\tvoid moveRosterItemToGroup(String user, String group) throws YaximXMPPException;\n\tvoid renameRosterGroup(String group, String newGroup) throws YaximXMPPException;\n\tvoid sendPresenceRequest(String user, String type) throws YaximXMPPException;\n\tvoid addRosterGroup(String group);\n\tString changePassword(String newPassword);\n\t\n\tvoid setStatusFromConfig();\n\tvoid sendMessage(String user, String message, String lmc, String oob, long upsert_id);\n\tvoid sendServerPing();\n\tvoid setUserWatching(boolean user_watching);\n\tboolean hasFileUpload();\n\n\tvoid registerCallback(XMPPServiceCallback callBack);\n\tvoid unRegisterCallback();\n\t\n\tvoid syncDbRooms();\n\tboolean inviteToRoom(String contactJid, String roomJid);\n\t\n\tString getNameForJID(String jid);\n\tString getMyMucNick(String jid);\n\n\tXMPPConnection getConnection();\n\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/service/SmackableImp.java",
    "content": "package org.yaxim.androidclient.service;\n\nimport java.io.File;\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.Comparator;\nimport java.util.Date;\nimport java.util.EnumSet;\nimport java.util.HashMap;\nimport java.util.HashSet;\nimport java.util.Iterator;\nimport java.util.LinkedHashMap;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Locale;\nimport java.util.Map;\nimport java.util.concurrent.atomic.AtomicReference;\n\nimport javax.net.ssl.HttpsURLConnection;\nimport javax.net.ssl.SSLContext;\nimport javax.net.ssl.X509TrustManager;\n\nimport de.duenndns.ssl.MemorizingTrustManager;\n\nimport org.jivesoftware.smack.*;\nimport org.jivesoftware.smack.filter.StanzaIdFilter;\nimport org.jivesoftware.smack.filter.StanzaTypeFilter;\nimport org.jivesoftware.smack.packet.IQ;\nimport org.jivesoftware.smack.packet.IQ.Type;\nimport org.jivesoftware.smack.packet.Message;\nimport org.jivesoftware.smack.packet.Presence;\nimport org.jivesoftware.smack.packet.Presence.Mode;\nimport org.jivesoftware.smack.packet.Stanza;\nimport org.jivesoftware.smack.packet.StreamError;\nimport org.jivesoftware.smack.packet.StanzaError;\nimport org.jivesoftware.smack.packet.id.StanzaIdUtil;\nimport org.jivesoftware.smack.parsing.ParsingExceptionCallback;\nimport org.jivesoftware.smack.UnparseableStanza;\nimport org.jivesoftware.smack.provider.ProviderManager;\nimport org.jivesoftware.smack.roster.Roster;\nimport org.jivesoftware.smack.roster.RosterEntry;\nimport org.jivesoftware.smack.roster.RosterGroup;\nimport org.jivesoftware.smack.roster.RosterListener;\nimport org.jivesoftware.smack.tcp.XMPPTCPConnection;\nimport org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;\nimport org.jivesoftware.smack.util.TLSUtils;\nimport org.jivesoftware.smack.util.dns.HostAddress;\nimport org.jivesoftware.smackx.carbons.packet.CarbonExtension;\nimport org.jivesoftware.smackx.chatstates.ChatState;\nimport org.jivesoftware.smackx.chatstates.packet.ChatStateExtension;\nimport org.jivesoftware.smackx.chatstates.provider.ChatStateExtensionProvider;\nimport org.jivesoftware.smackx.csi.ClientStateIndicationManager;\nimport org.jivesoftware.smackx.delay.DelayInformationManager;\nimport org.jivesoftware.smackx.forward.packet.Forwarded;\nimport org.jivesoftware.smackx.httpfileupload.HttpFileUploadManager;\nimport org.jivesoftware.smackx.iqregister.AccountManager;\nimport org.jivesoftware.smackx.iqversion.VersionManager;\nimport org.jivesoftware.smackx.mam.MamManager;\nimport org.jivesoftware.smackx.mam.element.MamElements;\nimport org.jivesoftware.smackx.mam.element.MamFinIQ;\nimport org.jivesoftware.smackx.mam.element.MamPrefsIQ;\nimport org.jivesoftware.smackx.mam.provider.MamFinIQProvider;\nimport org.jivesoftware.smackx.mam.provider.MamPrefsIQProvider;\nimport org.jivesoftware.smackx.mam.provider.MamResultProvider;\nimport org.jivesoftware.smackx.message_correct.element.MessageCorrectExtension;\nimport org.jivesoftware.smackx.muc.MucEnterConfiguration;\nimport org.jivesoftware.smackx.muc.MultiUserChatManager;\nimport org.jivesoftware.smackx.nick.packet.Nick;\nimport org.jivesoftware.smackx.ping.PingFailedListener;\nimport org.jivesoftware.smackx.ping.PingManager;\nimport org.jivesoftware.smackx.bookmarks.BookmarkManager;\nimport org.jivesoftware.smackx.bookmarks.BookmarkedConference;\nimport org.jivesoftware.smackx.caps.EntityCapsManager;\nimport org.jivesoftware.smackx.caps.cache.SimpleDirectoryPersistentCache;\nimport org.jivesoftware.smackx.muc.packet.GroupChatInvitation;\nimport org.jivesoftware.smackx.disco.ServiceDiscoveryManager;\nimport org.jivesoftware.smackx.muc.MultiUserChat;\nimport org.jivesoftware.smackx.muc.RoomInfo;\nimport org.jivesoftware.smackx.carbons.CarbonManager;\nimport org.jivesoftware.smackx.disco.packet.DiscoverItems;\nimport org.jivesoftware.smackx.pubsub.LeafNode;\nimport org.jivesoftware.smackx.pubsub.PayloadItem;\nimport org.jivesoftware.smackx.pubsub.PubSubManager;\nimport org.jivesoftware.smackx.sid.element.StanzaIdElement;\nimport org.jivesoftware.smackx.vcardtemp.VCardManager;\nimport org.jivesoftware.smackx.vcardtemp.packet.VCard;\nimport org.jivesoftware.smackx.delay.packet.DelayInformation;\nimport org.jivesoftware.smackx.disco.packet.DiscoverInfo;\nimport org.jivesoftware.smackx.muc.packet.MUCUser;\nimport org.jivesoftware.smackx.ping.packet.Ping;\nimport org.jivesoftware.smackx.receipts.DeliveryReceipt;\nimport org.jivesoftware.smackx.receipts.DeliveryReceiptRequest;\nimport org.jxmpp.jid.EntityBareJid;\nimport org.jxmpp.jid.EntityFullJid;\nimport org.jxmpp.jid.Jid;\nimport org.jxmpp.jid.impl.JidCreate;\nimport org.jxmpp.jid.parts.Localpart;\nimport org.jxmpp.jid.parts.Resourcepart;\nimport org.jxmpp.stringprep.XmppStringprepException;\nimport org.yaxim.androidclient.YaximApplication;\nimport org.yaxim.androidclient.data.ChatHelper;\nimport org.yaxim.androidclient.data.ChatProvider;\nimport org.yaxim.androidclient.data.ChatRoomHelper;\nimport org.yaxim.androidclient.data.EntityInfo;\nimport org.yaxim.androidclient.data.RosterProvider;\nimport org.yaxim.androidclient.data.YaximConfiguration;\nimport org.yaxim.androidclient.data.ChatProvider.ChatConstants;\nimport org.yaxim.androidclient.data.RosterProvider.RosterConstants;\nimport org.yaxim.androidclient.exceptions.YaximXMPPException;\nimport org.yaxim.androidclient.packet.InviteRegister;\nimport org.yaxim.androidclient.packet.MuclumbusIQ;\nimport org.yaxim.androidclient.packet.MuclumbusResult;\nimport org.yaxim.androidclient.packet.Oob;\nimport org.yaxim.androidclient.packet.PreAuth;\nimport org.yaxim.androidclient.util.ConnectionState;\nimport org.yaxim.androidclient.util.ErrorReportManager;\nimport org.yaxim.androidclient.util.LogConstants;\nimport org.yaxim.androidclient.util.StatusMode;\nimport org.yaxim.androidclient.R;\n\nimport android.app.AlarmManager;\nimport android.app.PendingIntent;\nimport android.app.Service;\nimport android.content.BroadcastReceiver;\nimport android.content.ContentResolver;\nimport android.content.ContentValues;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.IntentFilter;\nimport android.database.Cursor;\n\nimport android.net.Uri;\nimport android.text.TextUtils;\nimport android.text.format.DateUtils;\nimport android.util.Log;\n\npublic class SmackableImp implements Smackable {\n\tfinal static private String TAG = \"yaxim.SmackableImp\";\n\n\tfinal static private int PACKET_TIMEOUT = 30000;\n\n\tfinal static private String[] SEND_OFFLINE_PROJECTION = new String[] {\n\t\t\tChatConstants._ID, ChatConstants.JID,\n\t\t\tChatConstants.MESSAGE, ChatConstants.MSGFLAGS,\n\t\t\tChatConstants.CORRECTION, ChatConstants.EXTRA,\n\t\t\tChatConstants.DATE, ChatConstants.PACKET_ID };\n\tfinal static private String SEND_OFFLINE_SELECTION =\n\t\t\tChatConstants.DIRECTION + \" = \" + ChatConstants.OUTGOING + \" AND \" +\n\t\t\tChatConstants.DELIVERY_STATUS + \" = \" + ChatConstants.DS_NEW;\n\n\tstatic File capsCacheDir = null; ///< this is used to cache if we already initialized EntityCapsCache\n\n\tstatic {\n\t\t// initialize smack defaults before any connections are created\n\t\tSmackConfiguration.setDefaultReplyTimeout(PACKET_TIMEOUT);\n\n\t\tProviderManager.addExtensionProvider(Oob.ELEMENT, Oob.NAMESPACE, new Oob.Provider());\n\t\tProviderManager.addExtensionProvider(PreAuth.ELEMENT, PreAuth.NAMESPACE, new PreAuth.Provider());\n\t\tProviderManager.addExtensionProvider(MamElements.MamResultExtension.ELEMENT, MamElements.NAMESPACE, new MamResultProvider());\n\t\tProviderManager.addIQProvider(MamPrefsIQ.ELEMENT, MamElements.NAMESPACE, new MamPrefsIQProvider());\n\t\tProviderManager.addIQProvider(MamFinIQ.ELEMENT, MamElements.NAMESPACE, new MamFinIQProvider());\n\t\tProviderManager.addIQProvider(MuclumbusIQ.ELEMENT, MuclumbusIQ.NAMESPACE, new MuclumbusIQ.Provider());\n\t\tProviderManager.addIQProvider(MuclumbusResult.ELEMENT, MuclumbusIQ.NAMESPACE, new MuclumbusResult.Provider());\n\t\tProviderManager.addStreamFeatureProvider(InviteRegister.ELEMENT, InviteRegister.NAMESPACE, new InviteRegister.StreamFeatureProvider());\n\t\tPingManager.setDefaultPingInterval(14*60);\n\t}\n\n\tprivate final YaximConfiguration mConfig;\n\tprivate XMPPTCPConnectionConfiguration mXMPPConfig;\n\tprivate XMPPTCPConnection mXMPPConnection;\n\tprivate AtomicReference<Thread> mConnectingThread = new AtomicReference<Thread>();\n\n\n\tprivate ConnectionState mRequestedState = ConnectionState.OFFLINE;\n\tprivate ConnectionState mState = ConnectionState.OFFLINE;\n\tprivate String mLastError;\n\tprivate Exception mLastLoginError; // StanzaError for IBR, SASLErrorException for login issues\n\tprivate long mLastOnline = 0;\t//< timestamp of last successful full login (XEP-0198 does not count)\n\tprivate long mLastOffline = 0;\t//< timestamp of the end of last successful login\n\n\tprivate XMPPServiceCallback mServiceCallBack;\n\tprivate Roster mRoster;\n\tprivate RosterListener mRosterListener;\n\tprivate StanzaListener mStanzaListener;\n\tprivate StanzaListener mPresenceListener;\n\tprivate ConnectionListener mConnectionListener;\n\n\tprivate final ContentResolver mContentResolver;\n\n\tprivate AlarmManager mAlarmManager;\n\tprivate StanzaListener mPongListener;\n\tprivate String mPingID;\n\tprivate long mPingTimestamp;\n\n\tprivate PendingIntent mPingAlarmPendIntent;\n\tprivate PendingIntent mPongTimeoutAlarmPendIntent;\n\tprivate static final String PING_ALARM = \"org.yaxim.androidclient.PING_ALARM\";\n\tprivate static final String PONG_TIMEOUT_ALARM = \"org.yaxim.androidclient.PONG_TIMEOUT_ALARM\";\n\tprivate Intent mPingAlarmIntent = new Intent(PING_ALARM);\n\tprivate Intent mPongTimeoutAlarmIntent = new Intent(PONG_TIMEOUT_ALARM);\n\tprivate XMPPService mService;\n\n\tprivate PongTimeoutAlarmReceiver mPongTimeoutAlarmReceiver = new PongTimeoutAlarmReceiver();\n\tprivate BroadcastReceiver mPingAlarmReceiver = new PingAlarmReceiver();\n\t\n\tprivate final HashSet<String> mucJIDs = new HashSet<String>();\t//< all configured MUCs, joined or not\n\tprivate Map<String, MUCController> multiUserChats = new HashMap<String, MUCController>();\n\tprivate long mucLastPing = 0;\n\tprivate long mucPreviousPing = 0;\n\tprivate Map<String, Presence> subscriptionRequests = new HashMap<String, Presence>();\n\n\n\tpublic SmackableImp(YaximConfiguration config,\n\t\t\tContentResolver contentResolver,\n\t\t\tXMPPService service) {\n\t\tthis.mConfig = config;\n\t\tthis.mContentResolver = contentResolver;\n\t\tthis.mService = service;\n\t\tthis.mAlarmManager = (AlarmManager)mService.getSystemService(Context.ALARM_SERVICE);\n\n\t\tmLastOnline = mLastOffline = System.currentTimeMillis();\n\t\tmPingAlarmIntent.setPackage(mService.getPackageName());\n\t\tmPongTimeoutAlarmIntent.setPackage(mService.getPackageName());\n\t\tmPingAlarmPendIntent = PendingIntent.getBroadcast(mService.getApplicationContext(), 0, mPingAlarmIntent,\n\t\t\t\t\tPendingIntent.FLAG_UPDATE_CURRENT|PendingIntent.FLAG_IMMUTABLE);\n\t\tmPongTimeoutAlarmPendIntent = PendingIntent.getBroadcast(mService.getApplicationContext(), 0, mPongTimeoutAlarmIntent,\n\t\t\t\t\tPendingIntent.FLAG_UPDATE_CURRENT|PendingIntent.FLAG_IMMUTABLE);\n\n\t\tDiscoverInfo.Identity yaxim_identity = new DiscoverInfo.Identity(\"client\",\n\t\t\t\tservice.getString(R.string.app_name),\n\t\t\t\tYaximApplication.XMPP_IDENTITY_TYPE);\n\t\tServiceDiscoveryManager.setDefaultIdentity(yaxim_identity);\n\t\tEntityCapsManager.setDefaultEntityNode(\"https://yaxim.org/\");\n\t}\n\t\t\n\t// this code runs a DNS resolver, might be blocking\n\tprivate synchronized void initXMPPConnection() throws YaximXMPPException {\n\t\tXMPPTCPConnectionConfiguration.Builder cb;\n\t\t// allow custom server / custom port to override SRV record\n\t\ttry {\n\t\t\tif (mConfig.customServer.length() > 0)\n\t\t\t\tcb = XMPPTCPConnectionConfiguration.builder()\n\t\t\t\t\t\t.setXmppDomain(mConfig.server)\n\t\t\t\t\t\t.setHostAddressByNameOrIp(mConfig.customServer)\n\t\t\t\t\t\t.setPort(mConfig.port);\n\t\t\telse\n\t\t\t\tcb = XMPPTCPConnectionConfiguration.builder()\n\t\t\t\t\t\t.setXmppDomain(mConfig.server);\n\t\t} catch (XmppStringprepException e) {\n\t\t\tthrow new YaximXMPPException(\"Invalid server name\", e);\n\t\t}\n\t\tcb.setLanguage(Locale.getDefault());\n\t\tcb.setSendPresence(false);\n\t\tcb.setCompressionEnabled(false); // disable for now\n\t\tSmackConfiguration.DEBUG = mConfig.smackdebug;\n\t\tif (mConfig.require_ssl)\n\t\t\tcb.setSecurityMode(ConnectionConfiguration.SecurityMode.required);\n\n\t\t// register MemorizingTrustManager for XMPP and HTTPS\n\t\ttry {\n\t\t\tTLSUtils.setTLSOnly(cb);\n\t\t\tSSLContext sc = SSLContext.getInstance(\"TLS\");\n\t\t\tMemorizingTrustManager mtm = YaximApplication.getApp().mMTM;\n\t\t\tsc.init(null, new X509TrustManager[] { mtm },\n\t\t\t\t\tnew java.security.SecureRandom());\n\t\t\t// XMPP\n\t\t\tcb.setCustomSSLContext(sc);\n\t\t\tcb.setHostnameVerifier(mtm.wrapHostnameVerifier(\n\t\t\t\t\t\tnew org.apache.http.conn.ssl.StrictHostnameVerifier()));\n\t\t\t// HTTPS (for HTTP Upload)\n\t\t\tHttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());\n\t\t\tHttpsURLConnection.setDefaultHostnameVerifier(mtm.wrapHostnameVerifier(\n\t\t\t\t\t\tHttpsURLConnection.getDefaultHostnameVerifier()));\n\t\t} catch (java.security.GeneralSecurityException e) {\n\t\t\tdebugLog(\"initialize MemorizingTrustManager: \" + e);\n\t\t}\n\n\t\tmXMPPConfig = cb.build();\n\t\tthis.mXMPPConnection = new XMPPTCPConnection(mXMPPConfig);\n\t\tmXMPPConnection.setParsingExceptionCallback(new ParsingExceptionCallback() {\n\t\t\t@Override\n\t\t\tpublic void handleUnparsableStanza(UnparseableStanza up) throws Exception {\n\t\t\t\tException e = up.getParsingException();\n\t\t\t\t// work around Smack throwing up on mod_mam_archive bug\n\t\t\t\tif (e.getMessage().equals(\"variable cannot be null\")) {\n\t\t\t\t\tdebugLog(\"Ignoring invalid disco#info caused by https://prosody.im/issues/issue/870\");\n\t\t\t\t\te.printStackTrace();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tLog.e(TAG, \"parsing exception\", e);\n\t\t\t\tErrorReportManager.get(mService).report(e);\n\t\t\t}\n\t\t});\n\n\t\tmXMPPConnection.addStanzaAcknowledgedListener(new StanzaListener() {\n\t\t\t@Override\n\t\t\tpublic void processStanza(Stanza packet) throws SmackException.NotConnectedException, InterruptedException, SmackException.NotLoggedInException {\n\t\t\t\t//SMAXX per stanza acks\n\t\t\t}\n\t\t});\n\t\tmXMPPConnection.addStanzaDroppedListener(new StanzaListener() {\n\t\t\t@Override\n\t\t\tpublic void processStanza(Stanza packet) throws SmackException.NotConnectedException, InterruptedException, SmackException.NotLoggedInException {\n\t\t\t\tif (packet instanceof Message && packet.getTo() != null) {\n\t\t\t\t\tchangeMessageDeliveryStatus(packet.getTo().toString(), packet.getStanzaId(), ChatConstants.DS_NEW);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tregisterConnectionListener();\n\t\tregisterRosterListener();\n\t\tregisterMessageListener();\n\t\tregisterPresenceListener();\n\t\tregisterPongListener();\n\t\tPingManager.getInstanceFor(mXMPPConnection).registerPingFailedListener(new PingFailedListener() {\n\t\t\t@Override\n\t\t\tpublic void pingFailed() {\n\t\t\t\tLog.w(TAG, \"PingFailedListener invoked!\");\n\t\t\t\tonDisconnected(mService.getString(R.string.conn_ping_timeout));\n\t\t\t}\n\t\t});\n\n\t\tmConfig.reconnect_required = false;\n\n\t\tmultiUserChats = new HashMap<String, MUCController>();\n\t\tinitServiceDiscovery();\n\t}\n\n\tpublic MamManager.MamQuery queryMamAfter(MamManager mm, String jid, String uid,\n\t\t\t\t long fallback_days)\n\t\t\tthrows XMPPException.XMPPErrorException, InterruptedException,\n\t\t\tSmackException.NotConnectedException, SmackException.NotLoggedInException,\n\t\t\tSmackException.NoResponseException {\n\t\tMamManager.MamQueryArgs.Builder mqab = MamManager.MamQueryArgs.builder();\n\t\tif (!TextUtils.isEmpty(uid))\n\t\t\tmqab.afterUid(uid);\n\t\telse {\n\t\t\tLog.d(TAG, \"MAM: no UID for \" + jid + \" - falling back to \" + fallback_days + \" days history\");\n\t\t\tlong history_since = getLatestTimestamp();\n\t\t\tif (history_since < 0)\n\t\t\t\thistory_since = System.currentTimeMillis() - (fallback_days * 24 * 60 * 60 * 1000);\n\n\t\t\tmqab.limitResultsSince(new Date(history_since));\n\t\t}\n\t\treturn mm.queryArchive(mqab.build());\n\t}\n\n\tpublic MamManager.MamQuery queryMamHistory(MamManager mm, String jid, long fallback_days)\n\t\t\tthrows XMPPException.XMPPErrorException, InterruptedException,\n\t\t\tSmackException.NotConnectedException, SmackException.NotLoggedInException,\n\t\t\tSmackException.NoResponseException {\n\t\tString uid = getChatArchiveEntry(null);\n\t\tMamManager.MamQuery mq;\n\t\ttry {\n\t\t\t// attemt a query with the last known unique ID\n\t\t\tmq = queryMamAfter(mm, jid, uid, fallback_days);\n\t\t} catch (XMPPException.XMPPErrorException e) {\n\t\t\tif (StanzaError.Condition.item_not_found == e.getStanzaError().getCondition()) {\n\t\t\t\tLog.d(TAG, \"MAM server: unknown UID \" + uid + \" - falling back to \" + fallback_days + \" days history\");\n\t\t\t\t// work around new XEP-0313 'item-not-found' response if the submitted ID is expired\n\t\t\t\tmq = queryMamAfter(mm, jid, null, fallback_days);\n\t\t\t} else throw e;\n\t\t}\n\t\treturn mq;\n\t}\n\n\t// jid to query MAM for, null for user account\n\tpublic void fetchMam() {\n\t\tmLastError = \"0%\";\n\t\tupdateConnectionState(ConnectionState.LOADING);\n\t\t// TODO: get the right damager\n\t\tMamManager mm = MamManager.getInstanceFor(mXMPPConnection);\n\t\ttry {\n\t\t\t// todo: only on own account\n\t\t\tmConfig.mamSupported = mm.isSupported();\n\t\t\tif (!mConfig.mamSupported)\n\t\t\t\treturn;\n\t\t\tMamManager.MamPrefs mp = mm.retrieveArchivingPreferences().asMamPrefs();\n\t\t\tLog.d(TAG, \"\" + mp);\n\t\t\tif (mp.getDefaultBehavior() != MamPrefsIQ.DefaultBehavior.always) {\n\t\t\t\tmp.setDefaultBehavior(MamPrefsIQ.DefaultBehavior.always);\n\t\t\t\tmm.updateArchivingPreferences(mp);\n\t\t\t}\n\t\t\tMamManager.MamQuery mq = queryMamHistory(mm, null, 31);\n\t\t\tint loaded = mq.getMessageCount();\n\t\t\tfor (Message m : mq.getPage().getMamResultCarrierMessages())\n\t\t\t\tprocessMessage(m, true);\n\t\t\tint total = mq.getPage().getMamFinIq().getRSMSet().getCount();\n\t\t\twhile (!mq.isComplete()) {\n\t\t\t\tif (total >= 0) {\n\t\t\t\t\tmLastError = \"\" + (loaded*99/total) + \"%\";\n\t\t\t\t} else {\n\t\t\t\t\tmLastError = \"\" + loaded + \"/∞\";\n\t\t\t\t}\n\t\t\t\tupdateConnectionState(ConnectionState.LOADING);\n\t\t\t\tloaded = loaded + mq.pageNext(20).size();\n\t\t\t\tfor (Message m : mq.getPage().getMamResultCarrierMessages())\n\t\t\t\t\tprocessMessage(m, true);\n\t\t\t}\n\t\t\tmLastError = \"\";\n\t\t\tupdateConnectionState(ConnectionState.LOADING);\n\t\t\t// TODO: use \"connected\" logo, not hollow one\n\t\t\tmServiceCallBack.displayPendingNotifications(null);\n\t\t\tsendPostponedReceipts();\n\t\t} catch (Exception e) {\n\t\t\te.printStackTrace();\n\t\t}\n\n\t}\n\t// blocking, run from a thread!\n\tpublic void doConnect(boolean create_account) throws YaximXMPPException {\n\t\tmRequestedState = ConnectionState.ONLINE;\n\t\tupdateConnectionState(ConnectionState.CONNECTING);\n\t\tif (mXMPPConnection == null || mConfig.reconnect_required)\n\t\t\tinitXMPPConnection();\n\t\tconnectAndLogin(create_account);\n\t\tif (!mXMPPConnection.isAuthenticated())\n\t\t\tthrow new YaximXMPPException(\"SMACK connected, but authentication failed\");\n\t\tupdateConnectionState(ConnectionState.LOADING);\n\t\tLog.d(TAG, \"connect has returned!\");\n\t\tsyncDbRooms();\n\t\tsendOfflineMessages(null);\n\t\ttry {\n\t\t\tsendUserWatching();\n\t\t} catch (SmackException.NotConnectedException e) {\n\t\t\tthrow new YaximXMPPException(\"sendUserWatching\", e);\n\t\t} catch (Exception e) {\n\t\t\tLog.i(TAG, \"server does not support CSI\");\n\t\t\te.printStackTrace();\n\t\t}\n\t\tregisterPingAlarm();\n\t\ttry {\n\t\t\t// ping the server; once this ping is answered, all offline messages must have arrived\n\t\t\t// -- thx iNPUTmice for the hint\n\t\t\tPingManager.getInstanceFor(mXMPPConnection).pingMyServer();\n\t\t} catch (Exception e) {\n\t\t\tLog.w(TAG, \"Self-Ping during connection setup failed!\");\n\t\t\te.printStackTrace();\n\t\t}\n\n\t\t// we need to \"ping\" the service to let it know we are actually\n\t\t// connected, even when no roster entries will come in\n\t\tif (mState == ConnectionState.LOADING)\n\t\t\tupdateConnectionState(ConnectionState.ONLINE);\n\t\telse throw new YaximXMPPException(\"Connection state after connect is \" + mState);\n\t}\n\n\t// BLOCKING, call on a new Thread!\n\tprivate void updateConnectingThread(Thread new_thread) {\n\t\tif (new_thread == null) {\n\t\t\t// unset current thread if it's still set\n\t\t\tmConnectingThread.compareAndSet(Thread.currentThread(), null);\n\t\t\treturn;\n\t\t}\n\t\tsynchronized (mConnectingThread) {\n\t\t\tif (mConnectingThread.get() == null) {\n\t\t\t\t// no contention, just update\n\t\t\t\tmConnectingThread.set(new_thread);\n\t\t\t} else try {\n\t\t\t\tThread old = mConnectingThread.get();\n\t\t\t\tLog.d(TAG, \"updateConnectingThread: old thread (\" + old + \") is still running, killing it.\");\n\t\t\t\told.interrupt();\n\t\t\t\told.join(0);\n\t\t\t\tLog.d(TAG, \"updateConnectingThread: killed old thread.\");\n\t\t\t} catch (InterruptedException e) {\n\t\t\t\tLog.d(TAG, \"updateConnectingThread: failed to join(): \" + e);\n\t\t\t} finally {\n\t\t\t\tmConnectingThread.set(new_thread);\n\t\t\t}\n\t\t}\n\t}\n\tprivate void finishConnectingThread() {\n\t\tupdateConnectingThread(null);\n\t}\n\n\t/** Non-blocking, synchronized function to connect/disconnect XMPP.\n\t * This code is called from outside and returns immediately. The actual work\n\t * is done on a background thread, and notified via callback.\n\t * @param new_state The state to transition into. Possible values:\n\t * \tOFFLINE to properly close the connection\n\t * \tONLINE to connect\n\t * \tDISCONNECTED when network goes down\n\t * @param create_account When going online, try to register an account.\n\t */\n\t@Override\n\tpublic synchronized void requestConnectionState(ConnectionState new_state, final boolean create_account) {\n\t\tLog.d(TAG, \"requestConnState: \" + mState + \" -> \" + new_state + (create_account ? \" create_account!\" : \"\"));\n\t\tmRequestedState = new_state;\n\t\tif (new_state == mState)\n\t\t\treturn;\n\t\tswitch (new_state) {\n\t\tcase ONLINE:\n\t\t\tswitch (mState) {\n\t\t\tcase RECONNECT_DELAYED:\n\t\t\t\t// TODO: cancel timer\n\t\t\tcase RECONNECT_NETWORK:\n\t\t\tcase DISCONNECTED:\n\t\t\tcase OFFLINE:\n\t\t\t\t// update state before starting thread to prevent race conditions\n\t\t\t\tupdateConnectionState(ConnectionState.CONNECTING);\n\n\t\t\t\tmLastLoginError = null;\n\t\t\t\t// register ping (connection) timeout handler: 2*PACKET_TIMEOUT(30s) + 3s\n\t\t\t\tregisterPongTimeout(2*PACKET_TIMEOUT + 3000, \"connection\");\n\n\t\t\t\tnew Thread(\"connect\") {\n\t\t\t\t\t@Override\n\t\t\t\t\tpublic void run() {\n\t\t\t\t\t\tif (mConnectingThread.get() != null && mXMPPConnection != null) {\n\t\t\t\t\t\t\t// hack: we are not connected yet, so try to abort connect\n\t\t\t\t\t\t\tLog.e(TAG, \"Ongoing connection attempt!\");\n\t\t\t\t\t\t\t//mXMPPConnection.abortConnect();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tupdateConnectingThread(this);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tdoConnect(create_account);\n\t\t\t\t\t\t} catch (IllegalArgumentException e) {\n\t\t\t\t\t\t\t// this might happen when DNS resolution in ConnectionConfiguration fails\n\t\t\t\t\t\t\tonDisconnected(e);\n\t\t\t\t\t\t} catch (IllegalStateException e) {//TODO: work around old smack\n\t\t\t\t\t\t\tonDisconnected(e);\n\t\t\t\t\t\t} catch (YaximXMPPException e) {\n\t\t\t\t\t\t\tonDisconnected(e);\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\tmAlarmManager.cancel(mPongTimeoutAlarmPendIntent);\n\t\t\t\t\t\t\tfinishConnectingThread();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}.start();\n\t\t\t\tbreak;\n\t\t\tcase CONNECTING:\n\t\t\tcase LOADING:\n\t\t\tcase DISCONNECTING:\n\t\t\t\t// ignore all other cases\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase DISCONNECTED:\n\t\t\t// spawn thread to do disconnect\n\t\t\tif (mState == ConnectionState.ONLINE) {\n\t\t\t\t// update state before starting thread to prevent race conditions\n\t\t\t\tupdateConnectionState(ConnectionState.DISCONNECTING);\n\n\t\t\t\t// register ping (connection) timeout handler: PACKET_TIMEOUT(30s)\n\t\t\t\tregisterPongTimeout(PACKET_TIMEOUT, \"forced disconnect\");\n\n\t\t\t\tnew Thread(\"instantShutdown\") {\n\t\t\t\t\tpublic void run() {\n\t\t\t\t\t\tif (mConnectingThread.get() != null && mXMPPConnection != null) {\n\t\t\t\t\t\t\t// hack: we are not connected yet, so try to abort connect\n\t\t\t\t\t\t\tLog.e(TAG, \"Ongoing connection attempt!\");\n\t\t\t\t\t\t\t//mXMPPConnection.abortConnect();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tupdateConnectingThread(this);\n\t\t\t\t\t\tmXMPPConnection.instantShutdown();\n\t\t\t\t\t\tonDisconnected(\"forced disconnect completed\");\n\t\t\t\t\t\tfinishConnectingThread();\n\t\t\t\t\t\t//updateConnectionState(ConnectionState.OFFLINE);\n\t\t\t\t\t}\n\t\t\t\t}.start();\n\t\t\t}\n\t\t\tbreak;\n\t\tcase OFFLINE:\n\t\t\tswitch (mState) {\n\t\t\tcase CONNECTING:\n\t\t\tcase LOADING:\n\t\t\tcase ONLINE:\n\t\t\t\t// update state before starting thread to prevent race conditions\n\t\t\t\tupdateConnectionState(ConnectionState.DISCONNECTING);\n\n\t\t\t\t// register ping (connection) timeout handler: PACKET_TIMEOUT(30s)\n\t\t\t\tregisterPongTimeout(PACKET_TIMEOUT, \"manual disconnect\");\n\n\t\t\t\t// spawn thread to do disconnect\n\t\t\t\tnew Thread(\"disconnect\") {\n\t\t\t\t\tpublic void run() {\n\t\t\t\t\t\tif (mConnectingThread.get() != null && mXMPPConnection != null) {\n\t\t\t\t\t\t\t// hack: we are not connected yet, so try to abort connect\n\t\t\t\t\t\t\tLog.e(TAG, \"Ongoing connection attempt!\");\n\t\t\t\t\t\t\t//mXMPPConnection.abortConnect();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tupdateConnectingThread(this);\n\t\t\t\t\t\t// TODO: unregister Push on *manual* disconnect only, not on Service shutdown\n\t\t\t\t\t\tmXMPPConnection.disconnect();\n\t\t\t\t\t\tmAlarmManager.cancel(mPongTimeoutAlarmPendIntent);\n\t\t\t\t\t\t// we should reset XMPPConnection the next time\n\t\t\t\t\t\tmConfig.reconnect_required = true;\n\t\t\t\t\t\tfinishConnectingThread();\n\t\t\t\t\t\t// reconnect if it was requested in the meantime\n\t\t\t\t\t\tif (mRequestedState == ConnectionState.ONLINE)\n\t\t\t\t\t\t\trequestConnectionState(ConnectionState.ONLINE);\n\t\t\t\t\t}\n\t\t\t\t}.start();\n\t\t\t\tbreak;\n\t\t\tcase DISCONNECTING:\n\t\t\t\tbreak;\n\t\t\tcase DISCONNECTED:\n\t\t\tcase RECONNECT_DELAYED:\n\t\t\t\t// TODO: clear timer\n\t\t\tcase RECONNECT_NETWORK:\n\t\t\t\tupdateConnectionState(ConnectionState.OFFLINE);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase RECONNECT_NETWORK:\n\t\tcase RECONNECT_DELAYED:\n\t\t\tswitch (mState) {\n\t\t\tcase DISCONNECTED:\n\t\t\tcase RECONNECT_NETWORK:\n\t\t\tcase RECONNECT_DELAYED:\n\t\t\t\tupdateConnectionState(new_state);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new IllegalArgumentException(\"Can not go from \" + mState + \" to \" + new_state);\n\t\t\t}\n\t\t}\n\t}\n\t@Override\n\tpublic void requestConnectionState(ConnectionState new_state) {\n\t\trequestConnectionState(new_state, false);\n\t}\n\n\t@Override\n\tpublic ConnectionState getConnectionState() {\n\t\treturn mState;\n\t}\n\n\t@Override\n\tpublic long getConnectionStateTimestamp() {\n\t\treturn (mState == ConnectionState.ONLINE) ? mLastOnline : mLastOffline;\n\t}\n\n\t// called at the end of a state transition\n\tprivate synchronized void updateConnectionState(ConnectionState new_state) {\n\t\tif (new_state == ConnectionState.ONLINE || new_state == ConnectionState.RECONNECT_NETWORK) {\n\t\t\tmLastError = null;\n\t\t\tmLastLoginError = null;\n\t\t}\n\t\tLog.d(TAG, \"updateConnectionState: \" + mState + \" -> \" + new_state + \" (\" + mLastError + \")\");\n\t\tif (new_state == mState && mState != ConnectionState.LOADING)\n\t\t\treturn;\n\t\tif (mState == ConnectionState.ONLINE)\n\t\t\tmLastOffline = System.currentTimeMillis();\n\t\telse if (mState == ConnectionState.OFFLINE || mState == ConnectionState.DISCONNECTED) {\n\t\t\t// clean up roster and MUCs\n\t\t\tremoveOldRosterIfNeeded();\n\t\t}\n\t\tmState = new_state;\n\t\tif (mServiceCallBack != null)\n\t\t\tmServiceCallBack.connectionStateChanged(new_state);\n\t}\n\tprivate void initServiceDiscovery() {\n\t\t// register connection features\n\t\tServiceDiscoveryManager sdm = ServiceDiscoveryManager.getInstanceFor(mXMPPConnection);\n\n\t\t// init Entity Caps manager with storage in app's cache dir\n\t\tif (capsCacheDir == null) {\n\t\t\tcapsCacheDir = new File(mService.getCacheDir(), \"entity-caps-cache\");\n\t\t\tcapsCacheDir.mkdirs();\n\t\t\tEntityCapsManager.setPersistentCache(new SimpleDirectoryPersistentCache(capsCacheDir));\n\t\t}\n\n\t\t// manually add LMC feature (XEP-0308) because it lacks a Manager\n\n\t\tsdm.addFeature(MessageCorrectExtension.NAMESPACE);\n\t\t// same for OOB (XEP-0066)\n\t\tsdm.addFeature(Oob.NAMESPACE);\n\n\t\t// set Version for replies\n\t\tString app_name = mService.getString(R.string.app_name);\n\t\tString build_revision = mService.getString(R.string.build_revision);\n\t\tVersionManager.setAutoAppendSmackVersion(false); // WTF flow? Why are you doing this to me?\n\t\tVersionManager.getInstanceFor(mXMPPConnection).setVersion(\n\t\t\t\tapp_name, build_revision, \"Android\");\n\t}\n\n\tpublic void addRosterItem(String user, String alias, String group, String token)\n\t\t\tthrows YaximXMPPException {\n\t\tsubscriptionRequests.remove(user);\n\t\tmConfig.whitelistInvitationJID(user);\n\t\ttryToAddRosterEntry(user, alias, group, token);\n\t}\n\n\tpublic void removeRosterItem(String user) throws YaximXMPPException {\n\t\tdebugLog(\"removeRosterItem(\" + user + \")\");\n\t\tsubscriptionRequests.remove(user);\n\t\ttryToRemoveRosterEntry(user);\n\t}\n\n\tpublic void renameRosterItem(String user, String newName)\n\t\t\tthrows YaximXMPPException {\n\t\tRosterEntry rosterEntry;\n\t\ttry {\n\t\t\trosterEntry = mRoster.getEntry(JidCreate.bareFrom(user));\n\t\t} catch (XmppStringprepException e) {\n\t\t\te.printStackTrace();\n\t\t\tthrow new YaximXMPPException(\"Invalid JID\", e);\n\t\t}\n\n\t\tif (!(newName.length() > 0) || (rosterEntry == null)) {\n\t\t\tthrow new YaximXMPPException(\"JabberID to rename is invalid!\");\n\t\t}\n\t\ttry {\n\t\t\trosterEntry.setName(newName);\n\t\t} catch (Exception e) {\n\t\t\te.printStackTrace();\n\t\t\tthrow new YaximXMPPException(\"Roster change failed\", e);\n\t\t}\n\t}\n\n\tpublic void addRosterGroup(String group) {\n\t\tmRoster.createGroup(group);\n\t}\n\n\tpublic void renameRosterGroup(String group, String newGroup) throws YaximXMPPException {\n\t\tRosterGroup groupToRename = mRoster.getGroup(group);\n\t\ttry {\n\t\t\tgroupToRename.setName(newGroup);\n\t\t} catch (Exception e) {\n\t\t\tthrow new YaximXMPPException(\"renameRosterGroup\", e);\n\t\t}\n\t}\n\n\tpublic void moveRosterItemToGroup(String user, String group)\n\t\t\tthrows YaximXMPPException {\n\t\ttryToMoveRosterEntryToGroup(user, group);\n\t}\n\n\tpublic void sendPresenceRequest(String user, String type) throws YaximXMPPException {\n\t\t// HACK: remove the fake roster entry added by handleIncomingSubscribe()\n\t\tif (user == null) {\n\t\t\tfor (String[] jid_name : ChatHelper.getRosterContacts(mService, ChatHelper.ROSTER_FILTER_SUBSCRIPTIONS)) {\n\t\t\t\tsendPresenceRequest(jid_name[0], type);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tsubscriptionRequests.remove(user);\n\t\tif (\"unsubscribed\".equals(type))\n\t\t\tdeleteRosterEntryFromDB(user);\n\t\tPresence response = new Presence(Presence.Type.valueOf(type));\n\t\tresponse.setTo(user);\n\t\ttry {\n\t\t\tmXMPPConnection.sendStanza(response);\n\t\t} catch (Exception e) {\n\t\t\tthrow new YaximXMPPException(\"sendPresenceRequest\", e);\n\t\t}\n\t}\n\t\n\t@Override\n\tpublic String changePassword(String newPassword) {\n\t\ttry {\n\t\t\tAccountManager.getInstance(mXMPPConnection).changePassword(newPassword);\n\t\t\treturn \"OK\"; //HACK: hard coded string to differentiate from failure modes\n\t\t} catch (XMPPException.XMPPErrorException e) {\n\t\t\tif (e.getStanzaError() != null)\n\t\t\t\treturn e.getStanzaError().toString();\n\t\t\telse\n\t\t\t\treturn e.getLocalizedMessage();\n\t\t} catch (Exception e) {\n\t\t\te.printStackTrace();\n\t\t\treturn e.getLocalizedMessage();\n\t\t}\n\t}\n\n\tprivate void onDisconnected(String reason) {\n\t\tunregisterPongListener();\n\t\tmLastError = reason;\n\t\tupdateConnectionState(ConnectionState.DISCONNECTED);\n\t}\n\tprivate void onDisconnected(Throwable reason) {\n\t\tLog.e(TAG, \"onDisconnected: \" + reason);\n\t\treason.printStackTrace();\n\t\tif (reason instanceof YaximXMPPException && reason.getCause() != null)\n\t\t\treason = reason.getCause();\n\t\tif (reason instanceof XMPPException.StreamErrorException) {\n\t\t\tStreamError se = ((XMPPException.StreamErrorException)reason).getStreamError();\n\t\t\tif (se != null && se.getCondition().equals(StreamError.Condition.conflict))\n\t\t\t\tmConfig.generateNewResource();\n\t\t\t// XXX: getCondition() isn't human-readable, but we lack i18n for it yet\n\t\t\tonDisconnected(se.getCondition() + \" \" + se.getDescriptiveText());\n\t\t\treturn;\n\t\t}\n\t\tif (reason instanceof XMPPException || reason instanceof SmackException) {\n\t\t\tmLastLoginError = (Exception)reason;\n\t\t}\n\t\t// iterate through to the deepest exception\n\t\twhile (reason.getCause() != null && !(reason.getCause().getClass().getSimpleName().equals(\"GaiException\")))\n\t\t\treason = reason.getCause();\n\t\tif (reason instanceof SmackException.ConnectionException) {\n\t\t\tList<HostAddress> fail = ((SmackException.ConnectionException)reason).getFailedAddresses();\n\t\t\tif (fail.size() > 0) {\n\t\t\t\treason = fail.get(0).getExceptions().values().iterator().next();\n\t\t\t\t// reiterate on the inner reason\n\t\t\t\twhile (reason.getCause() != null && !(reason.getCause().getClass().getSimpleName().equals(\"GaiException\")))\n\t\t\t\t\treason = reason.getCause();\n\t\t\t}\n\t\t}\n\t\tonDisconnected(reason.getLocalizedMessage());\n\t}\n\n\tprivate void registerConnectionListener() {\n\t\tif (mConnectionListener != null)\n\t\t\tmXMPPConnection.removeConnectionListener(mConnectionListener);\n\t\tmConnectionListener = new ConnectionListener() {\n\t\t\tpublic void connected(XMPPConnection c) {\n\t\t\t\tLog.d(TAG, \"connected\");\n\t\t\t}\n\t\t\tpublic void authenticated(XMPPConnection c, boolean resumed) {\n\t\t\t\tLog.d(TAG, \"authenticated, resumed=\" + resumed);\n\t\t\t\tgotServerPong(\"connection\");\n\t\t\t\tif (!resumed) {\n\t\t\t\t\tmLastOnline = System.currentTimeMillis();\n\t\t\t\t\tcleanupMUCsRoster(true);\n\t\t\t\t\tcleanupMUCsList(); /* TODO: this is a workaround for smack4 not updating the list */\n\t\t\t\t\tdiscoverServicesAsync();\n\t\t\t\t\tnew PushManager(mService, mXMPPConnection).enableAccountPush();\n\t\t\t\t\tfetchMam();\n\t\t\t\t\tsetStatusFromConfig();\n\t\t\t\t}\n\t\t\t}\n\t\t\tpublic void connectionClosedOnError(Exception e) {\n\t\t\t\t// XXX: this is the only callback we get from errors, so\n\t\t\t\t// we need to check for non-resumability and work around\n\t\t\t\t// here:\n\t\t\t\tif (!mXMPPConnection.isSmResumptionPossible()) {\n\t\t\t\t\tcleanupMUCsList();\n\t\t\t\t}\n\t\t\t\tonDisconnected(e);\n\t\t\t}\n\t\t\tpublic void connectionClosed() {\n\t\t\t\t// TODO: fix reconnect when we got kicked by the server or SM failed!\n\t\t\t\t//onDisconnected(null);\n\t\t\t\tcleanupMUCsList();\n\t\t\t\tupdateConnectionState(ConnectionState.OFFLINE);\n\t\t\t}\n\t\t\tpublic void reconnectingIn(int seconds) { }\n\t\t\tpublic void reconnectionFailed(Exception e) { }\n\t\t\tpublic void reconnectionSuccessful() { }\n\t\t};\n\t\tmXMPPConnection.addConnectionListener(mConnectionListener);\n\t}\n\t/** establishes an XMPP connection and performs login / account creation.\n\t *\n\t * @param create_account\n\t * @return true if this is a new session, as opposed to a resumed one\n\t * @throws YaximXMPPException\n\t */\n\tprivate void connectAndLogin(boolean create_account) throws YaximXMPPException {\n\t\ttry {\n\t\t\ttry {\n\t\t\t\tdebugLog(\"connectAndLogin: force-instant-shutdown!\");\n\t\t\t\tmXMPPConnection.instantShutdown(); // blocking shutdown prior to re-connection\n\t\t\t} catch (Exception e) {\n\t\t\t\tdebugLog(\"conn.shutdown() failed, ignoring: \" + e);\n\t\t\t}\n\t\t\tdebugLog(\"connectAndLogin: entering synchronized mXMPPConnection\");\n\t\t\tsynchronized (mXMPPConnection) {\n\t\t\t\tdebugLog(\"connectAndLogin: within synchronized mXMPPConnection\");\n\t\t\t\tmXMPPConnection.connect();\n\t\t\t\tif (create_account) {\n\t\t\t\t\tif (!TextUtils.isEmpty(mConfig.initialPreAuth) && mXMPPConnection.hasFeature(\"register\", \"urn:xmpp:invite\")) {\n\t\t\t\t\t\tLog.d(TAG, \"sending pre-auth token to server: \" + mConfig.initialPreAuth);\n\t\t\t\t\t\tPreAuth.PreAuthIQ preauth = new PreAuth.PreAuthIQ(mConfig.initialPreAuth);\n\t\t\t\t\t\tmXMPPConnection.createStanzaCollectorAndSend(new StanzaIdFilter(preauth.getStanzaId()), preauth)\n\t\t\t\t\t\t\t.nextResultOrThrow();\n\t\t\t\t\t}\n\t\t\t\t\tLog.d(TAG, \"creating new server account...\");\n\t\t\t\t\tAccountManager am = AccountManager.getInstance(mXMPPConnection);\n\t\t\t\t\tam.createAccount(Localpart.from(mConfig.userName), mConfig.password);\n\t\t\t\t}\n\t\t\t\tmXMPPConnection.login(mConfig.userName, mConfig.password,\n\t\t\t\t\t\tResourcepart.from(mConfig.ressource));\n\t\t\t}\n\t\t\tdebugLog(\"connectAndLogin: left synchronized mXMPPConnection\");\n\t\t\tLog.d(TAG, \"SM: can resume = \" + mXMPPConnection.isSmResumptionPossible());\n\t\t} catch (Exception e) {\n\t\t\t// actually we just care for IllegalState or NullPointer or XMPPEx.\n\t\t\tthrow new YaximXMPPException(\"connectAndLogin failed\", e);\n\t\t}\n\t}\n\n\tprivate void tryToMoveRosterEntryToGroup(String userName, String groupName)\n\t\t\tthrows YaximXMPPException {\n\t\ttry {\n\t\t\tRosterGroup rosterGroup = getRosterGroup(groupName);\n\t\t\tRosterEntry rosterEntry = mRoster.getEntry(JidCreate.bareFrom(userName));\n\t\t\tremoveRosterEntryFromGroups(rosterEntry);\n\n\t\t\tif (groupName.length() == 0)\n\t\t\t\treturn;\n\t\t\telse {\n\t\t\t\trosterGroup.addEntry(rosterEntry);\n\t\t\t}\n\t\t} catch (Exception e) {\n\t\t\te.printStackTrace();\n\t\t\tthrow new YaximXMPPException(\"tryToMoveRosterEntryToGroup\", e);\n\t\t}\n\n\t}\n\n\tprivate RosterGroup getRosterGroup(String groupName) {\n\t\tRosterGroup rosterGroup = mRoster.getGroup(groupName);\n\n\t\t// create group if unknown\n\t\tif ((groupName.length() > 0) && rosterGroup == null) {\n\t\t\trosterGroup = mRoster.createGroup(groupName);\n\t\t}\n\t\treturn rosterGroup;\n\n\t}\n\n\tprivate void removeRosterEntryFromGroups(RosterEntry rosterEntry)\n\t\t\tthrows YaximXMPPException {\n\t\tCollection<RosterGroup> oldGroups = rosterEntry.getGroups();\n\n\t\tfor (RosterGroup group : oldGroups) {\n\t\t\ttryToRemoveUserFromGroup(group, rosterEntry);\n\t\t}\n\t}\n\n\tprivate void tryToRemoveUserFromGroup(RosterGroup group,\n\t\t\tRosterEntry rosterEntry) throws YaximXMPPException {\n\t\ttry {\n\t\t\tgroup.removeEntry(rosterEntry);\n\t\t} catch (Exception e) {\n\t\t\tthrow new YaximXMPPException(\"tryToRemoveUserFromGroup\", e);\n\t\t}\n\t}\n\n\tprivate void tryToRemoveRosterEntry(String user) throws YaximXMPPException {\n\t\ttry {\n\t\t\tRosterEntry rosterEntry = mRoster.getEntry(JidCreate.bareFrom(user));\n\n\t\t\tif (rosterEntry != null) {\n\t\t\t\t// first, unsubscribe the user\n\t\t\t\tPresence unsub = new Presence(Presence.Type.unsubscribed);\n\t\t\t\tunsub.setTo(rosterEntry.getUser());\n\t\t\t\tmXMPPConnection.sendStanza(unsub);\n\t\t\t\t// then, remove from roster\n\t\t\t\tmRoster.removeEntry(rosterEntry);\n\t\t\t}\n\t\t} catch (Exception e) {\n\t\t\tthrow new YaximXMPPException(\"tryToRemoveRosterEntry\", e);\n\t\t}\n\t}\n\n\tprivate void tryToAddRosterEntry(String user, String alias, String group, String token)\n\t\t\tthrows YaximXMPPException {\n\t\ttry {\n\t\t\t// send a presence subscription request with token (must be before roster action!)\n\t\t\tif (token != null && token.length() > 0) {\n\t\t\t\tPresence preauth = new Presence(Presence.Type.subscribe);\n\t\t\t\tpreauth.setTo(user);\n\t\t\t\tpreauth.addExtension(new PreAuth(token));\n\t\t\t\tmXMPPConnection.sendStanza(preauth);\n\t\t\t}\n\t\t\t// add to roster, triggers another sub request by Smack (sigh)\n\t\t\tmRoster.createEntry(JidCreate.bareFrom(user), alias, new String[] { group });\n\t\t\t// send a pre-approval\n\t\t\tPresence pre_approval = new Presence(Presence.Type.subscribed);\n\t\t\tpre_approval.setTo(user);\n\t\t\tmXMPPConnection.sendStanza(pre_approval);\n\t\t\tmConfig.whitelistInvitationJID(user);\n\t\t} catch (Exception e) {\n\t\t\tthrow new YaximXMPPException(\"tryToAddRosterEntry\", e);\n\t\t}\n\t}\n\n\tprivate void removeOldRosterEntries() {\n\t\tLog.d(TAG, \"removeOldRosterEntries()\");\n\t\tCollection<RosterEntry> rosterEntries = mRoster.getEntries();\n\t\tStringBuilder exclusion = new StringBuilder(RosterConstants.JID + \" NOT IN (\");\n\t\tboolean first = true;\n\t\t\n\t\tfor (RosterEntry rosterEntry : rosterEntries) {\n\t\t\tif (first)\n\t\t\t\tfirst = false;\n\t\t\telse\n\t\t\t\texclusion.append(\",\");\n\t\t\texclusion.append(\"'\").append(rosterEntry.getUser()).append(\"'\");\n\t\t}\n\t\t\n\t\texclusion.append(\") AND \"+RosterConstants.GROUP+\" NOT IN ('\" + RosterProvider.RosterConstants.MUCS + \"');\");\n\t\tint count = mContentResolver.delete(RosterProvider.CONTENT_URI, exclusion.toString(), null);\n\t\tLog.d(TAG, \"deleted \" + count + \" old roster entries\");\n\t}\n\n\tprivate void removeOldRosterIfNeeded() {\n\t\tif (!mConfig.rosterreset_required)\n\t\t\treturn;\n\t\tLog.d(TAG, \"removeOldRoster()\");\n\t\tint count = mContentResolver.delete(RosterProvider.CONTENT_URI, null, null);\n\t\tint muc_count = mContentResolver.delete(RosterProvider.MUCS_URI, null, null);\n\t\tLog.d(TAG, \"deleted \" + count + \" old roster entries and \" + muc_count + \" MUCs.\");\n\t\tmConfig.rosterreset_required = false;\n\t}\n\n\t// HACK: add an incoming subscription request as a fake roster entry\n\tprivate void handleIncomingSubscribe(Presence request) {\n\t\t// perform Pre-Authenticated Roster Subscription, fallback to manual\n\t\ttry {\n\t\t\tJid jid = request.getFrom();\n\t\t\tPreAuth preauth = (PreAuth)request.getExtension(PreAuth.ELEMENT, PreAuth.NAMESPACE);\n\t\t\tString jid_or_token = jid.toString();\n\t\t\tif (preauth != null) {\n\t\t\t\tjid_or_token = preauth.getToken();\n\t\t\t\tLog.d(TAG, \"PARS: found token \" + jid_or_token);\n\t\t\t}\n\t\t\tif (mConfig.redeemInvitationCode(jid_or_token)) {\n\t\t\t\tLog.d(TAG, \"PARS: approving request from \" + jid);\n\t\t\t\tif (mRoster.getEntry(request.getFrom().asBareJid()) != null) {\n\t\t\t\t\t// already in roster, only send approval\n\t\t\t\t\tPresence response = new Presence(Presence.Type.subscribed);\n\t\t\t\t\tresponse.setTo(jid);\n\t\t\t\t\tmXMPPConnection.sendStanza(response);\n\t\t\t\t} else {\n\t\t\t\t\ttryToAddRosterEntry(jid.toString(), null, \"\", null);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t} catch (Exception e) {\n\t\t\tLog.d(TAG, \"PARS: failed to send response: \" + e);\n\t\t}\n\n\t\tsubscriptionRequests.put(request.getFrom().toString(), request);\n\n\t\tfinal ContentValues values = new ContentValues();\n\n\t\tvalues.put(RosterConstants.JID, request.getFrom().toString());\n\t\tvalues.put(RosterConstants.STATUS_MODE, getStatusInt(request));\n\t\tvalues.put(RosterConstants.STATUS_MESSAGE, request.getStatus());\n\t\tif (!mRoster.contains(request.getFrom().asBareJid())) {\n\t\t\t// reset alias and group for new entries\n\t\t\tvalues.put(RosterConstants.ALIAS, request.getFrom().toString());\n\t\t\tvalues.put(RosterConstants.GROUP, \"\");\n\t\t};\n\t\tupsertRoster(values, request.getFrom().toString());\n\t}\n\n\tpublic void setStatusFromConfig(Presence presence) {\n\t\tMode mode = Mode.valueOf(mConfig.getPresenceMode().toString());\n\t\tpresence.setMode(mode);\n\t\tpresence.setStatus(mConfig.statusMessage);\n\t\tpresence.setPriority(mConfig.priority);\n\t}\n\tpublic void setStatusFromConfig() {\n\t\t// TODO: only call this when carbons changed, not on every presence change\n\t\ttry {\n\t\t\tCarbonManager.getInstanceFor(mXMPPConnection).sendCarbonsEnabled(mConfig.messageCarbons);\n\n\t\t\tPresence presence = new Presence(Presence.Type.available);\n\t\t\tsetStatusFromConfig(presence);\n\t\t\tmXMPPConnection.sendStanza(presence);\n\t\t\tmConfig.presence_required = false;\n\n\t\t\tIterator<MUCController> muc_it = multiUserChats.values().iterator();\n\t\t\twhile (muc_it.hasNext()) {\n\t\t\t\tMUCController mucc = muc_it.next();\n\t\t\t\tMultiUserChat muc = mucc.muc;\n\t\t\t\tif (!muc.isJoined())\n\t\t\t\t\tcontinue;\n\t\t\t\tPresence muc_presence = new Presence(presence.getType(),\n\t\t\t\t\t\tpresence.getStatus(), presence.getPriority(), presence.getMode());\n\t\t\t\tmuc_presence.setTo(muc.getRoom() + \"/\" + muc.getNickname());\n\t\t\t\tmXMPPConnection.sendStanza(muc_presence);\n\t\t\t}\n\t\t} catch (SmackException.NotConnectedException e) {\n\t\t\te.printStackTrace();\n\t\t} catch (InterruptedException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\n\t}\n\n\tpublic Message formatMessage(boolean is_muc, String to, String body, String lmc, String oob) {\n\t\tfinal Message newMessage;\n\t\ttry {\n\t\t\tnewMessage = new Message(JidCreate.from(to), is_muc ? Message.Type.groupchat : Message.Type.chat);\n\t\t} catch (XmppStringprepException e) {\n\t\t\te.printStackTrace();\n\t\t\treturn null;\n\t\t}\n\t\tnewMessage.setBody(body);\n\t\tif (!is_muc) {\n\t\t\tnewMessage.addExtension(new DeliveryReceiptRequest());\n\t\t\t// If the JID has a \"/\", it's a MUC-PM; add <x/> according to XEP-0045 v1.28\n\t\t\tif (to.contains(\"/\"))\n\t\t\t\tnewMessage.addExtension(new MUCUser());\n\t\t}\n\t\tif (!TextUtils.isEmpty(lmc))\n\t\t\tnewMessage.addExtension(new MessageCorrectExtension(lmc));\n\t\tif (!TextUtils.isEmpty(oob))\n\t\t\tnewMessage.addExtension(new Oob(oob));\n\t\treturn newMessage;\n\t}\n\n\tpublic void sendOfflineMessages(String toMUCjid) throws YaximXMPPException {\n\t\tboolean is_muc = (toMUCjid != null);\n\t\tString selection = SEND_OFFLINE_SELECTION;\n\t\tString[] selection_args = null;\n\t\tif (is_muc) {\n\t\t\tselection = selection + \" AND jid = ?\";\n\t\t\tselection_args = new String[] { toMUCjid };\n\t\t}\n\t\tCursor cursor = mContentResolver.query(ChatProvider.CONTENT_URI,\n\t\t\t\tSEND_OFFLINE_PROJECTION, selection,\n\t\t\t\tselection_args, null);\n\t\tfinal int      _ID_COL = cursor.getColumnIndexOrThrow(ChatConstants._ID);\n\t\tfinal int      JID_COL = cursor.getColumnIndexOrThrow(ChatConstants.JID);\n\t\tfinal int      MSG_COL = cursor.getColumnIndexOrThrow(ChatConstants.MESSAGE);\n\t\tfinal int MSGFLAGS_COL = cursor.getColumnIndexOrThrow(ChatConstants.MSGFLAGS);\n\t\tfinal int      LMC_COL = cursor.getColumnIndexOrThrow(ChatConstants.CORRECTION);\n\t\tfinal int    EXTRA_COL = cursor.getColumnIndexOrThrow(ChatConstants.EXTRA);\n\t\tfinal int       TS_COL = cursor.getColumnIndexOrThrow(ChatConstants.DATE);\n\t\tfinal int PACKETID_COL = cursor.getColumnIndexOrThrow(ChatConstants.PACKET_ID);\n\t\tContentValues mark_sent = new ContentValues();\n\t\tmark_sent.put(ChatConstants.DELIVERY_STATUS, ChatConstants.DS_SENT_OR_READ);\n\t\twhile (cursor.moveToNext()) {\n\t\t\tlong _id = cursor.getLong(_ID_COL);\n\t\t\tString toJID = cursor.getString(JID_COL);\n\t\t\tif (!is_muc && mucJIDs.contains(toJID))\n\t\t\t\tcontinue;\n\t\t\tString message = cursor.getString(MSG_COL);\n\t\t\tString packetID = cursor.getString(PACKETID_COL);\n\t\t\tint msgFlags = cursor.getInt(MSGFLAGS_COL);\n\t\t\tString lmc = cursor.getString(LMC_COL);\n\t\t\tString extra = cursor.getString(EXTRA_COL);\n\t\t\tString oob = ((msgFlags & ChatConstants.MF_FILE) != 0) ? extra : null;\n\t\t\tlong ts = cursor.getLong(TS_COL);\n\t\t\tLog.d(TAG, \"sendOfflineMessages: \" + toJID + \" > \" + message);\n\t\t\tfinal Message newMessage = formatMessage(is_muc, toJID, message, lmc, oob);\n\t\t\tDelayInformation delay = new DelayInformation(new Date(ts));\n\t\t\tnewMessage.addExtension(delay);\n\t\t\t//SMAXX newMessage.addExtension(new DelayInfo(delay));\n\t\t\tif ((packetID != null) && (packetID.length() > 0)) {\n\t\t\t\tnewMessage.setPacketID(packetID);\n\t\t\t} else {\n\t\t\t\tpacketID = newMessage.getStanzaId();\n\t\t\t}\n\t\t\tmark_sent.put(ChatConstants.PACKET_ID, packetID);\n\t\t\tmark_sent.put(ChatConstants.MSGFLAGS, msgFlags | ChatConstants.MF_DELAY);\n\t\t\tUri rowuri = Uri.parse(\"content://\" + ChatProvider.AUTHORITY\n\t\t\t\t+ \"/\" + ChatProvider.TABLE_NAME + \"/\" + _id);\n\t\t\tmContentResolver.update(rowuri, mark_sent,\n\t\t\t\t\t\tnull, null);\n\t\t\ttry {\n\t\t\t\tmXMPPConnection.sendStanza(newMessage);\t\t// must be after marking delivered, otherwise it may override the SendFailListener\n\t\t\t} catch (Exception e) {\n\t\t\t\tthrow new YaximXMPPException(\"sendOfflineMessages\", e);\n\t\t\t}\n\t\t}\n\t\tcursor.close();\n\t}\n\n\tpublic static ContentValues formatMessageContentValues(int direction, String jid, String resource,\n\t\t\tString message, int msgflags, String lmc, String extra,\n\t\t\tint delivery_status, String packetID, String uniqueID) {\n\t\tContentValues values = new ContentValues();\n\t\tvalues.put(ChatConstants.DIRECTION, direction);\n\t\tvalues.put(ChatConstants.JID, jid);\n\t\tvalues.put(ChatConstants.RESOURCE, resource);\n\t\tvalues.put(ChatConstants.MESSAGE, message);\n\t\tvalues.put(ChatConstants.MSGFLAGS, msgflags);\n\t\tvalues.put(ChatConstants.CORRECTION, lmc);\n\t\tvalues.put(ChatConstants.EXTRA, extra);\n\t\tvalues.put(ChatConstants.DELIVERY_STATUS, delivery_status);\n\t\tvalues.put(ChatConstants.PACKET_ID, packetID);\n\t\tvalues.put(ChatConstants.UNIQUE_ID, uniqueID);\n\t\treturn values;\n\t}\n\n\tpublic static void addOfflineMessage(ContentResolver cr, String toJID, String message) {\n\t\tContentValues values = formatMessageContentValues(ChatConstants.OUTGOING, toJID, null,\n\t\t\tmessage, ChatConstants.MF_TEXT, null, null,\n\t\t\tChatConstants.DS_NEW, StanzaIdUtil.newStanzaId(), null);\n\t\tvalues.put(ChatConstants.DATE, System.currentTimeMillis());\n\t\tcr.insert(ChatProvider.CONTENT_URI, values);\n\t}\n\n\t// an optimized structure to hold pending receipt requests during MAM sync.\n\t// We need this to be accessible by JID and stanza @id, to maintain order of the @id's\n\t// and we optimize by sending it back ordered by the JID so that the recipient gets less TCP\n\t// packets.\n\tHashMap<Jid, LinkedHashMap<String, Message.Type>> postponedReceipts = new HashMap<>();\n\n\tpublic void sendReceipt(Jid jid, String stanza_id, Message.Type original_type) {\n\t\tMessage ack = new Message(jid, original_type);\n\t\tack.addExtension(new DeliveryReceipt(stanza_id));\n\t\t// MUC-PM special sauce\n\t\tif (jid.hasResource())\n\t\t\tack.addExtension(new MUCUser());\n\t\ttry {\n\t\t\tmXMPPConnection.sendStanza(ack);\n\t\t} catch (Exception e) {\n\t\t\te.printStackTrace();\n\t\t\t// whoops!\n\t\t}\n\t}\n\tpublic void postponeReceipt(Jid jid, String stanza_id, Message.Type original_type) {\n\t\tsynchronized (postponedReceipts) {\n\t\t\tLinkedHashMap<String, Message.Type> jidReceipts = postponedReceipts.get(jid);\n\t\t\tif (jidReceipts == null) {\n\t\t\t\tjidReceipts = new LinkedHashMap<>();\n\t\t\t\tpostponedReceipts.put(jid, jidReceipts);\n\t\t\t}\n\t\t\tjidReceipts.put(stanza_id, original_type);\n\t\t}\n\t}\n\tpublic void cancelPostponedReceipt(Jid jid, String stanza_id) {\n\t\tsynchronized (postponedReceipts) {\n\t\t\tLinkedHashMap<String, Message.Type> jidReceipts = postponedReceipts.get(jid);\n\t\t\tif (jidReceipts != null) {\n\t\t\t\tjidReceipts.remove(stanza_id);\n\t\t\t\tif (jidReceipts.isEmpty())\n\t\t\t\t\tpostponedReceipts.remove(jid);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic void sendReceiptIfRequested(Message packet, Jid effective_jid, boolean is_history_sync) {\n\t\tDeliveryReceiptRequest drr = (DeliveryReceiptRequest)packet.getExtension(\n\t\t\t\tDeliveryReceiptRequest.ELEMENT, DeliveryReceipt.NAMESPACE);\n\t\tif (drr != null) {\n\t\t\tif (packet.getType() != Message.Type.chat && packet.getType() != Message.Type.normal) {\n\t\t\t\tLog.w(TAG, \"Ignoring receipt request from \" + packet.getFrom() + \" for type \" + packet.getType());\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (is_history_sync)\n\t\t\t\tpostponeReceipt(effective_jid, packet.getStanzaId(), packet.getType());\n\t\t\telse\n\t\t\t\tsendReceipt(effective_jid, packet.getStanzaId(), packet.getType());\n\t\t}\n\t}\n\n\tpublic void sendPostponedReceipts() {\n\t\tsynchronized (postponedReceipts) {\n\t\t\tfor (Map.Entry<Jid, LinkedHashMap<String, Message.Type>> jidReceipts : postponedReceipts.entrySet()) {\n\t\t\t\tLinkedHashMap<String, Message.Type> receipts = jidReceipts.getValue();\n\t\t\t\tLog.d(TAG, \"pending receipts \" + jidReceipts.getKey() + \": \" + receipts.keySet());\n\t\t\t\tfor (Map.Entry<String, Message.Type> receipt : receipts.entrySet())\n\t\t\t\t\tsendReceipt(jidReceipts.getKey(), receipt.getKey(), receipt.getValue());\n\t\t\t\treceipts.clear();\n\t\t\t}\n\t\t\tpostponedReceipts.clear();\n\t\t}\n\t}\n\n\tpublic void sendMessage(String toJID, String message, String lmc, String oob, long upsert_id) {\n\t\tfinal Message newMessage = formatMessage(mucJIDs.contains(toJID), toJID, message, lmc, oob);\n\t\tboolean is_auth = isAuthenticated();\n\t\tint msgFlags = TextUtils.isEmpty(oob) ? ChatConstants.MF_TEXT : ChatConstants.MF_FILE;\n\t\tint deliveryStatus = is_auth ? ChatConstants.DS_SENT_OR_READ : ChatConstants.DS_NEW;\n\t\tContentValues cv = formatMessageContentValues(ChatConstants.OUTGOING, toJID, null,\n\t\t\t\tmessage, msgFlags, lmc, oob, deliveryStatus, newMessage.getStanzaId(), null);\n\t\taddChatMessageToDB(toJID, cv, 0, upsert_id);\n\t\tif (is_auth) {\n\t\t\ttry {\n\t\t\t\tmXMPPConnection.sendStanza(newMessage);\n\t\t\t} catch (Exception e) {\n\t\t\t\t// send failed\n\t\t\t\tchangeMessageDeliveryStatus(toJID, newMessage.getStanzaId(), ChatConstants.DS_NEW, null);\n\t\t\t}\n\t\t}\n\t}\n\tpublic void sendMessage(String toJID, String message) {\n\t\tsendMessage(toJID, message, null, null, -1);\n\t}\n\tpublic void sendMessageCorrection(String toJID, String message, String lmc, long upsert_id) {\n\t\tsendMessage(toJID, message, lmc, null, upsert_id);\n\t}\n\n\t// method checks whether the XMPP connection is authenticated and fully bound (i.e. after resume/bind)\n\tpublic boolean isAuthenticated() {\n\t\tif (mXMPPConnection != null) {\n\t\t\treturn mXMPPConnection.isConnected() && mXMPPConnection.isAuthenticated() &&\n\t\t\t\t\tmState != ConnectionState.CONNECTING;\n\t\t}\n\t\treturn false;\n\t}\n\n\tpublic void registerCallback(XMPPServiceCallback callBack) {\n\t\tthis.mServiceCallBack = callBack;\n\t\tmService.registerReceiver(mPingAlarmReceiver, new IntentFilter(PING_ALARM), Context.RECEIVER_EXPORTED);\n\t\tmService.registerReceiver(mPongTimeoutAlarmReceiver, new IntentFilter(PONG_TIMEOUT_ALARM), Context.RECEIVER_EXPORTED);\n\t}\n\n\tpublic void unRegisterCallback() {\n\t\tdebugLog(\"unRegisterCallback()\");\n\t\t// remove callbacks _before_ tossing old connection\n\t\ttry {\n\t\t\tRoster.getInstanceFor(mXMPPConnection).removeRosterListener(mRosterListener);\n\t\t\tmXMPPConnection.removeAsyncStanzaListener(mStanzaListener);\n\t\t\tmXMPPConnection.removeAsyncStanzaListener(mPresenceListener);\n\n\t\t\tmXMPPConnection.removeAsyncStanzaListener(mPongListener);\n\t\t\tunregisterPongListener();\n\t\t} catch (Exception e) {\n\t\t\t// ignore it!\n\t\t\te.printStackTrace();\n\t\t}\n\t\trequestConnectionState(ConnectionState.OFFLINE);\n\t\tsetStatusOffline();\n\t\tmService.unregisterReceiver(mPingAlarmReceiver);\n\t\tmService.unregisterReceiver(mPongTimeoutAlarmReceiver);\n//\t\tmultiUserChats.clear(); // TODO: right place\n\t\tthis.mServiceCallBack = null;\n\t}\n\t\n\tpublic String getNameForJID(String jid) {\n\t\tif (jid.contains(\"/\")) { // MUC-PM\n\t\t\tString[] jid_parts = jid.split(\"/\", 2);\n\t\t\treturn String.format(\"%s (%s)\", jid_parts[1],\n\t\t\t\t\tChatRoomHelper.getRoomName(mService, jid_parts[0]));\n\t\t}\n\t\tRosterEntry re = null;\n\t\ttry {\n\t\t\tre = mRoster.getEntry(JidCreate.bareFrom(jid));\n\t\t} catch (XmppStringprepException e) {\n\t\t\t// ignore exception and fall back to JID\n\t\t}\n\t\tif (null != re && null != re.getName() && re.getName().length() > 0) {\n\t\t\treturn re.getName();\n\t\t} else if (mucJIDs.contains(jid)) {\n\t\t\treturn ChatRoomHelper.getRoomName(mService, jid);\n\t\t} else {\n\t\t\treturn jid;\n\t\t}\t\t\t\n\t}\n\n\tpublic long getLatestTimestamp() {\n\t\t// query the DB for the newest INCOMING(=0) message that\n\t\t// does not have MF_DELAY(=4) bit set.\n\t\tCursor c = mContentResolver.query(ChatProvider.CONTENT_URI, new String[] { ChatConstants.DATE },\n\t\t\t\t\"from_me = 0 AND ((msgtype & 4)=0)\", null, \"_id DESC LIMIT 1\");\n\t\tlong result = -1;\n\t\tif(c.getCount() == 1 && c.moveToNext()) {\n\t\t\tresult = c.getLong(0);\n\t\t}\n\t\tc.close();\n\t\treturn result;\n\t}\n\n\tpublic long getRowIdForMyMessage(String jid, String packet_id) {\n\t\t// query the DB for the RowID, return -1 if packet_id does not match\n\t\t// this will check the last 10 messages from that JID\n\t\tCursor c = mContentResolver.query(ChatProvider.CONTENT_URI, new String[] { ChatConstants._ID, ChatConstants.PACKET_ID },\n\t\t\t\t\"jid = ? AND pid = ? AND from_me = ? AND uid IS NULL\",\n\t\t\t\tnew String[] { jid, packet_id, \"\" + ChatConstants.OUTGOING }, null);\n\t\tlong result = -1;\n\t\tif(c.getCount() == 1 && c.moveToNext()) {\n\t\t\tresult = c.getLong(0);\n\t\t}\n\t\tc.close();\n\t\treturn result;\n\t}\n\n\tpublic long getRowIdForMessageCorrection(String jid, String resource, int direction, String packet_id) {\n\t\t// query the DB for the RowID, return -1 if packet_id does not match\n\t\t// this will check the last 10 messages from that JID\n\t\tCursor c = mContentResolver.query(ChatProvider.CONTENT_URI,\n\t\t\t\tnew String[] { ChatConstants._ID, ChatConstants.PACKET_ID, ChatConstants.CORRECTION },\n\t\t\t\t\"jid = ? AND resource = ? AND from_me = ?\",\n\t\t\t\tnew String[] { jid, resource, \"\" + direction }, \"_id DESC LIMIT 10\");\n\t\tlong result = -1;\n\t\twhile(c.moveToNext()) {\n\t\t\t// match for packet_id (last correction's @id) or correction (initial message's @id)\n\t\t\tif (packet_id.equals(c.getString(1)) || packet_id.equals(c.getString(2)))\n\t\t\t\tresult = c.getLong(0);\n\t\t}\n\t\tc.close();\n\t\treturn result;\n\t}\n\n\tprivate void setStatusOffline() {\n\t\tContentValues values = new ContentValues();\n\t\tvalues.put(RosterConstants.STATUS_MODE, StatusMode.offline.ordinal());\n\t\tmContentResolver.update(RosterProvider.CONTENT_URI, values, null, null);\n\t}\n\n\tprivate void registerRosterListener() {\n\t\t// flush roster on connecting.\n\t\tmRoster = Roster.getInstanceFor(mXMPPConnection);\n\t\tmRoster.setSubscriptionMode(Roster.SubscriptionMode.manual);\n\n\t\tif (mRosterListener != null)\n\t\t\tmRoster.removeRosterListener(mRosterListener);\n\n\t\tmRosterListener = new RosterListener() {\n\t\t\tprivate boolean first_roster = true;\n\n\t\t\tpublic void entriesAdded(Collection<Jid> entries) {\n\t\t\t\tdebugLog(\"entriesAdded(\" + entries + \")\");\n\n\t\t\t\tContentValues[] cvs = new ContentValues[entries.size()];\n\t\t\t\tint i = 0;\n\t\t\t\tfor (Jid entry : entries) {\n\t\t\t\t\tsubscriptionRequests.remove(entry);\n\t\t\t\t\t//SMAXX\n\t\t\t\t\tRosterEntry rosterEntry = mRoster.getEntry(entry.asBareJid());\n\t\t\t\t\tcvs[i++] = getContentValuesForRosterEntry(rosterEntry);\n\t\t\t\t}\n\t\t\t\tmContentResolver.bulkInsert(RosterProvider.CONTENT_URI, cvs);\n\t\t\t\t// when getting the roster in the beginning, remove remains of old one\n\t\t\t\tif (first_roster) {\n\t\t\t\t\tremoveOldRosterEntries();\n\t\t\t\t\tfirst_roster = false;\n\t\t\t\t}\n\t\t\t\tdebugLog(\"entriesAdded() done\");\n\t\t\t}\n\n\t\t\tpublic void entriesDeleted(Collection<Jid> entries) {\n\t\t\t\tdebugLog(\"entriesDeleted(\" + entries + \")\");\n\n\t\t\t\tfor (Jid entry : entries) {\n\t\t\t\t\tdeleteRosterEntryFromDB(entry.toString());\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpublic void entriesUpdated(Collection<Jid> entries) {\n\t\t\t\tdebugLog(\"entriesUpdated(\" + entries + \")\");\n\n\t\t\t\tfor (Jid entry : entries) {\n\t\t\t\t\t//SMAXX\n\t\t\t\t\tRosterEntry rosterEntry = mRoster.getEntry(entry.asBareJid());\n\t\t\t\t\tupdateRosterEntryInDB(rosterEntry);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpublic void presenceChanged(Presence presence) {\n\t\t\t\tdebugLog(\"presenceChanged(\" + presence.getFrom() + \"): \" + presence);\n\n\t\t\t\tRosterEntry rosterEntry = mRoster.getEntry(presence.getFrom().asBareJid());\n\t\t\t\tif (rosterEntry != null)\n\t\t\t\t\tupsertRoster(getContentValuesForRosterEntry(rosterEntry, presence),\n\t\t\t\t\t\t\trosterEntry.getUser());\n\t\t\t}\n\t\t};\n\t\tmRoster.addRosterListener(mRosterListener);\n\t}\n\n\tprivate String getBareJID(String from) {\n\t\tString[] res = from.split(\"/\", 2);\n\t\treturn res[0].toLowerCase();\n\t}\n\n\t/* sanitize a jabber ID obtained from a packet:\n\t *  - split into bare JID and resource\n\t *  - lowercase the bare JID only\n\t *  - fallback to correct default value if empty/null (default is dependent on context/session, therefore must be supplied)\n\t */\n\tprivate String[] getJabberID(String from, String fallback) {\n\t\tif (from == null || from.length() == 0)\n\t\t\tfrom = fallback;\n\t\tif(from.contains(\"/\")) {\n\t\t\tString[] res = from.split(\"/\", 2);\n\t\t\treturn new String[] { res[0].toLowerCase(), res[1] };\n\t\t} else {\n\t\t\treturn new String[] {from.toLowerCase(), \"\"};\n\t\t}\n\t}\n\tprivate String[] getJabberID(Jid from, String fallback) {\n\t\t//SMAXX\n\t\treturn getJabberID(from != null ? from.toString() : null, fallback);\n\t}\n\n\tpublic boolean changeMessageDeliveryStatus(String jid, String packetID, int new_status, String error) {\n\t\tLog.d(TAG, \"changeMessageDeliveryStatus: \" + jid + \" - \" + packetID + \" --> \" + new_status + \" \" + error);\n\t\tContentValues cv = new ContentValues();\n\t\tcv.put(ChatConstants.DELIVERY_STATUS, new_status);\n\t\tif (error != null || new_status == ChatConstants.DS_ACKED)\n\t\t\tcv.put(ChatConstants.ERROR, error);\n\t\tUri rowuri = Uri.parse(\"content://\" + ChatProvider.AUTHORITY + \"/\"\n\t\t\t\t+ ChatProvider.TABLE_NAME);\n\t\treturn mContentResolver.update(rowuri, cv,\n\t\t\t\tChatConstants.JID + \" = ? AND \" +\n\t\t\t\tChatConstants.PACKET_ID + \" = ? AND \" +\n\t\t\t\tChatConstants.DELIVERY_STATUS + \" != \" + ChatConstants.DS_ACKED + \" AND \" +\n\t\t\t\tChatConstants.DIRECTION + \" = \" + ChatConstants.OUTGOING,\n\t\t\t\tnew String[] { jid, packetID }) > 0;\n\t}\n\tpublic boolean changeMessageDeliveryStatus(String jid, String packetID, int new_status) {\n\t\treturn changeMessageDeliveryStatus(jid, packetID, new_status, null);\n\t}\n\n\tprotected boolean is_user_watching = false;\n\tpublic void setUserWatching(boolean user_watching) {\n\t\tif (is_user_watching == user_watching)\n\t\t\treturn;\n\t\tis_user_watching = user_watching;\n\t\tif (isAuthenticated()) {\n\t\t\ttry {\n\t\t\t\tsendUserWatching();\n\t\t\t} catch (SmackException.NotConnectedException e) {\n\t\t\t\te.printStackTrace();\n\t\t\t} catch (InterruptedException e) {\n\t\t\t\te.printStackTrace();\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected void sendUserWatching() throws SmackException.NotConnectedException, InterruptedException {\n\t\tif (!ClientStateIndicationManager.isSupported(mXMPPConnection))\n\t\t\treturn;\n\t\tif (is_user_watching)\n\t\t\tClientStateIndicationManager.active(mXMPPConnection);\n\t\telse\n\t\t\tClientStateIndicationManager.inactive(mXMPPConnection);\n\t}\n\n\t/** Check the server connection, reconnect if needed.\n\t *\n\t * This function will try to ping the server if we are connected, and try\n\t * to reestablish a connection otherwise.\n\t */\n\tpublic void sendServerPing() {\n\t\tif (!isAuthenticated()) {\n\t\t\tdebugLog(\"Ping: requested, but not connected to server.\");\n\t\t\trequestConnectionState(ConnectionState.ONLINE, false);\n\t\t\treturn;\n\t\t}\n\t\tif (mPingID != null) {\n\t\t\tdebugLog(\"Ping: requested, but still waiting for \" + mPingID);\n\t\t\treturn; // a ping is still on its way\n\t\t}\n\n\t\ttry {\n\t\t\tif (false /*mXMPPConnection.isSmEnabled()*/) { // disable 0198 ping due to Smack API\n\t\t\t\tdebugLog(\"Ping: sending SM request\");\n\t\t\t\tmPingID = \"0198-ack\"; //SMAXX\n\t\t\t\tmXMPPConnection.requestSmAcknowledgement();\n\t\t\t} else {\n\t\t\t\tPing ping = new Ping();\n\t\t\t\tping.setType(Type.get);\n\t\t\t\tping.setTo(mConfig.server);\n\t\t\t\tmPingID = ping.getStanzaId();\n\t\t\t\tdebugLog(\"Ping: sending ping \" + mPingID);\n\t\t\t\tmXMPPConnection.sendStanza(ping);\n\t\t\t}\n\t\t\t// register ping timeout handler: PACKET_TIMEOUT(30s) + 3s\n\t\t\tregisterPongTimeout(PACKET_TIMEOUT + 3000, mPingID);\n\t\t} catch (Exception e) {\n\t\t\te.printStackTrace();\n\t\t\tonDisconnected(e);\n\t\t}\n\t}\n\n\tprivate void gotServerPong(String pongID) {\n\t\tlong latency = System.currentTimeMillis() - mPingTimestamp;\n\t\tif (pongID != null && pongID.equals(mPingID))\n\t\t\tLog.i(TAG, String.format(\"Ping: server latency %1.3fs (%s)\",\n\t\t\t\t\t\tlatency/1000., pongID));\n\t\telse\n\t\t\tLog.i(TAG, String.format(\"Ping: server latency %1.3fs (estimated, got %s instead of %s)\",\n\t\t\t\t\t\tlatency/1000., pongID, mPingID));\n\t\tmPingID = null;\n\t\tmAlarmManager.cancel(mPongTimeoutAlarmPendIntent);\n\t}\n\n\t/** Register a \"pong\" timeout on the connection. */\n\tprivate void registerPongTimeout(long wait_time, String id) {\n\t\tmPingID = id;\n\t\tmPingTimestamp = System.currentTimeMillis();\n\t\tdebugLog(String.format(\"Ping: registering timeout for %s: %1.3fs\", id, wait_time/1000.));\n\t\tmAlarmManager.set(AlarmManager.RTC_WAKEUP,\n\t\t\t\tSystem.currentTimeMillis() + wait_time,\n\t\t\t\tmPongTimeoutAlarmPendIntent);\n\t}\n\n\t/**\n\t * BroadcastReceiver to trigger reconnect on pong timeout.\n\t */\n\tprivate class PongTimeoutAlarmReceiver extends BroadcastReceiver {\n\t\tpublic void onReceive(Context ctx, Intent i) {\n\t\t\tdebugLog(\"Ping: timeout for \" + mPingID);\n\t\t\tonDisconnected(mService.getString(R.string.conn_ping_timeout));\n\t\t}\n\t}\n\n\tprivate void showMucTimeout(MUCController mucc) {\n\t\tMultiUserChat muc = mucc.muc;\n\t\tContentValues cvR = new ContentValues();\n\t\tcvR.put(RosterProvider.RosterConstants.STATUS_MESSAGE, mService.getString(R.string.conn_ping_timeout));\n\t\tcvR.put(RosterProvider.RosterConstants.STATUS_MODE, StatusMode.unknown.ordinal());\n\t\tcvR.put(RosterProvider.RosterConstants.GROUP, RosterProvider.RosterConstants.MUCS);\n\t\tdebugLog(\"Ping timeout from \" + muc.getRoom());\n\t\tmucc.isTimeout = true;\n\t\t//do not leave MUC; the server is unavailable anyway - either it will recover or we will get an error\n\t\t//muc.leave();\n\t\tCharSequence lastActTime = DateUtils.getRelativeDateTimeString(mService, mucc.lastPong,\n\t\t\t\tDateUtils.MINUTE_IN_MILLIS, DateUtils.WEEK_IN_MILLIS, 0);\n\t\tString message = String.format((Locale)null, \"%s (%s)\",\n\t\t\t\tmService.getString(R.string.conn_ping_timeout),\n\t\t\t\tlastActTime);\n\t\tcvR.put(RosterProvider.RosterConstants.STATUS_MESSAGE,  message);\n\t\tupsertRoster(cvR, muc.getRoom().toString());\n\n\t}\n\t/**\n\t * BroadcastReceiver to trigger sending pings to the server\n\t */\n\tprivate class PingAlarmReceiver extends BroadcastReceiver {\n\t\tpublic void onReceive(Context ctx, Intent i) {\n\t\t\ttry {\n\t\t\t\tLog.d(TAG, \"PingAlarmReceiver.onReceive\");\n\t\t\t\tsendServerPing();\n\t\t\t\t// ping all MUCs. if no ping was received since last attempt, /cycle\n\t\t\t\tIterator<MUCController> muc_it = new ArrayList<>(multiUserChats.values()).iterator();\n\t\t\t\tlong ts = System.currentTimeMillis();\n\t\t\t\twhile (muc_it.hasNext()) {\n\t\t\t\t\tMUCController mucc = muc_it.next();\n\t\t\t\t\tMultiUserChat muc = mucc.muc;\n\t\t\t\t\tif (!muc.isJoined())\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tlong lastActivity = mucc.lastPong;\n\t\t\t\t\tif (mucPreviousPing > 0 && (lastActivity >= 0 || lastActivity < mucLastPing)) {\n\t\t\t\t\t\t// the MUC didn't give us anything in the last two ping rounds\n\t\t\t\t\t\tif (lastActivity < mucPreviousPing) {\n\t\t\t\t\t\t\tshowMucTimeout(mucc);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// send a ping if we didn't receive anything during the last ping round, even multiple times in a row\n\t\t\t\t\t\tPing ping = new Ping();\n\t\t\t\t\t\tping.setType(Type.get);\n\t\t\t\t\t\tString jid = muc.getRoom() + \"/\" + muc.getNickname();\n\t\t\t\t\t\tping.setTo(jid);\n\t\t\t\t\t\tdebugLog(\"Ping: sending ping to \" + jid);\n\t\t\t\t\t\t//SMAXX\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tmXMPPConnection.sendStanza(ping);\n\t\t\t\t\t\t} catch (SmackException.NotConnectedException e) {\n\t\t\t\t\t\t\te.printStackTrace();\n\t\t\t\t\t\t} catch (InterruptedException e) {\n\t\t\t\t\t\t\te.printStackTrace();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsyncDbRooms();\n\t\t\t\tmucPreviousPing = mucLastPing;\n\t\t\t\tmucLastPing = ts;\n\t\t\t} catch (NullPointerException npe) {\n\t\t\t\t/* ignore disconnect race condition */\n\t\t\t} catch (IllegalStateException ise) {\n\t\t\t\t/* ignore disconnect race condition */\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate void rejoinMUC(String jid) {\n\t\tMUCController muc = multiUserChats.get(jid);\n\t\tif (muc != null) {\n\t\t\ttry {\n\t\t\t\tif (muc.muc.isJoined())\n\t\t\t\t\tmuc.muc.leave();\n\t\t\t} catch (Exception e) {\n\t\t\t\t// best effort, just ignore\n\t\t\t}\n\t\t\tsyncDbRooms();\n\t\t}\n\n\t}\n\tprivate boolean isValidPingResponse(IQ response) {\n\t\t// a 'result' response means, the other party supports ping and responded appropriately\n\t\tif (response.getType() == Type.result)\n\t\t\treturn true;\n\t\t// 'error' can be caused by s2s issues, non-existing destination, solar flares or one of these two:\n\t\t//  * 'service-unavailable': official not-supported response as of RFC6120 (§8.4) and XEP-0199 (§4.1)\n\t\t//  * 'feature-not-implemented': inoffcial not-supported response from many clients\n\t\tif (response.getType() == Type.error) {\n\t\t\tStanzaError e = response.getError();\n\t\t\treturn (e.getType() == StanzaError.Type.CANCEL) &&\n\t\t\t\t(StanzaError.Condition.service_unavailable == e.getCondition() ||\n\t\t\t\t StanzaError.Condition.feature_not_implemented == e.getCondition());\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate boolean isTimeoutPingResponse(IQ response) {\n\t\t// reflect S2S errors according to XEP-0410\n\t\tif (response.getType() == Type.error) {\n\t\t\tStanzaError e = response.getError();\n\t\t\treturn (StanzaError.Condition.remote_server_not_found == e.getCondition() ||\n\t\t\t\t StanzaError.Condition.remote_server_timeout == e.getCondition());\n\t\t}\n\t\treturn false;\n\t}\n\n\t/** Updates internal structures for a sender's last activity.\n\t *\n\t * Currently only used for MUC self-pinging.\n\t */\n\t//SMAXX\n\tprivate void registerLastActivity(Jid from_full) {\n\t\t//SMAXX: JID\n\t\tMUCController mucc = multiUserChats.get(from_full.asBareJid().toString());\n\t\tif (mucc != null)\n\t\t\tmucc.setLastActivity();\n\t}\n\t/**\n\t * Registers a smack packet listener for IQ packets, intended to recognize \"pongs\" with\n\t * a packet id matching the last \"ping\" sent to the server.\n\t *\n\t * Also sets up the AlarmManager Timer plus necessary intents.\n\t */\n\tprivate void registerPongListener() {\n\t\t// reset ping expectation on new connection\n\t\tmPingID = null;\n\n\t\tif (mPongListener != null)\n\t\t\tmXMPPConnection.removeAsyncStanzaListener(mPongListener);\n\n\t\tmPongListener = new StanzaListener() {\n\n\t\t\t@Override\n\t\t\tpublic void processStanza(Stanza packet) {\n\t\t\t\tif (packet == null) return;\n\n\t\t\t\tif (packet instanceof IQ && packet.getFrom() != null) {\n\t\t\t\t\tIQ pong = (IQ)packet;\n\t\t\t\t\tString[] from = getJabberID(pong.getFrom(), null);\n\t\t\t\t\t// check for MUC self-ping response\n\t\t\t\t\tregisterLastActivity(packet.getFrom());\n\t\t\t\t\tif (mucJIDs.contains(from[0]) && from[1].equals(getMyMucNick(from[0]))) {\n\t\t\t\t\t\tMUCController mucc = multiUserChats.get(from[0]);\n\t\t\t\t\t\tif (isTimeoutPingResponse(pong) && mucc != null) {\n\t\t\t\t\t\t\tLog.d(TAG, \"Ping: got S2S timeout from MUC \" + from[0]);\n\t\t\t\t\t\t\tshowMucTimeout(mucc);\n\t\t\t\t\t\t} else if (isValidPingResponse(pong) && mucc != null) {\n\t\t\t\t\t\t\tLog.d(TAG, \"Ping: got response from MUC \" + from[0]);\n\t\t\t\t\t\t\tif (mucc.isTimeout) {\n\t\t\t\t\t\t\t\tContentValues cvR = new ContentValues();\n\t\t\t\t\t\t\t\tcvR.put(RosterProvider.RosterConstants.STATUS_MESSAGE, mucc.muc.getSubject());\n\t\t\t\t\t\t\t\tcvR.put(RosterProvider.RosterConstants.STATUS_MODE, StatusMode.available.ordinal());\n\t\t\t\t\t\t\t\tupsertRoster(cvR, mucc.jid);\n\t\t\t\t\t\t\t\tmucc.isTimeout = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (pong.getError() != null) {\n\t\t\t\t\t\t\tLog.d(TAG, \"Ping: got error from MUC \" + from[0] + \": \" + pong.getError());\n\t\t\t\t\t\t\trejoinMUC(from[0]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (getJabberID(packet.getFrom(), mConfig.server)[0].equals(mConfig.server)\n\t\t\t\t\t\t&& mPingID != null && mPingID.equals(packet.getStanzaId()))\n\t\t\t\t\tgotServerPong(packet.getStanzaId());\n\n\t\t\t}\n\n\t\t};\n\n\t\tmXMPPConnection.addAsyncStanzaListener(mPongListener, new StanzaTypeFilter(IQ.class));\n\t}\n\tvoid registerPingAlarm() {\n\t\tmAlarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, \n\t\t\t\tSystem.currentTimeMillis() + AlarmManager.INTERVAL_FIFTEEN_MINUTES, AlarmManager.INTERVAL_FIFTEEN_MINUTES, mPingAlarmPendIntent);\n\t}\n\tprivate void unregisterPongListener() {\n\t\tmAlarmManager.cancel(mPingAlarmPendIntent);\n\t\tmAlarmManager.cancel(mPongTimeoutAlarmPendIntent);\n\t}\n\n\tprivate void registerMessageListener() {\n\t\tStanzaTypeFilter filter = new StanzaTypeFilter(Message.class);\n\n\t\t// do not register multiple packet listeners\n\t\tif (mStanzaListener != null) {\n\t\t\tmXMPPConnection.removeSyncStanzaListener(mStanzaListener);\n\t\t\tmXMPPConnection.addSyncStanzaListener(mStanzaListener, filter);\n\t\t\treturn;\n\t\t}\n\n\t\tmStanzaListener = new StanzaListener() {\n\t\t\tpublic void processStanza(Stanza packet) {\n\t\t\t\ttry {\n\t\t\t\tif (packet instanceof Message) {\n\t\t\t\t\tprocessMessage((Message)packet, false);\n\n\t\t\t\t}\n\t\t\t\t} catch (Exception e) {\n\t\t\t\t\t// SMACK silently discards exceptions dropped from processPacket :(\n\t\t\t\t\tLog.e(TAG, \"failed to process packet:\");\n\t\t\t\t\te.printStackTrace();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tmXMPPConnection.addSyncStanzaListener(mStanzaListener, filter);\n\t}\n\n\tprivate boolean isUserActivity(Message m) {\n\t\tif (m.getBody() != null)\n\t\t\treturn true;\n\t\tChatStateExtension cse = (ChatStateExtension)m.getExtension(ChatStateExtension.NAMESPACE);\n\t\tif (cse != null && (cse.getChatState() == ChatState.active || cse.getChatState() == ChatState.composing))\n\t\t\treturn true;\n\t\treturn false;\n\t}\n\n\t/* Obtain a timestamp from a message, in the following priority order:\n\t *   1. MAM/Carbon: inner timestamp of the wrapped message (from sending client / remote server)\n\t *   2. MAM/Carbon: timestamp from the MAM/Carbon forwarded element\n\t *   3. timestamp from the message\n\t *   4. null --> message handler will use current timestamp\n\t */\n\tprivate DelayInformation getMessageTimestamp(Message msg, Forwarded fwd) {\n\t\tDelayInformation timestamp = DelayInformationManager.getDelayInformation(msg);\n\t\tif (fwd != null) { // Carbon timestamp overrides packet timestamp\n\t\t\ttimestamp = fwd.getDelayInformation();\n\t\t\tDelayInformation inner_ts = DelayInformationManager.getDelayInformation(fwd.getForwardedStanza());\n\t\t\tif (inner_ts != null) // original timestamp wrapped in carbon message overrides \"outer\" timestamp\n\t\t\t\ttimestamp = inner_ts;\n\t\t}\n\t\treturn timestamp;\n\t}\n\n\tprivate void processMessage(Message msg, boolean is_history_sync) {\n\t\tString[] withJID = getJabberID(msg.getFrom(), mConfig.server);\n\n\t\tint direction = ChatConstants.INCOMING;\n\t\tForwarded fwd = null;\n\n\t\tMamElements.MamResultExtension mam = MamElements.MamResultExtension.from(msg);\n\t\tif (mam != null) {\n\t\t\t// ignore MAM elements that don't come from an explicit history sync\n\t\t\t// helps prevent impersonation attacks like\n\t\t\t// https://rt-solutions.de/en/2017/01/cve-2017-5589_xmpp_carbons/\n\t\t\tif (!is_history_sync)\n\t\t\t\treturn;\n\t\t\t// TODO: check origin\n\t\t\tfwd = mam.getForwarded();\n\t\t}\n\n\t\tCarbonExtension cc = CarbonExtension.from(msg);\n\t\tif (cc != null) {\n\t\t\tif (!msg.getFrom().toString().equalsIgnoreCase(mConfig.jabberID)) {\n\t\t\t\tLog.w(TAG, \"Received illegal carbon from \" + msg.getFrom() + \"!\");\n\t\t\t\tcc = null;\n\t\t\t} else\n\t\t\t\tfwd = cc.getForwarded();\n\t\t}\n\n\t\t// extract timestamp\n\t\tlong ts = System.currentTimeMillis();\n\t\tDelayInformation timestamp = getMessageTimestamp(msg, fwd);\n\t\tif (timestamp != null)\n\t\t\tts = timestamp.getStamp().getTime();\n\n\t\t// try to extract a MAM result / carbon\n\t\tif (fwd != null) {\n\t\t\tmsg = (Message)fwd.getForwardedStanza();\n\t\t\t// own bare jid is parent of @from == outgoing\n\t\t\tdirection = mConfig.jid.isParentOf(msg.getFrom()) ? ChatConstants.OUTGOING : ChatConstants.INCOMING;\n\t\t\tif (cc != null) {\n\t\t\t\tint cc_direction = (cc.getDirection() == CarbonExtension.Direction.sent) ? ChatConstants.OUTGOING : ChatConstants.INCOMING;\n\t\t\t\tif (direction != cc_direction) {\n\t\t\t\t\tLog.e(TAG, \"Carbon direction mismatch: \" + cc.getDirection() + \" vs. \" + msg.getFrom());\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// outgoing carbon: fromJID is actually chat peer's JID\n\t\t\tif (direction == ChatConstants.OUTGOING) {\n\t\t\t\twithJID = getJabberID(msg.getTo(), mConfig.jabberID);\n\n\t\t\t} else {\n\t\t\t\twithJID = getJabberID(msg.getFrom(), mConfig.server);\n\t\t\t}\n\n\t\t\t// ignore carbon copies / outdated archives of OTR messages sent by broken clients\n\t\t\tif (msg.getBody() != null && msg.getBody().startsWith(\"?OTR\")) {\n\t\t\t\tLog.i(TAG, \"Ignoring OTR carbon from \" + msg.getFrom() + \" to \" + msg.getTo());\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tregisterLastActivity(msg.getFrom());\n\n\t\t// obtain unique stanza id (XEP-0359)\n\t\tStanzaIdElement uniqueStanzaElement = StanzaIdElement.getStanzaId(msg);\n\t\tString unique_id = (mam != null) ? mam.getId() : null;\n\t\tif (mam == null && uniqueStanzaElement != null)\n\t\t\tunique_id = uniqueStanzaElement.getId();\n\t\tif (!TextUtils.isEmpty(unique_id)) {\n\t\t\t// abort processing of already known messages, e.g on MAM dups or Offline copies of MAMed msgs\n\t\t\tif (messageAlreadyArchived(withJID[0], unique_id)) {\n\t\t\t\tLog.d(TAG, \"Msg from \" + withJID[0] + \" already archived as \" + unique_id);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tString archiveJid = (msg.getType() == Message.Type.groupchat) ? withJID[0] : mConfig.jabberID;\n\t\t\taddChatArchiveEntry(archiveJid, unique_id, ts);\n\t\t}\n\n\t\tString chatMessage = msg.getBody();\n\n\t\tboolean is_muc = (msg.getType() == Message.Type.groupchat);\n\t\tboolean is_from_me = (direction == ChatConstants.OUTGOING) ||\n\t\t\t\t(is_muc && withJID[1].equals(getMyMucNick(withJID[0])));\n\t\tMUCController mucc = is_muc ? multiUserChats.get(withJID[0]) : null;\n\n\t\tif (is_muc && mucc == null) {\n\t\t\tLog.w(TAG, \"Ignoring groupchat message from unknown MUC \" + withJID[0] + \": \" + msg.getStanzaId());\n\t\t\treturn;\n\t\t}\n\n\t\tif (is_muc && !mucc.isSynchronized && timestamp == null) {\n\t\t\tLog.d(TAG, \"MUC \" + withJID[0] + \": \" + withJID[1] + \"/\" + msg.getStanzaId()  + \" without delay --> synchronized\");\n\t\t\tcompleteMucSync(withJID[0], null);\n\t\t}\n\n\t\t// still loading: suppress notification until loading finished\n\t\tboolean still_loading = is_muc ? (!mucc.isSynchronized) : (mam != null);\n\n\t\t// TODO: catch self-CSN to MUC once sent by yaxim\n\t\tif (is_from_me) {\n\t\t\t// perform a message-replace on self-sent MUC message, abort further processing\n\t\t\tif (is_muc && matchOutgoingMucReflection(msg, withJID))\n\t\t\t\treturn;\n\t\t\tif (isUserActivity(msg))\n\t\t\t\tmService.setGracePeriod(ts);\n\t\t}\n\n\t\t// handle MUC-PMs: messages from a nick from a known MUC or with\n\t\t// an <x> element\n\t\tMUCUser muc_x = (MUCUser)msg.getExtension(\"x\", \"http://jabber.org/protocol/muc#user\");\n\t\tboolean is_muc_pm = !is_muc  && !TextUtils.isEmpty(withJID[1]) &&\n\t\t\t\t(muc_x != null || mucJIDs.contains(withJID[0]));\n\n\t\t// TODO: ignoring 'received' MUC-PM carbons, until XSF sorts out shit:\n\t\t// - if yaxim is in the MUC, it will receive a non-carbonated copy of\n\t\t//   incoming messages, but not of outgoing ones\n\t\t// - if yaxim isn't in the MUC, it can't respond anyway\n\t\tif (is_muc_pm && !is_from_me && cc != null)\n\t\t\treturn;\n\n\t\tif (is_muc_pm) {\n\t\t\t// store MUC-PMs under the participant's full JID, not bare\n\t\t\t//is_from_me = fromJID[1].equals(getMyMucNick(fromJID[0]));\n\t\t\twithJID[0] = withJID[0] + \"/\" + withJID[1];\n\t\t\twithJID[1] = null;\n\t\t\tLog.d(TAG, \"MUC-PM: \" + withJID[0] + \" d=\" + direction + \" fromme=\" + is_from_me);\n\t\t}\n\n\t\t// check for jabber MUC invitation\n\t\tif(direction == ChatConstants.INCOMING && handleMucInvitation(msg)) {\n\t\t\tsendReceiptIfRequested(msg, JidCreate.fromOrNull(withJID[0]), is_history_sync);\n\t\t\treturn;\n\t\t}\n\n\t\t// display error inline\n\t\tif (msg.getType() == Message.Type.error) {\n\t\t\tStanzaError e = msg.getError();\n\t\t\tString errmsg = e.toString();\n\t\t\tif (mucJIDs.contains(msg.getFrom()) && e.getType() == StanzaError.Type.CANCEL && e.getCondition() == StanzaError.Condition.not_acceptable) {\n\t\t\t\t// failed attempt to deliver a message to a MUC because we are not joined\n\t\t\t\t// anymore. If message ID is known, mark as NEW, trigger rejoin.\n\t\t\t\tif (changeMessageDeliveryStatus(withJID[0], msg.getStanzaId(), ChatConstants.DS_NEW, errmsg)) {\n\t\t\t\t\trejoinMUC(withJID[0]);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (changeMessageDeliveryStatus(withJID[0], msg.getStanzaId(), ChatConstants.DS_FAILED, errmsg))\n\t\t\t\tmServiceCallBack.notifyMessage(withJID, errmsg, (fwd != null), Message.Type.error, ts, still_loading);\n\t\t\telse if (mucJIDs.contains(msg.getFrom())) {\n\t\t\t\thandleKickedFromMUC(msg.getFrom().toString(), false, null,\n\t\t\t\t\t\terrmsg);\n\t\t\t}\n\t\t\treturn; // we do not want to add errors as \"incoming messages\"\n\t\t}\n\n\t\t// store UID for self-messages from MAM: MUC-PM or normal\n\t\tif (is_history_sync && unique_id != null && is_from_me && !is_muc && mam != null) {\n\t\t\tlong upsert_id = getRowIdForMyMessage(withJID[0], msg.getStanzaId());\n\t\t\tif (upsert_id >= 0) {\n\t\t\t\tLog.d(TAG, \"Adding MAM-UID to message to \" + withJID[0] + \": \" + msg.getStanzaId() + \" -> \" + unique_id);\n\t\t\t\tContentValues cv = new ContentValues();\n\t\t\t\tcv.put(ChatConstants.UNIQUE_ID, unique_id);\n\t\t\t\tupsertChatMessageToDB(upsert_id, cv);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// hook off carbonated delivery receipts\n\t\tDeliveryReceipt dr = DeliveryReceipt.from(msg);\n\t\tif (dr != null) {\n\t\t\tif (direction == ChatConstants.INCOMING) {\n\t\t\t\tLog.d(TAG, \"got delivery receipt from \" + withJID[0] + \" for \" + dr.getId());\n\t\t\t\tchangeMessageDeliveryStatus(withJID[0], dr.getId(), ChatConstants.DS_ACKED);\n\t\t\t} else {\n\t\t\t\tLog.d(TAG, \"got outgoing receipt to \" + withJID[0] + \" for \" + dr.getId());\n\t\t\t\tcancelPostponedReceipt(JidCreate.fromOrNull(withJID[0]), dr.getId());\n\t\t\t}\n\t\t}\n\n\t\t// ignore empty messages\n\t\tif (chatMessage == null) {\n\t\t\tif (msg.getSubject() != null && msg.getType() == Message.Type.groupchat\n\t\t\t\t\t&& mucJIDs.contains(withJID[0])) {\n\t\t\t\t// this is a MUC subject, update our DB\n\t\t\t\tLog.d(TAG, \"MUC subject for \" + withJID[0] + \" set to: \" + msg.getSubject());\n\t\t\t\tcompleteMucSync(withJID[0], msg.getSubject());\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (dr == null)\n\t\t\t\tLog.d(TAG, \"empty message from \" + withJID[0]  + \": \" + msg.getStanzaId() + \" - \" + msg.getExtensions());\n\t\t\treturn;\n\t\t}\n\n\n\t\t// incoming messages are new (no matter if fresh, mam, or carbon), outgoing ones are \"sent/read\"\n\t\tint delivery_status = is_from_me ? ChatConstants.DS_SENT_OR_READ : ChatConstants.DS_NEW;\n\t\tif (msg.getType() == Message.Type.error)\n\t\t\tdelivery_status = ChatConstants.DS_FAILED;\n\n\t\t// synchronized MUCs and contacts are not silent by default\n\t\tboolean is_silent = !(is_muc ? mucc.isSynchronized : mRoster.contains(JidCreate.bareFromOrNull(withJID[0])));\n\n\t\tlong upsert_id = -1;\n\t\tif (is_muc && is_from_me) {\n\t\t\t// messages from our other client are \"ACKed\" automatically\n\t\t\tdelivery_status = ChatConstants.DS_ACKED;\n\t\t}\n\n\t\t// obtain Last Message Correction, if present\n\t\tMessageCorrectExtension replace = (MessageCorrectExtension)msg.getExtension(MessageCorrectExtension.NAMESPACE);\n\t\tString replace_id = (replace != null) ? replace.getIdInitialMessage() : null;\n\n\t\t// obtain OOB data, if present\n\t\tOob oob = (Oob)msg.getExtension(Oob.NAMESPACE);\n\t\tString oob_extra = (oob != null) ? oob.getUrl() : null;\n\n\t\tif (withJID[0].equalsIgnoreCase(mConfig.jabberID)) {\n\t\t\t// Self-Message, no need to display it twice --> replace old one\n\t\t\treplace_id = msg.getStanzaId();\n\t\t}\n\t\tif (replace_id != null && upsert_id == -1) {\n\t\t\t// obtain row id for last message with that full JID, or -1\n\t\t\tupsert_id = getRowIdForMessageCorrection(withJID[0], withJID[1], direction, replace_id);\n\t\t\tLog.d(TAG, \"Replacing last message from \" + withJID[0] + \"/\" + withJID[1] + \": \" + replace_id + \" -> \" + msg.getStanzaId() + \" @\" + upsert_id);\n\t\t}\n\n\t\tif (!is_muc || checkAddMucMessage(msg, msg.getStanzaId(), withJID, timestamp)) {\n\t\t\tint msgFlags = ChatConstants.MF_TEXT;\n\t\t\tif (oob_extra != null)\n\t\t\t\tmsgFlags |= ChatConstants.MF_FILE;\n\t\t\t// only add Stopwatch if: delayed message, not delayed by our account, not loading from MUC join / MAM\n\t\t\tif (DelayInformationManager.isDelayedStanza(msg) && !mConfig.jid.equals(timestamp.getFrom()) && !still_loading)\n\t\t\t\tmsgFlags |= ChatConstants.MF_DELAY;\n\t\t\tif (replace != null)\n\t\t\t\tmsgFlags |= ChatConstants.MF_CORRECT;\n\t\t\tContentValues cv = formatMessageContentValues(direction, withJID[0], withJID[1],\n\t\t\t\t\tchatMessage, msgFlags, replace_id, oob_extra, delivery_status, msg.getStanzaId(), unique_id);\n\t\t\taddChatMessageToDB(withJID[0], cv, ts, upsert_id);\n\t\t\t// only notify on private messages or on non-system MUC messages when MUC notification requested\n\t\t\tboolean need_notify = !is_muc || (withJID[1].length() > 0) && mConfig.needMucNotification(withJID[0], getMyMucNick(withJID[0]), chatMessage);\n\t\t\t// outgoing carbon -> clear notification by signalling 'null' message\n\t\t\tif (is_from_me) {\n\t\t\t\tmServiceCallBack.notifyMessage(withJID, null, true, msg.getType(), ts, still_loading);\n\t\t\t\t// TODO: MUC PMs\n\t\t\t\tChatHelper.markAsRead(mService, withJID[0]);\n\t\t\t} else if (direction == ChatConstants.INCOMING && need_notify) {\n\t\t\t\t// replace URL with paperclip for notification\n\t\t\t\tif (chatMessage.equals(oob_extra))\n\t\t\t\t\tchatMessage = \"\\uD83D\\uDCCE\";\n\t\t\t\tmServiceCallBack.notifyMessage(withJID, chatMessage, is_silent, msg.getType(), ts, still_loading);\n\t\t\t}\n\t\t}\n\t\tif (direction == ChatConstants.INCOMING)\n\t\t\tsendReceiptIfRequested(msg, JidCreate.fromOrNull(withJID[0]), is_history_sync);\n\t}\n\n\tprivate boolean matchOutgoingMucReflection(Message msg, String[] fromJid) {\n\t\tString muc = fromJid[0];\n\t\tString nick = fromJid[1];\n\t\tString packet_id = msg.getStanzaId();\n\t\tif (packet_id == null)\n\t\t\tpacket_id = \"\";\n\n\t\tMUCController mucc = multiUserChats.get(muc);\n\t\tif (!nick.equals(getMyMucNick(muc)))\n\t\t\treturn false;\n\t\t// TODO: store pending _id's in MUCController (will be needed for CSN sending!)\n\t\tif (msg.getBody() == null)\n\t\t\treturn false; /* TODO: yaxim doesn't emit CSN, so it's another client! */\n\t\t// https://stackoverflow.com/a/8248052/539443 - securely use LIKE\n\t\tString firstline = msg.getBody().replace(\"!\", \"!!\")\n\t\t\t\t.replace(\"%\", \"!%\")\n\t\t\t\t.replace(\"_\", \"!_\")\n\t\t\t\t.replace(\"[\", \"![\");\n\t\tif (msg.getBody().length() > 400)\n\t\t\tfirstline = firstline + \"%\"; /* prefix match on long lines split for IRC */\n\t\telse\n\t\t\tfirstline = firstline + \"\\n%\"; /* first line match on other lines */\n\t\tCursor c = mContentResolver.query(ChatProvider.CONTENT_URI, new String[] { ChatConstants._ID, ChatConstants.PACKET_ID },\n\t\t\t\t\"jid = ? AND from_me = 1 AND (pid = ? OR message = ? OR message LIKE ? ESCAPE '!') AND _id >= ? AND read = ?\",\n\t\t\t\tnew String[] { muc, packet_id, msg.getBody(), firstline, \"\" + mucc.getFirstPacketID(), \"\" + ChatConstants.DS_SENT_OR_READ },\n\t\t\t\t\"_id DESC\");\n\t\tboolean updated = false;\n\t\tif (c.moveToFirst()) {\n\t\t\tlong _id = c.getLong(0);\n\t\t\tContentValues values = new ContentValues();\n\t\t\tvalues.put(ChatConstants.RESOURCE, nick);\n\t\t\tvalues.put(ChatConstants.DIRECTION, ChatConstants.INCOMING);\n\t\t\tvalues.put(ChatConstants.MESSAGE, msg.getBody());\n\t\t\tvalues.put(ChatConstants.DELIVERY_STATUS, ChatConstants.DS_ACKED);\n\t\t\tvalues.put(ChatConstants.ERROR, (String)null);\n\t\t\tvalues.put(ChatConstants.PACKET_ID, packet_id);\n\t\t\tupdated = upsertChatMessageToDB(_id, values);\n\t\t}\n\t\tc.close();\n\t\treturn updated;\n\t}\n\n\tprivate boolean messageAlreadyArchived(String withJid, String uid) {\n\t\tfinal String[] projection = new String[] {\n\t\t\t\tChatConstants._ID, ChatConstants.JID, ChatConstants.UNIQUE_ID\n\t\t};\n\t\tCursor cursor = mContentResolver.query(ChatProvider.CONTENT_URI, projection,\n\t\t\t\tChatConstants.JID + \" = ? AND \" +\n\t\t\t\t\t\tChatConstants.UNIQUE_ID + \" = ?\",\n\t\t\t\tnew String[] { withJid, uid }, null);\n\t\tboolean results = cursor.getCount() > 0;\n\t\tcursor.close();\n\t\treturn results;\n\t}\n\n\tprivate void completeMucSync(String room, String subject) {\n\t\tMUCController mucc = multiUserChats.get(room);\n\t\tif (mucc.isSynchronized && subject == null)\n\t\t\treturn;\n\t\tif (subject == null)\n\t\t\tsubject = mucc.muc.getSubject();\n\t\tContentValues cvR = new ContentValues();\n\t\tcvR.put(RosterProvider.RosterConstants.STATUS_MESSAGE, subject);\n\t\tcvR.put(RosterProvider.RosterConstants.STATUS_MODE, StatusMode.available.ordinal());\n\t\tupsertRoster(cvR, room);\n\t\tmultiUserChats.get(room).isSynchronized = true;\n\t\tmServiceCallBack.displayPendingNotifications(room);\n\t}\n\n\tprivate boolean checkAddMucMessage(Message msg, String packet_id, String[] fromJid, DelayInformation timestamp) {\n\t\tString muc = fromJid[0];\n\t\tString nick = fromJid[1];\n\n\t\tMUCController mucc = multiUserChats.get(muc);\n\t\t// messages with no timestamp are always new, and always come after join is completed\n\t\tif (timestamp == null) {\n\t\t\tLog.d(TAG, \"checkAddMucMessage(\" + fromJid[0] + \"): \" + nick + \"/\" + packet_id  + \" without timestamp --> isSync=true\");\n\t\t\tcompleteMucSync(fromJid[0], null);\n\t\t\treturn true;\n\t\t}\n\t\t// messages after we have joined and synchronized the MUC are always new\n\t\tif (mucc.isSynchronized) {\n\t\t\tLog.d(TAG, \"checkAddMucMessage(\" + fromJid[0] + \"): \" + nick + \"/\" + packet_id  + \" MUC already synced.\");\n\t\t\treturn true;\n\t\t}\n\n\t\tlong ts = timestamp.getStamp().getTime();\n\n\t\tfinal String[] projection = new String[] {\n\t\t\t\tChatConstants._ID, ChatConstants.MESSAGE,\n\t\t\t\tChatConstants.JID, ChatConstants.RESOURCE,\n\t\t\t\tChatConstants.PACKET_ID\n\t\t};\n\n\t\tif (packet_id == null) packet_id = \"\";\n\t\t// TODO: merge failed messages with re-send attempts when sending, disable DS_FAILED check\n\t\tfinal String selection = \"jid = ? AND resource = ? AND (pid = ? OR date = ? OR message = ?) AND _id >= ? AND read != ?\";\n\t\tfinal String[] selectionArgs = new String[] { muc, nick, packet_id, \"\"+ts, msg.getBody(), \"\"+mucc.getFirstPacketID(), \"\"+ChatConstants.DS_FAILED };\n\t\ttry {\n\t\t\tCursor cursor = mContentResolver.query(ChatProvider.CONTENT_URI, projection, selection, selectionArgs, null);\n\t\t\tLog.d(TAG, \"checkAddMucMessage(\" + fromJid[0] + \"): \" + nick + \"/\" + packet_id + \" matched \" + cursor.getCount() + \" items.\");\n\t\t\tboolean result = (cursor.getCount() == 0);\n\t\t\tcursor.close();\n\t\t\treturn result;\n\t\t} catch (Exception e) { e.printStackTrace(); } // just return true...\n\t\tLog.d(TAG, \"checkAddMucMessage(\" + fromJid[0] + \"): \" + nick + \"/\" + packet_id + \" didn't match msg in history.\");\n\t\treturn true;\n\t}\n\n\tprivate void handleKickedFromMUC(String room, boolean banned, Jid actor, String reason) {\n\t\tContentValues cvR = new ContentValues();\n\t\tString message;\n\t\tif (actor != null && actor.length() > 0)\n\t\t\tmessage = mService.getString(banned ? R.string.muc_banned_by : R.string.muc_kicked_by,\n\t\t\t\t\tactor, reason);\n\t\telse\n\t\t\tmessage = mService.getString(banned ? R.string.muc_banned : R.string.muc_kicked,\n\t\t\t\t\treason);\n\t\tcvR.put(RosterProvider.RosterConstants.STATUS_MESSAGE, message);\n\t\tcvR.put(RosterProvider.RosterConstants.STATUS_MODE, StatusMode.offline.ordinal());\n\t\tupsertRoster(cvR, room);\n\t}\n\n\t@Override\n\tpublic String getMyMucNick(String jid) {\n\t\tMUCController muc = multiUserChats.get(jid);\n\t\tif (muc != null && muc.muc.getNickname() != null)\n\t\t\treturn muc.muc.getNickname().toString();\n\t\tif (mucJIDs.contains(jid)) {\n\t\t\tChatRoomHelper.RoomInfo ri = ChatRoomHelper.getRoomInfo(mService, jid);\n\t\t\tif (ri != null && !TextUtils.isEmpty(ri.nickname))\n\t\t\t\treturn ri.nickname;\n\t\t\treturn mConfig.screenName;\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate void registerPresenceListener() {\n\t\t// do not register multiple packet listeners\n\t\tif (mPresenceListener != null)\n\t\t\tmXMPPConnection.removeAsyncStanzaListener(mPresenceListener);\n\n\t\tmPresenceListener = new StanzaListener() {\n\t\t\tpublic void processStanza(Stanza packet) {\n\t\t\t\ttry {\n\t\t\t\t\tPresence p = (Presence) packet;\n\t\t\t\t\tswitch (p.getType()) {\n\t\t\t\t\tcase subscribe:\n\t\t\t\t\t\thandleIncomingSubscribe(p);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase subscribed:\n\t\t\t\t\tcase unsubscribe:\n\t\t\t\t\tcase unsubscribed:\n\t\t\t\t\t\tsubscriptionRequests.remove(p.getFrom());\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t// reduce MUC pinging by registering incoming presence activity\n\t\t\t\t\tregisterLastActivity(p.getFrom());\n\t\t\t\t} catch (Exception e) {\n\t\t\t\t\t// SMACK silently discards exceptions dropped from processStanza :(\n\t\t\t\t\tLog.e(TAG, \"failed to process presence:\");\n\t\t\t\t\te.printStackTrace();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tmXMPPConnection.addAsyncStanzaListener(mPresenceListener, new StanzaTypeFilter(Presence.class));\n\t}\n\n\t/** return the Unique ID of the last archived message, or null */\n\tprivate String getChatArchiveEntry(String jid) {\n\t\tif (TextUtils.isEmpty(jid))\n\t\t\tjid = mConfig.jabberID;\n\t\tCursor cursor = mContentResolver.query(ChatProvider.ARCHIVE_URI,\n\t\t\t\tnew String[] { \"jid\", \"uid\", \"date\" },\n\t\t\t\t\"jid = ?\", new String[] { jid},\n\t\t\t\tnull);\n\t\tString result = null;\n\t\tif (cursor.moveToNext())\n\t\t\tresult = cursor.getString(1);\n\t\tcursor.close();\n\t\treturn result;\n\t}\n\n\tprivate void addChatArchiveEntry(String jid, String uid, long ts) {\n\t\tContentValues cv = new ContentValues();\n\t\tcv.put(\"jid\", jid);\n\t\tcv.put(\"uid\", uid);\n\t\tcv.put(\"date\", ts);\n\t\tmContentResolver.insert(ChatProvider.ARCHIVE_URI, cv);\n\t}\n\n\t// returns true if upsert succeeded\n\tprivate boolean upsertChatMessageToDB(long upsert_id, ContentValues values) {\n\t\treturn (mContentResolver.update(Uri.withAppendedPath(ChatProvider.CONTENT_URI, \"\" + upsert_id),\n\t\t\t\tvalues, null, null) == 1);\n\t}\n\n\tprivate void addChatMessageToDB(String bare_jid, ContentValues values, long ts, long upsert_id) {\n\t\tif (upsert_id >= 0 && upsertChatMessageToDB(upsert_id, values))\n\t\t\treturn;\n\t\tvalues.put(ChatConstants.DATE, (ts > 0) ? ts : System.currentTimeMillis());\n\t\tUri res = mContentResolver.insert(ChatProvider.CONTENT_URI, values);\n\t\tMUCController mucc = multiUserChats.get(bare_jid);\n\t\tif (mucc != null)\n\t\t\tmucc.addPacketID(res);\n\t}\n\n\tprivate ContentValues getContentValuesForRosterEntry(final RosterEntry entry) {\n\t\tPresence presence = mRoster.getPresence(entry.getJid());\n\t\treturn getContentValuesForRosterEntry(entry, presence);\n\t}\n\n\tprivate ContentValues getContentValuesForRosterEntry(final RosterEntry entry, Presence presence) {\n\t\tfinal ContentValues values = new ContentValues();\n\n\t\tvalues.put(RosterConstants.JID, entry.getUser());\n\t\tvalues.put(RosterConstants.ALIAS, getName(entry));\n\n\t\t// handle subscription requests and errors with higher priority\n\t\tPresence sub = subscriptionRequests.get(entry.getUser());\n\t\tif (presence.getType() == Presence.Type.error) {\n\t\t\tString error = presence.getError().getDescriptiveText();\n\t\t\tif (error == null || error.length() == 0)\n\t\t\t\terror = presence.getError().toString();\n\t\t\tvalues.put(RosterConstants.STATUS_MESSAGE, error);\n\t\t} else if (sub != null) {\n\t\t\tpresence = sub;\n\t\t\tvalues.put(RosterConstants.STATUS_MESSAGE, presence.getStatus());\n\t\t} else switch (entry.getType()) {\n\t\tcase to:\n\t\tcase both:\n\t\t\t// override received presence from roster, using highest-prio entry\n\t\t\tpresence = mRoster.getPresence(entry.getJid());\n\t\t\tvalues.put(RosterConstants.STATUS_MESSAGE, presence.getStatus());\n\t\t\tbreak;\n\t\tcase from:\n\t\t\tvalues.put(RosterConstants.STATUS_MESSAGE, mService.getString(R.string.subscription_status_from));\n\t\t\tpresence = null;\n\t\t\tbreak;\n\t\tcase none:\n\t\t\tvalues.put(RosterConstants.STATUS_MESSAGE, \"\");\n\t\t\tpresence = null;\n\t\t}\n\t\tvalues.put(RosterConstants.STATUS_MODE, getStatusInt(presence));\n\t\tvalues.put(RosterConstants.GROUP, getGroup(entry.getGroups()));\n\n\t\treturn values;\n\t}\n\n\tprivate void deleteRosterEntryFromDB(final String jabberID) {\n\t\tint count = mContentResolver.delete(RosterProvider.CONTENT_URI,\n\t\t\t\tRosterConstants.JID + \" = ?\", new String[] { jabberID });\n\t\tdebugLog(\"deleteRosterEntryFromDB: Deleted \" + count + \" entries\");\n\t}\n\n\tprivate void updateRosterEntryInDB(final RosterEntry entry) {\n\t\tupsertRoster(getContentValuesForRosterEntry(entry), entry.getUser());\n\t}\n\n\tprivate void upsertRoster(final ContentValues values, String jid) {\n\t\tif (mContentResolver.update(RosterProvider.CONTENT_URI, values,\n\t\t\t\tRosterConstants.JID + \" = ?\", new String[] { jid }) == 0) {\n\t\t\tmContentResolver.insert(RosterProvider.CONTENT_URI, values);\n\t\t}\n\t}\n\n\tprivate String getGroup(Collection<RosterGroup> groups) {\n\t\tfor (RosterGroup group : groups) {\n\t\t\treturn group.getName();\n\t\t}\n\t\treturn \"\";\n\t}\n\n\tprivate String getName(RosterEntry rosterEntry) {\n\t\tString name = rosterEntry.getName();\n\t\tif (name != null && name.length() > 0) {\n\t\t\treturn name;\n\t\t}\n\t\treturn rosterEntry.getUser();\n\t}\n\n\tprivate StatusMode getStatus(Presence presence) {\n\t\tif (presence == null)\n\t\t\treturn StatusMode.unknown;\n\t\tif (presence.getType() == Presence.Type.subscribe)\n\t\t\treturn StatusMode.subscribe;\n\t\tif (presence.getType() == Presence.Type.available) {\n\t\t\tif (presence.getMode() != null) {\n\t\t\t\treturn StatusMode.valueOf(presence.getMode().name());\n\t\t\t}\n\t\t\treturn StatusMode.available;\n\t\t}\n\t\treturn StatusMode.offline;\n\t}\n\n\tprivate int getStatusInt(final Presence presence) {\n\t\treturn getStatus(presence).ordinal();\n\t}\n\n\tprivate void debugLog(String data) {\n\t\tif (LogConstants.LOG_DEBUG) {\n\t\t\tLog.d(TAG, data);\n\t\t}\n\t}\n\n\t@Override\n\tpublic String getLastError() {\n\t\treturn mLastError;\n\t}\n\n\tpublic Exception getLastLoginError() {\n\t\treturn mLastLoginError;\n\t}\n\n\tpublic synchronized void updateNickname() {\n\t\tmConfig.nickchange_required = false;\n\t\tnew Thread(\"updateNickname \" + mConfig.screenName) {\n\t\t\tpublic void run() {\n\t\t\t\tif (loadOrUpdateNickname(true))\n\t\t\t\t\tsyncDbRooms();\n\t\t\t}\n\t\t}.start();\n\t}\n\t// returns true if the nickname changed\n\tprivate boolean loadOrUpdateNickname(boolean force_rename) {\n\t\ttry {\n\t\t\t// first attempt to load nickname from PEP / store it into PEP\n\t\t\tPubSubManager psm = PubSubManager.getInstance(mXMPPConnection, mXMPPConnection.getUser().asEntityBareJid());\n\t\t\tString pepNickname = null;\n\t\t\ttry {\n\t\t\t\tLeafNode n = psm.createUnverifiedLeafNode(Nick.NAMESPACE);\n\t\t\t\tList<?> ln = n.getItems();\n\t\t\t\tif (ln.size() > 0)\n\t\t\t\t\tpepNickname = ((PayloadItem<Nick>)ln.get(0)).getPayload().getName();\n\t\t\t} catch (XMPPException.XMPPErrorException e) {\n\t\t\t\tif (e.getStanzaError().getCondition() != StanzaError.Condition.item_not_found)\n\t\t\t\t\tthrow e;\n\t\t\t}\n\t\t\tif (pepNickname == null || force_rename) {\n\t\t\t\tLog.i(TAG, \"Storing nickname into PEP: \" + mConfig.screenName);\n\t\t\t\tpsm.tryToPublishAndPossibleAutoCreate(Nick.NAMESPACE, new PayloadItem<>(new Nick(mConfig.screenName)));\n\t\t\t\treturn true;\n\t\t\t} else {\n\t\t\t\tLog.i(TAG, \"Using nickname from PEP: \" + pepNickname);\n\t\t\t\treturn mConfig.storeScreennameIfChanged(pepNickname);\n\t\t\t}\n\t\t} catch (Exception e) {\n\t\t\tLog.d(TAG, \"PEP nickname request failed: \" + e.getMessage());\n\t\t\te.printStackTrace();\n\t\t}\n\t\ttry {\n\t\t\t// then attempt to load nickname from VCard\n\t\t\tVCardManager vcm = VCardManager.getInstanceFor(mXMPPConnection);\n\t\t\tVCard vc = vcm.loadVCard();\n\t\t\tString nick = vc.getNickName();\n\t\t\tif (!TextUtils.isEmpty(nick)) {\n\t\t\t\tLog.i(TAG, \"Using nickname from VCard: \" + mConfig.screenName);\n\t\t\t\treturn mConfig.storeScreennameIfChanged(nick);\n\t\t\t}\n\t\t} catch (Exception e) {\n\t\t\tLog.d(TAG, \"VCard request failed: \" + e.getMessage());\n\t\t\te.printStackTrace();\n\t\t}\n\t\treturn false;\n\t}\n\tprivate void discoverMUCDomain(Jid jid, DiscoverInfo info) {\n\t\tif (mConfig.mucDomain != null)\n\t\t\treturn;\n\n\t\tIterator<DiscoverInfo.Identity> identities = info.getIdentities().iterator(); //SMAXX\n\t\twhile (identities.hasNext()) {\n\t\t\tDiscoverInfo.Identity identity = identities.next();\n\t\t\t// only accept conference/text, not conference/irc!\n\t\t\tif (identity.getCategory().equals(\"conference\") && identity.getType().equals(\"text\")) {\n\t\t\t\tmConfig.mucDomain = jid.toString();\n\t\t\t\tLog.d(TAG, \"discoverMUCDomain: \" + mConfig.mucDomain);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tprivate void loadMUCBookmarks() {\n\t\ttry {\n\t\t\tIterator<BookmarkedConference> it = BookmarkManager.getBookmarkManager(mXMPPConnection).getBookmarkedConferences().iterator();\n\t\t\tArrayList<String> bookmarked_jids = new ArrayList<String>();\n\t\t\tboolean added = false;\n\t\t\twhile (it.hasNext()) {\n\t\t\t\tBookmarkedConference bookmark = it.next();\n\t\t\t\tbookmarked_jids.add(bookmark.getJid().toString());\n\t\t\t\tif (!ChatRoomHelper.isRoom(mService, bookmark.getJid().toString())) {\n\t\t\t\t\tString jid = bookmark.getJid().toString();\n\t\t\t\t\tResourcepart nick = bookmark.getNickname();\n\t\t\t\t\tString nickname = (nick != null) ? nick.toString() : null;\n\t\t\t\t\tLog.d(TAG, \"Adding MUC: \" + jid + \"/\" + nickname + \" join=\" + bookmark.isAutoJoin());\n\t\t\t\t\tChatRoomHelper.addRoom(mService, jid, bookmark.getPassword(), nickname, bookmark.isAutoJoin());\n\t\t\t\t\tadded = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tChatRoomHelper.cleanupUnimportantRooms(mService, bookmarked_jids);\n\t\t\tif (added)\n\t\t\t\tsyncDbRooms();\n\t\t} catch (Exception e) {\n\t\t\tLog.d(TAG, \"getBookmarks failed: \" + e.getMessage());\n\t\t}\n\t}\n\n\t@Override\n\tpublic boolean hasFileUpload() {\n\t\treturn (mXMPPConnection != null) && HttpFileUploadManager.getInstanceFor(mXMPPConnection).isUploadServiceDiscovered();\n\t}\n\n\tprivate void discoverServicesAsync() {\n\t\tnew Thread(\"discoverServices\") {\n\t\t\tpublic void run() {\n\t\t\t\tdiscoverServices();\n\t\t\t\tloadOrUpdateNickname(mConfig.nickchange_required);\n\t\t\t\tloadMUCBookmarks(); // XXX: hack\n\t\t\t}\n\t\t}.start();\n\t}\n\n\tprivate void discoverServices(ServiceDiscoveryManager sdm, Jid jid) {\n\t\ttry {\n\t\t\tDiscoverInfo info = sdm.discoverInfo(jid);\n\t\t\tdiscoverMUCDomain(jid, info);\n\t\t} catch (Exception e) {\n\t\t\tLog.e(TAG, \"Error response from \" + jid + \": \" + e.getLocalizedMessage());\n\t\t}\n\t}\n\tprivate void discoverServices() {\n\t\ttry {\n\t\t\tServiceDiscoveryManager serviceDiscoveryManager = ServiceDiscoveryManager.getInstanceFor(mXMPPConnection);\n\t\t\tJid server = JidCreate.domainBareFrom(mConfig.server);\n\t\t\tdiscoverServices(serviceDiscoveryManager, server);\n\t\t\tDiscoverItems items = serviceDiscoveryManager.discoverItems(server);\n\n\t\t\tIterator<DiscoverItems.Item> it = items.getItems().iterator();\n\t\t\twhile (it.hasNext()) {\n\t\t\t\tDiscoverItems.Item item = it.next();\n\t\t\t\tJid jid = item.getEntityID();\n\t\t\t\tdiscoverServices(serviceDiscoveryManager, jid);\n\t\t\t}\n\t\t} catch (Exception e) {\n\t\t\tLog.e(TAG, \"Error discovering services: \" + e.getLocalizedMessage());\n\t\t}\n\t}\n\n\n\t/* set MUCs as not joined after a disconnect/reconnect */\n\tprivate synchronized void cleanupMUCsList() {\n\t\tfor (MUCController muc : multiUserChats.values())\n\t\t\tmuc.cleanup();\n\t\tmultiUserChats.clear();\n\t\tmucLastPing = 0;\n\t\tmucPreviousPing = 0;\n\t}\n\n\t/* remove stale MUCs from Roster, mark remaining ones as offline if needed */\n\tprivate synchronized void cleanupMUCsRoster(boolean set_offline) {\n\t\t// get a fresh MUC list\n\t\tCursor cursor = mContentResolver.query(RosterProvider.MUCS_URI,\n\t\t\t\tnew String[] { RosterProvider.RosterConstants.JID },\n\t\t\t\t\"autojoin=1\", null, null);\n\t\tHashSet<String> mucJIDs = new HashSet<String>();\n\t\twhile(cursor.moveToNext()) {\n\t\t\tmucJIDs.add(cursor.getString(0));\n\t\t}\n\t\tcursor.close();\n\n\t\t// delete removed MUCs\n\t\tStringBuilder exclusion = new StringBuilder(RosterProvider.RosterConstants.GROUP + \" = ? AND \"\n\t\t\t\t+ RosterConstants.JID + \" NOT IN ('\");\n\t\texclusion.append(TextUtils.join(\"', '\", mucJIDs));\n\t\texclusion.append(\"');\");\n\t\tmContentResolver.delete(RosterProvider.CONTENT_URI,\n\t\t\t\texclusion.toString(),\n\t\t\t\tnew String[] { RosterProvider.RosterConstants.MUCS });\n\t\tif (set_offline) {\n\t\t\t// update all other MUCs as offline\n\t\t\tContentValues values = new ContentValues();\n\t\t\tvalues.put(RosterConstants.STATUS_MODE, StatusMode.offline.ordinal());\n\t\t\tmContentResolver.update(RosterProvider.CONTENT_URI, values, RosterProvider.RosterConstants.GROUP + \" = ?\",\n\t\t\t\t\tnew String[] { RosterProvider.RosterConstants.MUCS });\n\t\t}\n\t\tthis.mucJIDs.addAll(mucJIDs);\n\t\tthis.mucJIDs.retainAll(mucJIDs);\n\t}\n\n\tpublic synchronized void syncDbRooms() {\n\t\tif (!isAuthenticated()) {\n\t\t\tdebugLog(\"syncDbRooms: aborting, not yet authenticated\");\n\t\t\treturn;\n\t\t}\n\n\t\tjava.util.Set<String> joinedRooms = multiUserChats.keySet();\n\t\tCursor cursor = mContentResolver.query(RosterProvider.MUCS_URI, \n\t\t\t\tnew String[] {RosterProvider.RosterConstants._ID,\n\t\t\t\t\tRosterProvider.RosterConstants.JID, \n\t\t\t\t\tRosterProvider.RosterConstants.PASSWORD, \n\t\t\t\t\tRosterProvider.RosterConstants.NICKNAME}, \n\t\t\t\t\"autojoin=1\", null, null);\n\t\tfinal int ID = cursor.getColumnIndexOrThrow(RosterProvider.RosterConstants._ID);\n\t\tfinal int JID_ID = cursor.getColumnIndexOrThrow(RosterProvider.RosterConstants.JID);\n\t\tfinal int PASSWORD_ID = cursor.getColumnIndexOrThrow(RosterProvider.RosterConstants.PASSWORD);\n\t\tfinal int NICKNAME_ID = cursor.getColumnIndexOrThrow(RosterProvider.RosterConstants.NICKNAME);\n\n\t\tHashSet<String> mucJIDs = new HashSet<String>();\n\t\twhile(cursor.moveToNext()) {\n\t\t\tint id = cursor.getInt(ID);\n\t\t\tString jid = cursor.getString(JID_ID);\n\t\t\tString password = cursor.getString(PASSWORD_ID);\n\t\t\tString nickname = cursor.getString(NICKNAME_ID);\n\t\t\tif (TextUtils.isEmpty(nickname))\n\t\t\t\tnickname = mConfig.screenName;\n\t\t\tmucJIDs.add(jid);\n\t\t\tthis.mucJIDs.add(jid);\n\t\t\t//debugLog(\"Found MUC Room: \"+jid+\" with nick \"+nickname+\" and pw \"+password);\n\t\t\tif(!joinedRooms.contains(jid) || !multiUserChats.get(jid).muc.isJoined()) {\n\t\t\t\tdebugLog(\"room \" + jid + \" isn't joined yet, i wanna join...\");\n\t\t\t\tjoinRoomAsync(jid, nickname, password); // TODO: make historyLen configurable\n\t\t\t} else {\n\t\t\t\tMultiUserChat muc = multiUserChats.get(jid).muc;\n\t\t\t\tif (!muc.getNickname().equals(nickname)) {\n\t\t\t\t\tdebugLog(\"room \" + jid + \": changing nickname to \" + nickname);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tmuc.changeNickname(Resourcepart.from(nickname));\n\t\t\t\t\t} catch (Exception e) {\n\t\t\t\t\t\tLog.e(TAG, \"Changing nickname failed.\");\n\t\t\t\t\t\te.printStackTrace();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// send pending offline messages, eg. after 0198 resume\n\t\t\t\ttry {\n\t\t\t\t\tsendOfflineMessages(jid);\n\t\t\t\t} catch (YaximXMPPException e) {\n\t\t\t\t\te.printStackTrace();\n\t\t\t\t}\n\t\t\t}\n\t\t\t//debugLog(\"found data in contentprovider: \"+jid+\" \"+password+\" \"+nickname);\n\t\t}\n\t\tcursor.close();\n\t\t\n\t\tfor(String room : new HashSet<String>(joinedRooms)) {\n\t\t\tif(!mucJIDs.contains(room)) {\n\t\t\t\tquitRoom(room);\n\t\t\t}\n\t\t}\n\t\tthis.mucJIDs.retainAll(mucJIDs);\n\t\tcleanupMUCsRoster(false);\n\t}\n\t\n\tprotected boolean handleMucInvitation(Message msg) {\n\t\tEntityBareJid room;\n\t\tString inviter = null;\n\t\tString reason = null;\n\t\tString password = null;\n\t\t\n\t\tMUCUser mucuser = (MUCUser)msg.getExtension(\"x\", \"http://jabber.org/protocol/muc#user\");\n\t\tGroupChatInvitation direct = GroupChatInvitation.from(msg);\n\t\tif (mucuser != null && mucuser.getInvite() != null) {\n\t\t\t// first try official XEP-0045 mediated invitation\n\t\t\tMUCUser.Invite invite = mucuser.getInvite();\n\t\t\troom = msg.getFrom().asEntityBareJidIfPossible();\n\t\t\tinviter = invite.getFrom().toString();\n\t\t\treason = invite.getReason();\n\t\t\tpassword = mucuser.getPassword();\n\t\t} else if (direct != null) {\n\t\t\t// fall back to XEP-0249 direct invitation\n\t\t\ttry {\n\t\t\t\troom = JidCreate.entityBareFrom(direct.getRoomAddress());\n\t\t\t} catch (XmppStringprepException e) {\n\t\t\t\te.printStackTrace();\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tinviter = msg.getFrom().toString();\n\t\t\t// TODO: get reason from direct invitation, not supported in smack3\n\t\t} else return false; // not a MUC invitation\n\n\t\tif (mucJIDs.contains(room)) {\n\t\t\tLog.i(TAG, \"Ignoring invitation to known MUC \" + room);\n\t\t\treturn true;\n\t\t}\n\t\tLog.d(TAG, \"MUC invitation from \" + inviter + \" to \" + room);\n\t\tasyncProcessMucInvitation(room, inviter, reason, password);\n\t\treturn true;\n\t}\n\n\tprotected void asyncProcessMucInvitation(final EntityBareJid room, final String inviter,\n\t\t\tfinal String reason, final String password) {\n\t\tnew Thread(\"processMucInvitation \" + room.toString()) {\n\t\t\tpublic void run() {\n\t\t\t\tprocessMucInvitation(room, inviter, reason, password);\n\t\t\t}\n\t\t}.start();\n\t}\n\tprotected void processMucInvitation(final EntityBareJid room, final String inviter,\n\t\t\t\t\t\t\t\t\t\tfinal String reason, final String password) {\n\t\tString roomname = room.toString();\n\t\tString inviter_name = null;\n\t\tif (getBareJID(inviter).equalsIgnoreCase(room.toString())) {\n\t\t\t// from == participant JID, display as \"user (MUC)\"\n\t\t\tinviter_name = getNameForJID(inviter);\n\t\t} else {\n\t\t\t// from == user bare or full JID\n\t\t\tinviter_name = getNameForJID(getBareJID(inviter));\n\t\t}\n\t\tString description = null;\n\t\tString inv_from = mService.getString(R.string.muc_invitation_from,\n\t\t\t\tinviter_name);\n\n\t\t// query room for info\n\t\ttry {\n\t\t\tLog.d(TAG, \"Requesting disco#info from \" + room);\n\t\t\tRoomInfo ri = MultiUserChatManager.getInstanceFor(mXMPPConnection).getRoomInfo(room);\n\t\t\tString rn = ri.getName();\n\t\t\tif (rn != null && rn.length() > 0)\n\t\t\t\troomname = String.format(\"%s (%s)\", rn, roomname);\n\t\t\tdescription = ri.getSubject();\n\t\t\tif (!TextUtils.isEmpty(description))\n\t\t\t\tdescription = ri.getDescription();\n\t\t\tdescription = mService.getString(R.string.muc_invitation_occupants,\n\t\t\t\t\tdescription, ri.getOccupantsCount());\n\t\t\tLog.d(TAG, \"MUC name after disco: \" + roomname);\n\t\t} catch (Exception e) {\n\t\t\t// ignore a failed room info request\n\t\t\tLog.d(TAG, \"MUC room IQ failed: \" + room);\n\t\t\te.printStackTrace();\n\t\t}\n\n\t\tmServiceCallBack.mucInvitationReceived(\n\t\t\t\troomname,\n\t\t\t\troom.toString(),\n\t\t\t\tpassword,\n\t\t\t\tinv_from,\n\t\t\t\tdescription);\n\t}\n\t\n\tprivate Map<String,Runnable> ongoingMucJoins = new java.util.concurrent.ConcurrentHashMap<String, Runnable>();\n\tprivate synchronized void joinRoomAsync(final String room, final String nickname, final String password) {\n\t\tif (ongoingMucJoins.containsKey(room))\n\t\t\treturn;\n\t\tThread joiner = new Thread(\"join \" + room) {\n\t\t\t@Override\n\t\t\tpublic void run() {\n\t\t\t\tLog.d(TAG, \"async joining \" + room);\n\t\t\t\tboolean result = joinRoom(room, nickname, password);\n\t\t\t\tLog.d(TAG, \"async joining \" + room + \" done: \" + result);\n\t\t\t\tongoingMucJoins.remove(room);\n\t\t\t}\n\t\t};\n\t\tongoingMucJoins.put(room, joiner);\n\t\tjoiner.start();\n\t}\n\n\tprivate boolean joinRoom(final String room, String nickname, String password) {\n\t\t// work around smack3 bug: can't rejoin with \"used\" MultiUserChat instance; need to manually\n\t\t// flush old MUC instance and create a new.\n\t\tMUCController mucc = multiUserChats.get(room);\n\t\tif (mucc != null)\n\t\t\tmucc.cleanup();\n\t\tmucc = new MUCController(mXMPPConnection, room);\n\t\tMultiUserChat muc = mucc.muc;\n\t\tmucc.loadPacketIDs(mContentResolver);\n\n\t\tLog.d(TAG, \"created new MUC instance: \" + room + \" \" + muc);\n\t\tmuc.addUserStatusListener(new org.jivesoftware.smackx.muc.DefaultUserStatusListener() {\n\t\t\t@Override\n\t\t\tpublic void kicked(Jid actor, String reason) {\n\t\t\t\tdebugLog(\"Kicked from \" + room + \" by \" + actor + \": \" + reason);\n\t\t\t\thandleKickedFromMUC(room, false, actor, reason);\n\t\t\t}\n\t\t\t@Override\n\t\t\tpublic void banned(Jid actor, String reason) {\n\t\t\t\tdebugLog(\"Banned from \" + room + \" by \" + actor + \": \" + reason);\n\t\t\t\thandleKickedFromMUC(room, true, actor, reason);\n\t\t\t}\n\t\t});\n\n\t\tDate lastDate = null;\n\t\tfinal String[] projection = new String[] {\n\t\t\t\tChatConstants._ID, ChatConstants.DATE\n\t\t};\n\t\tCursor cursor = mContentResolver.query(ChatProvider.CONTENT_URI, projection, \n\t\t\t\tChatConstants.JID + \" = ? AND \" +\n\t\t\t\tChatConstants.DIRECTION + \" = \" + ChatConstants.INCOMING,\n\t\t\t\tnew String[] { room }, \"_id DESC LIMIT 1\");\n\t\tif(cursor.getCount()>0) {\n\t\t\tcursor.moveToFirst();\n\t\t\tlastDate = new Date(cursor.getLong(1));\n\t\t\tLog.d(TAG, \"Getting room history for \" + room + \" starting at \" + lastDate);\n\t\t} else Log.d(TAG, \"Getting room history for \" + room + \" (full history)\");\n\t\tcursor.close();\n\t\t\n\t\tContentValues cvR = new ContentValues();\n\t\tcvR.put(RosterProvider.RosterConstants.JID, room);\n\t\tcvR.put(RosterProvider.RosterConstants.ALIAS, room);\n\t\tcvR.put(RosterProvider.RosterConstants.STATUS_MESSAGE, mService.getString(R.string.muc_synchronizing));\n\t\tcvR.put(RosterProvider.RosterConstants.STATUS_MODE, StatusMode.dnd.ordinal());\n\t\tcvR.put(RosterProvider.RosterConstants.GROUP, RosterProvider.RosterConstants.MUCS);\n\t\tupsertRoster(cvR, room);\n\t\tcvR.clear();\n\t\tcvR.put(RosterProvider.RosterConstants.JID, room);\n\t\ttry {\n\t\t\tsynchronized(this) {\n\t\t\t\tmultiUserChats.put(room, mucc);\n\t\t\t}\n\t\t\tPresence force_resync = new Presence(Presence.Type.unavailable);\n\t\t\tforce_resync.setTo(room + \"/\" + nickname);\n\t\t\tmXMPPConnection.sendStanza(force_resync);\n\t\t\tPresence join_presence = new Presence(Presence.Type.available);\n\t\t\tsetStatusFromConfig(join_presence);\n\t\t\tMucEnterConfiguration.Builder mecb = muc.getEnterConfigurationBuilder(Resourcepart.from(nickname))\n\t\t\t\t\t.withPassword(password)\n\t\t\t\t\t.withPresence(join_presence)\n\t\t\t\t\t.requestMaxStanzasHistory(MUCController.LOOKUP_SIZE)\n\t\t\t\t\t.requestHistorySince(lastDate);\n\t\t\tmuc.join(mecb.build());\n\t\t} catch (Exception e) {\n\t\t\tLog.e(TAG, \"Could not join MUC \"+room);\n\t\t\te.printStackTrace();\n\t\t\tString error_msg;\n\t\t\tif (e instanceof XMPPException.XMPPErrorException) {\n\t\t\t\tStanzaError se = ((XMPPException.XMPPErrorException)e).getStanzaError();\n\t\t\t\terror_msg = se.getDescriptiveText();\n\t\t\t\tif (TextUtils.isEmpty(error_msg))\n\t\t\t\t\terror_msg = se.toString();\n\t\t\t} else\n\t\t\t\terror_msg = e.getLocalizedMessage();\n\t\t\t// work around race condition when MUC was removed while joining\n\t\t\tif(mucJIDs.contains(room)) {\n\t\t\t\tcvR.put(RosterProvider.RosterConstants.STATUS_MESSAGE, mService.getString(R.string.conn_error, error_msg));\n\t\t\t\tcvR.put(RosterProvider.RosterConstants.STATUS_MODE, StatusMode.offline.ordinal());\n\t\t\t\tupsertRoster(cvR, room);\n\t\t\t}\n\t\t\t//SMAXX muc.cleanup();\n\t\t\tsynchronized(this) {\n\t\t\t\tmultiUserChats.remove(room);\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\tif(muc.isJoined()) {\n\t\t\tString roomname = room.split(\"@\")[0];\n\t\t\ttry {\n\t\t\t\tString rn = muc.getRoomInfo().getName();\n\t\t\t\tif (rn != null && rn.length() > 0)\n\t\t\t\t\troomname = rn;\n\t\t\t\tLog.d(TAG, \"MUC name after disco: \" + roomname);\n\t\t\t} catch (Exception e) {\n\t\t\t\t// ignore a failed room info request\n\t\t\t\tLog.d(TAG, \"MUC room IQ failed: \" + room);\n\t\t\t\te.printStackTrace();\n\t\t\t}\n\t\t\t// delay requesting subject until room info IQ returned/failed\n\t\t\tcvR.put(RosterProvider.RosterConstants.ALIAS, roomname);\n\t\t\t//cvR.put(RosterProvider.RosterConstants.STATUS_MODE, StatusMode.available.ordinal());\n\t\t\tLog.d(TAG, \"upserting MUC name for \" + room + \": \" + roomname);\n\t\t\tupsertRoster(cvR, room);\n\t\t\ttry {\n\t\t\t\tsendOfflineMessages(room);\n\t\t\t} catch (YaximXMPPException e) {\n\t\t\t\tLog.d(TAG, \"MUC send offline failed!\");\n\t\t\t\te.printStackTrace();\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\t//SMAXX muc.cleanup();\n\t\treturn false;\n\t}\n\n\tprivate void quitRoom(String room) {\n\t\tLog.d(TAG, \"Leaving MUC \" + room);\n\t\tMultiUserChat muc = multiUserChats.get(room).muc;\n\t\ttry {\n\t\t\tmuc.leave();\n\t\t} catch (Exception e) {\n\t\t\tLog.d(TAG, \"Failed to leave MUC: \" + room);\n\t\t\te.printStackTrace();\n\t\t}\n\t\tmultiUserChats.remove(room);\n\t\tmContentResolver.delete(RosterProvider.CONTENT_URI, \"jid = ?\", new String[] {room});\n\t}\n\n\t@Override\n\tpublic boolean inviteToRoom(String contactJid, String roomJid) {\n\t\tMultiUserChat muc = multiUserChats.get(roomJid).muc;\n\t\tif(contactJid.contains(\"/\")) {\n\t\t\tcontactJid = contactJid.split(\"/\")[0];\n\t\t}\n\t\tLog.d(TAG, \"invitng contact: \"+contactJid+\" to room: \"+muc);\n\t\ttry {\n\t\t\tmuc.invite(JidCreate.entityBareFromUnescaped(contactJid), \"User \"+contactJid+\" has invited you to a chat!\");\n\t\t\treturn true;\n\t\t} catch (Exception e) {\n\t\t\te.printStackTrace();\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tpublic EntityInfo getJidInfo(String jid) {\n\t\tif (jid.contains(\"/\")) { // MUC-PM\n\t\t\tString[] jid_parts = jid.split(\"/\", 2);\n\t\t\tMUCController mucc = multiUserChats.get(jid_parts[0]);\n\t\t\tEntityInfo ei = new EntityInfo(EnumSet.of(EntityInfo.Type.MUC_PM), jid,\n\t\t\t\t\tStatusMode.unknown, 0, jid_parts[1], null, 0, null);\n\t\t\tif (mucc != null && mucc.muc.isJoined()) {\n\t\t\t\tei.setPresenceStatus(mucc.muc.getOccupantPresence(JidCreate.entityFullFromOrNull(jid)));\n\t\t\t} else\n\t\t\t\tei.name = String.format(\"%s (%s)\", jid_parts[1],\n\t\t\t\t\tChatRoomHelper.getRoomName(mService, jid_parts[0]));\n\t\t\treturn ei;\n\t\t}\n\t\tRosterEntry re = null;\n\t\ttry {\n\t\t\tre = mRoster.getEntry(JidCreate.bareFrom(jid));\n\t\t} catch (XmppStringprepException e) {\n\t\t\t// ignore exception and fall back to JID\n\t\t}\n\t\tif (re != null) {\n\t\t\tEntityInfo ei = new EntityInfo(EnumSet.of(EntityInfo.Type.User, EntityInfo.Type.Known),\n\t\t\t\t\tjid, StatusMode.unknown, 0, re.getName(), null, 0, re);\n\t\t\tei.setPresenceStatus(mRoster.getPresence(re.getJid()));\n\t\t\treturn ei;\n\t\t} else if (mucJIDs.contains(jid)) {\n\t\t\tString name = ChatRoomHelper.getRoomName(mService, jid);\n\t\t\tMUCController mucc = multiUserChats.get(jid);\n\t\t\tif (mucc != null) {\n\t\t\t\treturn new EntityInfo(EnumSet.of(EntityInfo.Type.MUC, EntityInfo.Type.Known),\n\t\t\t\t\t\tjid, mucc.isSynchronized ? StatusMode.available : StatusMode.xa,\n\t\t\t\t\t\t0, name, mucc.muc.getSubject(), mucc.muc.getOccupantsCount(), null);\n\t\t\t} else\n\t\t\t\treturn new EntityInfo(EnumSet.of(EntityInfo.Type.MUC, EntityInfo.Type.Known),\n\t\t\t\t\t\tjid, StatusMode.unknown,\n\t\t\t\t\t\t0, name, null, 0, null);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tpublic List<EntityInfo> getUserList(String jid) {\n\t\tMUCController mucc = multiUserChats.get(jid);\n\t\tif (mucc == null) {\n\t\t\treturn null;\n\t\t}\n\t\tMultiUserChat muc = mucc.muc;\n\t\tboolean non_anon = (muc.getRoomInfo() != null) && muc.getRoomInfo().isNonanonymous();\n\t\tLog.d(TAG, \"MUC instance: \" + jid + \" \" + muc);\n\t\tIterator<EntityFullJid> occIter = muc.getOccupants().iterator();\n\t\tArrayList<EntityInfo> tmpList = new ArrayList<EntityInfo>();\n\t\twhile(occIter.hasNext()) {\n\t\t\tPresence occupantPresence = muc.getOccupantPresence(occIter.next());\n\t\t\tEntityInfo ei = new EntityInfo(EnumSet.of(EntityInfo.Type.MUC_PM), occupantPresence);\n\t\t\t// work around nameless participant from ejabberd MUC vcard\n\t\t\tif (occupantPresence.getFrom().getResourceOrNull() != null) {\n\t\t\t\t// Default bare_jid to the actual full occupant JID (muc@domain/nickname) for MUCChatWindow\n\t\t\t\tei.jid = occupantPresence.getFrom().toString();\n\t\t\t\tei.name = occupantPresence.getFrom().getResourceOrEmpty().toString();\n\t\t\t\tMUCUser mu = (MUCUser) occupantPresence.getExtension(\"x\", \"http://jabber.org/protocol/muc#user\");\n\t\t\t\t// override bare_jid with real bare_jid if non-anon MUC and JID is known\n\t\t\t\tif (non_anon && mu != null && mu.getItem() != null && !TextUtils.isEmpty(mu.getItem().getJid()))\n\t\t\t\t\tei.jid = mu.getItem().getJid().asBareJid().toString();\n\t\t\t\ttmpList.add(ei);\n\t\t\t}\n\t\t}\n\t\tCollections.sort(tmpList, new Comparator<EntityInfo>() {\n\t\t\t@Override\n\t\t\tpublic int compare(EntityInfo lhs, EntityInfo rhs) {\n\t\t\t\treturn java.text.Collator.getInstance().compare(lhs.name, rhs.name);\n\t\t\t}\n\t\t});\n\t\tLog.d(TAG, \"getUserList(\" + jid + \"): \" + tmpList.size());\n\t\treturn tmpList;\n\t}\n\n\t@Override\n\tpublic XMPPConnection getConnection() {\n\t\treturn mXMPPConnection;\n\t}\n\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/service/XMPPService.java",
    "content": "package org.yaxim.androidclient.service;\n\nimport java.util.HashSet;\nimport java.util.concurrent.atomic.AtomicBoolean;\n\nimport org.yaxim.androidclient.FileHttpUploadTask;\nimport org.yaxim.androidclient.IXMPPRosterCallback;\nimport org.yaxim.androidclient.MainWindow;\nimport org.yaxim.androidclient.R;\nimport org.yaxim.androidclient.YaximApplication;\nimport org.yaxim.androidclient.data.RosterProvider;\nimport org.yaxim.androidclient.exceptions.YaximXMPPException;\nimport org.yaxim.androidclient.util.ConnectionState;\nimport org.yaxim.androidclient.util.StatusMode;\n\nimport org.jivesoftware.smack.packet.Message.Type;\nimport org.jivesoftware.smack.sasl.SASLErrorException;\n\nimport android.app.AlarmManager;\nimport android.app.Notification;\nimport android.app.PendingIntent;\nimport android.content.BroadcastReceiver;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.IntentFilter;\nimport android.content.pm.ServiceInfo;\nimport android.media.AudioManager;\nimport android.net.ConnectivityManager;\nimport android.net.NetworkInfo;\nimport android.net.Uri;\nimport android.net.Uri.Builder;\nimport android.os.Build;\nimport android.os.Handler;\nimport android.os.IBinder;\nimport android.os.RemoteCallbackList;\nimport android.os.RemoteException;\nimport android.support.v4.app.NotificationCompat;\nimport android.util.Log;\nimport android.widget.Toast;\n\npublic class XMPPService extends GenericService {\n\n\tprivate static final String TAG=\"yaxim.XMPPService\";\n\t\n\tprivate AtomicBoolean mConnectionDemanded = new AtomicBoolean(false); // should we try to reconnect?\n\tprivate static final int RECONNECT_AFTER = 5;\n\tprivate static final int RECONNECT_MAXIMUM = 10*60;\n\tprivate static final String RECONNECT_ALARM = \"org.yaxim.androidclient.RECONNECT_ALARM\";\n\tprivate int mReconnectTimeout = RECONNECT_AFTER;\n\tprivate String mReconnectInfo = \"\";\n\tprivate Intent mAlarmIntent = new Intent(RECONNECT_ALARM);\n\tprivate PendingIntent mPAlarmIntent;\n\tprivate BroadcastReceiver mAlarmReceiver = new ReconnectAlarmReceiver();\n\tprivate BroadcastReceiver mRingerModeReceiver = new RingerModeReceiver();\n\n\tprivate SmackableImp mSmackable;\n\tprivate boolean create_account = false;\n\tprivate IXMPPRosterService.Stub mService2RosterConnection;\n\tprivate IXMPPChatService.Stub mServiceChatConnection;\n\tprivate IXMPPMucService.Stub mServiceMucConnection;\n\n\tprivate RemoteCallbackList<IXMPPRosterCallback> mRosterCallbacks = new RemoteCallbackList<IXMPPRosterCallback>();\n\tprivate HashSet<String> mIsBoundTo = new HashSet<String>();\n\tprivate Handler mMainHandler = new Handler();\n\n\t@Override\n\tpublic IBinder onBind(Intent intent) {\n\t\tuserStartedWatching();\n\n\t\tString chatPartner = intent.getDataString();\n\t\tif(chatPartner != null && chatPartner.endsWith(\"?chat\")) {\n\t\t\treturn mServiceMucConnection;\n\t\t} else if (chatPartner != null) {\n\t\t\tclearNotification(chatPartner);\n\t\t\tmIsBoundTo.add(chatPartner);\n\t\t\treturn mServiceChatConnection;\n\t\t}\n\t\treturn mService2RosterConnection;\n\t}\n\n\t@Override\n\tpublic void onRebind(Intent intent) {\n\t\tuserStartedWatching();\n\t\tString chatPartner = intent.getDataString();\n\t\tif ((chatPartner != null)) {\n\t\t\tmIsBoundTo.add(chatPartner);\n\t\t\tclearNotification(chatPartner);\n\t\t}\n\t}\n\n\t@Override\n\tpublic boolean onUnbind(Intent intent) {\n\t\tString chatPartner = intent.getDataString();\n\t\tif ((chatPartner != null)) {\n\t\t\tmIsBoundTo.remove(chatPartner);\n\t\t}\n\t\tuserStoppedWatching();\n\n\t\treturn true;\n\t}\n\n\t@Override\n\tpublic void onCreate() {\n\t\tsuper.onCreate();\n\n\t\tcreateServiceRosterStub();\n\t\tcreateServiceChatStub();\n\t\tcreateServiceMucStub();\n\n\t\tmAlarmIntent.setPackage(getPackageName());\n\t\tmPAlarmIntent = PendingIntent.getBroadcast(this, 0, mAlarmIntent,\n\t\t\t\t\tPendingIntent.FLAG_UPDATE_CURRENT|PendingIntent.FLAG_IMMUTABLE);\n\t\tregisterReceiver(mAlarmReceiver, new IntentFilter(RECONNECT_ALARM), Context.RECEIVER_EXPORTED);\n\t\tregisterReceiver(mRingerModeReceiver, new IntentFilter(AudioManager.RINGER_MODE_CHANGED_ACTION), Context.RECEIVER_EXPORTED);\n\t\tconfigureSmartAwayMode();\n\n\t\tcreateAdapter();\n\t\tYaximBroadcastReceiver.initNetworkStatus(getApplicationContext());\n\n\t\tif (mConfig.autoConnect && mConfig.jid_configured) {\n\t\t\t/*\n\t\t\t * start our own service so it remains in background even when\n\t\t\t * unbound\n\t\t\t */\n\t\t\tIntent xmppServiceIntent = new Intent(this, XMPPService.class);\n\t\t\tif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)\n\t\t\t\tstartForegroundService(xmppServiceIntent);\n\t\t\telse\n\t\t\t\tstartService(xmppServiceIntent);\n\t\t}\n\t}\n\n\t@Override\n\tpublic void onDestroy() {\n\t\tsuper.onDestroy();\n\n\t\t((AlarmManager)getSystemService(Context.ALARM_SERVICE)).cancel(mPAlarmIntent);\n\t\tmRosterCallbacks.kill();\n\t\tif (mSmackable != null) {\n\t\t    manualDisconnect();\n\t\t    mSmackable.unRegisterCallback();\n\t\t}\n\t\tunregisterReceiver(mAlarmReceiver);\n\t\tunregisterReceiver(mRingerModeReceiver);\n\t\tYaximBroadcastReceiver.getInstance().untrackConnectivity(this);\n\t}\n\n\t@Override\n\tpublic int onStartCommand(Intent intent, int flags, int startId) {\n\t\tlogInfo(\"onStartCommand(), mConnectionDemanded=\" + mConnectionDemanded.get());\n\t\tlogInfo(\"    intent=\" + intent);\n\t\tif (intent != null) {\n\t\t\tcreate_account = intent.getBooleanExtra(\"create_account\", false);\n\t\t\t\n\t\t\tif (\"disconnect\".equals(intent.getAction())) {\n\t\t\t\tfailConnection(getString(R.string.conn_no_network));\n\t\t\t\treturn START_STICKY;\n\t\t\t} else\n\t\t\tif (\"reconnect\".equals(intent.getAction())) {\n\t\t\t\t// TODO: integrate the following steps into one \"RECONNECT\"\n\t\t\t\tfailConnection(getString(R.string.conn_no_network));\n\t\t\t\t// reset reconnection timeout\n\t\t\t\tmReconnectTimeout = RECONNECT_AFTER;\n\t\t\t\tdoConnect();\n\t\t\t\treturn START_STICKY;\n\t\t\t} else\n\t\t\tif (\"ping\".equals(intent.getAction())) {\n\t\t\t\tif (mSmackable != null && mSmackable.isAuthenticated()) {\n\t\t\t\t\tmSmackable.sendServerPing();\n\t\t\t\t\treturn START_STICKY;\n\t\t\t\t}\n\t\t\t\t// if not authenticated, fall through to doConnect()\n\t\t\t} else\n\t\t\tif (\"respond\".equals(intent.getAction())) {\n\t\t\t\t// clear notifications and send a message from Android Auto/Wear event\n\t\t\t\tString jid = intent.getDataString();\n\t\t\t\tString replystring = intent.getStringExtra(\"message\");\n\t\t\t\tif (replystring != null) {\n\t\t\t\t\tLog.d(TAG, \"got reply: \" + replystring);\n\t\t\t\t\tmSmackable.sendMessage(jid, replystring, null, null, -1);\n\t\t\t\t}\n\t\t\t\torg.yaxim.androidclient.data.ChatHelper.markAsRead(this, jid);\n\t\t\t\tclearNotification(jid);\n\t\t\t\treturn START_STICKY;\n\t\t\t}\n\t\t}\n\t\t\n\t\tmConnectionDemanded.set(mConfig.autoConnect);\n\t\tYaximBroadcastReceiver.getInstance().trackConnectivity(this);\n\t\tdoConnect();\n\t\treturn START_STICKY;\n\t}\n\n\t// TODO: remove this when migrating to AndroidX\n\t@Override\n\tpublic Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, int flags) {\n\t\tif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE)\n\t\t\treturn super.registerReceiver(receiver, filter, flags);\n\t\telse\n\t\t\treturn super.registerReceiver(receiver, filter);\n\t}\n\n\tprivate void createServiceChatStub() {\n\t\tmServiceChatConnection = new IXMPPChatService.Stub() {\n\n\t\t\tpublic void sendMessage(String user, String message, String lmc, long upsert_id)\n\t\t\t\t\tthrows RemoteException {\n\t\t\t\tif (mSmackable != null)\n\t\t\t\t\tmSmackable.sendMessage(user, message, lmc, null, upsert_id);\n\t\t\t\telse\n\t\t\t\t\tSmackableImp.addOfflineMessage(getContentResolver(),\n\t\t\t\t\t\t\tuser, message);\n\t\t\t}\n\n\t\t\tpublic boolean isAuthenticated() throws RemoteException {\n\t\t\t\tif (mSmackable != null) {\n\t\t\t\t\treturn mSmackable.isAuthenticated();\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t\n\t\t\tpublic void clearNotifications(String Jid) throws RemoteException {\n\t\t\t\tclearNotification(Jid);\n\t\t\t}\n\n\t\t\t@Override\n\t\t\tpublic boolean hasFileUpload() throws RemoteException {\n\t\t\t\tif (mSmackable != null) {\n\t\t\t\t\treturn mSmackable.hasFileUpload();\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tpublic void sendFile(Uri path, String user, int flags) throws RemoteException {\n\t\t\t\tif (mSmackable != null)\n\t\t\t\t\tnew FileHttpUploadTask(XMPPService.this, mConfig, mSmackable, path, user, flags).execute();\n\t\t\t}\n\t\t};\n\t}\n\t\n\tprivate void createServiceMucStub() {\n\t\tmServiceMucConnection = new IXMPPMucService.Stub() {\n\t\t\tprivate void fail(String error) {\n\t\t\t\tToast toast = Toast.makeText(getApplicationContext(), \n\t\t\t\t\t\terror, Toast.LENGTH_LONG);\n\t\t\t\ttoast.show();\n\t\t\t}\n\t\t\t@Override\n\t\t\tpublic void syncDbRooms() throws RemoteException {\n\t\t\t\tif(mSmackable!=null)\n\t\t\t\t\tnew Thread() {\n\t\t\t\t\t\t@Override\n\t\t\t\t\t\tpublic void run() {\n\t\t\t\t\t\t\tmSmackable.syncDbRooms();\n\t\t\t\t\t\t}\n\t\t\t\t\t}.start();\n\t\t\t}\n\t\t\t@Override\n\t\t\tpublic boolean inviteToRoom(String contactJid, String roomJid) {\n\t\t\t\tif(mSmackable!=null)\n\t\t\t\t\treturn mSmackable.inviteToRoom(contactJid, roomJid);\n\t\t\t\telse {\n\t\t\t\t\tshortToastNotify(getString(R.string.Global_authenticate_first));\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\t@Override\n\t\t\tpublic String getMyMucNick(String jid) throws RemoteException {\n\t\t\t\tif(mSmackable!=null)\n\t\t\t\t\treturn mSmackable.getMyMucNick(jid);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t};\n\t}\n\n\tprivate void createServiceRosterStub() {\n\t\tmService2RosterConnection = new IXMPPRosterService.Stub() {\n\n\t\t\tpublic void registerRosterCallback(IXMPPRosterCallback callback)\n\t\t\t\t\tthrows RemoteException {\n\t\t\t\tif (callback != null)\n\t\t\t\t\tmRosterCallbacks.register(callback);\n\t\t\t}\n\n\t\t\tpublic void unregisterRosterCallback(IXMPPRosterCallback callback)\n\t\t\t\t\tthrows RemoteException {\n\t\t\t\tif (callback != null)\n\t\t\t\t\tmRosterCallbacks.unregister(callback);\n\t\t\t}\n\n\t\t\tpublic int getConnectionState() throws RemoteException {\n\t\t\t\tif (mSmackable != null) {\n\t\t\t\t\treturn mSmackable.getConnectionState().ordinal();\n\t\t\t\t} else {\n\t\t\t\t\treturn ConnectionState.OFFLINE.ordinal();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpublic String getConnectionStateString() throws RemoteException {\n\t\t\t\treturn XMPPService.this.getConnectionStateString();\n\t\t\t}\n\n\n\t\t\tpublic void setStatusFromConfig()\n\t\t\t\t\tthrows RemoteException {\n\t\t\t\tif (mSmackable != null) { // this should always be true, but stil...\n\t\t\t\t\tmSmackable.setStatusFromConfig();\n\t\t\t\t\tupdateServiceNotification();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpublic void addRosterItem(String user, String alias, String group, String token)\n\t\t\t\t\tthrows RemoteException {\n\t\t\t\ttry {\n\t\t\t\t\tmSmackable.addRosterItem(user, alias, group, token);\n\t\t\t\t} catch (YaximXMPPException e) {\n\t\t\t\t\tshortToastNotify(e);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpublic void addRosterGroup(String group) throws RemoteException {\n\t\t\t\tmSmackable.addRosterGroup(group);\n\t\t\t}\n\n\t\t\tpublic void removeRosterItem(String user) throws RemoteException {\n\t\t\t\ttry {\n\t\t\t\t\tmSmackable.removeRosterItem(user);\n\t\t\t\t} catch (YaximXMPPException e) {\n\t\t\t\t\tshortToastNotify(e);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpublic void moveRosterItemToGroup(String user, String group)\n\t\t\t\t\tthrows RemoteException {\n\t\t\t\ttry {\n\t\t\t\t\tmSmackable.moveRosterItemToGroup(user, group);\n\t\t\t\t} catch (YaximXMPPException e) {\n\t\t\t\t\tshortToastNotify(e);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpublic void renameRosterItem(String user, String newName)\n\t\t\t\t\tthrows RemoteException {\n\t\t\t\ttry {\n\t\t\t\t\tmSmackable.renameRosterItem(user, newName);\n\t\t\t\t} catch (YaximXMPPException e) {\n\t\t\t\t\tshortToastNotify(e);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpublic void renameRosterGroup(String group, String newGroup)\n\t\t\t\t\tthrows RemoteException {\n\t\t\t\ttry {\n\t\t\t\t\tmSmackable.renameRosterGroup(group, newGroup);\n\t\t\t\t} catch (YaximXMPPException e) {\n\t\t\t\t\tshortToastNotify(e);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t@Override\n\t\t\tpublic String changePassword(String newPassword)\n\t\t\t\t\tthrows RemoteException {\n\t\t\t\treturn mSmackable.changePassword(newPassword);\n\t\t\t}\n\n\t\t\tpublic void disconnect() throws RemoteException {\n\t\t\t\tmanualDisconnect();\n\t\t\t}\n\n\t\t\tpublic void connect() throws RemoteException {\n\t\t\t\tmConnectionDemanded.set(true);\n\t\t\t\tmReconnectTimeout = RECONNECT_AFTER;\n\t\t\t\tdoConnect();\n\t\t\t}\n\n\t\t\tpublic void sendPresenceRequest(String jid, String type)\n\t\t\t\t\tthrows RemoteException {\n\t\t\t\ttry {\n\t\t\t\t\tmSmackable.sendPresenceRequest(jid, type);\n\t\t\t\t} catch (YaximXMPPException e) {\n\t\t\t\t\tshortToastNotify(e);\n\t\t\t\t}\n\t\t\t}\n\n\t\t};\n\t}\n\n\tprivate String getConnectionStateString() {\n\t\tStringBuilder sb = new StringBuilder();\n\t\tsb.append(mReconnectInfo);\n\t\tif (mSmackable != null && mSmackable.getLastError() != null) {\n\t\t\tConnectionState cs = mSmackable.getConnectionState();\n\t\t\tsb.append((cs == ConnectionState.LOADING) ? \" \" : \"\\n\");\n\t\t\tsb.append(mSmackable.getLastError());\n\t\t}\n\t\treturn sb.toString();\n\t}\n\n\tpublic String getStatusTitle(ConnectionState cs) {\n\t\tif (cs != ConnectionState.ONLINE)\n\t\t\treturn mReconnectInfo;\n\t\tString status = getString(mConfig.getPresenceMode().getTextId());\n\n\t\tif (mConfig.statusMessage.length() > 0) {\n\t\t\tstatus = status + \" (\" + mConfig.statusMessage + \")\";\n\t\t}\n\n\t\treturn status;\n\t}\n\n\tprivate void updateServiceNotification(ConnectionState cs) {\n\t\t// HACK to trigger show-offline when XEP-0198 reconnect is going on\n\t\tgetContentResolver().notifyChange(RosterProvider.CONTENT_URI, null);\n\t\tgetContentResolver().notifyChange(RosterProvider.GROUPS_URI, null);\n\t\t// end-of-HACK\n\n\t\tLog.d(TAG, \"updateServiceNotification: \" + cs);\n\t\tbroadcastConnectionState(cs);\n\n\t\tif (cs == ConnectionState.OFFLINE) {\n\t\t\tstopForeground(true);\n\t\t\treturn;\n\t\t}\n\n\t\t// do not show notification if not a foreground service\n\t\tif (!mConfig.foregroundService) {\n\t\t\treturn;\n\t\t}\n\n\t\tIntent notificationIntent = new Intent(this, MainWindow.class);\n\t\tnotificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);\n\n\t\tNotification n = new NotificationCompat.Builder(this, \"status\")\n\t\t\t.setSmallIcon((cs == ConnectionState.ONLINE) ? R.drawable.ic_online : R.drawable.ic_offline)\n\t\t\t.setLargeIcon(android.graphics.BitmapFactory.decodeResource(getResources(), R.drawable.icon))\n\t\t\t.setWhen(mSmackable.getConnectionStateTimestamp())\n\t\t\t.setOngoing(true)\n\t\t\t.setOnlyAlertOnce(true)\n\t\t\t.setContentIntent(PendingIntent.getActivity(this, 0, notificationIntent,\n\t\t\t\tPendingIntent.FLAG_UPDATE_CURRENT|PendingIntent.FLAG_IMMUTABLE))\n\t\t\t.setContentTitle(getString(R.string.conn_title, mConfig.jabberID))\n\t\t\t.setContentText(getStatusTitle(cs))\n\t\t\t.build();\n\n\n\t\tif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE)\n\t\t\tstartForeground(SERVICE_NOTIFICATION, n, ServiceInfo.FOREGROUND_SERVICE_TYPE_REMOTE_MESSAGING);\n\t\telse\n\t\t\tstartForeground(SERVICE_NOTIFICATION, n);\n\t}\n\tprivate void updateServiceNotification() {\n\t\tConnectionState cs = ConnectionState.OFFLINE;\n\t\tif (mSmackable != null) {\n\t\t\tcs = mSmackable.getConnectionState();\n\t\t}\n\t}\n\n\tprivate void doConnect() {\n\t\tmReconnectInfo = getString(R.string.conn_connecting);\n\t\tupdateServiceNotification();\n\t\tif (mSmackable == null) {\n\t\t\tcreateAdapter();\n\t\t}\n\n\t\tmSmackable.requestConnectionState(ConnectionState.ONLINE, create_account);\n\t\tcreate_account = false;\n\t}\n\n\tprivate synchronized void broadcastConnectionState(ConnectionState cs) {\n\t\tfinal int broadCastItems = mRosterCallbacks.beginBroadcast();\n\n\t\tfor (int i = 0; i < broadCastItems; i++) {\n\t\t\ttry {\n\t\t\t\tmRosterCallbacks.getBroadcastItem(i).connectionStateChanged(cs.ordinal());\n\t\t\t} catch (RemoteException e) {\n\t\t\t\tlogError(\"caught RemoteException: \" + e.getMessage());\n\t\t\t}\n\t\t}\n\t\tmRosterCallbacks.finishBroadcast();\n\t}\n\n\tprivate NetworkInfo getNetworkInfo() {\n\t\tContext ctx = getApplicationContext();\n\t\tConnectivityManager connMgr =\n\t\t\t\t(ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE);\n\t\treturn connMgr.getActiveNetworkInfo();\n\t}\n\tprivate boolean networkConnected() {\n\t\tNetworkInfo info = getNetworkInfo();\n\n\t\treturn info != null && info.isConnected();\n\t}\n\tprivate boolean networkConnectedOrConnecting() {\n\t\tNetworkInfo info = getNetworkInfo();\n\n\t\treturn info != null && info.isConnectedOrConnecting();\n\t}\n\n\t// call this when Android tells us to shut down\n\tprivate void failConnection(String reason) {\n\t\tlogInfo(\"failConnection: \" + reason);\n\t\tmReconnectInfo = reason;\n\t\tupdateServiceNotification();\n\t\tif (mSmackable != null)\n\t\t\tmSmackable.requestConnectionState(ConnectionState.DISCONNECTED);\n\t}\n\n\t// called from Smackable when connection broke down\n\tprivate void connectionFailed(String reason) {\n\t\tlogInfo(\"connectionFailed: \" + reason);\n\t\t//TODO: error message from downstream?\n\t\t//mLastConnectionError = reason;\n\t\tif (!networkConnected()) {\n\t\t\tmReconnectInfo = getString(R.string.conn_no_network);\n\t\t\tmSmackable.requestConnectionState(ConnectionState.RECONNECT_NETWORK);\n\n\t\t} else if (mConnectionDemanded.get()) {\n\t\t\tif (mSmackable.getLastLoginError() instanceof SASLErrorException) {\n\t\t\t\tmConnectionDemanded.set(false);\n\t\t\t\tmConfig.jid_configured = false;\n\t\t\t\tmSmackable.requestConnectionState(ConnectionState.OFFLINE);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tmReconnectInfo = getString(R.string.conn_reconnect, mReconnectTimeout);\n\t\t\tmSmackable.requestConnectionState(ConnectionState.RECONNECT_DELAYED);\n\t\t\tlogInfo(\"connectionFailed(): registering reconnect in \" + mReconnectTimeout + \"s\");\n\t\t\t((AlarmManager)getSystemService(Context.ALARM_SERVICE)).set(AlarmManager.RTC_WAKEUP,\n\t\t\t\t\tSystem.currentTimeMillis() + mReconnectTimeout * 1000, mPAlarmIntent);\n\t\t\tmReconnectTimeout = mReconnectTimeout * 2;\n\t\t\tif (mReconnectTimeout > RECONNECT_MAXIMUM)\n\t\t\t\tmReconnectTimeout = RECONNECT_MAXIMUM;\n\t\t} else {\n\t\t\tconnectionClosed();\n\t\t}\n\n\t}\n\n\tprivate void connectionClosed() {\n\t\tlogInfo(\"connectionClosed.\");\n\t\tmReconnectInfo = \"\";\n\t\tstopForeground(true);\n\t\tmSmackable.requestConnectionState(ConnectionState.OFFLINE);\n\t}\n\n\tpublic void manualDisconnect() {\n\t\tmConnectionDemanded.set(false);\n\t\tmReconnectInfo = getString(R.string.conn_disconnecting);\n\t\tperformDisconnect();\n\t}\n\n\tpublic void performDisconnect() {\n\t\tif (mSmackable != null) {\n\t\t\t// this is non-blocking\n\t\t\tmSmackable.requestConnectionState(ConnectionState.OFFLINE);\n\t\t}\n\t}\n\n\tstatic int invitationDrawableId() {\n\t\tif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)\n\t\t\treturn R.drawable.ic_action_contacts_online;\n\t\telse return R.drawable.ic_online;\n\t}\n\tprivate void createAdapter() {\n\t\tSystem.setProperty(\"smack.debugEnabled\", \"\" + mConfig.smackdebug);\n\t\ttry {\n\t\t\tmSmackable = new SmackableImp(mConfig, getContentResolver(), this);\n\t\t\tYaximApplication.getApp().setSmackable(mSmackable);\n\t\t} catch (NullPointerException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\n\t\tmSmackable.registerCallback(new XMPPServiceCallback() {\n\t\t\tpublic void notifyMessage(final String[] from, final String message,\n\t\t\t\t\tfinal boolean silent_notification, final Type msgType,\n\t\t\t\t\tfinal long timestamp, final boolean still_loading) {\n\t\t\t\tfinal String name = mSmackable.getNameForJID(from[0]);\n\t\t\t\tlogInfo(\"notification: \" + from[0] + \" type=\"+msgType.name() + \" clear=\" + (message == null) + \" loading=\" + still_loading);\n\t\t\t\tmMainHandler.post(new Runnable() {\n\t\t\t\t\tpublic void run() {\n\t\t\t\t\t\t// work around Toast fallback for errors\n\t\t\t\t\t\tif (still_loading)\n\t\t\t\t\t\t\tXMPPService.this.appendToNotification(from, name, message,\n\t\t\t\t\t\t\t\t\tmsgType, timestamp);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tnotifyClient(from, name, message,\n\t\t\t\t\t\t\t\t!mIsBoundTo.contains(from[0]), silent_notification, msgType, timestamp);\n\t\t\t\t\t}});\n\t\t\t\t}\n\n\t\t\t@Override\n\t\t\tpublic void displayPendingNotifications(final String jid) {\n\t\t\t\tmMainHandler.post(new Runnable() {\n\t\t\t\t\tpublic void run() {\n\t\t\t\t\t\t// work around Toast fallback for errors\n\t\t\t\t\t\tif (jid == null)\n\t\t\t\t\t\t\tXMPPService.this.displayPendingNonMUCNotifications();\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tNotificationData nd = notifications.get(jid);\n\t\t\t\t\t\t\tif (nd != null && !nd.shown) {\n\t\t\t\t\t\t\t\tlogInfo(\"Showing delayed notification for \" + jid);\n\t\t\t\t\t\t\t\tdisplayNotification(jid, nd, false);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}});\n\t\t\t}\n\n\t\t\tpublic void connectionStateChanged(ConnectionState connection_state) {\n\t\t\t\t// TODO: OFFLINE is sometimes caused by XMPPConnection calling\n\t\t\t\t// connectionClosed() callback on an error, need to catch that?\n\t\t\t\tswitch (connection_state) {\n\t\t\t\tcase LOADING:\n\t\t\t\t\tmReconnectInfo = getString(R.string.muc_synchronizing);\n\t\t\t\t\tbreak;\n\t\t\t\t//case OFFLINE:\n\t\t\t\tcase DISCONNECTED:\n\t\t\t\t\tconnectionFailed(getString(R.string.conn_disconnected));\n\t\t\t\t\tbreak;\n\t\t\t\tcase ONLINE:\n\t\t\t\t\tmReconnectTimeout = RECONNECT_AFTER;\n\t\t\t\tdefault:\n\t\t\t\t}\n\t\t\t\tupdateServiceNotification(connection_state);\n\t\t\t}\n\n\t\t\t@Override\n\t\t\tpublic void mucInvitationReceived(String roomname, String room, String password, String invite_from, String roomdescription) {\n\t\t\t\tString body = invite_from + \": \" + roomname + \"\\n\" + roomdescription;\n\t\t\t\tLog.d(TAG, \"Notifying MUC invitation for \" + room + \". \" + body);\n\t\t\t\tIntent intent = new Intent(getApplicationContext(), MainWindow.class);\n\t\t\t\tintent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);\n\t\t\t\tintent.setAction(\"android.intent.action.VIEW\");\n\t\t\t\tString uri = \"xmpp:\" + java.net.URLEncoder.encode(room);\n\t\t\t\tBuilder b = new Builder();\n\t\t\t\tb.appendQueryParameter(\"join\", null);\n\t\t\t\tif (password != null)\n\t\t\t\t\tb.appendQueryParameter(\"password\", password);\n\t\t\t\tb.appendQueryParameter(\"body\", body);\n\t\t\t\tintent.setData(Uri.parse(uri + b.toString()));\n\t\t\t\tPendingIntent pi = PendingIntent.getActivity(getApplicationContext(), 0, \n\t\t\t\t\t\tintent, PendingIntent.FLAG_IMMUTABLE);\n\t\t\t\tNotification invNotify = new NotificationCompat.Builder(getApplicationContext(), \"msg\")\n\t\t\t\t\t\t .setContentTitle(roomname)\n\t\t\t\t\t\t .setContentText(body)\n\t\t\t\t\t\t .setSmallIcon(invitationDrawableId())\n\t\t\t\t\t\t .setTicker(invite_from + \": \" + roomname)\n\t\t\t\t\t\t .setStyle(new NotificationCompat.BigTextStyle()\n\t\t\t\t\t\t\t\t .bigText(roomdescription)\n\t\t\t\t\t\t\t\t .setSummaryText(invite_from)\n\t\t\t\t\t\t\t\t .setBigContentTitle(roomname))\n\t\t\t\t\t\t .setContentIntent(pi)\n\t\t\t\t\t\t .setAutoCancel(true)\n\t\t\t\t\t\t .build();\n\t\t\t\tNotificationData nd = notifications.get(room);\n\t\t\t\tif (nd == null) {\n\t\t\t\t\tnd = new NotificationData(++lastNotificationId);\n\t\t\t\t\tnotifications.put(room, nd);\n\t\t\t\t}\n\t\t\t\tmNotificationMGR.notify(nd.id, invNotify);\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate class ReconnectAlarmReceiver extends BroadcastReceiver {\n\t\tpublic void onReceive(Context ctx, Intent i) {\n\t\t\tlogInfo(\"Alarm received.\");\n\t\t\tif (!mConnectionDemanded.get()) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (mSmackable != null && mSmackable.getConnectionState() == ConnectionState.ONLINE) {\n\t\t\t\tlogError(\"Reconnect attempt aborted: we are connected again!\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdoConnect();\n\t\t}\n\t}\n\n\tprivate int number_of_eyes = 0;\n\tprivate void userStartedWatching() {\n\t\tnumber_of_eyes += 1;\n\t\tlogInfo(\"userStartedWatching: \" + number_of_eyes);\n\t\tif (mSmackable != null)\n\t\t\tmSmackable.setUserWatching(true);\n\t\tsetGracePeriod(0);\n\t}\n\n\tprivate void userStoppedWatching() {\n\t\tnumber_of_eyes -= 1;\n\t\tlogInfo(\"userStoppedWatching: \" + number_of_eyes);\n\t\t// delay deactivation by 3s, in case we happen to be immediately re-bound\n\t\tmMainHandler.postDelayed(new Runnable() {\n\t\t\tpublic void run() {\n\t\t\t\tif (mSmackable != null && number_of_eyes == 0)\n\t\t\t\t\tmSmackable.setUserWatching(false);\n\t\t\t}}, 3000);\n\t}\n\n\tprivate void configureSmartAwayMode() {\n\t\tAudioManager am = (AudioManager)getSystemService(Context.AUDIO_SERVICE);\n\t\tboolean is_silent = (am.getRingerMode() == AudioManager.RINGER_MODE_SILENT);\n\t\tmConfig.smartAwayMode = is_silent ? StatusMode.dnd : null;\n\t\tlogInfo(\"configureSmartAwayMode: \" + mConfig.smartAwayMode);\n\t}\n\n\tprivate class RingerModeReceiver extends BroadcastReceiver {\n\t\tpublic void onReceive(Context ctx, Intent i) {\n\t\t\tlogInfo(\"Ringer mode changed: \" + i);\n\t\t\tconfigureSmartAwayMode();\n\t\t\tif (mSmackable != null && mSmackable.isAuthenticated()) {\n\t\t\t\tmSmackable.setStatusFromConfig();\n\t\t\t\tupdateServiceNotification();\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/service/XMPPServiceCallback.java",
    "content": "package org.yaxim.androidclient.service;\n\nimport org.jivesoftware.smack.packet.Message;\nimport org.yaxim.androidclient.util.ConnectionState;\n\npublic interface XMPPServiceCallback {\n\tvoid notifyMessage(String[] from, String messageBody, boolean silent_notification, Message.Type msgType, long timestamp, boolean still_loading);\n\tvoid displayPendingNotifications(String jid);\n\tvoid connectionStateChanged(ConnectionState connection_state);\n\tvoid mucInvitationReceived(String roomname, String room, String password, String invite_from, String roomdescription);\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/service/YaximBroadcastReceiver.java",
    "content": "package org.yaxim.androidclient.service;\n\nimport org.yaxim.androidclient.util.PreferenceConstants;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.BroadcastReceiver;\nimport android.content.IntentFilter;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.util.Log;\nimport android.net.ConnectivityManager;\nimport android.net.NetworkInfo;\nimport android.net.Uri;\nimport android.preference.PreferenceManager;\n\n\npublic class YaximBroadcastReceiver extends BroadcastReceiver {\n\tstatic final String TAG = \"yaxim.BroadcastReceiver\";\n\tprivate static int networkType = -1;\n\tprivate static YaximBroadcastReceiver mSingleton;\n\n\tpublic YaximBroadcastReceiver() {\n\t\tsuper();\n\t\tmSingleton = this;\n\t}\n\n\tpublic static YaximBroadcastReceiver getInstance() {\n\t\tif (mSingleton == null)\n\t\t\tnew YaximBroadcastReceiver();\n\t\treturn mSingleton;\n\t}\n\n\tpublic void startService(Context ctx, Intent i) {\n\t\tif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)\n\t\t\tctx.startForegroundService(i);\n\t\telse\n\t\t\tctx.startService(i);\n\t}\n\tpublic static void initNetworkStatus(Context context) {\n\t\tConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);\n\t\tNetworkInfo networkInfo = connMgr.getActiveNetworkInfo();\n\t\tnetworkType = -1;\n\t\tif (networkInfo != null) {\n\t\t\tLog.d(TAG, \"Init: ACTIVE NetworkInfo: \"+networkInfo.toString());\n\t\t\tif (networkInfo.isConnected()) {\n\t\t\t\tnetworkType = networkInfo.getType();\n\t\t\t}\n\t\t}\n\t\tLog.d(TAG, \"initNetworkStatus -> \" + networkType);\n\t}\n\n\tprivate boolean trackingConnectivity = false;\n\tpublic void trackConnectivity(Context ctx) {\n\t\tif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !trackingConnectivity) {\n\t\t\tIntentFilter filter = new IntentFilter();\n\t\t\tfilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);\n\t\t\tctx.getApplicationContext().registerReceiver(YaximBroadcastReceiver.getInstance(), filter);\n\t\t\ttrackingConnectivity = true;\n\t\t}\n\t}\n\tpublic void untrackConnectivity(Context ctx) {\n\t\tif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && trackingConnectivity) {\n\t\t\tctx.getApplicationContext().unregisterReceiver(this);\n\t\t\ttrackingConnectivity = false;\n\t\t}\n\t}\n\n\t@Override\n\tpublic void onReceive(Context context, Intent intent) {\n\t\tLog.d(TAG, \"onReceive \" + intent);\n\t\t// prepare intent\n\t\tIntent xmppServiceIntent = new Intent(context, XMPPService.class);\n\t\tboolean connstartup = PreferenceManager.getDefaultSharedPreferences(context)\n\t\t\t\t.getBoolean(PreferenceConstants.CONN_STARTUP, false);\n\n\t\tif (intent.getAction().equals(Intent.ACTION_SHUTDOWN)) {\n\t\t\tLog.d(TAG, \"System shutdown, stopping yaxim.\");\n\t\t\tcontext.stopService(xmppServiceIntent);\n\t\t} else\n\t\tif (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {\n\t\t\tif (connstartup) // ignore event, we are not running\n\t\t\t\ttrackConnectivity(context);\n\t\t} else\n\t\tif (intent.getAction().equals(Intent.ACTION_MY_PACKAGE_REPLACED)) {\n\t\t\tif (connstartup) // ignore event, we are not running\n\t\t\t\tstartService(context, xmppServiceIntent);\n\t\t} else\n\t\tif (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {\n\t\t\tif (!connstartup) // ignore event, we are not running\n\t\t\t\treturn;\n\n\t\t\t// there are three possible situations here: disconnect, reconnect, connection change\n\t\t\tConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);\n\t\t\tNetworkInfo networkInfo = connMgr.getActiveNetworkInfo();\n\n\t\t\tboolean isConnected = (networkInfo != null) && (networkInfo.isConnected() == true);\n\t\t\tboolean wasConnected = (networkType != -1);\n\t\t\tif (wasConnected && !isConnected) {\n\t\t\t\tLog.d(TAG, \"we got disconnected\");\n\t\t\t\tnetworkType = -1;\n\t\t\t\txmppServiceIntent.setAction(\"disconnect\");\n\t\t\t} else\n\t\t\tif (isConnected && (networkInfo.getType() != networkType)) {\n\t\t\t\tLog.d(TAG, \"we got (re)connected: \" + networkInfo.toString());\n\t\t\t\tnetworkType = networkInfo.getType();\n\t\t\t\txmppServiceIntent.setAction(\"reconnect\");\n\t\t\t} else\n\t\t\tif (isConnected && (networkInfo.getType() == networkType)) {\n\t\t\t\tLog.d(TAG, \"we stay connected, sending a ping\");\n\t\t\t\txmppServiceIntent.setAction(\"ping\");\n\t\t\t} else\n\t\t\t\treturn;\n\t\t\tstartService(context, xmppServiceIntent);\n\t\t} else\n\t\tif (intent.getAction().equals(\"org.yaxim.androidclient.ACTION_MESSAGE_HEARD\")) {\n\t\t\tLog.d(TAG, \"heard \" + intent);\n\t\t\txmppServiceIntent.setAction(\"respond\");\n\t\t\tString jid = intent.getStringExtra(\"jid\");\n\t\t\tif (jid == null) return;\n\t\t\txmppServiceIntent.setData(Uri.parse(jid));\n\t\t\tstartService(context, xmppServiceIntent);\n\t\t} else\n\t\tif (intent.getAction().equals(\"org.yaxim.androidclient.ACTION_MESSAGE_REPLY\")) {\n\t\t\tLog.d(TAG, \"reply \" + intent);\n\t\t\tBundle reply = android.support.v4.app.RemoteInput.getResultsFromIntent(intent);\n\t\t\tString replystring = null;\n\t\t\tif (reply != null) {\n\t\t\t\treplystring = reply.getCharSequence(\"voicereply\").toString();\n\t\t\t\tLog.d(TAG, \"got reply: \" + replystring);\n\t\t\t}\n\t\t\txmppServiceIntent.setAction(\"respond\");\n\t\t\tString jid = intent.getStringExtra(\"jid\");\n\t\t\tif (jid == null) return;\n\t\t\txmppServiceIntent.setData(Uri.parse(jid));\n\t\t\txmppServiceIntent.putExtra(\"message\", replystring);\n\t\t\tstartService(context, xmppServiceIntent);\n\t\t}\n\t}\n\n}\n\n"
  },
  {
    "path": "src/org/yaxim/androidclient/util/AdapterConstants.java",
    "content": "package org.yaxim.androidclient.util;\r\n\r\npublic class AdapterConstants {\r\n\tpublic static final String[] GROUP_NAME = {\"groupName\"};\r\n\tpublic static final String[] CHILD_DATA_KEYS = {\"screenName\",\"statusMode\"};\r\n\tpublic static final String \t CONTACT_ID  = \"contactId\";\r\n}\r\n"
  },
  {
    "path": "src/org/yaxim/androidclient/util/ConnectionState.java",
    "content": "package org.yaxim.androidclient.util;\n\npublic enum ConnectionState {\n\tOFFLINE,\t\t/// no connection is desired by the user\n\tCONNECTING,\t\t/// currently opening a connection\n\tLOADING,\t\t/// authenticated, loading roster, messages, etc.\n\tONLINE,\t\t\t/// connected and authenticated\n\tDISCONNECTING,\t\t/// disconnect in progress\n\tDISCONNECTED,\t\t/// the network caused a disconnect\n\tRECONNECT_NETWORK,\t/// waiting for the network to become available\n\tRECONNECT_DELAYED;\t/// waiting for a reconnect timer\n};\n"
  },
  {
    "path": "src/org/yaxim/androidclient/util/ErrorReportManager.java",
    "content": "package org.yaxim.androidclient.util;\n\nimport android.content.Context;\nimport android.content.pm.PackageInfo;\nimport android.content.pm.PackageManager;\nimport android.util.Log;\n\nimport org.yaxim.androidclient.YaximApplication;\n\nimport ee.smmv.trace.ExceptionHandler;\n\n/**\n * This class is responsible for centrally managing error / crash reports and for sending them\n * to the developer.\n */\n\npublic class ErrorReportManager {\n\tstatic final String TAG = \"yaxim.ErrorReportMgr\";\n\tstatic ErrorReportManager manager;\n\tstatic final Thread.UncaughtExceptionHandler NOP_HANDLER = new Thread.UncaughtExceptionHandler() {\n\t\t@Override\n\t\tpublic void uncaughtException(Thread thread, Throwable throwable) {\n\t\t\t//nop!\n\t\t}\n\t};\n\n\tThread.UncaughtExceptionHandler handler;\n\tContext ctx;\n\n\tsynchronized public static ErrorReportManager get(Context ctx) {\n\t\tif (manager == null)\n\t\t\tmanager = new ErrorReportManager(ctx);\n\t\treturn manager;\n\t}\n\n\tpublic ErrorReportManager(Context ctx) {\n\t\tthis.ctx = ctx;\n\t\tString appVersion = \"unknown\";\n\t\ttry {\n\t\t\tPackageInfo packageInfo = ctx.getPackageManager().getPackageInfo(ctx.getPackageName(), 0);\n\t\t\tappVersion = packageInfo.versionName;\n\t\t} catch (PackageManager.NameNotFoundException e) {\n\t\t}\n\t\tfinal String filePath = ctx.getDir(\"stacktraces\", 0).getAbsolutePath();\n\t\tthis.handler = new ExceptionHandler(NOP_HANDLER, appVersion, filePath, false);\n\t\tExceptionHandler.register(ctx.getApplicationContext(), \"https://yaxim.org/crash/\");\n\t}\n\n\tpublic void report(Throwable e) {\n\t\tif (!YaximApplication.getInstance().getConfig().reportCrash)\n\t\t\treturn;\n\t\thandler.uncaughtException(Thread.currentThread(), e);\n\t\tsendReports();\n\t}\n\tpublic void sendReports() {\n\t\tnew Thread() {\n\t\t\t@Override public void run() {\n\t\t\t\tLog.d(TAG, \"Submitting stack traces...\");\n\t\t\t\tExceptionHandler.register(ctx.getApplicationContext(), \"https://yaxim.org/crash/\");\n\t\t\t\tLog.d(TAG, \"Finished submitting stack traces...\");\n\t\t\t}\n\t\t}.start();\n\t}\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/util/FileHelper.java",
    "content": "package org.yaxim.androidclient.util;\n\nimport android.annotation.SuppressLint;\nimport android.content.ContentResolver;\nimport android.content.ContentUris;\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapFactory;\nimport android.graphics.Matrix;\nimport android.media.ExifInterface;\nimport android.net.Uri;\nimport android.os.Build;\nimport android.os.Environment;\nimport android.provider.DocumentsContract;\nimport android.provider.MediaStore;\nimport android.provider.OpenableColumns;\nimport android.util.Log;\n\n\nimport java.io.ByteArrayOutputStream;\nimport java.io.File;\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.net.URLConnection;\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\n\n/**\n * Created by georg on 12/27/17.\n */\n\npublic class FileHelper {\n\tprivate static final int IMAGE_SIZE = 1920;\n\tprivate static final int IMAGE_QUALITY = 80;\n\n\t/**\n\t * Get a file path from a Uri. This will get the the path for Storage Access\n\t * Framework Documents, as well as the _data field for the MediaStore and\n\t * other file-based ContentProviders.\n\t *\n\t * @param context The context.\n\t * @param uri The Uri to query.\n\t * @author paulburke\n\t */\n\t@SuppressLint(\"NewApi\")\n\tpublic static String getPath(final Context context, final Uri uri) {\n\n\t\tfinal boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;\n\n\t\t// DocumentProvider\n\t\tif (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {\n\t\t\t// ExternalStorageProvider\n\t\t\tif (isExternalStorageDocument(uri)) {\n\t\t\t\tfinal String docId = DocumentsContract.getDocumentId(uri);\n\t\t\t\tfinal String[] split = docId.split(\":\");\n\t\t\t\tfinal String type = split[0];\n\n//\t\t\t\tif (\"primary\".equalsIgnoreCase(type)) {\n\t\t\t\treturn Environment.getExternalStorageDirectory() + \"/\" + split[1];\n//\t\t\t\t}\n\t\t\t}\n\t\t\t// DownloadsProvider\n\t\t\telse if (isDownloadsDocument(uri)) {\n\n\t\t\t\tfinal String id = DocumentsContract.getDocumentId(uri);\n\t\t\t\tfinal Uri contentUri = ContentUris.withAppendedId(\n\t\t\t\t\t\tUri.parse(\"content://downloads/public_downloads\"), Long.valueOf(id));\n\n\t\t\t\treturn getDataColumn(context, contentUri, null, null);\n\t\t\t}\n\t\t\t// MediaProvider\n\t\t\telse if (isMediaDocument(uri)) {\n\t\t\t\tfinal String docId = DocumentsContract.getDocumentId(uri);\n\t\t\t\tfinal String[] split = docId.split(\":\");\n\t\t\t\tfinal String type = split[0];\n\n\t\t\t\tUri contentUri = null;\n\t\t\t\tif (\"image\".equals(type)) {\n\t\t\t\t\tcontentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;\n\t\t\t\t} else if (\"video\".equals(type)) {\n\t\t\t\t\tcontentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;\n\t\t\t\t} else if (\"audio\".equals(type)) {\n\t\t\t\t\tcontentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;\n\t\t\t\t}\n\n\t\t\t\tfinal String selection = \"_id=?\";\n\t\t\t\tfinal String[] selectionArgs = new String[] {\n\t\t\t\t\t\tsplit[1]\n\t\t\t\t};\n\n\t\t\t\treturn getDataColumn(context, contentUri, selection, selectionArgs);\n\t\t\t}\n\t\t}\n\t\t// MediaStore (and general)\n\t\telse if (\"content\".equalsIgnoreCase(uri.getScheme())) {\n\n\t\t\t// Return the remote address\n\t\t\tif (isGooglePhotosUri(uri))\n\t\t\t\treturn uri.getLastPathSegment();\n\n\t\t\treturn getDataColumn(context, uri, null, null);\n\t\t}\n\t\t// File\n\t\telse if (\"file\".equalsIgnoreCase(uri.getScheme())) {\n\t\t\treturn uri.getPath();\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Get the value of the data column for this Uri. This is useful for\n\t * MediaStore Uris, and other file-based ContentProviders.\n\t *\n\t * @param context The context.\n\t * @param uri The Uri to query.\n\t * @param selection (Optional) Filter used in the query.\n\t * @param selectionArgs (Optional) Selection arguments used in the query.\n\t * @return The value of the _data column, which is typically a file path.\n\t */\n\tpublic static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {\n\n\t\tCursor cursor = null;\n\t\tfinal String column = \"_data\";\n\t\tfinal String[] projection = {\n\t\t\t\tcolumn\n\t\t};\n\n\t\ttry {\n\t\t\tcursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,\n\t\t\t\t\tnull);\n\t\t\tif (cursor != null && cursor.moveToFirst()) {\n\t\t\t\tfinal int index = cursor.getColumnIndexOrThrow(column);\n\t\t\t\treturn cursor.getString(index);\n\t\t\t}\n\t\t} finally {\n\t\t\tif (cursor != null)\n\t\t\t\tcursor.close();\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * @param uri The Uri to check.\n\t * @return Whether the Uri authority is ExternalStorageProvider.\n\t */\n\tpublic static boolean isExternalStorageDocument(Uri uri) {\n\t\treturn \"com.android.externalstorage.documents\".equals(uri.getAuthority());\n\t}\n\n\t/**\n\t * @param uri The Uri to check.\n\t * @return Whether the Uri authority is DownloadsProvider.\n\t */\n\tpublic static boolean isDownloadsDocument(Uri uri) {\n\t\treturn \"com.android.providers.downloads.documents\".equals(uri.getAuthority());\n\t}\n\n\t/**\n\t * @param uri The Uri to check.\n\t * @return Whether the Uri authority is MediaProvider.\n\t */\n\tpublic static boolean isMediaDocument(Uri uri) {\n\t\treturn \"com.android.providers.media.documents\".equals(uri.getAuthority());\n\t}\n\n\t/**\n\t * @param uri The Uri to check.\n\t * @return Whether the Uri authority is Google Photos.\n\t */\n\tpublic static boolean isGooglePhotosUri(Uri uri) {\n\t\treturn \"com.google.android.apps.photos.content\".equals(uri.getAuthority());\n\t}\n\n\tpublic static File createImageFile(Context ctx) {\n\t\t// Create an image file name\n\t\tString timeStamp = new SimpleDateFormat(\"yyyyMMdd_HHmmss\").format(new Date());\n\t\tString imageFileName = timeStamp + \"_\";\n\t\tFile storageDir = ctx.getExternalFilesDir(Environment.DIRECTORY_PICTURES);\n\t\ttry {\n\t\t\tFile image = File.createTempFile(\n\t\t\t\t\timageFileName,  /* prefix */\n\t\t\t\t\t\".jpg\",         /* suffix */\n\t\t\t\t\tstorageDir      /* directory */\n\t\t\t);\n\t\t\treturn image;\n\t\t} catch (Exception e) {\n\t\t\tLog.d(\"yaxim.FileHelper\", e.getLocalizedMessage());\n\t\t\te.printStackTrace();\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tpublic static int getExifOrientation(Context ctx, Uri path) {\n\t\ttry {\n\t\t\tExifInterface exif;\n\t\t\texif = new ExifInterface(getPath(ctx, path));\n\t\t\treturn exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1);\n\t\t} catch (Exception e) {\n\t\t\tLog.e(\"yaxim.FileHelper\", \"getExifOrientation: \" + e.getLocalizedMessage());\n\t\t\te.printStackTrace();\n\t\t}\n\t\treturn 1; // default to \"no rotation\"\n\t}\n\tpublic static int getExifRotation(Context ctx, Uri path) {\n\t\tswitch (getExifOrientation(ctx, path)) {\n\t\tcase ExifInterface.ORIENTATION_ROTATE_90:\n\t\t\treturn 90;\n\t\tcase ExifInterface.ORIENTATION_ROTATE_180:\n\t\t\treturn 180;\n\t\tcase ExifInterface.ORIENTATION_ROTATE_270:\n\t\t\treturn 270;\n\t\tdefault:\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\tpublic static byte[] shrinkPicture(Context ctx, Uri path, long size_limit) {\n\t\ttry {\n\t\t\tInputStream is = ctx.getContentResolver().openInputStream(path);\n\t\t\tBitmapFactory.Options opts = new BitmapFactory.Options();\n\t\t\topts.inJustDecodeBounds = true;\n\t\t\tBitmapFactory.decodeStream(is, null, opts);\n\t\t\tif (!opts.outMimeType.contains(\"jpeg\") || opts.outHeight < 0 || opts.outWidth < 0)\n\t\t\t\treturn null;\n\t\t\tint current_size = (opts.outWidth > opts.outHeight)? opts.outWidth : opts.outHeight;\n\t\t\tint factor = (int)Math.ceil((double)current_size/ IMAGE_SIZE);\n\t\t\tis.close();\n\t\t\tint rotation = getExifRotation(ctx, path);\n\t\t\tByteArrayOutputStream baos;\n\t\t\tdo {\n\t\t\t\tLog.d(\"yaxim.FileHelper\", \"Shrinking image from \" + opts.outWidth + \"*\" + opts.outHeight + \" by factor \" + factor + \"...\");\n\t\t\t\topts.inSampleSize = factor;\n\t\t\t\topts.inJustDecodeBounds = false;\n\t\t\t\tis = ctx.getContentResolver().openInputStream(path);\n\t\t\t\tBitmap result = BitmapFactory.decodeStream(is, null, opts);\n\t\t\t\tis.close();\n\t\t\t\tif (rotation != 0) {\n\t\t\t\t\tLog.d(\"yaxim.FileHelper\", \"Rotating image by \" + rotation + \"°\");\n\t\t\t\t\tMatrix matrix = new Matrix();\n\t\t\t\t\tmatrix.postRotate(rotation);\n\t\t\t\t\tresult = Bitmap.createBitmap(result, 0, 0, result.getWidth(), result.getHeight(),\n\t\t\t\t\t\t\tmatrix, true);\n\t\t\t\t}\n\t\t\t\tbaos = new ByteArrayOutputStream();\n\t\t\t\tresult.compress(Bitmap.CompressFormat.JPEG, IMAGE_QUALITY, baos);\n\t\t\t\tfactor++;\n\t\t\t} while (size_limit > 0 && baos.size() > size_limit);\n\t\t\treturn baos.toByteArray();\n\t\t} catch (Exception e) {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tpublic static FileInfo getFileInfo(Context ctx, Uri path) {\n\t\tFileInfo fi = null;\n\t\tif (path.getScheme().equals(\"file\")) {\n\t\t\tFile f = new File(path.getPath());\n\t\t\treturn new FileInfo(URLConnection.guessContentTypeFromName(path.toString()),\n\t\t\t\t\tpath.getLastPathSegment(), f.length());\n\t\t}\n\t\tContentResolver cr = ctx.getContentResolver();\n\t\tCursor c = cr.query(path, null, null, null, null);\n\t\t/*\n\t\t * Get the column indexes of the data in the Cursor,\n\t\t * move to the first row in the Cursor, get the data,\n\t\t * and display it.\n\t\t */\n\t\tint nameIndex = c.getColumnIndex(OpenableColumns.DISPLAY_NAME);\n\t\tint sizeIndex = c.getColumnIndex(OpenableColumns.SIZE);\n\t\tint dataIndex = c.getColumnIndex(MediaStore.Images.Media.DATA);\n\t\tif (c.moveToFirst()) {\n\t\t\tfi = new FileInfo(cr.getType(path), c.getString(nameIndex), c.getLong(sizeIndex));\n\t\t\tif (fi.size == 0) {\n\t\t\t\tString filepath = c.getString(dataIndex);\n\t\t\t\tFile f = new File(filepath);\n\t\t\t\tfi = new FileInfo(URLConnection.guessContentTypeFromName(filepath),\n\t\t\t\t\t\tf.getName(), f.length());\n\t\t\t}\n\t\t}\n\t\tc.close();\n\t\treturn fi;\n\t}\n\n\tpublic static class FileInfo {\n\t\tpublic String mimeType;\n\t\tpublic String displayName;\n\t\tpublic long size;\n\n\t\tpublic FileInfo(String mimeType, String displayName, long size) {\n\t\t\tthis.mimeType = mimeType;\n\t\t\tthis.displayName = displayName;\n\t\t\tthis.size = size;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/util/JULHandler.java",
    "content": "package org.yaxim.androidclient.util;\n\nimport android.util.Log;\n\nimport java.text.MessageFormat;\nimport java.util.Enumeration;\nimport java.util.logging.*;\n\n/**\n * Make JUL work on Android.\n */\npublic class JULHandler extends Handler {\n\n\tpublic static void reset(Handler rootHandler) {\n\t\tLogger rootLogger = LogManager.getLogManager().getLogger(\"\");\n\t\tHandler[] handlers = rootLogger.getHandlers();\n\t\tfor (Handler handler : handlers) {\n\t\t\trootLogger.removeHandler(handler);\n\t\t}\n\t\trootLogger.addHandler(rootHandler);\n\n\t\t// fuck Android\n\t\tEnumeration<String> lns = LogManager.getLogManager().getLoggerNames();\n\t\twhile (lns.hasMoreElements())\n\t\t\tLogger.getLogger(lns.nextElement()).setLevel(Level.FINEST);\n\t\tLogManager.getLogManager().getLogger(Logger.GLOBAL_LOGGER_NAME).setLevel(Level.FINE);\n\t}\n\n\t@Override\n\tpublic void close() {\n\t}\n\n\t@Override\n\tpublic void flush() {\n\t}\n\n\t@Override\n\tpublic void publish(LogRecord record) {\n\t\tif (!super.isLoggable(record))\n\t\t\treturn;\n\n\t\tString name = record.getLoggerName();\n\t\tString[] nameFields = name.split(\"\\\\.\");\n\t\tString tag = nameFields[nameFields.length-1];\n\n\t\ttry {\n\t\t\tint level = getAndroidLevel(record.getLevel());\n\t\t\tLog.println(level, tag, MessageFormat.format(record.getMessage(), record.getParameters()));\n\t\t\tif (record.getThrown() != null) {\n\t\t\t\tLog.println(level, tag, Log.getStackTraceString(record.getThrown()));\n\t\t\t}\n\t\t} catch (RuntimeException e) {\n\t\t\tLog.e(\"AndroidLoggingHandler\", \"Error logging message.\", e);\n\t\t}\n\t}\n\n\tstatic int getAndroidLevel(Level level) {\n\t\tint value = level.intValue();\n\n\t\tif (value >= Level.SEVERE.intValue()) {\n\t\t\treturn Log.ERROR;\n\t\t} else if (value >= Level.WARNING.intValue()) {\n\t\t\treturn Log.WARN;\n\t\t} else if (value >= Level.INFO.intValue()) {\n\t\t\treturn Log.INFO;\n\t\t} else {\n\t\t\treturn Log.DEBUG;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/util/LogConstants.java",
    "content": "package org.yaxim.androidclient.util;\n\npublic class LogConstants {\n\n\tpublic static final boolean LOG_DEBUG = true;\n\tpublic static final boolean LOG_INFO = true;\n\tpublic static final boolean LOG_ERROR = true;\n\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/util/MessageStylingHelper.java",
    "content": "package org.yaxim.androidclient.util;\n\nimport android.graphics.Typeface;\nimport android.text.Editable;\nimport android.text.SpannableStringBuilder;\nimport android.text.Spanned;\nimport android.text.TextUtils;\nimport android.text.style.ForegroundColorSpan;\nimport android.text.style.RelativeSizeSpan;\nimport android.text.style.StyleSpan;\n\npublic class MessageStylingHelper {\n\tpublic static boolean applyNicknameHighlight(SpannableStringBuilder message, String highlight, int text_color) {\n\t\tif (TextUtils.isEmpty(highlight))\n\t\t\treturn false;\n\n\t\tboolean match = false;\n\t\tString msg = message.toString().toLowerCase();\n\t\tint pos = 0, hl_len = highlight.length();\n\t\tint color = XEP0392Helper.mixColors(XEP0392Helper.rgbFromNick(highlight, 50), (text_color^0xffffff), 128);\n\t\thighlight = highlight.toLowerCase();\n\t\twhile ((pos = msg.indexOf(highlight, pos)) >= 0) {\n\t\t\tmessage.setSpan(new ForegroundColorSpan(color), pos, pos+hl_len,\n\t\t\t\tSpanned.SPAN_EXCLUSIVE_EXCLUSIVE);\n\t\t\tpos = pos+hl_len;\n\t\t\tmatch = true;\n\t\t}\n\t\treturn match;\n\t}\n\n\tpublic static SpannableStringBuilder formatMessage(String message, String from, String highlight_text,\n\t\t\t\tint text_color) {\n\t\tboolean slash_me = message.startsWith(\"/me \");\n\t\tif (slash_me) {\n\t\t\tmessage = String.format(\"\\u25CF %s %s\", from, message.substring(4));\n\t\t}\n\t\t// format string\n\t\tSpannableStringBuilder body = new SpannableStringBuilder(message);\n\t\tif (slash_me)\n\t\t\tbody.setSpan(new StyleSpan(Typeface.ITALIC), 2, message.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);\n\t\tif (MessageStylingHelper.applyNicknameHighlight(body, highlight_text, text_color))\n\t\t\tbody.setSpan(new StyleSpan(Typeface.BOLD), 0, message.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);\n\t\teu.siacs.conversations.utils.StylingHelper.format(body, text_color);\n\t\treturn body;\n\t}\n\n\tpublic static void applyEmojiScaling(Editable message, float max_scale) {\n\t\tString msg_string = message.toString();\n\t\tint start = 0;\n\t\twhile (start < msg_string.length()) {\n\t\t\tint end = msg_string.indexOf('\\n', start);\n\t\t\tif (end == -1)\n\t\t\t\tend = msg_string.length();\n\t\t\tfloat line_factor = XMPPHelper.getEmojiScalingFactorRE(msg_string.substring(start, end), max_scale);\n\t\t\tif (line_factor > 1.0f) {\n\t\t\t\tmessage.setSpan(new RelativeSizeSpan(line_factor), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);\n\t\t\t}\n\t\t\tstart = end+1;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/util/PreferenceConstants.java",
    "content": "package org.yaxim.androidclient.util;\n\npublic class PreferenceConstants {\n\tpublic final static String JID = \"account_jabberID\";\n\tpublic final static String PASSWORD = \"account_jabberPW\";\n\tpublic final static String SCREEN_NAME = \"screen_name\";\n\tpublic final static String FIRSTRUN = \"first_run\";\n\tpublic final static String INITIAL_CREATE = \"initial_create\";\n\tpublic final static String INITIAL_PREAUTH = \"initial_preauth\";\n\tpublic final static String CUSTOM_SERVER = \"account_customserver\";\n\tpublic final static String PORT = \"account_port\";\n\tpublic final static String RESSOURCE = \"account_resource\";\n\tpublic final static String PRIORITY = \"account_prio\";\n\tpublic final static int DEFAULT_PORT_INT = 5222;\n\tpublic final static String CONN_STARTUP = \"connstartup\";\n\tpublic final static String DOZE_NAG = \"doze_nag\";\n\tpublic final static String MESSAGE_CARBONS = \"carbons\";\n\tpublic final static String SHOW_OFFLINE = \"showOffline\";\n\tpublic final static String ENABLE_GROUPS = \"enableGroups\";\n\n\tpublic final static String LEDNOTIFY = \"led\";\n\tpublic final static String VIBRATIONNOTIFY = \"vibration_list\";\n\tpublic final static String RINGTONENOTIFY= \"ringtone\";\n\tpublic final static String TICKER = \"ticker\";\n\t\n\tpublic final static String HIGHLIGHT = \"highlight\";\n\n\tpublic final static String FOREGROUND = \"foregroundService\";\n\tpublic final static String SMACKDEBUG = \"smackdebug\";\n\tpublic final static String REPORT_CRASH = \"reportcrash\";\n\tpublic final static String REQUIRE_SSL = \"require_ssl\";\n\tpublic static final String STATUS_DNDSILENT = \"status_dndsilent\";\n\tpublic final static String STATUS_MODE = \"status_mode\";\n\tpublic final static String STATUS_MESSAGE = \"status_message\";\n\tpublic static final String STATUS_MESSAGE_HISTORY = \"status_message_history\";\n\tpublic final static String THEME = \"theme\";\n\tpublic final static String INVITATION_CODES = \"invitation_codes\";\n\tpublic final static String INSTALL_REFERRER = \"install_referrer\";\n\tpublic final static String PUSH_NODE_ID = \"push_node_id\";\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/util/SimpleCursorTreeAdapter.java",
    "content": "/*\n * Copyright (C) 2006 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage org.yaxim.androidclient.util;\n\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.net.Uri;\nimport android.view.View;\nimport android.widget.*;\n\n/**\n * An easy adapter to map columns from a cursor to TextViews or ImageViews\n * defined in an XML file. You can specify which columns you want, which views\n * you want to display the columns, and the XML file that defines the appearance\n * of these views. Separate XML files for child and groups are possible.\n *\n * Binding occurs in two phases. First, if a\n * {@link android.widget.SimpleCursorTreeAdapter.ViewBinder} is available,\n * {@link ViewBinder#setViewValue(android.view.View, android.database.Cursor, int)}\n * is invoked. If the returned value is true, binding has occurred. If the\n * returned value is false and the view to bind is a TextView,\n * {@link #setViewText(TextView, String)} is invoked. If the returned value\n * is false and the view to bind is an ImageView,\n * {@link #setViewImage(ImageView, String)} is invoked. If no appropriate\n * binding can be found, an {@link IllegalStateException} is thrown.\n */\npublic abstract class SimpleCursorTreeAdapter extends ResourceCursorTreeAdapter {\n    \n    /** The name of the columns that contain the data to display for a group. */\n    private String[] mGroupFromNames;\n    \n    /** The indices of columns that contain data to display for a group. */\n    private int[] mGroupFrom;\n    /**\n     * The View IDs that will display a group's data fetched from the\n     * corresponding column.\n     */\n    private int[] mGroupTo;\n\n    /** The name of the columns that contain the data to display for a child. */\n    private String[] mChildFromNames;\n    \n    /** The indices of columns that contain data to display for a child. */\n    private int[] mChildFrom;\n    /**\n     * The View IDs that will display a child's data fetched from the\n     * corresponding column.\n     */\n    private int[] mChildTo;\n    \n    /**\n     * View binder, if supplied\n     */\n    private ViewBinder mViewBinder;\n\n    /**\n     * Constructor.\n     * \n     * @param context The context where the {@link ExpandableListView}\n     *            associated with this {@link SimpleCursorTreeAdapter} is\n     *            running\n     * @param cursor The database cursor\n     * @param collapsedGroupLayout The resource identifier of a layout file that\n     *            defines the views for a collapsed group. The layout file\n     *            should include at least those named views defined in groupTo.\n     * @param expandedGroupLayout The resource identifier of a layout file that\n     *            defines the views for an expanded group. The layout file\n     *            should include at least those named views defined in groupTo.\n     * @param groupFrom A list of column names that will be used to display the\n     *            data for a group.\n     * @param groupTo The group views (from the group layouts) that should\n     *            display column in the \"from\" parameter. These should all be\n     *            TextViews or ImageViews. The first N views in this list are\n     *            given the values of the first N columns in the from parameter.\n     * @param childLayout The resource identifier of a layout file that defines\n     *            the views for a child (except the last). The layout file\n     *            should include at least those named views defined in childTo.\n     * @param lastChildLayout The resource identifier of a layout file that\n     *            defines the views for the last child within a group. The\n     *            layout file should include at least those named views defined\n     *            in childTo.\n     * @param childFrom A list of column names that will be used to display the\n     *            data for a child.\n     * @param childTo The child views (from the child layouts) that should\n     *            display column in the \"from\" parameter. These should all be\n     *            TextViews or ImageViews. The first N views in this list are\n     *            given the values of the first N columns in the from parameter.\n     */\n    public SimpleCursorTreeAdapter(Context context, Cursor cursor, int collapsedGroupLayout,\n            int expandedGroupLayout, String[] groupFrom, int[] groupTo, int childLayout,\n            int lastChildLayout, String[] childFrom, int[] childTo) {\n        super(context, cursor, collapsedGroupLayout, expandedGroupLayout, childLayout,\n                lastChildLayout);\n        init(groupFrom, groupTo, childFrom, childTo);\n    }\n\n    /**\n     * Constructor.\n     * \n     * @param context The context where the {@link ExpandableListView}\n     *            associated with this {@link SimpleCursorTreeAdapter} is\n     *            running\n     * @param cursor The database cursor\n     * @param collapsedGroupLayout The resource identifier of a layout file that\n     *            defines the views for a collapsed group. The layout file\n     *            should include at least those named views defined in groupTo.\n     * @param expandedGroupLayout The resource identifier of a layout file that\n     *            defines the views for an expanded group. The layout file\n     *            should include at least those named views defined in groupTo.\n     * @param groupFrom A list of column names that will be used to display the\n     *            data for a group.\n     * @param groupTo The group views (from the group layouts) that should\n     *            display column in the \"from\" parameter. These should all be\n     *            TextViews or ImageViews. The first N views in this list are\n     *            given the values of the first N columns in the from parameter.\n     * @param childLayout The resource identifier of a layout file that defines\n     *            the views for a child. The layout file\n     *            should include at least those named views defined in childTo.\n     * @param childFrom A list of column names that will be used to display the\n     *            data for a child.\n     * @param childTo The child views (from the child layouts) that should\n     *            display column in the \"from\" parameter. These should all be\n     *            TextViews or ImageViews. The first N views in this list are\n     *            given the values of the first N columns in the from parameter.\n     */\n    public SimpleCursorTreeAdapter(Context context, Cursor cursor, int collapsedGroupLayout,\n            int expandedGroupLayout, String[] groupFrom, int[] groupTo,\n            int childLayout, String[] childFrom, int[] childTo) {\n        super(context, cursor, collapsedGroupLayout, expandedGroupLayout, childLayout);\n        init(groupFrom, groupTo, childFrom, childTo);\n    }\n\n    /**\n     * Constructor.\n     * \n     * @param context The context where the {@link ExpandableListView}\n     *            associated with this {@link SimpleCursorTreeAdapter} is\n     *            running\n     * @param cursor The database cursor\n     * @param groupLayout The resource identifier of a layout file that defines\n     *            the views for a group. The layout file should include at least\n     *            those named views defined in groupTo.\n     * @param groupFrom A list of column names that will be used to display the\n     *            data for a group.\n     * @param groupTo The group views (from the group layouts) that should\n     *            display column in the \"from\" parameter. These should all be\n     *            TextViews or ImageViews. The first N views in this list are\n     *            given the values of the first N columns in the from parameter.\n     * @param childLayout The resource identifier of a layout file that defines\n     *            the views for a child. The layout file should include at least\n     *            those named views defined in childTo.\n     * @param childFrom A list of column names that will be used to display the\n     *            data for a child.\n     * @param childTo The child views (from the child layouts) that should\n     *            display column in the \"from\" parameter. These should all be\n     *            TextViews or ImageViews. The first N views in this list are\n     *            given the values of the first N columns in the from parameter.\n     */\n    public SimpleCursorTreeAdapter(Context context, Cursor cursor, int groupLayout,\n            String[] groupFrom, int[] groupTo, int childLayout, String[] childFrom,\n            int[] childTo) {\n        super(context, cursor, groupLayout, childLayout);\n        init(groupFrom, groupTo, childFrom, childTo);\n    }\n\n    private void init(String[] groupFromNames, int[] groupTo, String[] childFromNames,\n            int[] childTo) {\n        \n        mGroupFromNames = groupFromNames;\n        mGroupTo = groupTo;\n        \n        mChildFromNames = childFromNames;\n        mChildTo = childTo;\n    }\n    \n    /**\n     * Returns the {@link ViewBinder} used to bind data to views.\n     *\n     * @return a ViewBinder or null if the binder does not exist\n     *\n     * @see #setViewBinder(android.widget.SimpleCursorTreeAdapter.ViewBinder)\n     */\n    public ViewBinder getViewBinder() {\n        return mViewBinder;\n    }\n\n    /**\n     * Sets the binder used to bind data to views.\n     *\n     * @param viewBinder the binder used to bind data to views, can be null to\n     *        remove the existing binder\n     *\n     * @see #getViewBinder()\n     */\n    public void setViewBinder(ViewBinder viewBinder) {\n        mViewBinder = viewBinder;\n    }\n\n    private void bindView(View view, Context context, Cursor cursor, int[] from, int[] to) {\n        final ViewBinder binder = mViewBinder;\n        \n        for (int i = 0; i < to.length; i++) {\n            View v = view.findViewById(to[i]);\n            if (v != null) {\n                boolean bound = false;\n                if (binder != null) {\n                    bound = binder.setViewValue(v, cursor, from[i]);\n                }\n                \n                if (!bound) {\n                    String text = cursor.getString(from[i]);\n                    if (text == null) {\n                        text = \"\";\n                    }\n                    if (v instanceof TextView) {\n                        setViewText((TextView) v, text);\n                    } else if (v instanceof ImageView) {\n                        setViewImage((ImageView) v, text);\n                    } else {\n                        throw new IllegalStateException(\"SimpleCursorTreeAdapter can bind values\" +\n                                \" only to TextView and ImageView!\");\n                    }\n                }\n            }\n        }\n    }\n    \n    private void initFromColumns(Cursor cursor, String[] fromColumnNames, int[] fromColumns) {\n        for (int i = fromColumnNames.length - 1; i >= 0; i--) {\n            fromColumns[i] = cursor.getColumnIndexOrThrow(fromColumnNames[i]);\n        }\n    }\n    \n    @Override\n    protected void bindChildView(View view, Context context, Cursor cursor, boolean isLastChild) {\n        if (mChildFrom == null) {\n            mChildFrom = new int[mChildFromNames.length];\n            initFromColumns(cursor, mChildFromNames, mChildFrom);\n        }\n        \n        bindView(view, context, cursor, mChildFrom, mChildTo);\n    }\n\n    @Override\n    protected void bindGroupView(View view, Context context, Cursor cursor, boolean isExpanded) {\n        if (mGroupFrom == null) {\n            mGroupFrom = new int[mGroupFromNames.length];\n            initFromColumns(cursor, mGroupFromNames, mGroupFrom);\n        }\n        \n        bindView(view, context, cursor, mGroupFrom, mGroupTo);\n    }\n\n    /**\n     * Called by bindView() to set the image for an ImageView. By default, the\n     * value will be treated as a Uri. Intended to be overridden by Adapters\n     * that need to filter strings retrieved from the database.\n     * \n     * @param v ImageView to receive an image\n     * @param value the value retrieved from the cursor\n     */\n    protected void setViewImage(ImageView v, String value) {\n        try {\n            v.setImageResource(Integer.parseInt(value));\n        } catch (NumberFormatException nfe) {\n            v.setImageURI(Uri.parse(value));\n        }\n    }\n\n    /**\n     * Called by bindView() to set the text for a TextView but only if\n     * there is no existing ViewBinder or if the existing ViewBinder cannot\n     * handle binding to an TextView.\n     *\n     * Intended to be overridden by Adapters that need to filter strings\n     * retrieved from the database.\n     * \n     * @param v TextView to receive text\n     * @param text the text to be set for the TextView\n     */\n    public void setViewText(TextView v, String text) {\n        v.setText(text);\n    }\n\n    /**\n     * This class can be used by external clients of SimpleCursorTreeAdapter\n     * to bind values from the Cursor to views.\n     *\n     * You should use this class to bind values from the Cursor to views\n     * that are not directly supported by SimpleCursorTreeAdapter or to\n     * change the way binding occurs for views supported by\n     * SimpleCursorTreeAdapter.\n     *\n     * @see SimpleCursorTreeAdapter#setViewImage(ImageView, String) \n     * @see SimpleCursorTreeAdapter#setViewText(TextView, String)\n     */\n    public static interface ViewBinder {\n        /**\n         * Binds the Cursor column defined by the specified index to the specified view.\n         *\n         * When binding is handled by this ViewBinder, this method must return true.\n         * If this method returns false, SimpleCursorTreeAdapter will attempts to handle\n         * the binding on its own.\n         *\n         * @param view the view to bind the data to\n         * @param cursor the cursor to get the data from\n         * @param columnIndex the column at which the data can be found in the cursor\n         *\n         * @return true if the data was bound to the view, false otherwise\n         */\n        boolean setViewValue(View view, Cursor cursor, int columnIndex);\n    }\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/util/StatusMode.java",
    "content": "package org.yaxim.androidclient.util;\n\nimport org.yaxim.androidclient.R;\n\npublic enum StatusMode {\n\tunknown(0 /* not a status you can set */, R.drawable.ic_status_unknown),\n\toffline(R.string.status_offline, R.drawable.ic_status_offline),\n\txa(R.string.status_xa, R.drawable.ic_status_xa),\n\tdnd(R.string.status_dnd, R.drawable.ic_status_dnd),\n\taway(R.string.status_away, R.drawable.ic_status_away),\n\tavailable(R.string.status_available, R.drawable.ic_status_available),\n\tchat(R.string.status_chat, R.drawable.ic_status_chat),\n\tsubscribe(0 /* not a status you can set */, R.drawable.ic_status_subscribe);\n\n\tprivate final int textId;\n\tprivate final int drawableId;\n\n\tStatusMode(int textId, int drawableId) {\n\t\tthis.textId = textId;\n\t\tthis.drawableId = drawableId;\n\t}\n\n\tpublic int getTextId() {\n\t\treturn textId;\n\t}\n\n\tpublic int getDrawableId() {\n\t\treturn drawableId;\n\t}\n\n\tpublic String toString() {\n\t\treturn name();\n\t}\n\n\tpublic static StatusMode fromString(String status) {\n\t\treturn StatusMode.valueOf(status);\n\t}\n\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/util/XEP0392Helper.java",
    "content": "package org.yaxim.androidclient.util;\n\nimport java.io.UnsupportedEncodingException;\nimport java.security.MessageDigest;\nimport java.security.NoSuchAlgorithmException;\n\nimport android.content.res.Resources;\nimport android.graphics.Color;\nimport android.util.TypedValue;\n\nimport org.hsluv.HUSLColorConverter;\nimport org.yaxim.androidclient.R;\n\npublic class XEP0392Helper {\n\tstatic final double KR=0.2627;\n\tstatic final double KG = 0.587;\n\tstatic final double KB=0.0593;\n\tstatic final double y = 0.5;\n\n\tpublic static double angleFromNick(String nickname) {\n\t\ttry {\n\t\t\tMessageDigest sha1 = MessageDigest.getInstance(\"SHA-1\");\n\t\t\tbyte[] digest = sha1.digest(nickname.getBytes(\"UTF-8\"));\n\t\t\tint angle = ((int)(digest[0])&0xff) + ((int)(digest[1])&0xff)*256;\n\t\t\treturn angle/65536.;\n\t\t} catch (NoSuchAlgorithmException e) {\n\t\t\te.printStackTrace();\n\t\t} catch (UnsupportedEncodingException e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t\treturn 0.0;\n\t}\n\tpublic static int clipColorValue(double color) {\n\t\treturn (int)Math.max(0, Math.min(255, color*255));\n\t}\n\n\tpublic static int rgbFromCbCr(double angle) {\n\t\t// copy&pasted from XEP-0392\n\t\tdouble cr = Math.sin(angle);\n\t\tdouble cb = Math.cos(angle);\n\t\tdouble factor = 0.5;\n\t\t//if (Math.abs(cr) > Math.abs(cb)) {\n\t\t//\tfactor = 0.5 / Math.abs(cr);\n\t\t//} else {\n\t\t//\tfactor = 0.5 / Math.abs(cb);\n\t\t//}\n\t\tcb = cb * factor;\n\t\tcr = cr * factor;\n\n\t\tdouble r = 2*(1 - KR)*cr + y;\n\t\tdouble b = 2*(1 - KB)*cb + y;\n\t\tdouble g = (y - KR*r - KB*b)/KG;\n\t\treturn Color.rgb(clipColorValue(r), clipColorValue(g), clipColorValue(b));\n\t}\n\tpublic static int rgbFromNickCbCr(String nick) {\n\t\treturn rgbFromCbCr(angleFromNick(nick)*2*Math.PI);\n\t}\n\tpublic static int rgbFromNick(String nick, int lightness) {\n\t\tdouble[] hsluv = new double[3];\n\t\thsluv[0] = angleFromNick(nick) * 360;\n\t\thsluv[1] = 100;\n\t\thsluv[2] = lightness;\n\t\tdouble[] rgb = HUSLColorConverter.hsluvToRgb(hsluv);\n\t\treturn Color.rgb((int) Math.round(rgb[0] * 255), (int) Math.round(rgb[1] * 255), (int) Math.round(rgb[2] * 255));\n\t}\n\n\tpublic static int mixValues(int fg, int bg, int factor) {\n\t\treturn (fg*(255-factor) + (255-bg)*factor)/255;\n\t}\n\tpublic static int mixColors(int fg, int bg, int factor) {\n\t\tint r = mixValues(Color.red(fg), Color.red(bg), factor);\n\t\tint g = mixValues(Color.green(fg), Color.green(bg), factor);\n\t\tint b = mixValues(Color.blue(fg), Color.blue(bg), factor);\n\t\treturn Color.rgb(r, g, b);\n\t}\n\tpublic static int mixNickWithBackground(String nick, Resources.Theme theme, int yaxim_theme) {\n\t\tint lightness = (yaxim_theme == R.style.YaximLightTheme) ? 50 : 75;\n\t\t// obtain theme's background color - https://stackoverflow.com/a/14468034/539443\n\t\tTypedValue tv = new TypedValue();\n\t\ttheme.resolveAttribute(android.R.attr.windowBackground, tv, true);\n\t\tif (tv.type < TypedValue.TYPE_FIRST_COLOR_INT || tv.type > TypedValue.TYPE_LAST_COLOR_INT) {\n\t\t\t// fall back to black or white, depending on theme\n\t\t\ttv.data = (yaxim_theme == R.style.YaximLightTheme) ? 0xffffff : 0x000000;\n\t\t\treturn rgbFromNick(nick, lightness);\n\t\t}\n\t\treturn rgbFromNick(nick, lightness);\n\t\t//return mixColors(rgbFromNick(nick, lightness), tv.data, 100 /*0.4*/);\n\t}\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/util/XMPPHelper.java",
    "content": "package org.yaxim.androidclient.util;\n\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\nimport java.security.SecureRandom;\n\nimport org.yaxim.androidclient.R;\nimport org.yaxim.androidclient.data.YaximConfiguration;\nimport org.yaxim.androidclient.exceptions.YaximXMPPAdressMalformedException;\n\nimport android.annotation.TargetApi;\nimport android.app.Activity;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.net.Uri;\nimport android.text.Editable;\nimport android.text.TextUtils;\nimport android.util.Log;\nimport android.util.TypedValue;\nimport android.nfc.NdefMessage;\nimport android.nfc.NdefRecord;\nimport android.nfc.NfcAdapter;\nimport android.nfc.NfcEvent;\nimport android.os.Build;\n\nimport gnu.inet.encoding.Stringprep;\nimport gnu.inet.encoding.StringprepException;\n\npublic class XMPPHelper {\n\n\t// list of well-known invitation landing pages\n\tpublic static final List<String> EASY_INVITE_HOSTS = Arrays.asList(\"yax.im\", \"xmpp.link\", \"join.jabber.network\");\n\n\t// shameless copy from android/platform_frameworks_base/blob/master/core/java/android/util/Patterns.java\n\tpublic static final String GOOD_IRI_CHAR = \"a-zA-Z0-9\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF\";\n\t// original Android pattern, surrounded by word boundaries\n\tpublic static final Pattern PHONE = Pattern.compile(\t// sdd = space, dot, or dash\n\t\t\t\"\\\\b(\\\\+[0-9]+[\\\\- \\\\.]*)?\"        // +<digits><sdd>*\n\t\t\t+ \"(\\\\([0-9]+\\\\)[\\\\- \\\\.]*|[0-9]{3,} ?/[\\\\- \\\\.]*)?\"   // (<digits>)<sdd>*|<digits>/<sdd>*\n\t\t\t+ \"([0-9][0-9\\\\- \\\\.]+[0-9])\\\\b\"); // <digit><digit|sdd>+<digit>\n\tpublic static final Pattern EMAIL_ADDRESS = Pattern.compile(\n\t\t\t\"[a-zA-Z0-9\\\\+\\\\.\\\\_\\\\%\\\\-\\\\+]{1,256}\" +\n\t\t\t\"\\\\@\" +\n\t\t\t\"[a-zA-Z0-9][a-zA-Z0-9\\\\-]{0,64}\" +\n\t\t\t\"(\" +\n\t\t\t\"\\\\.\" +\n\t\t\t\"[a-zA-Z0-9][a-zA-Z0-9\\\\-]{0,25}\" +\n\t\t\t\")+\");\n\n\t// shameless copy from conversations/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java\n\tpublic static final Pattern XMPP_PATTERN = Pattern.compile(\"xmpp\\\\:(?:(?:[\"\n\t\t\t\t\t\t+ GOOD_IRI_CHAR\n\t\t\t\t\t\t+ \"\\\\;\\\\/\\\\?\\\\@\\\\&\\\\=\\\\#\\\\~\\\\-\\\\.\\\\+\\\\!\\\\*\\\\'\\\\,\\\\_%])\"\n\t\t\t\t\t\t+ \"|(?:\\\\%[a-fA-F0-9]{2}))+\"\n\t\t\t\t\t\t+ \"(\\\\?[\\\\p{Alnum}=;&]+)?\");\n\n\t// case-insensitive \"XEP-####\" surrounded by word boundaries, will extract the number as group 1\n\tpublic static final Pattern XEP_PATTERN = Pattern.compile(\"(?i)\\\\bXEP-(\\\\d{4})\\\\b\");\n\n\tpublic static String verifyJabberID(String jid)\n\t\t\tthrows YaximXMPPAdressMalformedException {\n\t\ttry {\n\t\t\tString parts[] = jid.split(\"@\");\n\t\t\tif (parts.length != 2 || parts[0].length() == 0 || parts[1].length() == 0)\n\t\t\t\tthrow new YaximXMPPAdressMalformedException(\n\t\t\t\t\t\t\"Configured Jabber-ID is incorrect!\");\n\t\t\tStringBuilder sb = new StringBuilder();\n\t\t\tsb.append(Stringprep.nodeprep(parts[0]));\n\t\t\tsb.append(\"@\");\n\t\t\tsb.append(Stringprep.nameprep(parts[1]));\n\t\t\treturn sb.toString();\n\t\t} catch (StringprepException spe) {\n\t\t\tthrow new YaximXMPPAdressMalformedException(spe);\n\t\t} catch (NullPointerException e) {\n\t\t\tthrow new YaximXMPPAdressMalformedException(\"Jabber-ID wasn't set!\");\n\t\t}\n\t}\n\n\tpublic static String verifyJabberID(Editable jid)\n\t\t\tthrows YaximXMPPAdressMalformedException {\n\t\treturn verifyJabberID(jid.toString());\n\t}\n\n\tpublic static String createResource(Context ctx) {\n\t\treturn String.format(\"%s.%08X\",\n\t\t\t\tctx.getString(R.string.app_name),\n\t\t\t\tnew java.util.Random().nextInt());\n\t}\n\n\tpublic static int tryToParseInt(String value, int defVal) {\n\t\tint ret;\n\t\ttry {\n\t\t\tret = Integer.parseInt(value);\n\t\t} catch (NumberFormatException ne) {\n\t\t\tret = defVal;\n\t\t}\n\t\treturn ret;\n\t}\n\n\t/* Convert a (single- or multi-line) message into a quote */\n\tpublic static String quoteStringWithoutQuotes(String original) {\n\t\tStringBuilder sb = new StringBuilder();\n\t\tString[] lines = original.split(\"\\n\");\n\t\tfor (String s : lines) {\n\t\t\tif (!s.startsWith(\">\"))\n\t\t\t\tsb.append(\"> \").append(s).append('\\n');\n\t\t}\n\t\treturn sb.toString();\n\t}\n\t/* Convert a (single- or multi-line) message into a quote */\n\tpublic static String quoteString(String original) {\n\t\treturn \"> \" + original.replace(\"\\n\", \"\\n> \") + \"\\n\";\n\t}\n\n\tpublic static String capitalizeString(String original) {\n\t\treturn (original.length() == 0) ? original :\n\t\t\toriginal.substring(0, 1).toUpperCase() + original.substring(1);\n\t}\n\n\t// a line consisting only of:\n\t// - Emoji (So: Symbol Other),\n\t// - Emoji unknown to Android (Cn: not assigned),\n\t// - Fitzpatrick modifiers from Unicode 8.0 (Sk: Symbol Modifier)\n\t// - ZWJ, Variant-Selectors, whitespace\n\tstatic final Pattern LINE_OF_EMOJI = Pattern.compile(\"[\\\\p{So}\\\\p{Cn}\\\\p{Sk}\\u200D\\uFE00-\\uFE0F\\\\s]+\");\n\tstatic final Pattern ONE_EMOJI = Pattern.compile(\"[\\\\p{Cn}\\\\p{So}](\\u200D[\\\\p{Cn}\\\\p{So}])*[\\uFE00-\\uFE0F]?\");\n\t// how many Emoji do we need before falling back to normal\n\tstatic final int LENGTH_THRESHOLD = 12;\n\n\tpublic static float getEmojiScalingFactorRE(String message, float max_scale) {\n\t\tif (!LINE_OF_EMOJI.matcher(message).matches())\n\t\t\treturn 1.f;\n\t\tint count = 0;\n\t\tMatcher m = ONE_EMOJI.matcher(message);\n\t\twhile (m.find()) {\n\t\t\tcount++;\n\t\t\tif (count > LENGTH_THRESHOLD)\n\t\t\t\treturn 1.f;\n\t\t}\n\t\treturn (count > 0) ? max_scale*3.f/(2+count) : 1.f;\n\t}\n\n\tpublic static int getEditTextColor(Context ctx) {\n\t\tTypedValue tv = new TypedValue();\n\t\tboolean found = ctx.getTheme().resolveAttribute(android.R.attr.editTextColor, tv, true);\n\t\tif (found) {\n\t\t\t// SDK 11+\n\t\t\treturn ctx.getResources().getColor(tv.resourceId);\n\t\t} else {\n\t\t\t// SDK < 11\n\t\t\treturn ctx.getResources().getColor(android.R.color.primary_text_light);\n\t\t}\n\t}\n\n\tprivate static final String PASSWORD_CHARS = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456780+-/#$!?\";\n\tprivate static final int PASSWORD_LENGTH = 12;\n\tpublic static String securePassword() {\n\t\tSecureRandom r = new SecureRandom();\n\t\tStringBuilder sb = new StringBuilder();\n\t\tfor (int i = 0 ; i < PASSWORD_LENGTH; i++)\n\t\t\tsb.append(PASSWORD_CHARS.charAt(r.nextInt(PASSWORD_CHARS.length() - 1)));\n\t\treturn sb.toString();\n\t}\n\n\tpublic static final String MATRIX_BRIDGE = \"matrix.org\";\n\tstatic final Pattern JID2MXID = Pattern.compile(\"^(#?)([^_#]*)[_#](.*)@\" + MATRIX_BRIDGE);\n\tstatic final Pattern MXID2JID = Pattern.compile(\"^([@#])([^:]*):(.*)\");\n\n\tpublic static String jid2mxid(String jid) {\n\t\tif (jid.equals(MATRIX_BRIDGE))\n\t\t\treturn \"The Matrix\";\n\t\tMatcher m = JID2MXID.matcher(jid);\n\t\tif (m.find()) {\n\t\t\tString prefix = m.group(1).length() == 0 ? \"@\" : m.group(1);\n\t\t\treturn prefix + m.group(2) + \":\" + m.group(3);\n\t\t} else\n\t\t\treturn jid;\n\t}\n\n\tpublic static String mxid2jid(String mxid) {\n\t\tMatcher m = MXID2JID.matcher(mxid);\n\t\tif (m.find()) {\n\t\t\tif (m.group(1).equals(\"@\"))\n\t\t\t\treturn m.group(2) + \"_\" + m.group(3) + \"@\" + MATRIX_BRIDGE;\n\t\t\telse\n\t\t\t\treturn \"#\" + m.group(2) + \"#\" + m.group(3) + \"@\" + MATRIX_BRIDGE;\n\t\t} else\n\t\t\treturn mxid;\n\t}\n\n\n\t// WARNING: This is not secure! This method is supposed to create a nice-\n\t// looking URL parameter for JIDs, not to encode all special characters.\n\t// This is especially important for i18n bare-JIDs which would get\n\t// mangled into URL-encoded WTF-8\n\tpublic static String jid2url(String jid) {\n\t\treturn jid.replace(\"%\", \"%25\").replace(\"#\", \"%23\");\n\t}\n\n\tpublic static String createInvitationLink(String jid, String token) {\n\t\tStringBuilder sb = new StringBuilder();\n\t\tsb.append(\"xmpp:\").append(jid2url(jid)).append(\"?roster\");\n\t\tif (token != null && token.length() > 0)\n\t\t\tsb.append(\";preauth=\").append(token);\n\t\treturn sb.toString();\n\t}\n\n\tpublic static String createInvitationLinkHTTPS(String jid, String token) {\n\t\tStringBuilder sb = new StringBuilder();\n\t\tsb.append(\"https://yax.im/i/#\").append(jid2url(jid));\n\t\tif (token != null && token.length() > 0)\n\t\t\tsb.append(\"?;preauth=\").append(token);\n\t\treturn sb.toString();\n\t}\n\n\tpublic static String createRosterLinkHTTPS(String jid) {\n\t\treturn \"https://yax.im/i/#\" + jid2url(jid);\n\t}\n\n\tpublic static String createMucLinkHTTPS(String jid) {\n\t\treturn \"https://yax.im/i/#\" + jid2url(jid) + \"?join\";\n\t}\n\n\t@TargetApi(Build.VERSION_CODES.JELLY_BEAN)\n\tpublic static void setStaticNFC(Activity act, String uri) {\n\t\t// sad trombone for Android killing Beam\n\t\t// TODO: implement ISO/IEC 14443-3/4 NDEF via Host Card Emulation\n\t}\n\n\t@TargetApi(Build.VERSION_CODES.JELLY_BEAN)\n\tpublic static void setNFCInvitation(final Activity act, final YaximConfiguration config) {\n\t\t// still sad trombone\n\t}\n\n\tpublic static void shareLink(Activity act, int title_id, String link) {\n\t\tact.startActivity(Intent.createChooser(new Intent(android.content.Intent.ACTION_SEND)\n\t\t\t\t\t.setType(\"text/plain\")\n\t\t\t\t\t.putExtra(Intent.EXTRA_TEXT,\n\t\t\t\t\t\tlink),\n\t\t\t\t    act.getString(title_id)));\n\t}\n\n\tpublic static Uri transmogrifyXmppUriHelper(Uri uri) {\n\t\tUri data = uri;\n\t\tString host = (data.getHost() != null) ? data.getHost() : \"\";\n\t\tif (\"xmpp\".equalsIgnoreCase(data.getScheme())) {\n\t\t\tif (data.isOpaque()) {\n\t\t\t\t// cheat around android's unwillingness to parse opaque URIs\n\t\t\t\tdata = Uri.parse(data.toString().replaceFirst(\":\", \"://\").replace(';', '&'));\n\t\t\t}\n\t\t} else if (EASY_INVITE_HOSTS.contains(host.toLowerCase()) && !TextUtils.isEmpty(data.getFragment())) {\n\t\t\t// convert URI fragment (after # sign) into xmpp URI\n\t\t\tString jid = data.getFragment().replace(';', '&');\n\t\t\tdata = Uri.parse(\"xmpp://\" + jid2url(jid));\n\t\t} else if (\"conversations.im\".equalsIgnoreCase(data.getHost())) {\n\t\t\ttry {\n\t\t\t\tList<String> segments = data.getPathSegments();\n\t\t\t\tString code = segments.get(0);\n\t\t\t\tString jid = segments.get(1);\n\t\t\t\tString token = \"\";\n\t\t\t\tif (!jid.contains(\"@\")) {\n\t\t\t\t\tjid = segments.get(1) + \"@\" + segments.remove(2);\n\t\t\t\t}\n\t\t\t\tif (segments.size() > 2)\n\t\t\t\t\ttoken = \"&preauth=\" + segments.get(2);\n\t\t\t\tif (\"i\".equalsIgnoreCase(code))\n\t\t\t\t\tdata = Uri.parse(\"xmpp://\" + jid + \"?roster\" + token);\n\t\t\t\telse if (\"j\".equalsIgnoreCase(code))\n\t\t\t\t\tdata = Uri.parse(\"xmpp://\" + jid + \"?join\");\n\t\t\t\telse return null;\n\t\t\t} catch (Exception e) {\n\t\t\t\tLog.d(\"yaxim.XMPPHelper\", \"Failed to parse URI \" + data);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t} else\n\t\t\treturn null;\n\t\tLog.d(\"yaxim.XMPPHelper\", \"transmogrifyXmppUri: \" + uri + \" --> \" + data);\n\t\treturn data;\n\t}\n\n\tpublic static boolean transmogrifyXmppUri(Intent intent) {\n\t\tUri data = transmogrifyXmppUriHelper(intent.getData());\n\t\tif (data != null) {\n\t\t\tintent.setData(data);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n}\n"
  },
  {
    "path": "src/org/yaxim/androidclient/widget/AutoCompleteJidEdit.java",
    "content": "package org.yaxim.androidclient.widget;\n\nimport org.yaxim.androidclient.R;\n\nimport java.util.Arrays;\nimport java.util.ArrayList;\nimport java.util.Collection;\nimport java.util.TreeSet;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport android.text.Editable;\nimport android.text.TextWatcher;\nimport android.text.Spannable;\nimport android.text.style.ForegroundColorSpan;\nimport android.widget.ArrayAdapter;\nimport android.widget.AutoCompleteTextView;\n\npublic class AutoCompleteJidEdit extends AutoCompleteTextView {\n\tprivate String server_main;\n\tprivate TreeSet<String> servers;\n\tprivate String userpart = null;\n\tprivate ArrayAdapter<String> mServerAdapter;\n\tForegroundColorSpan span;\n\tTextWatcher jtw;\n\n\tpublic AutoCompleteJidEdit(Context ctx, AttributeSet attrs) {\n\t\tsuper(ctx, attrs);\n\t\tmServerAdapter = new ArrayAdapter<String>(ctx,\n\t\t\t\tandroid.R.layout.simple_dropdown_item_1line,\n\t\t\t\tnew ArrayList<String>());\n\t\tsetAdapter(mServerAdapter);\n\t\tspan = new ForegroundColorSpan(getCurrentHintTextColor());\n\t\tsetThreshold(3);\n\t}\n\n\tpublic void setServerList(int static_elents_id) {\n\t\tString[] static_list = getResources().getStringArray(static_elents_id);\n\t\tservers = new TreeSet<String>(Arrays.asList(static_list));\n\t\tserver_main = static_list[0];\n\t}\n\n\tpublic void setServerList(String first, Collection<String> dyn_elements, int static_elents_id) {\n\t\tsetServerList(static_elents_id);\n\t\tif (dyn_elements != null)\n\t\t\tservers.addAll(dyn_elements);\n\t\tif (first != null) {\n\t\t\tif (!servers.contains(first))\n\t\t\t\tservers.add(first);\n\t\t\tserver_main = first;\n\t\t}\n\t}\n\n\tprotected void onAttachedToWindow() {\n\t\tsuper.onAttachedToWindow();\n\t\tif (jtw == null) {\n\t\t\tjtw = new JidTextWatcher();\n\t\t\taddTextChangedListener(jtw);\n\t\t}\n\t}\n\n\tboolean auto_appended = false;\n\tboolean ignore_selection_change = false;\n\n\t@Override\n\tprotected void onSelectionChanged(int selStart, int selEnd) {\n\t\tif (ignore_selection_change) {\n\t\t\tignore_selection_change = false;\n\t\t\treturn;\n\t\t}\n\t\tint atpos = getText().toString().indexOf(\"@\");\n\t\tif (selStart > atpos+1 || selEnd > atpos+1) {\n\t\t\tauto_appended = false;\n\t\t\tgetText().removeSpan(span);\n\t\t}\n\t}\n\n\t@Override\n\tpublic boolean enoughToFilter() {\n\t\treturn true;\n\t}\n\n\tprivate class JidTextWatcher implements TextWatcher {\n\t\tpublic void afterTextChanged(Editable e) {\n\t\t\tString jid = e.toString();\n\t\t\tint len = e.length();\n\t\t\tint atpos = jid.indexOf(\"@\");\n\t\t\tint secondat = (atpos == -1) ? -1 : jid.indexOf(\"@\", atpos + 1);\n\t\t\tif (auto_appended && secondat >= 0) {\n\t\t\t\t// if the user enters @, we have their @ and our @ -> abort auto_append\n\t\t\t\tauto_appended = false;\n\t\t\t\te.delete(secondat, len);\n\t\t\t\te.removeSpan(span);\n\t\t\t} else if (auto_appended && atpos == 0) {\n\t\t\t\t// remove auto_append when user name is empty\n\t\t\t\tauto_appended = false;\n\t\t\t\te.removeSpan(span);\n\t\t\t\te.delete(0, len);\n\t\t\t} else if (atpos == -1 && len > 0) {\n\t\t\t\t// if there is a string, but no @, begin auto_append\n\t\t\t\tauto_appended = true;\n\t\t\t\tignore_selection_change = true;\n\t\t\t\t// append first server from our list\n\t\t\t\te.append(\"@\" + server_main);\n\t\t\t\tatpos = len;\n\t\t\t\tAutoCompleteJidEdit.this.setSelection(atpos);\n\t\t\t}\n\t\t\tlen = e.length();\n\t\t\tif (auto_appended)\n\t\t\t\te.setSpan(span, atpos, len, Spannable.SPAN_INCLUSIVE_INCLUSIVE);\n\t\t\telse if (len > 1 && atpos > 0) {\n\t\t\t\t// populate drop-down list with userpart@domain for all known domains\n\t\t\t\tString u = jid.split(\"@\")[0];\n\t\t\t\tif (!u.equals(userpart)) {\n\t\t\t\t\tuserpart = u;\n\t\t\t\t\tmServerAdapter.setNotifyOnChange(false);\n\t\t\t\t\tmServerAdapter.clear();\n\t\t\t\t\tfor (String domain : servers)\n\t\t\t\t\t\tmServerAdapter.add(u + \"@\" + domain);\n\t\t\t\t\tmServerAdapter.notifyDataSetChanged();\n\t\t\t\t\tperformFiltering(\"\", 0);\n\t\t\t\t\tshowDropDown();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tpublic void beforeTextChanged(CharSequence s, int start, int count,\n\t\t\t\tint after) {\n\t\t}\n\n\t\tpublic void onTextChanged(CharSequence s, int start, int before, int count) {\n\t\t}\n\n\n\t}\n}\n"
  },
  {
    "path": "template/version.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- yaxim version.xml AUTOGENERATED from version.xml.tpl -->\n<resources xmlns:tools=\"http://schemas.android.com/tools\" tools:ignore=\"MissingTranslation\">\n<string name=\"build_revision\">$build_revision</string>\n<string name=\"build_date\">$build_date</string>\n<string name=\"build_version\">$build_version</string>\n</resources>\n"
  },
  {
    "path": "yaxim/src/org/yaxim/androidclient/FlavorConfig.java",
    "content": "package org.yaxim.androidclient;\n\npublic class FlavorConfig {\n\tpublic static int getTheme(String theme) {\n\t\tswitch (theme) {\n\t\tcase \"light\":\n\t\t\treturn R.style.YaximLightTheme;\n\t\tdefault:\n\t\t\treturn R.style.YaximDarkTheme;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "yaxim.rdf.sh",
    "content": "export NAME=\"yaxim\"\nexport SHORTDESC=\"yet another XMPP instant messenger\"\nexport DESCRIPTION=\"yaxim is an Android XMPP/Jabber client with a clean user interface and open source (GPLv3).\"\nexport HOMEPAGE=\"https://yaxim.org/\"\nexport LOGO=\"https://yaxim.org/images/yaxim.svg\"\nexport SCREENSHOT=\"https://yaxim.org/screenshots/tiny/roster.png\"\n"
  }
]